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.
67 lines
2.3 KiB
C++
Executable file
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;
|
|
};
|