[Mesa-dev] [PATCH] gallium: pass in per-sample interpolation qualifier

Ilia Mirkin imirkin at alum.mit.edu
Tue Jul 1 18:55:59 PDT 2014


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,
-- 
1.8.5.5



More information about the mesa-dev mailing list