From 968e360e4706d4d84311f7bfdfdfd04a3af0f92d Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Tue, 4 Aug 2020 15:42:43 -0400 Subject: [PATCH] zink: track custom border color samplers and verify against device limits Reviewed-by: Erik Faye-Lund Part-of: --- src/gallium/drivers/zink/zink_context.c | 18 ++++++++++++++---- src/gallium/drivers/zink/zink_screen.h | 3 +++ 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/src/gallium/drivers/zink/zink_context.c b/src/gallium/drivers/zink/zink_context.c index 1dc2826d18e..69b4846478f 100644 --- a/src/gallium/drivers/zink/zink_context.c +++ b/src/gallium/drivers/zink/zink_context.c @@ -159,6 +159,11 @@ wrap_needs_border_color(unsigned wrap) wrap == PIPE_TEX_WRAP_MIRROR_CLAMP || wrap == PIPE_TEX_WRAP_MIRROR_CLAMP_TO_BORDER; } +struct zink_sampler_state { + VkSampler sampler; + bool custom_border_color; +}; + static void * zink_create_sampler_state(struct pipe_context *pctx, const struct pipe_sampler_state *state) @@ -206,6 +211,8 @@ zink_create_sampler_state(struct pipe_context *pctx, memcpy(&cbci.customBorderColor, &state->border_color, sizeof(union pipe_color_union)); sci.pNext = &cbci; sci.borderColor = VK_BORDER_COLOR_INT_CUSTOM_EXT; + UNUSED uint32_t check = p_atomic_inc_return(&screen->cur_custom_border_color_samplers); + assert(check <= screen->info.border_color_props.maxCustomBorderColorSamplers); } else sci.borderColor = VK_BORDER_COLOR_FLOAT_TRANSPARENT_BLACK; // TODO with custom shader if we're super interested? sci.unnormalizedCoordinates = !state->normalized_coords; @@ -215,11 +222,11 @@ zink_create_sampler_state(struct pipe_context *pctx, sci.anisotropyEnable = VK_TRUE; } - VkSampler *sampler = CALLOC(1, sizeof(VkSampler)); + struct zink_sampler_state *sampler = CALLOC(1, sizeof(struct zink_sampler_state)); if (!sampler) return NULL; - if (vkCreateSampler(screen->dev, &sci, NULL, sampler) != VK_SUCCESS) { + if (vkCreateSampler(screen->dev, &sci, NULL, &sampler->sampler) != VK_SUCCESS) { FREE(sampler); return NULL; } @@ -247,10 +254,13 @@ static void zink_delete_sampler_state(struct pipe_context *pctx, void *sampler_state) { + struct zink_sampler_state *sampler = sampler_state; struct zink_batch *batch = zink_curr_batch(zink_context(pctx)); util_dynarray_append(&batch->zombie_samplers, VkSampler, - *(VkSampler *)sampler_state); - FREE(sampler_state); + sampler->sampler); + if (sampler->custom_border_color) + p_atomic_dec(&zink_screen(pctx->screen)->cur_custom_border_color_samplers); + FREE(sampler); } diff --git a/src/gallium/drivers/zink/zink_screen.h b/src/gallium/drivers/zink/zink_screen.h index 7692763c098..1ee061ebd9d 100644 --- a/src/gallium/drivers/zink/zink_screen.h +++ b/src/gallium/drivers/zink/zink_screen.h @@ -66,8 +66,11 @@ struct zink_screen { VkDevice dev; VkDebugUtilsMessengerEXT debugUtilsCallbackHandle; + uint32_t cur_custom_border_color_samplers; + uint32_t loader_version; bool have_physical_device_prop2_ext; + bool have_debug_utils_ext; bool needs_mesa_wsi;