| /* |
| * Copyright 2023 Rive |
| */ |
| |
| #include "rive/pls/webgpu/em_js_handle.hpp" |
| |
| EmJsHandle& EmJsHandle::operator=(EmJsHandle&& rhs) |
| { |
| int tmp = rhs.m_handle; |
| rhs.m_handle = this->m_handle; |
| this->m_handle = tmp; |
| return *this; |
| } |
| |
| #ifdef RIVE_DAWN |
| EmJsHandle::~EmJsHandle() { assert(m_handle == 0); } |
| |
| wgpu::ShaderModule EmJsHandle::compileShaderModule(wgpu::Device device, |
| const char* language, |
| const char* source) |
| { |
| RIVE_UNREACHABLE(); |
| } |
| |
| wgpu::ShaderModule EmJsHandle::compileSPIRVShaderModule(wgpu::Device device, |
| const uint32_t* code, |
| uint32_t codeSize) |
| { |
| wgpu::ShaderModuleSPIRVDescriptor spirvDesc; |
| spirvDesc.code = code; |
| spirvDesc.codeSize = codeSize; |
| wgpu::ShaderModuleDescriptor descriptor; |
| descriptor.nextInChain = &spirvDesc; |
| return device.CreateShaderModule(&descriptor); |
| } |
| #endif |
| |
| #ifdef RIVE_WEBGPU |
| EmJsHandle::~EmJsHandle() |
| { |
| if (m_handle != 0) |
| { |
| emscripten_webgpu_release_js_handle(m_handle); |
| } |
| } |
| |
| EM_JS(int, compile_glsl_shader_module_js, (int device, const char* language, const char* source), { |
| device = JsValStore.get(device); |
| language = UTF8ToString(language); |
| source = UTF8ToString(source); |
| const shader = device.createShaderModule({ |
| language : language, |
| code : source, |
| }); |
| return JsValStore.add(shader); |
| }); |
| |
| wgpu::ShaderModule EmJsHandle::compileShaderModule(wgpu::Device device, |
| const char* language, |
| const char* source) |
| { |
| m_handle = compile_glsl_shader_module_js(emscripten_webgpu_export_device(device.Get()), |
| source, |
| language); |
| return wgpu::ShaderModule::Acquire(emscripten_webgpu_import_shader_module(m_handle)); |
| } |
| |
| EM_JS(int, compile_spirv_shader_module_js, (int device, uintptr_t indexU32, uint32_t codeSize), { |
| device = JsValStore.get(device); |
| // Copy data off the WASM heap before sending it to WebGPU bindings. |
| const code = new Uint32Array(codeSize); |
| code.set(Module.HEAPU32.subarray(indexU32, indexU32 + codeSize)); |
| const shader = device.createShaderModule({ |
| language : "spirv", |
| code : code, |
| }); |
| return JsValStore.add(shader); |
| }); |
| |
| wgpu::ShaderModule EmJsHandle::compileSPIRVShaderModule(wgpu::Device device, |
| const uint32_t* code, |
| uint32_t codeSize) |
| { |
| assert(reinterpret_cast<uintptr_t>(code) % sizeof(uint32_t) == 0); |
| m_handle = compile_spirv_shader_module_js(emscripten_webgpu_export_device(device.Get()), |
| reinterpret_cast<uintptr_t>(code) / sizeof(uint32_t), |
| codeSize); |
| return wgpu::ShaderModule::Acquire(emscripten_webgpu_import_shader_module(m_handle)); |
| } |
| #endif |