[Mesa-dev] [PATCH 2/3] i965: Adds support for horizontal location
Vincent Lejeune
vljn at ovi.com
Sun Feb 5 10:02:42 PST 2012
---
src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp | 39 +++++++++++++++++++-----
1 files changed, 31 insertions(+), 8 deletions(-)
diff --git a/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp b/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp
index 13ba18b..88b8a9d 100644
--- a/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp
+++ b/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp
@@ -832,6 +832,7 @@ vec4_visitor::visit(ir_variable *ir)
{
dst_reg *reg = NULL;
+ unsigned components;
if (variable_storage(ir))
return;
@@ -854,15 +855,26 @@ vec4_visitor::visit(ir_variable *ir)
break;
case ir_var_out:
- reg = new(mem_ctx) dst_reg(this, ir->type);
+ components = (ir->type->is_array())?ir->type->fields.array->vector_elements:ir->type->vector_elements;
+ if (!output_reg_annotation[ir->location]) {
+ // The reg has not been set
+ reg = new(mem_ctx) dst_reg(this, ir->type);
- for (int i = 0; i < type_size(ir->type); i++) {
- output_reg[ir->location + i] = *reg;
- output_reg[ir->location + i].reg_offset = i;
- output_reg[ir->location + i].type =
- brw_type_for_base_type(ir->type->get_scalar_type());
- output_reg_annotation[ir->location + i] = ir->name;
- }
+ for (int i = 0; i < type_size(ir->type); i++) {
+ output_reg[ir->location + i] = *reg;
+ output_reg[ir->location + i].reg_offset = i;
+ output_reg[ir->location + i].type =
+ brw_type_for_base_type(ir->type->get_scalar_type());
+ output_reg[ir->location + i].writemask = (((1 << components) - 1) << ir->horizontal_location);
+ output_reg_annotation[ir->location + i] = ir->name;
+ }
+ } else {
+ // The reg has already been set : this output is packed
+ reg = &(output_reg[ir->location]);
+ output_reg[ir->location].writemask |= (((1 << components) - 1) << ir->horizontal_location);
+ char * new_annotation = ralloc_asprintf(mem_ctx, "%s ; %s", output_reg_annotation[ir->location], ir->name);
+ output_reg_annotation[ir->location] = new_annotation;
+ }
break;
case ir_var_auto:
@@ -1404,6 +1416,12 @@ vec4_visitor::visit(ir_dereference_variable *ir)
if (type->is_scalar() || type->is_vector() || type->is_matrix())
this->result.swizzle = swizzle_for_size(type->vector_elements);
+ unsigned swz = this->result.swizzle;
+ this->result.swizzle = BRW_SWIZZLE4(BRW_GET_SWZ(swz, 0) + ir->var->horizontal_location % 4,
+ BRW_GET_SWZ(swz, 1) + ir->var->horizontal_location % 4,
+ BRW_GET_SWZ(swz, 2) + ir->var->horizontal_location % 4,
+ BRW_GET_SWZ(swz, 3) + ir->var->horizontal_location % 4
+ );
}
void
@@ -1660,6 +1678,10 @@ vec4_visitor::visit(ir_assignment *ir)
assert(ir->lhs->type->is_vector() ||
ir->lhs->type->is_scalar());
dst.writemask = ir->write_mask;
+
+ if (ir_variable *inside_var = ir->lhs->variable_referenced()) {
+ dst.writemask = dst.writemask << inside_var->horizontal_location;
+ }
for (int i = 0; i < 4; i++) {
if (dst.writemask & (1 << i)) {
@@ -2616,6 +2638,7 @@ vec4_visitor::vec4_visitor(struct brw_vs_compile *c,
this->live_intervals_valid = false;
this->uniforms = 0;
+ memset(output_reg_annotation, 0, sizeof(output_reg_annotation));
}
vec4_visitor::~vec4_visitor()
--
1.7.7
More information about the mesa-dev
mailing list