[Mesa-dev] [PATCHv2 4/5] nir: Translate image load, store and atomic intrinsics from GLSL IR.

2015-05-08 Thread Francisco Jerez
v2: Undefine coordinate components not applicable to the target.

---
 src/glsl/nir/glsl_to_nir.cpp | 126 +++
 1 file changed, 115 insertions(+), 11 deletions(-)

diff --git a/src/glsl/nir/glsl_to_nir.cpp b/src/glsl/nir/glsl_to_nir.cpp
index f6b8331..fab4508 100644
--- a/src/glsl/nir/glsl_to_nir.cpp
+++ b/src/glsl/nir/glsl_to_nir.cpp
@@ -614,27 +614,131 @@ nir_visitor::visit(ir_call *ir)
  op = nir_intrinsic_atomic_counter_inc_var;
   } else if (strcmp(ir-callee_name(), __intrinsic_atomic_predecrement) 
== 0) {
  op = nir_intrinsic_atomic_counter_dec_var;
+  } else if (strcmp(ir-callee_name(), __intrinsic_image_load) == 0) {
+ op = nir_intrinsic_image_load;
+  } else if (strcmp(ir-callee_name(), __intrinsic_image_store) == 0) {
+ op = nir_intrinsic_image_store;
+  } else if (strcmp(ir-callee_name(), __intrinsic_image_atomic_add) == 
0) {
+ op = nir_intrinsic_image_atomic_add;
+  } else if (strcmp(ir-callee_name(), __intrinsic_image_atomic_min) == 
0) {
+ op = nir_intrinsic_image_atomic_min;
+  } else if (strcmp(ir-callee_name(), __intrinsic_image_atomic_max) == 
0) {
+ op = nir_intrinsic_image_atomic_max;
+  } else if (strcmp(ir-callee_name(), __intrinsic_image_atomic_and) == 
0) {
+ op = nir_intrinsic_image_atomic_and;
+  } else if (strcmp(ir-callee_name(), __intrinsic_image_atomic_or) == 
0) {
+ op = nir_intrinsic_image_atomic_or;
+  } else if (strcmp(ir-callee_name(), __intrinsic_image_atomic_xor) == 
0) {
+ op = nir_intrinsic_image_atomic_xor;
+  } else if (strcmp(ir-callee_name(), 
__intrinsic_image_atomic_exchange) == 0) {
+ op = nir_intrinsic_image_atomic_exchange;
+  } else if (strcmp(ir-callee_name(), 
__intrinsic_image_atomic_comp_swap) == 0) {
+ op = nir_intrinsic_image_atomic_comp_swap;
   } else {
  unreachable(not reached);
   }
 
   nir_intrinsic_instr *instr = nir_intrinsic_instr_create(shader, op);
-  ir_dereference *param =
- (ir_dereference *) ir-actual_parameters.get_head();
-  instr-variables[0] = evaluate_deref(instr-instr, param);
-  nir_ssa_dest_init(instr-instr, instr-dest, 1, NULL);
+
+  switch (op) {
+  case nir_intrinsic_atomic_counter_read_var:
+  case nir_intrinsic_atomic_counter_inc_var:
+  case nir_intrinsic_atomic_counter_dec_var: {
+ ir_dereference *param =
+(ir_dereference *) ir-actual_parameters.get_head();
+ instr-variables[0] = evaluate_deref(instr-instr, param);
+ nir_ssa_dest_init(instr-instr, instr-dest, 1, NULL);
+ break;
+  }
+  case nir_intrinsic_image_load:
+  case nir_intrinsic_image_store:
+  case nir_intrinsic_image_atomic_add:
+  case nir_intrinsic_image_atomic_min:
+  case nir_intrinsic_image_atomic_max:
+  case nir_intrinsic_image_atomic_and:
+  case nir_intrinsic_image_atomic_or:
+  case nir_intrinsic_image_atomic_xor:
+  case nir_intrinsic_image_atomic_exchange:
+  case nir_intrinsic_image_atomic_comp_swap: {
+ nir_ssa_undef_instr *instr_undef =
+nir_ssa_undef_instr_create(shader, 1);
+ nir_instr_insert_after_cf_list(this-cf_node_list,
+instr_undef-instr);
+
+ /* Set the image variable dereference. */
+ exec_node *param = ir-actual_parameters.get_head();
+ ir_dereference *image = (ir_dereference *)param;
+ const glsl_type *type =
+image-variable_referenced()-type-without_array();
+
+ instr-variables[0] = evaluate_deref(instr-instr, image);
+ param = param-get_next();
+
+ /* Set the address argument, extending the coordinate vector to four
+  * components.
+  */
+ const nir_src src_addr = evaluate_rvalue((ir_dereference *)param);
+ nir_alu_instr *instr_addr = nir_alu_instr_create(shader, nir_op_vec4);
+ nir_ssa_dest_init(instr_addr-instr, instr_addr-dest.dest, 4, 
NULL);
+
+ for (int i = 0; i  4; i++) {
+if (i  type-coordinate_components()) {
+   instr_addr-src[i].src = src_addr;
+   instr_addr-src[i].swizzle[0] = i;
+} else {
+   instr_addr-src[i].src = nir_src_for_ssa(instr_undef-def);
+}
+ }
+
+ nir_instr_insert_after_cf_list(cf_node_list, instr_addr-instr);
+ instr-src[0] = nir_src_for_ssa(instr_addr-dest.dest.ssa);
+ param = param-get_next();
+
+ /* Set the sample argument, which is undefined for single-sample
+  * images.
+  */
+ if (type-sampler_dimensionality == GLSL_SAMPLER_DIM_MS) {
+instr-src[1] = evaluate_rvalue((ir_dereference *)param);
+param = param-get_next();
+ } else {
+instr-src[1] = nir_src_for_ssa(instr_undef-def);
+ }
+
+ /* Set the intrinsic 

Re: [Mesa-dev] [PATCHv2 4/5] nir: Translate image load, store and atomic intrinsics from GLSL IR.

2015-05-08 Thread Connor Abbott
Update the comment in patch 1, and the entire thing is

Reviewed-by: Connor Abbott cwabbo...@gmail.com

On Fri, May 8, 2015 at 12:40 PM, Francisco Jerez curroje...@riseup.net wrote:
 v2: Undefine coordinate components not applicable to the target.

 ---
  src/glsl/nir/glsl_to_nir.cpp | 126 
 +++
  1 file changed, 115 insertions(+), 11 deletions(-)

 diff --git a/src/glsl/nir/glsl_to_nir.cpp b/src/glsl/nir/glsl_to_nir.cpp
 index f6b8331..fab4508 100644
 --- a/src/glsl/nir/glsl_to_nir.cpp
 +++ b/src/glsl/nir/glsl_to_nir.cpp
 @@ -614,27 +614,131 @@ nir_visitor::visit(ir_call *ir)
   op = nir_intrinsic_atomic_counter_inc_var;
} else if (strcmp(ir-callee_name(), 
 __intrinsic_atomic_predecrement) == 0) {
   op = nir_intrinsic_atomic_counter_dec_var;
 +  } else if (strcmp(ir-callee_name(), __intrinsic_image_load) == 0) {
 + op = nir_intrinsic_image_load;
 +  } else if (strcmp(ir-callee_name(), __intrinsic_image_store) == 0) {
 + op = nir_intrinsic_image_store;
 +  } else if (strcmp(ir-callee_name(), __intrinsic_image_atomic_add) 
 == 0) {
 + op = nir_intrinsic_image_atomic_add;
 +  } else if (strcmp(ir-callee_name(), __intrinsic_image_atomic_min) 
 == 0) {
 + op = nir_intrinsic_image_atomic_min;
 +  } else if (strcmp(ir-callee_name(), __intrinsic_image_atomic_max) 
 == 0) {
 + op = nir_intrinsic_image_atomic_max;
 +  } else if (strcmp(ir-callee_name(), __intrinsic_image_atomic_and) 
 == 0) {
 + op = nir_intrinsic_image_atomic_and;
 +  } else if (strcmp(ir-callee_name(), __intrinsic_image_atomic_or) == 
 0) {
 + op = nir_intrinsic_image_atomic_or;
 +  } else if (strcmp(ir-callee_name(), __intrinsic_image_atomic_xor) 
 == 0) {
 + op = nir_intrinsic_image_atomic_xor;
 +  } else if (strcmp(ir-callee_name(), 
 __intrinsic_image_atomic_exchange) == 0) {
 + op = nir_intrinsic_image_atomic_exchange;
 +  } else if (strcmp(ir-callee_name(), 
 __intrinsic_image_atomic_comp_swap) == 0) {
 + op = nir_intrinsic_image_atomic_comp_swap;
} else {
   unreachable(not reached);
}

nir_intrinsic_instr *instr = nir_intrinsic_instr_create(shader, op);
 -  ir_dereference *param =
 - (ir_dereference *) ir-actual_parameters.get_head();
 -  instr-variables[0] = evaluate_deref(instr-instr, param);
 -  nir_ssa_dest_init(instr-instr, instr-dest, 1, NULL);
 +
 +  switch (op) {
 +  case nir_intrinsic_atomic_counter_read_var:
 +  case nir_intrinsic_atomic_counter_inc_var:
 +  case nir_intrinsic_atomic_counter_dec_var: {
 + ir_dereference *param =
 +(ir_dereference *) ir-actual_parameters.get_head();
 + instr-variables[0] = evaluate_deref(instr-instr, param);
 + nir_ssa_dest_init(instr-instr, instr-dest, 1, NULL);
 + break;
 +  }
 +  case nir_intrinsic_image_load:
 +  case nir_intrinsic_image_store:
 +  case nir_intrinsic_image_atomic_add:
 +  case nir_intrinsic_image_atomic_min:
 +  case nir_intrinsic_image_atomic_max:
 +  case nir_intrinsic_image_atomic_and:
 +  case nir_intrinsic_image_atomic_or:
 +  case nir_intrinsic_image_atomic_xor:
 +  case nir_intrinsic_image_atomic_exchange:
 +  case nir_intrinsic_image_atomic_comp_swap: {
 + nir_ssa_undef_instr *instr_undef =
 +nir_ssa_undef_instr_create(shader, 1);
 + nir_instr_insert_after_cf_list(this-cf_node_list,
 +instr_undef-instr);
 +
 + /* Set the image variable dereference. */
 + exec_node *param = ir-actual_parameters.get_head();
 + ir_dereference *image = (ir_dereference *)param;
 + const glsl_type *type =
 +image-variable_referenced()-type-without_array();
 +
 + instr-variables[0] = evaluate_deref(instr-instr, image);
 + param = param-get_next();
 +
 + /* Set the address argument, extending the coordinate vector to four
 +  * components.
 +  */
 + const nir_src src_addr = evaluate_rvalue((ir_dereference *)param);
 + nir_alu_instr *instr_addr = nir_alu_instr_create(shader, 
 nir_op_vec4);
 + nir_ssa_dest_init(instr_addr-instr, instr_addr-dest.dest, 4, 
 NULL);
 +
 + for (int i = 0; i  4; i++) {
 +if (i  type-coordinate_components()) {
 +   instr_addr-src[i].src = src_addr;
 +   instr_addr-src[i].swizzle[0] = i;
 +} else {
 +   instr_addr-src[i].src = nir_src_for_ssa(instr_undef-def);
 +}
 + }
 +
 + nir_instr_insert_after_cf_list(cf_node_list, instr_addr-instr);
 + instr-src[0] = nir_src_for_ssa(instr_addr-dest.dest.ssa);
 + param = param-get_next();
 +
 + /* Set the sample argument, which is undefined for single-sample
 +  * images.
 +  */
 +