diff --git a/src/mesa/drivers/dri/i965/brw_fs.h b/src/mesa/drivers/dri/i965/brw_fs.h index b9cd42f53f5..d43a7826344 100644 --- a/src/mesa/drivers/dri/i965/brw_fs.h +++ b/src/mesa/drivers/dri/i965/brw_fs.h @@ -617,6 +617,7 @@ public: struct hash_table *variable_ht; ir_variable *frag_depth; fs_reg outputs[BRW_MAX_DRAW_BUFFERS]; + unsigned output_components[BRW_MAX_DRAW_BUFFERS]; int first_non_payload_grf; int max_grf; int urb_setup[FRAG_ATTRIB_MAX]; diff --git a/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp b/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp index 6ffee311771..7aebfe8424b 100644 --- a/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp +++ b/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp @@ -76,6 +76,7 @@ fs_visitor::visit(ir_variable *ir) /* Writing gl_FragColor outputs to all color regions. */ for (int i = 0; i < MAX2(c->key.nr_color_regions, 1); i++) { this->outputs[i] = *reg; + this->output_components[i] = 4; } } else if (ir->location == FRAG_RESULT_DEPTH) { this->frag_depth = ir; @@ -84,11 +85,16 @@ fs_visitor::visit(ir_variable *ir) assert(ir->location >= FRAG_RESULT_DATA0 && ir->location < FRAG_RESULT_DATA0 + BRW_MAX_DRAW_BUFFERS); + int vector_elements = + ir->type->is_array() ? ir->type->fields.array->vector_elements + : ir->type->vector_elements; + /* General color output. */ for (unsigned int i = 0; i < MAX2(1, ir->type->length); i++) { int output = ir->location - FRAG_RESULT_DATA0 + i; this->outputs[output] = *reg; - this->outputs[output].reg_offset += 4 * i; + this->outputs[output].reg_offset += vector_elements * i; + this->output_components[output] = vector_elements; } } } else if (ir->mode == ir_var_uniform) { @@ -2043,7 +2049,7 @@ fs_visitor::emit_fb_writes() this->current_annotation = ralloc_asprintf(this->mem_ctx, "FB write target %d", target); - for (int i = 0; i < 4; i++) + for (unsigned i = 0; i < this->output_components[target]; i++) emit_color_write(target, i, color_mrf); fs_inst *inst = emit(FS_OPCODE_FB_WRITE);