static void test_create_rendertarget_view(ID3D10Device *device) { D3D10_RENDER_TARGET_VIEW_DESC rtv_desc; D3D10_TEXTURE2D_DESC texture_desc; D3D10_BUFFER_DESC buffer_desc; ID3D10RenderTargetView *rtview; ID3D10Texture2D *texture; ID3D10Buffer *buffer; HRESULT hr; buffer_desc.ByteWidth = 1024; buffer_desc.Usage = D3D10_USAGE_DEFAULT; buffer_desc.BindFlags = D3D10_BIND_RENDER_TARGET; buffer_desc.CPUAccessFlags = 0; buffer_desc.MiscFlags = 0; hr = ID3D10Device_CreateBuffer(device, &buffer_desc, NULL, &buffer); ok(SUCCEEDED(hr), "Failed to create a buffer, hr %#x\n", hr); rtv_desc.Format = DXGI_FORMAT_R32G32B32A32_FLOAT; rtv_desc.ViewDimension = D3D10_RTV_DIMENSION_BUFFER; U(rtv_desc).Buffer.ElementOffset = 0; U(rtv_desc).Buffer.ElementWidth = 64; hr = ID3D10Device_CreateRenderTargetView(device, (ID3D10Resource *)buffer, &rtv_desc, &rtview); ok(SUCCEEDED(hr), "Failed to create a rendertarget view, hr %#x\n", hr); ID3D10RenderTargetView_Release(rtview); ID3D10Buffer_Release(buffer); texture_desc.Width = 512; texture_desc.Height = 512; texture_desc.MipLevels = 1; texture_desc.ArraySize = 1; texture_desc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; texture_desc.SampleDesc.Count = 1; texture_desc.SampleDesc.Quality = 0; texture_desc.Usage = D3D10_USAGE_DEFAULT; texture_desc.BindFlags = D3D10_BIND_RENDER_TARGET; texture_desc.CPUAccessFlags = 0; texture_desc.MiscFlags = 0; hr = ID3D10Device_CreateTexture2D(device, &texture_desc, NULL, &texture); ok(SUCCEEDED(hr), "Failed to create a 2d texture, hr %#x\n", hr); /* For texture resources it's allowed to specify NULL as desc */ hr = ID3D10Device_CreateRenderTargetView(device, (ID3D10Resource *)texture, NULL, &rtview); ok(SUCCEEDED(hr), "Failed to create a rendertarget view, hr %#x\n", hr); ID3D10RenderTargetView_GetDesc(rtview, &rtv_desc); ok(rtv_desc.Format == texture_desc.Format, "Expected format %#x, got %#x\n", texture_desc.Format, rtv_desc.Format); ok(rtv_desc.ViewDimension == D3D10_RTV_DIMENSION_TEXTURE2D, "Expected view dimension D3D10_RTV_DIMENSION_TEXTURE2D, got %#x\n", rtv_desc.ViewDimension); ok(U(rtv_desc).Texture2D.MipSlice == 0, "Expected mip slice 0, got %#x\n", U(rtv_desc).Texture2D.MipSlice); ID3D10RenderTargetView_Release(rtview); ID3D10Texture2D_Release(texture); }
HRESULT d2d_brush_get_ps_cb(struct d2d_brush *brush, struct d2d_d3d_render_target *render_target, ID3D10Buffer **ps_cb) { D3D10_SUBRESOURCE_DATA buffer_data; D3D10_BUFFER_DESC buffer_desc; struct { float _11, _21, _31, pad0; float _12, _22, _32, opacity; BOOL ignore_alpha; } bitmap_brush_cb; D2D1_COLOR_F color; HRESULT hr; buffer_desc.Usage = D3D10_USAGE_DEFAULT; buffer_desc.BindFlags = D3D10_BIND_CONSTANT_BUFFER; buffer_desc.CPUAccessFlags = 0; buffer_desc.MiscFlags = 0; buffer_data.SysMemPitch = 0; buffer_data.SysMemSlicePitch = 0; if (brush->type == D2D_BRUSH_TYPE_SOLID) { color = brush->u.solid.color; color.a *= brush->opacity; color.r *= color.a; color.g *= color.a; color.b *= color.a; buffer_desc.ByteWidth = sizeof(color); buffer_data.pSysMem = &color; } else if (brush->type == D2D_BRUSH_TYPE_BITMAP) { struct d2d_bitmap *bitmap = brush->u.bitmap.bitmap; D2D_MATRIX_3X2_F w, b; float dpi_scale, d; /* Scale for dpi. */ w = render_target->drawing_state.transform; dpi_scale = render_target->dpi_x / 96.0f; w._11 *= dpi_scale; w._21 *= dpi_scale; w._31 *= dpi_scale; dpi_scale = render_target->dpi_y / 96.0f; w._12 *= dpi_scale; w._22 *= dpi_scale; w._32 *= dpi_scale; /* Scale for bitmap size and dpi. */ b = brush->transform; dpi_scale = bitmap->pixel_size.width * (96.0f / bitmap->dpi_x); b._11 *= dpi_scale; b._21 *= dpi_scale; dpi_scale = bitmap->pixel_size.height * (96.0f / bitmap->dpi_y); b._12 *= dpi_scale; b._22 *= dpi_scale; d2d_matrix_multiply(&b, &w); /* Invert the matrix. (Because the matrix is applied to the sampling * coordinates. I.e., to scale the bitmap by 2 we need to divide the * coordinates by 2.) */ d = b._11 * b._22 - b._21 * b._12; if (d != 0.0f) { bitmap_brush_cb._11 = b._22 / d; bitmap_brush_cb._21 = -b._21 / d; bitmap_brush_cb._31 = (b._21 * b._32 - b._31 * b._22) / d; bitmap_brush_cb._12 = -b._12 / d; bitmap_brush_cb._22 = b._11 / d; bitmap_brush_cb._32 = -(b._11 * b._32 - b._31 * b._12) / d; } bitmap_brush_cb.opacity = brush->opacity; bitmap_brush_cb.ignore_alpha = bitmap->format.alphaMode == D2D1_ALPHA_MODE_IGNORE; buffer_desc.ByteWidth = sizeof(bitmap_brush_cb); buffer_data.pSysMem = &bitmap_brush_cb; } else { FIXME("Unhandled brush type %#x.\n", brush->type); return E_NOTIMPL; } if (FAILED(hr = ID3D10Device_CreateBuffer(render_target->device, &buffer_desc, &buffer_data, ps_cb))) ERR("Failed to create constant buffer, hr %#x.\n", hr); return hr; }