// This file is part of the 64k demo project. // It implements helper functions for post-processing effects. #include "post_process_helper.h" #include "../demo_effects.h" #include "gpu/gpu.h" #include "gpu/effects/shader_composer.h" #include "gpu/bind_group_builder.h" #include "gpu/sampler_cache.h" #include "gpu/pipeline_builder.h" #include // Helper to create a standard post-processing pipeline WGPURenderPipeline create_post_process_pipeline(WGPUDevice device, WGPUTextureFormat format, const char* shader_code) { WGPUBindGroupLayout bgl = BindGroupLayoutBuilder() .sampler(PP_BINDING_SAMPLER, WGPUShaderStage_Fragment) .texture(PP_BINDING_TEXTURE, WGPUShaderStage_Fragment) .uniform(PP_BINDING_UNIFORMS, WGPUShaderStage_Vertex | WGPUShaderStage_Fragment) .uniform(PP_BINDING_EFFECT_PARAMS, WGPUShaderStage_Fragment) .build(device); WGPURenderPipeline pipeline = RenderPipelineBuilder(device) .shader(shader_code) .bind_group_layout(bgl) .format(format) .build(); wgpuBindGroupLayoutRelease(bgl); return pipeline; } // --- PostProcess Implementation Helper --- static GpuBuffer g_dummy_buffer = {nullptr, 0}; void pp_update_bind_group(WGPUDevice device, WGPURenderPipeline pipeline, WGPUBindGroup* bind_group, WGPUTextureView input_view, GpuBuffer uniforms, GpuBuffer effect_params) { if (!g_dummy_buffer.buffer) { g_dummy_buffer = gpu_create_buffer(device, 32, WGPUBufferUsage_Uniform); } if (*bind_group) wgpuBindGroupRelease(*bind_group); WGPUBindGroupLayout bgl = wgpuRenderPipelineGetBindGroupLayout(pipeline, 0); WGPUSampler sampler = SamplerCache::Get().get_or_create(device, SamplerCache::linear()); *bind_group = BindGroupBuilder() .sampler(PP_BINDING_SAMPLER, sampler) .texture(PP_BINDING_TEXTURE, input_view) .buffer(PP_BINDING_UNIFORMS, uniforms.buffer, uniforms.size) .buffer(PP_BINDING_EFFECT_PARAMS, effect_params.buffer ? effect_params.buffer : g_dummy_buffer.buffer, effect_params.buffer ? effect_params.size : g_dummy_buffer.size) .build(device, bgl); }