Loading...
Searching...
No Matches
RenderedISFNode.hpp
1#pragma once
2#include <Gfx/Graph/ISFNode.hpp>
3#include <Gfx/Graph/IsfBindingsBuilder.hpp>
4#include <Gfx/Graph/NodeRenderer.hpp>
5#include <Gfx/Graph/RenderedISFUtils.hpp>
6
7namespace score::gfx
8{
10{
11 explicit RenderedISFNode(const ISFNode& node) noexcept;
12
13 virtual ~RenderedISFNode();
14
15 void updateInputTexture(const Port& input, QRhiTexture* tex, QRhiTexture* depthTex = nullptr) override;
16 void updateInputSamplerFilter(const Port& input, const RenderTargetSpecs& spec) override;
17 void addInputEdge(RenderList& renderer, Edge& edge, QRhiResourceUpdateBatch& res) override;
18 void removeInputEdge(RenderList& renderer, Edge& edge) override;
19
20 void init(RenderList& renderer, QRhiResourceUpdateBatch& res) override;
21 void update(RenderList& renderer, QRhiResourceUpdateBatch& res, Edge* e) override;
22 void release(RenderList& r) override;
23
24 void initState(RenderList& renderer, QRhiResourceUpdateBatch& res) override;
25 void releaseState(RenderList& renderer) override;
26 void addOutputPass(
27 RenderList& renderer, Edge& edge, QRhiResourceUpdateBatch& res) override;
28 void removeOutputPass(RenderList& renderer, Edge& edge) override;
29 bool hasOutputPassForEdge(Edge& edge) const override;
30
31 void runInitialPasses(
32 RenderList&, QRhiCommandBuffer& commands, QRhiResourceUpdateBatch*& res,
33 Edge& edge) override;
34
35 void runRenderPass(RenderList&, QRhiCommandBuffer& commands, Edge& edge) override;
36
37private:
38 std::pair<Pass, Pass> createPass(
39 RenderList& renderer, ossia::small_vector<PassOutput, 1>& m_passSamplers,
40 PassOutput target, const isf::pass& modelPass,
41 bool previousPassIsPersistent);
42
43 std::pair<Pass, Pass> createFinalPass(
44 RenderList& renderer, ossia::small_vector<PassOutput, 1>& m_passSamplers,
45 const TextureRenderTarget& target);
46 void initPasses(
47 const TextureRenderTarget& rt, RenderList& renderer, Edge& edge, QSize mainTexSize,
48 QRhiResourceUpdateBatch& res);
49
50 PassOutput initPassSampler(
51 ISFNode& n, const isf::pass& pass, RenderList& renderer, QSize mainTexSize,
52 QRhiResourceUpdateBatch& res);
53
54 struct Passes
55 {
56 ossia::small_vector<Pass, 1> passes;
57 ossia::small_vector<Pass, 1> altPasses;
58 ossia::small_vector<PassOutput, 1> samplers;
59 };
60
61 std::vector<Sampler>
62 allSamplers(ossia::small_vector<PassOutput, 1>&, int mainOrAltPass) const noexcept;
63
64 ossia::small_vector<std::pair<Edge*, Passes>, 2> m_passes;
65
66 ISFNode& n;
67
68 std::vector<Sampler> m_inputSamplers;
69 std::vector<Sampler> m_audioSamplers;
70
71 std::vector<TextureRenderTarget> m_innerPassTargets;
72
73 const Mesh* m_mesh{};
74 MeshBuffers m_meshBuffer{};
75
76 QRhiBuffer* m_materialUBO{};
77 int m_materialSize{};
78
79 AudioTextureUpload m_audioTex;
80
81 // Graphics-visible storage buffers / images declared by the shader
82 // (storage_input / csf_image_input / uniform_input). See IsfBindingsBuilder.
84
85 // Multiview UBO: N × mat4 view-projection matrices, when MULTIVIEW >= 2.
86 QRhiBuffer* m_multiViewUBO{};
87
88 // First binding slot reserved for storage resources; determined lazily in
89 // initPasses once the pass-sampler count is known (Rendered differs from
90 // Simple by having one extra sampler per inner pass).
91 int m_firstStorageBinding{-1};
92
93 // Guard so the persistent-SSBO state swap runs exactly once per frame even
94 // when the node has multiple output edges (each triggers runRenderPass).
95 // update() runs once per downstream sink, so once-per-frame work must be
96 // keyed on the RenderList's frame counter, not a bool reset in update().
97 int64_t m_lastStorageSwapFrame{-1};
98};
99
100}
Data model for Interactive Shader Format filters.
Definition ISFNode.hpp:22
Renderer for a given node.
Definition NodeRenderer.hpp:11
List of nodes to be rendered to an output.
Definition RenderList.hpp:30
Graphics rendering pipeline for ossia score.
Definition Filter/PreviewWidget.hpp:11
Definition RenderedISFUtils.hpp:21
Connection between two score::gfx::Port.
Definition score-plugin-gfx/Gfx/Graph/Utils.hpp:103
Aggregate of all graphics-visible storage resources for a node.
Definition IsfBindingsBuilder.hpp:115
Definition Mesh.hpp:94
Data model for meshes.
Definition Mesh.hpp:179
Port of a score::gfx::Node.
Definition score-plugin-gfx/Gfx/Graph/Utils.hpp:82
Definition score-plugin-gfx/Gfx/Graph/Node.hpp:56
Definition RenderedISFNode.hpp:10
void removeInputEdge(RenderList &renderer, Edge &edge) override
Notify the renderer that an input edge was disconnected.
Definition RenderedISFNode.cpp:702
void releaseState(RenderList &renderer) override
Definition RenderedISFNode.cpp:878
void addOutputPass(RenderList &renderer, Edge &edge, QRhiResourceUpdateBatch &res) override
Create a pass for a new output edge (pipeline, SRB, processUBO).
Definition RenderedISFNode.cpp:674
void addInputEdge(RenderList &renderer, Edge &edge, QRhiResourceUpdateBatch &res) override
Definition RenderedISFNode.cpp:684
void initState(RenderList &renderer, QRhiResourceUpdateBatch &res) override
Definition RenderedISFNode.cpp:636
void updateInputTexture(const Port &input, QRhiTexture *tex, QRhiTexture *depthTex=nullptr) override
Definition RenderedISFNode.cpp:135
void updateInputSamplerFilter(const Port &input, const RenderTargetSpecs &spec) override
Definition RenderedISFNode.cpp:189
void removeOutputPass(RenderList &renderer, Edge &edge) override
Definition RenderedISFNode.cpp:720
bool hasOutputPassForEdge(Edge &edge) const override
Check if this renderer already has an output pass for the given edge.
Definition RenderedISFNode.cpp:754
Useful abstraction for storing all the data related to a render target.
Definition score-plugin-gfx/Gfx/Graph/Utils.hpp:152