Jump to content

  • Log In with Google      Sign In   
  • Create Account


StructuredBuffer vs Buffer


Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.

  • You cannot reply to this topic
3 replies to this topic

#1 pekarn   Members   -  Reputation: 165

Like
0Likes
Like

Posted 07 May 2013 - 01:52 PM

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



Sponsor:

#2 Jason Z   Crossbones+   -  Reputation: 4905

Like
1Likes
Like

Posted 07 May 2013 - 06:00 PM

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



#3 MJP   Moderators   -  Reputation: 10929

Like
1Likes
Like

Posted 07 May 2013 - 06:43 PM

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.



#4 pekarn   Members   -  Reputation: 165

Like
0Likes
Like

Posted 07 May 2013 - 11:12 PM

Thanks for your replies. :)






Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.



PARTNERS