summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp14
-rw-r--r--src/mesa/drivers/dri/i965/brw_vs.c9
-rw-r--r--src/mesa/drivers/dri/i965/brw_vs.h17
3 files changed, 26 insertions, 14 deletions
diff --git a/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp b/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp
index be5f8f2f99c..a176e8a15e7 100644
--- a/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp
+++ b/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp
@@ -815,13 +815,13 @@ vec4_visitor::visit(ir_variable *ir)
* come in as floating point conversions of the integer values.
*/
for (int i = ir->location; i < ir->location + type_size(ir->type); i++) {
- if (!c->key.gl_fixed_input_size[i])
- continue;
-
- dst_reg dst = *reg;
- dst.type = brw_type_for_base_type(ir->type);
- dst.writemask = (1 << c->key.gl_fixed_input_size[i]) - 1;
- emit(MUL(dst, src_reg(dst), src_reg(1.0f / 65536.0f)));
+ uint8_t wa_flags = c->key.gl_attrib_wa_flags[i];
+ if (wa_flags & BRW_ATTRIB_WA_COMPONENT_MASK) {
+ dst_reg dst = *reg;
+ dst.type = brw_type_for_base_type(ir->type);
+ dst.writemask = (1 << (wa_flags & BRW_ATTRIB_WA_COMPONENT_MASK)) - 1;
+ emit(MUL(dst, src_reg(dst), src_reg(1.0f / 65536.0f)));
+ }
}
break;
diff --git a/src/mesa/drivers/dri/i965/brw_vs.c b/src/mesa/drivers/dri/i965/brw_vs.c
index 446673133cf..f764f526f9c 100644
--- a/src/mesa/drivers/dri/i965/brw_vs.c
+++ b/src/mesa/drivers/dri/i965/brw_vs.c
@@ -362,9 +362,9 @@ brw_vs_debug_recompile(struct brw_context *brw,
}
for (unsigned int i = 0; i < VERT_ATTRIB_MAX; i++) {
- found |= key_debug("GL_FIXED rescaling",
- old_key->gl_fixed_input_size[i],
- key->gl_fixed_input_size[i]);
+ found |= key_debug("Vertex attrib w/a flags",
+ old_key->gl_attrib_wa_flags[i],
+ key->gl_attrib_wa_flags[i]);
}
found |= key_debug("user clip flags",
@@ -446,9 +446,10 @@ static void brw_upload_vs_prog(struct brw_context *brw)
/* BRW_NEW_VERTICES */
for (i = 0; i < VERT_ATTRIB_MAX; i++) {
+ /* TODO: flag w/a for packed vertex formats here too */
if (vp->program.Base.InputsRead & BITFIELD64_BIT(i) &&
brw->vb.inputs[i].glarray->Type == GL_FIXED) {
- key.gl_fixed_input_size[i] = brw->vb.inputs[i].glarray->Size;
+ key.gl_attrib_wa_flags[i] = brw->vb.inputs[i].glarray->Size;
}
}
diff --git a/src/mesa/drivers/dri/i965/brw_vs.h b/src/mesa/drivers/dri/i965/brw_vs.h
index 8edc92f16e9..279c18fab0b 100644
--- a/src/mesa/drivers/dri/i965/brw_vs.h
+++ b/src/mesa/drivers/dri/i965/brw_vs.h
@@ -39,13 +39,24 @@
#include "brw_program.h"
#include "program/program.h"
+/**
+ * The VF can't natively handle certain types of attributes, such as GL_FIXED
+ * or most 10_10_10_2 types. These flags enable various VS workarounds to
+ * "fix" attributes at the beginning of shaders.
+ */
+#define BRW_ATTRIB_WA_COMPONENT_MASK 7 /* mask for GL_FIXED scale channel count */
+#define BRW_ATTRIB_WA_NORMALIZE 8 /* normalize in shader */
+#define BRW_ATTRIB_WA_BGRA 16 /* swap r/b channels in shader */
+#define BRW_ATTRIB_WA_SIGN 32 /* interpret as signed in shader */
+#define BRW_ATTRIB_WA_SCALE 64 /* interpret as scaled in shader */
struct brw_vs_prog_key {
GLuint program_string_id;
- /**
- * Number of channels of the vertex attribute that need GL_FIXED rescaling
+
+ /*
+ * Per-attribute workaround flags
*/
- uint8_t gl_fixed_input_size[VERT_ATTRIB_MAX];
+ uint8_t gl_attrib_wa_flags[VERT_ATTRIB_MAX];
/**
* True if at least one clip flag is enabled, regardless of whether the