mesa: hook up core bits of GL_ARB_shader_group_vote
authorIlia Mirkin <imirkin@alum.mit.edu>
Sun, 29 May 2016 14:49:03 +0000 (10:49 -0400)
committerIlia Mirkin <imirkin@alum.mit.edu>
Tue, 7 Jun 2016 00:48:46 +0000 (20:48 -0400)
Signed-off-by: Ilia Mirkin <imirkin@alum.mit.edu>
Reviewed-by: Ian Romanick <ian.d.romanick@intel.com>
Reviewed-by: Dave Airlie <airlied@redhat.com>
12 files changed:
src/compiler/glsl/builtin_functions.cpp
src/compiler/glsl/glcpp/glcpp-parse.y
src/compiler/glsl/glsl_parser_extras.cpp
src/compiler/glsl/glsl_parser_extras.h
src/compiler/glsl/ir.cpp
src/compiler/glsl/ir.h
src/compiler/glsl/ir_validate.cpp
src/mesa/drivers/dri/i965/brw_fs_channel_expressions.cpp
src/mesa/main/extensions_table.h
src/mesa/main/mtypes.h
src/mesa/program/ir_to_mesa.cpp
src/mesa/state_tracker/st_glsl_to_tgsi.cpp

index edd02bb031b7a19abb978cc8982b52df7755c290..db0dcb6288f6d2effa2a0b94a030c52e6298d542 100644 (file)
@@ -528,6 +528,12 @@ barrier_supported(const _mesa_glsl_parse_state *state)
           state->stage == MESA_SHADER_TESS_CTRL;
 }
 
+static bool
+vote(const _mesa_glsl_parse_state *state)
+{
+   return state->ARB_shader_group_vote_enable;
+}
+
 /** @} */
 
 /******************************************************************************/
@@ -853,6 +859,8 @@ private:
    ir_function_signature *_shader_clock(builtin_available_predicate avail,
                                         const glsl_type *type);
 
+   ir_function_signature *_vote(enum ir_expression_operation opcode);
+
 #undef B0
 #undef B1
 #undef B2
@@ -2935,6 +2943,10 @@ builtin_builder::create_builtins()
                               glsl_type::uvec2_type),
                 NULL);
 
+   add_function("anyInvocationARB", _vote(ir_unop_vote_any), NULL);
+   add_function("allInvocationsARB", _vote(ir_unop_vote_all), NULL);
+   add_function("allInvocationsEqualARB", _vote(ir_unop_vote_eq), NULL);
+
 #undef F
 #undef FI
 #undef FIUD
@@ -5576,6 +5588,16 @@ builtin_builder::_shader_clock(builtin_available_predicate avail,
    return sig;
 }
 
+ir_function_signature *
+builtin_builder::_vote(enum ir_expression_operation opcode)
+{
+   ir_variable *value = in_var(glsl_type::bool_type, "value");
+
+   MAKE_SIG(glsl_type::bool_type, vote, 1, value);
+   body.emit(ret(expr(opcode, value)));
+   return sig;
+}
+
 /** @} */
 
 /******************************************************************************/
index 402272796d07e795efb7cba7c61d822f950a0c30..2cfa6a6825ae2b3571a65caea823abcb331f110c 100644 (file)
@@ -2467,6 +2467,9 @@ _glcpp_parser_handle_version_declaration(glcpp_parser_t *parser, intmax_t versio
 
          if (extensions->ARB_cull_distance)
             add_builtin_define(parser, "GL_ARB_cull_distance", 1);
+
+         if (extensions->ARB_shader_group_vote)
+            add_builtin_define(parser, "GL_ARB_shader_group_vote", 1);
       }
    }
 
index ba658aec23fe2340a5145014397b6f146efc886d..fde8c193597453ba6943b9c85e155965c8353279 100644 (file)
@@ -594,6 +594,7 @@ static const _mesa_glsl_extension _mesa_glsl_supported_extensions[] = {
    EXT(ARB_shader_bit_encoding,          true,  false,     ARB_shader_bit_encoding),
    EXT(ARB_shader_clock,                 true,  false,     ARB_shader_clock),
    EXT(ARB_shader_draw_parameters,       true,  false,     ARB_shader_draw_parameters),
+   EXT(ARB_shader_group_vote,            true,  false,     ARB_shader_group_vote),
    EXT(ARB_shader_image_load_store,      true,  false,     ARB_shader_image_load_store),
    EXT(ARB_shader_image_size,            true,  false,     ARB_shader_image_size),
    EXT(ARB_shader_precision,             true,  false,     ARB_shader_precision),
index a0c19033ac66771d4ed672332a7fe5c945787843..8c43292d8aa3a544642d8f4a36d655aa56c65302 100644 (file)
@@ -575,6 +575,8 @@ struct _mesa_glsl_parse_state {
    bool ARB_shader_clock_warn;
    bool ARB_shader_draw_parameters_enable;
    bool ARB_shader_draw_parameters_warn;
+   bool ARB_shader_group_vote_enable;
+   bool ARB_shader_group_vote_warn;
    bool ARB_shader_image_load_store_enable;
    bool ARB_shader_image_load_store_warn;
    bool ARB_shader_image_size_enable;
index 5bb3ac3c214f8e7caf12153378bca34eb083a212..7961f00ffd1371a4322b663c2b948a561994bb69 100644 (file)
@@ -341,6 +341,12 @@ ir_expression::ir_expression(int op, ir_rvalue *op0)
       this->type = glsl_type::int_type;
       break;
 
+   case ir_unop_vote_any:
+   case ir_unop_vote_all:
+   case ir_unop_vote_eq:
+      this->type = glsl_type::bool_type;
+      break;
+
    default:
       assert(!"not reached: missing automatic type setup for ir_expression");
       this->type = op0->type;
@@ -563,6 +569,9 @@ static const char *const operator_strs[] = {
    "interpolate_at_centroid",
    "get_buffer_size",
    "ssbo_unsized_array_length",
+   "vote_any",
+   "vote_all",
+   "vote_eq",
    "+",
    "-",
    "*",
index 2afa94cf17077e8ba0d48278345ab40910d22935..36293563e25c5e7e8be86438b91e51cb3511ffb2 100644 (file)
@@ -1481,10 +1481,17 @@ enum ir_expression_operation {
     */
    ir_unop_ssbo_unsized_array_length,
 
+   /**
+    * Vote among threads on the value of the boolean argument.
+    */
+   ir_unop_vote_any,
+   ir_unop_vote_all,
+   ir_unop_vote_eq,
+
    /**
     * A sentinel marking the last of the unary operations.
     */
-   ir_last_unop = ir_unop_ssbo_unsized_array_length,
+   ir_last_unop = ir_unop_vote_eq,
 
    ir_binop_add,
    ir_binop_sub,
index 757f17cbf38ddd1332813b486e74de530c1b043c..126f9bf227a6adac764557c39c88506498d04cf8 100644 (file)
@@ -453,6 +453,14 @@ ir_validate::visit_leave(ir_expression *ir)
       assert(ir->operands[0]->type->base_type == GLSL_TYPE_SUBROUTINE);
       assert(ir->type->base_type == GLSL_TYPE_INT);
       break;
+
+   case ir_unop_vote_any:
+   case ir_unop_vote_all:
+   case ir_unop_vote_eq:
+      assert(ir->type == glsl_type::bool_type);
+      assert(ir->operands[0]->type == glsl_type::bool_type);
+      break;
+
    case ir_binop_add:
    case ir_binop_sub:
    case ir_binop_mul:
index 3d2e61963d83e54ee2d257027deef7a31f23359d..5eac8d4fff37337465dc331fa7abb0219e1e4098 100644 (file)
@@ -433,6 +433,11 @@ ir_channel_expressions_visitor::visit_leave(ir_assignment *ir)
    case ir_unop_frexp_sig:
    case ir_unop_frexp_exp:
       unreachable("should have been lowered by lower_instructions");
+
+   case ir_unop_vote_any:
+   case ir_unop_vote_all:
+   case ir_unop_vote_eq:
+      unreachable("unsupported");
    }
 
    ir->remove();
index 7dd025afb8ba7cae0468b3eeac550f169035f602..ea8eb306f592195a5b8e62b198c27ccc349c5451 100644 (file)
@@ -105,6 +105,7 @@ EXT(ARB_shader_atomic_counters              , ARB_shader_atomic_counters
 EXT(ARB_shader_bit_encoding                 , ARB_shader_bit_encoding                , GLL, GLC,  x ,  x , 2010)
 EXT(ARB_shader_clock                        , ARB_shader_clock                       , GLL, GLC,  x ,  x , 2015)
 EXT(ARB_shader_draw_parameters              , ARB_shader_draw_parameters             , GLL, GLC,  x ,  x , 2013)
+EXT(ARB_shader_group_vote                   , ARB_shader_group_vote                  , GLL, GLC,  x ,  x , 2013)
 EXT(ARB_shader_image_load_store             , ARB_shader_image_load_store            , GLL, GLC,  x ,  x , 2011)
 EXT(ARB_shader_image_size                   , ARB_shader_image_size                  , GLL, GLC,  x ,  x , 2012)
 EXT(ARB_shader_objects                      , dummy_true                             , GLL, GLC,  x ,  x , 2002)
index 0f9b01dd4775b7aa5acd37474dbad0e7d6207df3..471d41d44358b28fe8f6141eeae776986cfe7fc0 100644 (file)
@@ -3834,6 +3834,7 @@ struct gl_extensions
    GLboolean ARB_shader_bit_encoding;
    GLboolean ARB_shader_clock;
    GLboolean ARB_shader_draw_parameters;
+   GLboolean ARB_shader_group_vote;
    GLboolean ARB_shader_image_load_store;
    GLboolean ARB_shader_image_size;
    GLboolean ARB_shader_precision;
index 7f24a9e16e4fbc8e3b3fe614f7d40352436edaed..b10648ba9d929931d0a5d226825f1dafb15705a0 100644 (file)
@@ -1375,6 +1375,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_vote_any:
+   case ir_unop_vote_all:
+   case ir_unop_vote_eq:
       assert(!"not supported");
       break;
 
index 06eb6f159b02200ed03acb0d3ce379ce84262e55..92b0f8c9a16fb746f5c6885d703af8ebf13ace77 100644 (file)
@@ -2251,6 +2251,10 @@ glsl_to_tgsi_visitor::visit_expression(ir_expression* ir, st_src_reg *op)
    case ir_binop_carry:
    case ir_binop_borrow:
    case ir_unop_ssbo_unsized_array_length:
+
+   case ir_unop_vote_any:
+   case ir_unop_vote_all:
+   case ir_unop_vote_eq:
       /* This operation is not supported, or should have already been handled.
        */
       assert(!"Invalid ir opcode in glsl_to_tgsi_visitor::visit()");