r600/sfn: Add support for reading cube image array dim.
[mesa.git] / src / gallium / drivers / r600 / sfn / sfn_shader_base.cpp
index 92d65c574bf9ef59004f0a79a9d758710888366d..a1a258c8cbd01d648b1e5ca96f8103b710d58e42 100644 (file)
@@ -93,12 +93,15 @@ bool ShaderFromNirProcessor::scan_instruction(nir_instr *instr)
       nir_tex_instr *t = nir_instr_as_tex(instr);
       if (t->sampler_dim == GLSL_SAMPLER_DIM_BUF)
          sh_info().uses_tex_buffers = true;
+      if (t->op == nir_texop_txs &&
+          t->sampler_dim == GLSL_SAMPLER_DIM_CUBE &&
+          t->is_array)
+         sh_info().has_txq_cube_array_z_comp = true;
       break;
    }
    case nir_instr_type_intrinsic: {
       auto *i = nir_instr_as_intrinsic(instr);
       switch (i->intrinsic) {
-      case nir_intrinsic_image_load:
       case nir_intrinsic_ssbo_atomic_add:
       case nir_intrinsic_image_atomic_add:
       case nir_intrinsic_ssbo_atomic_and:
@@ -116,13 +119,22 @@ bool ShaderFromNirProcessor::scan_instruction(nir_instr *instr)
       case nir_intrinsic_image_atomic_xor:
       case nir_intrinsic_image_atomic_exchange:
       case nir_intrinsic_image_atomic_comp_swap:
-         m_ssbo_instr.set_require_rat_return_address();
          m_sel.info.writes_memory = 1;
+         /* fallthrough */
+      case nir_intrinsic_image_load:
+         m_ssbo_instr.set_require_rat_return_address();
          break;
+      case nir_intrinsic_image_size: {
+         if (nir_intrinsic_image_dim(i) == GLSL_SAMPLER_DIM_CUBE &&
+             nir_intrinsic_image_array(i) && nir_dest_num_components(i->dest) > 2)
+            sh_info().has_txq_cube_array_z_comp = true;
+      }
+
       default:
          ;
       }
 
+
    }
    default:
       ;