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 HRESULT set_rtdesc_from_resource(D3D10_RENDER_TARGET_VIEW_DESC *desc, ID3D10Resource *resource) { D3D10_RESOURCE_DIMENSION dimension; HRESULT hr; ID3D10Resource_GetType(resource, &dimension); switch(dimension) { case D3D10_RESOURCE_DIMENSION_TEXTURE1D: { ID3D10Texture1D *texture; D3D10_TEXTURE1D_DESC texture_desc; hr = ID3D10Resource_QueryInterface(resource, &IID_ID3D10Texture1D, (void **)&texture); if (FAILED(hr)) { ERR("Resource of type TEXTURE1D doesn't implement ID3D10Texture1D?\n"); return E_INVALIDARG; } ID3D10Texture1D_GetDesc(texture, &texture_desc); ID3D10Texture1D_Release(texture); desc->Format = texture_desc.Format; if (texture_desc.ArraySize == 1) { desc->ViewDimension = D3D10_RTV_DIMENSION_TEXTURE1D; desc->u.Texture1D.MipSlice = 0; } else { desc->ViewDimension = D3D10_RTV_DIMENSION_TEXTURE1DARRAY; desc->u.Texture1DArray.MipSlice = 0; desc->u.Texture1DArray.FirstArraySlice = 0; desc->u.Texture1DArray.ArraySize = 1; } return S_OK; } case D3D10_RESOURCE_DIMENSION_TEXTURE2D: { ID3D10Texture2D *texture; D3D10_TEXTURE2D_DESC texture_desc; hr = ID3D10Resource_QueryInterface(resource, &IID_ID3D10Texture2D, (void **)&texture); if (FAILED(hr)) { ERR("Resource of type TEXTURE2D doesn't implement ID3D10Texture2D?\n"); return E_INVALIDARG; } ID3D10Texture2D_GetDesc(texture, &texture_desc); ID3D10Texture2D_Release(texture); desc->Format = texture_desc.Format; if (texture_desc.ArraySize == 1) { if (texture_desc.SampleDesc.Count == 1) { desc->ViewDimension = D3D10_RTV_DIMENSION_TEXTURE2D; desc->u.Texture2D.MipSlice = 0; } else { desc->ViewDimension = D3D10_RTV_DIMENSION_TEXTURE2DMS; } } else { if (texture_desc.SampleDesc.Count == 1) { desc->ViewDimension = D3D10_RTV_DIMENSION_TEXTURE2DARRAY; desc->u.Texture2DArray.MipSlice = 0; desc->u.Texture2DArray.FirstArraySlice = 0; desc->u.Texture2DArray.ArraySize = 1; } else { desc->ViewDimension = D3D10_RTV_DIMENSION_TEXTURE2DMSARRAY; desc->u.Texture2DMSArray.FirstArraySlice = 0; desc->u.Texture2DMSArray.ArraySize = 1; } } return S_OK; } case D3D10_RESOURCE_DIMENSION_TEXTURE3D: { ID3D10Texture3D *texture; D3D10_TEXTURE3D_DESC texture_desc; hr = ID3D10Resource_QueryInterface(resource, &IID_ID3D10Texture3D, (void **)&texture); if (FAILED(hr)) { ERR("Resource of type TEXTURE3D doesn't implement ID3D10Texture3D?\n"); return E_INVALIDARG; } ID3D10Texture3D_GetDesc(texture, &texture_desc); ID3D10Texture3D_Release(texture); desc->Format = texture_desc.Format; desc->ViewDimension = D3D10_RTV_DIMENSION_TEXTURE3D; desc->u.Texture3D.MipSlice = 0; desc->u.Texture3D.FirstWSlice = 0; desc->u.Texture3D.WSize = 1; return S_OK; } default: FIXME("Unhandled resource dimension %#x.\n", dimension); return E_INVALIDARG; } }
static HRESULT set_srdesc_from_resource(D3D10_SHADER_RESOURCE_VIEW_DESC *desc, ID3D10Resource *resource) { D3D10_RESOURCE_DIMENSION dimension; ID3D10Resource_GetType(resource, &dimension); switch (dimension) { case D3D10_RESOURCE_DIMENSION_TEXTURE1D: { D3D10_TEXTURE1D_DESC texture_desc; ID3D10Texture1D *texture; if (FAILED(ID3D10Resource_QueryInterface(resource, &IID_ID3D10Texture1D, (void **)&texture))) { ERR("Resource of type TEXTURE1D doesn't implement ID3D10Texture1D.\n"); return E_INVALIDARG; } ID3D10Texture1D_GetDesc(texture, &texture_desc); ID3D10Texture1D_Release(texture); desc->Format = texture_desc.Format; if (texture_desc.ArraySize == 1) { desc->ViewDimension = D3D10_SRV_DIMENSION_TEXTURE1D; desc->u.Texture1D.MostDetailedMip = 0; desc->u.Texture1D.MipLevels = texture_desc.MipLevels; } else { desc->ViewDimension = D3D10_SRV_DIMENSION_TEXTURE1DARRAY; desc->u.Texture1DArray.MostDetailedMip = 0; desc->u.Texture1DArray.MipLevels = texture_desc.MipLevels; desc->u.Texture1DArray.FirstArraySlice = 0; desc->u.Texture1DArray.ArraySize = texture_desc.ArraySize; } return S_OK; } case D3D10_RESOURCE_DIMENSION_TEXTURE2D: { D3D10_TEXTURE2D_DESC texture_desc; ID3D10Texture2D *texture; if (FAILED(ID3D10Resource_QueryInterface(resource, &IID_ID3D10Texture2D, (void **)&texture))) { ERR("Resource of type TEXTURE2D doesn't implement ID3D10Texture2D.\n"); return E_INVALIDARG; } ID3D10Texture2D_GetDesc(texture, &texture_desc); ID3D10Texture2D_Release(texture); desc->Format = texture_desc.Format; if (texture_desc.ArraySize == 1) { if (texture_desc.SampleDesc.Count == 1) { desc->ViewDimension = D3D10_SRV_DIMENSION_TEXTURE2D; desc->u.Texture2D.MostDetailedMip = 0; desc->u.Texture2D.MipLevels = texture_desc.MipLevels; } else { desc->ViewDimension = D3D10_SRV_DIMENSION_TEXTURE2DMS; } } else { if (texture_desc.SampleDesc.Count == 1) { desc->ViewDimension = D3D10_SRV_DIMENSION_TEXTURE2DARRAY; desc->u.Texture2DArray.MostDetailedMip = 0; desc->u.Texture2DArray.MipLevels = texture_desc.MipLevels; desc->u.Texture2DArray.FirstArraySlice = 0; desc->u.Texture2DArray.ArraySize = texture_desc.ArraySize; } else { desc->ViewDimension = D3D10_SRV_DIMENSION_TEXTURE2DMSARRAY; desc->u.Texture2DMSArray.FirstArraySlice = 0; desc->u.Texture2DMSArray.ArraySize = texture_desc.ArraySize; } } return S_OK; } case D3D10_RESOURCE_DIMENSION_TEXTURE3D: { D3D10_TEXTURE3D_DESC texture_desc; ID3D10Texture3D *texture; if (FAILED(ID3D10Resource_QueryInterface(resource, &IID_ID3D10Texture3D, (void **)&texture))) { ERR("Resource of type TEXTURE3D doesn't implement ID3D10Texture3D.\n"); return E_INVALIDARG; } ID3D10Texture3D_GetDesc(texture, &texture_desc); ID3D10Texture3D_Release(texture); desc->Format = texture_desc.Format; desc->ViewDimension = D3D10_SRV_DIMENSION_TEXTURE3D; desc->u.Texture3D.MostDetailedMip = 0; desc->u.Texture3D.MipLevels = texture_desc.MipLevels; return S_OK; } default: FIXME("Unhandled resource dimension %#x.\n", dimension); case D3D10_RESOURCE_DIMENSION_BUFFER: return E_INVALIDARG; } }