[Mesa-dev] [PATCH 27/42] st/mesa: stop making use of InterpQualifier array
Timothy Arceri
timothy.arceri at collabora.com
Wed Oct 19 23:09:44 UTC 2016
A following patch is going to merge the gl_fragment_program struct into
a common gl_program and we want to avoid all stages having this array.
V2: use TGSI_INTERPOLATE_COUNT as the temporary placeholder. Suggested by
Marek.
---
src/mesa/state_tracker/st_glsl_to_tgsi.cpp | 33 +++++++++++++++++++++++-
src/mesa/state_tracker/st_program.c | 40 ++++++++----------------------
2 files changed, 42 insertions(+), 31 deletions(-)
diff --git a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
index 61a461d..3c81095 100644
--- a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
+++ b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
@@ -337,6 +337,7 @@ struct inout_decl {
unsigned mesa_index;
unsigned array_id; /* TGSI ArrayID; 1-based: 0 means not an array */
unsigned size;
+ enum glsl_interp_mode interp;
enum glsl_base_type base_type;
ubyte usage_mask; /* GLSL-style usage-mask, i.e. single bit per double */
};
@@ -2419,6 +2420,7 @@ glsl_to_tgsi_visitor::visit(ir_dereference_variable *ir)
num_components = 4;
decl->mesa_index = var->data.location;
+ decl->interp = (glsl_interp_mode) var->data.interpolation;
decl->base_type = type_without_array->base_type;
decl->usage_mask = u_bit_consecutive(component, num_components);
@@ -5867,6 +5869,27 @@ emit_compute_block_size(const struct gl_program *prog,
prog->info.cs.local_size[2]);
}
+
+static unsigned
+st_translate_interp(enum glsl_interp_mode glsl_qual, GLuint varying)
+{
+ switch (glsl_qual) {
+ case INTERP_MODE_NONE:
+ if (varying == VARYING_SLOT_COL0 || varying == VARYING_SLOT_COL1)
+ return TGSI_INTERPOLATE_COLOR;
+ return TGSI_INTERPOLATE_PERSPECTIVE;
+ case INTERP_MODE_SMOOTH:
+ return TGSI_INTERPOLATE_PERSPECTIVE;
+ case INTERP_MODE_FLAT:
+ return TGSI_INTERPOLATE_CONSTANT;
+ case INTERP_MODE_NOPERSPECTIVE:
+ return TGSI_INTERPOLATE_LINEAR;
+ default:
+ assert(0 && "unexpected interp mode in st_translate_interp()");
+ return TGSI_INTERPOLATE_PERSPECTIVE;
+ }
+}
+
/**
* Translate intermediate IR (glsl_to_tgsi_instruction) to TGSI format.
* \param program the program to translate
@@ -5954,9 +5977,17 @@ st_translate_program(
tgsi_usage_mask = TGSI_WRITEMASK_XYZW;
}
+ unsigned interp_mode = 0;
+ if (procType == PIPE_SHADER_FRAGMENT) {
+ assert(interpMode);
+ interp_mode = interpMode[slot] != TGSI_INTERPOLATE_COUNT ?
+ interpMode[slot] :
+ st_translate_interp(decl->interp, inputSlotToAttr[slot]);
+ }
+
src = ureg_DECL_fs_input_cyl_centroid_layout(ureg,
inputSemanticName[slot], inputSemanticIndex[slot],
- interpMode ? interpMode[slot] : 0, 0, interpLocation ? interpLocation[slot] : 0,
+ interp_mode, 0, interpLocation ? interpLocation[slot] : 0,
slot, tgsi_usage_mask, decl->array_id, decl->size);
for (unsigned j = 0; j < decl->size; ++j) {
diff --git a/src/mesa/state_tracker/st_program.c b/src/mesa/state_tracker/st_program.c
index 55cf572..6ea4678 100644
--- a/src/mesa/state_tracker/st_program.c
+++ b/src/mesa/state_tracker/st_program.c
@@ -558,27 +558,6 @@ st_get_vp_variant(struct st_context *st,
}
-static unsigned
-st_translate_interp(enum glsl_interp_mode glsl_qual, bool is_color)
-{
- switch (glsl_qual) {
- case INTERP_MODE_NONE:
- if (is_color)
- return TGSI_INTERPOLATE_COLOR;
- return TGSI_INTERPOLATE_PERSPECTIVE;
- case INTERP_MODE_SMOOTH:
- return TGSI_INTERPOLATE_PERSPECTIVE;
- case INTERP_MODE_FLAT:
- return TGSI_INTERPOLATE_CONSTANT;
- case INTERP_MODE_NOPERSPECTIVE:
- return TGSI_INTERPOLATE_LINEAR;
- default:
- assert(0 && "unexpected interp mode in st_translate_interp()");
- return TGSI_INTERPOLATE_PERSPECTIVE;
- }
-}
-
-
/**
* Translate a Mesa fragment shader into a TGSI shader.
*/
@@ -660,14 +639,14 @@ st_translate_fragment_program(struct st_context *st,
case VARYING_SLOT_COL0:
input_semantic_name[slot] = TGSI_SEMANTIC_COLOR;
input_semantic_index[slot] = 0;
- interpMode[slot] = st_translate_interp(stfp->Base.InterpQualifier[attr],
- TRUE);
+ interpMode[slot] = stfp->glsl_to_tgsi ?
+ TGSI_INTERPOLATE_COUNT : TGSI_INTERPOLATE_COLOR;
break;
case VARYING_SLOT_COL1:
input_semantic_name[slot] = TGSI_SEMANTIC_COLOR;
input_semantic_index[slot] = 1;
- interpMode[slot] = st_translate_interp(stfp->Base.InterpQualifier[attr],
- TRUE);
+ interpMode[slot] = stfp->glsl_to_tgsi ?
+ TGSI_INTERPOLATE_COUNT : TGSI_INTERPOLATE_COLOR;
break;
case VARYING_SLOT_FOGC:
input_semantic_name[slot] = TGSI_SEMANTIC_FOG;
@@ -743,8 +722,8 @@ st_translate_fragment_program(struct st_context *st,
if (st->needs_texcoord_semantic) {
input_semantic_name[slot] = TGSI_SEMANTIC_TEXCOORD;
input_semantic_index[slot] = attr - VARYING_SLOT_TEX0;
- interpMode[slot] =
- st_translate_interp(stfp->Base.InterpQualifier[attr], FALSE);
+ interpMode[slot] = stfp->glsl_to_tgsi ?
+ TGSI_INTERPOLATE_COUNT : TGSI_INTERPOLATE_PERSPECTIVE;
break;
}
/* fall through */
@@ -766,9 +745,10 @@ st_translate_fragment_program(struct st_context *st,
input_semantic_index[slot] = st_get_generic_varying_index(st, attr);
if (attr == VARYING_SLOT_PNTC)
interpMode[slot] = TGSI_INTERPOLATE_LINEAR;
- else
- interpMode[slot] = st_translate_interp(stfp->Base.InterpQualifier[attr],
- FALSE);
+ else {
+ interpMode[slot] = stfp->glsl_to_tgsi ?
+ TGSI_INTERPOLATE_COUNT : TGSI_INTERPOLATE_PERSPECTIVE;
+ }
break;
}
}
--
2.7.4
More information about the mesa-dev
mailing list