[Mesa-dev] [PATCH 72/78] i965/nir/vec4: Implement nir_texop_txs and nir_texop_query_levels texture ops

Eduardo Lima Mitev elima at igalia.com
Fri Jun 26 01:07:28 PDT 2015


The implementation is taken as-is from vec4_visitor.

It is similar for both operations, so it makes sense to group them together.

Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=89580
---
 src/mesa/drivers/dri/i965/brw_vec4_nir.cpp | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/src/mesa/drivers/dri/i965/brw_vec4_nir.cpp b/src/mesa/drivers/dri/i965/brw_vec4_nir.cpp
index 92c88d4..b1c6659 100644
--- a/src/mesa/drivers/dri/i965/brw_vec4_nir.cpp
+++ b/src/mesa/drivers/dri/i965/brw_vec4_nir.cpp
@@ -1574,7 +1574,7 @@ vec4_visitor::nir_emit_texture(nir_tex_instr *instr)
    int param_base = inst->base_mrf + inst->header_size;
 
    if (instr->op == nir_texop_txs || instr->op == nir_texop_query_levels) {
-      /* @TODO: not yet implemented */
+      emit(MOV(dst_reg(MRF, param_base, lod.type, WRITEMASK_X), lod));
    } else {
       /* Load the coordinate */
       int coord_mask = (1 << instr->coord_components) - 1;
@@ -1627,6 +1627,18 @@ vec4_visitor::nir_emit_texture(nir_tex_instr *instr)
    /* Emit the instruction */
    emit(inst);
 
+   /* fixup num layers (z) for cube arrays: hardware returns faces * layers;
+    * spec requires layers.
+    */
+   if (instr->op == nir_texop_txs) {
+      if (instr->sampler_dim == GLSL_SAMPLER_DIM_CUBE &&
+          instr->is_array) {
+         emit_math(SHADER_OPCODE_INT_QUOTIENT,
+                   writemask(inst->dst, WRITEMASK_Z),
+                   src_reg(inst->dst), src_reg(6));
+      }
+   }
+
    /* Move the result to the destination registry, applying swizzle */
    dst_reg dest = get_nir_dest(instr->dest, brw_type_for_base_type(dest_type));
 
-- 
2.1.4



More information about the mesa-dev mailing list