Advertisement Jump to content
Sign in to follow this  
Buckeye

D3D11_USAGE for a vertex buffer

This topic is 1778 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

I'm making the transition from DX9 to D3D11. Looking at the docs for the D3D11_USAGE enumeration: IF a vertex buffer can be initialized when it's created, will not change during its lifetime, and will not have to be accessed by the CPU, is there any disadvantage to creating it with D3D11_USAGE_IMMUTABLE? Is it guaranteed, for instance, to be faster, or have fewer cache misses, than D3D11_USAGE_DEFAULT?

 

On the other, is D3D11_USAGE_DEFAULT the only choice if CPU access may be needed (say, for picking purposes)? The docs don't say explicitly, but I'm assuming DEFAULT can be accessed by the CPU. Is that correct? EDIT: And DYNAMIC obviously can be accessed by the CPU (as I read a little bit further) so that part is answered.

Edited by Buckeye

Share this post


Link to post
Share on other sites
Advertisement

I can't answer questions about speed. however i created a method to wrap the DX calls away from me. and i put a boolean flag to indicate that the VBO contents will change each frame.

 

so if it is never changed i create with usage IMMUTABLE and CPUAccessFlag 0

if it is changed i create with usage DYNAMIC and CPUAccessFlag CPU_ACCESS_WRITE

 

YMMV

Share this post


Link to post
Share on other sites


The docs don't say explicitly, but I'm assuming DEFAULT can be accessed by the CPU. Is that correct?
I don't know what docs are you referring to in "my" docs

http://msdn.microsoft.com/en-us/library/windows/desktop/ff476259(v=vs.85).aspx

there's a table at around half page, only resource with CPU access (no matter if R or W) is STAGING.

It also depends on whatever you want to use Map or UpdateSubresource but the documentation is rather clear to me: leave immutable resources alone.

Share this post


Link to post
Share on other sites

@Krohm: Actually I said "the" docs, and I was looking at the same page you link. Your comment with regard to DYNAMIC and CPU access is correct.

 

 

 


the documentation is rather clear to me: leave immutable resources alone.

Interesting. I actually read it the other way 'round. Although it specifically mentions textures, it implies that IMMUTABLE is the choice for unchanging formatted data used only for input. That's why I'm curious about the disadvantages. Would you explain further?

 

EDIT: This link implies that D3D11_USAGE_IMMUTABLE may be a choice for vertex (as well as index and constant) buffers.

Edited by Buckeye

Share this post


Link to post
Share on other sites

You've mentioned the disadvantage of immutable resources -- they're immutable. You get the best possible memory layouts and locations, but in exchange, you can't modify the data.

 

You should generally use it for everything that's... immutable... or not dynamic.

 

To give the graphics driver the best chance of actually doing a good job, you should generally always read up on all the usage hints/flags in a graphics API, and be as truthful to the driver as you can about your intended usage.

 

Even if it were valid to dynamically map/unmap an immutable resource, doing so would mean that you've lied to the driver... Which means the driver may have made some bad resource allocation decisions.

Edited by Hodgman

Share this post


Link to post
Share on other sites

...the disadvantage of immutable resources -- they're immutable. You get the best possible memory layouts and locations, but in exchange, you can't modify the data.

If I understand what you're saying, that's a restriction, but not a disadvantage for a buffer that "will not change during its lifetime, and will not have to be accessed by the CPU.." With those previously mentioned assumptions, it appears IMMUTABLE would be the choice, and I'm trying to learn if there may be something "under the hood" that isn't clear. EDIT: Maybe I am misundertanding what you're saying and the assumptions mentioned do not meet the intent of "immutable?" If so, could you explain?

 

EDIT: I'm also just getting into mapping, and that appears to be a disadvantage if mapping would be needed.

 

As mentioned, I'm just getting into D3D11, but I've been programming for a long time. For me, as I learn any new interface, I try to be fairly thorough exploring advantages and limitations for making choices, so I can make informed decisions as I code.

Edited by Buckeye

Share this post


Link to post
Share on other sites

Thank you very much, Hodgman! Actually, it was a bit more than I needed, but not at all more than I was willing to read! I've got this topic bookmarked. And thanks for the wikienc links. Wouldn't have had a clue.

Share this post


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

  • Advertisement
×

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

GameDev.net is your game development community. Create an account for your GameDev Portfolio and participate in the largest developer community in the games industry.

Sign me up!