vulkan: Split generic code off
authorBenjamin Otte <otte@redhat.com>
Mon, 15 May 2023 00:24:50 +0000 (02:24 +0200)
committerBenjamin Otte <otte@redhat.com>
Sun, 4 Jun 2023 17:42:01 +0000 (19:42 +0200)
No need to duplicate code in shaders when it can be shared.

gsk/vulkan/resources/color.vert
gsk/vulkan/resources/common.vert.glsl [new file with mode: 0644]
gsk/vulkan/resources/meson.build

index cc2a853b5c3f1b928f67267164a1673d23a8d35f..bda02426e9b1981d185e3ac5f1758240c138b6a0 100644 (file)
@@ -1,6 +1,6 @@
 #version 420 core
 
-#include "clip.vert.glsl"
+#include "common.vert.glsl"
 #include "rect.vert.glsl"
 
 layout(location = 0) in vec4 inRect;
@@ -10,19 +10,9 @@ layout(location = 0) out vec2 outPos;
 layout(location = 1) out flat Rect outRect;
 layout(location = 2) out flat vec4 outColor;
 
-vec2 offsets[6] = { vec2(0.0, 0.0),
-                    vec2(1.0, 0.0),
-                    vec2(0.0, 1.0),
-                    vec2(0.0, 1.0),
-                    vec2(1.0, 0.0),
-                    vec2(1.0, 1.0) };
-
 void main() {
-  Rect rect = rect_round_larger (clip_rect (rect_from_gsk (inRect)));
-
-  vec2 pos = mix (rect.bounds.xy, rect.bounds.zw, offsets[gl_VertexIndex]);
-  gl_Position = push.mvp * vec4 (pos, 0.0, 1.0);
-  outPos = pos;
-  outRect = rect_from_gsk (inRect);
+  Rect r = rect_from_gsk (inRect);
+  outPos = set_position_from_rect (r);
+  outRect = r;
   outColor = inColor;
 }
diff --git a/gsk/vulkan/resources/common.vert.glsl b/gsk/vulkan/resources/common.vert.glsl
new file mode 100644 (file)
index 0000000..797a417
--- /dev/null
@@ -0,0 +1,34 @@
+#ifndef _COMMON_VERT_
+#define _COMMON_VERT_
+
+#include "clip.vert.glsl"
+#include "constants.glsl"
+#include "rect.glsl"
+
+vec2 offsets[6] = { vec2(0.0, 0.0),
+                    vec2(1.0, 0.0),
+                    vec2(0.0, 1.0),
+                    vec2(0.0, 1.0),
+                    vec2(1.0, 0.0),
+                    vec2(1.0, 1.0) };
+
+vec2
+set_position_from_rect (Rect rect)
+{
+  Rect r = rect_round_larger (clip_rect (rect));
+
+  vec2 pos = mix (r.bounds.xy, r.bounds.zw, offsets[gl_VertexIndex]);
+  gl_Position = push.mvp * vec4 (pos, 0.0, 1.0);
+
+  return pos;
+}
+
+vec2
+scale_tex_coord (vec2 in_pos,
+                 Rect in_rect,
+                 vec4 tex_rect)
+{
+  return tex_rect.xy + (in_pos - in_rect.bounds.xy) / rect_size (in_rect) * tex_rect.zw;
+}
+
+#endif
index 2bcbd03ba323f8f2903e34f178c17c8a37b31774..46a065ad0968f09f043b72acd32f60fea8b6c42f 100644 (file)
@@ -1,6 +1,7 @@
 gsk_private_vulkan_include_shaders = [
   'clip.frag.glsl',
   'clip.vert.glsl',
+  'common.vert.glsl',
   'constants.glsl',
   'rect.glsl',
   'rect.frag.glsl',