Loading...
Searching...
No Matches
SimpleRenderedISFNode.hpp
1#pragma once
2
3#include <Gfx/Graph/ISFNode.hpp>
4#include <Gfx/Graph/IsfBindingsBuilder.hpp>
5#include <Gfx/Graph/NodeRenderer.hpp>
6#include <Gfx/Graph/RenderedISFUtils.hpp>
7
8#include <ossia/detail/small_flat_map.hpp>
9
10namespace score::gfx
11{
12// Used for the simple case of a single, non-persistent pass (the most common case)
13
15{
16 SimpleRenderedISFNode(const ISFNode& node) noexcept;
17
18 virtual ~SimpleRenderedISFNode();
19
20 void updateInputTexture(const Port& input, QRhiTexture* tex, QRhiTexture* depthTex = nullptr) override;
21 void updateInputSamplerFilter(const Port& input, const RenderTargetSpecs& spec) override;
22 QRhiTexture* textureForOutput(const Port& output) override;
23
24 void init(RenderList& renderer, QRhiResourceUpdateBatch& res) override;
25 void update(RenderList& renderer, QRhiResourceUpdateBatch& res, Edge* edge) override;
26 void release(RenderList& r) override;
27
28 void initState(RenderList& renderer, QRhiResourceUpdateBatch& res) override;
29 void releaseState(RenderList& r) override;
30 void addOutputPass(RenderList& renderer, Edge& edge, QRhiResourceUpdateBatch& res) override;
31 void removeOutputPass(RenderList& renderer, Edge& edge) override;
32 bool hasOutputPassForEdge(Edge& edge) const override;
33 void addInputEdge(RenderList& renderer, Edge& edge, QRhiResourceUpdateBatch& res) override;
34 void removeInputEdge(RenderList& renderer, Edge& edge) override;
35
36 void runInitialPasses(
37 RenderList&, QRhiCommandBuffer& commands, QRhiResourceUpdateBatch*& res,
38 Edge& edge) override;
39
40 void runRenderPass(RenderList&, QRhiCommandBuffer& commands, Edge& edge) override;
41
42private:
43 void initPass(
44 const TextureRenderTarget& rt, RenderList& renderer, Edge& edge,
45 QRhiResourceUpdateBatch& res);
46 void initMRTPass(RenderList& renderer, QRhiResourceUpdateBatch& res);
47 void initMRTBlitPasses(RenderList& renderer, QRhiResourceUpdateBatch& res);
48 void initMRTBlitPass(RenderList& renderer, QRhiResourceUpdateBatch& res, Edge& edge);
49
50 std::vector<Sampler> allSamplers() const noexcept;
51
52 ossia::small_vector<std::pair<Edge*, Pass>, 2> m_passes;
53
54 ISFNode& n;
55
56 std::vector<Sampler> m_inputSamplers;
57 std::vector<Sampler> m_audioSamplers;
58 ossia::small_flat_map<Edge*, QRhiSampler*, 4> m_blitSamplersByEdge;
59
60 const Mesh* m_mesh{};
61 MeshBuffers m_meshBuffer{};
62
63 QRhiBuffer* m_materialUBO{};
64 int m_materialSize{};
65
66 std::optional<AudioTextureUpload> m_audioTex;
67
68 // MRT: internally-owned render target with multiple attachments
69 TextureRenderTarget m_mrtRenderTarget;
70 bool m_hasMRT{false};
71 // update() runs once per downstream sink; once-per-frame work is keyed
72 // on the RenderList frame counter instead of bools reset in update().
73 int64_t m_lastMRTRenderFrame{-1};
74 int64_t m_lastStorageSwapFrame{-1};
75
76 // Graphics-visible storage buffers / images (see IsfBindingsBuilder).
78
79 // Multiview UBO: N × mat4 view-projection matrices uploaded per frame.
80 QRhiBuffer* m_multiViewUBO{};
81
82 // Cached number of bindings consumed by storage resources (recorded in
83 // initState so that runtime buffer rebinds can reuse the same layout).
84 int m_firstStorageBinding{-1};
85};
86}
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
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 SimpleRenderedISFNode.hpp:15
void removeOutputPass(RenderList &renderer, Edge &edge) override
Definition SimpleRenderedISFNode.cpp:719
void removeInputEdge(RenderList &renderer, Edge &edge) override
Notify the renderer that an input edge was disconnected.
Definition SimpleRenderedISFNode.cpp:868
void updateInputTexture(const Port &input, QRhiTexture *tex, QRhiTexture *depthTex=nullptr) override
Definition SimpleRenderedISFNode.cpp:81
void updateInputSamplerFilter(const Port &input, const RenderTargetSpecs &spec) override
Definition SimpleRenderedISFNode.cpp:125
void addOutputPass(RenderList &renderer, Edge &edge, QRhiResourceUpdateBatch &res) override
Create a pass for a new output edge (pipeline, SRB, processUBO).
Definition SimpleRenderedISFNode.cpp:685
void initState(RenderList &renderer, QRhiResourceUpdateBatch &res) override
Definition SimpleRenderedISFNode.cpp:547
void releaseState(RenderList &r) override
Definition SimpleRenderedISFNode.cpp:774
void addInputEdge(RenderList &renderer, Edge &edge, QRhiResourceUpdateBatch &res) override
Definition SimpleRenderedISFNode.cpp:851
bool hasOutputPassForEdge(Edge &edge) const override
Check if this renderer already has an output pass for the given edge.
Definition SimpleRenderedISFNode.cpp:768
QRhiTexture * textureForOutput(const Port &output) override
Definition SimpleRenderedISFNode.cpp:168
Useful abstraction for storing all the data related to a render target.
Definition score-plugin-gfx/Gfx/Graph/Utils.hpp:152