From c194f59e171a1e58ce1704f37d99ffcd09a42433 Mon Sep 17 00:00:00 2001 From: skal Date: Mon, 2 Feb 2026 15:55:03 +0100 Subject: fix(gpu): Resolve high-DPI squished rendering and 3D shadow bugs - Implemented dynamic resolution support in all shaders and effects. - Added explicit viewport setting for all render passes to ensure correct scaling. - Fixed 3D shadow mapping by adding PLANE support and standardizing soft shadow logic. - Propagated resize events through the Effect hierarchy. - Applied project-wide code formatting. --- src/gpu/effect.cc | 40 ++++++++++++++++++++++++++++++++++------ 1 file changed, 34 insertions(+), 6 deletions(-) (limited to 'src/gpu/effect.cc') diff --git a/src/gpu/effect.cc b/src/gpu/effect.cc index f115ac5..f24fa96 100644 --- a/src/gpu/effect.cc +++ b/src/gpu/effect.cc @@ -150,13 +150,17 @@ void MainSequence::init(WGPUDevice d, WGPUQueue q, WGPUTextureFormat f, device = d; queue = q; format = f; + width_ = width; + height_ = height; create_framebuffers(width, height); passthrough_effect_ = std::make_unique(device, queue, format); + passthrough_effect_->resize(width, height); for (ActiveSequence& entry : sequences_) { entry.seq->init(this); + entry.seq->resize(width, height); } } @@ -166,6 +170,7 @@ void MainSequence::add_sequence(std::shared_ptr seq, float start_time, // If MainSequence is already initialized, init the new sequence immediately if (device) { seq->init(this); + seq->resize(width_, height_); } std::sort(sequences_.begin(), sequences_.end(), [](const ActiveSequence& a, const ActiveSequence& b) { @@ -174,17 +179,29 @@ void MainSequence::add_sequence(std::shared_ptr seq, float start_time, } void MainSequence::resize(int width, int height) { + width_ = width; + height_ = height; // Release old resources - if (framebuffer_view_a_) wgpuTextureViewRelease(framebuffer_view_a_); - if (framebuffer_a_) wgpuTextureRelease(framebuffer_a_); - if (framebuffer_view_b_) wgpuTextureViewRelease(framebuffer_view_b_); - if (framebuffer_b_) wgpuTextureRelease(framebuffer_b_); - if (depth_view_) wgpuTextureViewRelease(depth_view_); - if (depth_texture_) wgpuTextureRelease(depth_texture_); + if (framebuffer_view_a_) + wgpuTextureViewRelease(framebuffer_view_a_); + if (framebuffer_a_) + wgpuTextureRelease(framebuffer_a_); + if (framebuffer_view_b_) + wgpuTextureViewRelease(framebuffer_view_b_); + if (framebuffer_b_) + wgpuTextureRelease(framebuffer_b_); + if (depth_view_) + wgpuTextureViewRelease(depth_view_); + if (depth_texture_) + wgpuTextureRelease(depth_texture_); // Recreate with new size create_framebuffers(width, height); + if (passthrough_effect_) { + passthrough_effect_->resize(width, height); + } + // Propagate to all sequences for (ActiveSequence& entry : sequences_) { entry.seq->resize(width, height); @@ -193,6 +210,11 @@ void MainSequence::resize(int width, int height) { void MainSequence::render_frame(float global_time, float beat, float peak, float aspect_ratio, WGPUSurface surface) { + static bool first_frame = true; + if (first_frame) { + printf("MainSequence First Frame: %dx%d\n", width_, height_); + first_frame = false; + } WGPUCommandEncoder encoder = wgpuDeviceCreateCommandEncoder(device, nullptr); std::vector scene_effects; @@ -242,6 +264,8 @@ void MainSequence::render_frame(float global_time, float beat, float peak, &depth_attachment}; WGPURenderPassEncoder scene_pass = wgpuCommandEncoderBeginRenderPass(encoder, &scene_desc); + wgpuRenderPassEncoderSetViewport(scene_pass, 0.0f, 0.0f, (float)width_, + (float)height_, 0.0f, 1.0f); for (const SequenceItem* item : scene_effects) { item->effect->render(scene_pass, global_time - item->start_time, beat, peak, aspect_ratio); @@ -273,6 +297,8 @@ void MainSequence::render_frame(float global_time, float beat, float peak, .colorAttachmentCount = 1, .colorAttachments = &final_attachment}; WGPURenderPassEncoder final_pass = wgpuCommandEncoderBeginRenderPass(encoder, &final_desc); + wgpuRenderPassEncoderSetViewport(final_pass, 0.0f, 0.0f, (float)width_, + (float)height_, 0.0f, 1.0f); passthrough_effect_->render(final_pass, 0, 0, 0, aspect_ratio); wgpuRenderPassEncoderEnd(final_pass); } else { @@ -307,6 +333,8 @@ void MainSequence::render_frame(float global_time, float beat, float peak, .colorAttachments = &pp_attachment}; WGPURenderPassEncoder pp_pass = wgpuCommandEncoderBeginRenderPass(encoder, &pp_desc); + wgpuRenderPassEncoderSetViewport(pp_pass, 0.0f, 0.0f, (float)width_, + (float)height_, 0.0f, 1.0f); pp->render(pp_pass, global_time - post_effects[i]->start_time, beat, peak, aspect_ratio); wgpuRenderPassEncoderEnd(pp_pass); -- cgit v1.2.3