diff --git a/src/controls/QskQuick.cpp b/src/controls/QskQuick.cpp index 7760e916..9d223a36 100644 --- a/src/controls/QskQuick.cpp +++ b/src/controls/QskQuick.cpp @@ -19,6 +19,14 @@ QSK_QT_PRIVATE_END #include #include +QRhi* qskRenderingHardwareInterface( const QQuickWindow* window ) +{ + if ( auto w = const_cast< QQuickWindow* >( window ) ) + return QQuickWindowPrivate::get( w )->rhi; + + return nullptr; +} + QRectF qskItemRect( const QQuickItem* item ) { auto d = QQuickItemPrivate::get( item ); diff --git a/src/controls/QskQuick.h b/src/controls/QskQuick.h index 622b108d..c8afaafd 100644 --- a/src/controls/QskQuick.h +++ b/src/controls/QskQuick.h @@ -18,14 +18,16 @@ class QSGNode; class QSGTransformNode; class QSGRootNode; class QRectF; +class QRhi; template< typename T > class QList; /* - Exporting methods from QQuickItemPrivate, that should be part - of QQuickItem. + Exporting useful methods from QQuickItemPrivate/QQuickWindowPrivate */ +QSK_EXPORT QRhi* qskRenderingHardwareInterface( const QQuickWindow* ); + QSK_EXPORT bool qskIsItemInDestructor( const QQuickItem* ); QSK_EXPORT bool qskIsItemComplete( const QQuickItem* ); QSK_EXPORT bool qskIsAncestorOf( const QQuickItem* item, const QQuickItem* child ); diff --git a/src/nodes/QskGradientMaterial.cpp b/src/nodes/QskGradientMaterial.cpp index 7be7d994..29771012 100644 --- a/src/nodes/QskGradientMaterial.cpp +++ b/src/nodes/QskGradientMaterial.cpp @@ -22,7 +22,7 @@ #endif #if QT_VERSION < QT_VERSION_CHECK( 6, 0, 0 ) - #include + #include using RhiShader = QSGMaterialRhiShader; #else using RhiShader = QSGMaterialShader; diff --git a/src/nodes/QskSceneTexture.cpp b/src/nodes/QskSceneTexture.cpp index 7e69eb2b..58695720 100644 --- a/src/nodes/QskSceneTexture.cpp +++ b/src/nodes/QskSceneTexture.cpp @@ -19,8 +19,8 @@ QSK_QT_PRIVATE_BEGIN QSK_QT_PRIVATE_END /* - With Qt 5.15 Rhi can optionally be enbled by setting "export QSG_RHI=1" - and we need to have a native QOpenGL implementation and one using + With Qt 5.15 Rhi can optionally be enbled by setting "export QSG_RHI=1". + So we need to have a native QOpenGL implementation and one using the Rhi abstraction layer. For Qt6 we can rely on Rhi. Once Qt5 support has been dropped we can eliminate this #ifdef jungle */ @@ -202,34 +202,41 @@ namespace void Renderer::createTarget( const QSize& size ) { - if ( const auto rhi = context()->rhi() ) - { - auto flags = QRhiTexture::RenderTarget | QRhiTexture::UsedAsTransferSource; +==== BASE ==== + const auto rhi = context()->rhi(); +==== 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 ==== + auto flags = QRhiTexture::RenderTarget | QRhiTexture::UsedAsTransferSource; +==== BASE ==== - QRhiColorAttachment color0( m_rhiTexture ); - auto target = rhi->newTextureRenderTarget( { color0 } ); +==== BASE ==== + m_rhiTexture = rhi->newTexture( QRhiTexture::RGBA8, size, 1, flags ); + m_rhiTexture->create(); +==== BASE ==== - target->setRenderPassDescriptor( - target->newCompatibleRenderPassDescriptor() ); +==== BASE ==== + QRhiColorAttachment color0( m_rhiTexture ); + auto target = rhi->newTextureRenderTarget( { color0 } ); +==== BASE ==== -#if QT_VERSION < QT_VERSION_CHECK( 6, 0, 0 ) - target->build(); -#else - target->create(); -#endif +==== BASE ==== + target->setRenderPassDescriptor( + target->newCompatibleRenderPassDescriptor() ); +==== BASE ==== - m_rt.rt = target; - m_rt.rpDesc = target->renderPassDescriptor(); +==== BASE ==== + target->create(); +==== BASE ==== auto defaultContext = qobject_cast< QSGDefaultRenderContext* >( context() ); m_rt.cb = defaultContext->currentFrameCommandBuffer(); + +#if QT_VERSION < QT_VERSION_CHECK( 6, 0, 0 ) + setRenderTarget( m_rt.rt ); + setCommandBuffer( m_rt.cb ); + setRenderPassDescriptor( m_rt.rpDesc ); +#endif } else { diff --git a/src/nodes/QskSceneTexture.h b/src/nodes/QskSceneTexture.h index 39e267a5..56acdb3e 100644 --- a/src/nodes/QskSceneTexture.h +++ b/src/nodes/QskSceneTexture.h @@ -27,7 +27,7 @@ class QSK_EXPORT QskSceneTexture : public QSGTexture ~QskSceneTexture(); #if 1 - // to avoid recursive update, need to find a better solution + // to avoid recursive update - need to find a better solution TODO void setTextureNode( const QSGGeometryNode* ); const QSGGeometryNode* textureNode() const; #endif diff --git a/src/nodes/QskTextureRenderer.cpp b/src/nodes/QskTextureRenderer.cpp index d7279b90..4d545736 100644 --- a/src/nodes/QskTextureRenderer.cpp +++ b/src/nodes/QskTextureRenderer.cpp @@ -4,6 +4,7 @@ *****************************************************************************/ #include "QskTextureRenderer.h" +#include "QskQuick.h" #include #include @@ -17,7 +18,6 @@ QSK_QT_PRIVATE_BEGIN #include #include -#include QSK_QT_PRIVATE_END #if QT_VERSION >= QT_VERSION_CHECK( 6, 0, 0 ) @@ -89,7 +89,7 @@ void QskTextureRenderer::setTextureId( QQuickWindow* window, if ( plainTexture == nullptr ) return; - auto rhi = QQuickWindowPrivate::get( window )->rhi; + auto rhi = qskRenderingHardwareInterface( window ); #if QT_VERSION >= QT_VERSION_CHECK( 6, 4, 0 ) diff --git a/src/nodes/shaders/boxshadow.frag.qsb b/src/nodes/shaders/boxshadow.frag.qsb index 9a799078..8ecfc828 100644 Binary files a/src/nodes/shaders/boxshadow.frag.qsb and b/src/nodes/shaders/boxshadow.frag.qsb differ diff --git a/src/nodes/shaders/boxshadow.vert.qsb b/src/nodes/shaders/boxshadow.vert.qsb index 4d371492..d9831605 100644 Binary files a/src/nodes/shaders/boxshadow.vert.qsb and b/src/nodes/shaders/boxshadow.vert.qsb differ diff --git a/src/nodes/shaders/crisplines.frag.qsb b/src/nodes/shaders/crisplines.frag.qsb index fb01e7de..274f8d55 100644 Binary files a/src/nodes/shaders/crisplines.frag.qsb and b/src/nodes/shaders/crisplines.frag.qsb differ diff --git a/src/nodes/shaders/crisplines.vert.qsb b/src/nodes/shaders/crisplines.vert.qsb index c25564dc..674b357c 100644 Binary files a/src/nodes/shaders/crisplines.vert.qsb and b/src/nodes/shaders/crisplines.vert.qsb differ diff --git a/src/nodes/shaders/gradientconic.frag.qsb b/src/nodes/shaders/gradientconic.frag.qsb index c2a0848e..8a7e83b9 100644 Binary files a/src/nodes/shaders/gradientconic.frag.qsb and b/src/nodes/shaders/gradientconic.frag.qsb differ diff --git a/src/nodes/shaders/gradientconic.vert.qsb b/src/nodes/shaders/gradientconic.vert.qsb index e1b0505c..f807bce7 100644 Binary files a/src/nodes/shaders/gradientconic.vert.qsb and b/src/nodes/shaders/gradientconic.vert.qsb differ diff --git a/src/nodes/shaders/gradientlinear.frag.qsb b/src/nodes/shaders/gradientlinear.frag.qsb index 0d042678..be5fa92c 100644 Binary files a/src/nodes/shaders/gradientlinear.frag.qsb and b/src/nodes/shaders/gradientlinear.frag.qsb differ diff --git a/src/nodes/shaders/gradientlinear.vert.qsb b/src/nodes/shaders/gradientlinear.vert.qsb index 55c4d629..4a4a0b36 100644 Binary files a/src/nodes/shaders/gradientlinear.vert.qsb and b/src/nodes/shaders/gradientlinear.vert.qsb differ diff --git a/src/nodes/shaders/gradientradial.frag.qsb b/src/nodes/shaders/gradientradial.frag.qsb index 5af5a391..9759ed4c 100644 Binary files a/src/nodes/shaders/gradientradial.frag.qsb and b/src/nodes/shaders/gradientradial.frag.qsb differ diff --git a/src/nodes/shaders/gradientradial.vert.qsb b/src/nodes/shaders/gradientradial.vert.qsb index c81c721d..b530364f 100644 Binary files a/src/nodes/shaders/gradientradial.vert.qsb and b/src/nodes/shaders/gradientradial.vert.qsb differ diff --git a/src/nodes/shaders/vulkan2qsb.sh b/src/nodes/shaders/vulkan2qsb.sh index 22e28e10..765f5127 100755 --- a/src/nodes/shaders/vulkan2qsb.sh +++ b/src/nodes/shaders/vulkan2qsb.sh @@ -3,6 +3,7 @@ function qsbcompile { qsbfile=`echo $1 | sed 's/-vulkan//'` qsb --glsl 100es,120,150 --hlsl 50 --msl 12 -b -o ${qsbfile}.qsb $1 + # qsb --qt6 -b -o ${qsbfile}.qsb $1 } qsbcompile boxshadow-vulkan.vert