Signed-off-by: Ilia Mirkin <imir...@alum.mit.edu> --- Not sure if this is the right approach or if I should combine it with Centroid more directly. More modifications will be required wrt per-sample shading since we'll need to distinguish the min samples case where everything is per-sample-interpolated vs this case where only some inputs are to be sample-interpolated but the min samples would still be > 1. (Perhaps that case should be handled by instead manually annotating each input as per-sample-interpolated and sticking the overall per-sample-shading into a variant key. This is roughly what i965 does.)
But I thought I'd send this out to get some early feedback. src/gallium/auxiliary/tgsi/tgsi_dump.c | 4 ++++ src/gallium/auxiliary/tgsi/tgsi_ureg.c | 12 +++++++++--- src/gallium/auxiliary/tgsi/tgsi_ureg.h | 7 ++++--- src/gallium/include/pipe/p_shader_tokens.h | 3 ++- src/mesa/state_tracker/st_glsl_to_tgsi.cpp | 6 +++++- src/mesa/state_tracker/st_glsl_to_tgsi.h | 1 + src/mesa/state_tracker/st_program.c | 5 +++++ 7 files changed, 30 insertions(+), 8 deletions(-) diff --git a/src/gallium/auxiliary/tgsi/tgsi_dump.c b/src/gallium/auxiliary/tgsi/tgsi_dump.c index 8e09bac..cce7858 100644 --- a/src/gallium/auxiliary/tgsi/tgsi_dump.c +++ b/src/gallium/auxiliary/tgsi/tgsi_dump.c @@ -353,6 +353,10 @@ iter_declaration( TXT( ", CENTROID" ); } + if (decl->Interp.Sample) { + TXT( ", SAMPLE" ); + } + if (decl->Interp.CylindricalWrap) { TXT(", CYLWRAP_"); if (decl->Interp.CylindricalWrap & TGSI_CYLINDRICAL_WRAP_X) { diff --git a/src/gallium/auxiliary/tgsi/tgsi_ureg.c b/src/gallium/auxiliary/tgsi/tgsi_ureg.c index bd0a3f7..b21339e 100644 --- a/src/gallium/auxiliary/tgsi/tgsi_ureg.c +++ b/src/gallium/auxiliary/tgsi/tgsi_ureg.c @@ -104,6 +104,7 @@ struct ureg_program unsigned interp; unsigned char cylindrical_wrap; unsigned char centroid; + unsigned char sample; } fs_input[UREG_MAX_INPUT]; unsigned nr_fs_inputs; @@ -345,7 +346,8 @@ ureg_DECL_fs_input_cyl_centroid(struct ureg_program *ureg, unsigned semantic_index, unsigned interp_mode, unsigned cylindrical_wrap, - unsigned centroid) + unsigned centroid, + unsigned sample) { unsigned i; @@ -362,6 +364,7 @@ ureg_DECL_fs_input_cyl_centroid(struct ureg_program *ureg, ureg->fs_input[i].interp = interp_mode; ureg->fs_input[i].cylindrical_wrap = cylindrical_wrap; ureg->fs_input[i].centroid = centroid; + ureg->fs_input[i].sample = sample; ureg->nr_fs_inputs++; } else { set_bad(ureg); @@ -1288,7 +1291,8 @@ emit_decl_fs(struct ureg_program *ureg, unsigned semantic_index, unsigned interpolate, unsigned cylindrical_wrap, - unsigned centroid) + unsigned centroid, + unsigned sample) { union tgsi_any_token *out = get_tokens(ureg, DOMAIN_DECL, 4); @@ -1308,6 +1312,7 @@ emit_decl_fs(struct ureg_program *ureg, out[2].decl_interp.Interpolate = interpolate; out[2].decl_interp.CylindricalWrap = cylindrical_wrap; out[2].decl_interp.Centroid = centroid; + out[2].decl_interp.Sample = sample; out[3].value = 0; out[3].decl_semantic.Name = semantic_name; @@ -1539,7 +1544,8 @@ static void emit_decls( struct ureg_program *ureg ) ureg->fs_input[i].semantic_index, ureg->fs_input[i].interp, ureg->fs_input[i].cylindrical_wrap, - ureg->fs_input[i].centroid); + ureg->fs_input[i].centroid, + ureg->fs_input[i].sample); } } else { for (i = 0; i < ureg->nr_gs_inputs; i++) { diff --git a/src/gallium/auxiliary/tgsi/tgsi_ureg.h b/src/gallium/auxiliary/tgsi/tgsi_ureg.h index 28edea6..d1f37e0 100644 --- a/src/gallium/auxiliary/tgsi/tgsi_ureg.h +++ b/src/gallium/auxiliary/tgsi/tgsi_ureg.h @@ -199,7 +199,8 @@ ureg_DECL_fs_input_cyl_centroid(struct ureg_program *, unsigned semantic_index, unsigned interp_mode, unsigned cylindrical_wrap, - unsigned centroid); + unsigned centroid, + unsigned sample); static INLINE struct ureg_src ureg_DECL_fs_input_cyl(struct ureg_program *ureg, @@ -213,7 +214,7 @@ ureg_DECL_fs_input_cyl(struct ureg_program *ureg, semantic_index, interp_mode, cylindrical_wrap, - 0); + 0, 0); } static INLINE struct ureg_src @@ -226,7 +227,7 @@ ureg_DECL_fs_input(struct ureg_program *ureg, semantic_name, semantic_index, interp_mode, - 0, 0); + 0, 0, 0); } struct ureg_src diff --git a/src/gallium/include/pipe/p_shader_tokens.h b/src/gallium/include/pipe/p_shader_tokens.h index 9261b79..bb3320c 100644 --- a/src/gallium/include/pipe/p_shader_tokens.h +++ b/src/gallium/include/pipe/p_shader_tokens.h @@ -139,8 +139,9 @@ struct tgsi_declaration_interp { unsigned Interpolate : 4; /**< one of TGSI_INTERPOLATE_x */ unsigned Centroid : 1; /**< centroid sampling? */ + unsigned Sample : 1; /**< per-sample interpolation? */ unsigned CylindricalWrap:4; /**< TGSI_CYLINDRICAL_WRAP_x flags */ - unsigned Padding : 23; + unsigned Padding : 22; }; #define TGSI_SEMANTIC_POSITION 0 diff --git a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp index 9e19431..1174a69 100644 --- a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp +++ b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp @@ -4848,6 +4848,8 @@ emit_edgeflags(struct st_translate *t) * \param inputSemanticIndex the semantic index (ex: which texcoord) for * each input * \param interpMode the TGSI_INTERPOLATE_LINEAR/PERSP mode for each input + * \param is_centroid whether the input should have centroid interpolation + * \param is_sample whether the input should have sample interpolation * \param numOutputs number of output registers used * \param outputMapping maps Mesa fragment program outputs to TGSI * generic outputs @@ -4870,6 +4872,7 @@ st_translate_program( const ubyte inputSemanticIndex[], const GLuint interpMode[], const GLboolean is_centroid[], + const GLboolean is_sample[], GLuint numOutputs, const GLuint outputMapping[], const ubyte outputSemanticName[], @@ -4915,7 +4918,8 @@ st_translate_program( inputSemanticName[i], inputSemanticIndex[i], interpMode[i], 0, - is_centroid[i]); + is_centroid[i], + is_sample[i]); } if (proginfo->InputsRead & VARYING_BIT_POS) { diff --git a/src/mesa/state_tracker/st_glsl_to_tgsi.h b/src/mesa/state_tracker/st_glsl_to_tgsi.h index a3fe91f..ff93d0b 100644 --- a/src/mesa/state_tracker/st_glsl_to_tgsi.h +++ b/src/mesa/state_tracker/st_glsl_to_tgsi.h @@ -46,6 +46,7 @@ enum pipe_error st_translate_program( const ubyte inputSemanticIndex[], const GLuint interpMode[], const GLboolean is_centroid[], + const GLboolean is_sample[], GLuint numOutputs, const GLuint outputMapping[], const ubyte outputSemanticName[], diff --git a/src/mesa/state_tracker/st_program.c b/src/mesa/state_tracker/st_program.c index 1df411c..e2b54d2 100644 --- a/src/mesa/state_tracker/st_program.c +++ b/src/mesa/state_tracker/st_program.c @@ -348,6 +348,7 @@ st_translate_vertex_program(struct st_context *st, NULL, /* input semantic index */ NULL, /* interp mode */ NULL, /* is centroid */ + NULL, /* is sample */ /* outputs */ num_outputs, stvp->result_to_output, @@ -486,6 +487,7 @@ st_translate_fragment_program(struct st_context *st, ubyte input_semantic_name[PIPE_MAX_SHADER_INPUTS]; ubyte input_semantic_index[PIPE_MAX_SHADER_INPUTS]; GLboolean is_centroid[PIPE_MAX_SHADER_INPUTS]; + GLboolean is_sample[PIPE_MAX_SHADER_INPUTS]; uint fs_num_inputs = 0; ubyte fs_output_semantic_name[PIPE_MAX_SHADER_OUTPUTS]; @@ -538,6 +540,7 @@ st_translate_fragment_program(struct st_context *st, inputMapping[attr] = slot; is_centroid[slot] = (stfp->Base.IsCentroid & BITFIELD64_BIT(attr)) != 0; + is_sample[slot] = (stfp->Base.IsSample & BITFIELD64_BIT(attr)) != 0; switch (attr) { case VARYING_SLOT_POS: @@ -765,6 +768,7 @@ st_translate_fragment_program(struct st_context *st, input_semantic_index, interpMode, is_centroid, + is_sample, /* outputs */ fs_num_outputs, outputMapping, @@ -1125,6 +1129,7 @@ st_translate_geometry_program(struct st_context *st, stgp->input_semantic_index, NULL, NULL, + NULL, /* outputs */ gs_num_outputs, outputMapping, -- 1.8.5.5 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev