From 1eff26f02d8579bd45d97ec0c4f4ac1db79fd051 Mon Sep 17 00:00:00 2001 From: Samuel Pitoiset Date: Fri, 21 Apr 2017 14:35:32 +0200 Subject: [PATCH] glsl: add ARB_bindless_texture operations MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit For the explicit pack/unpack conversions. Signed-off-by: Samuel Pitoiset Reviewed-by: Timothy Arceri Reviewed-by: Nicolai Hähnle --- src/compiler/glsl/ir_expression_operation.py | 6 ++++++ src/compiler/glsl/ir_validate.cpp | 20 ++++++++++++++++++++ src/mesa/program/ir_to_mesa.cpp | 4 ++++ src/mesa/state_tracker/st_glsl_to_tgsi.cpp | 5 +++++ 4 files changed, 35 insertions(+) diff --git a/src/compiler/glsl/ir_expression_operation.py b/src/compiler/glsl/ir_expression_operation.py index 0518f9dfbc5..52f2550cad6 100644 --- a/src/compiler/glsl/ir_expression_operation.py +++ b/src/compiler/glsl/ir_expression_operation.py @@ -543,6 +543,12 @@ ir_expression_operation = [ operation("pack_double_2x32", 1, printable_name="packDouble2x32", source_types=(uint_type,), dest_type=double_type, c_expression="memcpy(&data.d[0], &op[0]->value.u[0], sizeof(double))", flags=frozenset((horizontal_operation, non_assign_operation))), operation("unpack_double_2x32", 1, printable_name="unpackDouble2x32", source_types=(double_type,), dest_type=uint_type, c_expression="memcpy(&data.u[0], &op[0]->value.d[0], sizeof(double))", flags=frozenset((horizontal_operation, non_assign_operation))), + # Sampler/Image packing, part of ARB_bindless_texture. + operation("pack_sampler_2x32", 1, printable_name="packSampler2x32", source_types=(uint_type,), dest_type=uint64_type, c_expression="memcpy(&data.u64[0], &op[0]->value.u[0], sizeof(uint64_t))", flags=frozenset((horizontal_operation, non_assign_operation))), + operation("pack_image_2x32", 1, printable_name="packImage2x32", source_types=(uint_type,), dest_type=uint64_type, c_expression="memcpy(&data.u64[0], &op[0]->value.u[0], sizeof(uint64_t))", flags=frozenset((horizontal_operation, non_assign_operation))), + operation("unpack_sampler_2x32", 1, printable_name="unpackSampler2x32", source_types=(uint64_type,), dest_type=uint_type, c_expression="memcpy(&data.u[0], &op[0]->value.u64[0], sizeof(uint64_t))", flags=frozenset((horizontal_operation, non_assign_operation))), + operation("unpack_image_2x32", 1, printable_name="unpackImage2x32", source_types=(uint64_type,), dest_type=uint_type, c_expression="memcpy(&data.u[0], &op[0]->value.u64[0], sizeof(uint64_t))", flags=frozenset((horizontal_operation, non_assign_operation))), + operation("frexp_sig", 1), operation("frexp_exp", 1), diff --git a/src/compiler/glsl/ir_validate.cpp b/src/compiler/glsl/ir_validate.cpp index 8f546372466..6e2f3e5b50d 100644 --- a/src/compiler/glsl/ir_validate.cpp +++ b/src/compiler/glsl/ir_validate.cpp @@ -477,6 +477,16 @@ ir_validate::visit_leave(ir_expression *ir) assert(ir->operands[0]->type == glsl_type::uvec2_type); break; + case ir_unop_pack_sampler_2x32: + assert(ir->type->is_sampler()); + assert(ir->operands[0]->type == glsl_type::uvec2_type); + break; + + case ir_unop_pack_image_2x32: + assert(ir->type->is_image()); + assert(ir->operands[0]->type == glsl_type::uvec2_type); + break; + case ir_unop_unpack_snorm_2x16: case ir_unop_unpack_unorm_2x16: case ir_unop_unpack_half_2x16: @@ -505,6 +515,16 @@ ir_validate::visit_leave(ir_expression *ir) assert(ir->operands[0]->type == glsl_type::uint64_t_type); break; + case ir_unop_unpack_sampler_2x32: + assert(ir->type == glsl_type::uvec2_type); + assert(ir->operands[0]->type->is_sampler()); + break; + + case ir_unop_unpack_image_2x32: + assert(ir->type == glsl_type::uvec2_type); + assert(ir->operands[0]->type->is_image()); + break; + case ir_unop_bitfield_reverse: assert(ir->operands[0]->type == ir->type); assert(ir->type->is_integer()); diff --git a/src/mesa/program/ir_to_mesa.cpp b/src/mesa/program/ir_to_mesa.cpp index be7901e7bca..05b042b4e90 100644 --- a/src/mesa/program/ir_to_mesa.cpp +++ b/src/mesa/program/ir_to_mesa.cpp @@ -1417,6 +1417,10 @@ ir_to_mesa_visitor::visit(ir_expression *ir) case ir_unop_unpack_int_2x32: case ir_unop_pack_uint_2x32: case ir_unop_unpack_uint_2x32: + case ir_unop_pack_sampler_2x32: + case ir_unop_unpack_sampler_2x32: + case ir_unop_pack_image_2x32: + case ir_unop_unpack_image_2x32: assert(!"not supported"); break; diff --git a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp index 81c1d00dfbc..dddf2ec01fa 100644 --- a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp +++ b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp @@ -2486,6 +2486,11 @@ glsl_to_tgsi_visitor::visit_expression(ir_expression* ir, st_src_reg *op) case ir_unop_unpack_snorm_4x8: case ir_unop_unpack_unorm_4x8: + case ir_unop_unpack_sampler_2x32: + case ir_unop_pack_sampler_2x32: + case ir_unop_unpack_image_2x32: + case ir_unop_pack_image_2x32: + case ir_quadop_vector: case ir_binop_vector_extract: case ir_triop_vector_insert: -- 2.30.2