Module: wine Branch: master Commit: 1f4e37659c5d7e713d605696d8bb64a25c97aea7 URL: http://source.winehq.org/git/wine.git/?a=commit;h=1f4e37659c5d7e713d605696d8...
Author: Henri Verbeet hverbeet@codeweavers.com Date: Tue Jul 14 15:57:40 2015 +0200
d2d1: Also bind the pixel shader and blend state in d2d_brush_bind_resources().
---
dlls/d2d1/brush.c | 16 ++++++++++++++-- dlls/d2d1/d2d1_private.h | 2 +- dlls/d2d1/render_target.c | 20 ++++++-------------- 3 files changed, 21 insertions(+), 17 deletions(-)
diff --git a/dlls/d2d1/brush.c b/dlls/d2d1/brush.c index cd5476a..edce7a2 100644 --- a/dlls/d2d1/brush.c +++ b/dlls/d2d1/brush.c @@ -709,12 +709,20 @@ static D3D10_TEXTURE_ADDRESS_MODE texture_addres_mode_from_extend_mode(D2D1_EXTE } }
-void d2d_brush_bind_resources(struct d2d_brush *brush, ID3D10Device *device) +void d2d_brush_bind_resources(struct d2d_brush *brush, struct d2d_d3d_render_target *render_target) { + static const float blend_factor[] = {1.0f, 1.0f, 1.0f, 1.0f}; + ID3D10Device *device = render_target->device; HRESULT hr;
- if (brush->type == D2D_BRUSH_TYPE_BITMAP) + ID3D10Device_OMSetBlendState(device, render_target->bs, blend_factor, D3D10_DEFAULT_SAMPLE_MASK); + if (brush->type == D2D_BRUSH_TYPE_SOLID) { + ID3D10Device_PSSetShader(device, render_target->rect_solid_ps); + } + else if (brush->type == D2D_BRUSH_TYPE_BITMAP) + { + ID3D10Device_PSSetShader(device, render_target->rect_bitmap_ps); ID3D10Device_PSSetShaderResources(device, 0, 1, &brush->u.bitmap.bitmap->view); if (!brush->u.bitmap.sampler_state) { @@ -743,4 +751,8 @@ void d2d_brush_bind_resources(struct d2d_brush *brush, ID3D10Device *device) } ID3D10Device_PSSetSamplers(device, 0, 1, &brush->u.bitmap.sampler_state); } + else + { + FIXME("Unhandled brush type %#x.\n", brush->type); + } } diff --git a/dlls/d2d1/d2d1_private.h b/dlls/d2d1/d2d1_private.h index 8ddee9e..91ebd9f 100644 --- a/dlls/d2d1/d2d1_private.h +++ b/dlls/d2d1/d2d1_private.h @@ -141,7 +141,7 @@ void d2d_linear_gradient_brush_init(struct d2d_brush *brush, ID2D1RenderTarget * HRESULT d2d_bitmap_brush_init(struct d2d_brush *brush, struct d2d_d3d_render_target *render_target, ID2D1Bitmap *bitmap, const D2D1_BITMAP_BRUSH_PROPERTIES *bitmap_brush_desc, const D2D1_BRUSH_PROPERTIES *brush_desc) DECLSPEC_HIDDEN; -void d2d_brush_bind_resources(struct d2d_brush *brush, ID3D10Device *device) DECLSPEC_HIDDEN; +void d2d_brush_bind_resources(struct d2d_brush *brush, struct d2d_d3d_render_target *render_target) DECLSPEC_HIDDEN; struct d2d_brush *unsafe_impl_from_ID2D1Brush(ID2D1Brush *iface) DECLSPEC_HIDDEN;
struct d2d_stroke_style diff --git a/dlls/d2d1/render_target.c b/dlls/d2d1/render_target.c index b7ca78c..fa98b5b 100644 --- a/dlls/d2d1/render_target.c +++ b/dlls/d2d1/render_target.c @@ -140,13 +140,12 @@ static void d2d_clip_stack_pop(struct d2d_clip_stack *stack) }
static void d2d_draw(struct d2d_d3d_render_target *render_target, ID3D10Buffer *vs_cb, - ID3D10PixelShader *ps, ID3D10Buffer *ps_cb, struct d2d_brush *brush) + ID3D10Buffer *ps_cb, struct d2d_brush *brush) { ID3D10Device *device = render_target->device; unsigned int offset; D3D10_VIEWPORT vp; HRESULT hr; - static const float blend_factor[] = {1.0f, 1.0f, 1.0f, 1.0f};
vp.TopLeftX = 0; vp.TopLeftY = 0; @@ -171,7 +170,6 @@ static void d2d_draw(struct d2d_d3d_render_target *render_target, ID3D10Buffer * ID3D10Device_VSSetConstantBuffers(device, 0, 1, &vs_cb); ID3D10Device_VSSetShader(device, render_target->vs); ID3D10Device_PSSetConstantBuffers(device, 0, 1, &ps_cb); - ID3D10Device_PSSetShader(device, ps); ID3D10Device_RSSetViewports(device, 1, &vp); if (render_target->clip_stack.count) { @@ -188,10 +186,9 @@ static void d2d_draw(struct d2d_d3d_render_target *render_target, ID3D10Buffer * } ID3D10Device_OMSetRenderTargets(device, 1, &render_target->view, NULL); if (brush) - { - ID3D10Device_OMSetBlendState(device, render_target->bs, blend_factor, D3D10_DEFAULT_SAMPLE_MASK); - d2d_brush_bind_resources(brush, device); - } + d2d_brush_bind_resources(brush, render_target); + else + ID3D10Device_PSSetShader(device, render_target->rect_solid_ps);
ID3D10Device_Draw(device, 4, 0);
@@ -553,7 +550,6 @@ static void STDMETHODCALLTYPE d2d_d3d_render_target_FillRectangle(ID2D1RenderTar D3D10_SUBRESOURCE_DATA buffer_data; D3D10_BUFFER_DESC buffer_desc; ID3D10Buffer *vs_cb, *ps_cb; - ID3D10PixelShader *ps; D2D1_COLOR_F color; float tmp_x, tmp_y; HRESULT hr; @@ -619,8 +615,6 @@ static void STDMETHODCALLTYPE d2d_d3d_render_target_FillRectangle(ID2D1RenderTar D2D_MATRIX_3X2_F w, b; float dpi_scale, d;
- ps = render_target->rect_bitmap_ps; - /* Scale for dpi. */ w = render_target->drawing_state.transform; dpi_scale = render_target->dpi_x / 96.0f; @@ -663,8 +657,6 @@ static void STDMETHODCALLTYPE d2d_d3d_render_target_FillRectangle(ID2D1RenderTar } else { - ps = render_target->rect_solid_ps; - color = brush_impl->u.solid.color; color.a *= brush_impl->opacity;
@@ -679,7 +671,7 @@ static void STDMETHODCALLTYPE d2d_d3d_render_target_FillRectangle(ID2D1RenderTar return; }
- d2d_draw(render_target, vs_cb, ps, ps_cb, brush_impl); + d2d_draw(render_target, vs_cb, ps_cb, brush_impl);
ID3D10Buffer_Release(ps_cb); ID3D10Buffer_Release(vs_cb); @@ -1145,7 +1137,7 @@ static void STDMETHODCALLTYPE d2d_d3d_render_target_Clear(ID2D1RenderTarget *ifa return; }
- d2d_draw(render_target, vs_cb, render_target->rect_solid_ps, ps_cb, NULL); + d2d_draw(render_target, vs_cb, ps_cb, NULL);
ID3D10Buffer_Release(ps_cb); ID3D10Buffer_Release(vs_cb);