zink: heap-allocate samplers objects
authorErik Faye-Lund <erik.faye-lund@collabora.com>
Tue, 29 Oct 2019 09:07:53 +0000 (10:07 +0100)
committerErik Faye-Lund <erik.faye-lund@collabora.com>
Thu, 31 Oct 2019 13:57:43 +0000 (13:57 +0000)
VkSampler is 64-bit even on 32-bit systems, so casting it to a pointer
is a bad idea there. So let's heap-allocate the sampler-object instead.

Signed-off-by: Erik Faye-Lund <erik.faye-lund@collabora.com>
Closes: https://gitlab.freedesktop.org/mesa/mesa/issues/2017
Reviewed-by: Witold Baryluk <witold.baryluk@gmail.com>
Tested-by: Witold Baryluk <witold.baryluk@gmail.com>
src/gallium/drivers/zink/zink_context.c

index 9219d019811559ffb726e05cd9d94394ececc235..219605d90a3002236a26121b9ef92452dc81a777 100644 (file)
@@ -162,11 +162,15 @@ zink_create_sampler_state(struct pipe_context *pctx,
       sci.anisotropyEnable = VK_TRUE;
    }
 
-   VkSampler sampler;
-   VkResult err = vkCreateSampler(screen->dev, &sci, NULL, &sampler);
-   if (err != VK_SUCCESS)
+   VkSampler *sampler = CALLOC(1, sizeof(VkSampler));
+   if (!sampler)
       return NULL;
 
+   if (vkCreateSampler(screen->dev, &sci, NULL, sampler) != VK_SUCCESS) {
+      FREE(sampler);
+      return NULL;
+   }
+
    return sampler;
 }
 
@@ -178,8 +182,10 @@ zink_bind_sampler_states(struct pipe_context *pctx,
                          void **samplers)
 {
    struct zink_context *ctx = zink_context(pctx);
-   for (unsigned i = 0; i < num_samplers; ++i)
-      ctx->samplers[shader][start_slot + i] = (VkSampler)samplers[i];
+   for (unsigned i = 0; i < num_samplers; ++i) {
+      VkSampler *sampler = samplers[i];
+      ctx->samplers[shader][start_slot + i] = sampler ? *sampler : VK_NULL_HANDLE;
+   }
    ctx->num_samplers[shader] = start_slot + num_samplers;
 }
 
@@ -188,8 +194,9 @@ zink_delete_sampler_state(struct pipe_context *pctx,
                           void *sampler_state)
 {
    struct zink_batch *batch = zink_curr_batch(zink_context(pctx));
-   util_dynarray_append(&batch->zombie_samplers,
-                        VkSampler, sampler_state);
+   util_dynarray_append(&batch->zombie_samplers, VkSampler,
+                        *(VkSampler *)sampler_state);
+   FREE(sampler_state);
 }