Module: Mesa
Branch: master
Commit: 501fee2511a0a84303319a5e3deacf4959da5b08
URL:    
http://cgit.freedesktop.org/mesa/mesa/commit/?id=501fee2511a0a84303319a5e3deacf4959da5b08

Author: Marek Olšák <[email protected]>
Date:   Tue May  6 13:48:11 2014 +0200

radeonsi: implement set_min_samples

This is how per-sample shading is enabled.

---

 src/gallium/drivers/radeonsi/si_pipe.c  |    3 +++
 src/gallium/drivers/radeonsi/si_pipe.h  |    4 ++++
 src/gallium/drivers/radeonsi/si_state.c |   30 ++++++++++++++++++++++++++++--
 src/gallium/drivers/radeonsi/si_state.h |    1 +
 4 files changed, 36 insertions(+), 2 deletions(-)

diff --git a/src/gallium/drivers/radeonsi/si_pipe.c 
b/src/gallium/drivers/radeonsi/si_pipe.c
index d374546..bd878fe 100644
--- a/src/gallium/drivers/radeonsi/si_pipe.c
+++ b/src/gallium/drivers/radeonsi/si_pipe.c
@@ -107,6 +107,9 @@ static struct pipe_context *si_create_context(struct 
pipe_screen *screen, void *
        sctx->cache_flush = si_atom_cache_flush;
        sctx->atoms.s.cache_flush = &sctx->cache_flush;
 
+       sctx->msaa_config = si_atom_msaa_config;
+       sctx->atoms.s.msaa_config = &sctx->msaa_config;
+
        sctx->atoms.s.streamout_begin = &sctx->b.streamout.begin_atom;
        sctx->atoms.s.streamout_enable = &sctx->b.streamout.enable_atom;
 
diff --git a/src/gallium/drivers/radeonsi/si_pipe.h 
b/src/gallium/drivers/radeonsi/si_pipe.h
index de42477..9d33a92 100644
--- a/src/gallium/drivers/radeonsi/si_pipe.h
+++ b/src/gallium/drivers/radeonsi/si_pipe.h
@@ -114,6 +114,7 @@ struct si_context {
                        struct r600_atom *streamout_begin;
                        struct r600_atom *streamout_enable; /* must be after 
streamout_begin */
                        struct r600_atom *framebuffer;
+                       struct r600_atom *msaa_config;
                } s;
                struct r600_atom *array[0];
        } atoms;
@@ -136,6 +137,9 @@ struct si_context {
        struct r600_resource            *border_color_table;
        unsigned                        border_color_offset;
 
+       struct r600_atom                msaa_config;
+       int                             ps_iter_samples;
+
        unsigned default_ps_gprs, default_vs_gprs;
 
        /* Below are variables from the old r600_context.
diff --git a/src/gallium/drivers/radeonsi/si_state.c 
b/src/gallium/drivers/radeonsi/si_state.c
index 769b5e6..c08d703 100644
--- a/src/gallium/drivers/radeonsi/si_state.c
+++ b/src/gallium/drivers/radeonsi/si_state.c
@@ -1921,8 +1921,9 @@ static void si_set_framebuffer_state(struct pipe_context 
*ctx,
        sctx->framebuffer.atom.num_dw = state->nr_cbufs*15 + (8 - 
state->nr_cbufs)*3;
        sctx->framebuffer.atom.num_dw += state->zsbuf ? 23 : 4;
        sctx->framebuffer.atom.num_dw += 3; /* WINDOW_SCISSOR_BR */
-       sctx->framebuffer.atom.num_dw += 28; /* MSAA */
+       sctx->framebuffer.atom.num_dw += 18; /* MSAA sample locations */
        sctx->framebuffer.atom.dirty = true;
+       sctx->msaa_config.dirty = true;
 }
 
 static void si_emit_framebuffer_state(struct si_context *sctx, struct 
r600_atom *atom)
@@ -2026,7 +2027,30 @@ static void si_emit_framebuffer_state(struct si_context 
*sctx, struct r600_atom
                               S_028208_BR_X(state->width) | 
S_028208_BR_Y(state->height));
 
        cayman_emit_msaa_sample_locs(cs, sctx->framebuffer.nr_samples);
-       cayman_emit_msaa_config(cs, sctx->framebuffer.nr_samples, 1);
+}
+
+static void si_emit_msaa_config(struct r600_common_context *rctx, struct 
r600_atom *atom)
+{
+       struct si_context *sctx = (struct si_context *)rctx;
+       struct radeon_winsys_cs *cs = sctx->b.rings.gfx.cs;
+
+       cayman_emit_msaa_config(cs, sctx->framebuffer.nr_samples,
+                               sctx->ps_iter_samples);
+}
+
+const struct r600_atom si_atom_msaa_config = { si_emit_msaa_config, 10 }; /* 
number of CS dwords */
+
+static void si_set_min_samples(struct pipe_context *ctx, unsigned min_samples)
+{
+       struct si_context *sctx = (struct si_context *)ctx;
+
+       if (sctx->ps_iter_samples == min_samples)
+               return;
+
+       sctx->ps_iter_samples = min_samples;
+
+       if (sctx->framebuffer.nr_samples > 1)
+               sctx->msaa_config.dirty = true;
 }
 
 /*
@@ -3025,6 +3049,8 @@ void si_init_state_functions(struct si_context *sctx)
 
        sctx->b.b.texture_barrier = si_texture_barrier;
        sctx->b.b.set_polygon_stipple = si_set_polygon_stipple;
+       sctx->b.b.set_min_samples = si_set_min_samples;
+
        sctx->b.dma_copy = si_dma_copy;
        sctx->b.set_occlusion_query_state = si_set_occlusion_query_state;
        sctx->b.need_gfx_cs_space = si_need_gfx_cs_space;
diff --git a/src/gallium/drivers/radeonsi/si_state.h 
b/src/gallium/drivers/radeonsi/si_state.h
index 4c5b09e..c051d73 100644
--- a/src/gallium/drivers/radeonsi/si_state.h
+++ b/src/gallium/drivers/radeonsi/si_state.h
@@ -239,6 +239,7 @@ unsigned si_tile_mode_index(struct r600_texture *rtex, 
unsigned level, bool sten
 
 /* si_state_draw.c */
 extern const struct r600_atom si_atom_cache_flush;
+extern const struct r600_atom si_atom_msaa_config;
 void si_emit_cache_flush(struct r600_common_context *sctx, struct r600_atom 
*atom);
 void si_draw_vbo(struct pipe_context *ctx, const struct pipe_draw_info *dinfo);
 

_______________________________________________
mesa-commit mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/mesa-commit

Reply via email to