Sign in to follow this  

StructuredBuffer vs Buffer

This topic is 1716 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

Hello!

Direct3D 11 added several new resource types for shaders. The ones of interest for this post is Buffer, StructuredBuffer and ByteAddressBuffer. I have some questions about the differences between them. I have mostly used StructuredBuffer before and occasionally Buffer. I have never used ByteAddressBuffer. I mostly care about Buffer and StructuredBuffer but figured I'd include ByteAddressBuffer aswell.

 

I know that with a regular Buffer the data in the buffer can have a different format than what you declare it with in the shader and the GPU will automatically do the conversion just like when you sample a texture or pass in data in a vertex buffer. With a StructuredBuffer the data has to match the declaration in the shader which limits you to HLSL types.

 

Other than that and the syntax difference is there any other difference between Buffer and StructuredBuffer? Any difference in performance? If my data isn't stored in a different format than how I use it in the shader is there any reason to use Buffer over StructuredBuffer?

 

For example is there any difference between these two (assuming that the data in the buffer are regular uncompressed floats)?

struct SData
{
   float f;
};
StructuredBuffer< SData > Buf;
Buffer< float > Buf;

 

 

Another example, would it make any difference for performance or anything else between these two?

struct SData
{
    float f;
    uint i;
};
StructuredBuffer< SData > Buf;
Buffer< float > Buf1;
Buffer< uint > Buf2;

 

 

And finally, what's the reason to use a ByteAddressBuffer? Like I said I've never used them so I just know what the documentation says. You can't access individual bytes, you have to access whole uint values. So why use a ByteAddressBuffer over something like:

Buffer< uint > Buf;

 

 

Thanks for helping me clear this up. smile.png

Share this post


Link to post
Share on other sites

One difference between structured and non-structured is that you can use some of the additional features on structured buffers, such as the structure count for append/consume buffers.  Otherwise I don't think is much performance difference between the two if you use them in the same manner.

 

In the case where you listed two separate buffers to replace a structured buffer, I would expect worse performance with two separate buffers due to cache misses.  However, things like that are so variable that it could easily be the opposite case, depending on the GPU and driver and usage conditions and...

Share this post


Link to post
Share on other sites

For your second example, it depends on your access parents. If you frequently access f without using i, then it's probably best to separate them. If you always access them together, then it's probably best to keep them together.

Share this post


Link to post
Share on other sites
Sign in to follow this