[Mesa-dev] [PATCH 01/12] r600g: implement fast MSAA color clear for integer textures
Alex Deucher
alexdeucher at gmail.com
Tue Jul 2 06:33:52 PDT 2013
On Sun, Jun 30, 2013 at 9:53 PM, Marek Olšák <maraeo at gmail.com> wrote:
> this also fixes the fast clear with multiple colorbuffers and each having
> a different format
Series is:
Reviewed-by: Alex Deucher <alexander.deucher at amd.com>
> ---
> src/gallium/drivers/r600/r600_blit.c | 21 ++++++++++++---------
> 1 file changed, 12 insertions(+), 9 deletions(-)
>
> diff --git a/src/gallium/drivers/r600/r600_blit.c b/src/gallium/drivers/r600/r600_blit.c
> index 1cdd1c8..3b8a28b 100644
> --- a/src/gallium/drivers/r600/r600_blit.c
> +++ b/src/gallium/drivers/r600/r600_blit.c
> @@ -416,17 +416,22 @@ static boolean is_simple_msaa_resolve(const struct pipe_blit_info *info)
> static void r600_clear_buffer(struct pipe_context *ctx, struct pipe_resource *dst,
> unsigned offset, unsigned size, unsigned char value);
>
> -static void evergreen_set_clear_color(struct pipe_context *ctx,
> - struct pipe_surface *cbuf,
> +static void evergreen_set_clear_color(struct pipe_surface *cbuf,
> const union pipe_color_union *color)
> {
> - struct r600_context *rctx = (struct r600_context *)ctx;
> - struct pipe_framebuffer_state *fb = &rctx->framebuffer.state;
> unsigned *clear_value = ((struct r600_texture *)cbuf->texture)->color_clear_value;
> union util_color uc;
>
> memset(&uc, 0, sizeof(uc));
> - util_pack_color(color->f, fb->cbufs[0]->format, &uc);
> +
> + if (util_format_is_pure_uint(cbuf->format)) {
> + util_format_write_4ui(cbuf->format, color->ui, 0, &uc, 0, 0, 0, 1, 1);
> + } else if (util_format_is_pure_sint(cbuf->format)) {
> + util_format_write_4i(cbuf->format, color->i, 0, &uc, 0, 0, 0, 1, 1);
> + } else {
> + util_pack_color(color->f, cbuf->format, &uc);
> + }
> +
> memcpy(clear_value, &uc, 2 * sizeof(uint32_t));
> }
>
> @@ -448,10 +453,8 @@ static bool can_fast_clear_color(struct pipe_context *ctx)
> return false;
> }
>
> - /* cannot pack color for pure integer formats */
> /* 128-bit formats are unuspported */
> - if (util_format_is_pure_integer(fb->cbufs[i]->format) ||
> - util_format_get_blocksizebits(fb->cbufs[i]->format) > 64) {
> + if (util_format_get_blocksizebits(fb->cbufs[i]->format) > 64) {
> return false;
> }
>
> @@ -479,7 +482,7 @@ static void r600_clear(struct pipe_context *ctx, unsigned buffers,
> for (i = 0; i < fb->nr_cbufs; i++) {
> struct r600_texture *tex = (struct r600_texture *)fb->cbufs[i]->texture;
>
> - evergreen_set_clear_color(ctx, fb->cbufs[i], color);
> + evergreen_set_clear_color(fb->cbufs[i], color);
> r600_clear_buffer(ctx, fb->cbufs[i]->texture,
> tex->cmask_offset, tex->cmask_size, 0);
> tex->dirty_level_mask |= 1 << fb->cbufs[i]->u.tex.level;
> --
> 1.8.1.2
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev
More information about the mesa-dev
mailing list