3
\$\begingroup\$

I am trying to share a direct3d9 surface between two processes. One process (let's call it A) writes to the surface, and the other (B) displays it on screen. Currently, process A does a StretchRect of its rendering surface to a shared surface, and then sets a flag in shared system memory to tell B that it's done. When B sees the flag, it then does a StretchRect of the shared surface to its own display surface. Process B then sets the flag again to tell A it is done.

It seems however that after the StretchRect on the shared surface returns, the texture has not necessarily finished copying, because sometimes Process B gets the previous picture, or sometimes even there is tearing (i.e. one half of picture N + one half of picture N + 1).

As I understand it, Direct3D is largely asynchronous under the hood, and does not ensure synchronisation between processes. I therefore need to ensure by myself that Process A has finished copying before displaying in process B, and vice-versa. Am I correct in my interpretation of the situation, and how would I achieve this? I am experimenting with LockRect() but I'm not sure if that's optimal or even guaranteed to work.

From MSDN documentation:

Shared cross-process surfaces provide no synchronization mechanism. Read/write changes to a shared surface may not reflect a referencing process's view of the surface when expected. To provide synchronization, use event queries or lock the texture.

Only the process that initially creates a shared resource can lock it (any process that opens a reference to that shared resource cannot lock it).

\$\endgroup\$
2
  • \$\begingroup\$ Did you ever figure this out? I'm interested in an answer :) \$\endgroup\$ Commented Oct 21, 2016 at 22:09
  • \$\begingroup\$ IIRC, we figured out d3d9 didn't support this scenario and went with a solution that didn't involve sharing a surface on the graphics card. Things may have changed with d3d10 and above, though. \$\endgroup\$ Commented Oct 23, 2016 at 21:24

1 Answer 1

0
\$\begingroup\$

your res sharing process is OK, I think. In dx9ex theres a flag in Present called D3DPRESENT_FORCEIMMEDIATE, can be used to force GPU render the resource, and then use the right picture later.

\$\endgroup\$

You must log in to answer this question.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.