[gtk+] vulkan: Add a repeating sampler



commit 31d8fe3a6a25a7770344f9b0ab3e3a088667d66a
Author: Matthias Clasen <mclasen redhat com>
Date:   Fri Sep 29 23:01:34 2017 -0400

    vulkan: Add a repeating sampler
    
    None of the render ops use it, yet.

 gsk/gskvulkanrender.c        |   33 +++++++++++++++++++++++++++++----
 gsk/gskvulkanrenderpass.c    |    8 ++++----
 gsk/gskvulkanrenderprivate.h |    3 ++-
 3 files changed, 35 insertions(+), 9 deletions(-)
---
diff --git a/gsk/gskvulkanrender.c b/gsk/gskvulkanrender.c
index 27ee71f..6c0ab98 100644
--- a/gsk/gskvulkanrender.c
+++ b/gsk/gskvulkanrender.c
@@ -53,6 +53,7 @@ struct _GskVulkanRender
   GskVulkanImage *target;
 
   VkSampler sampler;
+  VkSampler repeating_sampler;
 
   GList *render_passes;
   GSList *cleanup_images;
@@ -224,6 +225,21 @@ gsk_vulkan_render_new (GskRenderer      *renderer,
                                  NULL,
                                  &self->sampler);
 
+  GSK_VK_CHECK (vkCreateSampler, device,
+                                 &(VkSamplerCreateInfo) {
+                                     .sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO,
+                                     .magFilter = VK_FILTER_LINEAR,
+                                     .minFilter = VK_FILTER_LINEAR,
+                                     .addressModeU = VK_SAMPLER_ADDRESS_MODE_REPEAT,
+                                     .addressModeV = VK_SAMPLER_ADDRESS_MODE_REPEAT,
+                                     .addressModeW = VK_SAMPLER_ADDRESS_MODE_REPEAT,
+                                     .borderColor = VK_BORDER_COLOR_FLOAT_TRANSPARENT_BLACK,
+                                     .unnormalizedCoordinates = VK_FALSE,
+                                     .maxAnisotropy = 1.0,
+                                 },
+                                 NULL,
+                                 &self->repeating_sampler);
+
   self->uploader = gsk_vulkan_uploader_new (self->vulkan, self->command_pool);
 
 #ifdef G_ENABLE_DEBUG
@@ -446,6 +462,7 @@ gsk_vulkan_render_get_descriptor_set (GskVulkanRender *self,
 typedef struct {
   gsize index;
   GskVulkanImage *image;
+  gboolean repeat;
 } HashDescriptorSetIndexEntry;
 
 static guint
@@ -453,7 +470,7 @@ desc_set_index_hash (gconstpointer v)
 {
   const HashDescriptorSetIndexEntry *e = v;
 
-  return GPOINTER_TO_UINT (e->image);
+  return GPOINTER_TO_UINT (e->image) + e->repeat;
 }
 
 static gboolean
@@ -462,12 +479,13 @@ desc_set_index_equal (gconstpointer v1, gconstpointer v2)
   const HashDescriptorSetIndexEntry *e1 = v1;
   const HashDescriptorSetIndexEntry *e2 = v2;
 
-  return e1->image == e2->image;
+  return e1->image == e2->image && e1->repeat == e2->repeat;
 }
 
 gsize
 gsk_vulkan_render_reserve_descriptor_set (GskVulkanRender *self,
-                                          GskVulkanImage  *source)
+                                          GskVulkanImage  *source,
+                                          gboolean         repeat)
 {
   HashDescriptorSetIndexEntry lookup;
   HashDescriptorSetIndexEntry *entry;
@@ -475,6 +493,7 @@ gsk_vulkan_render_reserve_descriptor_set (GskVulkanRender *self,
   g_assert (source != NULL);
 
   lookup.image = source;
+  lookup.repeat = repeat;
 
   entry = g_hash_table_lookup (self->descriptor_set_indexes, &lookup);
   if (entry)
@@ -482,6 +501,7 @@ gsk_vulkan_render_reserve_descriptor_set (GskVulkanRender *self,
 
   entry = g_new (HashDescriptorSetIndexEntry, 1);
   entry->image = source;
+  entry->repeat = repeat;
   entry->index = g_hash_table_size (self->descriptor_set_indexes);
   g_hash_table_add (self->descriptor_set_indexes, entry);
 
@@ -563,6 +583,7 @@ gsk_vulkan_render_prepare_descriptor_sets (GskVulkanRender *self)
       HashDescriptorSetIndexEntry *entry = key;
       GskVulkanImage *image = entry->image;
       gsize id = entry->index;
+      gboolean repeat = entry->repeat;
 
       vkUpdateDescriptorSets (device,
                               1,
@@ -575,7 +596,7 @@ gsk_vulkan_render_prepare_descriptor_sets (GskVulkanRender *self)
                                       .descriptorCount = 1,
                                       .descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
                                       .pImageInfo = &(VkDescriptorImageInfo) {
-                                          .sampler = self->sampler,
+                                          .sampler = repeat ? self->repeating_sampler : self->sampler,
                                           .imageView = gsk_vulkan_image_get_image_view (image),
                                           .imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL
                                       }
@@ -739,6 +760,10 @@ gsk_vulkan_render_free (GskVulkanRender *self)
                     self->sampler,
                     NULL);
 
+  vkDestroySampler (device,
+                    self->repeating_sampler,
+                    NULL);
+
   gsk_vulkan_command_pool_free (self->command_pool);
 
   g_slice_free (GskVulkanRender, self);
diff --git a/gsk/gskvulkanrenderpass.c b/gsk/gskvulkanrenderpass.c
index 1c2d05a..ad767ec 100644
--- a/gsk/gskvulkanrenderpass.c
+++ b/gsk/gskvulkanrenderpass.c
@@ -1309,18 +1309,18 @@ gsk_vulkan_render_pass_reserve_descriptor_sets (GskVulkanRenderPass *self,
         case GSK_VULKAN_OP_OPACITY:
         case GSK_VULKAN_OP_BLUR:
         case GSK_VULKAN_OP_COLOR_MATRIX:
-          op->render.descriptor_set_index = gsk_vulkan_render_reserve_descriptor_set (render, 
op->render.source);
+          op->render.descriptor_set_index = gsk_vulkan_render_reserve_descriptor_set (render, 
op->render.source, FALSE);
           break;
 
         case GSK_VULKAN_OP_TEXT:
         case GSK_VULKAN_OP_COLOR_TEXT:
-          op->text.descriptor_set_index = gsk_vulkan_render_reserve_descriptor_set (render, op->text.source);
+          op->text.descriptor_set_index = gsk_vulkan_render_reserve_descriptor_set (render, op->text.source, 
FALSE);
           break;
 
         case GSK_VULKAN_OP_CROSS_FADE:
         case GSK_VULKAN_OP_BLEND_MODE:
-          op->render.descriptor_set_index = gsk_vulkan_render_reserve_descriptor_set (render, 
op->render.source);
-          op->render.descriptor_set_index2 = gsk_vulkan_render_reserve_descriptor_set (render, 
op->render.source2);
+          op->render.descriptor_set_index = gsk_vulkan_render_reserve_descriptor_set (render, 
op->render.source, FALSE);
+          op->render.descriptor_set_index2 = gsk_vulkan_render_reserve_descriptor_set (render, 
op->render.source2, FALSE);
           break;
 
         default:
diff --git a/gsk/gskvulkanrenderprivate.h b/gsk/gskvulkanrenderprivate.h
index 553699b..09751cb 100644
--- a/gsk/gskvulkanrenderprivate.h
+++ b/gsk/gskvulkanrenderprivate.h
@@ -84,7 +84,8 @@ GskVulkanPipeline *     gsk_vulkan_render_get_pipeline                  (GskVulk
 VkDescriptorSet         gsk_vulkan_render_get_descriptor_set            (GskVulkanRender        *self,
                                                                          gsize                   id);
 gsize                   gsk_vulkan_render_reserve_descriptor_set        (GskVulkanRender        *self,
-                                                                         GskVulkanImage         *source);
+                                                                         GskVulkanImage         *source,
+                                                                         gboolean                repeat);
 void                    gsk_vulkan_render_draw                          (GskVulkanRender        *self);
 
 void                    gsk_vulkan_render_submit                        (GskVulkanRender        *self);


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