Archived
1
Fork 0
This repository has been archived on 2025-04-12. You can view files and clone it, but cannot push or open issues or pull requests.
prism/engine/gfx/webgpu/include/gfx_webgpu.hpp
Joshua Goins 3229c4fa2c Another big WebGPU compatibility patch
All specialization constants are removed (they cause trouble in
WebGPU, since they don't support array sizing, and it was a pain
in Metal anyway) - they are now macro defined. WebGPU now runs, although
push constant emulation is not implemented yet.
2022-03-07 00:33:44 -05:00

67 lines
2.3 KiB
C++
Executable file

#pragma once
#include <emscripten/html5_webgpu.h>
#include "gfx.hpp"
class GFXWebGPUPipeline;
class GFXWebGPU : public GFX {
public:
bool initialize(const GFXCreateInfo& createInfo) override;
ShaderLanguage accepted_shader_language() override;
const char* get_name() override;
bool supports_feature(GFXFeature feature) override;
// buffer
GFXBuffer* create_buffer(void* data, GFXSize size, bool is_dynamic, GFXBufferUsage usage) override;
void copy_buffer(GFXBuffer* buffer, void* data, GFXSize offset, GFXSize size) override;
void* get_buffer_contents(GFXBuffer* buffer) override;
void release_buffer_contents(GFXBuffer* buffer, void* handle) override;
// texture
GFXTexture* create_texture(const GFXTextureCreateInfo& info) override;
void copy_texture(GFXTexture* texture, void* data, GFXSize size) override;
void copy_texture(GFXTexture* from, GFXTexture* to) override;
void copy_texture(GFXTexture* from, GFXBuffer* to) override;
// sampler
GFXSampler* create_sampler(const GFXSamplerCreateInfo& info) override;
// framebuffer
GFXFramebuffer* create_framebuffer(const GFXFramebufferCreateInfo& info) override;
// render pass
GFXRenderPass* create_render_pass(const GFXRenderPassCreateInfo& info) override;
// pipeline
GFXPipeline* create_graphics_pipeline(const GFXGraphicsPipelineCreateInfo& info) override;
GFXPipeline* create_compute_pipeline(const GFXComputePipelineCreateInfo& info) override;
GFXCommandBuffer* acquire_command_buffer(bool for_presentation_use) override;
void submit(GFXCommandBuffer* command_buffer, platform::window_ptr window) override;
private:
WGPUSwapChain create_swapchain();
WGPUShaderModule create_shader(const uint32_t* code, uint32_t size, std::string_view label);
uint64_t get_bind_group_hash(GFXWebGPUPipeline* pipeline);
void cache_bind_group_state(GFXWebGPUPipeline* pipeline, WGPUBindGroupLayout group_layout);
void reset_bind_state();
WGPUDevice device;
WGPUQueue queue;
WGPUSwapChain swapchain;
struct BoundShaderBuffer {
GFXBuffer* buffer = nullptr;
uint32_t size = 0, offset = 0;
};
std::array<BoundShaderBuffer, 25> boundShaderBuffers;
std::array<GFXTexture*, 25> boundTextures;
std::array<GFXSampler*, 25> boundSamplers;
};