summaryrefslogtreecommitdiff
path: root/src/gpu/effect.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/gpu/effect.cc')
-rw-r--r--src/gpu/effect.cc71
1 files changed, 69 insertions, 2 deletions
diff --git a/src/gpu/effect.cc b/src/gpu/effect.cc
index a1b45f1..c2c36b4 100644
--- a/src/gpu/effect.cc
+++ b/src/gpu/effect.cc
@@ -2,8 +2,10 @@
// It implements the Sequence management logic.
#include "effect.h"
+#include "audio/tracker.h"
#include "gpu/demo_effects.h"
#include "gpu/gpu.h"
+#include "util/fatal_error.h"
#include <algorithm>
#include <cstdio>
#include <typeinfo>
@@ -377,14 +379,79 @@ void MainSequence::shutdown() {
wgpuTextureViewRelease(depth_view_);
if (depth_texture_)
wgpuTextureRelease(depth_texture_);
+ for (auto& [name, aux] : auxiliary_textures_) {
+ if (aux.view)
+ wgpuTextureViewRelease(aux.view);
+ if (aux.texture)
+ wgpuTextureRelease(aux.texture);
+ }
+ auxiliary_textures_.clear();
for (ActiveSequence& entry : sequences_) {
entry.seq->reset();
}
}
+// Register a named auxiliary texture for inter-effect sharing
+void MainSequence::register_auxiliary_texture(const char* name, int width,
+ int height) {
+ const std::string key(name);
+
+ // Check if already exists
+ auto it = auxiliary_textures_.find(key);
+ if (it != auxiliary_textures_.end()) {
+#if !defined(STRIP_ALL)
+ fprintf(stderr, "Warning: Auxiliary texture '%s' already registered\n",
+ name);
+#endif /* !defined(STRIP_ALL) */
+ return;
+ }
+
+ // Create texture
+ const WGPUTextureDescriptor desc = {
+ .usage =
+ WGPUTextureUsage_RenderAttachment | WGPUTextureUsage_TextureBinding,
+ .dimension = WGPUTextureDimension_2D,
+ .size = {(uint32_t)width, (uint32_t)height, 1},
+ .format = gpu_ctx.format,
+ .mipLevelCount = 1,
+ .sampleCount = 1,
+ };
+
+ WGPUTexture texture = wgpuDeviceCreateTexture(gpu_ctx.device, &desc);
+ FATAL_CHECK(!texture, "Failed to create auxiliary texture: %s\n", name);
+
+ // Create view
+ const WGPUTextureViewDescriptor view_desc = {
+ .format = gpu_ctx.format,
+ .dimension = WGPUTextureViewDimension_2D,
+ .mipLevelCount = 1,
+ .arrayLayerCount = 1,
+ };
+
+ WGPUTextureView view = wgpuTextureCreateView(texture, &view_desc);
+ FATAL_CHECK(!view, "Failed to create auxiliary texture view: %s\n", name);
+
+ // Store in registry
+ auxiliary_textures_[key] = {texture, view, width, height};
+
+#if !defined(STRIP_ALL)
+ printf("[MainSequence] Registered auxiliary texture '%s' (%dx%d)\n", name,
+ width, height);
+#endif /* !defined(STRIP_ALL) */
+}
+
+// Retrieve auxiliary texture view by name
+WGPUTextureView MainSequence::get_auxiliary_view(const char* name) {
+ const std::string key(name);
+ auto it = auxiliary_textures_.find(key);
+ FATAL_CHECK(it == auxiliary_textures_.end(),
+ "Auxiliary texture not found: %s\n", name);
+ return it->second.view;
+}
+
#if !defined(STRIP_ALL)
-void MainSequence::simulate_until(float target_time, float step_rate) {
- const float bpm = 128.0f;
+void MainSequence::simulate_until(float target_time, float step_rate,
+ float bpm) {
const float aspect_ratio = 16.0f / 9.0f;
for (float t = 0.0f; t < target_time; t += step_rate) {
WGPUCommandEncoder encoder =