Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
101 commits
Select commit Hold shift + click to select a range
f7e4031
isf: TEX_DIMENSIONS_3D / IMG_SIZE_3D aliases for 3D samplers
jcelerier May 4, 2026
1a0ffc4
isf: point3d_input AS_COLOR flag for color-swatch display
jcelerier May 4, 2026
9d3d325
isf: parse-time warning on unknown csf_image_input FORMAT
jcelerier May 4, 2026
e8d272a
isf: parser rework — top-level descriptors, uniform inputs, geometry …
jcelerier May 4, 2026
41443fc
3rdparty: add OffsetAllocator submodule
jcelerier May 4, 2026
1944985
gfx: add AssetTable + TextureLoader for shared decoded-asset cache
jcelerier May 4, 2026
98bf94f
gfx: add GpuResourceRegistry — slab-allocated GPU arenas backed by Of…
jcelerier May 4, 2026
23d4276
gfx: add CameraMath / GpuTiming / VertexFallback helpers
jcelerier May 4, 2026
bd93207
gfx: add IsfBindingsBuilder + PipelineStateHelpers
jcelerier May 4, 2026
813dae8
gfx: add SceneGPUState — FlatScene + scene packer
jcelerier May 4, 2026
4745b5f
gfx: add OffscreenDevice + RhiPreviewWidget + Metal buffer-copy backend
jcelerier May 4, 2026
2ab12d5
gfx: extend ISF / SimpleRenderedISF nodes for new ISF features
jcelerier May 4, 2026
4920035
csf: rework for scene-aware compute pipeline
jcelerier May 4, 2026
ea8a9b6
gfx: rework raw raster pipeline (MRT, AUXILIARY, EXECUTION_MODEL) and…
jcelerier May 4, 2026
582a6c7
gfx: refresh shared graph plumbing for incremental scene pipeline
jcelerier May 4, 2026
7664b48
gfx: add ScenePreprocessorNode — scene_spec to flat draws + arena upl…
jcelerier May 4, 2026
30ce172
gfx: add SceneFilterNode + FlattenedSceneFilterNode + MergeGeometries…
jcelerier May 4, 2026
c4e2653
avnd: split CpuFilter / CpuAnalysis lifecycle into init / initState /…
jcelerier May 4, 2026
d703e1d
avnd: add scene_port concept
jcelerier May 4, 2026
5948674
avnd: split GpuNode lifecycle and add scene_port storage helpers
jcelerier May 4, 2026
15577f1
gfx: extend ShaderProgram for new ISF features
jcelerier May 4, 2026
2068312
gfx: refresh Filter / GeometryFilter / TexturePort for new pipeline
jcelerier May 4, 2026
52aa6e6
gfx: refresh WindowDevice / Spout / Syphon / WindowCapture
jcelerier May 4, 2026
ec41476
gfx: refresh GfxContext + window / screen / multiwindow nodes for inc…
jcelerier May 4, 2026
eb50d55
js: gpu node lifecycle rework with deterministic teardown
jcelerier May 4, 2026
6704d8a
wip: many bugfixes across the board
jcelerier May 14, 2026
fa22767
build: more build fixes
jcelerier May 14, 2026
9cd51e6
ci: fixes for older qt versions
jcelerier May 15, 2026
14b20a0
rhi: populate caps
jcelerier May 15, 2026
46d86b4
ci: try windows fixes
jcelerier May 16, 2026
31f1dfb
gfx: restore PhongNode, still used by score-vfx-template
claude Jun 11, 2026
01865a9
gfx: keep TextureRenderTarget compatible with addons' aggregate init
claude Jun 11, 2026
465b9ad
gfx: do not include mmsystem.h in CommonUBOs.hpp
claude Jun 11, 2026
376e12c
gfx: fix build with Qt < 6.9
claude Jun 11, 2026
a5c08b7
gfx: fix designator order after TextureRenderTarget reorder
claude Jun 11, 2026
0425c18
gfx: fix build with Qt 6.4
claude Jun 11, 2026
c0fc579
gfx: more Qt 6.4 compatibility guards
claude Jun 11, 2026
cf7bc19
gfx: QRhi render-graph core fixes (PR #2050 review)
jcelerier Jun 16, 2026
903695d
gfx: ISF/CSF shader port-routing + codegen coherence (PR #2050)
jcelerier Jun 16, 2026
2b47961
gfx: harden GfxContext incremental edge updates (PR #2050)
jcelerier Jun 16, 2026
9e9e003
gfx: scene-preprocessor / SceneGPUState correctness (PR #2050)
jcelerier Jun 16, 2026
487b4fb
gfx: shader preview manager UAF + port drift (PR #2050)
jcelerier Jun 16, 2026
2447c67
gfx: video output device fixes - GStreamer/Spout/Syphon (PR #2050)
jcelerier Jun 16, 2026
c39a015
avnd: Crousti GPU-node lifecycle, leaks and build fixes (PR #2050)
jcelerier Jun 16, 2026
d4b62fd
js: GPU node engine-keying, asserts and leaks (PR #2050)
jcelerier Jun 16, 2026
1e22f4c
threedim: adapt ModelDisplay to Pass::p.pipeline engine API
jcelerier Jun 17, 2026
81958a9
gfx: fix non-unity macOS + Windows/MSVC builds (PR #2077 CI)
jcelerier Jun 19, 2026
56461aa
ci: minor build fixes with Qt 6.12
jcelerier Jun 26, 2026
b940d06
avnd: remove duplicate include
jcelerier Jul 7, 2026
dbf0053
gfx: fix ambiguous QFlags cast for indirect buffer usage flags
jcelerier Jul 7, 2026
02ee1d0
gfx: keep Pass constructible from a bare Pipeline for addon compat
jcelerier Jul 7, 2026
980fc95
gfx: fix crash-grade issues from renderer review
jcelerier Jul 7, 2026
19e99fb
gfx: functional fixes from renderer review (P1 batch)
jcelerier Jul 7, 2026
a624c6c
gfx: shadow-cascade split contract + multi-layout sub-mesh guard
jcelerier Jul 7, 2026
2b4637a
xcb: use EGL instead of GLX by default
jcelerier Jun 7, 2026
82c6621
desktop: enforce desktop GL (Qt may pick GLES when we use a EGL surface)
jcelerier Jun 7, 2026
86c11da
gpu: try to land a generalized abstraction for interop & RDMA
jcelerier Jun 8, 2026
cfba4bd
gfx/aja: surface real DVP_STATUS on GL init failure; bump aja addon
jcelerier Jun 26, 2026
6503ea2
gfx: 10-bit GPU video encode for GStreamer (v210) and Libav
jcelerier Jun 26, 2026
8b36b61
gfx: planar 10-bit GPU encoder (yuv422p10le) for Libav + GStreamer
jcelerier Jun 26, 2026
d5fdd0b
gfx: P010 encoder + offscreen encoder self-test (finds GL R16 limitat…
jcelerier Jun 27, 2026
bc9f779
gfx: version-gate planar 10-bit readback (R16/RG16 vs RGBA8 packing)
jcelerier Jun 27, 2026
307f8cd
gfx: build against Qt 6.12 with older FFmpeg
jcelerier Jun 27, 2026
51bd2e6
gfx: SCORE_TEST_API=vulkan|opengl backend selection in EncoderTester
jcelerier Jun 27, 2026
957e1e4
gfx: parameterize BGRAEncoder for RGBA / ABGR byte orders
jcelerier Jun 27, 2026
02cce99
gfx/test: offscreen byte-order validation for BGRA/RGBA/ABGR encoders
jcelerier Jun 27, 2026
626f365
gfx/interop: extract shared GL capture-upload plumbing
jcelerier Jun 27, 2026
d8e4802
gfx/interop: backend-neutral capture plumbing + portable upload hook
jcelerier Jun 27, 2026
530345f
gfx: enable Vulkan external-memory-fd on Linux + export vkinterop hel…
jcelerier Jun 27, 2026
258e90a
gfx/interop: CudaP2P device-copy primitives for Vulkan tier-3 capture
jcelerier Jun 27, 2026
b0bd323
gfx/interop: Win32 external-memory handle port + real DVP init status
jcelerier Jun 28, 2026
5cdd8db
gfx/encoders: fix V210 vertical flip on D3D11 (and Metal)
jcelerier Jun 28, 2026
96d38db
gfx/encoders: add ARGB (a,r,g,b) memory-order swizzle to BGRAEncoder
jcelerier Jun 28, 2026
600383c
gfx/encoders: add high-bit-depth RGB, YUY2 and planar YCbCr GPU encoders
jcelerier Jun 28, 2026
23e66fb
gfx/interop: add vendor-neutral HostStagedOutput helper
jcelerier Jun 28, 2026
3dd4ab4
gfx/interop: vendor-neutral wire-encoder factory + PacedFramePump
jcelerier Jun 28, 2026
bc82ee0
gfx/interop: generic GPU-direct output strategy picker
jcelerier Jun 28, 2026
bffb430
gfx: DMACaptureInputNode base for capture-card inputs
jcelerier Jun 28, 2026
319bb2e
docs: mark multi-vendor I/O foundation implemented
jcelerier Jun 28, 2026
fa6e53e
gfx/interop: AVPixelFormat <-> VideoPixelFormat bridge
jcelerier Jun 28, 2026
3acecb2
gfx: makeWireDecoder factory; drop orphan FormatDecoders; unify HostP…
jcelerier Jun 28, 2026
6356fee
docs: exhaustive Direct Video I/O implementation plan (4 vendors)
jcelerier Jun 28, 2026
be07a11
gfx: DirectVideoOutputBackend interface (output vendor seam)
jcelerier Jun 28, 2026
8d3e767
gfx: DirectVideoOutputBackend gains encoderFormat/prefersFloatRender/…
jcelerier Jun 29, 2026
fecca34
gfx: generic DirectVideoOutputNode (Split 3a)
jcelerier Jun 29, 2026
b29257a
docs: Direct Video I/O uses hardcoded vendor dispatch, not a registry
jcelerier Jun 29, 2026
6381493
gfx: opt-in DVP download in HostStagedOutput (reuse HostPinnedRing)
jcelerier Jun 30, 2026
515091f
gfx: move shared DVP shim templates into Graph/interop
jcelerier Jun 30, 2026
1359006
gfx: RdmaGpuBuffer allocator (Seam B foundation) + vkinterop RDMA hel…
jcelerier Jun 30, 2026
ed02903
gfx: add cuda_p2p_copy_array_to_buffer (texture->VRAM for RDMA output)
jcelerier Jun 30, 2026
bc4d816
gfx: mark VMM allocations SYNC_MEMOPS for third-party RDMA
jcelerier Jul 1, 2026
921e39e
gfx: real Vulkan InteropFence (binary semaphore via setQueueSubmitPar…
jcelerier Jul 1, 2026
019634f
gfx: InteropFence(Vulkan) reuses VkCudaSemaphore; fix Win32 handle leak
jcelerier Jul 1, 2026
a57dad1
gfx: PacedFramePump frame-first pacing + DirectVideoOutputBackend::qu…
jcelerier Jul 2, 2026
c276500
gfx: DMACaptureInputNode only detaches strategy-OWNED sampler textures
jcelerier Jul 2, 2026
a639a20
cleanup: remove unused files
jcelerier Jul 5, 2026
1ba3b1d
gfx: guard Vulkan interop fence for Qt < 6.9 (setQueueSubmitParams is…
jcelerier Jul 7, 2026
209d74a
gfx: fix Vulkan guard value-test and unity-build symbol clash in interop
jcelerier Jul 7, 2026
aff42f2
ci: fix static-plugin and macOS builds
jcelerier Jul 7, 2026
2588714
gfx: fix interop capture crash paths from review
jcelerier Jul 7, 2026
6e0ed28
gfx: interop functional fixes from review (P1 batch)
jcelerier Jul 7, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .gitmodules
Original file line number Diff line number Diff line change
Expand Up @@ -115,3 +115,6 @@
[submodule "3rdparty/opengametools"]
path = 3rdparty/opengametools
url = https://github.com/jpaver/opengametools
[submodule "3rdparty/OffsetAllocator"]
path = 3rdparty/OffsetAllocator
url = https://github.com/sebbbi/OffsetAllocator
1 change: 1 addition & 0 deletions 3rdparty/OffsetAllocator
Submodule OffsetAllocator added at 3610a7
7 changes: 7 additions & 0 deletions src/app/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -254,6 +254,9 @@ static void setup_x11(int argc, char** argv)

helper_dylibs.run_under_x11 = true;
helper_dylibs.xwayland = wayland;

// EGL is the only way to get zero-copy with dma-buf import
qputenv("QT_XCB_GL_INTEGRATION", "xcb_egl");
}
}
};
Expand Down Expand Up @@ -499,6 +502,7 @@ static void setup_opengl(bool& enable_opengl_ui)

#ifndef QT_NO_OPENGL
#if (defined(__arm__) || defined(__aarch64__)) && !defined(_WIN32) && !defined(__APPLE__)
// Raspberry Pi & such
QSurfaceFormat fmt = QSurfaceFormat::defaultFormat();
fmt.setRenderableType(QSurfaceFormat::OpenGLES);
fmt.setSwapInterval(1);
Expand All @@ -514,6 +518,7 @@ static void setup_opengl(bool& enable_opengl_ui)
fmt.setDefaultFormat(fmt);
#else
{
// Desktop GL
std::vector<std::pair<int, int>> versions_to_test
= {{4, 6}, {4, 5}, {4, 4}, {4, 3}, {4, 2}, {4, 1}, {4, 0},
{3, 3}, {3, 2}, {3, 1}, {3, 0}, {2, 1}, {2, 0}};
Expand Down Expand Up @@ -552,7 +557,9 @@ static void setup_opengl(bool& enable_opengl_ui)

QSurfaceFormat fmt = QSurfaceFormat::defaultFormat();
fmt.setProfile(QSurfaceFormat::CoreProfile);
fmt.setRenderableType(QSurfaceFormat::OpenGL);
fmt.setSwapInterval(1);
fmt.setStencilBufferSize(8);
bool ok = false;
for(auto [maj, min] : versions_to_test)
{
Expand Down
21 changes: 18 additions & 3 deletions src/plugins/score-lib-process/Process/Drop/ProcessDropHandler.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

#include <ossia/detail/algorithms.hpp>

#include <QDebug>
#include <QFile>
#include <QFileInfo>
#include <QSet>
Expand All @@ -19,8 +20,22 @@ void ProcessDropHandler::getCustomDrops(
std::vector<ProcessDropHandler::ProcessDrop>& drops, const QMimeData& mime,
const score::DocumentContext& ctx) const noexcept
{
// Check for special mime handling code
return dropCustom(drops, mime, ctx);
// dropCustom is no longer noexcept (some overrides invoke parsers that
// can throw on malformed input — see ProcessDropHandler.hpp). Catch
// here so a throwing handler never escapes through the noexcept
// public API and tears down the editor.
try
{
dropCustom(drops, mime, ctx);
}
catch(const std::exception& e)
{
qWarning() << "ProcessDropHandler::dropCustom threw:" << e.what();
}
catch(...)
{
qWarning() << "ProcessDropHandler::dropCustom threw an unknown exception";
}
}

void ProcessDropHandler::getMimeDrops(
Expand Down Expand Up @@ -61,7 +76,7 @@ QSet<QString> ProcessDropHandler::fileExtensions() const noexcept

void ProcessDropHandler::dropCustom(
std::vector<ProcessDropHandler::ProcessDrop>&, const QMimeData& data,
const score::DocumentContext& ctx) const noexcept
const score::DocumentContext& ctx) const
{
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ class SCORE_LIB_PROCESS_EXPORT ProcessDropHandler : public score::InterfaceBase
protected:
virtual void dropCustom(
std::vector<ProcessDrop>& drops, const QMimeData& mime,
const score::DocumentContext& ctx) const noexcept;
const score::DocumentContext& ctx) const;

virtual void dropPath(
std::vector<ProcessDrop>& drops, const score::FilePath& path,
Expand Down
30 changes: 29 additions & 1 deletion src/plugins/score-plugin-avnd/Crousti/Concepts.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -448,7 +448,35 @@ make_control_in(avnd::field_index<N>, Id<Process::Port>&& id, QObject* parent)
auto [Mx, My, Mz] = c.max;
auto [ix, iy, iz] = c.init;
return new Process::XYZSpinboxes{{mx, my, mz}, {Mx, My, Mz}, {ix, iy, iz},
qname, id, parent};
false, qname, id, parent};
}
}
else if constexpr(widg.widget == avnd::widget_type::xyzw_spinbox)
{
static constexpr auto c = avnd::get_range<T>();
if constexpr(requires {
c.min == 0.f;
c.max == 0.f;
c.init == 0.f;
})
{
return new Process::XYZSpinboxes{
{c.min, c.min, c.min},
{c.max, c.max, c.max},
{c.init, c.init, c.init},
false,
qname,
id,
parent};
}
else
{
auto [mx, my, mz, mw] = c.min;
auto [Mx, My, Mz, Mw] = c.max;
auto [ix, iy, iz, iw] = c.init;
// FIXME we don't have a good 4-way widget
return new Process::XYZSpinboxes{{mx, my, mz}, {Mx, My, Mz}, {ix, iy, iz},
false, qname, id, parent};
}
}
else if constexpr(widg.widget == avnd::widget_type::color)
Expand Down
83 changes: 73 additions & 10 deletions src/plugins/score-plugin-avnd/Crousti/CpuAnalysisNode.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,10 @@

namespace oscr
{

template <typename Node_T>
requires(
(avnd::texture_output_introspection<Node_T>::size + avnd::buffer_output_introspection<Node_T>::size + avnd::geometry_output_introspection<Node_T>::size) == 0
(avnd::texture_output_introspection<Node_T>::size + avnd::buffer_output_introspection<Node_T>::size + avnd::geometry_output_introspection<Node_T>::size + scene_output_introspection<Node_T>::size) == 0
&& (avnd::gpu_render_target_output_port_output_introspection<Node_T>::size == 0)
)
struct GfxRenderer<Node_T> final : score::gfx::OutputNodeRenderer
{
Expand All @@ -19,6 +19,7 @@ struct GfxRenderer<Node_T> final : score::gfx::OutputNodeRenderer
AVND_NO_UNIQUE_ADDRESS texture_inputs_storage<Node_T> texture_ins;
AVND_NO_UNIQUE_ADDRESS buffer_inputs_storage<Node_T> buffer_ins;
AVND_NO_UNIQUE_ADDRESS geometry_inputs_storage<Node_T> geometry_ins;
AVND_NO_UNIQUE_ADDRESS scene_inputs_storage<Node_T> scene_ins;

const GfxNode<Node_T>& node() const noexcept
{
Expand All @@ -44,9 +45,19 @@ struct GfxRenderer<Node_T> final : score::gfx::OutputNodeRenderer
return {};
}

void init(score::gfx::RenderList& renderer, QRhiResourceUpdateBatch& res) override
// See CpuFilterNode.hpp for the reasoning: init must live in initState
// so the incremental edge-rewire path also runs it.
void initState(score::gfx::RenderList& renderer, QRhiResourceUpdateBatch& res) override
{
auto& parent = node();
if(m_initialized)
return;

// See CpuFilterNode for the reasoning: optional renderlist
// backchannel populated via SFINAE so nodes can reach the
// RenderList's GpuResourceRegistry / AssetTable without plumbing.
if constexpr(requires { state->renderlist = &renderer; })
state->renderlist = &renderer;

if constexpr(requires { state->prepare(); })
{
this->node().processControlIn(
Expand All @@ -59,6 +70,13 @@ struct GfxRenderer<Node_T> final : score::gfx::OutputNodeRenderer
texture_ins.init(*this, renderer);

if_possible(state->init(renderer, res));

m_initialized = true;
}

void init(score::gfx::RenderList& renderer, QRhiResourceUpdateBatch& res) override
{
initState(renderer, res);
}

void update(
Expand All @@ -82,32 +100,69 @@ struct GfxRenderer<Node_T> final : score::gfx::OutputNodeRenderer
}
}

void release(score::gfx::RenderList& r) override
void releaseState(score::gfx::RenderList& r) override
{
if(!m_initialized)
return;

if constexpr(avnd::texture_input_introspection<Node_T>::size > 0)
texture_ins.release();

if constexpr(avnd::geometry_input_introspection<Node_T>::size > 0)
geometry_ins.release(r);

if constexpr(scene_input_introspection<Node_T>::size > 0)
scene_ins.release(r);

if constexpr(
avnd::texture_input_introspection<Node_T>::size > 0
|| avnd::texture_output_introspection<Node_T>::size > 0)
{
// FIXME this->defaultRelease(r);
// No call-through to GenericNodeRenderer::defaultRelease here:
// CpuAnalysisNode's GfxRenderer derives from OutputNodeRenderer,
// not GenericNodeRenderer, and OutputNodeRenderer has no
// defaultRelease equivalent (it owns no pipeline / passes — it
// is a sink, not a node renderer with m_p / m_pipelineCache).
// CpuFilterNode's mirror at line ~357 IS valid because that
// GfxRenderer derives from GenericNodeRenderer.
//
// If a future CpuAnalysisNode uses textures via OutputNodeRenderer
// surfaces, they'll need their own per-storage release path
// (texture_ins.release above already handles texture INPUTS).
}

if_possible(state->release(r));

// Clear the optional renderlist backchannel. Paired with initState;
// same SFINAE guard.
if constexpr(requires { state->renderlist = nullptr; })
state->renderlist = nullptr;

m_initialized = false;
}

void release(score::gfx::RenderList& r) override
{
releaseState(r);
}

void inputAboutToFinish(
score::gfx::RenderList& renderer, const score::gfx::Port& p,
QRhiResourceUpdateBatch*& res) override
{
// Outer guard includes scene_input_introspection so a node with ONLY
// scene inputs (no texture / buffer / geometry) still allocates `res`
// — necessary if scene_inputs_storage ever grows an inputAboutToFinish
// method (today it's read-only via readInputScenes, but the storage's
// lifecycle is part of the new scene_port concept and may evolve).
// Without the include, a scene-only sink would silently skip the
// res allocation and any future scene-side write would have nowhere
// to land.
if constexpr(
avnd::texture_input_introspection<Node_T>::size > 0
|| avnd::buffer_input_introspection<Node_T>::size > 0
|| avnd::geometry_input_introspection<Node_T>::size > 0)
|| avnd::geometry_input_introspection<Node_T>::size > 0
|| scene_input_introspection<Node_T>::size > 0)
{
res = renderer.state.rhi->nextResourceUpdateBatch();

Expand All @@ -118,6 +173,8 @@ struct GfxRenderer<Node_T> final : score::gfx::OutputNodeRenderer
if constexpr(avnd::geometry_input_introspection<Node_T>::size > 0)
geometry_ins.inputAboutToFinish(
renderer, res, this->geometry, *state, this->node());
// No scene_ins.inputAboutToFinish today — the guard is forward-
// looking; add the call here when scene_inputs_storage grows one.
}

if_possible(state->inputAboutToFinish(renderer, p, res));
Expand All @@ -144,6 +201,8 @@ struct GfxRenderer<Node_T> final : score::gfx::OutputNodeRenderer
buffer_ins.readInputBuffers(renderer, parent, *state);
if constexpr(avnd::geometry_input_introspection<Node_T>::size > 0)
geometry_ins.readInputGeometries(renderer, this->geometry, parent, *state);
if constexpr(scene_input_introspection<Node_T>::size > 0)
scene_ins.readInputScenes(this->scene, *state);

parent.processControlIn(
*this, *state, m_last_message, parent.last_message, parent.m_ctx);
Expand All @@ -158,9 +217,13 @@ struct GfxRenderer<Node_T> final : score::gfx::OutputNodeRenderer
};

template <typename Node_T>
requires(
(avnd::texture_output_introspection<Node_T>::size + avnd::buffer_output_introspection<Node_T>::size + avnd::geometry_output_introspection<Node_T>::size) == 0
)
requires((avnd::texture_output_introspection<Node_T>::size
+ avnd::buffer_output_introspection<Node_T>::size
+ avnd::geometry_output_introspection<Node_T>::size
+ scene_output_introspection<Node_T>::size)
== 0
&& (avnd::gpu_render_target_output_port_output_introspection<Node_T>::size
== 0))
struct GfxNode<Node_T> final
: CustomGpuOutputNodeBase
, GpuNodeElements<Node_T>
Expand Down
Loading
Loading