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.cc72
1 files changed, 39 insertions, 33 deletions
diff --git a/src/gpu/effect.cc b/src/gpu/effect.cc
index b50acce..fba3353 100644
--- a/src/gpu/effect.cc
+++ b/src/gpu/effect.cc
@@ -293,6 +293,45 @@ void MainSequence::render_frame(float global_time, float beat, float peak,
wgpuRenderPassEncoderEnd(scene_pass);
// 3. Post Chain
+
+ // Capture framebuffer ONCE before post-processing chain
+ bool needs_capture = false;
+ for (const SequenceItem* item : post_effects) {
+ PostProcessEffect* pp = (PostProcessEffect*)(item->effect.get());
+ if (pp->needs_framebuffer_capture()) {
+ needs_capture = true;
+ break;
+ }
+ }
+
+ if (needs_capture) {
+ WGPUTextureView captured_view = get_auxiliary_view("captured_frame");
+ if (captured_view) {
+ WGPURenderPassColorAttachment capture_attachment = {};
+ capture_attachment.view = captured_view;
+ capture_attachment.resolveTarget = nullptr;
+ capture_attachment.loadOp = WGPULoadOp_Clear;
+ capture_attachment.storeOp = WGPUStoreOp_Store;
+ capture_attachment.clearValue = {0.0f, 0.0f, 0.0f, 1.0f};
+#if !defined(DEMO_CROSS_COMPILE_WIN32)
+ capture_attachment.depthSlice = WGPU_DEPTH_SLICE_UNDEFINED;
+#endif
+ WGPURenderPassDescriptor capture_desc = {
+ .colorAttachmentCount = 1, .colorAttachments = &capture_attachment};
+ WGPURenderPassEncoder capture_pass =
+ wgpuCommandEncoderBeginRenderPass(encoder, &capture_desc);
+ wgpuRenderPassEncoderSetViewport(capture_pass, 0.0f, 0.0f,
+ (float)width_, (float)height_, 0.0f, 1.0f);
+
+ PostProcessEffect* passthrough =
+ (PostProcessEffect*)passthrough_effect_.get();
+ passthrough->update_bind_group(framebuffer_view_a_);
+ passthrough->render(capture_pass, 0, 0, 0, aspect_ratio);
+
+ wgpuRenderPassEncoderEnd(capture_pass);
+ }
+ }
+
WGPUSurfaceTexture st = {};
WGPUTextureView final_view = nullptr;
@@ -340,39 +379,6 @@ void MainSequence::render_frame(float global_time, float beat, float peak,
PostProcessEffect* pp =
(PostProcessEffect*)(post_effects[i]->effect.get());
- // Capture framebuffer if effect needs it
- if (pp->needs_framebuffer_capture()) {
- WGPUTextureView captured_view = get_auxiliary_view("captured_frame");
- if (captured_view) {
- // Get source texture from current_input view
- // Note: This is a simplified blit using a render pass
- WGPURenderPassColorAttachment capture_attachment = {};
- capture_attachment.view = captured_view;
- capture_attachment.resolveTarget = nullptr;
- capture_attachment.loadOp = WGPULoadOp_Clear;
- capture_attachment.storeOp = WGPUStoreOp_Store;
- capture_attachment.clearValue = {0.0f, 0.0f, 0.0f, 1.0f};
-#if !defined(DEMO_CROSS_COMPILE_WIN32)
- capture_attachment.depthSlice = WGPU_DEPTH_SLICE_UNDEFINED;
-#endif
- WGPURenderPassDescriptor capture_desc = {
- .colorAttachmentCount = 1, .colorAttachments = &capture_attachment};
- WGPURenderPassEncoder capture_pass =
- wgpuCommandEncoderBeginRenderPass(encoder, &capture_desc);
- wgpuRenderPassEncoderSetViewport(capture_pass, 0.0f, 0.0f,
- (float)width_, (float)height_, 0.0f,
- 1.0f);
-
- // Use passthrough effect to copy framebuffer_a (scene) to captured_frame
- PostProcessEffect* passthrough =
- (PostProcessEffect*)passthrough_effect_.get();
- passthrough->update_bind_group(framebuffer_view_a_);
- passthrough->render(capture_pass, 0, 0, 0, aspect_ratio);
-
- wgpuRenderPassEncoderEnd(capture_pass);
- }
- }
-
pp->update_bind_group(current_input);
WGPURenderPassColorAttachment pp_attachment = {};