#pragma once
#include
#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 boundShaderBuffers;
std::array boundTextures;
std::array boundSamplers;
};