From de76354a8423e20331b835642bae204d277afdcd Mon Sep 17 00:00:00 2001 From: luboslenco Date: Tue, 6 Jan 2026 11:00:19 +0100 Subject: [PATCH] webgpu cube works --- base/sources/backends/data/wasm/start.js | 13 ++++++++++++- base/sources/backends/webgpu_gpu.c | 10 ++++------ base/sources/backends/webgpu_gpu.h | 1 + 3 files changed, 17 insertions(+), 7 deletions(-) diff --git a/base/sources/backends/data/wasm/start.js b/base/sources/backends/data/wasm/start.js index 5324c9ec..a437f2bc 100644 --- a/base/sources/backends/data/wasm/start.js +++ b/base/sources/backends/data/wasm/start.js @@ -5,6 +5,7 @@ let heapu16 = null; let heapu32 = null; let heapi32 = null; let heapf32 = null; +let heapf64 = null; let module = null; let instance = null; let wgpu_objects = [ null ]; @@ -41,6 +42,10 @@ function read_u32(ptr) { return heapu32[ptr / 4]; } +function read_f64(ptr) { + return heapf64[ptr / 8]; +} + function write_string(ptr, str) { for (let i = 0; i < str.length; ++i) { heapu8[ptr + i] = str.charCodeAt(i); @@ -85,6 +90,7 @@ async function init() { heapu32 = new Uint32Array(memory.buffer); heapi32 = new Int32Array(memory.buffer); heapf32 = new Float32Array(memory.buffer); + heapf64 = new Float64Array(memory.buffer); if (!navigator.gpu) { throw new Error('WebGPU not supported'); @@ -297,7 +303,12 @@ async function init() { let pcas = read_u32(pdescriptor + 16); for (let i = 0; i < desc.colorAttachmentCount; ++i) { // WGPURenderPassColorAttachment - let ca = {view : id_to_ptr(read_u32(pcas + 4 + i * 28)), loadOp : "clear", storeOp : "store", clearValue : [ 0.0, 0.0, 0.0, 0.0 ]}; + let ca = { + view : id_to_ptr(read_u32(pcas + 4 + i * 56)), + loadOp : "clear", + storeOp : "store", + clearValue : [ read_f64(pcas + 24 + i * 56), read_f64(pcas + 32 + i * 56), read_f64(pcas + 40 + i * 56), read_f64(pcas + 48 + i * 56) ] + }; desc.colorAttachments.push(ca); } diff --git a/base/sources/backends/webgpu_gpu.c b/base/sources/backends/webgpu_gpu.c index 58548c80..a6ad24b7 100644 --- a/base/sources/backends/webgpu_gpu.c +++ b/base/sources/backends/webgpu_gpu.c @@ -491,8 +491,7 @@ static WGPUBindGroup get_descriptor_set(WGPUBuffer buffer) { void gpu_set_constant_buffer(gpu_buffer_t *buffer, int offset, size_t size) { WGPUBindGroup bind_group = get_descriptor_set(buffer->impl.buf); - // uint32_t offsets[1] = {(uint32_t)offset}; - uint32_t offsets[1] = {(uint32_t)0}; + uint32_t offsets[1] = {(uint32_t)offset}; wgpuRenderPassEncoderSetBindGroup(render_pass_encoder, 0, bind_group, 1, offsets); wgpuBindGroupRelease(bind_group); } @@ -744,20 +743,19 @@ void gpu_constant_buffer_init(gpu_buffer_t *buffer, int size) { buffer->count = size; buffer->stride = 1; - // WGPUBufferDescriptor desc = {.size = size, .usage = WGPUBufferUsage_Uniform, .mappedAtCreation = true}; - WGPUBufferDescriptor desc = {.size = size, .usage = WGPUBufferUsage_Uniform, .mappedAtCreation = false}; + WGPUBufferDescriptor desc = {.size = size, .usage = WGPUBufferUsage_Uniform | WGPUBufferUsage_CopyDst, .mappedAtCreation = false}; buffer->impl.buf = wgpuDeviceCreateBuffer(device, &desc); buffer->impl.mem = malloc(buffer->count * buffer->stride); } void gpu_constant_buffer_lock(gpu_buffer_t *buffer, int start, int count) { - // buffer->start = start; + buffer->impl.start = start; buffer->count = count; buffer->data = &buffer->impl.mem[start]; } void gpu_constant_buffer_unlock(gpu_buffer_t *buffer) { - // wgpuBufferUnmap2(buffer->impl.buf, buffer->data, buffer->start, buffer->count); + wgpuQueueWriteBuffer(queue, buffer->impl.buf, buffer->impl.start, buffer->data, buffer->count); buffer->data = NULL; } diff --git a/base/sources/backends/webgpu_gpu.h b/base/sources/backends/webgpu_gpu.h index a63aff8e..1d68c3b2 100644 --- a/base/sources/backends/webgpu_gpu.h +++ b/base/sources/backends/webgpu_gpu.h @@ -4,6 +4,7 @@ typedef struct { WGPUBuffer buf; void *mem; + int start; } gpu_buffer_impl_t; typedef struct {