Mesa (main): zink: use descriptor indices in compiler
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Wed May 25 04:15:05 UTC 2022
Module: Mesa
Branch: main
Commit: fe2ba184d8c2024f3558315457d5ca872375d008
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=fe2ba184d8c2024f3558315457d5ca872375d008
Author: Mike Blumenkrantz <michael.blumenkrantz at gmail.com>
Date: Mon May 16 16:56:11 2022 -0400
zink: use descriptor indices in compiler
should be no functional changes, just adding indirection
Reviewed-by: Dave Airlie <airlied at redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/16645>
---
src/gallium/drivers/zink/zink_compiler.c | 72 ++++++++++++++++++--------------
1 file changed, 40 insertions(+), 32 deletions(-)
diff --git a/src/gallium/drivers/zink/zink_compiler.c b/src/gallium/drivers/zink/zink_compiler.c
index 9bb7225bb38..43341070518 100644
--- a/src/gallium/drivers/zink/zink_compiler.c
+++ b/src/gallium/drivers/zink/zink_compiler.c
@@ -1695,30 +1695,35 @@ analyze_io(struct zink_shader *zs, nir_shader *shader)
return ret;
}
+struct zink_bindless_info {
+ nir_variable *bindless[4];
+ unsigned bindless_set;
+};
+
/* this is a "default" bindless texture used if the shader has no texture variables */
static nir_variable *
-create_bindless_texture(nir_shader *nir, nir_tex_instr *tex)
+create_bindless_texture(nir_shader *nir, nir_tex_instr *tex, unsigned descriptor_set)
{
unsigned binding = tex->sampler_dim == GLSL_SAMPLER_DIM_BUF ? 1 : 0;
nir_variable *var;
const struct glsl_type *sampler_type = glsl_sampler_type(tex->sampler_dim, tex->is_shadow, tex->is_array, GLSL_TYPE_FLOAT);
var = nir_variable_create(nir, nir_var_uniform, glsl_array_type(sampler_type, ZINK_MAX_BINDLESS_HANDLES, 0), "bindless_texture");
- var->data.descriptor_set = ZINK_DESCRIPTOR_BINDLESS;
+ var->data.descriptor_set = descriptor_set;
var->data.driver_location = var->data.binding = binding;
return var;
}
/* this is a "default" bindless image used if the shader has no image variables */
static nir_variable *
-create_bindless_image(nir_shader *nir, enum glsl_sampler_dim dim)
+create_bindless_image(nir_shader *nir, enum glsl_sampler_dim dim, unsigned descriptor_set)
{
unsigned binding = dim == GLSL_SAMPLER_DIM_BUF ? 3 : 2;
nir_variable *var;
const struct glsl_type *image_type = glsl_image_type(dim, false, GLSL_TYPE_FLOAT);
var = nir_variable_create(nir, nir_var_image, glsl_array_type(image_type, ZINK_MAX_BINDLESS_HANDLES, 0), "bindless_image");
- var->data.descriptor_set = ZINK_DESCRIPTOR_BINDLESS;
+ var->data.descriptor_set = descriptor_set;
var->data.driver_location = var->data.binding = binding;
var->data.image.format = PIPE_FORMAT_R8G8B8A8_UNORM;
return var;
@@ -1728,7 +1733,7 @@ create_bindless_image(nir_shader *nir, enum glsl_sampler_dim dim)
static bool
lower_bindless_instr(nir_builder *b, nir_instr *in, void *data)
{
- nir_variable **bindless = data;
+ struct zink_bindless_info *bindless = data;
if (in->type == nir_instr_type_tex) {
nir_tex_instr *tex = nir_instr_as_tex(in);
@@ -1736,9 +1741,9 @@ lower_bindless_instr(nir_builder *b, nir_instr *in, void *data)
if (idx == -1)
return false;
- nir_variable *var = tex->sampler_dim == GLSL_SAMPLER_DIM_BUF ? bindless[1] : bindless[0];
+ nir_variable *var = tex->sampler_dim == GLSL_SAMPLER_DIM_BUF ? bindless->bindless[1] : bindless->bindless[0];
if (!var)
- var = create_bindless_texture(b->shader, tex);
+ var = create_bindless_texture(b->shader, tex, bindless->bindless_set);
b->cursor = nir_before_instr(in);
nir_deref_instr *deref = nir_build_deref_var(b, var);
if (glsl_type_is_array(var->type))
@@ -1802,9 +1807,9 @@ lower_bindless_instr(nir_builder *b, nir_instr *in, void *data)
}
enum glsl_sampler_dim dim = nir_intrinsic_image_dim(instr);
- nir_variable *var = dim == GLSL_SAMPLER_DIM_BUF ? bindless[3] : bindless[2];
+ nir_variable *var = dim == GLSL_SAMPLER_DIM_BUF ? bindless->bindless[3] : bindless->bindless[2];
if (!var)
- var = create_bindless_image(b->shader, dim);
+ var = create_bindless_image(b->shader, dim, bindless->bindless_set);
instr->intrinsic = op;
b->cursor = nir_before_instr(in);
nir_deref_instr *deref = nir_build_deref_var(b, var);
@@ -1815,7 +1820,7 @@ lower_bindless_instr(nir_builder *b, nir_instr *in, void *data)
}
static bool
-lower_bindless(nir_shader *shader, nir_variable **bindless)
+lower_bindless(nir_shader *shader, struct zink_bindless_info *bindless)
{
if (!nir_shader_instructions_pass(shader, lower_bindless_instr, nir_metadata_dominance, bindless))
return false;
@@ -1868,7 +1873,7 @@ lower_bindless_io(nir_shader *shader)
}
static uint32_t
-zink_binding(gl_shader_stage stage, VkDescriptorType type, int index)
+zink_binding(gl_shader_stage stage, VkDescriptorType type, int index, bool compact_descriptors)
{
if (stage == MESA_SHADER_NONE) {
unreachable("not supported");
@@ -1884,12 +1889,12 @@ zink_binding(gl_shader_stage stage, VkDescriptorType type, int index)
return (stage * PIPE_MAX_SAMPLERS) + index;
case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER:
- return stage;
+ return stage + (compact_descriptors * (ZINK_SHADER_COUNT * 2));
case VK_DESCRIPTOR_TYPE_STORAGE_IMAGE:
case VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER:
assert(index < ZINK_MAX_SHADER_IMAGES);
- return (stage * ZINK_MAX_SHADER_IMAGES) + index;
+ return (stage * ZINK_MAX_SHADER_IMAGES) + index + (compact_descriptors * (ZINK_SHADER_COUNT * PIPE_MAX_SAMPLERS));
default:
unreachable("unexpected type");
@@ -1898,7 +1903,7 @@ zink_binding(gl_shader_stage stage, VkDescriptorType type, int index)
}
static void
-handle_bindless_var(nir_shader *nir, nir_variable *var, const struct glsl_type *type, nir_variable **bindless)
+handle_bindless_var(nir_shader *nir, nir_variable *var, const struct glsl_type *type, struct zink_bindless_info *bindless)
{
if (glsl_type_is_struct(type)) {
for (unsigned i = 0; i < glsl_get_length(type); i++)
@@ -1928,17 +1933,17 @@ handle_bindless_var(nir_shader *nir, nir_variable *var, const struct glsl_type *
default:
unreachable("unknown");
}
- if (!bindless[binding]) {
- bindless[binding] = nir_variable_clone(var, nir);
- bindless[binding]->data.bindless = 0;
- bindless[binding]->data.descriptor_set = ZINK_DESCRIPTOR_BINDLESS;
- bindless[binding]->type = glsl_array_type(type, ZINK_MAX_BINDLESS_HANDLES, 0);
- bindless[binding]->data.driver_location = bindless[binding]->data.binding = binding;
- if (!bindless[binding]->data.image.format)
- bindless[binding]->data.image.format = PIPE_FORMAT_R8G8B8A8_UNORM;
- nir_shader_add_variable(nir, bindless[binding]);
+ if (!bindless->bindless[binding]) {
+ bindless->bindless[binding] = nir_variable_clone(var, nir);
+ bindless->bindless[binding]->data.bindless = 0;
+ bindless->bindless[binding]->data.descriptor_set = bindless->bindless_set;
+ bindless->bindless[binding]->type = glsl_array_type(type, ZINK_MAX_BINDLESS_HANDLES, 0);
+ bindless->bindless[binding]->data.driver_location = bindless->bindless[binding]->data.binding = binding;
+ if (!bindless->bindless[binding]->data.image.format)
+ bindless->bindless[binding]->data.image.format = PIPE_FORMAT_R8G8B8A8_UNORM;
+ nir_shader_add_variable(nir, bindless->bindless[binding]);
} else {
- assert(glsl_get_sampler_dim(glsl_without_array(bindless[binding]->type)) == glsl_get_sampler_dim(glsl_without_array(var->type)));
+ assert(glsl_get_sampler_dim(glsl_without_array(bindless->bindless[binding]->type)) == glsl_get_sampler_dim(glsl_without_array(var->type)));
}
var->data.mode = nir_var_shader_temp;
}
@@ -2222,7 +2227,8 @@ zink_shader_create(struct zink_screen *screen, struct nir_shader *nir,
fprintf(stderr, "---8<---\n");
}
- nir_variable *bindless[4] = {0};
+ struct zink_bindless_info bindless = {0};
+ bindless.bindless_set = screen->desc_set_id[ZINK_DESCRIPTOR_BINDLESS];
bool has_bindless_io = false;
nir_foreach_variable_with_modes(var, nir, nir_var_shader_in | nir_var_shader_out) {
if (glsl_type_is_image(var->type) || glsl_type_is_sampler(var->type)) {
@@ -2252,7 +2258,8 @@ zink_shader_create(struct zink_screen *screen, struct nir_shader *nir,
var->data.binding = !var->data.driver_location ? nir->info.stage :
zink_binding(nir->info.stage,
VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
- var->data.driver_location);
+ var->data.driver_location,
+ screen->compact_descriptors);
assert(var->data.driver_location || var->data.binding < 10);
VkDescriptorType vktype = !var->data.driver_location ? VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC : VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
int binding = var->data.binding;
@@ -2265,10 +2272,11 @@ zink_shader_create(struct zink_screen *screen, struct nir_shader *nir,
ret->num_bindings[ztype]++;
} else if (var->data.mode == nir_var_mem_ssbo) {
ztype = ZINK_DESCRIPTOR_TYPE_SSBO;
- var->data.descriptor_set = ztype + 1;
+ var->data.descriptor_set = screen->desc_set_id[ztype];
var->data.binding = zink_binding(nir->info.stage,
VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
- var->data.driver_location);
+ var->data.driver_location,
+ screen->compact_descriptors);
ret->bindings[ztype][ret->num_bindings[ztype]].index = var->data.driver_location;
ret->bindings[ztype][ret->num_bindings[ztype]].binding = var->data.binding;
ret->bindings[ztype][ret->num_bindings[ztype]].type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
@@ -2280,15 +2288,15 @@ zink_shader_create(struct zink_screen *screen, struct nir_shader *nir,
var->data.mode == nir_var_image);
if (var->data.bindless) {
ret->bindless = true;
- handle_bindless_var(nir, var, type, bindless);
+ handle_bindless_var(nir, var, type, &bindless);
} else if (glsl_type_is_sampler(type) || glsl_type_is_image(type)) {
VkDescriptorType vktype = glsl_type_is_image(type) ? zink_image_type(type) : zink_sampler_type(type);
ztype = zink_desc_type_from_vktype(vktype);
if (vktype == VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER)
ret->num_texel_buffers++;
var->data.driver_location = var->data.binding;
- var->data.descriptor_set = ztype + 1;
- var->data.binding = zink_binding(nir->info.stage, vktype, var->data.driver_location);
+ var->data.descriptor_set = screen->desc_set_id[ztype];
+ var->data.binding = zink_binding(nir->info.stage, vktype, var->data.driver_location, screen->compact_descriptors);
ret->bindings[ztype][ret->num_bindings[ztype]].index = var->data.driver_location;
ret->bindings[ztype][ret->num_bindings[ztype]].binding = var->data.binding;
ret->bindings[ztype][ret->num_bindings[ztype]].type = vktype;
@@ -2302,7 +2310,7 @@ zink_shader_create(struct zink_screen *screen, struct nir_shader *nir,
}
}
bool bindless_lowered = false;
- NIR_PASS(bindless_lowered, nir, lower_bindless, bindless);
+ NIR_PASS(bindless_lowered, nir, lower_bindless, &bindless);
ret->bindless |= bindless_lowered;
ret->nir = nir;
More information about the mesa-commit
mailing list