예제 #1
0
inline bool capture_should_stop(void)
{
	bool stop_requested = false;

	if (capture_active())
		stop_requested = capture_stopped() || !capture_alive();

	return stop_requested;
}
예제 #2
0
inline bool capture_should_init(void)
{
	if (!capture_active() && capture_restarted()) {
		if (capture_alive()) {
			if (!ipc_pipe_client_valid(&pipe)) {
				init_pipe();
			}
			return true;
		}
	}

	return false;
}
예제 #3
0
static HRESULT STDMETHODCALLTYPE hook_present(IDXGISwapChain *swap,
        UINT sync_interval, UINT flags)
{
    IUnknown *backbuffer = nullptr;
    bool capture_overlay = global_hook_info->capture_overlay;
    bool test_draw = (flags & DXGI_PRESENT_TEST) != 0;
    bool capture;
    HRESULT hr;

    if (!data.swap && !capture_active()) {
        setup_dxgi(swap);
    }

    capture = !test_draw && swap == data.swap && !!data.capture;
    if (capture && !capture_overlay) {
        backbuffer = get_dxgi_backbuffer(swap);

        if (!!backbuffer) {
            data.capture(swap, backbuffer, capture_overlay);
            backbuffer->Release();
        }
    }

    unhook(&present);
    present_t call = (present_t)present.call_addr;
    hr = call(swap, sync_interval, flags);
    rehook(&present);

    if (capture && capture_overlay) {
        /*
         * It seems that the first call to Present after ResizeBuffers
         * will cause the backbuffer to be invalidated, so do not
         * perform the post-overlay capture if ResizeBuffers has
         * recently been called.  (The backbuffer returned by
         * get_dxgi_backbuffer *will* be invalid otherwise)
         */
        if (resize_buffers_called) {
            resize_buffers_called = false;
        } else {
            backbuffer = get_dxgi_backbuffer(swap);

            if (!!backbuffer) {
                data.capture(swap, backbuffer, capture_overlay);
                backbuffer->Release();
            }
        }
    }

    return hr;
}
예제 #4
0
static HRESULT STDMETHODCALLTYPE hook_reset(IDirect3DDevice8 *device,
		D3DPRESENT_PARAMETERS *parameters)
{
	HRESULT hr;

	if (capture_active())
		d3d8_free();

	unhook(&reset);
	reset_t call = (reset_t)reset.call_addr;
	hr = call(device, parameters);
	rehook(&reset);

	return hr;
}
예제 #5
0
static HRESULT STDMETHODCALLTYPE hook_reset_ex(IDirect3DDevice9 *device,
		D3DPRESENT_PARAMETERS *params, D3DDISPLAYMODEEX *dmex)
{
	HRESULT hr;

	if (capture_active())
		d3d9_free();

	unhook(&reset_ex);
	reset_ex_t call = (reset_ex_t)reset_ex.call_addr;
	hr = call(device, params, dmex);
	rehook(&reset_ex);

	return hr;
}
예제 #6
0
static BOOL WINAPI hook_wgl_delete_context(HGLRC hrc)
{
	BOOL ret;

	if (capture_active()) {
		HDC last_hdc = jimglGetCurrentDC();
		HGLRC last_hrc = jimglGetCurrentContext();

		jimglMakeCurrent(data.hdc, hrc);
		gl_free();
		jimglMakeCurrent(last_hdc, last_hrc);
	}

	unhook(&wgl_delete_context);
	BOOL (WINAPI *call)(HGLRC) = wgl_delete_context.call_addr;
	ret = call(hrc);
	rehook(&wgl_delete_context);

	return ret;
}
예제 #7
0
inline bool capture_ready(void)
{
	return capture_active() &&
		frame_ready(global_hook_info->frame_interval);
}