On Sat, Jul 18, 2015 at 7:34 AM, Francisco Jerez <curroje...@riseup.net> wrote: > --- > src/mesa/drivers/dri/i965/brw_fs_visitor.cpp | 66 > +++++++++++++++++++++------- > 1 file changed, 49 insertions(+), 17 deletions(-) > > diff --git a/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp > b/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp > index 89fcc49..4011639 100644 > --- a/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp > +++ b/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp > @@ -861,6 +861,14 @@ fs_visitor::emit_texture(ir_texture_opcode op, > } > } > > + if (op == ir_query_levels) { > + /* textureQueryLevels() is implemented in terms of TXS so we need to > + * pass a valid LOD argument. > + */ > + assert(lod.file == BAD_FILE); > + lod = fs_reg(0u);
Why can't this go as part of the switch below? It seems kind of odd to split the logic up like this. > + } > + > if (coordinate.file != BAD_FILE) { > /* FINISHME: Texture coordinate rescaling doesn't work with > non-constant > * samplers. This should only be a problem with GL_CLAMP on Gen7. > @@ -873,26 +881,50 @@ fs_visitor::emit_texture(ir_texture_opcode op, > * samples, so don't worry about them. > */ > fs_reg dst = vgrf(glsl_type::get_instance(dest_type->base_type, 4, 1)); > + const fs_reg srcs[] = { > + coordinate, shadow_c, lod, lod2, > + sample_index, mcs, sampler_reg, offset_value, > + fs_reg(coord_components), fs_reg(grad_components) > + }; > + enum opcode opcode; > > - if (devinfo->gen >= 7) { > - inst = emit_texture_gen7(op, dst, coordinate, coord_components, > - shadow_c, lod, lod2, grad_components, > - sample_index, mcs, sampler_reg, > - offset_value); > - } else if (devinfo->gen >= 5) { > - inst = emit_texture_gen5(op, dst, coordinate, coord_components, > - shadow_c, lod, lod2, grad_components, > - sample_index, sampler, > - offset_value.file != BAD_FILE); > - } else if (dispatch_width == 16) { > - inst = emit_texture_gen4_simd16(op, dst, coordinate, coord_components, > - shadow_c, lod, sampler); > - } else { > - inst = emit_texture_gen4(op, dst, coordinate, coord_components, > - shadow_c, lod, lod2, grad_components, > - sampler); > + switch (op) { > + case ir_tex: > + opcode = SHADER_OPCODE_TEX_LOGICAL; > + break; > + case ir_txb: > + opcode = FS_OPCODE_TXB_LOGICAL; > + break; > + case ir_txl: > + opcode = SHADER_OPCODE_TXL_LOGICAL; > + break; > + case ir_txd: > + opcode = SHADER_OPCODE_TXD_LOGICAL; > + break; > + case ir_txf: > + opcode = SHADER_OPCODE_TXF_LOGICAL; > + break; > + case ir_txf_ms: > + opcode = SHADER_OPCODE_TXF_CMS_LOGICAL; > + break; > + case ir_txs: > + case ir_query_levels: > + opcode = SHADER_OPCODE_TXS_LOGICAL; > + break; > + case ir_lod: > + opcode = SHADER_OPCODE_LOD_LOGICAL; > + break; > + case ir_tg4: > + opcode = (offset_value.file != BAD_FILE && offset_value.file != IMM ? > + SHADER_OPCODE_TG4_OFFSET_LOGICAL : > SHADER_OPCODE_TG4_LOGICAL); > + break; > + default: > + unreachable("not reached"); Please choose something more descriptive than "not reached". How about "invalid texture opcode" > } > > + inst = bld.emit(opcode, dst, srcs, ARRAY_SIZE(srcs)); > + inst->regs_written = 4 * dispatch_width / 8; > + > if (shadow_c.file != BAD_FILE) > inst->shadow_compare = true; > > -- > 2.4.3 > _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev