Module: Mesa
Branch: main
Commit: 5b827b0a394d5bf3135bf5998bb92576f6cf20b4
URL:    
http://cgit.freedesktop.org/mesa/mesa/commit/?id=5b827b0a394d5bf3135bf5998bb92576f6cf20b4

Author: Mike Blumenkrantz <[email protected]>
Date:   Thu Sep  9 20:44:02 2021 -0400

zink: handle image creation for dmabufs

these use PREINIT layout

Reviewed-by: Dave Airlie <[email protected]>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/11967>

---

 src/gallium/drivers/zink/zink_resource.c | 10 +++++-----
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/src/gallium/drivers/zink/zink_resource.c 
b/src/gallium/drivers/zink/zink_resource.c
index 8bf78be0d2e..74cccaad910 100644
--- a/src/gallium/drivers/zink/zink_resource.c
+++ b/src/gallium/drivers/zink/zink_resource.c
@@ -300,11 +300,11 @@ get_image_usage(struct zink_screen *screen, 
VkImageCreateInfo *ici, const struct
 }
 
 static uint64_t
-create_ici(struct zink_screen *screen, VkImageCreateInfo *ici, const struct 
pipe_resource *templ, unsigned bind, unsigned modifiers_count, const uint64_t 
*modifiers, bool *success)
+create_ici(struct zink_screen *screen, VkImageCreateInfo *ici, const struct 
pipe_resource *templ, bool dmabuf, unsigned bind, unsigned modifiers_count, 
const uint64_t *modifiers, bool *success)
 {
    ici->sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
    ici->pNext = NULL;
-   ici->flags = bind & (PIPE_BIND_SCANOUT | PIPE_BIND_DEPTH_STENCIL) ? 0 : 
VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT;
+   ici->flags = modifiers_count || dmabuf || bind & (PIPE_BIND_SCANOUT | 
PIPE_BIND_DEPTH_STENCIL) ? 0 : VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT;
    ici->usage = 0;
 
    switch (templ->target) {
@@ -350,7 +350,7 @@ create_ici(struct zink_screen *screen, VkImageCreateInfo 
*ici, const struct pipe
    ici->samples = templ->nr_samples ? templ->nr_samples : 
VK_SAMPLE_COUNT_1_BIT;
    ici->tiling = modifiers_count ? VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT : 
bind & PIPE_BIND_LINEAR ? VK_IMAGE_TILING_LINEAR : VK_IMAGE_TILING_OPTIMAL;
    ici->sharingMode = VK_SHARING_MODE_EXCLUSIVE;
-   ici->initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
+   ici->initialLayout = dmabuf ? VK_IMAGE_LAYOUT_PREINITIALIZED : 
VK_IMAGE_LAYOUT_UNDEFINED;
 
    if (templ->target == PIPE_TEXTURE_CUBE ||
        templ->target == PIPE_TEXTURE_CUBE_ARRAY ||
@@ -469,7 +469,7 @@ resource_object_create(struct zink_screen *screen, const 
struct pipe_resource *t
       unsigned ici_modifier_count = winsys_modifier ? 1 : modifiers_count;
       bool success = false;
       VkImageCreateInfo ici;
-      uint64_t mod = create_ici(screen, &ici, templ, templ->bind, 
ici_modifier_count, ici_modifiers, &success);
+      uint64_t mod = create_ici(screen, &ici, templ, !!external, templ->bind, 
ici_modifier_count, ici_modifiers, &success);
       VkExternalMemoryImageCreateInfo emici;
       VkImageDrmFormatModifierExplicitCreateInfoEXT idfmeci;
       VkImageDrmFormatModifierListCreateInfoEXT idfmlci;
@@ -749,7 +749,7 @@ resource_create(struct pipe_screen *pscreen,
    } else {
       res->format = zink_get_format(screen, templ->format);
       res->dmabuf_acquire = whandle && whandle->type == WINSYS_HANDLE_TYPE_FD;
-      res->layout = VK_IMAGE_LAYOUT_UNDEFINED;
+      res->layout = res->dmabuf_acquire ? VK_IMAGE_LAYOUT_PREINITIALIZED : 
VK_IMAGE_LAYOUT_UNDEFINED;
       res->optimal_tiling = optimal_tiling;
       res->aspect = aspect_from_format(templ->format);
       if (scanout_flags && optimal_tiling) {

Reply via email to