StructuredBuffer vs Buffer

Started by
2 comments, last by pekarn 11 years ago

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

Advertisement

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...

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.

Thanks for your replies. :)

This topic is closed to new replies.

Advertisement