4#include <Crousti/GfxNode.hpp>
9template <
typename Node_T>
11 (avnd::texture_output_introspection<Node_T>::size + avnd::buffer_output_introspection<Node_T>::size + avnd::geometry_output_introspection<Node_T>::size) == 0
15 std::shared_ptr<Node_T> state;
17 ossia::time_value m_last_time{-1};
19 AVND_NO_UNIQUE_ADDRESS texture_inputs_storage<Node_T> texture_ins;
20 AVND_NO_UNIQUE_ADDRESS buffer_inputs_storage<Node_T> buffer_ins;
21 AVND_NO_UNIQUE_ADDRESS geometry_inputs_storage<Node_T> geometry_ins;
23 const GfxNode<Node_T>& node() const noexcept
25 return static_cast<const GfxNode<Node_T>&
>(score::gfx::NodeRenderer::node);
28 GfxRenderer(
const GfxNode<Node_T>& p)
29 :
score::gfx::OutputNodeRenderer{p}
30 , state{
std::make_shared<Node_T>()}
32 prepareNewState<Node_T>(state, p);
38 if constexpr(avnd::texture_input_introspection<Node_T>::size > 0)
40 auto it = texture_ins.m_rts.find(&p);
41 SCORE_ASSERT(it != texture_ins.m_rts.end());
49 auto& parent = node();
50 if constexpr(
requires { state->prepare(); })
52 this->node().processControlIn(
53 *
this, *state, m_last_message, this->node().last_message, this->node().m_ctx);
58 if constexpr(avnd::texture_input_introspection<Node_T>::size > 0)
59 texture_ins.init(*
this, renderer);
61 if_possible(state->init(renderer, res));
68 auto& parent = node();
69 parent.processControlIn(
70 *
this, *state, m_last_message, parent.last_message, parent.m_ctx);
73 if constexpr(avnd::texture_input_introspection<Node_T>::size > 0)
75 updated |= texture_ins.update(*
this, renderer, res);
77 if_possible(state->update(renderer, res, e));
87 if constexpr(avnd::texture_input_introspection<Node_T>::size > 0)
88 texture_ins.release();
90 if constexpr(avnd::geometry_input_introspection<Node_T>::size > 0)
91 geometry_ins.release(r);
94 avnd::texture_input_introspection<Node_T>::size > 0
95 || avnd::texture_output_introspection<Node_T>::size > 0)
100 if_possible(state->release(r));
103 void inputAboutToFinish(
105 QRhiResourceUpdateBatch*& res)
override
108 avnd::texture_input_introspection<Node_T>::size > 0
109 || avnd::buffer_input_introspection<Node_T>::size > 0
110 || avnd::geometry_input_introspection<Node_T>::size > 0)
112 res = renderer.
state.rhi->nextResourceUpdateBatch();
114 if constexpr(avnd::texture_input_introspection<Node_T>::size > 0)
115 texture_ins.inputAboutToFinish(this->node(), p, res);
116 if constexpr(avnd::buffer_input_introspection<Node_T>::size > 0)
117 buffer_ins.inputAboutToFinish(renderer, res, *state, this->node());
118 if constexpr(avnd::geometry_input_introspection<Node_T>::size > 0)
119 geometry_ins.inputAboutToFinish(
120 renderer, res, this->geometry, *state, this->node());
123 if_possible(state->inputAboutToFinish(renderer, p, res));
126 void runInitialPasses(
130 auto& parent = this->node();
131 auto& rhi = *renderer.
state.rhi;
137 if(parent.last_message.token.date == m_last_time)
139 m_last_time = parent.last_message.token.date;
141 if constexpr(avnd::texture_input_introspection<Node_T>::size > 0)
142 texture_ins.runInitialPasses(*
this, rhi);
143 if constexpr(avnd::buffer_input_introspection<Node_T>::size > 0)
144 buffer_ins.readInputBuffers(renderer, parent, *state);
145 if constexpr(avnd::geometry_input_introspection<Node_T>::size > 0)
146 geometry_ins.readInputGeometries(renderer, this->geometry, parent, *state);
148 parent.processControlIn(
149 *
this, *state, m_last_message, parent.last_message, parent.m_ctx);
152 if_possible(state->runInitialPasses(renderer, commands, res, edge));
153 if_possible((*state)());
156 parent.processControlOut(*this->state);
160template <
typename Node_T>
162 (avnd::texture_output_introspection<Node_T>::size + avnd::buffer_output_introspection<Node_T>::size + avnd::geometry_output_introspection<Node_T>::size) == 0
164struct GfxNode<Node_T> final
165 : CustomGpuOutputNodeBase
166 , GpuNodeElements<Node_T>
171 std::weak_ptr<Execution::ExecutionCommandQueue> q, Gfx::exec_controls ctls,
173 : CustomGpuOutputNodeBase{
std::move(q),
std::move(ctls), ctx}
174 , processModel{element}
178 initGfxPorts<Node_T>(
this, this->input, this->output);
184 return new GfxRenderer<Node_T>{*
this};
Definition score-plugin-avnd/Crousti/ProcessModel.hpp:86
Definition OutputNode.hpp:18
List of nodes to be rendered to an output.
Definition RenderList.hpp:19
RenderState & state
RenderState corresponding to this RenderList.
Definition RenderList.hpp:94
Definition Factories.hpp:19
Base toolkit upon which the software is built.
Definition Application.cpp:111
Definition DocumentContext.hpp:18
Connection between two score::gfx::Port.
Definition score-plugin-gfx/Gfx/Graph/Utils.hpp:71
Definition score-plugin-gfx/Gfx/Graph/Node.hpp:49
Port of a score::gfx::Node.
Definition score-plugin-gfx/Gfx/Graph/Utils.hpp:53
Useful abstraction for storing all the data related to a render target.
Definition score-plugin-gfx/Gfx/Graph/Utils.hpp:116