From 16c2cdce6ad1d89d3c537f2c2cff743449925125 Mon Sep 17 00:00:00 2001 From: skal Date: Sun, 8 Feb 2026 08:33:55 +0100 Subject: feat(platform): Centralize platform-specific WebGPU code and improve shader composition --- src/gpu/gpu.cc | 111 ++++----------------------------------------------------- 1 file changed, 7 insertions(+), 104 deletions(-) (limited to 'src/gpu/gpu.cc') diff --git a/src/gpu/gpu.cc b/src/gpu/gpu.cc index 9776eac..c61c605 100644 --- a/src/gpu/gpu.cc +++ b/src/gpu/gpu.cc @@ -57,11 +57,7 @@ RenderPass gpu_create_render_pass(WGPUDevice device, WGPUTextureFormat format, RenderPass pass = {}; // Create Shader Module - WGPUShaderSourceWGSL wgsl_src = {}; - wgsl_src.chain.sType = WGPUSType_ShaderSourceWGSL; - wgsl_src.code = str_view(shader_code); - WGPUShaderModuleDescriptor shader_desc = {}; - shader_desc.nextInChain = &wgsl_src.chain; + WGPUShaderModuleDescriptor shader_desc = platform_create_shader_module_descriptor(shader_code); WGPUShaderModule shader_module = wgpuDeviceCreateShaderModule(device, &shader_desc); @@ -145,7 +141,7 @@ RenderPass gpu_create_render_pass(WGPUDevice device, WGPUTextureFormat format, depth_stencil.format = WGPUTextureFormat_Depth24Plus; depth_stencil.depthWriteEnabled = WGPUOptionalBool_False; depth_stencil.depthCompare = WGPUCompareFunction_Always; - pipeline_desc.depthStencil = &depth_stencil; + PLATFORM_SET_PIPELINE_DEPTH_STENCIL(pipeline_desc, &depth_stencil); pass.pipeline = wgpuDeviceCreateRenderPipeline(device, &pipeline_desc); @@ -157,11 +153,7 @@ ComputePass gpu_create_compute_pass(WGPUDevice device, const char* shader_code, int num_bindings) { ComputePass pass = {}; - WGPUShaderSourceWGSL wgsl_src = {}; - wgsl_src.chain.sType = WGPUSType_ShaderSourceWGSL; - wgsl_src.code = str_view(shader_code); - WGPUShaderModuleDescriptor shader_desc = {}; - shader_desc.nextInChain = &wgsl_src.chain; + WGPUShaderModuleDescriptor shader_desc = platform_create_shader_module_descriptor(shader_code); WGPUShaderModule shader_module = wgpuDeviceCreateShaderModule(device, &shader_desc); @@ -214,49 +206,11 @@ ComputePass gpu_create_compute_pass(WGPUDevice device, const char* shader_code, #if !defined(STRIP_ALL) #if defined(DEMO_CROSS_COMPILE_WIN32) -static void handle_request_adapter(WGPURequestAdapterStatus status, - WGPUAdapter adapter, const char* message, - void* userdata) { - if (status == WGPURequestAdapterStatus_Success) { - *((WGPUAdapter*)userdata) = adapter; - } else { - printf("Request adapter failed: %s\n", message ? message : "Unknown"); - } -} -static void handle_request_device(WGPURequestDeviceStatus status, - WGPUDevice device, const char* message, - void* userdata) { - if (status == WGPURequestDeviceStatus_Success) { - *((WGPUDevice*)userdata) = device; - } else { - printf("Request device failed: %s\n", message ? message : "Unknown"); - } -} static void handle_device_error(WGPUErrorType type, const char* message, void* userdata) { printf("WebGPU Error: %s\n", message ? message : "Unknown"); } #else -static void handle_request_adapter(WGPURequestAdapterStatus status, - WGPUAdapter adapter, WGPUStringView message, - void* userdata, void* userdata2) { - (void)userdata2; - if (status == WGPURequestAdapterStatus_Success) { - *((WGPUAdapter*)userdata) = adapter; - } else { - printf("Request adapter failed: %.*s\n", (int)message.length, message.data); - } -} -static void handle_request_device(WGPURequestDeviceStatus status, - WGPUDevice device, WGPUStringView message, - void* userdata, void* userdata2) { - (void)userdata2; - if (status == WGPURequestDeviceStatus_Success) { - *((WGPUDevice*)userdata) = device; - } else { - printf("Request device failed: %.*s\n", (int)message.length, message.data); - } -} static void handle_device_error(const WGPUDevice* device, WGPUErrorType type, WGPUStringView message, void* userdata, void* userdata2) { @@ -266,41 +220,6 @@ static void handle_device_error(const WGPUDevice* device, WGPUErrorType type, printf("WebGPU Error: %.*s\n", (int)message.length, message.data); } #endif /* defined(DEMO_CROSS_COMPILE_WIN32) */ -#else -// STRIP_ALL versions -#if defined(DEMO_CROSS_COMPILE_WIN32) -static void handle_request_adapter(WGPURequestAdapterStatus status, - WGPUAdapter adapter, const char* message, - void* userdata) { - if (status == WGPURequestAdapterStatus_Success) { - *((WGPUAdapter*)userdata) = adapter; - } -} -static void handle_request_device(WGPURequestDeviceStatus status, - WGPUDevice device, const char* message, - void* userdata) { - if (status == WGPURequestDeviceStatus_Success) { - *((WGPUDevice*)userdata) = device; - } -} -#else -static void handle_request_adapter(WGPURequestAdapterStatus status, - WGPUAdapter adapter, WGPUStringView message, - void* userdata, void* userdata2) { - (void)userdata2; - if (status == WGPURequestAdapterStatus_Success) { - *((WGPUAdapter*)userdata) = adapter; - } -} -static void handle_request_device(WGPURequestDeviceStatus status, - WGPUDevice device, WGPUStringView message, - void* userdata, void* userdata2) { - (void)userdata2; - if (status == WGPURequestDeviceStatus_Success) { - *((WGPUDevice*)userdata) = device; - } -} -#endif /* defined(DEMO_CROSS_COMPILE_WIN32) */ #endif /* !defined(STRIP_ALL) */ void gpu_init(PlatformState* platform_state) { @@ -311,16 +230,8 @@ void gpu_init(PlatformState* platform_state) { adapter_opts.compatibleSurface = g_surface; adapter_opts.powerPreference = WGPUPowerPreference_HighPerformance; -#if defined(DEMO_CROSS_COMPILE_WIN32) - wgpuInstanceRequestAdapter(g_instance, &adapter_opts, handle_request_adapter, - &g_adapter); -#else - WGPURequestAdapterCallbackInfo adapter_cb = {}; - adapter_cb.mode = WGPUCallbackMode_WaitAnyOnly; - adapter_cb.callback = handle_request_adapter; - adapter_cb.userdata1 = &g_adapter; - wgpuInstanceRequestAdapter(g_instance, &adapter_opts, adapter_cb); -#endif /* defined(DEMO_CROSS_COMPILE_WIN32) */ + platform_wgpu_request_adapter(g_instance, &adapter_opts, &g_adapter); + while (!g_adapter) platform_wgpu_wait_any(g_instance); @@ -331,16 +242,8 @@ void gpu_init(PlatformState* platform_state) { #endif /* !defined(DEMO_CROSS_COMPILE_WIN32) */ #endif /* !defined(STRIP_ALL) */ -#if defined(DEMO_CROSS_COMPILE_WIN32) - wgpuAdapterRequestDevice(g_adapter, &device_desc, handle_request_device, - &g_device); -#else - WGPURequestDeviceCallbackInfo device_cb = {}; - device_cb.mode = WGPUCallbackMode_WaitAnyOnly; - device_cb.callback = handle_request_device; - device_cb.userdata1 = &g_device; - wgpuAdapterRequestDevice(g_adapter, &device_desc, device_cb); -#endif /* defined(DEMO_CROSS_COMPILE_WIN32) */ + platform_wgpu_request_device(g_adapter, &device_desc, &g_device); + while (!g_device) platform_wgpu_wait_any(g_instance); -- cgit v1.2.3