From: Marek Olšák <marek.ol...@amd.com>

---
 src/gallium/drivers/radeonsi/si_blit.c  | 9 +++++++++
 src/gallium/drivers/radeonsi/si_pipe.h  | 7 ++++---
 src/gallium/drivers/radeonsi/si_state.c | 3 ++-
 3 files changed, 15 insertions(+), 4 deletions(-)

diff --git a/src/gallium/drivers/radeonsi/si_blit.c 
b/src/gallium/drivers/radeonsi/si_blit.c
index 8846712..86a1553 100644
--- a/src/gallium/drivers/radeonsi/si_blit.c
+++ b/src/gallium/drivers/radeonsi/si_blit.c
@@ -719,20 +719,23 @@ static void si_clear(struct pipe_context *ctx, unsigned 
buffers,
                        if (!(buffers & (PIPE_CLEAR_COLOR0 << i)))
                                continue;
 
                        if (!fb->cbufs[i])
                                continue;
 
                        tex = (struct r600_texture *)fb->cbufs[i]->texture;
                        if (tex->fmask.size == 0)
                                tex->dirty_level_mask &= ~(1 << 
fb->cbufs[i]->u.tex.level);
                }
+
+               /* si_bind_blend_state will take care of necessary re-emitting. 
*/
+               sctx->framebuffer.slow_clear_srgb_enable = srgb_enable;
        }
 
        if (zstex && zstex->htile_offset &&
            zsbuf->u.tex.level == 0 &&
            zsbuf->u.tex.first_layer == 0 &&
            zsbuf->u.tex.last_layer == util_max_layer(&zstex->resource.b.b, 0)) 
{
                /* TC-compatible HTILE only supports depth clears to 0 or 1. */
                if (buffers & PIPE_CLEAR_DEPTH &&
                    (!zstex->tc_compatible_htile ||
                     depth == 0 || depth == 1)) {
@@ -780,20 +783,26 @@ static void si_clear(struct pipe_context *ctx, unsigned 
buffers,
                zstex->depth_cleared = true;
                si_mark_atom_dirty(sctx, &sctx->db_render_state);
        }
 
        if (sctx->db_stencil_clear) {
                sctx->db_stencil_clear = false;
                sctx->db_stencil_disable_expclear = false;
                zstex->stencil_cleared = true;
                si_mark_atom_dirty(sctx, &sctx->db_render_state);
        }
+
+       if (buffers & PIPE_CLEAR_COLOR && srgb_enable) {
+               sctx->framebuffer.slow_clear_srgb_enable = 0;
+               /* This should be dirty after restoring the blend state. */
+               assert(si_is_atom_dirty(sctx, &sctx->framebuffer.atom));
+       }
 }
 
 static void si_clear_render_target(struct pipe_context *ctx,
                                   struct pipe_surface *dst,
                                   const union pipe_color_union *color,
                                   unsigned dstx, unsigned dsty,
                                   unsigned width, unsigned height,
                                   bool render_condition_enabled)
 {
        struct si_context *sctx = (struct si_context *)ctx;
diff --git a/src/gallium/drivers/radeonsi/si_pipe.h 
b/src/gallium/drivers/radeonsi/si_pipe.h
index eef05cf..8f79d7b 100644
--- a/src/gallium/drivers/radeonsi/si_pipe.h
+++ b/src/gallium/drivers/radeonsi/si_pipe.h
@@ -170,23 +170,24 @@ struct si_framebuffer {
        unsigned                        spi_shader_col_format;
        unsigned                        spi_shader_col_format_alpha;
        unsigned                        spi_shader_col_format_blend;
        unsigned                        spi_shader_col_format_blend_alpha;
        ubyte                           nr_samples:5; /* at most 16xAA */
        ubyte                           log_samples:3; /* at most 4 = 16xAA */
        ubyte                           compressed_cb_mask;
        ubyte                           color_is_int8;
        ubyte                           color_is_int10;
        ubyte                           dirty_cbufs;
-       bool                            dirty_zsbuf;
-       bool                            any_dst_linear;
-       bool                            do_update_surf_dirtiness;
+       ubyte                           slow_clear_srgb_enable;
+       bool                            dirty_zsbuf:1;
+       bool                            any_dst_linear:1;
+       bool                            do_update_surf_dirtiness:1;
 };
 
 struct si_clip_state {
        struct r600_atom                atom;
        struct pipe_clip_state          state;
 };
 
 struct si_sample_locs {
        struct r600_atom        atom;
        unsigned                nr_samples;
diff --git a/src/gallium/drivers/radeonsi/si_state.c 
b/src/gallium/drivers/radeonsi/si_state.c
index 4c81c9a..0abcd5e 100644
--- a/src/gallium/drivers/radeonsi/si_state.c
+++ b/src/gallium/drivers/radeonsi/si_state.c
@@ -2671,21 +2671,22 @@ static void si_set_framebuffer_state(struct 
pipe_context *ctx,
                sctx->framebuffer.do_update_surf_dirtiness = true;
        }
 }
 
 static void si_emit_framebuffer_state(struct si_context *sctx, struct 
r600_atom *atom)
 {
        struct radeon_winsys_cs *cs = sctx->b.gfx.cs;
        struct pipe_framebuffer_state *state = &sctx->framebuffer.state;
        unsigned i, nr_cbufs = state->nr_cbufs;
        struct si_state_blend *blend = sctx->queued.named.blend;
-       ubyte srgb_enable = blend ? blend->srgb_enable : 0;
+       ubyte srgb_enable = (blend ? blend->srgb_enable : 0) |
+                           sctx->framebuffer.slow_clear_srgb_enable;
        struct r600_texture *tex = NULL;
        struct r600_surface *cb = NULL;
        unsigned cb_color_info = 0;
 
        /* Colorbuffers. */
        for (i = 0; i < nr_cbufs; i++) {
                uint64_t cb_color_base, cb_color_fmask, cb_dcc_base;
                unsigned cb_color_attrib;
 
                if (!(sctx->framebuffer.dirty_cbufs & (1 << i)))
-- 
2.7.4

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to