[Mesa-dev] [PATCH 09/14] i965: Merge resolving of register size between fs and vec4
Topi Pohjolainen
topi.pohjolainen at intel.com
Wed May 28 05:36:05 PDT 2014
Signed-off-by: Topi Pohjolainen <topi.pohjolainen at intel.com>
---
src/mesa/drivers/dri/i965/brw_fs.cpp | 37 ---------------
src/mesa/drivers/dri/i965/brw_fs.h | 1 -
src/mesa/drivers/dri/i965/brw_shader.cpp | 51 +++++++++++++++++++++
src/mesa/drivers/dri/i965/brw_shader.h | 3 ++
src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp | 63 +++-----------------------
5 files changed, 61 insertions(+), 94 deletions(-)
diff --git a/src/mesa/drivers/dri/i965/brw_fs.cpp b/src/mesa/drivers/dri/i965/brw_fs.cpp
index f073e12..90aca4f 100644
--- a/src/mesa/drivers/dri/i965/brw_fs.cpp
+++ b/src/mesa/drivers/dri/i965/brw_fs.cpp
@@ -521,43 +521,6 @@ fs_reg::is_accumulator() const
fixed_hw_reg.nr == BRW_ARF_ACCUMULATOR;
}
-int
-fs_visitor::type_size(const struct glsl_type *type)
-{
- unsigned int size, i;
-
- switch (type->base_type) {
- case GLSL_TYPE_UINT:
- case GLSL_TYPE_INT:
- case GLSL_TYPE_FLOAT:
- case GLSL_TYPE_BOOL:
- return type->components();
- case GLSL_TYPE_ARRAY:
- return type_size(type->fields.array) * type->length;
- case GLSL_TYPE_STRUCT:
- size = 0;
- for (i = 0; i < type->length; i++) {
- size += type_size(type->fields.structure[i].type);
- }
- return size;
- case GLSL_TYPE_SAMPLER:
- /* Samplers take up no register space, since they're baked in at
- * link time.
- */
- return 0;
- case GLSL_TYPE_ATOMIC_UINT:
- return 0;
- case GLSL_TYPE_IMAGE:
- case GLSL_TYPE_VOID:
- case GLSL_TYPE_ERROR:
- case GLSL_TYPE_INTERFACE:
- assert(!"not reached");
- break;
- }
-
- return 0;
-}
-
fs_reg
fs_visitor::get_timestamp()
{
diff --git a/src/mesa/drivers/dri/i965/brw_fs.h b/src/mesa/drivers/dri/i965/brw_fs.h
index d1d2018..7b3ffbd 100644
--- a/src/mesa/drivers/dri/i965/brw_fs.h
+++ b/src/mesa/drivers/dri/i965/brw_fs.h
@@ -323,7 +323,6 @@ public:
fs_inst *SUBB(fs_reg dst, fs_reg src0, fs_reg src1);
fs_inst *SEL(fs_reg dst, fs_reg src0, fs_reg src1);
- int type_size(const struct glsl_type *type);
fs_inst *get_instruction_generating_reg(fs_inst *start,
fs_inst *end,
const fs_reg ®);
diff --git a/src/mesa/drivers/dri/i965/brw_shader.cpp b/src/mesa/drivers/dri/i965/brw_shader.cpp
index e55e998..777d4aa 100644
--- a/src/mesa/drivers/dri/i965/brw_shader.cpp
+++ b/src/mesa/drivers/dri/i965/brw_shader.cpp
@@ -626,6 +626,57 @@ backend_emitter::virtual_grf_alloc(int size, bool use_map)
return virtual_grf_count++;
}
+int
+backend_emitter::type_size(const struct glsl_type *type,
+ bool use_vec4_overrides)
+{
+ unsigned int size, i;
+
+ switch (type->base_type) {
+ case GLSL_TYPE_UINT:
+ case GLSL_TYPE_INT:
+ case GLSL_TYPE_FLOAT:
+ case GLSL_TYPE_BOOL:
+ if (!use_vec4_overrides)
+ return type->components();
+
+ if (type->is_matrix()) {
+ return type->matrix_columns;
+ } else {
+ /* Regardless of size of vector, it gets a vec4. This is bad
+ * packing for things like floats, but otherwise arrays become a
+ * mess. Hopefully a later pass over the code can pack scalars
+ * down if appropriate.
+ */
+ return 1;
+ }
+ case GLSL_TYPE_ARRAY:
+ assert(type->length > 0);
+ return type_size(type->fields.array, use_vec4_overrides) * type->length;
+ case GLSL_TYPE_STRUCT:
+ size = 0;
+ for (i = 0; i < type->length; i++) {
+ size += type_size(type->fields.structure[i].type, use_vec4_overrides);
+ }
+ return size;
+ case GLSL_TYPE_SAMPLER:
+ /* Samplers take up no register space, since they're baked in at
+ * link time.
+ */
+ return use_vec4_overrides ? 1 : 0;
+ case GLSL_TYPE_ATOMIC_UINT:
+ return 0;
+ case GLSL_TYPE_IMAGE:
+ case GLSL_TYPE_VOID:
+ case GLSL_TYPE_ERROR:
+ case GLSL_TYPE_INTERFACE:
+ assert(!"not reached");
+ break;
+ }
+
+ return 0;
+}
+
bool
backend_instruction::is_tex() const
{
diff --git a/src/mesa/drivers/dri/i965/brw_shader.h b/src/mesa/drivers/dri/i965/brw_shader.h
index 54157fd..9ae5873 100644
--- a/src/mesa/drivers/dri/i965/brw_shader.h
+++ b/src/mesa/drivers/dri/i965/brw_shader.h
@@ -114,6 +114,9 @@ public:
int virtual_grf_alloc(int size, bool use_map = false);
+ static int type_size(const struct glsl_type *type,
+ bool use_vec4_overrides = false);
+
struct brw_context * const brw;
struct gl_context * const ctx;
diff --git a/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp b/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp
index e324d76..4be1acf 100644
--- a/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp
+++ b/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp
@@ -548,61 +548,12 @@ vec4_visitor::visit_instructions(const exec_list *list)
}
}
-
-static int
-type_size(const struct glsl_type *type)
-{
- unsigned int i;
- int size;
-
- switch (type->base_type) {
- case GLSL_TYPE_UINT:
- case GLSL_TYPE_INT:
- case GLSL_TYPE_FLOAT:
- case GLSL_TYPE_BOOL:
- if (type->is_matrix()) {
- return type->matrix_columns;
- } else {
- /* Regardless of size of vector, it gets a vec4. This is bad
- * packing for things like floats, but otherwise arrays become a
- * mess. Hopefully a later pass over the code can pack scalars
- * down if appropriate.
- */
- return 1;
- }
- case GLSL_TYPE_ARRAY:
- assert(type->length > 0);
- return type_size(type->fields.array) * type->length;
- case GLSL_TYPE_STRUCT:
- size = 0;
- for (i = 0; i < type->length; i++) {
- size += type_size(type->fields.structure[i].type);
- }
- return size;
- case GLSL_TYPE_SAMPLER:
- /* Samplers take up one slot in UNIFORMS[], but they're baked in
- * at link time.
- */
- return 1;
- case GLSL_TYPE_ATOMIC_UINT:
- return 0;
- case GLSL_TYPE_IMAGE:
- case GLSL_TYPE_VOID:
- case GLSL_TYPE_ERROR:
- case GLSL_TYPE_INTERFACE:
- assert(0);
- break;
- }
-
- return 0;
-}
-
src_reg::src_reg(class vec4_visitor *v, const struct glsl_type *type)
{
init();
this->file = GRF;
- this->reg = v->virtual_grf_alloc(type_size(type), true);
+ this->reg = v->virtual_grf_alloc(v->type_size(type, true), true);
if (type->is_array() || type->is_record()) {
this->swizzle = BRW_SWIZZLE_NOOP;
@@ -618,7 +569,7 @@ dst_reg::dst_reg(class vec4_visitor *v, const struct glsl_type *type)
init();
this->file = GRF;
- this->reg = v->virtual_grf_alloc(type_size(type), true);
+ this->reg = v->virtual_grf_alloc(v->type_size(type, true), true);
if (type->is_array() || type->is_record()) {
this->writemask = WRITEMASK_XYZW;
@@ -946,7 +897,7 @@ vec4_visitor::visit(ir_variable *ir)
case ir_var_shader_out:
reg = new(mem_ctx) dst_reg(this, ir->type);
- for (int i = 0; i < type_size(ir->type); i++) {
+ for (int i = 0; i < type_size(ir->type, true); i++) {
output_reg[ir->data.location + i] = *reg;
output_reg[ir->data.location + i].reg_offset = i;
output_reg[ir->data.location + i].type =
@@ -977,7 +928,7 @@ vec4_visitor::visit(ir_variable *ir)
* copy of its data into pull constants for array access.
*/
assert(this->uniforms < uniform_array_size);
- this->uniform_size[this->uniforms] = type_size(ir->type);
+ this->uniform_size[this->uniforms] = type_size(ir->type, true);
if (!strncmp(ir->name, "gl_", 3)) {
setup_builtin_uniform_values(ir);
@@ -1786,7 +1737,7 @@ vec4_visitor::compute_array_stride(ir_dereference_array *ir)
/* Under normal circumstances array elements are stored consecutively, so
* the stride is equal to the size of the array element.
*/
- return type_size(ir->type);
+ return type_size(ir->type, true);
}
@@ -1855,7 +1806,7 @@ vec4_visitor::visit(ir_dereference_record *ir)
for (i = 0; i < struct_type->length; i++) {
if (strcmp(struct_type->fields.structure[i].name, ir->field) == 0)
break;
- offset += type_size(struct_type->fields.structure[i].type);
+ offset += type_size(struct_type->fields.structure[i].type, true);
}
/* If the type is smaller than a vec4, replicate the last channel out. */
@@ -2075,7 +2026,7 @@ vec4_visitor::visit(ir_assignment *ir)
emit_bool_to_cond_code(ir->condition, &predicate);
}
- for (i = 0; i < type_size(ir->lhs->type); i++) {
+ for (i = 0; i < type_size(ir->lhs->type, true); i++) {
vec4_instruction *inst = emit(MOV(dst, src));
inst->predicate = predicate;
--
1.8.3.1
More information about the mesa-dev
mailing list