Module: Mesa Branch: master Commit: a664233042e1ad343184a0c237c3bd7ac5010779 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=a664233042e1ad343184a0c237c3bd7ac5010779
Author: Eric Anholt <e...@anholt.net> Date: Fri Nov 20 17:11:18 2015 -0800 vc4: Add support for loading sample mask. --- src/gallium/drivers/vc4/kernel/vc4_packet.h | 3 +++ src/gallium/drivers/vc4/vc4_context.c | 2 ++ src/gallium/drivers/vc4/vc4_program.c | 4 ++++ src/gallium/drivers/vc4/vc4_qir.h | 1 + src/gallium/drivers/vc4/vc4_state.c | 2 +- src/gallium/drivers/vc4/vc4_uniforms.c | 8 ++++++++ 6 files changed, 19 insertions(+), 1 deletion(-) diff --git a/src/gallium/drivers/vc4/kernel/vc4_packet.h b/src/gallium/drivers/vc4/kernel/vc4_packet.h index 771e2b7..9c12d33 100644 --- a/src/gallium/drivers/vc4/kernel/vc4_packet.h +++ b/src/gallium/drivers/vc4/kernel/vc4_packet.h @@ -121,6 +121,9 @@ enum vc4_packet { #define VC4_PACKET_TILE_COORDINATES_SIZE 3 #define VC4_PACKET_GEM_HANDLES_SIZE 9 +/* Number of multisamples supported. */ +#define VC4_MAX_SAMPLES 4 + #define VC4_MASK(high, low) (((1 << ((high) - (low) + 1)) - 1) << (low)) /* Using the GNU statement expression extension */ #define VC4_SET_FIELD(value, field) \ diff --git a/src/gallium/drivers/vc4/vc4_context.c b/src/gallium/drivers/vc4/vc4_context.c index d490fad..4f3e226 100644 --- a/src/gallium/drivers/vc4/vc4_context.c +++ b/src/gallium/drivers/vc4/vc4_context.c @@ -245,6 +245,8 @@ vc4_context_create(struct pipe_screen *pscreen, void *priv, unsigned flags) vc4_debug |= saved_shaderdb_flag; + vc4->sample_mask = (1 << VC4_MAX_SAMPLES) - 1; + return &vc4->base; fail: diff --git a/src/gallium/drivers/vc4/vc4_program.c b/src/gallium/drivers/vc4/vc4_program.c index 197577b..9c6e864 100644 --- a/src/gallium/drivers/vc4/vc4_program.c +++ b/src/gallium/drivers/vc4/vc4_program.c @@ -1462,6 +1462,10 @@ ntq_emit_intrinsic(struct vc4_compile *c, nir_intrinsic_instr *instr) instr->const_index[0]); break; + case nir_intrinsic_load_sample_mask_in: + *dest = qir_uniform(c, QUNIFORM_SAMPLE_MASK, 0); + break; + case nir_intrinsic_load_input: assert(instr->num_components == 1); if (instr->const_index[0] == VC4_NIR_TLB_COLOR_READ_INPUT) { diff --git a/src/gallium/drivers/vc4/vc4_qir.h b/src/gallium/drivers/vc4/vc4_qir.h index ddb35e4..ad243ec 100644 --- a/src/gallium/drivers/vc4/vc4_qir.h +++ b/src/gallium/drivers/vc4/vc4_qir.h @@ -247,6 +247,7 @@ enum quniform_contents { QUNIFORM_STENCIL, QUNIFORM_ALPHA_REF, + QUNIFORM_SAMPLE_MASK, }; struct vc4_varying_slot { diff --git a/src/gallium/drivers/vc4/vc4_state.c b/src/gallium/drivers/vc4/vc4_state.c index a234ce5..2a88188 100644 --- a/src/gallium/drivers/vc4/vc4_state.c +++ b/src/gallium/drivers/vc4/vc4_state.c @@ -79,7 +79,7 @@ static void vc4_set_sample_mask(struct pipe_context *pctx, unsigned sample_mask) { struct vc4_context *vc4 = vc4_context(pctx); - vc4->sample_mask = (uint16_t)sample_mask; + vc4->sample_mask = sample_mask & ((1 << VC4_MAX_SAMPLES) - 1); vc4->dirty |= VC4_DIRTY_SAMPLE_MASK; } diff --git a/src/gallium/drivers/vc4/vc4_uniforms.c b/src/gallium/drivers/vc4/vc4_uniforms.c index f5ad481..5dfdd73 100644 --- a/src/gallium/drivers/vc4/vc4_uniforms.c +++ b/src/gallium/drivers/vc4/vc4_uniforms.c @@ -303,6 +303,10 @@ vc4_write_uniforms(struct vc4_context *vc4, struct vc4_compiled_shader *shader, cl_aligned_f(&uniforms, vc4->zsa->base.alpha.ref_value); break; + + case QUNIFORM_SAMPLE_MASK: + cl_aligned_u32(&uniforms, vc4->sample_mask); + break; } #if 0 uint32_t written_val = *((uint32_t *)uniforms - 1); @@ -363,6 +367,10 @@ vc4_set_shader_uniform_dirty_flags(struct vc4_compiled_shader *shader) case QUNIFORM_ALPHA_REF: dirty |= VC4_DIRTY_ZSA; break; + + case QUNIFORM_SAMPLE_MASK: + dirty |= VC4_DIRTY_SAMPLE_MASK; + break; } } _______________________________________________ mesa-commit mailing list mesa-commit@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-commit