#pragma once #include #include #include "wgpu.hpp" #include #include struct SDL_Window; namespace aurora::webgpu { struct GraphicsConfig { wgpu::SurfaceConfiguration surfaceConfiguration; wgpu::TextureFormat depthFormat; uint32_t msaaSamples; uint16_t textureAnisotropy; }; struct TextureWithSampler { wgpu::Texture texture; wgpu::TextureView view; wgpu::Extent3D size; wgpu::TextureFormat format; wgpu::Sampler sampler; }; struct Viewport { float left; float top; float width; float height; float znear; float zfar; bool operator==(const Viewport& rhs) const { return left == rhs.left && top == rhs.top && width == rhs.width && height == rhs.height && znear == rhs.znear && zfar == rhs.zfar; } bool operator!=(const Viewport& rhs) const { return !(*this == rhs); } }; extern wgpu::Device g_device; extern wgpu::Queue g_queue; extern wgpu::Surface g_surface; extern wgpu::BackendType g_backendType; extern GraphicsConfig g_graphicsConfig; extern TextureWithSampler g_frameBuffer; extern TextureWithSampler g_frameBufferResolved; extern TextureWithSampler g_depthBuffer; extern wgpu::RenderPipeline g_CopyPipeline; extern wgpu::BindGroup g_CopyBindGroup; extern wgpu::Instance g_instance; extern bool g_bcTexturesSupported; extern bool g_astcTexturesSupported; extern bool g_textureComponentSwizzleSupported; const wgpu::AdapterInfo& adapter_info(); bool initialize(AuroraBackend backend, bool allowCpu); void shutdown(); void release_surface() noexcept; bool refresh_surface(bool recreate = true); void resize_swapchain(uint32_t width, uint32_t height, uint32_t native_width, uint32_t native_height, bool force = false); TextureWithSampler create_render_texture(uint32_t width, uint32_t height, bool multisampled); const TextureWithSampler& present_source() noexcept; wgpu::BindGroup create_copy_bind_group(const TextureWithSampler& source); void set_resampler(AuroraSampler sampler) noexcept; AuroraSampler get_resampler() noexcept; Viewport calculate_present_viewport(uint32_t surface_width, uint32_t surface_height, uint32_t content_width, uint32_t content_height) noexcept; const TextureWithSampler& resample_present_source(const wgpu::CommandEncoder& encoder, const Viewport& viewport); void draw_clear(const wgpu::RenderPassEncoder& pass, bool clearColor, bool clearAlpha, bool clearDepth, const Vec4& clearColorValue, float clearDepthValue); size_t load_from_cache(void const* key, size_t keySize, void* value, size_t valueSize, void* userdata); void store_to_cache(void const* key, size_t keySize, void const* value, size_t valueSize, void* userdata); void cache_prune(); void cache_shutdown(); } // namespace aurora::webgpu