mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-25 21:40:08 +01:00
glsl: add ARB_shader_ballot operations
Reviewed-by: Marek Olšák <marek.olsak@amd.com>
This commit is contained in:
parent
b8440ec9fa
commit
d37b7b5232
4 changed files with 38 additions and 0 deletions
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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}"),
|
||||
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue