From fdbc8079c96aabcd8350d1f4e18e450c9a9e456c Mon Sep 17 00:00:00 2001 From: Laszlo Agocs Date: Tue, 10 Jun 2025 12:01:13 +0200 Subject: [PATCH] rhi: Update the docs and manual test for geometry shaders Task-number: QTBUG-137521 Change-Id: Ic9256eaaa55aef20c622429058fda9235c1f73c1 Reviewed-by: Andy Nichols --- src/gui/rhi/qrhi.cpp | 21 +++++++------- .../rhi/geometryshader/buildshaders.bat | 3 +- tests/manual/rhi/geometryshader/test.frag.qsb | Bin 456 -> 450 bytes tests/manual/rhi/geometryshader/test.geom | 3 +- tests/manual/rhi/geometryshader/test.geom.qsb | Bin 1222 -> 1364 bytes tests/manual/rhi/geometryshader/test.vert | 4 ++- tests/manual/rhi/geometryshader/test.vert.qsb | Bin 591 -> 665 bytes .../manual/rhi/geometryshader/test_geom.hlsl | 26 ------------------ 8 files changed, 17 insertions(+), 40 deletions(-) delete mode 100644 tests/manual/rhi/geometryshader/test_geom.hlsl diff --git a/src/gui/rhi/qrhi.cpp b/src/gui/rhi/qrhi.cpp index 0628d07ce73..c47828120d8 100644 --- a/src/gui/rhi/qrhi.cpp +++ b/src/gui/rhi/qrhi.cpp @@ -936,16 +936,17 @@ Q_LOGGING_CATEGORY(QRHI_LOG_RUB, "qt.rhi.rub") avoided as it will not be supported by all backends. The maximum patch control point count portable between backends is 32. - \value GeometryShader Indicates that the geometry shader stage is - supported. When supported, a geometry shader can be specified in the - QRhiShaderStage list. Geometry Shaders are considered an experimental - feature in QRhi and can only be expected to be supported with Vulkan, - Direct 3D, OpenGL (3.2+) and OpenGL ES (3.2+), assuming the implementation - reports it as supported at run time. Geometry shaders have portability - issues between APIs, and therefore no guarantees can be given for a - universal solution. They will never be supported with Metal. Whereas with - Direct 3D a handwritten HLSL geometry shader must be injected into each - QShader for the geometry stage since qsb cannot generate this from SPIR-V. + \value GeometryShader Indicates that the geometry shader stage is supported. + When supported, a geometry shader can be specified in the QRhiShaderStage + list. Geometry Shaders are considered an experimental feature in QRhi and + can only be expected to be supported with Vulkan, Direct 3D 11 and 12, + OpenGL (3.2+) and OpenGL ES (3.2+), assuming the implementation reports it + as supported at run time. Starting with Qt 6.11 geometry shaders are + automatically translated to HLSL, and therefore no injection of handwritten + HLSL geometry shaders is necessary anymore (but note that gl_in and + expressions such as gl_in[0].gl_Position are not supported; rather, pass the + position as an output variable from the vertex shader). Geometry shaders are + not supported with Metal. \value TextureArrayRange Indicates that for \l{QRhi::newTextureArray()}{texture arrays} it is possible to specify a diff --git a/tests/manual/rhi/geometryshader/buildshaders.bat b/tests/manual/rhi/geometryshader/buildshaders.bat index a3b7296e168..c4ce5266429 100755 --- a/tests/manual/rhi/geometryshader/buildshaders.bat +++ b/tests/manual/rhi/geometryshader/buildshaders.bat @@ -1,6 +1,5 @@ :: Copyright (C) 2024 The Qt Company Ltd. :: SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 qsb --glsl 320es,410 --hlsl 50 test.vert -o test.vert.qsb -qsb --glsl 320es,410 test.geom -o test.geom.qsb -qsb -r hlsl,50,test_geom.hlsl test.geom.qsb +qsb --glsl 320es,410 --hlsl 50 test.geom -o test.geom.qsb qsb --glsl 320es,410 --hlsl 50 test.frag -o test.frag.qsb diff --git a/tests/manual/rhi/geometryshader/test.frag.qsb b/tests/manual/rhi/geometryshader/test.frag.qsb index b6a5877b951c0f274ba3d1c1990fc83677cd8c02..b857f3629829ff98b25c709136d4180c1ce40538 100644 GIT binary patch literal 450 zcmV;z0X_Zz00dQdoV`*@OT$1Ao<3}C6rZ3sS?Q%k2~n$v#Rv2tLP4?OHH0*cf!HmZ zO;JSfKX~((dJ&!3ZrYgYQ3p1&^X)e?-|PkeDgaP~k>zl$Ko0~s;6n>Igt$b)_|yh} zV2On81j?~OzFH<#b1)0@8eN9G(m4ku< zyM!FV%9M{g!ZvjMRji*!zlj{GMEf<|mC!R>>&U0PlCI0}JBz-c>os*;(byKo#5Gj) zm(y)zm6iSxmR<)iqxvP6LHX~9%%DHPsG{>eaJoY^Ar$po8060M*krHOp(mn%_u1aA z#k|NE2+s`^a2NP@1J(<I@M!^xOvP3CC~okPBoE zdC+B~p;kAZ42Cv7#Vn%Nc1)|@G@cD3Blj)!{N1tK#*Xz5{ppr>Q@>g@lGw=|-OBe4 zkrc5jS?B8F`qpj<9!2(LEC;bn`ejns5$oLAH;(WU=`GBUBPB)vL sQP*lJ;D-d9$oFinf)Oc=nCa%Jafv598H;|Vz;ovLvR62sKwzO#i$*pYh#im6ljvGQml7bJVU}&j}uR=(& zB2ctuwK6TikpGZde`znJnOUt|RcWtZR=)Zne=pi7Mz^x%m>pF>kid5q%dd^elVtV{*gFy(u7=}p56_mV=a{%} zuvZupm+9(vSFe%P)%pvp>Zj1r{mNxf{&z$=cwS=EH+esBx-&f?w9Q-?G~SxA$?ga1 zP-d}6`N`PkVa8T6^kWTN$I8)OPQ z`NdX#?~o~(`-;y$zW=mvr&45@`yp4WT$TN5Dg2zz7w%_IMxnB?Zz+-p?q8Ln$fflK yO)K4PwmYM#+KWoP>I3wq&(JsMb2RT!wUw&&oY`;fu|cSjBK0O4O=iz`&iUs2 z&00bT(IeE+JJ6xBI=@|-Yk(5`G`QX z=@*_TiZUHgr=waVy4`C%JvU&Tq|sh(nRMs6;*&jWdRO#{ZJ_r>oc;;Ix)sUx?%}TK z2W2xipJx4_Dp+{H5FOnG^7Ep@)e?_sJ*9PzG>i|c_e3**n5KKA>Bf-AHt9a1on!b+ z+)?jB#S=ae76TU3usE#Ld?=W(IH3Y52G#<#M1?yQL^c# zT_O%iau4!gdid$i98$c z0OOhYi)>it8SjVhUCs9ad|k}MLtsA;7t8Mf<5~J1*!#f8H0%T5kC4+Sunp34-%{vh zAI|2UJp;}*+{;|CQ zr!#pb7Qw;#AAv0a&uXzRYq3Z96@c$ir`c}>SONXy^S%S;D)dW=vs=yEdRsk&_#Cy~ zfW1JS)`3NS&ow`(`E9~42EXUPej|iuYXI{xpv}h%%*VIH!SbiTwnS@o8PjK%=j;`6 z{!ME!{8>rhTTeo4T{M4d;^t(-_I$^!%DHS>+J5q^cU# z_0HKwTDd$S;6HOq#egGOm1#a$HtbSPHmsWKJB+`~9FuXwb;^>HF;dYHt|twORyyoi zplwCwX`7l#DSc?w3MTl<4vJ)I7)myrl$@0dCY||AX2WgH%;YljOWAxblg?!4^K;o; zHnW(YFEpu6&#ZmKMO0dl>Eo7>O2C?5A`8vFO`nz4LWcBYWnNs$DQPfhlw99Xai*rF zPq~Kg92%9(49l6iF&guN*%mV9#m(wVs4rXUt#cA;#18@qN2SWqqk%9-^M78?>L^s&n4<;#r9NVm!)T)I(}e##z{KWHVc%1 z6(&GdwPNXOw^H%#z$m3t;egN((HxXQ^IUu7+Etyif$2Nk-#Iw4Ha*w(t(|JE9_Z)m zUKGF=TVHPO?H#;GhiBiwuvZVRQRv-YmWM}Lgjdmwp4#rYr3O{qrRz~iO6JtI9Db+x zr)lKr8pvI`REL3Q7tdF&hq0z;?ZCU_dq*~J`Vv%d3o5r=gUV~(161vno1iSN--Qsq z{We%{_%^gE#n1H?plz-a3T?)^#%!<5jajQ`+WTp4)M|FMZ0J;4YFFCz?DRaa$;k^2 z`Fo7(`jWoc4Ry0iZoL{9`P8xY0sX(`GIQfxYO~`Uld&F!b8NQMg^n78mrOICz7`A@ Wqx~1K^YhjE>w^B5hkpT(k`Ud@|Iifx literal 1222 zcmV;%1UdTv01c3Mob6R@Puo@$z6rE|!O)J;KqGrAa%-ejGatR_$|Vey#jr9YdXQuf;rxte;U57Mz>uqA3 z1P^oEf`1Y@yuKeW{IV9=(;;Qg<{7-6*jl?ob_ThF=<#E4M?FM#D##lQ&KT9tU>*_2 z40@WyowBb6`#!J??mn5ryboxdOPuQy)O-LAwzb6F>DXsr=X(77hO?T4?-6ETfQ#)s zF!mR)=Xk!8D)#Bb9G;@yBK4mZ@t2Eh{z1q!aPusNF_RkRGX;B=>;oc-cP=Kd&q3V*>m?Q$^Opd%##HZzzUs*7O*1M-#cXk?TMQcYyssTx@>;jP>(9 zun&PxC$Nuz-^H1xfUQ#%p36LDHG+2qI?KYhPCPuXhtS0ccpf5#{XCN*<`i*o?FHbG zUBdm2QEj%%nA13XQQYE%xC-J__;#r#&;2nt*#9H2CEyE*-fM~8qw_5T-=S$&13bi* zF;lMh9XMCvUrKO3xrB2K_zt0&AU4D}pEbz3V?7Sw4xb?ASE|MuQlSGip@UDMgKsID z?PtKAiddu1M88H^Pp^sdFM6xt|E59w{*#ef6TN>}sW-DHrt4XbEfGF|WH1fKfm&I^dFbbtY`EjvQD&z~ra%G`dDi*4ha;-=8@~FP+ zc$UwXvBH*R@8=JU1RTenn9ZWBFBZeV$ZwpU$*k1asWlx>3)<3i(xan=d+vk|ZG;!1 zUsaqKN*d7{r#Y@-oaOq;eA91!o#5Fxw)__~B=b}QdLDdk*sWdHBBym?vgce;E~w%s z(R)(A_f$c*^}i(EMM_qJ@$-Nix6{$32RZ$}) z>{_Sh(U$%8{GGk6FSd3*>*Y5|A8peOWU?e(^QGnarmG$1^?o8~i()#B=2uR;?U}yT z%Ob||ujY2B=7g9R%e6Q)EN66L8HEQS4R_+{ToD~ecO|;a k`LObpDo*euZ^2mabWFRYh1^lpIZZ-Msx5f_2FchgtNx~Pi~s-t diff --git a/tests/manual/rhi/geometryshader/test.vert b/tests/manual/rhi/geometryshader/test.vert index af06581f6a4..33c52df4e64 100644 --- a/tests/manual/rhi/geometryshader/test.vert +++ b/tests/manual/rhi/geometryshader/test.vert @@ -1,8 +1,10 @@ #version 440 layout(location = 0) in vec3 position; +layout(location = 0) out vec4 v_position; void main() { - gl_Position = vec4(position, 1.0); + v_position = vec4(position, 1.0); + gl_Position = v_position; } diff --git a/tests/manual/rhi/geometryshader/test.vert.qsb b/tests/manual/rhi/geometryshader/test.vert.qsb index 7238d8037b66db246743ca0ddd23b39a4faea13f..4b12cd37d0c3af1b8fa72625aae5d2a2941b26b0 100644 GIT binary patch literal 665 zcmV;K0%rXH00+o;oYhlpYZE~bo_lF*E>%;T7p+xR`XxaLX&Xfv;tN%@P)KZ~=%*tj zX*r0wkh=s#0{#v^`xgX%nqNd`cIUjkOGLp>E-ZWV%ri63%#+;D1>LpLXgT#1!+hW$s=gY7W-n7NeVB%HSMi^o>#>?`3{22X*zjCHY5Y12-J0oX9>*M1h+FM*3*iUwW`8#MAIe$UUL-iDCEON~<*DrC+GSAhL92;(MjYtF8 z+g$Sj<}@L`c#8Rk$Qqt4?(Z`9@Cwn4yibLJhUFPEG;EVG%HKiNr287j=h;uQc!X86 z>}&BI+~hew#a!!h7OJOh=I=1)J63$Cp0Uku3k~B5#BclS?tC~6Jbx?>_UmF8IL@f| z-k*h)k>BrygttV!Di9I#VZR~f?!*r~ax_;ny)h9FL`-w$zBdq5zfyHRI09Fk1%oJW zC9>~{y;{B6l&p)9+tFxR<%Q#3{(e%z1wHV9ErU!0HpUf9sn zG@YbNM7@`G?X>xZJ-IX*pekEVVQxX0tkEaYBN0pd`+e*WgD-9CL*N1?0Z+p{p0 zK-ZE?p;7dK9E$Fl*4HAMGu~zB{(jghQ*zwre>3l8`RYoS#v*W#7em*h??{3sK=an( z0#awJTmdUes%T#tilig8WCw|hU*aa;pqtb(9fq^%I8|PPz1%HSC%m3mR(Q|T7mX{4b_`w4=H}^T`JkOJJ0{}J9Vc=Sa83Yi42MSjJ zK4KM0{^o#xk1Fqz3^FGbb9o%@;u!I~s(mllt#*7?hGDhq@e5P0r*@^EFb8H|=_+zZ8a7`26Xpj=u zCf1Xy8vDA7&lS#5?C^P&^&jF{aQ$kcqy3~DBI&KdP4-5)E}z#JBaJ$17_3oG=A(l= ztutSR`5KU3y5?)}+|quky_0l*dr9^8xtDxBMUQ6gQVIWw$P(^{thK>>?-8vf9yJCz ztjU;>!!{Ws{sF3y-aYPba-Mv>#(MI!#dDx|J4aidOtH_{D>54j^+6@7^zO4uPgGY zf{#dr@mR^>;P~{+ISPX)a*q93tk_hkK|Yrs-hMpl_fOy0Xy^L=eymCa1vAJoJj+>I zq|?ATD(5dF(Nx8uoa?DvmDjVq@>voGap5{1y{9U(Od^-HvLR7X&YT9Wk<{Hma?nM2 d#43JG;d-bxbX6SsC6Yzy*DGJTjz6?I4SoabD6#+m diff --git a/tests/manual/rhi/geometryshader/test_geom.hlsl b/tests/manual/rhi/geometryshader/test_geom.hlsl deleted file mode 100644 index e58659252b1..00000000000 --- a/tests/manual/rhi/geometryshader/test_geom.hlsl +++ /dev/null @@ -1,26 +0,0 @@ -struct VertexOutput -{ - float4 position : SV_Position; -}; - -struct PixelInput -{ - float4 position : SV_POSITION; -}; - -cbuffer buf : register(b0) -{ - float radius : packoffset(c0); -}; - -[maxvertexcount(7)] -void main(point VertexOutput input[1], inout LineStream OutputStream) -{ - PixelInput output; - for (int i = 0; i < 7; ++i) { - float theta = float(i) / 6.0f * 2.0 * 3.14159265; - output.position = input[0].position; - output.position.xy += radius * float2(cos(theta), sin(theta)); - OutputStream.Append(output); - } -}