Jump to content

  • Log In with Google      Sign In   
  • Create Account

Direct3D 11 - Detect when reading from a Mapped buffer


Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.

  • You cannot reply to this topic
1 reply to this topic

#1 mhagain   Crossbones+   -  Reputation: 8279

Like
0Likes
Like

Posted 24 September 2012 - 02:23 PM

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, 24 September 2012 - 02:24 PM.

It appears that the gentleman thought C++ was extremely difficult and he was overjoyed that the machine was absorbing it; he understood that good C++ is difficult but the best C++ is well-nigh unintelligible.


Sponsor:

#2 MJP   Moderators   -  Reputation: 11774

Like
0Likes
Like

Posted 24 September 2012 - 03:14 PM

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, 24 September 2012 - 03:17 PM.





Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.



PARTNERS