vulkan: Use new ops for TextureScale nodes
authorBenjamin Otte <otte@redhat.com>
Sun, 25 Jun 2023 03:25:01 +0000 (05:25 +0200)
committerBenjamin Otte <otte@redhat.com>
Sun, 16 Jul 2023 10:12:36 +0000 (12:12 +0200)
gsk/vulkan/gskvulkanrenderpass.c

index 500afc1d8fd19a699ec000cefe29f825cb09fc2c..f3c09e1a4a633ac25614c86ab1e8ac8cfb26edef 100644 (file)
@@ -54,7 +54,6 @@ typedef enum {
   GSK_VULKAN_OP_FALLBACK,
   GSK_VULKAN_OP_FALLBACK_CLIP,
   GSK_VULKAN_OP_FALLBACK_ROUNDED_CLIP,
-  GSK_VULKAN_OP_TEXTURE_SCALE,
   GSK_VULKAN_OP_COLOR,
   GSK_VULKAN_OP_LINEAR_GRADIENT,
   GSK_VULKAN_OP_OPACITY,
@@ -571,11 +570,10 @@ gsk_vulkan_render_pass_add_texture_scale_node (GskVulkanRenderPass       *self,
                                                GskRenderNode             *node)
 {
   GskVulkanPipelineType pipeline_type;
-  GskVulkanOpRender op = {
-    .type = GSK_VULKAN_OP_TEXTURE_SCALE,
-    .node = node,
-    .offset = state->offset,
-  };
+  GskVulkanImage *image;
+  GskVulkanRenderer *renderer;
+  GskVulkanRenderSampler sampler;
+  GdkTexture *texture;
 
   if (gsk_vulkan_clip_contains_rect (&state->clip, &state->offset, &node->bounds))
     pipeline_type = GSK_VULKAN_PIPELINE_TEXTURE;
@@ -584,8 +582,36 @@ gsk_vulkan_render_pass_add_texture_scale_node (GskVulkanRenderPass       *self,
   else
     pipeline_type = GSK_VULKAN_PIPELINE_TEXTURE_CLIP_ROUNDED;
 
-  op.pipeline = gsk_vulkan_render_pass_get_pipeline (self, render, pipeline_type);
-  gsk_vulkan_render_pass_add_op (self, (GskVulkanOp *) &op);
+  renderer = GSK_VULKAN_RENDERER (gsk_vulkan_render_get_renderer (render));
+  texture = gsk_texture_scale_node_get_texture (node);
+  switch (gsk_texture_scale_node_get_filter (node))
+    {
+    default:
+      g_assert_not_reached ();
+    case GSK_SCALING_FILTER_LINEAR:
+    case GSK_SCALING_FILTER_TRILINEAR:
+      sampler = GSK_VULKAN_SAMPLER_DEFAULT;
+      break;
+    case GSK_SCALING_FILTER_NEAREST:
+      sampler = GSK_VULKAN_SAMPLER_NEAREST;
+      break;
+    }
+  image = gsk_vulkan_renderer_get_texture_image (renderer, texture);
+  if (image == NULL)
+    {
+      image = gsk_vulkan_upload_op_init_texture (gsk_vulkan_render_pass_alloc_op (self, gsk_vulkan_upload_op_size ()),
+                                                 self->vulkan,
+                                                 texture);
+      gsk_vulkan_renderer_add_texture_image (renderer, texture, image);
+    }
+
+  gsk_vulkan_texture_op_init (gsk_vulkan_render_pass_alloc_op (self, gsk_vulkan_texture_op_size ()),
+                              gsk_vulkan_render_pass_get_pipeline (self, render, pipeline_type),
+                              image,
+                              sampler,
+                              &node->bounds,
+                              &state->offset,
+                              &GRAPHENE_RECT_INIT(0, 0, 1, 1));
 
   return TRUE;
 }
@@ -1647,16 +1673,6 @@ gsk_vulkan_render_op_upload (GskVulkanOp           *op_,
           }
           break;
 
-        case GSK_VULKAN_OP_TEXTURE_SCALE:
-          {
-            op->render.source = gsk_vulkan_renderer_ref_texture_image (GSK_VULKAN_RENDERER (gsk_vulkan_render_get_renderer (render)),
-                                                                       gsk_texture_scale_node_get_texture (op->render.node),
-                                                                       uploader);
-            op->render.source_rect = GRAPHENE_RECT_INIT(0, 0, 1, 1);
-            gsk_vulkan_render_add_cleanup_image (render, op->render.source);
-          }
-          break;
-
         case GSK_VULKAN_OP_OPACITY:
           {
             GskRenderNode *child = gsk_opacity_node_get_child (op->render.node);
@@ -1874,7 +1890,6 @@ gsk_vulkan_render_op_count_vertex_data (GskVulkanOp *op_,
         case GSK_VULKAN_OP_FALLBACK:
         case GSK_VULKAN_OP_FALLBACK_CLIP:
         case GSK_VULKAN_OP_FALLBACK_ROUNDED_CLIP:
-        case GSK_VULKAN_OP_TEXTURE_SCALE:
         case GSK_VULKAN_OP_REPEAT:
         case GSK_VULKAN_OP_COLOR:
         case GSK_VULKAN_OP_LINEAR_GRADIENT:
@@ -1939,7 +1954,6 @@ gsk_vulkan_render_op_collect_vertex_data (GskVulkanOp         *op_,
         case GSK_VULKAN_OP_FALLBACK:
         case GSK_VULKAN_OP_FALLBACK_CLIP:
         case GSK_VULKAN_OP_FALLBACK_ROUNDED_CLIP:
-        case GSK_VULKAN_OP_TEXTURE_SCALE:
           gsk_vulkan_texture_pipeline_collect_vertex_data (GSK_VULKAN_TEXTURE_PIPELINE (op->render.pipeline),
                                                            data + op->render.vertex_offset,
                                                            op->render.image_descriptor,
@@ -2202,25 +2216,6 @@ gsk_vulkan_render_op_reserve_descriptor_sets (GskVulkanOp     *op_,
             }
           break;
 
-        case GSK_VULKAN_OP_TEXTURE_SCALE:
-          if (op->render.source)
-            {
-              op->render.image_descriptor[0] = gsk_vulkan_render_get_image_descriptor (render, op->render.source);
-              switch (gsk_texture_scale_node_get_filter (op->render.node))
-                {
-                default:
-                  g_assert_not_reached ();
-                case GSK_SCALING_FILTER_LINEAR:
-                case GSK_SCALING_FILTER_TRILINEAR:
-                  op->render.image_descriptor[1] = gsk_vulkan_render_get_sampler_descriptor (render, GSK_VULKAN_SAMPLER_DEFAULT);
-                  break;
-                case GSK_SCALING_FILTER_NEAREST:
-                  op->render.image_descriptor[1] = gsk_vulkan_render_get_sampler_descriptor (render, GSK_VULKAN_SAMPLER_NEAREST);
-                  break;
-                }
-            }
-          break;
-
         case GSK_VULKAN_OP_REPEAT:
           if (op->render.source)
             {
@@ -2323,7 +2318,6 @@ gsk_vulkan_render_op_get_pipeline (GskVulkanOp *op_)
     case GSK_VULKAN_OP_FALLBACK:
     case GSK_VULKAN_OP_FALLBACK_CLIP:
     case GSK_VULKAN_OP_FALLBACK_ROUNDED_CLIP:
-    case GSK_VULKAN_OP_TEXTURE_SCALE:
     case GSK_VULKAN_OP_REPEAT:
     case GSK_VULKAN_OP_COLOR:
     case GSK_VULKAN_OP_LINEAR_GRADIENT:
@@ -2362,7 +2356,6 @@ gsk_vulkan_render_op_command (GskVulkanOp      *op_,
         case GSK_VULKAN_OP_FALLBACK:
         case GSK_VULKAN_OP_FALLBACK_CLIP:
         case GSK_VULKAN_OP_FALLBACK_ROUNDED_CLIP:
-        case GSK_VULKAN_OP_TEXTURE_SCALE:
         case GSK_VULKAN_OP_REPEAT:
           if (!op->render.source)
             break;