[gtk+/wip/matthiasc/glyph-cache] Another attempt, still no-go



commit ec2f0eea0f3da56b9324be2fa1afa557ae0327fd
Author: Matthias Clasen <mclasen redhat com>
Date:   Wed Sep 20 11:52:10 2017 -0400

    Another attempt, still no-go

 gsk/gskvulkanimage.c |  100 +++++++++++++++++++++++++++++--------------------
 1 files changed, 59 insertions(+), 41 deletions(-)
---
diff --git a/gsk/gskvulkanimage.c b/gsk/gskvulkanimage.c
index 79f808b..278c253 100644
--- a/gsk/gskvulkanimage.c
+++ b/gsk/gskvulkanimage.c
@@ -659,31 +659,45 @@ gsk_vulkan_image_upload_region (GskVulkanImage    *self,
                                 gsize              x,
                                 gsize              y)
 {
-  GskVulkanBuffer *staging;
-  guchar *mem;
-
-  staging = gsk_vulkan_buffer_new_staging (uploader->vulkan, width * height * 4);
-  mem = gsk_vulkan_buffer_map (staging);
+/* this is a copy of gsk_vulkan_image_new_from_data_via_staging_image that
+ * needs tweaking to work with a preexisting image
+ * - sadly, I lack the chops to tweak it :-(
+ */
+  GskVulkanImage *staging;
 
-  if (stride == width * 4)
-    {
-      memcpy (mem, data, stride * height);
-    }
-  else
-    {
-      for (gsize i = 0; i < height; i++)
-        {
-          memcpy (mem + i * width * 4, data + i * stride, width * 4);
-        }
-    }
+  staging = gsk_vulkan_image_new (uploader->vulkan,
+                                  width,
+                                  height,
+                                  VK_IMAGE_TILING_LINEAR,
+                                  VK_IMAGE_USAGE_TRANSFER_SRC_BIT,
+                                  VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
 
-  gsk_vulkan_buffer_unmap (staging);
+  gsk_vulkan_image_upload_data (staging, data, width, height, stride);
 
   gsk_vulkan_uploader_add_image_barrier (uploader,
                                          FALSE,
                                          &(VkImageMemoryBarrier) {
                                              .sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,
                                              .srcAccessMask = VK_ACCESS_HOST_WRITE_BIT,
+                                             .dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT,
+                                             .oldLayout = VK_IMAGE_LAYOUT_PREINITIALIZED,
+                                             .newLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
+                                             .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
+                                             .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
+                                             .image = staging->vk_image,
+                                             .subresourceRange = {
+                                                 .aspectMask = VK_IMAGE_ASPECT_COLOR_BIT,
+                                                 .baseMipLevel = 0,
+                                                 .levelCount = 1,
+                                                 .baseArrayLayer = 0,
+                                                 .layerCount = 1
+                                             }
+                                         });
+  gsk_vulkan_uploader_add_image_barrier (uploader,
+                                         FALSE,
+                                         &(VkImageMemoryBarrier) {
+                                             .sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,
+                                             .srcAccessMask = VK_ACCESS_SHADER_READ_BIT,
                                              .dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT,
                                              .oldLayout = VK_IMAGE_LAYOUT_PREINITIALIZED,
                                              .newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
@@ -699,29 +713,33 @@ gsk_vulkan_image_upload_region (GskVulkanImage    *self,
                                              }
                                          });
 
-  vkCmdCopyBufferToImage (gsk_vulkan_uploader_get_copy_buffer (uploader),
-                          gsk_vulkan_buffer_get_buffer (staging),
-                          self->vk_image,
-                          VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
-                          1,
-                          (VkBufferImageCopy[1]) {
-                               {
-                                   .bufferOffset = 0,
-                                   .imageSubresource = {
-                                       .aspectMask = VK_IMAGE_ASPECT_COLOR_BIT,
-                                       .mipLevel = 0,
-                                       .baseArrayLayer = 0,
-                                       .layerCount = 1
-                                   },
-                                   .imageOffset = { x, y, 0 },
-                                   .imageExtent = {
-                                       .width = width,
-                                       .height = height,
-                                       .depth = 1
-                                   }
-                               }
-                          });
-
+  vkCmdCopyImage (gsk_vulkan_uploader_get_copy_buffer (uploader),
+                  staging->vk_image,
+                  VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
+                  self->vk_image,
+                  VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
+                  1,
+                  &(VkImageCopy) {
+                      .srcSubresource = {
+                          .aspectMask = VK_IMAGE_ASPECT_COLOR_BIT,
+                          .mipLevel = 0,
+                          .baseArrayLayer = 0,
+                          .layerCount = 1
+                      },
+                      .srcOffset = { 0, 0, 0 },
+                      .dstSubresource = {
+                          .aspectMask = VK_IMAGE_ASPECT_COLOR_BIT,
+                          .mipLevel = 0,
+                          .baseArrayLayer = 0,
+                          .layerCount = 1
+                      },
+                      .dstOffset = { x, y, 0 },
+                      .extent = { 
+                          .width = width,
+                          .height = height,
+                          .depth = 1
+                      }
+                  });
   gsk_vulkan_uploader_add_image_barrier (uploader,
                                          TRUE,
                                          &(VkImageMemoryBarrier) {
@@ -742,7 +760,7 @@ gsk_vulkan_image_upload_region (GskVulkanImage    *self,
                                              }
                                          });
 
-  uploader->staging_buffer_free_list = g_slist_prepend (uploader->staging_buffer_free_list, staging);
+  uploader->staging_image_free_list = g_slist_prepend (uploader->staging_image_free_list, staging);
 
   gsk_vulkan_image_ensure_view (self, VK_FORMAT_B8G8R8A8_UNORM);
 }


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