Henri Verbeet : wined3d: Send rendertarget view clears through the command stream.
Alexandre Julliard
julliard at winehq.org
Wed Apr 5 16:17:07 CDT 2017
Module: wine
Branch: master
Commit: 3e3f5e88e6aa27ce3838d0faed9de135532f10a4
URL: http://source.winehq.org/git/wine.git/?a=commit;h=3e3f5e88e6aa27ce3838d0faed9de135532f10a4
Author: Henri Verbeet <hverbeet at codeweavers.com>
Date: Wed Apr 5 10:21:25 2017 +0200
wined3d: Send rendertarget view clears through the command stream.
Signed-off-by: Henri Verbeet <hverbeet at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/wined3d/cs.c | 62 +++++++++++++++++++++++++++++++++++++-----
dlls/wined3d/device.c | 16 ++---------
dlls/wined3d/wined3d_private.h | 2 ++
3 files changed, 59 insertions(+), 21 deletions(-)
diff --git a/dlls/wined3d/cs.c b/dlls/wined3d/cs.c
index 841ceca..c408eb0 100644
--- a/dlls/wined3d/cs.c
+++ b/dlls/wined3d/cs.c
@@ -81,6 +81,9 @@ struct wined3d_cs_clear
{
enum wined3d_cs_op opcode;
DWORD flags;
+ unsigned int rt_count;
+ struct wined3d_fb_state *fb;
+ RECT draw_rect;
struct wined3d_color color;
float depth;
DWORD stencil;
@@ -420,24 +423,25 @@ static void wined3d_cs_exec_clear(struct wined3d_cs *cs, const void *data)
device = cs->device;
wined3d_get_draw_rect(state, &draw_rect);
- device->blitter->ops->blitter_clear(device->blitter, device, device->adapter->gl_info.limits.buffers,
- state->fb, op->rect_count, op->rects, &draw_rect, op->flags, &op->color, op->depth, op->stencil);
+ device->blitter->ops->blitter_clear(device->blitter, device, op->rt_count, op->fb,
+ op->rect_count, op->rects, &op->draw_rect, op->flags, &op->color, op->depth, op->stencil);
if (op->flags & WINED3DCLEAR_TARGET)
{
- for (i = 0; i < device->adapter->gl_info.limits.buffers; ++i)
+ for (i = 0; i < op->rt_count; ++i)
{
- if (state->fb->render_targets[i])
- wined3d_resource_release(state->fb->render_targets[i]->resource);
+ if (op->fb->render_targets[i])
+ wined3d_resource_release(op->fb->render_targets[i]->resource);
}
}
if (op->flags & (WINED3DCLEAR_ZBUFFER | WINED3DCLEAR_STENCIL))
- wined3d_resource_release(state->fb->depth_stencil->resource);
+ wined3d_resource_release(op->fb->depth_stencil->resource);
}
void wined3d_cs_emit_clear(struct wined3d_cs *cs, DWORD rect_count, const RECT *rects,
DWORD flags, const struct wined3d_color *color, float depth, DWORD stencil)
{
+ unsigned int rt_count = cs->device->adapter->gl_info.limits.buffers;
const struct wined3d_state *state = &cs->device->state;
struct wined3d_cs_clear *op;
unsigned int i;
@@ -445,6 +449,9 @@ void wined3d_cs_emit_clear(struct wined3d_cs *cs, DWORD rect_count, const RECT *
op = cs->ops->require_space(cs, FIELD_OFFSET(struct wined3d_cs_clear, rects[rect_count]));
op->opcode = WINED3D_CS_OP_CLEAR;
op->flags = flags;
+ op->rt_count = rt_count;
+ op->fb = &cs->fb;
+ wined3d_get_draw_rect(state, &op->draw_rect);
op->color = *color;
op->depth = depth;
op->stencil = stencil;
@@ -453,7 +460,7 @@ void wined3d_cs_emit_clear(struct wined3d_cs *cs, DWORD rect_count, const RECT *
if (flags & WINED3DCLEAR_TARGET)
{
- for (i = 0; i < cs->device->adapter->gl_info.limits.buffers; ++i)
+ for (i = 0; i < rt_count; ++i)
{
if (state->fb->render_targets[i])
wined3d_resource_acquire(state->fb->render_targets[i]->resource);
@@ -465,6 +472,47 @@ void wined3d_cs_emit_clear(struct wined3d_cs *cs, DWORD rect_count, const RECT *
cs->ops->submit(cs);
}
+void wined3d_cs_emit_clear_rendertarget_view(struct wined3d_cs *cs, struct wined3d_rendertarget_view *view,
+ const RECT *rect, DWORD flags, const struct wined3d_color *color, float depth, DWORD stencil)
+{
+ struct wined3d_cs_clear *op;
+ struct
+ {
+ struct wined3d_rendertarget_view *rt;
+ struct wined3d_fb_state fb;
+ } *extra;
+
+ op = cs->ops->require_space(cs, FIELD_OFFSET(struct wined3d_cs_clear, rects[1]) + sizeof(*extra));
+ extra = (void *)&op->rects[1];
+ extra->fb.render_targets = &extra->rt;
+ op->fb = &extra->fb;
+
+ op->opcode = WINED3D_CS_OP_CLEAR;
+ op->flags = flags;
+ if (flags & WINED3DCLEAR_TARGET)
+ {
+ op->rt_count = 1;
+ op->fb->render_targets[0] = view;
+ op->fb->depth_stencil = NULL;
+ op->color = *color;
+ }
+ else
+ {
+ op->rt_count = 0;
+ op->fb->render_targets[0] = NULL;
+ op->fb->depth_stencil = view;
+ op->depth = depth;
+ op->stencil = stencil;
+ }
+ SetRect(&op->draw_rect, 0, 0, view->width, view->height);
+ op->rect_count = 1;
+ op->rects[0] = *rect;
+
+ wined3d_resource_acquire(view->resource);
+
+ cs->ops->submit(cs);
+}
+
static void acquire_shader_resources(const struct wined3d_state *state, unsigned int shader_mask)
{
struct wined3d_shader_sampler_map_entry *entry;
diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c
index 11a56f2..ffc99b1 100644
--- a/dlls/wined3d/device.c
+++ b/dlls/wined3d/device.c
@@ -4148,7 +4148,7 @@ HRESULT CDECL wined3d_device_clear_rendertarget_view(struct wined3d_device *devi
const struct wined3d_color *color, float depth, DWORD stencil)
{
struct wined3d_resource *resource;
- RECT draw_rect, r;
+ RECT r;
TRACE("device %p, view %p, rect %s, flags %#x, color %s, depth %.8e, stencil %u.\n",
device, view, wine_dbgstr_rect(rect), flags, debug_color(color), depth, stencil);
@@ -4185,19 +4185,7 @@ HRESULT CDECL wined3d_device_clear_rendertarget_view(struct wined3d_device *devi
return hr;
}
- SetRect(&draw_rect, 0, 0, view->width, view->height);
- if (flags == WINED3DCLEAR_TARGET)
- {
- struct wined3d_fb_state fb = {&view, NULL};
- device->blitter->ops->blitter_clear(device->blitter, device, 1, &fb,
- 1, rect, &draw_rect, flags, color, depth, stencil);
- }
- else
- {
- struct wined3d_fb_state fb = {NULL, view};
- device->blitter->ops->blitter_clear(device->blitter, device, 0, &fb,
- 1, rect, &draw_rect, flags, color, depth, stencil);
- }
+ wined3d_cs_emit_clear_rendertarget_view(device->cs, view, rect, flags, color, depth, stencil);
return WINED3D_OK;
}
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index 4acb94f..82aecf7 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -3228,6 +3228,8 @@ void wined3d_cs_emit_blt_sub_resource(struct wined3d_cs *cs, struct wined3d_reso
const struct wined3d_blt_fx *fx, enum wined3d_texture_filter_type filter) DECLSPEC_HIDDEN;
void wined3d_cs_emit_clear(struct wined3d_cs *cs, DWORD rect_count, const RECT *rects,
DWORD flags, const struct wined3d_color *color, float depth, DWORD stencil) DECLSPEC_HIDDEN;
+void wined3d_cs_emit_clear_rendertarget_view(struct wined3d_cs *cs, struct wined3d_rendertarget_view *view,
+ const RECT *rect, DWORD flags, const struct wined3d_color *color, float depth, DWORD stencil) DECLSPEC_HIDDEN;
void wined3d_cs_emit_dispatch(struct wined3d_cs *cs,
unsigned int group_count_x, unsigned int group_count_y, unsigned int group_count_z) DECLSPEC_HIDDEN;
void wined3d_cs_emit_draw(struct wined3d_cs *cs, GLenum primitive_type, int base_vertex_idx,
More information about the wine-cvs
mailing list