Jump to content
  • Advertisement
Sign in to follow this  
Infinisearch

DX11 Draw indirect for DX11

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

Is there any documentation or complete tutorial or references for draw indirect on D3D11?  Is the D3D11 version of draw indirect as robust as the D3D12 version?  I found one barebones tutorial on it through google but thats about it.  Any help would be greatly appreciated.

Share this post


Link to post
Share on other sites
Advertisement

ExecuteIndirect has a lot of functionality that's not supported by DrawIndirect and DispatchIndirect. DrawIndexedInstancedIndirect is exactly the same as DrawIndexedInstanced, except the arguments come from buffer resource instead of being passed in. So you'll need to have the GPU write to a buffer where the first 4 bytes represent IndexCountPerInstance, the next 4 bytes represent InstanceCount, the next 4 represent StartIndexLocation, and so on. DispatchIndirect is exactly the same, except your buffer contains ThreadGroupCountX, ThreadGroupCountY, and ThreadGroupCountZ. The buffer resource needs to be created with D3D11_RESOURCE_MISC_DRAWINDIRECT_ARGS to be used as indirect arguments.

 

I'm not sure if there were ever any official samples that used DrawIndirect. I used it in a depth of field sample I wrote a long time ago, where I basically spawned bokeh-shaped particles for certain pixels. For something more advanced, you could look at my shadow rendering sample, where I used DrawIndirect to render meshes after performing culling on the GPU.

Edited by MJP

Share this post


Link to post
Share on other sites

You can only change the draw args.

 

The best approximation would be to DrawIndirect once for each set of textures you might want to apply to the draw and then zero out the index count for any draw you want to cull completely. So long as there aren't too many zero-count draws you shouldn't hit the unfortunate bottleneck of being Command Processor bound.

Share this post


Link to post
Share on other sites

You can change state between draws, just not between different instances within the same DrawInstancedIndirect call.

Share this post


Link to post
Share on other sites

You might have heard the term multi-draw indirect (MDI). I believe there was an OpenGL extension for it. That's the idea of submitting multiple draws with state changes in a single indirect call, which is similar to ExecuteIndirect, but D3D11 does not have any form of MDI. Like Adam said, no state changes between instances.

Share this post


Link to post
Share on other sites
AMD has a MDI extension for D3D11 accessible via their AGS library.

But if you can't change state how would you use for example a different MVP matrix within the same texture batch?

Bind more than one matrix in a buffer (cb or srv).

Share this post


Link to post
Share on other sites

Anyway to get back to state changes, it's the same as if you made a normal DrawIndexedInstanced call. Your vertex shader will have SV_VertexID available as well ad SV_InstanceID, so you're free to use those to index into buffers however you'd like. But you can't actually change bindings per-instance, just like a normal instanced draw call.

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.

We are the game development community.

Whether you are an indie, hobbyist, AAA developer, or just trying to learn, GameDev.net is the place for you to learn, share, and connect with the games industry. Learn more About Us or sign up!

Sign me up!