Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
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
6 changes: 3 additions & 3 deletions app/operators/packages/content-visual/cosine_palette.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ struct CosinePaletteOp : vivid::OperatorBase, vivid::GpuProcessable {
vivid::Param<float> c_r{"c_r", 1.0f, 0.f, 4.f}, c_g{"c_g", 1.0f, 0.f, 4.f}, c_b{"c_b", 1.0f, 0.f, 4.f};
vivid::Param<float> d_r{"d_r", 0.0f, 0.f, 1.f}, d_g{"d_g", 0.33f, 0.f, 1.f}, d_b{"d_b", 0.67f, 0.f, 1.f};

bool tried_ = false;
bool tried_ = false; std::string err_; // ADR-0019: surfaced via report_if_no_pipeline below
WGPUShaderModule sh_ = nullptr; WGPUBindGroupLayout bgl_ = nullptr; WGPUPipelineLayout pl_ = nullptr;
WGPURenderPipeline pipe_ = nullptr; WGPUBuffer ubo_ = nullptr; WGPUSampler samp_ = nullptr; WGPUBindGroup bg_ = nullptr;
~CosinePaletteOp() override {
Expand All @@ -71,7 +71,7 @@ struct CosinePaletteOp : vivid::OperatorBase, vivid::GpuProcessable {
}
bool lazy_init(const VividGpuContext* c) {
std::string err; sh_ = vivid::gpu::create_shader_checked(c->device, kWGSL, "CosinePalette", err);
if (!sh_ || !err.empty()) return false;
if (!sh_ || !err.empty()) { err_ = vivid::gpu::concise_gpu_error(err); return false; }
ubo_ = vivid::gpu::create_uniform_buffer(c->device, 80, "CosinePalette U");
WGPUBindGroupLayoutEntry e[3]{};
e[0].binding = 0; e[0].visibility = WGPUShaderStage_Vertex | WGPUShaderStage_Fragment;
Expand All @@ -91,7 +91,7 @@ struct CosinePaletteOp : vivid::OperatorBase, vivid::GpuProcessable {
}
void process_gpu(const VividGpuContext* c) override {
if (!tried_) { tried_ = true; lazy_init(c); }
if (!pipe_) return;
if (vivid::gpu::report_if_no_pipeline(c, pipe_, err_)) return;
auto pv = [&](int i, float def) { return c->param_values ? c->param_values[i] : def; };
// uniform: a.xyz0, b.xyz0, c.xyz0, d.xyz0, (phase, mix, 0, 0) — 20 floats / 80 bytes.
const float u[20] = {
Expand Down
6 changes: 3 additions & 3 deletions app/operators/packages/content-visual/emitter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ struct EmitterOp : vivid::OperatorBase, vivid::GpuProcessable {
vivid::Param<float> size{"size", 0.4f, 0.f, 1.f}; // particle radius
vivid::Param<float> spread{"spread", 0.8f, 0.f, 1.f}; // horizontal emit spread by pos

bool tried_ = false;
bool tried_ = false; std::string err_; // ADR-0019: surfaced per-frame via report_if_no_pipeline
WGPUShaderModule sh_ = nullptr; WGPUBindGroupLayout bgl_ = nullptr; WGPUPipelineLayout pl_ = nullptr;
WGPURenderPipeline pipe_ = nullptr; WGPUBuffer ubo_ = nullptr; WGPUBindGroup bg_ = nullptr;
WGPUBuffer quad_ = nullptr;
Expand Down Expand Up @@ -93,7 +93,7 @@ struct EmitterOp : vivid::OperatorBase, vivid::GpuProcessable {

bool lazy_init(const VividGpuContext* c) {
std::string err; sh_ = vivid::gpu::create_shader_checked(c->device, kWGSL, "Emitter", err);
if (!sh_ || !err.empty()) { vivid_report_gpu_error(c, ("Emitter WGSL: " + err).c_str()); return false; }
if (!sh_ || !err.empty()) { err_ = "Emitter WGSL: " + vivid::gpu::concise_gpu_error(err); return false; }
ubo_ = vivid::gpu::create_uniform_buffer(c->device, 16, "Emitter U");
const QVert quad[6] = { {-1,-1},{1,-1},{1,1}, {-1,-1},{1,1},{-1,1} };
WGPUBufferDescriptor qd{}; qd.usage = WGPUBufferUsage_Vertex | WGPUBufferUsage_CopyDst; qd.size = sizeof(quad);
Expand Down Expand Up @@ -138,7 +138,7 @@ struct EmitterOp : vivid::OperatorBase, vivid::GpuProcessable {
}
void process_gpu(const VividGpuContext* c) override {
if (!tried_) { tried_ = true; lazy_init(c); }
if (!pipe_) return;
if (vivid::gpu::report_if_no_pipeline(c, pipe_, err_)) return;
const float* p = c->param_values; auto pv = [&](int i, float d) { return p ? p[i] : d; };
const int nper = 6 + static_cast<int>(54.f * pv(0, count.value)); // particles per burst
const float spd = 0.3f + 1.4f * pv(1, speed.value);
Expand Down
6 changes: 3 additions & 3 deletions app/operators/packages/content-visual/instancer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,7 @@ struct InstancerOp : vivid::OperatorBase, vivid::GpuProcessable {
vivid::Param<float> sides{"sides", 6.f, 3.f, 8.f}; // polygon sides (shape=2)
vivid::Param<float> pulse{"pulse", 0.6f, 0.f, 1.f}; // pop amount on each note-on FIRE (re-strikes re-pop)

bool tried_ = false;
bool tried_ = false; std::string err_; // ADR-0019: surfaced per-frame via report_if_no_pipeline
WGPUShaderModule sh_ = nullptr; WGPUBindGroupLayout bgl_ = nullptr; WGPUPipelineLayout pl_ = nullptr;
WGPURenderPipeline pipe_ = nullptr; WGPUBuffer ubo_ = nullptr; WGPUBindGroup bg_ = nullptr;
WGPUBuffer quad_ = nullptr; // static unit quad (6 verts)
Expand All @@ -105,7 +105,7 @@ struct InstancerOp : vivid::OperatorBase, vivid::GpuProcessable {

bool lazy_init(const VividGpuContext* c) {
std::string err; sh_ = vivid::gpu::create_shader_checked(c->device, kWGSL, "Instancer", err);
if (!sh_ || !err.empty()) { vivid_report_gpu_error(c, ("Instancer WGSL: " + err).c_str()); return false; }
if (!sh_ || !err.empty()) { err_ = "Instancer WGSL: " + vivid::gpu::concise_gpu_error(err); return false; }
ubo_ = vivid::gpu::create_uniform_buffer(c->device, 32, "Instancer U");
const QVert quad[6] = { {-1,-1},{1,-1},{1,1}, {-1,-1},{1,1},{-1,1} };
WGPUBufferDescriptor qd{}; qd.usage = WGPUBufferUsage_Vertex | WGPUBufferUsage_CopyDst; qd.size = sizeof(quad);
Expand Down Expand Up @@ -150,7 +150,7 @@ struct InstancerOp : vivid::OperatorBase, vivid::GpuProcessable {
}
void process_gpu(const VividGpuContext* c) override {
if (!tried_) { tried_ = true; lazy_init(c); }
if (!pipe_) return;
if (vivid::gpu::report_if_no_pipeline(c, pipe_, err_)) return;
const float* p = c->param_values; auto pv = [&](int i, float d) { return p ? p[i] : d; };
const float base = 0.02f + 0.22f * pv(0, size.value);
const float spr = pv(1, spread.value);
Expand Down
6 changes: 3 additions & 3 deletions app/operators/packages/content-visual/solids.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -106,7 +106,7 @@ struct SolidsOp : vivid::OperatorBase, vivid::GpuProcessable {
vivid::Param<float> trail{"trail", 0.3f, 0.f, 1.f};
vivid::Param<float> wireframe{"wireframe", 0.f, 0.f, 1.f};

bool tried_ = false;
bool tried_ = false; std::string err_; // ADR-0019: surfaced per-frame via report_if_no_pipeline
WGPUShaderModule sh_ = nullptr; WGPUBindGroupLayout bgl_ = nullptr; WGPUPipelineLayout pl_ = nullptr;
WGPURenderPipeline pipe_ = nullptr; WGPUBuffer ubo_ = nullptr; WGPUBindGroup bg_ = nullptr;
WGPUBuffer vbuf_[3] = {nullptr,nullptr,nullptr}; uint32_t vcount_[3] = {0,0,0}; // cube/tetra/octa
Expand Down Expand Up @@ -151,7 +151,7 @@ struct SolidsOp : vivid::OperatorBase, vivid::GpuProcessable {
}
bool lazy_init(const VividGpuContext* c) {
std::string err; sh_ = vivid::gpu::create_shader_checked(c->device, kWGSL, "Solids", err);
if (!sh_ || !err.empty()) { vivid_report_gpu_error(c, ("Solids WGSL: " + err).c_str()); return false; }
if (!sh_ || !err.empty()) { err_ = "Solids WGSL: " + vivid::gpu::concise_gpu_error(err); return false; }
ubo_ = vivid::gpu::create_uniform_buffer(c->device, 80, "Solids U"); // mat4(64) + 4 f32(16)
vbuf_[0] = make_vb(c, make_cube(), vcount_[0]);
vbuf_[1] = make_vb(c, make_tetra(), vcount_[1]);
Expand Down Expand Up @@ -199,7 +199,7 @@ struct SolidsOp : vivid::OperatorBase, vivid::GpuProcessable {
}
void process_gpu(const VividGpuContext* c) override {
if (!tried_) { tried_ = true; lazy_init(c); }
if (!pipe_) return;
if (vivid::gpu::report_if_no_pipeline(c, pipe_, err_)) return;
ensure_depth(c);
const float* p = c->param_values; auto pv = [&](int i, float d){ return p ? p[i] : d; };
const int si = std::clamp(static_cast<int>(std::round(pv(0, shape.value))), 0, 2);
Expand Down
6 changes: 3 additions & 3 deletions app/operators/packages/content-visual/time_machine.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ struct TimeMachineOp : vivid::OperatorBase, vivid::GpuProcessable {
vivid::Param<int> frames {"frames", 30, 2, 120}; // history length
vivid::Param<float> offset {"offset", 0.f, 0.f, 1.f}; // shift the whole read-head back in time

bool tried_ = false;
bool tried_ = false; std::string err_; // ADR-0019: surfaced per-frame via report_if_no_pipeline
WGPUShaderModule sh_blit_ = nullptr, sh_slit_ = nullptr;
WGPUBindGroupLayout bgl_blit_ = nullptr, bgl_slit_ = nullptr;
WGPUPipelineLayout pl_blit_ = nullptr, pl_slit_ = nullptr;
Expand Down Expand Up @@ -139,7 +139,7 @@ struct TimeMachineOp : vivid::OperatorBase, vivid::GpuProcessable {
std::string err;
sh_blit_ = vivid::gpu::create_shader_checked(c->device, kBlitWGSL, "TimeMachine.blit", err);
sh_slit_ = vivid::gpu::create_shader_checked(c->device, kSlitWGSL, "TimeMachine.slit", err);
if (!sh_blit_ || !sh_slit_ || !err.empty()) return false;
if (!sh_blit_ || !sh_slit_ || !err.empty()) { err_ = vivid::gpu::concise_gpu_error(err); return false; }
ubo_ = vivid::gpu::create_uniform_buffer(c->device, 32, "TimeMachine U");
// blit BGL: sampler(0), tex(1)
WGPUBindGroupLayoutEntry be[2]{};
Expand Down Expand Up @@ -173,7 +173,7 @@ struct TimeMachineOp : vivid::OperatorBase, vivid::GpuProcessable {

void process_gpu(const VividGpuContext* c) override {
if (!tried_) { tried_ = true; lazy_init(c); }
if (!pipe_slit_) return;
if (vivid::gpu::report_if_no_pipeline(c, pipe_slit_, err_)) return;
auto pv = [&](int i, float def) { return c->param_values ? c->param_values[i] : def; };
const int frames_req = c->param_values ? static_cast<int>(c->param_values[1])
: static_cast<int>(frames.value);
Expand Down
6 changes: 3 additions & 3 deletions app/operators/packages/core-visuals/blit_op.h
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ inline const char* kBlitWGSL = R"(
struct BlitOp : vivid::OperatorBase, vivid::GpuProcessable {
const char* label_;
explicit BlitOp(const char* label) : label_(label) {}
bool tried_ = false;
bool tried_ = false; std::string err_; // ADR-0019: surfaced per-frame via report_if_no_pipeline
WGPUShaderModule sh_ = nullptr; WGPUBindGroupLayout bgl_ = nullptr; WGPUPipelineLayout pl_ = nullptr;
WGPURenderPipeline pipe_ = nullptr; WGPUSampler samp_ = nullptr; WGPUBindGroup bg_ = nullptr;
~BlitOp() override {
Expand All @@ -45,7 +45,7 @@ struct BlitOp : vivid::OperatorBase, vivid::GpuProcessable {
}
bool lazy_init(const VividGpuContext* c) {
std::string err; sh_ = vivid::gpu::create_shader_checked(c->device, kBlitWGSL, label_, err);
if (!sh_ || !err.empty()) return false;
if (!sh_ || !err.empty()) { err_ = vivid::gpu::concise_gpu_error(err); return false; }
WGPUBindGroupLayoutEntry e[2]{};
e[0].binding = 0; e[0].visibility = WGPUShaderStage_Fragment;
e[0].texture.sampleType = WGPUTextureSampleType_Float; e[0].texture.viewDimension = WGPUTextureViewDimension_2D;
Expand All @@ -62,7 +62,7 @@ struct BlitOp : vivid::OperatorBase, vivid::GpuProcessable {
}
void process_gpu(const VividGpuContext* c) override {
if (!tried_) { tried_ = true; lazy_init(c); }
if (!pipe_) return;
if (vivid::gpu::report_if_no_pipeline(c, pipe_, err_)) return;
const WGPUTextureView in = (c->input_texture_count > 0) ? c->input_texture_views[0] : c->output_texture_view;
if (bg_) { wgpuBindGroupRelease(bg_); bg_ = nullptr; }
WGPUBindGroupEntry be[2]{};
Expand Down
6 changes: 3 additions & 3 deletions app/operators/packages/core-visuals/bloom.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,7 @@ struct BloomOp : vivid::OperatorBase, vivid::GpuProcessable {
vivid::Param<float> intensity{"intensity", 0.8f, 0.f, 3.f};
vivid::Param<float> radius{"radius", 1.5f, 0.f, 6.f};

bool tried_ = false;
bool tried_ = false; std::string err_; // ADR-0019: surfaced per-frame via report_if_no_pipeline
WGPUShaderModule sh_bright_ = nullptr, sh_blurh_ = nullptr, sh_blurv_ = nullptr, sh_comp_ = nullptr;
WGPUBindGroupLayout bgl1_ = nullptr, bgl2_ = nullptr;
WGPUPipelineLayout pl1_ = nullptr, pl2_ = nullptr;
Expand Down Expand Up @@ -166,7 +166,7 @@ struct BloomOp : vivid::OperatorBase, vivid::GpuProcessable {
sh_blurh_ = vivid::gpu::create_shader_checked(c->device, blurh.c_str(), "Bloom.blurH", err);
sh_blurv_ = vivid::gpu::create_shader_checked(c->device, blurv.c_str(), "Bloom.blurV", err);
sh_comp_ = vivid::gpu::create_shader_checked(c->device, kCompositeWGSL, "Bloom.composite", err);
if (!sh_bright_ || !sh_blurh_ || !sh_blurv_ || !sh_comp_ || !err.empty()) return false;
if (!sh_bright_ || !sh_blurh_ || !sh_blurv_ || !sh_comp_ || !err.empty()) { err_ = vivid::gpu::concise_gpu_error(err); return false; }
ubo_ = vivid::gpu::create_uniform_buffer(c->device, 32, "Bloom U");
bgl1_ = make_bgl(c->device, 1); // bright + blur: one source texture
bgl2_ = make_bgl(c->device, 2); // composite: original + bloom
Expand Down Expand Up @@ -198,7 +198,7 @@ struct BloomOp : vivid::OperatorBase, vivid::GpuProcessable {

void process_gpu(const VividGpuContext* c) override {
if (!tried_) { tried_ = true; lazy_init(c); }
if (!pipe_comp_) return;
if (vivid::gpu::report_if_no_pipeline(c, pipe_comp_, err_)) return;
ensure_tex(c);
release_frame_bgs();

Expand Down
6 changes: 3 additions & 3 deletions app/operators/packages/core-visuals/feedback.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ struct FeedbackOp : vivid::OperatorBase, vivid::GpuProcessable {
static constexpr const char* kSummary = "Frame feedback / trails: blends the input with a decaying history texture.";
static constexpr std::array<const char*, 3> kKeywords = {"effect", "feedback", "trails"};
vivid::Param<float> decay{"decay", 0.5f, 0.f, 1.f};
bool tried_ = false;
bool tried_ = false; std::string err_; // ADR-0019: surfaced per-frame via report_if_no_pipeline
WGPUShaderModule sh_ = nullptr; WGPUBindGroupLayout bgl_ = nullptr; WGPUPipelineLayout pl_ = nullptr;
WGPURenderPipeline pipe_ = nullptr; WGPUBuffer ubo_ = nullptr; WGPUSampler samp_ = nullptr; WGPUBindGroup bg_ = nullptr;
WGPUTexture hist_ = nullptr; WGPUTextureView hist_view_ = nullptr; uint32_t hw_ = 0, hh_ = 0;
Expand Down Expand Up @@ -73,7 +73,7 @@ struct FeedbackOp : vivid::OperatorBase, vivid::GpuProcessable {
}
bool lazy_init(const VividGpuContext* c) {
std::string err; sh_ = vivid::gpu::create_shader_checked(c->device, kFeedbackWGSL, "Feedback", err);
if (!sh_ || !err.empty()) return false;
if (!sh_ || !err.empty()) { err_ = vivid::gpu::concise_gpu_error(err); return false; }
ubo_ = vivid::gpu::create_uniform_buffer(c->device, 32, "Feedback U");
WGPUBindGroupLayoutEntry e[4]{};
e[0].binding = 0; e[0].visibility = WGPUShaderStage_Vertex | WGPUShaderStage_Fragment;
Expand All @@ -95,7 +95,7 @@ struct FeedbackOp : vivid::OperatorBase, vivid::GpuProcessable {
}
void process_gpu(const VividGpuContext* c) override {
if (!tried_) { tried_ = true; lazy_init(c); }
if (!pipe_) return;
if (vivid::gpu::report_if_no_pipeline(c, pipe_, err_)) return;
ensure_hist(c);
const float d = 0.82f + (c->param_values ? c->param_values[0] : decay.value) * 0.16f; // 0.82..0.98
float u[8] = { float(c->output_width), float(c->output_height), float(c->time), d, 0.f, 0.f, 0.f, 0.f };
Expand Down
9 changes: 6 additions & 3 deletions app/operators/packages/core-visuals/mesh.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,7 @@ struct MeshOp : vivid::OperatorBase, vivid::GpuProcessable {
vivid::Param<float> spin{"spin", 0.35f, 0.f, 1.f}, tilt{"tilt", 0.5f, 0.f, 1.f};
vivid::Param<float> r{"r", 0.9f, 0.f, 1.f}, g{"g", 0.92f, 0.f, 1.f}, b{"b", 1.f, 0.f, 1.f};
vivid::Param<float> bg_r{"bg_r", 0.03f, 0.f, 1.f}, bg_g{"bg_g", 0.03f, 0.f, 1.f}, bg_b{"bg_b", 0.05f, 0.f, 1.f};
bool tried_ = false;
bool tried_ = false; std::string err_; // ADR-0019: surfaced per-frame via report_if_no_pipeline
WGPUShaderModule sh_ = nullptr; WGPUBindGroupLayout bgl_ = nullptr; WGPUPipelineLayout pl_ = nullptr;
WGPURenderPipeline solid_pipe_ = nullptr, wire_pipe_ = nullptr; WGPUBuffer ubo_ = nullptr; WGPUBindGroup bg_ = nullptr;
WGPUBuffer tri_vbo_ = nullptr, line_vbo_ = nullptr; uint32_t tri_n_ = 0, line_n_ = 0;
Expand Down Expand Up @@ -194,7 +194,7 @@ struct MeshOp : vivid::OperatorBase, vivid::GpuProcessable {
}
bool lazy_init(const VividGpuContext* c) {
std::string err; sh_ = vivid::gpu::create_shader_checked(c->device, kMeshWGSL, "Mesh", err);
if (!sh_ || !err.empty()) return false;
if (!sh_ || !err.empty()) { err_ = vivid::gpu::concise_gpu_error(err); return false; }
ubo_ = vivid::gpu::create_uniform_buffer(c->device, 160, "Mesh U");
WGPUBindGroupLayoutEntry e{}; e.binding = 0; e.visibility = WGPUShaderStage_Vertex | WGPUShaderStage_Fragment;
e.buffer.type = WGPUBufferBindingType_Uniform; e.buffer.minBindingSize = 160;
Expand All @@ -211,7 +211,10 @@ struct MeshOp : vivid::OperatorBase, vivid::GpuProcessable {
}
void process_gpu(const VividGpuContext* c) override {
if (!tried_) { tried_ = true; lazy_init(c); }
if (!solid_pipe_ || !wire_pipe_) return;
if (!solid_pipe_ || !wire_pipe_) { // ADR-0019: surface the init failure, don't render silent
vivid_report_gpu_error(c, err_.empty() ? "GPU pipeline failed to initialize" : err_.c_str());
return;
}
const float* p = c->param_values; auto pv = [&](int i, float d) { return p ? p[i] : d; };
const int s = static_cast<int>(std::lround(pv(0, shape.value) * 3.f)); // 0..3
if (s != shape_) rebuild_geometry(c, s);
Expand Down
9 changes: 6 additions & 3 deletions app/operators/packages/core-visuals/note_type.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ struct TypeOp : vivid::OperatorBase, vivid::GpuProcessable {

vivid::FtFont font_; bool font_tried_ = false;
std::string text_, baked_text_ = "\x01";
bool tried_ = false;
bool tried_ = false; std::string err_; // ADR-0019: surfaced per-frame via report_if_no_pipeline
WGPUShaderModule sh_ = nullptr; WGPUBindGroupLayout bgl_ = nullptr; WGPUPipelineLayout pl_ = nullptr;
WGPURenderPipeline stencil_pipe_ = nullptr, cover_pipe_ = nullptr;
WGPUBuffer ubo_ = nullptr; WGPUBindGroup bg_ = nullptr;
Expand Down Expand Up @@ -167,7 +167,7 @@ struct TypeOp : vivid::OperatorBase, vivid::GpuProcessable {
}
bool lazy_init(const VividGpuContext* c) {
std::string err; sh_ = vivid::gpu::create_shader_checked(c->device, kWGSL, "Type", err);
if (!sh_ || !err.empty()) { vivid_report_gpu_error(c, ("Type WGSL: " + err).c_str()); return false; }
if (!sh_ || !err.empty()) { err_ = "Type WGSL: " + vivid::gpu::concise_gpu_error(err); return false; }
ubo_ = vivid::gpu::create_uniform_buffer(c->device, 48, "Type U");
WGPUBindGroupLayoutEntry e{}; e.binding = 0; e.visibility = WGPUShaderStage_Vertex | WGPUShaderStage_Fragment;
e.buffer.type = WGPUBufferBindingType_Uniform; e.buffer.minBindingSize = 48;
Expand All @@ -184,7 +184,10 @@ struct TypeOp : vivid::OperatorBase, vivid::GpuProcessable {
}
void process_gpu(const VividGpuContext* c) override {
if (!tried_) { tried_ = true; lazy_init(c); }
if (!stencil_pipe_ || !cover_pipe_) return;
if (!stencil_pipe_ || !cover_pipe_) { // ADR-0019: surface the init failure, don't render silent
vivid_report_gpu_error(c, err_.empty() ? "GPU pipeline failed to initialize" : err_.c_str());
return;
}
const float* p = c->param_values; auto pv = [&](int i, float d) { return p ? p[i] : d; };
text_ = build_text(vivid::elements::input_signal(c, 0), static_cast<int>(std::lround(pv(9, mode.value))));
if (!vbo_ || text_ != baked_text_) rebuild_geometry(c);
Expand Down
Loading
Loading