0
\$\begingroup\$

I'm experiencing something very strange here when using VSSetConstantBuffers1.

I have a projection * world matrix that I'm sending to a constant buffer to rotate a triangle on an axis. When I do this, I follow this pattern:

Frame #1

  • Set offset to 0, count is always at 64 (4 * float4)
  • Map Constant Buffer using Discard.
  • Write matrix to constant buffer
  • Unmap
  • Call VSSetConstantBuffers1(0, 1, new []{ cbuffer }, new []{offset }, new []{ count })
  • Draw

Frame #2

  • Set offset to 64, count remains same.
  • Map constant buffer using NoOverwrite
  • Write matrix.
  • Unmap
  • Call VSSetConstantBuffers1(0, 1, new []{ cbuffer }, new []{offset }, new []{ count })
  • Draw

Etc... When I fill the constant buffer completely, I reset offset to 0, and start again by using discard on my map.

Now here's my problem: Nothing shows up on the screen. Well, that's not 100% true, the very first frame, where offset = 0 and count = 64, that shows up perfectly. The next frame, and subsequent frames do not.

I used the Visual Studio 2017 graphics debugger to confirm that my constant buffer did indeed have data in it. And it did, and the values were correct.

It's really weird. I should be mapping the constant buffer to the next matrix element with my 2nd call to VSSetConstantBuffers1, but it doesn't actually look like it's going anywhere near that element.

Also, I tried forcing it to just use the 0, and 64 offset/count and only updating that portion of the buffer, and it works just fine.

I've tried my best to dig up info about constant buffer offset/count, but it's pretty sparse out there (my own searches on this site gave me 0 for VSSetConstantBuffers1, same with GameDev.net). What little I did scrounge up on Nvidia's website, makes it appear as though this pattern should work.

Since my hardware might come into question here, I have a GeForce 1080 GTX running on Windows 10 (latest update), and according to the D3D11.1 options, it does indeed support constant buffer offsets, and my feature level is at max.

Anyone have any ideas? Given the lack of info, I'm guessing the offset/count versions of constant buffers aren't too popular?

\$\endgroup\$
  • \$\begingroup\$ Also, I should note, that if I don't use a multiple of 16 for the offset/count, then the D3D debug output complains that I'm not using a multiple of 16. \$\endgroup\$ – Mike May 28 '18 at 13:23
0
\$\begingroup\$

So, thanks to some people on GameDev.Net, and a review of the documentation, I realized that my offset/count assumptions were incorrect.

I had assumed it was aligned to 16 bytes per element for the offset/count, when in reality, it's 16 elements (256 bytes). So instead of a count of 64, it should have been 16, and the same with the offset on the next frame.

\$\endgroup\$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.