[gtk+] gsk: vulkan: fix image uploading



commit 48df19287b0a4cc4b3c9d4186f0f8b91dccca4f6
Author: Lionel Landwerlin <lionel g landwerlin intel com>
Date:   Fri Aug 18 20:38:54 2017 +0100

    gsk: vulkan: fix image uploading
    
    The memory alignment requirements are different from the image layout.
    We want the rowPitch to know where to upload the lines.
    
    Signed-off-by: Lionel Landwerlin <lionel g landwerlin intel com>
    
    https://bugzilla.gnome.org/show_bug.cgi?id=786485

 gsk/gskvulkanimage.c |   20 +++++++++++---------
 1 files changed, 11 insertions(+), 9 deletions(-)
---
diff --git a/gsk/gskvulkanimage.c b/gsk/gskvulkanimage.c
index d1f3701..11411fc 100644
--- a/gsk/gskvulkanimage.c
+++ b/gsk/gskvulkanimage.c
@@ -203,20 +203,22 @@ gsk_vulkan_image_upload_data (GskVulkanImage *self,
                               gsize           height,
                               gsize           data_stride)
 {
-  VkMemoryRequirements requirements;
+  VkImageSubresource image_res;
+  VkSubresourceLayout image_layout;
   gsize mem_stride;
   guchar *mem;
 
+  image_res.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
+  image_res.mipLevel = 0;
+  image_res.arrayLayer = 0;
+
   mem_stride = width * 4;
-  vkGetImageMemoryRequirements (gdk_vulkan_context_get_device (self->vulkan),
-                                self->vk_image,
-                                &requirements);
-  if (mem_stride % requirements.alignment != 0)
-    mem_stride = (mem_stride / requirements.alignment + 1) * requirements.alignment;
+  vkGetImageSubresourceLayout (gdk_vulkan_context_get_device (self->vulkan),
+                               self->vk_image, &image_res, &image_layout);
 
-  mem = gsk_vulkan_memory_map (self->memory);
+  mem = gsk_vulkan_memory_map (self->memory) + image_layout.offset;
 
-  if (data_stride == width * 4 && data_stride == mem_stride)
+  if (image_layout.rowPitch == width * 4 && data_stride == mem_stride)
     {
       memcpy (mem, data, data_stride * height);
     }
@@ -224,7 +226,7 @@ gsk_vulkan_image_upload_data (GskVulkanImage *self,
     {
       for (gsize i = 0; i < height; i++)
         {
-          memcpy (mem + i * mem_stride, data + i * data_stride, width * 4);
+          memcpy (mem + i * image_layout.rowPitch, data + i * data_stride, width * 4);
         }
     }
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]