From b2a988147532524ce7321ba56238d003dbc39bbd Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Thu, 3 Aug 2023 07:36:00 -0400 Subject: [PATCH] zink: use VK_WHOLE_SIZE when binding null db buffer descriptors using range=0 is illegal cc: mesa-stable Part-of: --- src/gallium/drivers/zink/zink_context.c | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/src/gallium/drivers/zink/zink_context.c b/src/gallium/drivers/zink/zink_context.c index 8dcf1ef..610a0e3 100644 --- a/src/gallium/drivers/zink/zink_context.c +++ b/src/gallium/drivers/zink/zink_context.c @@ -628,8 +628,9 @@ update_descriptor_state_ubo(struct zink_context *ctx, gl_shader_stage shader, un ctx->di.db.ubos[shader][slot].address = res->obj->bda + ctx->ubos[shader][slot].buffer_offset; else ctx->di.db.ubos[shader][slot].address = 0; - ctx->di.db.ubos[shader][slot].range = ctx->ubos[shader][slot].buffer_size; - assert(ctx->di.db.ubos[shader][slot].range <= screen->info.props.limits.maxUniformBufferRange); + ctx->di.db.ubos[shader][slot].range = res ? ctx->ubos[shader][slot].buffer_size : VK_WHOLE_SIZE; + assert(ctx->di.db.ubos[shader][slot].range == VK_WHOLE_SIZE || + ctx->di.db.ubos[shader][slot].range <= screen->info.props.limits.maxUniformBufferRange); } else { ctx->di.t.ubos[shader][slot].offset = ctx->ubos[shader][slot].buffer_offset; if (res) { @@ -663,7 +664,7 @@ update_descriptor_state_ssbo(struct zink_context *ctx, gl_shader_stage shader, u ctx->di.db.ssbos[shader][slot].address = res->obj->bda + ctx->ssbos[shader][slot].buffer_offset; else ctx->di.db.ssbos[shader][slot].address = 0; - ctx->di.db.ssbos[shader][slot].range = ctx->ssbos[shader][slot].buffer_size; + ctx->di.db.ssbos[shader][slot].range = res ? ctx->ssbos[shader][slot].buffer_size : VK_WHOLE_SIZE; } else { ctx->di.t.ssbos[shader][slot].offset = ctx->ssbos[shader][slot].buffer_offset; if (res) { @@ -718,6 +719,7 @@ update_descriptor_state_sampler(struct zink_context *ctx, gl_shader_stage shader ctx->di.textures[shader][slot].imageLayout = VK_IMAGE_LAYOUT_UNDEFINED; if (zink_descriptor_mode == ZINK_DESCRIPTOR_MODE_DB) { ctx->di.db.tbos[shader][slot].address = 0; + ctx->di.db.tbos[shader][slot].range = VK_WHOLE_SIZE; } else { ctx->di.t.tbos[shader][slot] = VK_NULL_HANDLE; } @@ -765,10 +767,12 @@ update_descriptor_state_image(struct zink_context *ctx, gl_shader_stage shader, } else { if (likely(have_null_descriptors)) { memset(&ctx->di.images[shader][slot], 0, sizeof(ctx->di.images[shader][slot])); - if (zink_descriptor_mode == ZINK_DESCRIPTOR_MODE_DB) + if (zink_descriptor_mode == ZINK_DESCRIPTOR_MODE_DB) { ctx->di.db.texel_images[shader][slot].address = 0; - else + ctx->di.db.texel_images[shader][slot].range = VK_WHOLE_SIZE; + } else { ctx->di.t.texel_images[shader][slot] = VK_NULL_HANDLE; + } } else { assert(zink_descriptor_mode != ZINK_DESCRIPTOR_MODE_DB); struct zink_surface *null_surface = zink_get_dummy_surface(ctx, 0); -- 2.7.4