static void d3d8_shmem_capture(IDirect3DDevice8 *device, IDirect3DSurface8 *backbuffer) { int cur_surface; int next_surface; HRESULT hr; cur_surface = data.cur_surface; next_surface = (cur_surface == NUM_BUFFERS - 1) ? 0 : cur_surface + 1; if (data.copy_wait < NUM_BUFFERS - 1) { data.copy_wait++; } else { IDirect3DSurface8 *src = backbuffer; IDirect3DSurface8 *dst = data.copy_surfaces[cur_surface]; if (shmem_texture_data_lock(next_surface)) { dst->UnlockRect(); data.surface_locked[next_surface] = false; shmem_texture_data_unlock(next_surface); } hr = device->CopyRects(src, nullptr, 0, dst, nullptr); if (SUCCEEDED(hr)) { d3d8_shmem_capture_copy(cur_surface); } } data.cur_surface = next_surface; }
static inline void d3d9_shmem_capture(IDirect3DSurface9 *backbuffer) { D3DTEXTUREFILTERTYPE filter; IDirect3DSurface9 *copy; int next_tex; HRESULT hr; d3d9_shmem_capture_queue_copy(); next_tex = (data.cur_tex == NUM_BUFFERS - 1) ? 0 : data.cur_tex + 1; filter = data.using_scale ? D3DTEXF_LINEAR : D3DTEXF_NONE; copy = data.render_targets[data.cur_tex]; hr = data.device->StretchRect(backbuffer, nullptr, copy, nullptr, filter); if (FAILED(hr)) { hlog_hr("d3d9_shmem_capture: StretchRect failed", hr); return; } if (data.copy_wait < NUM_BUFFERS - 1) { data.copy_wait++; } else { IDirect3DSurface9 *src = data.render_targets[next_tex]; IDirect3DSurface9 *dst = data.copy_surfaces[next_tex]; if (shmem_texture_data_lock(next_tex)) { dst->UnlockRect(); data.texture_mapped[next_tex] = false; shmem_texture_data_unlock(next_tex); } hr = data.device->GetRenderTargetData(src, dst); if (FAILED(hr)) { hlog_hr("d3d9_shmem_capture: GetRenderTargetData " "failed", hr); } data.queries[next_tex]->Issue(D3DISSUE_END); data.issued_queries[next_tex] = true; } data.cur_tex = next_tex; }
static void gl_shmem_capture(void) { int next_tex; GLint last_fbo; GLint last_tex; glGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &last_fbo); if (gl_error("gl_shmem_capture", "failed to get last fbo")) { return; } glGetIntegerv(GL_TEXTURE_BINDING_2D, &last_tex); if (gl_error("gl_shmem_capture", "failed to get last texture")) { return; } gl_shmem_capture_queue_copy(); next_tex = (data.cur_tex == NUM_BUFFERS - 1) ? 0 : data.cur_tex + 1; gl_copy_backbuffer(data.textures[next_tex]); if (data.copy_wait < NUM_BUFFERS - 1) { data.copy_wait++; } else { GLuint src = data.textures[next_tex]; GLuint dst = data.pbos[next_tex]; if (shmem_texture_data_lock(next_tex)) { glUnmapBuffer(GL_PIXEL_PACK_BUFFER); data.texture_mapped[next_tex] = false; shmem_texture_data_unlock(next_tex); } gl_shmem_capture_stage(dst, src); data.texture_ready[next_tex] = true; } glBindTexture(GL_TEXTURE_2D, last_tex); glBindFramebuffer(GL_DRAW_FRAMEBUFFER, last_fbo); }