Old-style images are identified using TGSI_FILE_IMAGE, but bindless images can be TGSI_FILE_CONSTANT or TGSI_FILE_TEMPORARY.
To avoid backend compilers to be confused, this adds a new flag that will only be set for bindless images. Signed-off-by: Samuel Pitoiset <samuel.pitoi...@gmail.com> --- src/gallium/auxiliary/tgsi/tgsi_build.c | 4 ++++ src/gallium/auxiliary/tgsi/tgsi_ureg.c | 10 +++++++--- src/gallium/auxiliary/tgsi/tgsi_ureg.h | 6 ++++-- src/gallium/include/pipe/p_shader_tokens.h | 3 ++- src/mesa/state_tracker/st_glsl_to_tgsi.cpp | 4 ++-- src/mesa/state_tracker/st_pbo.c | 2 +- 6 files changed, 20 insertions(+), 9 deletions(-) diff --git a/src/gallium/auxiliary/tgsi/tgsi_build.c b/src/gallium/auxiliary/tgsi/tgsi_build.c index be1931e482..1aa2fd12d4 100644 --- a/src/gallium/auxiliary/tgsi/tgsi_build.c +++ b/src/gallium/auxiliary/tgsi/tgsi_build.c @@ -759,6 +759,7 @@ tgsi_default_instruction_memory( void ) instruction_memory.Qualifier = 0; instruction_memory.Texture = 0; instruction_memory.Format = 0; + instruction_memory.Bindless = 0; instruction_memory.Padding = 0; return instruction_memory; @@ -769,6 +770,7 @@ tgsi_build_instruction_memory( unsigned qualifier, unsigned texture, unsigned format, + unsigned bindless, struct tgsi_token *prev_token, struct tgsi_instruction *instruction, struct tgsi_header *header ) @@ -778,6 +780,7 @@ tgsi_build_instruction_memory( instruction_memory.Qualifier = qualifier; instruction_memory.Texture = texture; instruction_memory.Format = format; + instruction_memory.Bindless = bindless; instruction_memory.Padding = 0; instruction->Memory = 1; @@ -1137,6 +1140,7 @@ tgsi_build_full_instruction( full_inst->Memory.Qualifier, full_inst->Memory.Texture, full_inst->Memory.Format, + full_inst->Memory.Bindless, prev_token, instruction, header ); diff --git a/src/gallium/auxiliary/tgsi/tgsi_ureg.c b/src/gallium/auxiliary/tgsi/tgsi_ureg.c index 8efa95f009..faed1e2708 100644 --- a/src/gallium/auxiliary/tgsi/tgsi_ureg.c +++ b/src/gallium/auxiliary/tgsi/tgsi_ureg.c @@ -1324,7 +1324,8 @@ ureg_emit_memory(struct ureg_program *ureg, unsigned extended_token, unsigned qualifier, unsigned texture, - unsigned format) + unsigned format, + unsigned bindless) { union tgsi_any_token *out, *insn; @@ -1337,6 +1338,7 @@ ureg_emit_memory(struct ureg_program *ureg, out[0].insn_memory.Qualifier = qualifier; out[0].insn_memory.Texture = texture; out[0].insn_memory.Format = format; + out[0].insn_memory.Bindless = bindless; } void @@ -1437,7 +1439,8 @@ ureg_memory_insn(struct ureg_program *ureg, unsigned nr_src, unsigned qualifier, unsigned texture, - unsigned format) + unsigned format, + unsigned bindless) { struct ureg_emit_insn_result insn; unsigned i; @@ -1448,7 +1451,8 @@ ureg_memory_insn(struct ureg_program *ureg, nr_dst, nr_src); - ureg_emit_memory(ureg, insn.extended_token, qualifier, texture, format); + ureg_emit_memory(ureg, insn.extended_token, qualifier, texture, format, + bindless); for (i = 0; i < nr_dst; i++) ureg_emit_dst(ureg, dst[i]); diff --git a/src/gallium/auxiliary/tgsi/tgsi_ureg.h b/src/gallium/auxiliary/tgsi/tgsi_ureg.h index 9e30a41ff7..fe8620149a 100644 --- a/src/gallium/auxiliary/tgsi/tgsi_ureg.h +++ b/src/gallium/auxiliary/tgsi/tgsi_ureg.h @@ -572,7 +572,8 @@ ureg_memory_insn(struct ureg_program *ureg, unsigned nr_src, unsigned qualifier, unsigned texture, - unsigned format); + unsigned format, + unsigned bindless); /*********************************************************************** * Internal instruction helpers, don't call these directly: @@ -610,7 +611,8 @@ ureg_emit_memory(struct ureg_program *ureg, unsigned insn_token, unsigned qualifier, unsigned texture, - unsigned format); + unsigned format, + unsigned bindless); void ureg_emit_dst( struct ureg_program *ureg, diff --git a/src/gallium/include/pipe/p_shader_tokens.h b/src/gallium/include/pipe/p_shader_tokens.h index 2665eb4235..a4c68b1dbb 100644 --- a/src/gallium/include/pipe/p_shader_tokens.h +++ b/src/gallium/include/pipe/p_shader_tokens.h @@ -797,7 +797,8 @@ struct tgsi_instruction_memory unsigned Qualifier : 3; /* TGSI_MEMORY_ */ unsigned Texture : 8; /* only for images: TGSI_TEXTURE_ */ unsigned Format : 10; /* only for images: PIPE_FORMAT_ */ - unsigned Padding : 11; + unsigned Bindless : 1; /* only for images: whether it's bindless */ + unsigned Padding : 10; }; #define TGSI_MEMBAR_SHADER_BUFFER (1 << 0) diff --git a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp index 4e6678c8ac..ef6597e083 100644 --- a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp +++ b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp @@ -5904,7 +5904,7 @@ compile_tgsi_instruction(struct st_translate *t, assert(src[0].File != TGSI_FILE_NULL); ureg_memory_insn(ureg, inst->op, dst, num_dst, src, num_src, inst->buffer_access, - tex_target, inst->image_format); + tex_target, inst->image_format, 0); break; case TGSI_OPCODE_STORE: @@ -5922,7 +5922,7 @@ compile_tgsi_instruction(struct st_translate *t, assert(dst[0].File != TGSI_FILE_NULL); ureg_memory_insn(ureg, inst->op, dst, num_dst, src, num_src, inst->buffer_access, - tex_target, inst->image_format); + tex_target, inst->image_format, 0); break; case TGSI_OPCODE_SCS: diff --git a/src/mesa/state_tracker/st_pbo.c b/src/mesa/state_tracker/st_pbo.c index 303c8535b2..3dff1609e8 100644 --- a/src/mesa/state_tracker/st_pbo.c +++ b/src/mesa/state_tracker/st_pbo.c @@ -528,7 +528,7 @@ create_fs(struct st_context *st, bool download, enum pipe_texture_target target, op[0] = ureg_src(temp0); op[1] = ureg_src(temp1); ureg_memory_insn(ureg, TGSI_OPCODE_STORE, &out, 1, op, 2, 0, - TGSI_TEXTURE_BUFFER, PIPE_FORMAT_NONE); + TGSI_TEXTURE_BUFFER, PIPE_FORMAT_NONE, 0); ureg_release_temporary(ureg, temp1); } else { -- 2.13.0 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev