From 2d6ebbb4d51ce185d75f9ac4ddc13c439a5205b7 Mon Sep 17 00:00:00 2001 From: Benjamin Otte Date: Mon, 3 Jul 2023 07:53:22 +0200 Subject: [PATCH] vulkan: Add a glyph shader This shader is an updated version of the mask shader, but I want to use the mask name for the mask node and that's a different functionality. Also, add an operation for it and partially implement the mask node using it, so we can test that this shader works. Replacing the shader used for text rendering is the next step. --- gsk/meson.build | 1 + gsk/vulkan/gskvulkanglyphop.c | 132 ++++++++++++++++++ gsk/vulkan/gskvulkanglyphopprivate.h | 17 +++ gsk/vulkan/gskvulkanrenderpass.c | 49 ++++++- .../resources/glyph-clip-rounded.frag.spv | Bin 0 -> 14956 bytes .../resources/glyph-clip-rounded.vert.spv | Bin 0 -> 6400 bytes gsk/vulkan/resources/glyph-clip.frag.spv | Bin 0 -> 4856 bytes gsk/vulkan/resources/glyph-clip.vert.spv | Bin 0 -> 6400 bytes gsk/vulkan/resources/glyph.frag | 20 +++ gsk/vulkan/resources/glyph.frag.spv | Bin 0 -> 4856 bytes gsk/vulkan/resources/glyph.vert | 26 ++++ gsk/vulkan/resources/glyph.vert.spv | Bin 0 -> 5184 bytes gsk/vulkan/resources/meson.build | 2 + 13 files changed, 246 insertions(+), 1 deletion(-) create mode 100644 gsk/vulkan/gskvulkanglyphop.c create mode 100644 gsk/vulkan/gskvulkanglyphopprivate.h create mode 100644 gsk/vulkan/resources/glyph-clip-rounded.frag.spv create mode 100644 gsk/vulkan/resources/glyph-clip-rounded.vert.spv create mode 100644 gsk/vulkan/resources/glyph-clip.frag.spv create mode 100644 gsk/vulkan/resources/glyph-clip.vert.spv create mode 100644 gsk/vulkan/resources/glyph.frag create mode 100644 gsk/vulkan/resources/glyph.frag.spv create mode 100644 gsk/vulkan/resources/glyph.vert create mode 100644 gsk/vulkan/resources/glyph.vert.spv diff --git a/gsk/meson.build b/gsk/meson.build index e1c06513f1..bfb09d7d0b 100644 --- a/gsk/meson.build +++ b/gsk/meson.build @@ -118,6 +118,7 @@ if have_vulkan 'vulkan/gskvulkancommandpool.c', 'vulkan/gskvulkancrossfadeop.c', 'vulkan/gskvulkanglyphcache.c', + 'vulkan/gskvulkanglyphop.c', 'vulkan/gskvulkanimage.c', 'vulkan/gskvulkaninsetshadowop.c', 'vulkan/gskvulkanlineargradientop.c', diff --git a/gsk/vulkan/gskvulkanglyphop.c b/gsk/vulkan/gskvulkanglyphop.c new file mode 100644 index 0000000000..4617806928 --- /dev/null +++ b/gsk/vulkan/gskvulkanglyphop.c @@ -0,0 +1,132 @@ +#include "config.h" + +#include "gskvulkanglyphopprivate.h" + +#include "vulkan/resources/glyph.vert.h" + +typedef struct _GskVulkanGlyphOp GskVulkanGlyphOp; + +struct _GskVulkanGlyphOp +{ + GskVulkanOp op; + + GskVulkanImage *image; + graphene_rect_t rect; + graphene_rect_t tex_rect; + GdkRGBA color; + + guint32 image_descriptor; + gsize vertex_offset; +}; + +static void +gsk_vulkan_glyph_op_finish (GskVulkanOp *op) +{ + GskVulkanGlyphOp *self = (GskVulkanGlyphOp *) op; + + g_object_unref (self->image); +} + +static void +gsk_vulkan_glyph_op_upload (GskVulkanOp *op, + GskVulkanRenderPass *pass, + GskVulkanRender *render, + GskVulkanUploader *uploader) +{ +} + +static inline gsize +round_up (gsize number, gsize divisor) +{ + return (number + divisor - 1) / divisor * divisor; +} + +static gsize +gsk_vulkan_glyph_op_count_vertex_data (GskVulkanOp *op, + gsize n_bytes) +{ + GskVulkanGlyphOp *self = (GskVulkanGlyphOp *) op; + gsize vertex_stride; + + vertex_stride = gsk_vulkan_glyph_info.pVertexBindingDescriptions[0].stride; + n_bytes = round_up (n_bytes, vertex_stride); + self->vertex_offset = n_bytes; + n_bytes += vertex_stride; + return n_bytes; +} + +static void +gsk_vulkan_glyph_op_collect_vertex_data (GskVulkanOp *op, + GskVulkanRenderPass *pass, + GskVulkanRender *render, + guchar *data) +{ + GskVulkanGlyphOp *self = (GskVulkanGlyphOp *) op; + GskVulkanGlyphInstance *instance = (GskVulkanGlyphInstance *) (data + self->vertex_offset); + + gsk_vulkan_rect_to_float (&self->rect, instance->rect); + gsk_vulkan_rect_to_float (&self->tex_rect, instance->tex_rect); + instance->tex_id = self->image_descriptor; + gsk_vulkan_rgba_to_float (&self->color, instance->color); +} + +static void +gsk_vulkan_glyph_op_reserve_descriptor_sets (GskVulkanOp *op, + GskVulkanRender *render) +{ + GskVulkanGlyphOp *self = (GskVulkanGlyphOp *) op; + + self->image_descriptor = gsk_vulkan_render_get_image_descriptor (render, self->image, GSK_VULKAN_SAMPLER_DEFAULT); +} + +static VkPipeline +gsk_vulkan_glyph_op_get_pipeline (GskVulkanOp *op) +{ + return VK_NULL_HANDLE; +} + +static void +gsk_vulkan_glyph_op_command (GskVulkanOp *op, + GskVulkanRender *render, + VkPipelineLayout pipeline_layout, + VkCommandBuffer command_buffer) +{ + GskVulkanGlyphOp *self = (GskVulkanGlyphOp *) op; + + vkCmdDraw (command_buffer, + 6, 1, + 0, self->vertex_offset / gsk_vulkan_glyph_info.pVertexBindingDescriptions[0].stride); +} + +static const GskVulkanOpClass GSK_VULKAN_GLYPH_OP_CLASS = { + GSK_VULKAN_OP_SIZE (GskVulkanGlyphOp), + "glyph", + &gsk_vulkan_glyph_info, + gsk_vulkan_glyph_op_finish, + gsk_vulkan_glyph_op_upload, + gsk_vulkan_glyph_op_count_vertex_data, + gsk_vulkan_glyph_op_collect_vertex_data, + gsk_vulkan_glyph_op_reserve_descriptor_sets, + gsk_vulkan_glyph_op_get_pipeline, + gsk_vulkan_glyph_op_command +}; + +void +gsk_vulkan_glyph_op (GskVulkanRenderPass *render_pass, + const char *clip_type, + GskVulkanImage *image, + const graphene_rect_t *rect, + const graphene_point_t *offset, + const graphene_rect_t *tex_rect, + const GdkRGBA *color) +{ + GskVulkanGlyphOp *self; + + self = (GskVulkanGlyphOp *) gsk_vulkan_op_alloc (render_pass, &GSK_VULKAN_GLYPH_OP_CLASS); + + ((GskVulkanOp *) self)->clip_type = g_intern_string (clip_type); + self->image = g_object_ref (image); + graphene_rect_offset_r (rect, offset->x, offset->y, &self->rect); + gsk_vulkan_normalize_tex_coords (&self->tex_rect, rect, tex_rect); + self->color = *color; +} diff --git a/gsk/vulkan/gskvulkanglyphopprivate.h b/gsk/vulkan/gskvulkanglyphopprivate.h new file mode 100644 index 0000000000..deb64b902f --- /dev/null +++ b/gsk/vulkan/gskvulkanglyphopprivate.h @@ -0,0 +1,17 @@ +#pragma once + +#include "gskvulkanopprivate.h" + +G_BEGIN_DECLS + +void gsk_vulkan_glyph_op (GskVulkanRenderPass *render_pass, + const char *clip_type, + GskVulkanImage *image, + const graphene_rect_t *rect, + const graphene_point_t *offset, + const graphene_rect_t *tex_rect, + const GdkRGBA *color); + + +G_END_DECLS + diff --git a/gsk/vulkan/gskvulkanrenderpass.c b/gsk/vulkan/gskvulkanrenderpass.c index b4989ec6a0..4a33d21fd2 100644 --- a/gsk/vulkan/gskvulkanrenderpass.c +++ b/gsk/vulkan/gskvulkanrenderpass.c @@ -17,6 +17,7 @@ #include "gskvulkancoloropprivate.h" #include "gskvulkancolortextpipelineprivate.h" #include "gskvulkancrossfadeopprivate.h" +#include "gskvulkanglyphopprivate.h" #include "gskvulkaninsetshadowopprivate.h" #include "gskvulkanlineargradientopprivate.h" #include "gskvulkanopprivate.h" @@ -1297,6 +1298,52 @@ gsk_vulkan_render_pass_add_blur_node (GskVulkanRenderPass *self, return TRUE; } +static inline gboolean +gsk_vulkan_render_pass_add_mask_node (GskVulkanRenderPass *self, + GskVulkanRender *render, + const GskVulkanParseState *state, + GskRenderNode *node) +{ + GskVulkanImage *mask_image; + graphene_rect_t mask_tex_rect; + GskRenderNode *source, *mask; + GskMaskMode mode; + + mode = gsk_mask_node_get_mask_mode (node); + source = gsk_mask_node_get_source (node); + mask = gsk_mask_node_get_mask (node); + mask_image = gsk_vulkan_render_pass_get_node_as_image (self, + render, + state, + mask, + &mask_tex_rect); + if (mask_image == NULL) + { + if (mode == GSK_MASK_MODE_INVERTED_ALPHA) + gsk_vulkan_render_pass_add_node (self, render, state, source); + + return TRUE; + } + + /* Use the glyph shader as an optimization */ + if (mode == GSK_MASK_MODE_ALPHA && + gsk_render_node_get_node_type (source) == GSK_COLOR_NODE) + { + graphene_rect_t bounds; + if (graphene_rect_intersection (&source->bounds, &mask->bounds, &bounds)) + gsk_vulkan_glyph_op (self, + gsk_vulkan_clip_get_clip_type (&state->clip, &state->offset, &bounds), + mask_image, + &bounds, + &state->offset, + &mask_tex_rect, + gsk_color_node_get_color (source)); + return TRUE; + } + + return FALSE; +} + static inline gboolean gsk_vulkan_render_pass_add_debug_node (GskVulkanRenderPass *self, GskVulkanRender *render, @@ -1343,7 +1390,7 @@ static const GskVulkanRenderPassNodeFunc nodes_vtable[] = { [GSK_DEBUG_NODE] = gsk_vulkan_render_pass_add_debug_node, [GSK_GL_SHADER_NODE] = NULL, [GSK_TEXTURE_SCALE_NODE] = gsk_vulkan_render_pass_add_texture_scale_node, - [GSK_MASK_NODE] = NULL, + [GSK_MASK_NODE] = gsk_vulkan_render_pass_add_mask_node, }; static void diff --git a/gsk/vulkan/resources/glyph-clip-rounded.frag.spv b/gsk/vulkan/resources/glyph-clip-rounded.frag.spv new file mode 100644 index 0000000000000000000000000000000000000000..ff2212a266ca9036bf4e1d1005f698e0328dd34b GIT binary patch literal 14956 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 literal 0 HcmV?d00001 diff --git a/gsk/vulkan/resources/glyph-clip-rounded.vert.spv b/gsk/vulkan/resources/glyph-clip-rounded.vert.spv new file mode 100644 index 0000000000000000000000000000000000000000..d177868088aee7b9ce4b7311b6795023072d4f3a GIT binary patch literal 6400 zcmZ{md2roT6~}+gduh6)D{U!TO)P~dZA!5$wNfZ8rk#m46bE--)8w^zlD@?EUb>({ z3wC4%P%GjLRRq_H8y0tT6j5=X!Q#GPi-?L^^e-J}bo_jN?|0f?(&2W#x#xV(a?d^Y z{_bm`WpP`QOiHFFGm?KM%`qowfl1&dr*lv5wY}Z-#$fl#i!an;W>QEU^_i8-PURwh zcl1}PDu=*fa0L7YJOPe^W8fL^H*g$03kv*eVSa>U#bjF2(_8Ae9gIXsO=V zGh8kWSE}XGV5L?bXjFEV^_!COt5gSu#|HBbt$5_?QJ=~hn@PaLu3A%FdF#knb+Dem zv?cB6E>hZ78`)9XUcbI;=eCurwH4__lI-5IYseU*=Z0^+aznYR-l&ZYG?ux*GGbP& z#;1_X(I@qvo-7FenhTbO`)k|FwdaVNexiQA|3FCp{DS zW+YwA^?`m)vr*n%8WP+^uDqB(7KUoz0qHV_56z|kC^P(If~x&;|ezWl3j}6y`O2nc2x!& zLv_5{(s;julpiWrwhyJLv9+c)?_auKW@}%|JW3r*slJW5R<4f?(;@A*Ywxf1@5t;2 zCg^ug(C-?j7m~Zto99(b4vw=GlY7SLh2&m!nreUiR<{qAt}EB*Tmy2p1XQ2pM`#5vxnH$aqZSuJc)tw37dV?Ha0wb!seaz z4RP3?N10Fdr;t2`9{W9lT&ZqOZ=1f4Pw@S@db;0Y@{4h{V){Ofj5XLxa~}XSeMS1r+?<`Df`i@nqP|YRN`ktJS_o)f`)8q8k^c`d!l58Brl;-eVO!Gpyj&CGB z>qdr0+-mCMn^~zgsSWJa`|W528~7Xg;*=fFwZZvXho9%A-<3JebCT=Jah{LdmK^8( zmKy~Dc{Q%0@v~`IpiF{xxSopaORM6&ES;fT+_A87i)R;zGn{C_V?zb zUPym?W@a|eR-5bTdogzz9`+8)3 z-FMh~ksb3m(HogP~f3ne1O^9#%L4f`7E>FgLc>AqDpUAlIKbq6ce+;;$@qfu|?q7fP zXEILvUy=0e)8<*KN8aBfM_$iSJ>vd=9C7YjJ>vd|9C7wQ zU7P#-6F3H3&wi+{!eT9d23^2>#%b5@D6=+mc=mq>p1U^hhkE4y2eN0b?Krdgf4Kpd z0q=nQvX_o&;8OfNo9V#&FoQXAU6S#eh_d!eft+x7uN=-1a~ZO^Hf4KSg)Aq$e+6(2 zb@=VR7-)9{w;EZ_oPFeQ-Isvn8H~|qA33yL4y;R`wQ%d1uTJIWJ7`_@_N5sgd+EtI zc}IRP`?K5|;LWdZA9?KEMj-z`cB349b&a{eF&o%dzkxZxzMjTxefIig8Q;qseS3Mv zN8dJ~%Zcb)#P`9OHy?iux_rcMMwSx}_je2HTj#aF{Q9^L_1K4dTmT&NKP)vM`bFN?AWzKuS~&U0`#NMf5&en0uZMFT z_o83itv4XMrX#o#a?}yr7C3V_g6l_)ym2qL!kN^++h65;f6qd9ECkWt zGjj5o$oBedX5VJ}vkiFPqet73jmh_Z2wgsUR6&*#4to;uZ$x&TeEjw3@)19bEGHbs zw^M~@wTQmJ@M)5&tH*iM7?>k{BP z`o=kqAzQm6xShzcpWt@Ena2^_Zsf=vcVG{kIn7~=KEA!4m$vx6Z$Ord`rnK!Cmhxr zzHdR!`@R)jPQ+fn&bNFM`d(lzeGYP0Ze-pE_JV&=$1Ti`|6r598OV9Rl)az(GhIGv zcssH+#C^UMSx$fD{C!@8?#RCv=b*dB^O)lf-;Ugt=`)!ROwjL~px>40-ites-vQQw z+d$O$&WyL`=2wsZH@pkE9ms2UJ-M*I8+iecH=pmtdw{j;Z$0YD)}sF^-Y)d4t z(Pm%dqA#|CrBweEum=6C&HVbfKYOR$d=D~zE|pL2 zZw>nAGd}Wv0o}NG2fm0b=Lqgg$a1b5Z^M_7_0_fVp27bC DyOf^e literal 0 HcmV?d00001 diff --git a/gsk/vulkan/resources/glyph-clip.frag.spv b/gsk/vulkan/resources/glyph-clip.frag.spv new file mode 100644 index 0000000000000000000000000000000000000000..bfd95cdd2e58b9f305364ce8edbf043e65831829 GIT binary patch literal 4856 zcmZvf`IDSg6^8FH-C;sD0$I&shA5^gi-2K?5fT{41c_#lD2U6XGu@ME>2$Z#-9v&_ z$q+Driu;B;VRu7N+^YOR{{sISEvvMAp0DqbFN3%0%suaWmV55K=YE}xUbge{lt$8u zv?~2M4aeGa8BBs(R?L&f?mM=x*RSu}f8%v}tWKkaqdsf!sxT{OYR$HWMdSkV6!Kl< zhsZ_bO5*fmL9|g;N$Ia7siZ5?FRHo6_(-nEP z>Wf&*Hs)@jSJH0zMsLvKq+H_!xPGLrxxf!FcU`2w)ilRkEH|VIpQb*w`P!Mnr;;AJ z1Xq*I5hbD)F`Y|%D(MU0TB|!ZJflj{OU?E~v0Ll1ubOQyXBcmfHQQ61%n(1#T(05E zm*8spHn`t7+aIu5)S?D^wAnt{s5jD^yVfy?Owmu)(y5&@Tlp`LKi&r zD5;k>h);5WUcO-U*y@P8C^cEifA092f8IjAoG1j_`^;;r#e`4>Y zocnd~GQ_%$@;A=gH*=I-1>OmESi4;0_b#k0Y8OXs=JReGRm6OOBVU>GJLh{3&Yb!k zE^+QdZmPsti`>Z)=YHgTkk;(F#$L@|=W#gW)Hk4c20M_A)NCDbCfl+3O_bY#ZF$z^ z^u2;v-(k)QU-wjS`i-;SHO%^o6?3d(HlMNL^%=_^~{h+`cUO)y*Ioy_XisGoW6MjU&n#C1Q2$dzRezSe$EwnyxPV8)^K*!ip!>q=-B z4+ISNw!mzD*9`kP^bth+qgmJIV8)A?3;)N!-j)96v(0?sFJ^3=#)~gxPWzKt_pG&x zpUT{3PV;N%<{ClDBk&eh{yGNzqMmP{PyH>Wt>pVAx^_9&`xdi9-u1-3Ux)VZFq_+R z(k}MR%4z>Tv%{QGuWvZ)&!Kx3abDt!ne(onM|VH^Sg-m^NJ@_$+6Ei%-M;o6i`~a> znZ>b>-=W(t^41}KGjp53zel$Q-`RFF-&b(*O7!<1(U&9om`m)pQtl>t+jY$2u~Brr_2{oxs3wr>`LPkT%yAA0Uf)o2<9>gP=p%n`UiT-N_gsy$mY*W7AGQ4~bNWVYa{8P11;q0@ z&dEH_{9@+h9V3W$7;CT4%ghbuHK)3E^@_v7b zuD^Vo$*-#IXXo8NcPsD-rv2 zHM4hSpIwvrappL?otZz*s^)qZBB!|TQ6%Eujc(p@{Iy{Dh<^{doZ|32&*wUKp_^Zy z|BziA`xryN3URDKVjowQ^tI^j>1t-*ntR%fcwSNC9&}^MHSPt=M~(Z?9aui%uSb_t9LBHA=XXQK?#*@djoj};Us~IKIQhtZBf6Zj^!#svTUy)AaPkp< z3%Z;V@lo3WIBWI3Tu0yN_4lJ&yCXRNvl9CW?gMb47D9ZV7HK!4H+N`PwDycczoE z_51z!C}JId&-i1RTgi7#`~8S_T0ykg6V@mnIX;eVj=-Nl*T?UwIX;QVJ&44&L(_P4~iGl<_-W3=hxy~{^@7hO)9 zcPc)R&*Zb{s}T7(+j(@)^2zMeL)TB<9QKKv-@XOrhY`5}Vh;QHEFvF1kD%*w4hf&n Tq07g=1wM~%oV;&D>>K$nw57gG literal 0 HcmV?d00001 diff --git a/gsk/vulkan/resources/glyph-clip.vert.spv b/gsk/vulkan/resources/glyph-clip.vert.spv new file mode 100644 index 0000000000000000000000000000000000000000..d177868088aee7b9ce4b7311b6795023072d4f3a GIT binary patch literal 6400 zcmZ{md2roT6~}+gduh6)D{U!TO)P~dZA!5$wNfZ8rk#m46bE--)8w^zlD@?EUb>({ z3wC4%P%GjLRRq_H8y0tT6j5=X!Q#GPi-?L^^e-J}bo_jN?|0f?(&2W#x#xV(a?d^Y z{_bm`WpP`QOiHFFGm?KM%`qowfl1&dr*lv5wY}Z-#$fl#i!an;W>QEU^_i8-PURwh zcl1}PDu=*fa0L7YJOPe^W8fL^H*g$03kv*eVSa>U#bjF2(_8Ae9gIXsO=V zGh8kWSE}XGV5L?bXjFEV^_!COt5gSu#|HBbt$5_?QJ=~hn@PaLu3A%FdF#knb+Dem zv?cB6E>hZ78`)9XUcbI;=eCurwH4__lI-5IYseU*=Z0^+aznYR-l&ZYG?ux*GGbP& z#;1_X(I@qvo-7FenhTbO`)k|FwdaVNexiQA|3FCp{DS zW+YwA^?`m)vr*n%8WP+^uDqB(7KUoz0qHV_56z|kC^P(If~x&;|ezWl3j}6y`O2nc2x!& zLv_5{(s;julpiWrwhyJLv9+c)?_auKW@}%|JW3r*slJW5R<4f?(;@A*Ywxf1@5t;2 zCg^ug(C-?j7m~Zto99(b4vw=GlY7SLh2&m!nreUiR<{qAt}EB*Tmy2p1XQ2pM`#5vxnH$aqZSuJc)tw37dV?Ha0wb!seaz z4RP3?N10Fdr;t2`9{W9lT&ZqOZ=1f4Pw@S@db;0Y@{4h{V){Ofj5XLxa~}XSeMS1r+?<`Df`i@nqP|YRN`ktJS_o)f`)8q8k^c`d!l58Brl;-eVO!Gpyj&CGB z>qdr0+-mCMn^~zgsSWJa`|W528~7Xg;*=fFwZZvXho9%A-<3JebCT=Jah{LdmK^8( zmKy~Dc{Q%0@v~`IpiF{xxSopaORM6&ES;fT+_A87i)R;zGn{C_V?zb zUPym?W@a|eR-5bTdogzz9`+8)3 z-FMh~ksb3m(HogP~f3ne1O^9#%L4f`7E>FgLc>AqDpUAlIKbq6ce+;;$@qfu|?q7fP zXEILvUy=0e)8<*KN8aBfM_$iSJ>vd=9C7YjJ>vd|9C7wQ zU7P#-6F3H3&wi+{!eT9d23^2>#%b5@D6=+mc=mq>p1U^hhkE4y2eN0b?Krdgf4Kpd z0q=nQvX_o&;8OfNo9V#&FoQXAU6S#eh_d!eft+x7uN=-1a~ZO^Hf4KSg)Aq$e+6(2 zb@=VR7-)9{w;EZ_oPFeQ-Isvn8H~|qA33yL4y;R`wQ%d1uTJIWJ7`_@_N5sgd+EtI zc}IRP`?K5|;LWdZA9?KEMj-z`cB349b&a{eF&o%dzkxZxzMjTxefIig8Q;qseS3Mv zN8dJ~%Zcb)#P`9OHy?iux_rcMMwSx}_je2HTj#aF{Q9^L_1K4dTmT&NKP)vM`bFN?AWzKuS~&U0`#NMf5&en0uZMFT z_o83itv4XMrX#o#a?}yr7C3V_g6l_)ym2qL!kN^++h65;f6qd9ECkWt zGjj5o$oBedX5VJ}vkiFPqet73jmh_Z2wgsUR6&*#4to;uZ$x&TeEjw3@)19bEGHbs zw^M~@wTQmJ@M)5&tH*iM7?>k{BP z`o=kqAzQm6xShzcpWt@Ena2^_Zsf=vcVG{kIn7~=KEA!4m$vx6Z$Ord`rnK!Cmhxr zzHdR!`@R)jPQ+fn&bNFM`d(lzeGYP0Ze-pE_JV&=$1Ti`|6r598OV9Rl)az(GhIGv zcssH+#C^UMSx$fD{C!@8?#RCv=b*dB^O)lf-;Ugt=`)!ROwjL~px>40-ites-vQQw z+d$O$&WyL`=2wsZH@pkE9ms2UJ-M*I8+iecH=pmtdw{j;Z$0YD)}sF^-Y)d4t z(Pm%dqA#|CrBweEum=6C&HVbfKYOR$d=D~zE|pL2 zZw>nAGd}Wv0o}NG2fm0b=Lqgg$a1b5Z^M_7_0_fVp27bC DyOf^e literal 0 HcmV?d00001 diff --git a/gsk/vulkan/resources/glyph.frag b/gsk/vulkan/resources/glyph.frag new file mode 100644 index 0000000000..0f87adcd51 --- /dev/null +++ b/gsk/vulkan/resources/glyph.frag @@ -0,0 +1,20 @@ +#version 450 + +#include "common.frag.glsl" +#include "clip.frag.glsl" +#include "rect.frag.glsl" + +layout(location = 0) in vec2 inPos; +layout(location = 1) in flat Rect inRect; +layout(location = 2) in vec2 inTexCoord; +layout(location = 3) in flat uint inTexId; +layout(location = 4) in flat vec4 inColor; + +layout(location = 0) out vec4 color; + +void main() +{ + float alpha = inColor.a * rect_coverage (inRect, inPos); + alpha *= texture(get_sampler (inTexId), inTexCoord).a; + color = clip_scaled (inPos, vec4(inColor.rgb, 1) * alpha); +} diff --git a/gsk/vulkan/resources/glyph.frag.spv b/gsk/vulkan/resources/glyph.frag.spv new file mode 100644 index 0000000000000000000000000000000000000000..bfd95cdd2e58b9f305364ce8edbf043e65831829 GIT binary patch literal 4856 zcmZvf`IDSg6^8FH-C;sD0$I&shA5^gi-2K?5fT{41c_#lD2U6XGu@ME>2$Z#-9v&_ z$q+Driu;B;VRu7N+^YOR{{sISEvvMAp0DqbFN3%0%suaWmV55K=YE}xUbge{lt$8u zv?~2M4aeGa8BBs(R?L&f?mM=x*RSu}f8%v}tWKkaqdsf!sxT{OYR$HWMdSkV6!Kl< zhsZ_bO5*fmL9|g;N$Ia7siZ5?FRHo6_(-nEP z>Wf&*Hs)@jSJH0zMsLvKq+H_!xPGLrxxf!FcU`2w)ilRkEH|VIpQb*w`P!Mnr;;AJ z1Xq*I5hbD)F`Y|%D(MU0TB|!ZJflj{OU?E~v0Ll1ubOQyXBcmfHQQ61%n(1#T(05E zm*8spHn`t7+aIu5)S?D^wAnt{s5jD^yVfy?Owmu)(y5&@Tlp`LKi&r zD5;k>h);5WUcO-U*y@P8C^cEifA092f8IjAoG1j_`^;;r#e`4>Y zocnd~GQ_%$@;A=gH*=I-1>OmESi4;0_b#k0Y8OXs=JReGRm6OOBVU>GJLh{3&Yb!k zE^+QdZmPsti`>Z)=YHgTkk;(F#$L@|=W#gW)Hk4c20M_A)NCDbCfl+3O_bY#ZF$z^ z^u2;v-(k)QU-wjS`i-;SHO%^o6?3d(HlMNL^%=_^~{h+`cUO)y*Ioy_XisGoW6MjU&n#C1Q2$dzRezSe$EwnyxPV8)^K*!ip!>q=-B z4+ISNw!mzD*9`kP^bth+qgmJIV8)A?3;)N!-j)96v(0?sFJ^3=#)~gxPWzKt_pG&x zpUT{3PV;N%<{ClDBk&eh{yGNzqMmP{PyH>Wt>pVAx^_9&`xdi9-u1-3Ux)VZFq_+R z(k}MR%4z>Tv%{QGuWvZ)&!Kx3abDt!ne(onM|VH^Sg-m^NJ@_$+6Ei%-M;o6i`~a> znZ>b>-=W(t^41}KGjp53zel$Q-`RFF-&b(*O7!<1(U&9om`m)pQtl>t+jY$2u~Brr_2{oxs3wr>`LPkT%yAA0Uf)o2<9>gP=p%n`UiT-N_gsy$mY*W7AGQ4~bNWVYa{8P11;q0@ z&dEH_{9@+h9V3W$7;CT4%ghbuHK)3E^@_v7b zuD^Vo$*-#IXXo8NcPsD-rv2 zHM4hSpIwvrappL?otZz*s^)qZBB!|TQ6%Eujc(p@{Iy{Dh<^{doZ|32&*wUKp_^Zy z|BziA`xryN3URDKVjowQ^tI^j>1t-*ntR%fcwSNC9&}^MHSPt=M~(Z?9aui%uSb_t9LBHA=XXQK?#*@djoj};Us~IKIQhtZBf6Zj^!#svTUy)AaPkp< z3%Z;V@lo3WIBWI3Tu0yN_4lJ&yCXRNvl9CW?gMb47D9ZV7HK!4H+N`PwDycczoE z_51z!C}JId&-i1RTgi7#`~8S_T0ykg6V@mnIX;eVj=-Nl*T?UwIX;QVJ&44&L(_P4~iGl<_-W3=hxy~{^@7hO)9 zcPc)R&*Zb{s}T7(+j(@)^2zMeL)TB<9QKKv-@XOrhY`5}Vh;QHEFvF1kD%*w4hf&n Tq07g=1wM~%oV;&D>>K$nw57gG literal 0 HcmV?d00001 diff --git a/gsk/vulkan/resources/glyph.vert b/gsk/vulkan/resources/glyph.vert new file mode 100644 index 0000000000..0f9b647e14 --- /dev/null +++ b/gsk/vulkan/resources/glyph.vert @@ -0,0 +1,26 @@ +#version 450 + +#include "common.vert.glsl" +#include "rect.vert.glsl" + +layout(location = 0) in vec4 inRect; +layout(location = 1) in vec4 inTexRect; +layout(location = 2) in vec4 inColor; +layout(location = 3) in uint inTexId; + +layout(location = 0) out vec2 outPos; +layout(location = 1) out flat Rect outRect; +layout(location = 2) out vec2 outTexCoord; +layout(location = 3) out flat uint outTexId; +layout(location = 4) out flat vec4 outColor; + +void main() { + Rect r = rect_from_gsk (inRect); + vec2 pos = set_position_from_rect (r); + + outPos = pos; + outRect = r; + outTexCoord = scale_tex_coord (pos, r, inTexRect); + outTexId = inTexId; + outColor = inColor; +} diff --git a/gsk/vulkan/resources/glyph.vert.spv b/gsk/vulkan/resources/glyph.vert.spv new file mode 100644 index 0000000000000000000000000000000000000000..e92bf9249a047df5f1762b00fd57636720982c0e GIT binary patch literal 5184 zcmZ{m`*&Pb6~}KgGY#|wEwmJ=A)%rzv{kS?YH2A3*R&dKXc6CzF*8X9CNptn(g%XJ zV3mc>`d$k`Kt&N1-wOJZf0e)J^7A?O?&K0zPuDkR@9%z`ea_kUOe-V1N3(2QwlUkB z{WHtQ)@%eOgIk~G`qb&E1A}4nz`?uTqsNx4k{tE9Cc8GtRsJr{w7V*O@C0}syaHYY zuYuoyzkt7iH^7^q!oLybf03-3ZOH0Vjrz%x^{EduW|x*4gW>s3tI=t9Ta9MB-Gs=vaR|g|Bcy>@b9}| zqchW=Z}qPbw|yn<>g-13*-m?@VPRMB-?`$yIopLiXbl@ny+M1}?sfCMTp<`=_jZ%< z#o5&8gWcwso#Et%t#ggpUa#NeBF?rrmYfJm*BNr?fRZZb3KO>N?eI zFI;bKj&cWhtk2$uKD|6xnCx{2!$LeRh7L+iaaP-}>zFoS$y>a}z3T&MOl$U0fgRX!3WziEnp@r)fF; z!sec_P0}V0wmrGo){4!2Yg_JgR&4Ic@6+LaFEf|-@Em&V*KfGpJ(apc-xt>SzNDV^ zTg_g6i>;cz{oeABz2xio4xp!G_JnT&`opbrllB-)Exi%#E>yl`s_(aJ^1i-C|HE7K zT6$yhyeGW6l*2bC<%Mz`-yeJ?d!3$JO+LOy?QTvTFZEpw{x}}?r^D~VQRa9=(@Pkf z_od%45S;fUH(lbqAGyz!IQvm<3DmhO*EP0IO&050bQ>_Qz2uN{1n2s4&cT^O&NYKm zmUB(lGGDCa-H!o>Yx|b3>Xr1aZz*ivtv1)w_q9TgT)zFQ_DZ^=i1jx?o3$A0U9IYs zbXVc)y=lwqt)|})b=SF$zs?h6GMDlWr1i|>;0B_+Cw1e;`Fj z_0iWFw8@$48fJ6lYgW_!%jswQ_00OJ8*iP)>oY;*&4nzlkLzs5?^fn<;JCfe--+y6 zyU^doYz{f|?qSv@f4I>17M$_g>=(yAddAq>ft(1ReaKmM;r{U1k0z&2a0gcORqow| zpT7Ipv32+#1=lc#F+y42oz!%Q*|YE-#*pms;N*pMx<7t`(>dzn{?vV=JzLM~2=h2t z2i%MLQ4n{0KeE30zH@sW-C_POFdJ)}`PKc-=@_9vOG({oV2#H`I+>OWy#SLnv8KVNX#e}SyOb!u0CrQo#x zs*qhnyZWmI7yf>?=7{`$x2|dYp9`D&*RJlj8}Ld$`z_1qe~I}GP|p8mVZWQc z^gHs-9Qynlrp9cn-^X*nvrzY2d7-5H4ZT#-^?$jfYxj2~;bKmL__j}}s^9tmRK&H!z=Z+V!(% zw3*{p=D!2)U7P)(9{K-)?44_~7u5elhujP70nf{`bZh|k;OE_J1op#b=E!wN!Jj0` z+V2E%!m%!&(i}1Gg)`U5VowK=<%Iob-#tVfe!F)8?T+B?MwT=8G&x-N9^e}(jM3*J zIkepitV^E<;CzdYf&0KwU|pW=1K=2ly}ZBR4+8oBvK!?% zSJ&7E9M=NR)o)-c@LaEBwm#4Lc){11|;B!`?!HQ>UaoQzFfyCbor>`G_ss=72Io{43Z+a8i?+3`MBprWI5sRUL(GXyf(fECm-=k$Z{h3#JwFsAAmkE-;jA3>;>}r zc+O{l{3gC!^|Qbl4ghO2zdr8Iv(s+ACz-zle1~FxhmgNq@R9!lx^dBG7m?*0!99h1 z0l04T-qXnXYP${W1D9EMl=&;bb@Z{8OUz#dPXKGNR(1WNj;|qGhrOm;?zP?Mj+=q+ zfqgPw$Xl2v3fb@Y7GMv)gE@NcGO~5Kmh-bfzqq5X7o5DqeMVj1KpqEi=ifwjy*h|| z-$Is;eBVZv6Atsm+xH!0bLwNf-`RJ8IXxF^RgeEad=GgWkbj1=v