[Mesa-dev] [PATCH] glsl: use a subroutine->int conversion unop
Dave Airlie
airlied at gmail.com
Mon Jun 1 17:16:11 PDT 2015
From: Dave Airlie <airlied at redhat.com>
This is what it looks like, seems to work fine.
Signed-off-by: Dave Airlie <airlied at redhat.com>
---
src/glsl/ir.cpp | 4 +++-
src/glsl/ir.h | 1 +
src/glsl/ir_builder.cpp | 6 ++++++
src/glsl/ir_builder.h | 1 +
src/glsl/ir_validate.cpp | 10 ++++++----
src/glsl/lower_subroutine.cpp | 4 ++--
src/mesa/state_tracker/st_glsl_to_tgsi.cpp | 3 +++
7 files changed, 22 insertions(+), 7 deletions(-)
diff --git a/src/glsl/ir.cpp b/src/glsl/ir.cpp
index 45efed9..2fbc631 100644
--- a/src/glsl/ir.cpp
+++ b/src/glsl/ir.cpp
@@ -260,6 +260,7 @@ ir_expression::ir_expression(int op, ir_rvalue *op0)
case ir_unop_bit_count:
case ir_unop_find_msb:
case ir_unop_find_lsb:
+ case ir_unop_subroutine_to_int:
this->type = glsl_type::get_instance(GLSL_TYPE_INT,
op0->type->vector_elements, 1);
break;
@@ -411,7 +412,7 @@ ir_expression::ir_expression(int op, ir_rvalue *op0, ir_rvalue *op1)
case ir_binop_gequal:
case ir_binop_less:
case ir_binop_greater:
- assert(op0->type->is_subroutine() || op0->type == op1->type);
+ assert(op0->type == op1->type);
this->type = glsl_type::get_instance(GLSL_TYPE_BOOL,
op0->type->vector_elements, 1);
break;
@@ -568,6 +569,7 @@ static const char *const operator_strs[] = {
"frexp_sig",
"frexp_exp",
"noise",
+ "subroutine_to_int",
"interpolate_at_centroid",
"+",
"-",
diff --git a/src/glsl/ir.h b/src/glsl/ir.h
index 106c7fb..cb4c594 100644
--- a/src/glsl/ir.h
+++ b/src/glsl/ir.h
@@ -1395,6 +1395,7 @@ enum ir_expression_operation {
ir_unop_noise,
+ ir_unop_subroutine_to_int,
/**
* Interpolate fs input at centroid
*
diff --git a/src/glsl/ir_builder.cpp b/src/glsl/ir_builder.cpp
index e44b05c..cd03859 100644
--- a/src/glsl/ir_builder.cpp
+++ b/src/glsl/ir_builder.cpp
@@ -338,6 +338,12 @@ sign(operand a)
return expr(ir_unop_sign, a);
}
+ir_expression *
+subr_to_int(operand a)
+{
+ return expr(ir_unop_subroutine_to_int, a);
+}
+
ir_expression*
equal(operand a, operand b)
{
diff --git a/src/glsl/ir_builder.h b/src/glsl/ir_builder.h
index 8702658..f76453f 100644
--- a/src/glsl/ir_builder.h
+++ b/src/glsl/ir_builder.h
@@ -153,6 +153,7 @@ ir_expression *sqrt(operand a);
ir_expression *log(operand a);
ir_expression *sign(operand a);
+ir_expression *subr_to_int(operand a);
ir_expression *equal(operand a, operand b);
ir_expression *nequal(operand a, operand b);
ir_expression *less(operand a, operand b);
diff --git a/src/glsl/ir_validate.cpp b/src/glsl/ir_validate.cpp
index ec288d4..49f4f70 100644
--- a/src/glsl/ir_validate.cpp
+++ b/src/glsl/ir_validate.cpp
@@ -447,6 +447,10 @@ ir_validate::visit_leave(ir_expression *ir)
ir->operands[0]->type->base_type == GLSL_TYPE_DOUBLE);
assert(ir->type->base_type == GLSL_TYPE_INT);
break;
+ case ir_unop_subroutine_to_int:
+ assert(ir->operands[0]->type->base_type == GLSL_TYPE_SUBROUTINE);
+ assert(ir->type->base_type == GLSL_TYPE_INT);
+ break;
case ir_binop_add:
case ir_binop_sub:
case ir_binop_mul:
@@ -494,11 +498,9 @@ ir_validate::visit_leave(ir_expression *ir)
* vector type of the same size.
*/
assert(ir->type->base_type == GLSL_TYPE_BOOL);
- assert(ir->operands[0]->type->is_subroutine()
- || ir->operands[0]->type == ir->operands[1]->type);
+ assert(ir->operands[0]->type == ir->operands[1]->type);
assert(ir->operands[0]->type->is_vector()
- || ir->operands[0]->type->is_scalar()
- || ir->operands[0]->type->is_subroutine());
+ || ir->operands[0]->type->is_scalar());
assert(ir->operands[0]->type->vector_elements
== ir->type->vector_elements);
break;
diff --git a/src/glsl/lower_subroutine.cpp b/src/glsl/lower_subroutine.cpp
index 8480bb9..e5635a2 100644
--- a/src/glsl/lower_subroutine.cpp
+++ b/src/glsl/lower_subroutine.cpp
@@ -94,9 +94,9 @@ lower_subroutine_visitor::visit_leave(ir_call *ir)
ir_call *new_call = new(mem_ctx) ir_call(sub_sig, return_deref, &ir->actual_parameters);
if (!last_branch)
- last_branch = if_tree(equal(var, lc), new_call);
+ last_branch = if_tree(equal(subr_to_int(var), lc), new_call);
else
- last_branch = if_tree(equal(var, lc), new_call, last_branch);
+ last_branch = if_tree(equal(subr_to_int(var), lc), new_call, last_branch);
if (s > 0)
return_deref = return_deref->clone(mem_ctx, NULL);
diff --git a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
index 31757dc..4b2e682 100644
--- a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
+++ b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
@@ -1486,6 +1486,9 @@ glsl_to_tgsi_visitor::visit(ir_expression *ir)
result_src = op[0];
}
break;
+ case ir_unop_subroutine_to_int:
+ emit(ir, TGSI_OPCODE_MOV, result_dst, op[0]);
+ break;
case ir_unop_abs:
emit(ir, TGSI_OPCODE_ABS, result_dst, op[0]);
break;
--
2.1.0
More information about the mesa-dev
mailing list