Recommended Posts

I am porting a DX11 game engine to DX12, and have some questions about root signature usage. The engine clearly defines a global bind slot range for resources, to avoid using shader reflection. This means, that both the application, both the shaders explicitly know the binding slots for everything (constant buffers, textures, etc.). This would trivially translate to a global root signature in DX12, and I have created it as a big root signature like the following: There are 12 descriptor tables, so for every shader stage there are a sampler descriptor table and a CBV_SRV_UAV table. I though about keeping a "staging" descriptor heap, to which I would place descriptors at resource load time. Then when calling PSSetShaderResources(), which is a DX11-style function, the function would fill out a GPU-visible descriptor heap which is created to match the layout of the root signature tables. The nice thing about is that each frame I would only have a single call to set the root signature and to set root signature tables. The command list would just fill it with descriptors before rendering.

I've found out however, that filling out descriptor tables can only be done on the CPU timeline with ID3D12Device::CopyDescriptors(). This complicates things and I can only think of populating the GPU descriptor heap, and after each draw call, I would need to copy the whole table and CopyDescriptors() again when there is a new call to PSSetShaderResources(). Am I on the right path if I also want to keep DX11-style bindings? 

I also thought about each shader having a custom root signature and only ever copying the descriptors which are required by the shader, but in this case I will need to rebind the whole root signature each time a shader changes. I would also have to do a shader reflection step and modify my shader-asset pipeline (because I don't want to depend on d3dcompiler when I run the engine) which I really want to avoid.

Which would be the preferred way? I read the Nvidia Do's and Don'ts but they say these which are contradicting in my case:

  • Minimize the number of Root Signature changes
  • Don’t bloat your root signature and descriptor tables to be able to reuse them

UPDATE: The second way (unique root signature with PSO) I would also have to bind resources strictly after I have set the right PSO, because the table is now unique. 

Edited by turanszkij

Share this post

Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Forum Statistics

    • Total Topics
    • Total Posts
  • Similar Content

    • By HD86
      I have a vertex buffer on a default heap. I need a CPU pointer to that buffer in order to loop through the vertices and change one value in some vertices (the color value). In the past this was possible by creating the buffer with the flag D3DUSAGE_DYNAMIC/D3D11_USAGE_DYNAMIC and using IDirect3DVertexBuffer9::Lock or ID3D11DeviceContext::Map to get a pointer.
      What is the correct way to do the same in DX 12? As far as I understand, the method ID3D12Resource::Map cannot be used on a default heap because default heaps cannot be accessed directly from the CPU. The documentation says that upload heaps are intended for CPU-write-once, GPU-read-once usage, so I don't think these are equivalent to the "dynamic" buffers. Is the readback heap equivalent to what was called a dynamic buffer? Or should I create a custom heap?
      I am thinking to do the following:
      -Create a temporary readback heap.
      -Copy the data from the default heap to the readback heap using UpdateSubresources.
      -Get a CPU pointer to the readback heap using Map and edit the data.
      -Copy the data back to the default heap using UpdateSubresources.
      What do you think about this?
    • By Kerrick
      TL;DR: noob non-coding teacher somehow thinks they can build a narrative educational game in WordPress; plz halp how do I games?
      I'm mostly a teacher with no coding background--I played with teaching myself Java for a bit but couldn't really code anything from scratch. I'm interested in developing (as a hobbyist) an educational game that would be a sort of choice-based narrative branching storyline, a bit like Fallen London/Storynexus. Because it's so storyline based and I don't need crazy 3d animation, I'm considering just building it as a WordPress site with a couple of gamification plug ins to handle inventory and choice consequences. The unique hook is that the game requires (suggests really) that the player accomplish real world building challenges to accomplish your goals. I.e. Your character has to cross a river? Get some popsicle sticks or cardboard or whatever and build a model bridge. Take a photo of your bridge and upload it to your portfolio to continue (and maybe I don't develop this feature right away).
      I'm in this for three reasons: the educational value for families and teachers, the storyline and world I'm building that I'm super excited about, and the fame and massive wealth (just kidding but it has to have to potential to pay for itself).
      Before I sink too much of my life into this, I want to know more about what I'll need to do to make it work.
      Specifically my questions are:
      1) I get that WordPress isn't optimal for developing games. But can I do it or will I have to learn a new engine because I can't make do what I want? (And if so, what's a better engine with low-to-no coding prereq that will still allow me to sell my game?)
      2) How do I budget for a project like this? (The link to the Reddit post about legal fees was very useful thank you)
      3) What are the additional considerations when creating a game like this intended for children with adult supervision? (Obviously privacy, and I need to cover my assets in case some kid takes "go build a bridge!" too literally and gets hurt with mama's table saw in the garage...)
      4) Is this not the forum for this since what I'm talking about is something more like educational narrative fiction and certainly not the spectacularly complex and amazing projects you all are working on?
      Thank you for any and all thoughts.
    • By lubbe75
      Being new to DirectX 12 I am looking for examples on how to use threading. I have done lots of OpenGL in the past and some DirectX, but with DX12 the threading magic is gone and I understand that threading is crucial to get good performance. In my project I currently have one thread doing it all. I have one command list, one command allocator, one bundle and one bundle allocator. I also have a million triangles, so it's about time that I start doing this.
      How do I split things up? How many threads should I use? How many command lists and allocators?
      I realize this is a beginner's question , but I have to begin somewhere. I would be grateful if someone could point me in a direction where I could find a simple code sample, tutorial or something similar. Thanks!
    • By Vegermy
      What are some of the best ways to actually sell your prototype or a Proof of Concept to a company? Would a power point presentation be best? Or maybe a video like a teaser trailer to go along with a power point presentation? I'm just trying to get some ideas of how to best go about this.
    • By thesargento
      Hi there. I’m a veteran video gamer but an MMORPG fan since a few years back. Most recently I was hooked on Guild Wars 2, Marvel Heroes Omega and Naruto Online. But it turns out that GW2 came up with completely unnecessary mounts so I stopped playing. MHO was shut down without any solid explanation so I’m left with Naruto even though is not a real MMORPG.
      The monetization of these kinds of games –pay-to-win systems, loot-boxes, and general micro-transactions- have had influenced me in the past to even mount premade Private Servers of games like Aion and Jade Dynasty. But nowadays these tendencies are on the rise so I really want a gaming experience free from it completely.  
      I miss games more focused on player skills but I also like the MMO character growing style. Whit that in mind, I remember Guild Wars, the original, to be a really good gaming experience.
      So my question is: Where to start to turn an MMORPG into a single player game?
      -I’m not interested in any commercialization or nothing like sort.
      -I’ve been able to mount premade private servers.
      -I’ve modded quite a few games via tutorials and just experimenting.
      Have some knowledge of HTML, PHP, XML, Javascript and LUA.
      Thnx in advance, I appreciate any help/guidance
  • Popular Now