blob: ed6559fe71ea494d04561d46a458527b5a993e67 [file] [log] [blame]
/*
* 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