From 9d651d2a0f85e8fbe760faebb9376af94d0fc731 Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Tue, 12 Jan 2021 16:40:41 -0500 Subject: [PATCH] zink: clamp sampler+samplerview limits * struct shader_info provides a 32bit mask for textures_used * samplers and samplerviews are a 1:1 mapping for shader descriptors * also according to spec this is always 32 per stage Reviewed-by: Erik Faye-Lund Part-of: --- .../drivers/zink/nir_to_spirv/nir_to_spirv.c | 4 ++-- src/gallium/drivers/zink/zink_compiler.h | 2 +- src/gallium/drivers/zink/zink_context.h | 2 +- src/gallium/drivers/zink/zink_draw.c | 8 ++++---- src/gallium/drivers/zink/zink_screen.c | 20 ++++--------------- 5 files changed, 12 insertions(+), 24 deletions(-) diff --git a/src/gallium/drivers/zink/nir_to_spirv/nir_to_spirv.c b/src/gallium/drivers/zink/nir_to_spirv/nir_to_spirv.c index 148acc388d3..ba44de46503 100644 --- a/src/gallium/drivers/zink/nir_to_spirv/nir_to_spirv.c +++ b/src/gallium/drivers/zink/nir_to_spirv/nir_to_spirv.c @@ -547,7 +547,7 @@ zink_binding(gl_shader_stage stage, VkDescriptorType type, int index) unreachable("not supported"); } else { uint32_t stage_offset = (uint32_t)stage * (PIPE_MAX_CONSTANT_BUFFERS + - PIPE_MAX_SHADER_SAMPLER_VIEWS); + PIPE_MAX_SAMPLERS); switch (type) { case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER: @@ -556,7 +556,7 @@ zink_binding(gl_shader_stage stage, VkDescriptorType type, int index) case VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER: case VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER: - assert(index < PIPE_MAX_SHADER_SAMPLER_VIEWS); + assert(index < PIPE_MAX_SAMPLERS); return stage_offset + PIPE_MAX_CONSTANT_BUFFERS + index; default: diff --git a/src/gallium/drivers/zink/zink_compiler.h b/src/gallium/drivers/zink/zink_compiler.h index bb03fcceb0a..afda418ebe2 100644 --- a/src/gallium/drivers/zink/zink_compiler.h +++ b/src/gallium/drivers/zink/zink_compiler.h @@ -69,7 +69,7 @@ struct zink_shader { int binding; VkDescriptorType type; unsigned char size; - } bindings[PIPE_MAX_CONSTANT_BUFFERS + PIPE_MAX_SHADER_SAMPLER_VIEWS]; + } bindings[PIPE_MAX_CONSTANT_BUFFERS + PIPE_MAX_SAMPLERS]; size_t num_bindings; struct set *programs; diff --git a/src/gallium/drivers/zink/zink_context.h b/src/gallium/drivers/zink/zink_context.h index bb038001d7e..3c0352e5eb6 100644 --- a/src/gallium/drivers/zink/zink_context.h +++ b/src/gallium/drivers/zink/zink_context.h @@ -120,7 +120,7 @@ struct zink_context { void *sampler_states[PIPE_SHADER_TYPES][PIPE_MAX_SAMPLERS]; VkSampler samplers[PIPE_SHADER_TYPES][PIPE_MAX_SAMPLERS]; unsigned num_samplers[PIPE_SHADER_TYPES]; - struct pipe_sampler_view *image_views[PIPE_SHADER_TYPES][PIPE_MAX_SHADER_SAMPLER_VIEWS]; + struct pipe_sampler_view *image_views[PIPE_SHADER_TYPES][PIPE_MAX_SAMPLERS]; unsigned num_image_views[PIPE_SHADER_TYPES]; float line_width; diff --git a/src/gallium/drivers/zink/zink_draw.c b/src/gallium/drivers/zink/zink_draw.c index 9e0768d0082..542140de606 100644 --- a/src/gallium/drivers/zink/zink_draw.c +++ b/src/gallium/drivers/zink/zink_draw.c @@ -309,14 +309,14 @@ zink_draw_vbo(struct pipe_context *pctx, } } - VkWriteDescriptorSet wds[PIPE_SHADER_TYPES * PIPE_MAX_CONSTANT_BUFFERS + PIPE_SHADER_TYPES * PIPE_MAX_SHADER_SAMPLER_VIEWS]; - struct zink_resource *write_desc_resources[PIPE_SHADER_TYPES * PIPE_MAX_CONSTANT_BUFFERS + PIPE_SHADER_TYPES * PIPE_MAX_SHADER_SAMPLER_VIEWS]; + VkWriteDescriptorSet wds[PIPE_SHADER_TYPES * PIPE_MAX_CONSTANT_BUFFERS + PIPE_SHADER_TYPES * PIPE_MAX_SAMPLERS]; + struct zink_resource *write_desc_resources[PIPE_SHADER_TYPES * PIPE_MAX_CONSTANT_BUFFERS + PIPE_SHADER_TYPES * PIPE_MAX_SAMPLERS]; VkDescriptorBufferInfo buffer_infos[PIPE_SHADER_TYPES * PIPE_MAX_CONSTANT_BUFFERS]; - VkDescriptorImageInfo image_infos[PIPE_SHADER_TYPES * PIPE_MAX_SHADER_SAMPLER_VIEWS]; + VkDescriptorImageInfo image_infos[PIPE_SHADER_TYPES * PIPE_MAX_SAMPLERS]; VkBufferView buffer_view[] = {VK_NULL_HANDLE}; int num_wds = 0, num_buffer_info = 0, num_image_info = 0; - struct zink_resource *transitions[PIPE_SHADER_TYPES * PIPE_MAX_SHADER_SAMPLER_VIEWS]; + struct zink_resource *transitions[PIPE_SHADER_TYPES * PIPE_MAX_SAMPLERS]; int num_transitions = 0; for (int i = 0; i < ARRAY_SIZE(ctx->gfx_stages); i++) { diff --git a/src/gallium/drivers/zink/zink_screen.c b/src/gallium/drivers/zink/zink_screen.c index 3db568c182f..19ca15f8031 100644 --- a/src/gallium/drivers/zink/zink_screen.c +++ b/src/gallium/drivers/zink/zink_screen.c @@ -477,20 +477,6 @@ zink_get_shader_param(struct pipe_screen *pscreen, return MIN2(max, 64); // prevent overflowing struct shader_info::outputs_read/written } - case PIPE_SHADER_CAP_MAX_TEXTURE_SAMPLERS: - switch (shader) { - case PIPE_SHADER_VERTEX: - case PIPE_SHADER_FRAGMENT: - case PIPE_SHADER_GEOMETRY: - case PIPE_SHADER_TESS_CTRL: - case PIPE_SHADER_TESS_EVAL: - /* this might be a bit simplistic... */ - return MIN2(screen->info.props.limits.maxPerStageDescriptorSamplers, - PIPE_MAX_SAMPLERS); - default: - return 0; /* unsupported stage */ - } - case PIPE_SHADER_CAP_MAX_CONST_BUFFER_SIZE: return 65536; @@ -524,9 +510,11 @@ zink_get_shader_param(struct pipe_screen *pscreen, case PIPE_SHADER_CAP_TGSI_SQRT_SUPPORTED: return 0; /* not implemented */ + case PIPE_SHADER_CAP_MAX_TEXTURE_SAMPLERS: case PIPE_SHADER_CAP_MAX_SAMPLER_VIEWS: - return MIN2(screen->info.props.limits.maxPerStageDescriptorSampledImages, - PIPE_MAX_SHADER_SAMPLER_VIEWS); + return MIN2(MIN2(screen->info.props.limits.maxPerStageDescriptorSamplers, + screen->info.props.limits.maxPerStageDescriptorSampledImages), + PIPE_MAX_SAMPLERS); case PIPE_SHADER_CAP_TGSI_DROUND_SUPPORTED: case PIPE_SHADER_CAP_TGSI_DFRACEXP_DLDEXP_SUPPORTED: