Commit 9fd51e4d authored by Nikolay Sivov's avatar Nikolay Sivov Committed by Alexandre Julliard

d2d1: Reuse VS constant buffer object.

parent a21d4fb8
...@@ -121,6 +121,22 @@ struct d2d_ps_cb ...@@ -121,6 +121,22 @@ struct d2d_ps_cb
struct d2d_brush_cb opacity_brush; struct d2d_brush_cb opacity_brush;
}; };
struct d2d_vec4
{
float x, y, z, w;
};
struct d2d_vs_cb
{
struct
{
float _11, _21, _31, pad0;
float _12, _22, _32, stroke_width;
} transform_geometry;
struct d2d_vec4 transform_rtx;
struct d2d_vec4 transform_rty;
};
struct d2d_device_context_ops struct d2d_device_context_ops
{ {
HRESULT (*device_context_present)(IUnknown *outer_unknown); HRESULT (*device_context_present)(IUnknown *outer_unknown);
...@@ -149,6 +165,7 @@ struct d2d_device_context ...@@ -149,6 +165,7 @@ struct d2d_device_context
struct d2d_bitmap *target; struct d2d_bitmap *target;
ID3D10StateBlock *stateblock; ID3D10StateBlock *stateblock;
struct d2d_shape_resources shape_resources[D2D_SHAPE_TYPE_COUNT]; struct d2d_shape_resources shape_resources[D2D_SHAPE_TYPE_COUNT];
ID3D10Buffer *vs_cb;
ID3D10PixelShader *ps; ID3D10PixelShader *ps;
ID3D10Buffer *ps_cb; ID3D10Buffer *ps_cb;
ID3D10Buffer *ib; ID3D10Buffer *ib;
...@@ -415,11 +432,6 @@ struct d2d_face ...@@ -415,11 +432,6 @@ struct d2d_face
UINT16 v[3]; UINT16 v[3];
}; };
struct d2d_vec4
{
float x, y, z, w;
};
struct d2d_outline_vertex struct d2d_outline_vertex
{ {
D2D1_POINT_2F position; D2D1_POINT_2F position;
......
...@@ -119,7 +119,7 @@ static void d2d_clip_stack_pop(struct d2d_clip_stack *stack) ...@@ -119,7 +119,7 @@ static void d2d_clip_stack_pop(struct d2d_clip_stack *stack)
static void d2d_device_context_draw(struct d2d_device_context *render_target, enum d2d_shape_type shape_type, static void d2d_device_context_draw(struct d2d_device_context *render_target, enum d2d_shape_type shape_type,
ID3D10Buffer *ib, unsigned int index_count, ID3D10Buffer *vb, unsigned int vb_stride, ID3D10Buffer *ib, unsigned int index_count, ID3D10Buffer *vb, unsigned int vb_stride,
ID3D10Buffer *vs_cb, struct d2d_brush *brush, struct d2d_brush *opacity_brush) struct d2d_brush *brush, struct d2d_brush *opacity_brush)
{ {
struct d2d_shape_resources *shape_resources = &render_target->shape_resources[shape_type]; struct d2d_shape_resources *shape_resources = &render_target->shape_resources[shape_type];
ID3D10Device *device = render_target->d3d_device; ID3D10Device *device = render_target->d3d_device;
...@@ -148,7 +148,7 @@ static void d2d_device_context_draw(struct d2d_device_context *render_target, en ...@@ -148,7 +148,7 @@ static void d2d_device_context_draw(struct d2d_device_context *render_target, en
ID3D10Device_IASetIndexBuffer(device, ib, DXGI_FORMAT_R16_UINT, 0); ID3D10Device_IASetIndexBuffer(device, ib, DXGI_FORMAT_R16_UINT, 0);
offset = 0; offset = 0;
ID3D10Device_IASetVertexBuffers(device, 0, 1, &vb, &vb_stride, &offset); ID3D10Device_IASetVertexBuffers(device, 0, 1, &vb, &vb_stride, &offset);
ID3D10Device_VSSetConstantBuffers(device, 0, 1, &vs_cb); ID3D10Device_VSSetConstantBuffers(device, 0, 1, &render_target->vs_cb);
ID3D10Device_VSSetShader(device, shape_resources->vs); ID3D10Device_VSSetShader(device, shape_resources->vs);
ID3D10Device_PSSetConstantBuffers(device, 0, 1, &render_target->ps_cb); ID3D10Device_PSSetConstantBuffers(device, 0, 1, &render_target->ps_cb);
ID3D10Device_PSSetShader(device, render_target->ps); ID3D10Device_PSSetShader(device, render_target->ps);
...@@ -267,6 +267,7 @@ static ULONG STDMETHODCALLTYPE d2d_device_context_inner_Release(IUnknown *iface) ...@@ -267,6 +267,7 @@ static ULONG STDMETHODCALLTYPE d2d_device_context_inner_Release(IUnknown *iface)
ID3D10Buffer_Release(context->ib); ID3D10Buffer_Release(context->ib);
ID3D10Buffer_Release(context->ps_cb); ID3D10Buffer_Release(context->ps_cb);
ID3D10PixelShader_Release(context->ps); ID3D10PixelShader_Release(context->ps);
ID3D10Buffer_Release(context->vs_cb);
for (i = 0; i < D2D_SHAPE_TYPE_COUNT; ++i) for (i = 0; i < D2D_SHAPE_TYPE_COUNT; ++i)
{ {
ID3D10VertexShader_Release(context->shape_resources[i].vs); ID3D10VertexShader_Release(context->shape_resources[i].vs);
...@@ -733,72 +734,75 @@ static HRESULT d2d_device_context_update_ps_cb(struct d2d_device_context *contex ...@@ -733,72 +734,75 @@ static HRESULT d2d_device_context_update_ps_cb(struct d2d_device_context *contex
return hr; return hr;
} }
static void d2d_device_context_draw_geometry(struct d2d_device_context *render_target, static HRESULT d2d_device_context_update_vs_cb(struct d2d_device_context *context,
const struct d2d_geometry *geometry, struct d2d_brush *brush, float stroke_width) const D2D_MATRIX_3X2_F *geometry_transform, float stroke_width)
{ {
D3D10_SUBRESOURCE_DATA buffer_data;
D3D10_BUFFER_DESC buffer_desc;
ID3D10Buffer *ib, *vb, *vs_cb;
const D2D1_MATRIX_3X2_F *w; const D2D1_MATRIX_3X2_F *w;
struct d2d_vs_cb *cb_data;
float tmp_x, tmp_y; float tmp_x, tmp_y;
HRESULT hr; HRESULT hr;
struct
if (FAILED(hr = ID3D10Buffer_Map(context->vs_cb, D3D10_MAP_WRITE_DISCARD, 0, (void **)&cb_data)))
{ {
struct WARN("Failed to map constant buffer, hr %#x.\n", hr);
{ return hr;
float _11, _21, _31, pad0; }
float _12, _22, _32, stroke_width;
} transform_geometry;
struct d2d_vec4 transform_rtx;
struct d2d_vec4 transform_rty;
} vs_cb_data;
vs_cb_data.transform_geometry._11 = geometry->transform._11;
vs_cb_data.transform_geometry._21 = geometry->transform._21;
vs_cb_data.transform_geometry._31 = geometry->transform._31;
vs_cb_data.transform_geometry.pad0 = 0.0f;
vs_cb_data.transform_geometry._12 = geometry->transform._12;
vs_cb_data.transform_geometry._22 = geometry->transform._22;
vs_cb_data.transform_geometry._32 = geometry->transform._32;
vs_cb_data.transform_geometry.stroke_width = stroke_width;
w = &render_target->drawing_state.transform;
tmp_x = render_target->desc.dpiX / 96.0f;
vs_cb_data.transform_rtx.x = w->_11 * tmp_x;
vs_cb_data.transform_rtx.y = w->_21 * tmp_x;
vs_cb_data.transform_rtx.z = w->_31 * tmp_x;
vs_cb_data.transform_rtx.w = 2.0f / render_target->pixel_size.width;
tmp_y = render_target->desc.dpiY / 96.0f;
vs_cb_data.transform_rty.x = w->_12 * tmp_y;
vs_cb_data.transform_rty.y = w->_22 * tmp_y;
vs_cb_data.transform_rty.z = w->_32 * tmp_y;
vs_cb_data.transform_rty.w = -2.0f / render_target->pixel_size.height;
buffer_desc.ByteWidth = sizeof(vs_cb_data);
buffer_desc.Usage = D3D10_USAGE_DEFAULT;
buffer_desc.BindFlags = D3D10_BIND_CONSTANT_BUFFER;
buffer_desc.CPUAccessFlags = 0;
buffer_desc.MiscFlags = 0;
buffer_data.pSysMem = &vs_cb_data; cb_data->transform_geometry._11 = geometry_transform->_11;
buffer_data.SysMemPitch = 0; cb_data->transform_geometry._21 = geometry_transform->_21;
buffer_data.SysMemSlicePitch = 0; cb_data->transform_geometry._31 = geometry_transform->_31;
cb_data->transform_geometry.pad0 = 0.0f;
cb_data->transform_geometry._12 = geometry_transform->_12;
cb_data->transform_geometry._22 = geometry_transform->_22;
cb_data->transform_geometry._32 = geometry_transform->_32;
cb_data->transform_geometry.stroke_width = stroke_width;
w = &context->drawing_state.transform;
tmp_x = context->desc.dpiX / 96.0f;
cb_data->transform_rtx.x = w->_11 * tmp_x;
cb_data->transform_rtx.y = w->_21 * tmp_x;
cb_data->transform_rtx.z = w->_31 * tmp_x;
cb_data->transform_rtx.w = 2.0f / context->pixel_size.width;
tmp_y = context->desc.dpiY / 96.0f;
cb_data->transform_rty.x = w->_12 * tmp_y;
cb_data->transform_rty.y = w->_22 * tmp_y;
cb_data->transform_rty.z = w->_32 * tmp_y;
cb_data->transform_rty.w = -2.0f / context->pixel_size.height;
ID3D10Buffer_Unmap(context->vs_cb);
return S_OK;
}
static void d2d_device_context_draw_geometry(struct d2d_device_context *render_target,
const struct d2d_geometry *geometry, struct d2d_brush *brush, float stroke_width)
{
D3D10_SUBRESOURCE_DATA buffer_data;
D3D10_BUFFER_DESC buffer_desc;
ID3D10Buffer *ib, *vb;
HRESULT hr;
if (FAILED(hr = ID3D10Device_CreateBuffer(render_target->d3d_device, &buffer_desc, &buffer_data, &vs_cb))) if (FAILED(hr = d2d_device_context_update_vs_cb(render_target, &geometry->transform, stroke_width)))
{ {
WARN("Failed to create constant buffer, hr %#x.\n", hr); WARN("Failed to update vs constant buffer, hr %#x.\n", hr);
return; return;
} }
if (FAILED(hr = d2d_device_context_update_ps_cb(render_target, brush, NULL, TRUE, FALSE))) if (FAILED(hr = d2d_device_context_update_ps_cb(render_target, brush, NULL, TRUE, FALSE)))
{ {
WARN("Failed to update constant buffer, hr %#x.\n", hr); WARN("Failed to update ps constant buffer, hr %#x.\n", hr);
ID3D10Buffer_Release(vs_cb);
return; return;
} }
buffer_desc.Usage = D3D10_USAGE_DEFAULT;
buffer_desc.CPUAccessFlags = 0;
buffer_desc.MiscFlags = 0;
buffer_data.SysMemPitch = 0;
buffer_data.SysMemSlicePitch = 0;
if (geometry->outline.face_count) if (geometry->outline.face_count)
{ {
buffer_desc.ByteWidth = geometry->outline.face_count * sizeof(*geometry->outline.faces); buffer_desc.ByteWidth = geometry->outline.face_count * sizeof(*geometry->outline.faces);
...@@ -808,7 +812,7 @@ static void d2d_device_context_draw_geometry(struct d2d_device_context *render_t ...@@ -808,7 +812,7 @@ static void d2d_device_context_draw_geometry(struct d2d_device_context *render_t
if (FAILED(hr = ID3D10Device_CreateBuffer(render_target->d3d_device, &buffer_desc, &buffer_data, &ib))) if (FAILED(hr = ID3D10Device_CreateBuffer(render_target->d3d_device, &buffer_desc, &buffer_data, &ib)))
{ {
WARN("Failed to create index buffer, hr %#x.\n", hr); WARN("Failed to create index buffer, hr %#x.\n", hr);
goto done; return;
} }
buffer_desc.ByteWidth = geometry->outline.vertex_count * sizeof(*geometry->outline.vertices); buffer_desc.ByteWidth = geometry->outline.vertex_count * sizeof(*geometry->outline.vertices);
...@@ -819,11 +823,11 @@ static void d2d_device_context_draw_geometry(struct d2d_device_context *render_t ...@@ -819,11 +823,11 @@ static void d2d_device_context_draw_geometry(struct d2d_device_context *render_t
{ {
ERR("Failed to create vertex buffer, hr %#x.\n", hr); ERR("Failed to create vertex buffer, hr %#x.\n", hr);
ID3D10Buffer_Release(ib); ID3D10Buffer_Release(ib);
goto done; return;
} }
d2d_device_context_draw(render_target, D2D_SHAPE_TYPE_OUTLINE, ib, 3 * geometry->outline.face_count, vb, d2d_device_context_draw(render_target, D2D_SHAPE_TYPE_OUTLINE, ib, 3 * geometry->outline.face_count, vb,
sizeof(*geometry->outline.vertices), vs_cb, brush, NULL); sizeof(*geometry->outline.vertices), brush, NULL);
ID3D10Buffer_Release(vb); ID3D10Buffer_Release(vb);
ID3D10Buffer_Release(ib); ID3D10Buffer_Release(ib);
...@@ -838,7 +842,7 @@ static void d2d_device_context_draw_geometry(struct d2d_device_context *render_t ...@@ -838,7 +842,7 @@ static void d2d_device_context_draw_geometry(struct d2d_device_context *render_t
if (FAILED(hr = ID3D10Device_CreateBuffer(render_target->d3d_device, &buffer_desc, &buffer_data, &ib))) if (FAILED(hr = ID3D10Device_CreateBuffer(render_target->d3d_device, &buffer_desc, &buffer_data, &ib)))
{ {
WARN("Failed to create beziers index buffer, hr %#x.\n", hr); WARN("Failed to create beziers index buffer, hr %#x.\n", hr);
goto done; return;
} }
buffer_desc.ByteWidth = geometry->outline.bezier_count * sizeof(*geometry->outline.beziers); buffer_desc.ByteWidth = geometry->outline.bezier_count * sizeof(*geometry->outline.beziers);
...@@ -849,12 +853,12 @@ static void d2d_device_context_draw_geometry(struct d2d_device_context *render_t ...@@ -849,12 +853,12 @@ static void d2d_device_context_draw_geometry(struct d2d_device_context *render_t
{ {
ERR("Failed to create beziers vertex buffer, hr %#x.\n", hr); ERR("Failed to create beziers vertex buffer, hr %#x.\n", hr);
ID3D10Buffer_Release(ib); ID3D10Buffer_Release(ib);
goto done; return;
} }
d2d_device_context_draw(render_target, D2D_SHAPE_TYPE_BEZIER_OUTLINE, ib, d2d_device_context_draw(render_target, D2D_SHAPE_TYPE_BEZIER_OUTLINE, ib,
3 * geometry->outline.bezier_face_count, vb, 3 * geometry->outline.bezier_face_count, vb,
sizeof(*geometry->outline.beziers), vs_cb, brush, NULL); sizeof(*geometry->outline.beziers), brush, NULL);
ID3D10Buffer_Release(vb); ID3D10Buffer_Release(vb);
ID3D10Buffer_Release(ib); ID3D10Buffer_Release(ib);
...@@ -869,7 +873,7 @@ static void d2d_device_context_draw_geometry(struct d2d_device_context *render_t ...@@ -869,7 +873,7 @@ static void d2d_device_context_draw_geometry(struct d2d_device_context *render_t
if (FAILED(hr = ID3D10Device_CreateBuffer(render_target->d3d_device, &buffer_desc, &buffer_data, &ib))) if (FAILED(hr = ID3D10Device_CreateBuffer(render_target->d3d_device, &buffer_desc, &buffer_data, &ib)))
{ {
WARN("Failed to create arcs index buffer, hr %#x.\n", hr); WARN("Failed to create arcs index buffer, hr %#x.\n", hr);
goto done; return;
} }
buffer_desc.ByteWidth = geometry->outline.arc_count * sizeof(*geometry->outline.arcs); buffer_desc.ByteWidth = geometry->outline.arc_count * sizeof(*geometry->outline.arcs);
...@@ -880,20 +884,17 @@ static void d2d_device_context_draw_geometry(struct d2d_device_context *render_t ...@@ -880,20 +884,17 @@ static void d2d_device_context_draw_geometry(struct d2d_device_context *render_t
{ {
ERR("Failed to create arcs vertex buffer, hr %#x.\n", hr); ERR("Failed to create arcs vertex buffer, hr %#x.\n", hr);
ID3D10Buffer_Release(ib); ID3D10Buffer_Release(ib);
goto done; return;
} }
if (SUCCEEDED(d2d_device_context_update_ps_cb(render_target, brush, NULL, TRUE, TRUE))) if (SUCCEEDED(d2d_device_context_update_ps_cb(render_target, brush, NULL, TRUE, TRUE)))
d2d_device_context_draw(render_target, D2D_SHAPE_TYPE_ARC_OUTLINE, ib, d2d_device_context_draw(render_target, D2D_SHAPE_TYPE_ARC_OUTLINE, ib,
3 * geometry->outline.arc_face_count, vb, 3 * geometry->outline.arc_face_count, vb,
sizeof(*geometry->outline.arcs), vs_cb, brush, NULL); sizeof(*geometry->outline.arcs), brush, NULL);
ID3D10Buffer_Release(vb); ID3D10Buffer_Release(vb);
ID3D10Buffer_Release(ib); ID3D10Buffer_Release(ib);
} }
done:
ID3D10Buffer_Release(vs_cb);
} }
static void STDMETHODCALLTYPE d2d_device_context_DrawGeometry(ID2D1DeviceContext *iface, static void STDMETHODCALLTYPE d2d_device_context_DrawGeometry(ID2D1DeviceContext *iface,
...@@ -917,64 +918,25 @@ static void d2d_device_context_fill_geometry(struct d2d_device_context *render_t ...@@ -917,64 +918,25 @@ static void d2d_device_context_fill_geometry(struct d2d_device_context *render_t
{ {
D3D10_SUBRESOURCE_DATA buffer_data; D3D10_SUBRESOURCE_DATA buffer_data;
D3D10_BUFFER_DESC buffer_desc; D3D10_BUFFER_DESC buffer_desc;
ID3D10Buffer *ib, *vb, *vs_cb; ID3D10Buffer *ib, *vb;
D2D1_MATRIX_3X2_F *w;
float tmp_x, tmp_y;
HRESULT hr; HRESULT hr;
struct
{
struct
{
float _11, _21, _31, pad0;
float _12, _22, _32, pad1;
} transform_geometry;
struct d2d_vec4 transform_rtx;
struct d2d_vec4 transform_rty;
} vs_cb_data;
vs_cb_data.transform_geometry._11 = geometry->transform._11;
vs_cb_data.transform_geometry._21 = geometry->transform._21;
vs_cb_data.transform_geometry._31 = geometry->transform._31;
vs_cb_data.transform_geometry.pad0 = 0.0f;
vs_cb_data.transform_geometry._12 = geometry->transform._12;
vs_cb_data.transform_geometry._22 = geometry->transform._22;
vs_cb_data.transform_geometry._32 = geometry->transform._32;
vs_cb_data.transform_geometry.pad1 = 0.0f;
w = &render_target->drawing_state.transform;
tmp_x = render_target->desc.dpiX / 96.0f;
vs_cb_data.transform_rtx.x = w->_11 * tmp_x;
vs_cb_data.transform_rtx.y = w->_21 * tmp_x;
vs_cb_data.transform_rtx.z = w->_31 * tmp_x;
vs_cb_data.transform_rtx.w = 2.0f / render_target->pixel_size.width;
tmp_y = render_target->desc.dpiY / 96.0f;
vs_cb_data.transform_rty.x = w->_12 * tmp_y;
vs_cb_data.transform_rty.y = w->_22 * tmp_y;
vs_cb_data.transform_rty.z = w->_32 * tmp_y;
vs_cb_data.transform_rty.w = -2.0f / render_target->pixel_size.height;
buffer_desc.ByteWidth = sizeof(vs_cb_data);
buffer_desc.Usage = D3D10_USAGE_DEFAULT; buffer_desc.Usage = D3D10_USAGE_DEFAULT;
buffer_desc.BindFlags = D3D10_BIND_CONSTANT_BUFFER;
buffer_desc.CPUAccessFlags = 0; buffer_desc.CPUAccessFlags = 0;
buffer_desc.MiscFlags = 0; buffer_desc.MiscFlags = 0;
buffer_data.pSysMem = &vs_cb_data;
buffer_data.SysMemPitch = 0; buffer_data.SysMemPitch = 0;
buffer_data.SysMemSlicePitch = 0; buffer_data.SysMemSlicePitch = 0;
if (FAILED(hr = ID3D10Device_CreateBuffer(render_target->d3d_device, &buffer_desc, &buffer_data, &vs_cb))) if (FAILED(hr = d2d_device_context_update_vs_cb(render_target, &geometry->transform, 0.0f)))
{ {
WARN("Failed to create constant buffer, hr %#x.\n", hr); WARN("Failed to update vs constant buffer, hr %#x.\n", hr);
return; return;
} }
if (FAILED(hr = d2d_device_context_update_ps_cb(render_target, brush, opacity_brush, FALSE, FALSE))) if (FAILED(hr = d2d_device_context_update_ps_cb(render_target, brush, opacity_brush, FALSE, FALSE)))
{ {
WARN("Failed to update ps constant buffer, hr %#x.\n", hr); WARN("Failed to update ps constant buffer, hr %#x.\n", hr);
ID3D10Buffer_Release(vs_cb);
return; return;
} }
...@@ -987,7 +949,7 @@ static void d2d_device_context_fill_geometry(struct d2d_device_context *render_t ...@@ -987,7 +949,7 @@ static void d2d_device_context_fill_geometry(struct d2d_device_context *render_t
if (FAILED(hr = ID3D10Device_CreateBuffer(render_target->d3d_device, &buffer_desc, &buffer_data, &ib))) if (FAILED(hr = ID3D10Device_CreateBuffer(render_target->d3d_device, &buffer_desc, &buffer_data, &ib)))
{ {
WARN("Failed to create index buffer, hr %#x.\n", hr); WARN("Failed to create index buffer, hr %#x.\n", hr);
goto done; return;
} }
buffer_desc.ByteWidth = geometry->fill.vertex_count * sizeof(*geometry->fill.vertices); buffer_desc.ByteWidth = geometry->fill.vertex_count * sizeof(*geometry->fill.vertices);
...@@ -998,11 +960,11 @@ static void d2d_device_context_fill_geometry(struct d2d_device_context *render_t ...@@ -998,11 +960,11 @@ static void d2d_device_context_fill_geometry(struct d2d_device_context *render_t
{ {
ERR("Failed to create vertex buffer, hr %#x.\n", hr); ERR("Failed to create vertex buffer, hr %#x.\n", hr);
ID3D10Buffer_Release(ib); ID3D10Buffer_Release(ib);
goto done; return;
} }
d2d_device_context_draw(render_target, D2D_SHAPE_TYPE_TRIANGLE, ib, 3 * geometry->fill.face_count, vb, d2d_device_context_draw(render_target, D2D_SHAPE_TYPE_TRIANGLE, ib, 3 * geometry->fill.face_count, vb,
sizeof(*geometry->fill.vertices), vs_cb, brush, opacity_brush); sizeof(*geometry->fill.vertices), brush, opacity_brush);
ID3D10Buffer_Release(vb); ID3D10Buffer_Release(vb);
ID3D10Buffer_Release(ib); ID3D10Buffer_Release(ib);
...@@ -1017,11 +979,11 @@ static void d2d_device_context_fill_geometry(struct d2d_device_context *render_t ...@@ -1017,11 +979,11 @@ static void d2d_device_context_fill_geometry(struct d2d_device_context *render_t
if (FAILED(hr = ID3D10Device_CreateBuffer(render_target->d3d_device, &buffer_desc, &buffer_data, &vb))) if (FAILED(hr = ID3D10Device_CreateBuffer(render_target->d3d_device, &buffer_desc, &buffer_data, &vb)))
{ {
ERR("Failed to create beziers vertex buffer, hr %#x.\n", hr); ERR("Failed to create beziers vertex buffer, hr %#x.\n", hr);
goto done; return;
} }
d2d_device_context_draw(render_target, D2D_SHAPE_TYPE_CURVE, NULL, geometry->fill.bezier_vertex_count, vb, d2d_device_context_draw(render_target, D2D_SHAPE_TYPE_CURVE, NULL, geometry->fill.bezier_vertex_count, vb,
sizeof(*geometry->fill.bezier_vertices), vs_cb, brush, opacity_brush); sizeof(*geometry->fill.bezier_vertices), brush, opacity_brush);
ID3D10Buffer_Release(vb); ID3D10Buffer_Release(vb);
} }
...@@ -1035,18 +997,15 @@ static void d2d_device_context_fill_geometry(struct d2d_device_context *render_t ...@@ -1035,18 +997,15 @@ static void d2d_device_context_fill_geometry(struct d2d_device_context *render_t
if (FAILED(hr = ID3D10Device_CreateBuffer(render_target->d3d_device, &buffer_desc, &buffer_data, &vb))) if (FAILED(hr = ID3D10Device_CreateBuffer(render_target->d3d_device, &buffer_desc, &buffer_data, &vb)))
{ {
ERR("Failed to create arc vertex buffer, hr %#x.\n", hr); ERR("Failed to create arc vertex buffer, hr %#x.\n", hr);
goto done; return;
} }
if (SUCCEEDED(d2d_device_context_update_ps_cb(render_target, brush, opacity_brush, FALSE, TRUE))) if (SUCCEEDED(d2d_device_context_update_ps_cb(render_target, brush, opacity_brush, FALSE, TRUE)))
d2d_device_context_draw(render_target, D2D_SHAPE_TYPE_CURVE, NULL, geometry->fill.arc_vertex_count, vb, d2d_device_context_draw(render_target, D2D_SHAPE_TYPE_CURVE, NULL, geometry->fill.arc_vertex_count, vb,
sizeof(*geometry->fill.arc_vertices), vs_cb, brush, opacity_brush); sizeof(*geometry->fill.arc_vertices), brush, opacity_brush);
ID3D10Buffer_Release(vb); ID3D10Buffer_Release(vb);
} }
done:
ID3D10Buffer_Release(vs_cb);
} }
static void STDMETHODCALLTYPE d2d_device_context_FillGeometry(ID2D1DeviceContext *iface, static void STDMETHODCALLTYPE d2d_device_context_FillGeometry(ID2D1DeviceContext *iface,
...@@ -1642,61 +1601,51 @@ static void STDMETHODCALLTYPE d2d_device_context_PopAxisAlignedClip(ID2D1DeviceC ...@@ -1642,61 +1601,51 @@ static void STDMETHODCALLTYPE d2d_device_context_PopAxisAlignedClip(ID2D1DeviceC
static void STDMETHODCALLTYPE d2d_device_context_Clear(ID2D1DeviceContext *iface, const D2D1_COLOR_F *colour) static void STDMETHODCALLTYPE d2d_device_context_Clear(ID2D1DeviceContext *iface, const D2D1_COLOR_F *colour)
{ {
struct d2d_device_context *render_target = impl_from_ID2D1DeviceContext(iface); struct d2d_device_context *render_target = impl_from_ID2D1DeviceContext(iface);
D3D10_SUBRESOURCE_DATA buffer_data; struct d2d_ps_cb *ps_cb_data;
D3D10_BUFFER_DESC buffer_desc; struct d2d_vs_cb *vs_cb_data;
ID3D10Buffer *vs_cb;
D2D1_COLOR_F *c; D2D1_COLOR_F *c;
HRESULT hr; HRESULT hr;
static const struct
{
struct
{
float _11, _21, _31, pad0;
float _12, _22, _32, pad1;
} transform_geometry;
struct d2d_vec4 transform_rtx;
struct d2d_vec4 transform_rty;
}
vs_cb_data =
{
{1.0f, 0.0f, 0.0f, 0.0f,
0.0f, 1.0f, 0.0f, 0.0f},
{1.0f, 0.0f, 1.0f, 1.0f},
{0.0f, 1.0f, 1.0f, -1.0f},
};
struct d2d_ps_cb *cb_data;
TRACE("iface %p, colour %p.\n", iface, colour); TRACE("iface %p, colour %p.\n", iface, colour);
buffer_desc.ByteWidth = sizeof(vs_cb_data); if (FAILED(hr = ID3D10Buffer_Map(render_target->vs_cb, D3D10_MAP_WRITE_DISCARD,
buffer_desc.Usage = D3D10_USAGE_DEFAULT; 0, (void **)&vs_cb_data)))
buffer_desc.BindFlags = D3D10_BIND_CONSTANT_BUFFER;
buffer_desc.CPUAccessFlags = 0;
buffer_desc.MiscFlags = 0;
buffer_data.pSysMem = &vs_cb_data;
buffer_data.SysMemPitch = 0;
buffer_data.SysMemSlicePitch = 0;
if (FAILED(hr = ID3D10Device_CreateBuffer(render_target->d3d_device, &buffer_desc, &buffer_data, &vs_cb)))
{ {
WARN("Failed to create constant buffer, hr %#x.\n", hr); WARN("Failed to map vs constant buffer, hr %#x.\n", hr);
return; return;
} }
if (FAILED(hr = ID3D10Buffer_Map(render_target->ps_cb, D3D10_MAP_WRITE_DISCARD, 0, (void **)&cb_data))) vs_cb_data->transform_geometry._11 = 1.0f;
vs_cb_data->transform_geometry._21 = 0.0f;
vs_cb_data->transform_geometry._31 = 0.0f;
vs_cb_data->transform_geometry.pad0 = 0.0f;
vs_cb_data->transform_geometry._12 = 0.0f;
vs_cb_data->transform_geometry._22 = 1.0f;
vs_cb_data->transform_geometry._32 = 0.0f;
vs_cb_data->transform_geometry.stroke_width = 0.0f;
vs_cb_data->transform_rtx.x = 1.0f;
vs_cb_data->transform_rtx.y = 0.0f;
vs_cb_data->transform_rtx.z = 1.0f;
vs_cb_data->transform_rtx.w = 1.0f;
vs_cb_data->transform_rty.x = 0.0f;
vs_cb_data->transform_rty.y = 1.0f;
vs_cb_data->transform_rty.z = 1.0f;
vs_cb_data->transform_rty.w = -1.0f;
ID3D10Buffer_Unmap(render_target->vs_cb);
if (FAILED(hr = ID3D10Buffer_Map(render_target->ps_cb, D3D10_MAP_WRITE_DISCARD,
0, (void **)&ps_cb_data)))
{ {
WARN("Failed to map constant buffer, hr %#x.\n", hr); WARN("Failed to map ps constant buffer, hr %#x.\n", hr);
ID3D10Buffer_Release(vs_cb);
return; return;
} }
memset(cb_data, 0, sizeof(*cb_data)); memset(ps_cb_data, 0, sizeof(*ps_cb_data));
cb_data->colour_brush.type = D2D_BRUSH_TYPE_SOLID; ps_cb_data->colour_brush.type = D2D_BRUSH_TYPE_SOLID;
cb_data->colour_brush.opacity = 1.0f; ps_cb_data->colour_brush.opacity = 1.0f;
cb_data->opacity_brush.type = D2D_BRUSH_TYPE_COUNT; ps_cb_data->opacity_brush.type = D2D_BRUSH_TYPE_COUNT;
c = &cb_data->colour_brush.u.solid.colour; c = &ps_cb_data->colour_brush.u.solid.colour;
if (colour) if (colour)
*c = *colour; *c = *colour;
if (render_target->desc.pixelFormat.alphaMode == D2D1_ALPHA_MODE_IGNORE) if (render_target->desc.pixelFormat.alphaMode == D2D1_ALPHA_MODE_IGNORE)
...@@ -1708,9 +1657,7 @@ static void STDMETHODCALLTYPE d2d_device_context_Clear(ID2D1DeviceContext *iface ...@@ -1708,9 +1657,7 @@ static void STDMETHODCALLTYPE d2d_device_context_Clear(ID2D1DeviceContext *iface
ID3D10Buffer_Unmap(render_target->ps_cb); ID3D10Buffer_Unmap(render_target->ps_cb);
d2d_device_context_draw(render_target, D2D_SHAPE_TYPE_TRIANGLE, render_target->ib, 6, d2d_device_context_draw(render_target, D2D_SHAPE_TYPE_TRIANGLE, render_target->ib, 6,
render_target->vb, render_target->vb_stride, vs_cb, NULL, NULL); render_target->vb, render_target->vb_stride, NULL, NULL);
ID3D10Buffer_Release(vs_cb);
} }
static void STDMETHODCALLTYPE d2d_device_context_BeginDraw(ID2D1DeviceContext *iface) static void STDMETHODCALLTYPE d2d_device_context_BeginDraw(ID2D1DeviceContext *iface)
...@@ -3935,6 +3882,19 @@ static HRESULT d2d_device_context_init(struct d2d_device_context *render_target, ...@@ -3935,6 +3882,19 @@ static HRESULT d2d_device_context_init(struct d2d_device_context *render_target,
} }
buffer_desc.ByteWidth = sizeof(struct d2d_vs_cb);
buffer_desc.Usage = D3D10_USAGE_DYNAMIC;
buffer_desc.BindFlags = D3D10_BIND_CONSTANT_BUFFER;
buffer_desc.CPUAccessFlags = D3D10_CPU_ACCESS_WRITE;
buffer_desc.MiscFlags = 0;
if (FAILED(hr = ID3D10Device_CreateBuffer(render_target->d3d_device, &buffer_desc, NULL,
&render_target->vs_cb)))
{
WARN("Failed to create constant buffer, hr %#x.\n", hr);
goto err;
}
if (FAILED(hr = ID3D10Device_CreatePixelShader(render_target->d3d_device, if (FAILED(hr = ID3D10Device_CreatePixelShader(render_target->d3d_device,
ps_code, sizeof(ps_code), &render_target->ps))) ps_code, sizeof(ps_code), &render_target->ps)))
{ {
...@@ -4042,6 +4002,8 @@ err: ...@@ -4042,6 +4002,8 @@ err:
ID3D10Buffer_Release(render_target->ps_cb); ID3D10Buffer_Release(render_target->ps_cb);
if (render_target->ps) if (render_target->ps)
ID3D10PixelShader_Release(render_target->ps); ID3D10PixelShader_Release(render_target->ps);
if (render_target->vs_cb)
ID3D10Buffer_Release(render_target->vs_cb);
for (i = 0; i < D2D_SHAPE_TYPE_COUNT; ++i) for (i = 0; i < D2D_SHAPE_TYPE_COUNT; ++i)
{ {
if (render_target->shape_resources[i].vs) if (render_target->shape_resources[i].vs)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment