nir: Implement ir_unop_get_buffer_size

This is how backends provide the buffer size required to compute
the size of unsized arrays in the previous patch

Signed-off-by: Samuel Iglesias Gonsalvez <siglesias@igalia.com>
Reviewed-by: Kristian Høgsberg <krh@bitplanet.net>
This commit is contained in:
Samuel Iglesias Gonsalvez
2015-06-01 09:44:55 +02:00
parent 750c694474
commit 003ce30e36
2 changed files with 17 additions and 0 deletions

View File

@@ -1322,6 +1322,16 @@ nir_visitor::visit(ir_expression *ir)
unreachable("not reached"); unreachable("not reached");
} }
break; break;
case ir_unop_get_buffer_size: {
nir_intrinsic_instr *load = nir_intrinsic_instr_create(
this->shader,
nir_intrinsic_get_buffer_size);
load->num_components = ir->type->vector_elements;
load->src[0] = evaluate_rvalue(ir->operands[0]);
add_instr(&load->instr, ir->type->vector_elements);
return;
}
case ir_binop_add: case ir_binop_add:
case ir_binop_sub: case ir_binop_sub:
case ir_binop_mul: case ir_binop_mul:

View File

@@ -61,6 +61,13 @@ INTRINSIC(interp_var_at_sample, 1, ARR(1), true, 0, 1, 0,
INTRINSIC(interp_var_at_offset, 1, ARR(2), true, 0, 1, 0, INTRINSIC(interp_var_at_offset, 1, ARR(2), true, 0, 1, 0,
NIR_INTRINSIC_CAN_ELIMINATE | NIR_INTRINSIC_CAN_REORDER) NIR_INTRINSIC_CAN_ELIMINATE | NIR_INTRINSIC_CAN_REORDER)
/*
* Ask the driver for the size of a given buffer. It takes the buffer index
* as source.
*/
INTRINSIC(get_buffer_size, 1, ARR(1), true, 1, 0, 0,
NIR_INTRINSIC_CAN_ELIMINATE | NIR_INTRINSIC_CAN_REORDER)
/* /*
* a barrier is an intrinsic with no inputs/outputs but which can't be moved * a barrier is an intrinsic with no inputs/outputs but which can't be moved
* around/optimized in general * around/optimized in general