i965/fs: Implement texture projection support.
authorKenneth Graunke <kenneth@whitecape.org>
Sun, 1 Feb 2015 07:36:52 +0000 (23:36 -0800)
committerKenneth Graunke <kenneth@whitecape.org>
Wed, 25 Mar 2015 23:17:19 +0000 (16:17 -0700)
Our fragment program backend implements support for TXP directly, and
there's no NIR lowering pass to remove the projection.  When we switch
fragment program support over to NIR, we need to support it somehow.

It's easy enough to support directly.

v2: Split out offset/tex_offset rename (requested by Jordan).

Signed-off-by: Kenneth Graunke <kenneth@whitecape.org>
Reviewed-by: Jordan Justen <jordan.l.justen@intel.com>
src/mesa/drivers/dri/i965/brw_fs_nir.cpp

index 98ea70ca842aeb9dbc82e9c7b2d590dc6f2412b9..0b8ed1a8b839b718ca0686f907ceef5ddf864e5a 100644 (file)
@@ -1744,6 +1744,7 @@ fs_visitor::nir_emit_texture(nir_tex_instr *instr)
    int lod_components = 0, offset_components = 0;
 
    fs_reg coordinate, shadow_comparitor, lod, lod2, sample_index, mcs, tex_offset;
+   fs_reg projector;
 
    for (unsigned i = 0; i < instr->num_srcs; i++) {
       fs_reg src = get_nir_src(instr->src[i].src);
@@ -1796,7 +1797,8 @@ fs_visitor::nir_emit_texture(nir_tex_instr *instr)
             offset_components = instr->coord_components;
          break;
       case nir_tex_src_projector:
-         unreachable("should be lowered");
+         projector = retype(src, BRW_REGISTER_TYPE_F);
+         break;
 
       case nir_tex_src_sampler_offset: {
          /* Figure out the highest possible sampler index and mark it as used */
@@ -1820,6 +1822,13 @@ fs_visitor::nir_emit_texture(nir_tex_instr *instr)
       }
    }
 
+   if (projector.file != BAD_FILE) {
+      fs_reg invproj = vgrf(glsl_type::float_type);
+      emit_math(SHADER_OPCODE_RCP, invproj, projector);
+      for (int i = 0; i < 3; i++)
+         emit(MUL(offset(coordinate, i), offset(coordinate, i), invproj));
+   }
+
    if (instr->op == nir_texop_txf_ms) {
       if (brw->gen >= 7 &&
           key_tex->compressed_multisample_layout_mask & (1 << sampler)) {