QSGRenderNode for fullscreen-quad shader rendering via Qt RHI (Vulkan / OpenGL)
More...
|
| | ShaderNodeRhi (QQuickItem *item) |
| |
| | ~ShaderNodeRhi () override |
| |
| void | invalidateItem () |
| | Notify the render node that its owning item is being destroyed.
|
| |
| QSGRenderNode::StateFlags | changedStates () const override |
| |
| QSGRenderNode::RenderingFlags | flags () const override |
| |
| QRectF | rect () const override |
| |
| void | prepare () override |
| |
| void | render (const RenderState *state) override |
| |
| void | releaseResources () override |
| |
| void | setUniformExtension (std::shared_ptr< PhosphorShaders::IUniformExtension > extension) |
| |
| std::shared_ptr< PhosphorShaders::IUniformExtension > | uniformExtension () const |
| | Access the currently-installed uniform extension (may be nullptr).
|
| |
| void | setTime (double time) |
| |
| void | setTimeDelta (float delta) |
| |
| void | setFrame (int frame) |
| |
| void | setResolution (float width, float height) |
| |
| void | setMousePosition (const QPointF &pos) |
| |
| void | setIsReversed (bool reverse) |
| | Direction signal for asymmetric leg rendering.
|
| |
| void | setCustomParams (int index, const QVector4D ¶ms) |
| |
| void | setCustomColor (int index, const QColor &color) |
| |
| void | setAppField0 (int value) |
| | Write the consumer's two int slots inside BaseUniforms (offsets 88, 92).
|
| |
| void | setAppField1 (int value) |
| |
| bool | setExtraBinding (int binding, QRhiTexture *texture, QRhiSampler *sampler) |
| | Bind a consumer-owned texture/sampler at the given binding number.
|
| |
| bool | removeExtraBinding (int binding) |
| |
| void | setAudioSpectrum (const QVector< float > &spectrum) |
| |
| void | setUserTexture (int slot, const QImage &image) |
| |
| void | setUserTextureWrap (int slot, const QString &wrap) |
| | Set per-slot sampler address mode.
|
| |
| void | setWallpaperTexture (const QImage &image) |
| |
| void | setUseWallpaper (bool use) |
| |
| void | setUseDepthBuffer (bool use) |
| |
| void | setSourceTextureProvider (QSGTextureProvider *provider) |
| | Live texture-provider override for user-texture slot 0 (SRB binding 7 / uTexture0).
|
| |
| QSGTextureProvider * | sourceTextureProvider () const |
| |
| void | setBufferShaderPath (const QString &path) |
| |
| void | setBufferShaderPaths (const QStringList &paths) |
| |
| void | setBufferFeedback (bool enable) |
| |
| void | setBufferScale (qreal scale) |
| |
| void | setBufferWrap (const QString &wrap) |
| |
| void | setBufferWraps (const QStringList &wraps) |
| |
| void | setBufferFilter (const QString &filter) |
| |
| void | setBufferFilters (const QStringList &filters) |
| |
| bool | loadVertexShader (const QString &path) |
| |
| bool | loadFragmentShader (const QString &path) |
| |
| void | setVertexShaderSource (const QString &source) |
| |
| void | setFragmentShaderSource (const QString &source) |
| |
| bool | isShaderReady () const |
| |
| QString | shaderError () const |
| |
| void | invalidateShader () |
| |
| void | invalidateUniforms () |
| |
| void | setShaderIncludePaths (const QStringList &paths) |
| |
| void | setParamPreamble (const QString &preamble) |
| | Set the generated named-parameter preamble that is spliced after the fragment shader's #version line at load time (via PhosphorShaders::spliceAfterVersion), so authors read a parameter by name instead of hand-decoding a customParams[N].xyzw lane.
|
| |
| void | setEntryScaffold (const QString &prologue, const QList< PhosphorShaders::EntryCandidate > &candidates) |
| | Install the entry-point scaffold for the fragment stage.
|
| |
|
| static QString | normalizeWrapMode (const QString &wrap) |
| | Normalize wrap mode string to "clamp", "repeat", or "mirror" (static helper, safe to call from any thread — operates on its arguments only).
|
| |
| static QString | normalizeFilterMode (const QString &filter) |
| | Normalize filter mode string to "nearest", "linear", or "mipmap".
|
| |
| static QRhiSampler::AddressMode | wrapModeToRhiAddress (const QString &wrap) |
| | Map a normalized wrap-mode string to QRhiSampler::AddressMode.
|
| |
QSGRenderNode for fullscreen-quad shader rendering via Qt RHI (Vulkan / OpenGL)
Generalized render node extracted from Phosphor's ZoneShaderNodeRhi. Manages a Shadertoy-compatible UBO (BaseUniforms), multipass buffer system, texture bindings (audio, user, wallpaper, depth), and shader baking.
Application-specific UBO data is appended via IUniformExtension. Application-specific texture bindings use setExtraBinding() / removeExtraBinding().
Uses QRhi and QShaderBaker (runtime SPIR-V + GLSL 330 bake). Requires Qt 6.6+ (commandBuffer(), renderTarget()).
- Threading contract
- Setters on this class (ShaderNodeRhi — setTime, setResolution, setCustomParams, setExtraBinding, etc.) must be called from QQuickItem::updatePaintNode() during the scene graph sync phase — the GUI thread is blocked and the render thread is idle at that point. Calling these setters outside updatePaintNode() is a data race with prepare()/render() on the render thread. Only invalidateItem() is safe to call from the GUI thread outside the sync phase (it is the only flag exposed as std::atomic).
(Setters on the sibling ShaderEffect class are a different story — those run on the GUI thread and stage their changes into ShaderEffect's own members, to be pushed down to this node during the next sync phase.)
- Extra binding lifetime (CRITICAL)
- The consumer-owned QRhiTexture/QRhiSampler pointers passed to setExtraBinding() are stored as raw pointers and re-bound on every prepare() until removeExtraBinding() is called. If the consumer drops the texture/sampler (e.g. by calling unique_ptr::reset() or letting it fall out of scope) without first calling removeExtraBinding(), the next prepare() will dereference a dangling pointer — undefined behaviour, typically a crash inside the RHI backend. ALWAYS call removeExtraBinding(binding) before destroying the underlying QRhiTexture/QRhiSampler. No automatic lifetime tracking exists — callers are solely responsible for the remove-before-destroy contract.
| void PhosphorRendering::ShaderNodeRhi::setParamPreamble |
( |
const QString & |
preamble | ) |
|
Set the generated named-parameter preamble that is spliced after the fragment shader's #version line at load time (via PhosphorShaders::spliceAfterVersion), so authors read a parameter by name instead of hand-decoding a customParams[N].xyzw lane.
The empty default is a no-op splice, so non-adopting shaders bake byte-identically to before. The preamble is folded into the bake-cache key, so two effects sharing a .frag but differing in generated defines never collide, and a metadata param edit (which changes the preamble without touching the .frag mtime) still invalidates the cache.
| void PhosphorRendering::ShaderNodeRhi::setSourceTextureProvider |
( |
QSGTextureProvider * |
provider | ) |
|
Live texture-provider override for user-texture slot 0 (SRB binding 7 / uTexture0).
When set, every SRB rebuild reads provider->texture()->rhiTexture() and binds that — superseding whatever QImage was uploaded via setUserTexture(0, ...). The provider must outlive the node OR be cleared with nullptr before destruction; we hold a QPointer so a torn-down provider nulls out cleanly. Designed for QQuickItem::textureProvider() returns from layer-enabled items, where the underlying QSGTexture identity changes when the FBO is recreated (resize, device-loss); the SRB-rebuild detection in prepare() notices that change and refreshes the binding without the consumer having to re-call this setter every frame.