Signed-off-by: Connor Abbott <connor.abb...@intel.com> --- src/mesa/drivers/dri/i965/brw_fs.h | 15 ++++--- src/mesa/drivers/dri/i965/brw_fs_fp.cpp | 9 ++-- src/mesa/drivers/dri/i965/brw_fs_visitor.cpp | 67 +++++++++++++++------------- 3 files changed, 49 insertions(+), 42 deletions(-)
diff --git a/src/mesa/drivers/dri/i965/brw_fs.h b/src/mesa/drivers/dri/i965/brw_fs.h index 21b7f23..3f45f35 100644 --- a/src/mesa/drivers/dri/i965/brw_fs.h +++ b/src/mesa/drivers/dri/i965/brw_fs.h @@ -373,14 +373,17 @@ public: fs_reg rescale_texcoord(fs_reg coordinate, const glsl_type *coord_type, bool is_rect, int sampler, int texunit); fs_inst *emit_texture_gen4(ir_texture *ir, fs_reg dst, fs_reg coordinate, - fs_reg shadow_comp, fs_reg lod, fs_reg lod2); + int coord_components, fs_reg shadow_comp, + fs_reg lod, fs_reg lod2); fs_inst *emit_texture_gen5(ir_texture *ir, fs_reg dst, fs_reg coordinate, - fs_reg shadow_comp, fs_reg lod, fs_reg lod2, - fs_reg sample_index, bool has_offset); + int coord_components, fs_reg shadow_comp, + fs_reg lod, fs_reg lod2, fs_reg sample_index, + bool has_offset); fs_inst *emit_texture_gen7(ir_texture *ir, fs_reg dst, fs_reg coordinate, - fs_reg shadow_comp, fs_reg lod, fs_reg lod2, - fs_reg sample_index, bool has_offset, - fs_reg offset, fs_reg mcs, int sampler); + int coord_components, fs_reg shadow_comp, + fs_reg lod, fs_reg lod2, fs_reg sample_index, + bool has_offset, fs_reg offset, fs_reg mcs, + int sampler); fs_reg emit_mcs_fetch(fs_reg coordinate, int components, int sampler); void emit_gen6_gather_wa(uint8_t wa, fs_reg dst); fs_reg fix_math_operand(fs_reg src); diff --git a/src/mesa/drivers/dri/i965/brw_fs_fp.cpp b/src/mesa/drivers/dri/i965/brw_fs_fp.cpp index a8f0133..c9215f4 100644 --- a/src/mesa/drivers/dri/i965/brw_fs_fp.cpp +++ b/src/mesa/drivers/dri/i965/brw_fs_fp.cpp @@ -478,8 +478,7 @@ fs_visitor::emit_fragment_program_code() unreachable("not reached"); } - ir_constant_data junk_data; - ir->coordinate = new(mem_ctx) ir_constant(coordinate_type, &junk_data); + int coord_components = coordinate_type->vector_elements; if (fpi->TexShadow) shadow_c = offset(coordinate, 2); @@ -490,11 +489,11 @@ fs_visitor::emit_fragment_program_code() fs_inst *inst; if (brw->gen >= 7) { - inst = emit_texture_gen7(ir, dst, coordinate, shadow_c, lod, dpdy, sample_index, false, offset_reg, fs_reg(0u), fpi->TexSrcUnit); + inst = emit_texture_gen7(ir, dst, coordinate, coord_components, shadow_c, lod, dpdy, sample_index, false, offset_reg, fs_reg(0u), fpi->TexSrcUnit); } else if (brw->gen >= 5) { - inst = emit_texture_gen5(ir, dst, coordinate, shadow_c, lod, dpdy, sample_index, false); + inst = emit_texture_gen5(ir, dst, coordinate, coord_components, shadow_c, lod, dpdy, sample_index, false); } else { - inst = emit_texture_gen4(ir, dst, coordinate, shadow_c, lod, dpdy); + inst = emit_texture_gen4(ir, dst, coordinate, coord_components, shadow_c, lod, dpdy); } inst->sampler = fpi->TexSrcUnit; diff --git a/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp b/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp index 876847d..107d0eb 100644 --- a/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp +++ b/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp @@ -1095,7 +1095,8 @@ fs_visitor::visit(ir_assignment *ir) fs_inst * fs_visitor::emit_texture_gen4(ir_texture *ir, fs_reg dst, fs_reg coordinate, - fs_reg shadow_c, fs_reg lod, fs_reg dPdy) + int coord_components, fs_reg shadow_c, + fs_reg lod, fs_reg dPdy) { int mlen; int base_mrf = 1; @@ -1106,7 +1107,7 @@ fs_visitor::emit_texture_gen4(ir_texture *ir, fs_reg dst, fs_reg coordinate, mlen = 1; if (shadow_c.file != BAD_FILE) { - for (int i = 0; i < ir->coordinate->type->vector_elements; i++) { + for (int i = 0; i < coord_components; i++) { emit(MOV(fs_reg(MRF, base_mrf + mlen + i), coordinate)); coordinate.reg_offset++; } @@ -1114,7 +1115,7 @@ fs_visitor::emit_texture_gen4(ir_texture *ir, fs_reg dst, fs_reg coordinate, /* gen4's SIMD8 sampler always has the slots for u,v,r present. * the unused slots must be zeroed. */ - for (int i = ir->coordinate->type->vector_elements; i < 3; i++) { + for (int i = coord_components; i < 3; i++) { emit(MOV(fs_reg(MRF, base_mrf + mlen + i), fs_reg(0.0f))); } mlen += 3; @@ -1135,12 +1136,12 @@ fs_visitor::emit_texture_gen4(ir_texture *ir, fs_reg dst, fs_reg coordinate, emit(MOV(fs_reg(MRF, base_mrf + mlen), shadow_c)); mlen++; } else if (ir->op == ir_tex) { - for (int i = 0; i < ir->coordinate->type->vector_elements; i++) { + for (int i = 0; i < coord_components; i++) { emit(MOV(fs_reg(MRF, base_mrf + mlen + i), coordinate)); coordinate.reg_offset++; } /* zero the others. */ - for (int i = ir->coordinate->type->vector_elements; i<3; i++) { + for (int i = coord_components; i<3; i++) { emit(MOV(fs_reg(MRF, base_mrf + mlen + i), fs_reg(0.0f))); } /* gen4's SIMD8 sampler always has the slots for u,v,r present. */ @@ -1148,12 +1149,12 @@ fs_visitor::emit_texture_gen4(ir_texture *ir, fs_reg dst, fs_reg coordinate, } else if (ir->op == ir_txd) { fs_reg &dPdx = lod; - for (int i = 0; i < ir->coordinate->type->vector_elements; i++) { + for (int i = 0; i < coord_components; i++) { emit(MOV(fs_reg(MRF, base_mrf + mlen + i), coordinate)); coordinate.reg_offset++; } /* the slots for u and v are always present, but r is optional */ - mlen += MAX2(ir->coordinate->type->vector_elements, 2); + mlen += MAX2(coord_components, 2); /* P = u, v, r * dPdx = dudx, dvdx, drdx @@ -1192,7 +1193,7 @@ fs_visitor::emit_texture_gen4(ir_texture *ir, fs_reg dst, fs_reg coordinate, simd16 = true; assert(ir->op == ir_txb || ir->op == ir_txl || ir->op == ir_txf); - for (int i = 0; i < ir->coordinate->type->vector_elements; i++) { + for (int i = 0; i < coord_components; i++) { emit(MOV(fs_reg(MRF, base_mrf + mlen + i * 2, coordinate.type), coordinate)); coordinate.reg_offset++; @@ -1201,7 +1202,7 @@ fs_visitor::emit_texture_gen4(ir_texture *ir, fs_reg dst, fs_reg coordinate, /* Initialize the rest of u/v/r with 0.0. Empirically, this seems to * be necessary for TXF (ld), but seems wise to do for all messages. */ - for (int i = ir->coordinate->type->vector_elements; i < 3; i++) { + for (int i = coord_components; i < 3; i++) { emit(MOV(fs_reg(MRF, base_mrf + mlen + i * 2), fs_reg(0.0f))); } @@ -1276,15 +1277,14 @@ fs_visitor::emit_texture_gen4(ir_texture *ir, fs_reg dst, fs_reg coordinate, */ fs_inst * fs_visitor::emit_texture_gen5(ir_texture *ir, fs_reg dst, fs_reg coordinate, - fs_reg shadow_c, fs_reg lod, fs_reg lod2, - fs_reg sample_index, bool has_offset) + int coord_components, fs_reg shadow_c, + fs_reg lod, fs_reg lod2, fs_reg sample_index, + bool has_offset) { int mlen = 0; int base_mrf = 2; int reg_width = dispatch_width / 8; bool header_present = false; - const int vector_elements = - ir->coordinate ? ir->coordinate->type->vector_elements : 0; if (has_offset) { /* The offsets set up by the ir_texture visitor are in the @@ -1295,12 +1295,12 @@ fs_visitor::emit_texture_gen5(ir_texture *ir, fs_reg dst, fs_reg coordinate, base_mrf--; } - for (int i = 0; i < vector_elements; i++) { + for (int i = 0; i < coord_components; i++) { emit(MOV(fs_reg(MRF, base_mrf + mlen + i * reg_width, coordinate.type), coordinate)); coordinate.reg_offset++; } - mlen += vector_elements * reg_width; + mlen += coord_components * reg_width; if (shadow_c.file != BAD_FILE) { mlen = MAX2(mlen, header_present + 4 * reg_width); @@ -1403,9 +1403,10 @@ fs_visitor::emit_texture_gen5(ir_texture *ir, fs_reg dst, fs_reg coordinate, fs_inst * fs_visitor::emit_texture_gen7(ir_texture *ir, fs_reg dst, fs_reg coordinate, - fs_reg shadow_c, fs_reg lod, fs_reg lod2, - fs_reg sample_index, bool has_offset, - fs_reg offset, fs_reg mcs, int sampler) + int coord_components, fs_reg shadow_c, + fs_reg lod, fs_reg lod2, fs_reg sample_index, + bool has_offset, fs_reg offset, fs_reg mcs, + int sampler) { int reg_width = dispatch_width / 8; bool header_present = false; @@ -1459,7 +1460,7 @@ fs_visitor::emit_texture_gen7(ir_texture *ir, fs_reg dst, fs_reg coordinate, /* Load dPdx and the coordinate together: * [hdr], [ref], x, dPdx.x, dPdy.x, y, dPdx.y, dPdy.y, z, dPdx.z, dPdy.z */ - for (int i = 0; i < ir->coordinate->type->vector_elements; i++) { + for (int i = 0; i < coord_components; i++) { emit(MOV(sources[length], coordinate)); coordinate.reg_offset++; length++; @@ -1498,7 +1499,7 @@ fs_visitor::emit_texture_gen7(ir_texture *ir, fs_reg dst, fs_reg coordinate, emit(MOV(retype(sources[length], BRW_REGISTER_TYPE_D), lod)); length++; - for (int i = 1; i < ir->coordinate->type->vector_elements; i++) { + for (int i = 1; i < coord_components; i++) { emit(MOV(retype(sources[length], BRW_REGISTER_TYPE_D), coordinate)); coordinate.reg_offset++; length++; @@ -1517,7 +1518,7 @@ fs_visitor::emit_texture_gen7(ir_texture *ir, fs_reg dst, fs_reg coordinate, /* there is no offsetting for this message; just copy in the integer * texture coordinates */ - for (int i = 0; i < ir->coordinate->type->vector_elements; i++) { + for (int i = 0; i < coord_components; i++) { emit(MOV(retype(sources[length], BRW_REGISTER_TYPE_D), coordinate)); coordinate.reg_offset++; length++; @@ -1543,7 +1544,7 @@ fs_visitor::emit_texture_gen7(ir_texture *ir, fs_reg dst, fs_reg coordinate, length++; } - if (ir->coordinate->type->vector_elements == 3) { /* r if present */ + if (coord_components == 3) { /* r if present */ emit(MOV(sources[length], coordinate)); coordinate.reg_offset++; length++; @@ -1555,8 +1556,8 @@ fs_visitor::emit_texture_gen7(ir_texture *ir, fs_reg dst, fs_reg coordinate, } /* Set up the coordinate (except for cases where it was done above) */ - if (ir->coordinate && !coordinate_done) { - for (int i = 0; i < ir->coordinate->type->vector_elements; i++) { + if (!coordinate_done) { + for (int i = 0; i < coord_components; i++) { emit(MOV(sources[length], coordinate)); coordinate.reg_offset++; length++; @@ -1803,6 +1804,9 @@ fs_visitor::visit(ir_texture *ir) sampler, texunit); } + int coord_components = + ir->coordinate ? ir->coordinate->type->vector_elements : 0; + fs_reg shadow_comparitor; if (ir->shadow_comparitor) { ir->shadow_comparitor->accept(this); @@ -1860,15 +1864,16 @@ fs_visitor::visit(ir_texture *ir) } if (brw->gen >= 7) { - inst = emit_texture_gen7(ir, dst, coordinate, shadow_comparitor, - lod, lod2, sample_index, has_offset, offset, - mcs, sampler); + inst = emit_texture_gen7(ir, dst, coordinate, coord_components, + shadow_comparitor, lod, lod2, sample_index, + has_offset, offset, mcs, sampler); } else if (brw->gen >= 5) { - inst = emit_texture_gen5(ir, dst, coordinate, shadow_comparitor, - lod, lod2, sample_index, has_offset); + inst = emit_texture_gen5(ir, dst, coordinate, coord_components, + shadow_comparitor, lod, lod2, sample_index, + has_offset); } else { - inst = emit_texture_gen4(ir, dst, coordinate, shadow_comparitor, - lod, lod2); + inst = emit_texture_gen4(ir, dst, coordinate, coord_components, + shadow_comparitor, lod, lod2); } if (ir->offset != NULL && ir->op != ir_txf) -- 1.9.3 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev