[Mesa-dev] [PATCH] gallium: pass in per-sample interpolation qualifier
Roland Scheidegger
sroland at vmware.com
Wed Jul 2 10:04:35 PDT 2014
I don't have much of an idea how the interaction with per sample shading
should look like, but this looks alright to me.
Roland
Am 02.07.2014 03:55, schrieb Ilia Mirkin:
> Signed-off-by: Ilia Mirkin <imirkin at 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,
>
More information about the mesa-dev
mailing list