From cf65443fb3102e7d128fbb22ce3187feb52b9b2c Mon Sep 17 00:00:00 2001 From: Benjamin Otte Date: Tue, 17 Jan 2017 05:36:03 +0100 Subject: [PATCH] vulkan: Add a clip.frag.glsl include This include is supposed to handle clipping for the different clipping methods. So far, we only use it in the rounded rect cases. --- gsk/Makefile.am | 1 + .../vulkan/blend-clip-rounded.frag.glsl | 47 ++--------------- .../vulkan/blend-clip-rounded.frag.spv | Bin 5464 -> 8268 bytes gsk/resources/vulkan/blend-clip.frag.spv | Bin 632 -> 632 bytes gsk/resources/vulkan/clip.frag.glsl | 29 +++++++++++ .../vulkan/color-clip-rounded.frag.glsl | 48 ++---------------- .../vulkan/color-clip-rounded.frag.spv | Bin 5552 -> 8356 bytes .../color-matrix-clip-rounded.frag.glsl | 47 ++--------------- .../vulkan/color-matrix-clip-rounded.frag.spv | Bin 6872 -> 9676 bytes .../vulkan/linear-clip-rounded.frag.glsl | 47 ++--------------- .../vulkan/linear-clip-rounded.frag.spv | Bin 7032 -> 9836 bytes 11 files changed, 42 insertions(+), 177 deletions(-) create mode 100644 gsk/resources/vulkan/clip.frag.glsl diff --git a/gsk/Makefile.am b/gsk/Makefile.am index 38148452de..dd480bfa4e 100644 --- a/gsk/Makefile.am +++ b/gsk/Makefile.am @@ -58,6 +58,7 @@ gsk_private_vulkan_source_c = \ gskvulkanrenderpass.c \ gskvulkanshader.c gsk_private_vulkan_include_shaders = \ + resources/vulkan/clip.frag.glsl \ resources/vulkan/constants.glsl \ resources/vulkan/rounded-rect.glsl gsk_private_vulkan_shaders = \ diff --git a/gsk/resources/vulkan/blend-clip-rounded.frag.glsl b/gsk/resources/vulkan/blend-clip-rounded.frag.glsl index 23ef1c83d7..81bd003923 100644 --- a/gsk/resources/vulkan/blend-clip-rounded.frag.glsl +++ b/gsk/resources/vulkan/blend-clip-rounded.frag.glsl @@ -1,11 +1,7 @@ #version 420 core -#include "constants.glsl" - -struct RoundedRect { - vec4 bounds; - vec4 corners; -}; +#define CLIP_ROUNDED_RECT +#include "clip.frag.glsl" layout(location = 0) in vec2 inPos; layout(location = 1) in vec2 inTexCoord; @@ -14,44 +10,7 @@ layout(set = 0, binding = 0) uniform sampler2D inTexture; layout(location = 0) out vec4 color; -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -float clip(vec2 pos, RoundedRect r) { - vec2 ref_tl = r.bounds.xy + vec2( r.corners.x, r.corners.x); - vec2 ref_tr = r.bounds.zy + vec2(-r.corners.y, r.corners.y); - vec2 ref_br = r.bounds.zw + vec2(-r.corners.z, -r.corners.z); - vec2 ref_bl = r.bounds.xw + vec2( r.corners.w, -r.corners.w); - - float d_tl = distance(pos, ref_tl); - float d_tr = distance(pos, ref_tr); - float d_br = distance(pos, ref_br); - float d_bl = distance(pos, ref_bl); - - float pixels_per_fragment = length(fwidth(pos.xy)); - float nudge = 0.5 * pixels_per_fragment; - vec4 distances = vec4(d_tl, d_tr, d_br, d_bl) - r.corners + nudge; - - bvec4 is_out = bvec4(pos.x < ref_tl.x && pos.y < ref_tl.y, - pos.x > ref_tr.x && pos.y < ref_tr.y, - pos.x > ref_br.x && pos.y > ref_br.y, - pos.x < ref_bl.x && pos.y > ref_bl.y); - - float distance_from_border = dot(vec4(is_out), - max(vec4(0.0, 0.0, 0.0, 0.0), distances)); - - // Move the distance back into pixels. - distance_from_border /= pixels_per_fragment; - // Apply a more gradual fade out to transparent. - //distance_from_border -= 0.5; - - return 1.0 - smoothstep(0.0, 1.0, distance_from_border); -} - void main() { - RoundedRect r = RoundedRect(vec4(push.clip_bounds.xy, push.clip_bounds.xy + push.clip_bounds.zw), push.clip_widths); - - color = texture (inTexture, inTexCoord) * clip (inPos, r); + color = clip (inPos, texture (inTexture, inTexCoord)); } diff --git a/gsk/resources/vulkan/blend-clip-rounded.frag.spv b/gsk/resources/vulkan/blend-clip-rounded.frag.spv index adaa02be7221189fcce93b3845280f4d51f7ed1d..8b4b3b332e08eb6b9dc0e2057faf2217486d73f9 100644 GIT binary patch literal 8268 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 literal 5464 zcmZvfiFaIe6~|vmlNL#_$lhvATdh@Sq_u2DD5c_5h$ggX)S}ZQGigSWnQ>+kil`J2 z#0@vZT~RAg_vIW#-1mLKUEJ`G@VK0#$Is`@yZSrt^w)Fq``+)}e)qoLdr1dQ*t{ys zR`734_SdYxPRUL{&$5%Up?t55?;juS_G+U$&p%I(le2-`QJ+U=tFx8t%HnjRsp03y zZ;^+QwfJhI2xx%JS$34bmD!`R%6PRhF;N-6qB`4dSG&C%7V6c7Mzdb6H9Ga#USqkg z-|ED#(VSgas-+Htc%-!lvq3Uv*}m3NvsSO|BM)8lIp}OgzMK7zvxnJMr&;fG@fxNd z^o2%y>+;-=v2L%kG~3&jkHj#yWXkJ zb*2w3)|H{G1AGn(AT2ifRWTT4Cl)!EU+hit9I>P)Ls zs~7bLvd?2z8Dz2#uum>^=l8UlCheJXh@RzLi_2~FzF$6n=1sc%!36I;@i|nlZ`6A8 zUA$N2@!q_gpRYF#&F87}^F9dQrY2jidk1G*3$6Z{2D4wGH=5Vf5BHWj(YJRr=k~Pd zr61>=Z8Rr&qJ8}j?Ct5!^kSj^Dbe>PJq^O|rE>JR8Qqm~z5{C$&ffLAEaB{1ZZhHQ zS?(ZG;htGTzY6v3a|7a1x6e(v_J4h2qT93n*4E#CBmPvfns*~LtSLSNG{ioFoQc0Z zsB0TRU(GJ3Xg`r%yYJ)%e)=xTDf*wpuCM$?<~7W&zj?Hsj?ZJ*N01fBIfZ^I*kz8> z*v(w+{k6#Zq-nwDm0*-q6??CJ^?7P6uMBTV+5!SBL@VX9Q z@4kFud-t5)8SBVL+`V8|==bH?kzMEFX+QTP`lJ%JWAOT?au#*I0B3A}=Kc37IC;hM ze6hgZpRq#sy$So53asw=d=5WC;#vO;>Pc4y-p(-r!9Jb!^fKhN{a z!b#42>fT?M_TR7@>kPH4dw=CZ_x`G1z+Lj3&cNlF{sH5Asjqj-Z&c*+zWHv4uHAQA zeK%3g;>(Eh@ors04*UKJB0qtrzF#dkd6#F2_^*M>@n46NkN9tZ9byh= z`#40~ZZ!QiAjk82d|~r`IoA=ySowG_HiA9F2;%ef8OTKso5AHCo&YBwJv|05fTM@4U~M-QJv|vL7jaJkA2044cx}aTkH*qQ{HD=8}&d zpAPnn+U#+ZT`qcj2DsegC2;c5o8W|iz^ZDo^|xqZk`Iewul=C zr+J=(z6psu&jm*weYKm%?}@g^GYL-fT#Y`8M4o-%$fK`z^Y|Uo7J04#r+J=-Zts!j z`QXT-uXgkJ{n8eBUH~@FL&dya2$maWI?m@shty*CCO=UGU-aGIZ}@>eE4&e}FvK zv3C*UDa zBXZ6`9Jy}=m*?a0w*6nZv|UFox|JE z<)i*xVB_SSL)3DQIlLY0S)7gj={fF3_Z(@D??9K2bG#EgR`Pilx_ms3cY}?ScMk7m zcR2@b??L38gE(@(4_uzZ`{Crn=L2Btr*pUmT|VaUL9lW6AkHCbxyKwn1okY>Mt{%Y zw`GC-!^n+@cgA_?>vyEduFZE=zmFht$N0+n-T7$29b>;A(NF$kNEPwhul{jl1+o>< zPy1cGOGE6RK+L0$HIEitd?!AMK81w-DX>0w6!D)1%jp;Ka^e3Ou>QmRb#A@SBA#VC ZaxZcpqL1HV?Vl?+{r ref_tr.x && pos.y < ref_tr.y, - pos.x > ref_br.x && pos.y > ref_br.y, - pos.x < ref_bl.x && pos.y > ref_bl.y); - - float distance_from_border = dot(vec4(is_out), - max(vec4(0.0, 0.0, 0.0, 0.0), distances)); - - // Move the distance back into pixels. - distance_from_border /= pixels_per_fragment; - // Apply a more gradual fade out to transparent. - //distance_from_border -= 0.5; - - return 1.0 - smoothstep(0.0, 1.0, distance_from_border); -} - void main() { - RoundedRect r = RoundedRect(vec4(push.clip_bounds.xy, push.clip_bounds.xy + push.clip_bounds.zw), push.clip_widths); - - color = vec4(inColor.rgb * inColor.a, inColor.a) * clip (inPos, r); + color = clip (inPos, vec4(inColor.rgb * inColor.a, inColor.a)); } diff --git a/gsk/resources/vulkan/color-clip-rounded.frag.spv b/gsk/resources/vulkan/color-clip-rounded.frag.spv index ce925764d411b2647b4da32cfbd0bc97748b9e85..74d6fb96894cef59830a853d900a8ff45c1e89ef 100644 GIT binary patch literal 8356 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 N*fsQf9_60L{{v*)8y^4w literal 5552 zcmZvfiFaIe6~|vm(iTavSTrG-+;j9eIqSRFjp@0CYU(h6M|$=^HbCYq+udAfRBP4UkXwkcai@Ef3?73{61v3<-X%i1~LpPeGE%~ZN` z`t@h)L&rgVxX`Bx-F*5_75<~>)jYcAe|b+geI7ra>qhtVJw2Uh^<~*!_E!Cx+FYm7 zsYH+JTX^Y?Dn8xuUa zp8qlS)?|BfzR({`^j%5q1Ms^zA$r+>?n*iD`pSf}NBu5IIQx^ENH}|w+mDQLpFBgq zQO>uYwTMgo0d{qBtJ_c5R}p30I&zp(d^%_;`w(&l{?@3jZ3uliyPTr^M0V}ITWk60 zJ0+*+e-gXC^6Qw#AiMtN(RLa>4`UxfmLO*p`YN!?9H+9I!<=D16Rf}S4`&}jT-w!F z=UOj*4cK_k4f{rLoTvX*#2&-G9qdfhjk^+IZ9f&Ss{r=yOC+{;>-0`|j(o)31$Kpg zcdi}Wem0)=a}T0VDq%YUuYW3Ma?WSqjP1?5_kIK?uUOA#3+(+EDRl3D*gscbb?fsv zd=H6d{Ufk5&~CiC_e;+F_p>|0u&aCD*qvSY|Gcot8UM#ZU&d~J^`ixM9(Tn$ z?9pY8f5P})>FeF`TN1I}r(=n({lP-tL6p6I9sorNK z7yds5dq>9k0(d`uhR7){Yq4+7^uGK8(ckyc9QOQ6ME*8>%<(J4Jn|9uYj8R4H*oUN z|8K#@x`O*1ST3F2?+eblVorYm8?V21b6cO!=}*W}#Qu*Jx;E$YXT+Ik^M0ydNLTjt z7sS6SjL~L)K9j#9o~PY7-$A+mP~`=P?~3upx(1Q+@$;QnQDEPPlM&ycmF&Jl+Wq^( znnPb-(uYg>NTRO+kCybyOZs?8-&4}}mh^pz?svbE=zd=tiSGG_3*G0g|7nPQu0rC@ zonG+qj-7!nr?`C9JD8yP9)TF|H)1ssckYp3ZQ-{Td_2EL!E5t!=E2G$lm zoeP$Wxbwiri#s1)Tf|)emWv)Q1e;4fdVCVt8nxNuFuPpz_+)Uo$BW?PqsNQEa*8YM z@e=f?bvrnE+yT}WJv{|{Jindr+M=hYg5{#8OTp%nkDe|ATaz|>8ey07Z13+b#BWIG zPXl{j2eJCic{<|V^BjG(n`e|=Tf~il(>%{WUynqdXM!V-zS_;>_e5LdnE%R{y7ykRf&NuW)uyYE13T(fjPlK&Hes@*D z`w`>x)gE`a29CRB{E6r@i2RMzr+xr2hkTqd3%1TUqYjo!#XD#Gix6|@V}E|*<*Z>1 zdlPY{tC7gxD){huF}n9K^=YHa-%FmW*gJ@E^8etR1$NiJ=}TJ|k@I(=IC3w7J%1w- z=U)w$51(tmo}c<$i!LAMzXWWY{J%IO&T{`d?~gTJhgi!>ME|som!g;F@G?00sN>~e z-=lO6*Q3kdSIprc*f@FTa09!`IUHm^gvdDuapb-cT%N-#;N-*SCa~wHb9g1Xe9Ylh zVB_SSL!9LvbGR9N5OFs8r**swa zx_r#xyvyEVuFZE=zYidCNBGM6 z-T7d_9bvx*(NF$ENColRul`|V39<>%Px~FbOH0{5f|y4i&pcdk@tyc6`d%dTkAd~M xxrqNbSWdr)mka+-fb}2buXE4)Bw{UFkh_q(5qGxk|sqX&?{s%rf4 ref_tr.x && pos.y < ref_tr.y, - pos.x > ref_br.x && pos.y > ref_br.y, - pos.x < ref_bl.x && pos.y > ref_bl.y); - - float distance_from_border = dot(vec4(is_out), - max(vec4(0.0, 0.0, 0.0, 0.0), distances)); - - // Move the distance back into pixels. - distance_from_border /= pixels_per_fragment; - // Apply a more gradual fade out to transparent. - //distance_from_border -= 0.5; - - return 1.0 - smoothstep(0.0, 1.0, distance_from_border); -} - vec4 color_matrix (vec4 color, mat4 color_matrix, vec4 color_offset) { @@ -70,7 +31,5 @@ color_matrix (vec4 color, mat4 color_matrix, vec4 color_offset) void main() { - RoundedRect r = RoundedRect(vec4(push.clip_bounds.xy, push.clip_bounds.xy + push.clip_bounds.zw), push.clip_widths); - - color = color_matrix (texture (inTexture, inTexCoord), inColorMatrix, inColorOffset) * clip (inPos, r); + color = clip (inPos, color_matrix (texture (inTexture, inTexCoord), inColorMatrix, inColorOffset)); } diff --git a/gsk/resources/vulkan/color-matrix-clip-rounded.frag.spv b/gsk/resources/vulkan/color-matrix-clip-rounded.frag.spv index f0a36e010c8729acc849f396b495e28ecfb283e4..2025e85572dbdf2eac118d497f3a56de4b3feea0 100644 GIT binary patch literal 9676 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 GJNJJ&vz2xL diff --git a/gsk/resources/vulkan/linear-clip-rounded.frag.glsl b/gsk/resources/vulkan/linear-clip-rounded.frag.glsl index 4535a44abb..1fbf0955ac 100644 --- a/gsk/resources/vulkan/linear-clip-rounded.frag.glsl +++ b/gsk/resources/vulkan/linear-clip-rounded.frag.glsl @@ -1,17 +1,13 @@ #version 420 core -#include "constants.glsl" +#define CLIP_ROUNDED_RECT +#include "clip.frag.glsl" struct ColorStop { float offset; vec4 color; }; -struct RoundedRect { - vec4 bounds; - vec4 corners; -}; - layout(location = 0) in vec2 inPos; layout(location = 1) in float inGradientPos; layout(location = 2) in flat int inRepeating; @@ -20,45 +16,8 @@ layout(location = 4) in flat ColorStop inStops[8]; layout(location = 0) out vec4 outColor; -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -float clip(vec2 pos, RoundedRect r) { - vec2 ref_tl = r.bounds.xy + vec2( r.corners.x, r.corners.x); - vec2 ref_tr = r.bounds.zy + vec2(-r.corners.y, r.corners.y); - vec2 ref_br = r.bounds.zw + vec2(-r.corners.z, -r.corners.z); - vec2 ref_bl = r.bounds.xw + vec2( r.corners.w, -r.corners.w); - - float d_tl = distance(pos, ref_tl); - float d_tr = distance(pos, ref_tr); - float d_br = distance(pos, ref_br); - float d_bl = distance(pos, ref_bl); - - float pixels_per_fragment = length(fwidth(pos.xy)); - float nudge = 0.5 * pixels_per_fragment; - vec4 distances = vec4(d_tl, d_tr, d_br, d_bl) - r.corners + nudge; - - bvec4 is_out = bvec4(pos.x < ref_tl.x && pos.y < ref_tl.y, - pos.x > ref_tr.x && pos.y < ref_tr.y, - pos.x > ref_br.x && pos.y > ref_br.y, - pos.x < ref_bl.x && pos.y > ref_bl.y); - - float distance_from_border = dot(vec4(is_out), - max(vec4(0.0, 0.0, 0.0, 0.0), distances)); - - // Move the distance back into pixels. - distance_from_border /= pixels_per_fragment; - // Apply a more gradual fade out to transparent. - //distance_from_border -= 0.5; - - return 1.0 - smoothstep(0.0, 1.0, distance_from_border); -} - void main() { - RoundedRect r = RoundedRect(vec4(push.clip_bounds.xy, push.clip_bounds.xy + push.clip_bounds.zw), push.clip_widths); - float pos; if (inRepeating != 0) pos = fract (inGradientPos); @@ -74,5 +33,5 @@ void main() } //outColor = vec4(pos, pos, pos, 1.0); - outColor = color * clip (inPos, r); + outColor = clip (inPos, color); } diff --git a/gsk/resources/vulkan/linear-clip-rounded.frag.spv b/gsk/resources/vulkan/linear-clip-rounded.frag.spv index 4a018c04149ffaf4b07f31d89481294b26345bef..2610f33ea467c10469b7f863bd742cf7437d7d59 100644 GIT binary patch literal 9836 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 literal 7032 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 oei1Jh{x^d4kAEY51Z*v