diff options
-rw-r--r-- | src/gallium/auxiliary/util/u_blitter.c | 43 | ||||
-rw-r--r-- | src/gallium/auxiliary/util/u_blitter.h | 11 | ||||
-rw-r--r-- | src/gallium/drivers/r300/r300_blit.c | 34 | ||||
-rw-r--r-- | src/gallium/drivers/r300/r300_blit.h | 12 | ||||
-rw-r--r-- | src/gallium/drivers/r300/r300_context.c | 2 |
5 files changed, 45 insertions, 57 deletions
diff --git a/src/gallium/auxiliary/util/u_blitter.c b/src/gallium/auxiliary/util/u_blitter.c index c2d1af372c..7c08ebc576 100644 --- a/src/gallium/auxiliary/util/u_blitter.c +++ b/src/gallium/auxiliary/util/u_blitter.c @@ -715,10 +715,8 @@ static void util_blitter_do_copy(struct blitter_context *blitter, blitter_set_rectangle(ctx, dstx, dsty, dstx+width, dsty+height, dst->width, dst->height, 0); blitter_draw_quad(ctx); - } - void util_blitter_copy(struct blitter_context *blitter, struct pipe_surface *dst, unsigned dstx, unsigned dsty, @@ -775,38 +773,41 @@ void util_blitter_copy(struct blitter_context *blitter, blitter_restore_CSOs(ctx); } -void util_blitter_fill(struct blitter_context *blitter, - struct pipe_surface *dst, - unsigned dstx, unsigned dsty, - unsigned width, unsigned height, - unsigned value) +/* Fill a region of a surface with a constant value. */ +void util_blitter_fill_region(struct blitter_context *blitter, + struct pipe_resource *dst, + struct pipe_subresource subdst, + unsigned dstx, unsigned dsty, unsigned dstz, + unsigned width, unsigned height, + unsigned value) { struct blitter_context_priv *ctx = (struct blitter_context_priv*)blitter; struct pipe_context *pipe = ctx->pipe; struct pipe_screen *screen = pipe->screen; + struct pipe_surface *dstsurf; struct pipe_framebuffer_state fb_state; float rgba[4]; ubyte ub_rgba[4] = {0}; union util_color color; int i; - assert(dst->texture); - if (!dst->texture) + assert(dst); + if (!dst) return; /* check if we can render to the surface */ if (util_format_is_depth_or_stencil(dst->format) || /* unlikely, but you never know */ - !screen->is_format_supported(screen, dst->format, dst->texture->target, - dst->texture->nr_samples, + !screen->is_format_supported(screen, dst->format, dst->target, + dst->nr_samples, PIPE_BIND_RENDER_TARGET, 0)) { - struct pipe_subresource subdst; - subdst.face = dst->face; - subdst.level = dst->level; - util_resource_fill_region(pipe, dst->texture, subdst, dstx, dsty, - dst->zslice, width, height, value); + util_resource_fill_region(pipe, dst, subdst, dstx, dsty, dstz, + width, height, value); return; } + dstsurf = screen->get_tex_surface(screen, dst, subdst.face, subdst.level, + dstz, PIPE_BIND_RENDER_TARGET); + /* unpack the color */ color.ui = value; util_unpack_color_ub(dst->format, &color, @@ -827,15 +828,17 @@ void util_blitter_fill(struct blitter_context *blitter, pipe->bind_vertex_elements_state(pipe, ctx->velem_state); /* set a framebuffer state */ - fb_state.width = dst->width; - fb_state.height = dst->height; + fb_state.width = dstsurf->width; + fb_state.height = dstsurf->height; fb_state.nr_cbufs = 1; - fb_state.cbufs[0] = dst; + fb_state.cbufs[0] = dstsurf; fb_state.zsbuf = 0; pipe->set_framebuffer_state(pipe, &fb_state); blitter_set_clear_color(ctx, rgba); - blitter_set_rectangle(ctx, 0, 0, width, height, dst->width, dst->height, 0); + blitter_set_rectangle(ctx, 0, 0, width, height, dstsurf->width, dstsurf->height, 0); blitter_draw_quad(ctx); blitter_restore_CSOs(ctx); + + pipe_surface_reference(&dstsurf, NULL); } diff --git a/src/gallium/auxiliary/util/u_blitter.h b/src/gallium/auxiliary/util/u_blitter.h index ab96ba2e73..fe4c3d483e 100644 --- a/src/gallium/auxiliary/util/u_blitter.h +++ b/src/gallium/auxiliary/util/u_blitter.h @@ -130,11 +130,12 @@ void util_blitter_copy(struct blitter_context *blitter, * already required to be saved: * - framebuffer state */ -void util_blitter_fill(struct blitter_context *blitter, - struct pipe_surface *dst, - unsigned dstx, unsigned dsty, - unsigned width, unsigned height, - unsigned value); +void util_blitter_fill_region(struct blitter_context *blitter, + struct pipe_resource *dst, + struct pipe_subresource subdst, + unsigned dstx, unsigned dsty, unsigned dstz, + unsigned width, unsigned height, + unsigned value); /* The functions below should be used to save currently bound constant state diff --git a/src/gallium/drivers/r300/r300_blit.c b/src/gallium/drivers/r300/r300_blit.c index 2bf9317803..5489d880b1 100644 --- a/src/gallium/drivers/r300/r300_blit.c +++ b/src/gallium/drivers/r300/r300_blit.c @@ -205,34 +205,18 @@ void r300_surface_copy(struct pipe_context* pipe, } /* Fill a region of a surface with a constant value. */ -void r300_surface_fill(struct pipe_context* pipe, - struct pipe_resource* dst, - struct pipe_subresource subdst, - unsigned dstx, unsigned dsty, unsigned dstz, - unsigned width, unsigned height, - unsigned value) +void r300_resource_fill_region(struct pipe_context *pipe, + struct pipe_resource *dst, + struct pipe_subresource subdst, + unsigned dstx, unsigned dsty, unsigned dstz, + unsigned width, unsigned height, + unsigned value) { - struct pipe_screen *screen = pipe->screen; - struct r300_context* r300 = r300_context(pipe); - struct pipe_surface *dstsurf; - unsigned bind; - - if (util_format_is_depth_or_stencil(dst->format)) - bind = PIPE_BIND_DEPTH_STENCIL; - else - bind = PIPE_BIND_RENDER_TARGET; - - dstsurf = screen->get_tex_surface(screen, dst, - subdst.face, - subdst.level, - dstz, - bind); + struct r300_context *r300 = r300_context(pipe); r300_blitter_save_states(r300); util_blitter_save_framebuffer(r300->blitter, r300->fb_state.state); - util_blitter_fill(r300->blitter, - dstsurf, dstx, dsty, width, height, value); - - pipe_surface_reference(&dstsurf, NULL); + util_blitter_fill_region(r300->blitter, dst, subdst, + dstx, dsty, dstz, width, height, value); } diff --git a/src/gallium/drivers/r300/r300_blit.h b/src/gallium/drivers/r300/r300_blit.h index c97872662a..6dfb453428 100644 --- a/src/gallium/drivers/r300/r300_blit.h +++ b/src/gallium/drivers/r300/r300_blit.h @@ -42,11 +42,11 @@ void r300_surface_copy(struct pipe_context* pipe, unsigned srcx, unsigned srcy, unsigned srcz, unsigned width, unsigned height); -void r300_surface_fill(struct pipe_context* pipe, - struct pipe_resource* dst, - struct pipe_subresource subdst, - unsigned dstx, unsigned dsty, unsigned dstz, - unsigned width, unsigned height, - unsigned value); +void r300_resource_fill_region(struct pipe_context* pipe, + struct pipe_resource* dst, + struct pipe_subresource subdst, + unsigned dstx, unsigned dsty, unsigned dstz, + unsigned width, unsigned height, + unsigned value); #endif /* R300_BLIT_H */ diff --git a/src/gallium/drivers/r300/r300_context.c b/src/gallium/drivers/r300/r300_context.c index f771e10c64..406b812f6a 100644 --- a/src/gallium/drivers/r300/r300_context.c +++ b/src/gallium/drivers/r300/r300_context.c @@ -187,7 +187,7 @@ struct pipe_context* r300_create_context(struct pipe_screen* screen, r300->context.clear = r300_clear; r300->context.resource_copy_region = r300_surface_copy; - r300->context.resource_fill_region = r300_surface_fill; + r300->context.resource_fill_region = r300_resource_fill_region; if (r300screen->caps.has_tcl) { r300->context.draw_arrays = r300_draw_arrays; |