justinstenning / Direct3DHook

DirectX Capture and Overlays by using Direct3D API hooks
http://spazzarama.com/2011/03/14/c-screen-capture-and-overlays-for-direct3d-9-10-and-11-using-api-hooks
MIT License
580 stars 178 forks source link

Suggestion #8

Closed remcoros closed 10 years ago

remcoros commented 10 years ago

Hey,

another suggestion if you start looking into this project again.

I can't send a pull request as my version has a lot of specific changes for my scenario. but here goes:

To avoid recursing into PresentHook / EndScene too much, you can do something like this:

        private static int presentHookRecurse = 0;

        ....

        if (presentHookRecurse <= 0)
        {
            DoCaptureRenderTarget(device, "PresentEx");
        }

        presentHookRecurse++;
        //    Region region = new Region(pDirtyRegion);
        if (pSourceRect == null || *pSourceRect == SharpDX.Rectangle.Empty)
            device.PresentEx(dwFlags);
        else
        {
            if (hDestWindowOverride != IntPtr.Zero)
                device.PresentEx(dwFlags, *pSourceRect, *pDestRect, hDestWindowOverride);
            else
                device.PresentEx(dwFlags, *pSourceRect, *pDestRect);
        }
        presentHookRecurse--;

Note the ++ / -- on presenthook.

This makes the game not wait for your own code to finish so it can continue at it's own pace.

I think you''ll understand what it does.

justinstenning commented 10 years ago

I'm not sure that this is necessary. EasyHook should already be preventing recursion into the hooked function for us. Can you elaborate a little on the scenario where you see an issue here?

remcoros commented 10 years ago

I didn't have any issues and don't really know about the internals of Easyhook, but I thought it would be safe.

btw, you might want to check: https://github.com/remcoros/Direct3DCapture

especially: https://github.com/remcoros/Direct3DCapture/blob/master/Hook/DXHookD3D9.cs

I spent some time looking at how OBS (Open Broadcaster) did their direct3d hooking and revised the directx 9 version a lot. Solving issues with alt-tab / fullscreen / lost devices etc.

I removed all other directx versions from that repo though, as I didn't needed it in my case,

I hope you don't mind the GPL license, I couldn't find any licensing in your code and I was forced to add GPL because of the OBS code.

justinstenning commented 10 years ago

Ah ok, I might just close this issue then.

The GPL is fine. Do you mind me bringing some of the changes if appropriate back into here (minus the OBS code)? The license used here is MIT, so you are free to do what you like providing appropriate credit.

remcoros commented 10 years ago

I can bring the revised version of the direct3d9 hook, minus the drawing stuff though. If you don't mind?

Also, I don't really have the time to look into the other direct3d versions. But I suppose the revised version of Direct3d9 can serve as a good example.

justinstenning commented 10 years ago

Ok that would be great, yeah I can deal with the other versions once you bring it in and I review the changes.

I started working on an overlay engine in this project and still plan to sort that out at some point.