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{
15constexpr int
16persistentTextureIndex(int writerPass, int readerPass, int frameParity) noexcept
17{
18 return writerPass < readerPass ? frameParity : 1 - frameParity;
19}
20
21struct SCORE_PLUGIN_GFX_EXPORT RenderedISFNode : score::gfx::NodeRenderer
22{
23 explicit RenderedISFNode(const ISFNode& node) noexcept;
24
25 virtual ~RenderedISFNode();
26
27 void updateInputTexture(const Port& input, QRhiTexture* tex, QRhiTexture* depthTex = nullptr) override;
28 void updateInputSamplerFilter(const Port& input, const RenderTargetSpecs& spec) override;
29 void addInputEdge(RenderList& renderer, Edge& edge, QRhiResourceUpdateBatch& res) override;
30 void removeInputEdge(RenderList& renderer, Edge& edge) override;
31
32 void init(RenderList& renderer, QRhiResourceUpdateBatch& res) override;
33 void update(RenderList& renderer, QRhiResourceUpdateBatch& res, Edge* e) override;
34 void release(RenderList& r) override;
35
36 void initState(RenderList& renderer, QRhiResourceUpdateBatch& res) override;
37 void releaseState(RenderList& renderer) override;
38 void addOutputPass(
39 RenderList& renderer, Edge& edge, QRhiResourceUpdateBatch& res) override;
40 void removeOutputPass(RenderList& renderer, Edge& edge) override;
41 bool hasOutputPassForEdge(Edge& edge) const override;
42
43 void runInitialPasses(
44 RenderList&, QRhiCommandBuffer& commands, QRhiResourceUpdateBatch*& res,
45 Edge& edge) override;
46
47 void runRenderPass(RenderList&, QRhiCommandBuffer& commands, Edge& edge) override;
48
49 QRhiGraphicsPipeline::CompareOp depthCompare() const noexcept override;
50
53 int blittedEdges() const noexcept;
54
55private:
56 std::pair<Pass, Pass> createPass(
57 RenderList& renderer, ossia::small_vector<PassOutput, 1>& m_passSamplers,
58 PassOutput target, const isf::pass& modelPass, int passIndex);
59
60 std::pair<Pass, Pass> createFinalPass(
61 RenderList& renderer, ossia::small_vector<PassOutput, 1>& m_passSamplers,
62 const TextureRenderTarget& target);
63 void initPasses(
64 const TextureRenderTarget& rt, RenderList& renderer, Edge& edge, QSize mainTexSize,
65 QRhiResourceUpdateBatch& res);
66
68 isf::pipeline_state lastPassState() const;
72 bool lastPassCarriesDepth() const;
73
75 bool passSizesChanged(RenderList& renderer);
76
77 PassOutput initPassSampler(
78 ISFNode& n, const isf::pass& pass, int passIndex, RenderList& renderer,
79 QSize mainTexSize, QRhiResourceUpdateBatch& res);
80
81 void releaseDetachedPassOutputs() noexcept;
82
83 struct Passes
84 {
85 ossia::small_vector<Pass, 1> passes;
86 ossia::small_vector<Pass, 1> altPasses;
87 ossia::small_vector<PassOutput, 1> samplers;
88 };
89
96 struct DetachedPassOutput
97 {
98 int passIndex{};
99 PersistSampler output;
100 };
101 std::vector<DetachedPassOutput> m_detachedPassOutputs;
102
103 std::vector<Sampler> allSamplers(
104 ossia::small_vector<PassOutput, 1>&, int readerPass,
105 int frameParity) const noexcept;
106
107 ossia::small_vector<std::pair<Edge*, Passes>, 2> m_passes;
108
109 ISFNode& n;
110
111 std::vector<Sampler> m_inputSamplers;
112 std::vector<int> m_storageImageSamplers;
113 std::vector<Sampler> m_audioSamplers;
114
115 std::vector<TextureRenderTarget> m_innerPassTargets;
116
117 const Mesh* m_mesh{};
118 MeshBuffers m_meshBuffer{};
119
120 QRhiBuffer* m_materialUBO{};
121 int m_materialSize{};
122
123 AudioTextureUpload m_audioTex;
124
125 // Graphics-visible storage buffers / images declared by the shader
126 // (storage_input / csf_image_input / uniform_input). See IsfBindingsBuilder.
127 GraphicsStorageResources m_storage;
128
129 // First binding slot reserved for storage resources; determined lazily in
130 // initPasses once the pass-sampler count is known (Rendered differs from
131 // Simple by having one extra sampler per inner pass).
132 int m_firstStorageBinding{-1};
133 int m_firstSamplerBinding{3};
134
135 // Guard so the persistent-SSBO state swap runs exactly once per frame even
136 // when the node has multiple output edges (each triggers runRenderPass).
137 // update() runs once per downstream sink, so once-per-frame work must be
138 // keyed on the RenderList's frame counter, not a bool reset in update().
139 int64_t m_lastStorageSwapFrame{-1};
140
141 int64_t m_frameIndexFrame{-1};
142
143 // Nearest sampler of the depth the copy of a last pass with its own target
144 // carries (createFinalPass); only made for a shader whose depth travels.
145 QRhiSampler* m_depthCopySampler{};
146
147 // initPasses warned that the last pass's depth stays in its own target.
148 bool m_warnedLastPassDepth{};
149};
150
151}
Definition ISFNode.hpp:39
Renderer for a given node.
Definition NodeRenderer.hpp:11
List of nodes to be rendered to an output.
Definition RenderList.hpp:36
Graphics rendering pipeline for ossia score.
Definition Filter/PreviewWidget.hpp:11
constexpr int persistentTextureIndex(int writerPass, int readerPass, int frameParity) noexcept
Definition RenderedISFNode.hpp:16
void updateInputSamplerFilter(std::span< Sampler > samplers, const score::gfx::Node &node, const Port &input, const RenderTargetSpecs &spec)
Give the sampler initInputSamplers() created for input, one of node's input ports,...
Definition score-plugin-gfx/Gfx/Graph/Utils.cpp:2213
Definition RenderedISFUtils.hpp:35
Connection between two score::gfx::Port.
Definition score-plugin-gfx/Gfx/Graph/Utils.hpp:236
Aggregate of all graphics-visible storage resources for a node.
Definition IsfBindingsBuilder.hpp:143
Definition Mesh.hpp:95
Data model for meshes.
Definition Mesh.hpp:196
Definition RenderedISFUtils.hpp:14
Port of a score::gfx::Node.
Definition score-plugin-gfx/Gfx/Graph/Utils.hpp:215
Definition score-plugin-gfx/Gfx/Graph/Node.hpp:71
Definition RenderedISFNode.hpp:22
Useful abstraction for storing all the data related to a render target.
Definition score-plugin-gfx/Gfx/Graph/Utils.hpp:307