From 6ad68a6da8d27991fd7bbffc396926a34159198a Mon Sep 17 00:00:00 2001 From: Uwe Rathmann Date: Fri, 22 Dec 2023 13:57:45 +0100 Subject: [PATCH] Qt5/RHI supported --- playground/parrots/Overlay.cpp | 15 ++-- playground/parrots/TextureFilterMaterial.cpp | 78 +++++++++++++------ playground/parrots/TextureFilterMaterial.h | 2 +- playground/parrots/shaders/blur.frag.qsb | Bin 1696 -> 1731 bytes playground/parrots/shaders/blur.vert.qsb | Bin 1378 -> 1394 bytes playground/parrots/shaders/rgbswap.frag.qsb | Bin 1206 -> 1212 bytes src/nodes/QskSceneTexture.cpp | 41 +++++----- 7 files changed, 86 insertions(+), 50 deletions(-) diff --git a/playground/parrots/Overlay.cpp b/playground/parrots/Overlay.cpp index e2e7946c..5dc0ef44 100644 --- a/playground/parrots/Overlay.cpp +++ b/playground/parrots/Overlay.cpp @@ -34,14 +34,15 @@ namespace class FilterNode : public TextureFilterNode { public: - FilterNode( QSGTexture* texture ) + FilterNode( bool useRhi, QSGTexture* texture ) { QString shaders[] = { ":/shaders/blur.vert", ":/shaders/blur.frag" }; -#if QT_VERSION >= QT_VERSION_CHECK( 6, 0, 0 ) - shaders[0] += ".qsb"; - shaders[1] += ".qsb"; -#endif + if ( useRhi ) + { + shaders[0] += ".qsb"; + shaders[1] += ".qsb"; + } setFlag( QSGNode::OwnsMaterial, true ); setTextureMaterial( new Material( shaders[0], shaders[1] ) ); @@ -150,7 +151,9 @@ namespace QObject::connect( texture, &QskSceneTexture::updateRequested, overlay, &QQuickItem::update ); - textureNode = new FilterNode( texture ); + const bool useRhi = qskRenderingHardwareInterface( window ); + + textureNode = new FilterNode( useRhi, texture ); texture->setTextureNode( textureNode ); } diff --git a/playground/parrots/TextureFilterMaterial.cpp b/playground/parrots/TextureFilterMaterial.cpp index dccc1905..57c240b0 100644 --- a/playground/parrots/TextureFilterMaterial.cpp +++ b/playground/parrots/TextureFilterMaterial.cpp @@ -9,6 +9,12 @@ #include #include +#if QT_VERSION < QT_VERSION_CHECK( 6, 0, 0 ) + #include + using RhiShader = QSGMaterialRhiShader; +#else + using RhiShader = QSGMaterialShader; +#endif #if QT_VERSION < QT_VERSION_CHECK( 6, 0, 0 ) @@ -74,31 +80,26 @@ namespace }; } -QSGMaterialShader* TextureFilterMaterial::createShader() const -{ - Q_ASSERT( !( flags() & QSGMaterial::RhiShaderWanted ) ); - - auto shader = new ShaderGL(); - - shader->setSource( QOpenGLShader::Vertex, m_shaderSourceFiles[ 0 ] ); - shader->setSource( QOpenGLShader::Fragment, m_shaderSourceFiles[ 1 ] ); - - return shader; -} - -#else // Qt6 +#endif namespace { - class Shader : public QSGMaterialShader + class ShaderRhi : public RhiShader { public: - Shader() + ShaderRhi() { setFlag( UpdatesGraphicsPipelineState, true ); } - void setSource( QSGMaterialShader::Stage stage, const QString& filename ) +#if QT_VERSION < QT_VERSION_CHECK( 6, 0, 0 ) + void setSource( QOpenGLShader::ShaderType type, const QString& fileName ) + { + setShaderSourceFile( type, fileName ); + } +#endif + + void setSource( Stage stage, const QString& filename ) { setShaderFileName( stage, filename ); } @@ -139,20 +140,50 @@ namespace auto mat = dynamic_cast< TextureFilterMaterial* >( newMaterial ); if ( auto txt = mat->texture() ) { +#if QT_VERSION < QT_VERSION_CHECK( 6, 0, 0 ) + txt->updateRhiTexture( state.rhi(), state.resourceUpdateBatch() ); +#else txt->commitTextureOperations( state.rhi(), state.resourceUpdateBatch() ); +#endif *texture = txt; } } }; } +#if QT_VERSION < QT_VERSION_CHECK( 6, 0, 0 ) + +QSGMaterialShader* TextureFilterMaterial::createShader() const +{ + if ( flags() & QSGMaterial::RhiShaderWanted ) + { + auto shader = new ShaderRhi(); + + shader->setSource( ShaderRhi::VertexStage, m_shaderFiles[ 0 ] ); + shader->setSource( ShaderRhi::FragmentStage, m_shaderFiles[ 1 ] ); + + return shader; + } + else + { + auto shader = new ShaderGL(); + + shader->setSource( QOpenGLShader::Vertex, m_shaderFiles[ 0 ] ); + shader->setSource( QOpenGLShader::Fragment, m_shaderFiles[ 1 ] ); + + return shader; + } +} + +#else + QSGMaterialShader* TextureFilterMaterial::createShader( QSGRendererInterface::RenderMode ) const { - auto shader = new Shader(); + auto shader = new ShaderRhi(); - shader->setSource( Shader::VertexStage, m_shaderSourceFiles[ 0 ] ); - shader->setSource( Shader::FragmentStage, m_shaderSourceFiles[ 1 ] ); + shader->setSource( ShaderRhi::VertexStage, m_shaderFiles[ 0 ] ); + shader->setSource( ShaderRhi::FragmentStage, m_shaderFiles[ 1 ] ); return shader; } @@ -160,11 +191,14 @@ QSGMaterialShader* TextureFilterMaterial::createShader( #endif TextureFilterMaterial::TextureFilterMaterial( - const QString& vertexShaderSourceFile, - const QString& fragmentShaderSourceFile ) - : m_shaderSourceFiles{ vertexShaderSourceFile, fragmentShaderSourceFile } + const QString& vertexShaderFile, const QString& fragmentShaderFile ) + : m_shaderFiles{ vertexShaderFile, fragmentShaderFile } { setFlag( Blending | RequiresFullMatrix, true ); + +#if QT_VERSION < QT_VERSION_CHECK( 6, 0, 0 ) + setFlag( SupportsRhiShader, true ); +#endif } TextureFilterMaterial::~TextureFilterMaterial() diff --git a/playground/parrots/TextureFilterMaterial.h b/playground/parrots/TextureFilterMaterial.h index cf58950b..93a7c9b9 100644 --- a/playground/parrots/TextureFilterMaterial.h +++ b/playground/parrots/TextureFilterMaterial.h @@ -32,5 +32,5 @@ class TextureFilterMaterial : public QSGMaterial private: QSGTexture* m_texture = nullptr; - const QString m_shaderSourceFiles[ 2 ]; + const QString m_shaderFiles[ 2 ]; }; diff --git a/playground/parrots/shaders/blur.frag.qsb b/playground/parrots/shaders/blur.frag.qsb index 40d031bc0d94bffb458704834af81c09be3d8c19..9d04e783873932f85fbb74eba5500cecade2ba7c 100644 GIT binary patch literal 1731 zcmV;!20Zxy02z~bob6fNbK67^zc@)l)soPbeo;QurUbc7U0Iet5+`m#(yyU2WtvW5 zCS*K{ExQ6+%1ClZr}Tk=S9pZKpszf_-@#M=0G{{{cwu1oZZAH|`EY2%Q?He!-P`@` z-rep>cVUc;GR8*W8iGq>H5S0Xkkx@o!NvZe#(En{pJWY?bXb!ufliC-39P-ej<9vs z0Zqo8VR zG<1T|e6D0d%NA|Z&V!|*ZD(y0E$UbG{o%8jTp@?>1*>Ehie|P@FonYcKL;b=W3qB~ z&bDD(wv`p;cY_y-mJLYIEHiI{fnv$DiU6^vCUzX6V=DZApH>vWu*!6UPSY?~FhD40 zj(0S_(|hM8Vl+d#SI7s_=i{5=6AS|I+i-krGRiEPyR49i*Os=+&qa>&9 z6(DeE#N{&S?P?;u!)soD`mC%DQ0BKF2h4Cl%JgNqa3v#rFcin8b;I*B2T1yXvi_jv z_QuTHi5@K$tVGu>tyZ%ORL6dc9R)2W&^QHUuA1s?awM_ihMEBb+uJqa8v7(%BR#OaeJaHP zkOnFhuh8>BYQ-QcBa1~<{lMrCTk%2KmkYXlslu}iP~qOZ+LfW4l5t28Ef_l(6RH6x zgpkVVdE+T*tW>#PfM@C#6Slg#FBncuj^W-wgFVh2;+}w-h`WVj(2w`q_g3y@;8QAN z=S{JR8Q$KNOt3Nj8HSg%F%H)mhP$3&&L2YzctZaBWCQ6_aKDtGFA^@&XB7E6K;NL} zQBIF;)05jWUEUZIyDrHaBDn>QJ&D>t7zDNnsmpg|1=Y8I;7Y?2iG6ZKUt78 zuGQ4a^NOT#4uAOhmm88c;QICZZz|`2uF%*`xN!qGJCt=}jv3 zKP2qSiv20#<63@8ypPDQDaEIB!lx_blf=GCGFKGrY2q6S_BFzvRV literal 1696 zcmV;R24DFA02$VJob6dla~nkv9?Nz_ln|4IyaNmF0Lp#9 zv6v0CN^Vc>q&Vp~K;JEyHJwN&(S8czzeU`m5Hlhkf_419d8d9S8-%T_QP4zy(?gHv zSdxc@vu8T4SZC}c!yTFC{3P0dC*;3N7)T$7@AEPG9N9(sq$Ga}=xg*m%jwx6ogT`J zcu6KsB;rkx+%mU4&3OsJS&8|vLVn;l4pIqDPxGh~Jho}RnF`EPAfKeoO>o`}&*CJ_ zOF-jV3g_?Xr3LUO$wUUFXrhh7WMhVGybj-phx`iBM~D~MoWsLh|Ezk39ptedU|TaK zqR)cnQQ8xBjbcFjW!lecgpc$J@lF8!A?<(U57Mhdqy8GnqP-&Q zd4i3~5BKmd;LMV3JgFTEc&yY+sP@=ZTMJ`8DxA zAiw4%pE5C@E|O1??MozcQL?>2d{wf2nd~n}wzDzYS7PyMv3PUDJ4berr;}bz@+nWY zb;&1#_;S1j^2?BXD#m;&#e6Eqd|D*lY00Onq_-&fR3Y0}C7+gvKPUNACBJZO1$da> z*O{n^Rq_LK{RZ(PTQ^A;`Iy^Bi1#;CN?CM=8S2|ewAip^B>qf4vi-pETqUPzsZHOu z98NuSIuAFMcGok*$`-cc0y7nae%}g}jea}zB&ERUnW2FnzB8zB23J?SP1AD1$CcDm zQ0lu*+w*&ezP_deUf;KD5O`$zj~%z8JhClau{_UjA=7hO3I?TS z2%ayu>~3f(RZgf{R?`;6D3yvvSud1zZBf_DgLY#ziHc&6RU#T+fvj%O$O-6^vrJRLEpt5wHvSvIZkpGBl$A zfF;Ao85#mBmy}5Wa@l+_j{rrztQAXIu2|HB=K>)Qq441JypcBy2++`T!h!7pgsN_U zEf~61&;X)T*7On>*+mzZ_SHEV;Munq1u(g?qtr{KVnr}u!;$!PR0O*A;uHH-O210! zmyyyxj8Eyp%SmakA7Y9cN*gk7)$4kGCFQvLmEl8>SaR=kYVUJmKYLp5b5j2wDV?BO z9F3XZED&znKF`Oiif?zEAhdmTLyMBh_r7fQ%+Dbycs3gYg99{0o`Vhmec`p+fgP%r zmXQ;m%aJ27K_er|;eJ%#OTv1Ma$oi(M5}dC9QDu)ZKWxMnp82eaDc*4nr7%&<<#D# zp4yp-@pdWvJy@Ek5xhXpC+Q56oJ`aknsRU0nzrIyvZWRjD4mYobnrP!P~l!xUdmEU zMR`aWEf{0KgsR60AtZCMawsvI?Afk_DW25G68z!`n$ZcauVd1=K)O7>d7d#K zAYK#Pp#>$nm9<3I9yaYpBYL$7xu`#jlo;)L$HqixWBDW{I4?U;bW8t3TP_|x> qq+a5Q7J@xwmS-g0m}0jk@jn$DWB$t!YdSm1GNR);eEbVPS!)2bY)*#& diff --git a/playground/parrots/shaders/blur.vert.qsb b/playground/parrots/shaders/blur.vert.qsb index f530ee4d1fafc4939f582e6b23296c608538783a..018f8b19961250b0a17765c18964c1cd60e4028d 100644 GIT binary patch literal 1394 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 a9_i+ebxOYWZvy@MFt^JuxBVNg#_%(l*;O|H literal 1206 zcmV;n1WEe<01d==oXuC=ZyQArUw@<~*R%}#Wm%LLFh3cGNf;!Vdb zdJi*J>HAV~yMp#D$p1a!z6m*_$J?NS@2{Tso;M;nY_y*=b%Lcd;(M&3(!x1)JYVZG zR%M7tN%1Ra16Ft7o%l%TEwY0&>OD60s|Niw&>OT~QuIKUDuflXi5?+Di_LS|C z;uXoyW-hKxiVMeEAXQX!No9@eHCQ2-9OgS9UmyGu(RYZ4{_c^zBFV3&wb1gbRD%NTzYXsa#nU0WO1yQT*J-b;@YXo5lMmE? zK)yCe|AC5G^Qu5UBrMS1heSUz{68jHwD$?rqsX$OfHC|5oF%f2*ez2$U7!(zyOe*I za=%aceG6I@RU<8f{9UlPOuR1DW{qqf!n2|<)Vwu{v1r8dIoQN_-=!QMk)5R8$p4xA zZjmiceyha$6Rdu!t6Qcsfy6K?dEw#qsR$!4@cGBhrZo$N>nZBQ8=uVhXc9QGbBXQw zz_cP6#;)YY@yL2@aTrraw(${q^NwODbso$d*OO-*>l~C~-x~$t6t#E^4}+y`N6vIM z5n=0qM?oCA0t8N-@XYha{8YFt?gl|PL}uU(IVM%BlY7{1bC-9y6muDeqIFQyCU&$^ zT?aLu*k6Xu_`s1)zc~PLw{iB<{1yK|#nZ^5wX7U&^X$a1-!j}<&3_+@|1k=`7%2Rn zq44CtLBaDc01(7dXFP&r_Jc_f-UyV1kfbJViUuCnRt84#R~LjwB2=k-#zQgoA}PY! zaWjb{3|`q&=Lc}1fN0O#%7LvR0v&MlV=x*;Le|`7-Na1EQ6M?Nc3mTRlvMnww!TZS znXyQ;+S9o9q$35lwUA9b?8xz!+$lL#mi%~;?}s|JeDLMEqSCSg=cHKc%! z@pA^w%_hh1E8|DrbodcI8YjDOm?ONkd}k^m zfJ|_uwdnJa9*KXrFh~*OYhuh-wMM`1;=9(Y4+aY~J%3S0_WN-Joj(a&Khr~-Q{fvv z^{SRwf-fRyCKVhEu!(#ieU;z)s$)PvUk@svo%DVl>eHGY)_y;^q_kXeF7rhi(); -==== BASE ==== + if ( const auto rhi = context()->rhi() ) + { + auto flags = QRhiTexture::RenderTarget | QRhiTexture::UsedAsTransferSource; -==== BASE ==== - auto flags = QRhiTexture::RenderTarget | QRhiTexture::UsedAsTransferSource; -==== BASE ==== + m_rhiTexture = rhi->newTexture( QRhiTexture::RGBA8, size, 1, flags ); +#if QT_VERSION < QT_VERSION_CHECK( 6, 0, 0 ) + m_rhiTexture->build(); +#else + m_rhiTexture->create(); +#endif -==== BASE ==== - m_rhiTexture = rhi->newTexture( QRhiTexture::RGBA8, size, 1, flags ); - m_rhiTexture->create(); -==== BASE ==== + QRhiColorAttachment color0( m_rhiTexture ); + auto target = rhi->newTextureRenderTarget( { color0 } ); -==== BASE ==== - QRhiColorAttachment color0( m_rhiTexture ); - auto target = rhi->newTextureRenderTarget( { color0 } ); -==== BASE ==== + target->setRenderPassDescriptor( + target->newCompatibleRenderPassDescriptor() ); -==== BASE ==== - target->setRenderPassDescriptor( - target->newCompatibleRenderPassDescriptor() ); -==== BASE ==== +#if QT_VERSION < QT_VERSION_CHECK( 6, 0, 0 ) + target->build(); +#else + target->create(); +#endif -==== BASE ==== - target->create(); -==== BASE ==== + m_rt.rt = target; + m_rt.rpDesc = target->renderPassDescriptor(); auto defaultContext = qobject_cast< QSGDefaultRenderContext* >( context() ); m_rt.cb = defaultContext->currentFrameCommandBuffer();