I wanted to separate this step for easier reviewing when I add the variable-index case next. ---
Here's the excerpt with diff -b, since reviewing is irritating otherwise. Remove this if you're trying to actually apply the patch. case ir_binop_ubo_load: + /* This IR node takes a constant uniform block a constant or variable + * index bytes offset within the block and loads a vector from that. + */ ir_constant *uniform_block = ir->operands[0]->as_constant(); - ir_constant *offset = ir->operands[1]->as_constant(); - + ir_constant *const_offset = ir->operands[1]->as_constant(); + fs_reg surf_index = fs_reg((unsigned)SURF_INDEX_WM_UBO(uniform_block->value.u[0])); + if (const_offset) { fs_reg packed_consts = fs_reg(this, glsl_type::float_type); packed_consts.type = result.type; - fs_reg surf_index = fs_reg((unsigned)SURF_INDEX_WM_UBO(uniform_block->value.u[0])); fs_inst *pull = emit(fs_inst(FS_OPCODE_UNIFORM_PULL_CONSTANT_LOAD, packed_consts, surf_index, - fs_reg(offset->value.u[0]))); + fs_reg(const_offset->value.u[0]))); pull->base_mrf = 14; pull->mlen = 1; - packed_consts.smear = offset->value.u[0] % 16 / 4; + packed_consts.smear = const_offset->value.u[0] % 16 / 4; for (int i = 0; i < ir->type->vector_elements; i++) { /* UBO bools are any nonzero value. We consider bools to be * values with the low bit set to 1. Convert them using CMP. @@ -596,6 +599,8 @@ fs_visitor::visit(ir_expression *ir) */ assert(packed_consts.smear < 8); } + } + result.reg_offset = 0; break; } src/mesa/drivers/dri/i965/brw_fs_visitor.cpp | 61 ++++++++++++++------------ 1 file changed, 33 insertions(+), 28 deletions(-) diff --git a/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp b/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp index 9073b14..d37da47 100644 --- a/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp +++ b/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp @@ -564,38 +564,43 @@ fs_visitor::visit(ir_expression *ir) break; case ir_binop_ubo_load: + /* This IR node takes a constant uniform block a constant or variable + * index bytes offset within the block and loads a vector from that. + */ ir_constant *uniform_block = ir->operands[0]->as_constant(); - ir_constant *offset = ir->operands[1]->as_constant(); - - fs_reg packed_consts = fs_reg(this, glsl_type::float_type); - packed_consts.type = result.type; + ir_constant *const_offset = ir->operands[1]->as_constant(); fs_reg surf_index = fs_reg((unsigned)SURF_INDEX_WM_UBO(uniform_block->value.u[0])); - fs_inst *pull = emit(fs_inst(FS_OPCODE_UNIFORM_PULL_CONSTANT_LOAD, - packed_consts, - surf_index, - fs_reg(offset->value.u[0]))); - pull->base_mrf = 14; - pull->mlen = 1; - - packed_consts.smear = offset->value.u[0] % 16 / 4; - for (int i = 0; i < ir->type->vector_elements; i++) { - /* UBO bools are any nonzero value. We consider bools to be - * values with the low bit set to 1. Convert them using CMP. - */ - if (ir->type->base_type == GLSL_TYPE_BOOL) { - emit(CMP(result, packed_consts, fs_reg(0u), BRW_CONDITIONAL_NZ)); - } else { - emit(MOV(result, packed_consts)); + if (const_offset) { + fs_reg packed_consts = fs_reg(this, glsl_type::float_type); + packed_consts.type = result.type; + fs_inst *pull = emit(fs_inst(FS_OPCODE_UNIFORM_PULL_CONSTANT_LOAD, + packed_consts, + surf_index, + fs_reg(const_offset->value.u[0]))); + pull->base_mrf = 14; + pull->mlen = 1; + + packed_consts.smear = const_offset->value.u[0] % 16 / 4; + for (int i = 0; i < ir->type->vector_elements; i++) { + /* UBO bools are any nonzero value. We consider bools to be + * values with the low bit set to 1. Convert them using CMP. + */ + if (ir->type->base_type == GLSL_TYPE_BOOL) { + emit(CMP(result, packed_consts, fs_reg(0u), BRW_CONDITIONAL_NZ)); + } else { + emit(MOV(result, packed_consts)); + } + + packed_consts.smear++; + result.reg_offset++; + + /* The std140 packing rules don't allow vectors to cross 16-byte + * boundaries, and a reg is 32 bytes. + */ + assert(packed_consts.smear < 8); } - - packed_consts.smear++; - result.reg_offset++; - - /* The std140 packing rules don't allow vectors to cross 16-byte - * boundaries, and a reg is 32 bytes. - */ - assert(packed_consts.smear < 8); } + result.reg_offset = 0; break; } -- 1.7.10.4 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev