Commit 122643b6 authored by Stefan Dösinger's avatar Stefan Dösinger Committed by Alexandre Julliard

wined3d: Move clear box clipping to cpu_blitter_clear.

parent 2a88b420
...@@ -1276,17 +1276,9 @@ static void surface_cpu_blt_colour_fill(struct wined3d_rendertarget_view *view, ...@@ -1276,17 +1276,9 @@ static void surface_cpu_blt_colour_fill(struct wined3d_rendertarget_view *view,
c = wined3d_format_convert_from_float(view->format, colour); c = wined3d_format_convert_from_float(view->format, colour);
bpp = view->format->byte_count; bpp = view->format->byte_count;
w = min(box->right, view->width) - min(box->left, view->width); w = box->right - box->left;
h = min(box->bottom, view->height) - min(box->top, view->height); h = box->bottom - box->top;
if (view->resource->type != WINED3D_RTYPE_TEXTURE_3D) d = box->back - box->front;
{
d = 1;
}
else
{
d = wined3d_texture_get_level_depth(texture, level);
d = min(box->back, d) - min(box->front, d);
}
map_binding = texture->resource.map_binding; map_binding = texture->resource.map_binding;
if (!wined3d_texture_load_location(texture, view->sub_resource_idx, context, map_binding)) if (!wined3d_texture_load_location(texture, view->sub_resource_idx, context, map_binding))
...@@ -1361,13 +1353,22 @@ static void surface_cpu_blt_colour_fill(struct wined3d_rendertarget_view *view, ...@@ -1361,13 +1353,22 @@ static void surface_cpu_blt_colour_fill(struct wined3d_rendertarget_view *view,
context_release(context); context_release(context);
} }
static bool wined3d_box_intersect(struct wined3d_box *ret, const struct wined3d_box *b1,
const struct wined3d_box *b2)
{
wined3d_box_set(ret, max(b1->left, b2->left), max(b1->top, b2->top),
min(b1->right, b2->right), min(b1->bottom, b2->bottom),
max(b1->front, b2->front), min(b1->back, b2->back));
return ret->right > ret->left && ret->bottom > ret->top && ret->back > ret->front;
}
static void cpu_blitter_clear(struct wined3d_blitter *blitter, struct wined3d_device *device, static void cpu_blitter_clear(struct wined3d_blitter *blitter, struct wined3d_device *device,
unsigned int rt_count, const struct wined3d_fb_state *fb, unsigned int rect_count, const RECT *clear_rects, unsigned int rt_count, const struct wined3d_fb_state *fb, unsigned int rect_count, const RECT *clear_rects,
const RECT *draw_rect, DWORD flags, const struct wined3d_color *colour, float depth, DWORD stencil) const RECT *draw_rect, DWORD flags, const struct wined3d_color *colour, float depth, DWORD stencil)
{ {
struct wined3d_color c = {depth, 0.0f, 0.0f, 0.0f}; struct wined3d_color c = {depth, 0.0f, 0.0f, 0.0f};
struct wined3d_box box, box_clip, box_view;
struct wined3d_rendertarget_view *view; struct wined3d_rendertarget_view *view;
struct wined3d_box box;
unsigned int i, j; unsigned int i, j;
if (!rect_count) if (!rect_count)
...@@ -1393,7 +1394,11 @@ static void cpu_blitter_clear(struct wined3d_blitter *blitter, struct wined3d_de ...@@ -1393,7 +1394,11 @@ static void cpu_blitter_clear(struct wined3d_blitter *blitter, struct wined3d_de
for (j = 0; j < rt_count; ++j) for (j = 0; j < rt_count; ++j)
{ {
if ((view = fb->render_targets[j])) if ((view = fb->render_targets[j]))
surface_cpu_blt_colour_fill(view, &box, colour); {
wined3d_rendertarget_view_get_box(view, &box_view);
if (wined3d_box_intersect(&box_clip, &box_view, &box))
surface_cpu_blt_colour_fill(view, &box_clip, colour);
}
} }
} }
...@@ -1403,7 +1408,9 @@ static void cpu_blitter_clear(struct wined3d_blitter *blitter, struct wined3d_de ...@@ -1403,7 +1408,9 @@ static void cpu_blitter_clear(struct wined3d_blitter *blitter, struct wined3d_de
|| (view->format->stencil_size && !(flags & WINED3DCLEAR_STENCIL))) || (view->format->stencil_size && !(flags & WINED3DCLEAR_STENCIL)))
FIXME("Clearing %#x on %s.\n", flags, debug_d3dformat(view->format->id)); FIXME("Clearing %#x on %s.\n", flags, debug_d3dformat(view->format->id));
surface_cpu_blt_colour_fill(view, &box, &c); wined3d_rendertarget_view_get_box(view, &box_view);
if (wined3d_box_intersect(&box_clip, &box_view, &box))
surface_cpu_blt_colour_fill(view, &box_clip, &c);
} }
} }
} }
......
...@@ -534,6 +534,20 @@ DWORD wined3d_rendertarget_view_get_locations(const struct wined3d_rendertarget_ ...@@ -534,6 +534,20 @@ DWORD wined3d_rendertarget_view_get_locations(const struct wined3d_rendertarget_
return ret; return ret;
} }
void wined3d_rendertarget_view_get_box(struct wined3d_rendertarget_view *view,
struct wined3d_box *box)
{
if (view->resource->type != WINED3D_RTYPE_TEXTURE_3D)
{
wined3d_box_set(box, 0, 0, view->width, view->height, 0, 1);
}
else
{
struct wined3d_texture *texture = texture_from_resource(view->resource);
wined3d_texture_get_level_box(texture, view->sub_resource_idx, box);
}
}
static void wined3d_render_target_view_gl_cs_init(void *object) static void wined3d_render_target_view_gl_cs_init(void *object)
{ {
struct wined3d_rendertarget_view_gl *view_gl = object; struct wined3d_rendertarget_view_gl *view_gl = object;
......
...@@ -5286,6 +5286,8 @@ struct wined3d_rendertarget_view ...@@ -5286,6 +5286,8 @@ struct wined3d_rendertarget_view
void wined3d_rendertarget_view_cleanup(struct wined3d_rendertarget_view *view) DECLSPEC_HIDDEN; void wined3d_rendertarget_view_cleanup(struct wined3d_rendertarget_view *view) DECLSPEC_HIDDEN;
void wined3d_rendertarget_view_get_drawable_size(const struct wined3d_rendertarget_view *view, void wined3d_rendertarget_view_get_drawable_size(const struct wined3d_rendertarget_view *view,
const struct wined3d_context *context, unsigned int *width, unsigned int *height) DECLSPEC_HIDDEN; const struct wined3d_context *context, unsigned int *width, unsigned int *height) DECLSPEC_HIDDEN;
void wined3d_rendertarget_view_get_box(struct wined3d_rendertarget_view *view,
struct wined3d_box *box) DECLSPEC_HIDDEN;
void wined3d_rendertarget_view_invalidate_location(struct wined3d_rendertarget_view *view, void wined3d_rendertarget_view_invalidate_location(struct wined3d_rendertarget_view *view,
DWORD location) DECLSPEC_HIDDEN; DWORD location) DECLSPEC_HIDDEN;
void wined3d_rendertarget_view_load_location(struct wined3d_rendertarget_view *view, void wined3d_rendertarget_view_load_location(struct wined3d_rendertarget_view *view,
......
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