| // Copyright 2024 The Emscripten Authors. All rights reserved. | |
| // Emscripten is available under two separate licenses, the MIT license and the | |
| // University of Illinois/NCSA Open Source License. Both these licenses can be | |
| // found in the LICENSE file. | |
| // | |
| // This file and library_webgpu.js together implement <webgpu/webgpu.h>. | |
| // | |
| #include <webgpu/webgpu.h> | |
| #include <array> | |
| #include <cstdlib> | |
| #include <cassert> | |
| // | |
| // WebGPU function definitions, with methods organized by "class". Note these | |
| // don't need to be extern "C" because they are already declared in webgpu.h. | |
| // | |
| // Standalone (non-method) functions | |
| WGPUInstance wgpuCreateInstance([[maybe_unused]] const WGPUInstanceDescriptor* descriptor) { | |
| assert(descriptor == nullptr); // descriptor not implemented yet | |
| return reinterpret_cast<WGPUInstance>(1); | |
| } | |
| // Instance | |
| void wgpuInstanceAddRef(WGPUInstance) { /* no-op for now */ } | |
| void wgpuInstanceRelease(WGPUInstance) { /* no-op for now */ } | |
| // WGPUSurface | |
| WGPUStatus wgpuSurfaceGetCapabilities(WGPUSurface surface, | |
| WGPUAdapter adapter, | |
| WGPUSurfaceCapabilities* capabilities) { | |
| assert(capabilities->nextInChain == nullptr); // TODO: Return WGPUStatus_Error | |
| static constexpr std::array<WGPUTextureFormat, 3> kSurfaceFormatsRGBAFirst = { | |
| WGPUTextureFormat_RGBA8Unorm, | |
| WGPUTextureFormat_BGRA8Unorm, | |
| WGPUTextureFormat_RGBA16Float, | |
| }; | |
| static constexpr std::array<WGPUTextureFormat, 3> kSurfaceFormatsBGRAFirst = { | |
| WGPUTextureFormat_BGRA8Unorm, | |
| WGPUTextureFormat_RGBA8Unorm, | |
| WGPUTextureFormat_RGBA16Float, | |
| }; | |
| WGPUTextureFormat preferredFormat = wgpuSurfaceGetPreferredFormat(surface, adapter); | |
| switch (preferredFormat) { | |
| case WGPUTextureFormat_RGBA8Unorm: | |
| capabilities->formatCount = kSurfaceFormatsRGBAFirst.size(); | |
| capabilities->formats = kSurfaceFormatsRGBAFirst.data(); | |
| break; | |
| case WGPUTextureFormat_BGRA8Unorm: | |
| capabilities->formatCount = kSurfaceFormatsBGRAFirst.size(); | |
| capabilities->formats = kSurfaceFormatsBGRAFirst.data(); | |
| break; | |
| default: | |
| assert(false); | |
| return WGPUStatus_Error; | |
| } | |
| { | |
| static constexpr WGPUPresentMode kPresentMode = WGPUPresentMode_Fifo; | |
| capabilities->presentModeCount = 1; | |
| capabilities->presentModes = &kPresentMode; | |
| } | |
| { | |
| static constexpr std::array<WGPUCompositeAlphaMode, 2> kAlphaModes = { | |
| WGPUCompositeAlphaMode_Opaque, | |
| WGPUCompositeAlphaMode_Premultiplied, | |
| }; | |
| capabilities->alphaModeCount = kAlphaModes.size(); | |
| capabilities->alphaModes = kAlphaModes.data(); | |
| } | |
| return WGPUStatus_Success; | |
| } | |
| // WGPUSurfaceCapabilities | |
| void wgpuSurfaceCapabilitiesFreeMembers(WGPUSurfaceCapabilities) { | |
| // wgpuSurfaceCapabilities doesn't currently allocate anything. | |
| } | |
| // WGPUAdapterInfo | |
| void wgpuAdapterInfoFreeMembers(WGPUAdapterInfo value) { | |
| free(const_cast<char *>(value.vendor)); | |
| free(const_cast<char *>(value.architecture)); | |
| free(const_cast<char *>(value.device)); | |
| free(const_cast<char *>(value.description)); | |
| } |