summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/gallium/auxiliary/util/u_blitter.c43
-rw-r--r--src/gallium/auxiliary/util/u_blitter.h11
-rw-r--r--src/gallium/drivers/r300/r300_blit.c34
-rw-r--r--src/gallium/drivers/r300/r300_blit.h12
-rw-r--r--src/gallium/drivers/r300/r300_context.c2
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;