glsl: add ARB_shader_ballot operations
authorNicolai Hähnle <nicolai.haehnle@amd.com>
Thu, 30 Mar 2017 09:18:30 +0000 (11:18 +0200)
committerNicolai Hähnle <nicolai.haehnle@amd.com>
Wed, 5 Apr 2017 13:25:51 +0000 (15:25 +0200)
Reviewed-by: Marek Olšák <marek.olsak@amd.com>
src/compiler/glsl/ir.cpp
src/compiler/glsl/ir_expression_operation.py
src/compiler/glsl/ir_validate.cpp
src/mesa/program/ir_to_mesa.cpp

index f80bd811ac015bbb930cfb9e82505453092c1b87..2bbc7a1cf720f06bcdef5323ae03c3d393b19f09 100644 (file)
@@ -381,6 +381,14 @@ ir_expression::ir_expression(int op, ir_rvalue *op0)
       this->type = glsl_type::int_type;
       break;
 
+   case ir_unop_ballot:
+      this->type = glsl_type::uint64_t_type;
+      break;
+
+   case ir_unop_read_first_invocation:
+      this->type = op0->type;
+      break;
+
    case ir_unop_vote_any:
    case ir_unop_vote_all:
    case ir_unop_vote_eq:
@@ -496,6 +504,10 @@ ir_expression::ir_expression(int op, ir_rvalue *op0, ir_rvalue *op1)
       this->type = op0->type->get_scalar_type();
       break;
 
+   case ir_binop_read_invocation:
+      this->type = op0->type;
+      break;
+
    default:
       assert(!"not reached: missing automatic type setup for ir_expression");
       this->type = glsl_type::float_type;
index bde9c01db9b7b84a0ab3ce45f8892306db192f3c..1d29560733e54409be4954ef2fdc726cf8f2a32a 100644 (file)
@@ -570,6 +570,10 @@ ir_expression_operation = [
    # of its length.
    operation("ssbo_unsized_array_length", 1),
 
+   # ARB_shader_ballot operations
+   operation("ballot", 1, source_types=(bool_type,), dest_type=uint64_type),
+   operation("read_first_invocation", 1),
+
    # Vote among threads on the value of the boolean argument.
    operation("vote_any", 1),
    operation("vote_all", 1),
@@ -666,6 +670,9 @@ ir_expression_operation = [
    # operand1 is the sample ID
    operation("interpolate_at_sample", 2),
 
+   # ARB_shader_ballot operation
+   operation("read_invocation", 2),
+
    # Fused floating-point multiply-add, part of ARB_gpu_shader5.
    operation("fma", 3, source_types=real_types, c_expression="{src0} * {src1} + {src2}"),
 
index 5a1202b0b0dcdaee263a60d7aa76ad421c2c228d..76a4ed17e775d7e7325aaaf8e74d21a876649d84 100644 (file)
@@ -582,6 +582,22 @@ ir_validate::visit_leave(ir_expression *ir)
       assert(ir->type->base_type == GLSL_TYPE_INT);
       break;
 
+   case ir_unop_ballot:
+      assert(ir->type == glsl_type::uint64_t_type);
+      assert(ir->operands[0]->type == glsl_type::bool_type);
+      break;
+
+   case ir_binop_read_invocation:
+      assert(ir->operands[1]->type == glsl_type::uint_type);
+      /* fall-through */
+   case ir_unop_read_first_invocation:
+      assert(ir->type == ir->operands[0]->type);
+      assert(ir->type->is_scalar() || ir->type->is_vector());
+      assert(ir->type->base_type == GLSL_TYPE_FLOAT ||
+             ir->type->base_type == GLSL_TYPE_INT ||
+             ir->type->base_type == GLSL_TYPE_UINT);
+      break;
+
    case ir_unop_vote_any:
    case ir_unop_vote_all:
    case ir_unop_vote_eq:
index 9760f7b7121dd5a6ef1791506630ca8aa46e1014..6b33266f1b9b04defae32ab44f450a9efe5b2e0b 100644 (file)
@@ -1389,6 +1389,9 @@ ir_to_mesa_visitor::visit(ir_expression *ir)
    case ir_unop_dFdy_fine:
    case ir_unop_subroutine_to_int:
    case ir_unop_get_buffer_size:
+   case ir_unop_ballot:
+   case ir_binop_read_invocation:
+   case ir_unop_read_first_invocation:
    case ir_unop_vote_any:
    case ir_unop_vote_all:
    case ir_unop_vote_eq: