Jump to content
  • Advertisement
Sign in to follow this  

Direct3D 11 - Detect when reading from a Mapped buffer

This topic is 2273 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 suppose this is relevant to all versions of all APIs, but I was recently tripped up by this under D3D11:
struct cbtype
float a, b, c, d;

context->Map (...);
cbtype *dest = (cbtype *) MappedResource.pData;
cbtype->a = cbtype->b = cbtype->c = somenumber;
cbtype->d = someothernumber;
context->Unmap (...);

That's not exact code - just a simplified case illustrating a condition that got triggered, but it surprised me (which with hindsight it shouldn't have) to find out (by viewing disassembly) that the "a = b = c = somenumber" line ended up reading from the Mapped buffer.

Now, I'm aware of the warnings given here: http://msdn.microsof...7(v=vs.85).aspx and I'm aware of the implications, but the question is: since it's so easy to accidentally do this (the page I linked gives another example commonly found when dealing with CPU-side memory), how does one reliably detect when/if it happens? The Debug Runtimes have nothing so say on it, even with Info-level output enabled, and PIX is quiet as the grave. Visual Studio can be configured to break on a memory write, but not on a read.

Is there really no way but the hard way? Edited by mhagain

Share this post

Link to post
Share on other sites
Yeah I don't know any good way of catching that. I know some of the Linux packages like Valgrind and eFence can catch memory reads, but they usually use this to protect reading of memory that was already free'ed from the heap. I don't know if the techniques they use would work in this case, especially since the memory you're using won't come from the heap. You could do something wacky with macros where you execute the code once on some pointer you control before actually executing the code on the pointer from Map, but you'd have to have a pointer to something that errors on read but not on write.

Usually I like to to only write to amapped buffer using a straight memcpy, specifically to avoid this problem. Usually it involves having an extra copy on the stack or the heap somewhere, but I usually want this anyway so I can decouple the process of setting the values and the process of submitting it to D3D. Edited by MJP

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!