static HRESULT STDMETHODCALLTYPE d2d_dc_render_target_BindDC(ID2D1DCRenderTarget *iface, const HDC hdc, const RECT *rect) { struct d2d_dc_render_target *render_target = impl_from_ID2D1DCRenderTarget(iface); D2D1_BITMAP_PROPERTIES1 bitmap_desc; struct d2d_bitmap *bitmap_impl; IDXGISurface1 *dxgi_surface; ID2D1DeviceContext *context; ID3D10Resource *resource; D2D1_SIZE_U bitmap_size; ID2D1Bitmap *bitmap; HRESULT hr; TRACE("iface %p, hdc %p, rect %s.\n", iface, hdc, wine_dbgstr_rect(rect)); if (!hdc) return E_INVALIDARG; /* Switch dxgi target to new surface. */ ID2D1RenderTarget_QueryInterface(render_target->dxgi_target, &IID_ID2D1DeviceContext, (void **)&context); bitmap_size.width = rect->right - rect->left; bitmap_size.height = rect->bottom - rect->top; memset(&bitmap_desc, 0, sizeof(bitmap_desc)); bitmap_desc.pixelFormat = render_target->pixel_format; bitmap_desc.bitmapOptions = D2D1_BITMAP_OPTIONS_TARGET | D2D1_BITMAP_OPTIONS_CANNOT_DRAW | D2D1_BITMAP_OPTIONS_GDI_COMPATIBLE; if (FAILED(hr = ID2D1DeviceContext_CreateBitmap(context, bitmap_size, NULL, 0, &bitmap_desc, (ID2D1Bitmap1 **)&bitmap))) { WARN("Failed to create target bitmap, hr %#x.\n", hr); ID2D1DeviceContext_Release(context); return hr; } bitmap_impl = unsafe_impl_from_ID2D1Bitmap(bitmap); ID3D10ShaderResourceView_GetResource(bitmap_impl->view, &resource); ID3D10Resource_QueryInterface(resource, &IID_IDXGISurface1, (void **)&dxgi_surface); ID3D10Resource_Release(resource); ID2D1DeviceContext_SetTarget(context, (ID2D1Image *)bitmap); ID2D1Bitmap_Release(bitmap); ID2D1DeviceContext_Release(context); if (render_target->dxgi_surface) IDXGISurface1_Release(render_target->dxgi_surface); render_target->dxgi_surface = dxgi_surface; render_target->hdc = hdc; render_target->dst_rect = *rect; return hr; }
static ULONG STDMETHODCALLTYPE d3d10_shader_resource_view_Release(ID3D10ShaderResourceView *iface) { struct d3d10_shader_resource_view *This = impl_from_ID3D10ShaderResourceView(iface); ULONG refcount = InterlockedDecrement(&This->refcount); TRACE("%p decreasing refcount to %u.\n", This, refcount); if (!refcount) { ID3D10Resource_Release(This->resource); HeapFree(GetProcessHeap(), 0, This); } return refcount; }
static ULONG STDMETHODCALLTYPE d3d10_rendertarget_view_Release(ID3D10RenderTargetView *iface) { struct d3d10_rendertarget_view *This = impl_from_ID3D10RenderTargetView(iface); ULONG refcount = InterlockedDecrement(&This->refcount); TRACE("%p decreasing refcount to %u\n", This, refcount); if (!refcount) { wined3d_rendertarget_view_decref(This->wined3d_view); ID3D10Resource_Release(This->resource); HeapFree(GetProcessHeap(), 0, This); } return refcount; }
static BOOL compare_surface(IDXGISurface *surface, const char *ref_sha1) { D3D10_MAPPED_TEXTURE2D mapped_texture; D3D10_TEXTURE2D_DESC texture_desc; DXGI_SURFACE_DESC surface_desc; ID3D10Resource *src_resource; ID3D10Texture2D *texture; ID3D10Device *device; HRESULT hr; BOOL ret; hr = IDXGISurface_GetDevice(surface, &IID_ID3D10Device, (void **)&device); ok(SUCCEEDED(hr), "Failed to get device, hr %#x.\n", hr); hr = IDXGISurface_QueryInterface(surface, &IID_ID3D10Resource, (void **)&src_resource); ok(SUCCEEDED(hr), "Failed to query resource interface, hr %#x.\n", hr); hr = IDXGISurface_GetDesc(surface, &surface_desc); ok(SUCCEEDED(hr), "Failed to get surface desc, hr %#x.\n", hr); texture_desc.Width = surface_desc.Width; texture_desc.Height = surface_desc.Height; texture_desc.MipLevels = 1; texture_desc.ArraySize = 1; texture_desc.Format = surface_desc.Format; texture_desc.SampleDesc = surface_desc.SampleDesc; texture_desc.Usage = D3D10_USAGE_STAGING; texture_desc.BindFlags = 0; texture_desc.CPUAccessFlags = D3D10_CPU_ACCESS_READ; texture_desc.MiscFlags = 0; hr = ID3D10Device_CreateTexture2D(device, &texture_desc, NULL, &texture); ok(SUCCEEDED(hr), "Failed to create texture, hr %#x.\n", hr); ID3D10Device_CopyResource(device, (ID3D10Resource *)texture, src_resource); hr = ID3D10Texture2D_Map(texture, 0, D3D10_MAP_READ, 0, &mapped_texture); ok(SUCCEEDED(hr), "Failed to map texture, hr %#x.\n", hr); ret = compare_sha1(mapped_texture.pData, mapped_texture.RowPitch, 4, texture_desc.Width, texture_desc.Height, ref_sha1); ID3D10Texture2D_Unmap(texture, 0); ID3D10Texture2D_Release(texture); ID3D10Resource_Release(src_resource); ID3D10Device_Release(device); return ret; }
static HRESULT d2d_wic_render_target_present(IUnknown *outer_unknown) { struct d2d_wic_render_target *render_target = impl_from_IUnknown(outer_unknown); D3D10_MAPPED_TEXTURE2D mapped_texture; ID3D10Resource *src_resource; IWICBitmapLock *bitmap_lock; UINT dst_size, dst_pitch; ID3D10Device *device; WICRect dst_rect; BYTE *src, *dst; unsigned int i; HRESULT hr; if (FAILED(hr = IDXGISurface_QueryInterface(render_target->dxgi_surface, &IID_ID3D10Resource, (void **)&src_resource))) { ERR("Failed to get source resource interface, hr %#x.\n", hr); goto end; } ID3D10Texture2D_GetDevice(render_target->readback_texture, &device); ID3D10Device_CopyResource(device, (ID3D10Resource *)render_target->readback_texture, src_resource); ID3D10Device_Release(device); ID3D10Resource_Release(src_resource); dst_rect.X = 0; dst_rect.Y = 0; dst_rect.Width = render_target->width; dst_rect.Height = render_target->height; if (FAILED(hr = IWICBitmap_Lock(render_target->bitmap, &dst_rect, WICBitmapLockWrite, &bitmap_lock))) { ERR("Failed to lock destination bitmap, hr %#x.\n", hr); goto end; } if (FAILED(hr = IWICBitmapLock_GetDataPointer(bitmap_lock, &dst_size, &dst))) { ERR("Failed to get data pointer, hr %#x.\n", hr); IWICBitmapLock_Release(bitmap_lock); goto end; } if (FAILED(hr = IWICBitmapLock_GetStride(bitmap_lock, &dst_pitch))) { ERR("Failed to get stride, hr %#x.\n", hr); IWICBitmapLock_Release(bitmap_lock); goto end; } if (FAILED(hr = ID3D10Texture2D_Map(render_target->readback_texture, 0, D3D10_MAP_READ, 0, &mapped_texture))) { ERR("Failed to map readback texture, hr %#x.\n", hr); IWICBitmapLock_Release(bitmap_lock); goto end; } src = mapped_texture.pData; for (i = 0; i < render_target->height; ++i) { memcpy(dst, src, render_target->bpp * render_target->width); src += mapped_texture.RowPitch; dst += dst_pitch; } ID3D10Texture2D_Unmap(render_target->readback_texture, 0); IWICBitmapLock_Release(bitmap_lock); end: return S_OK; }