Cogs.Core
SwapChainWebGPU.cpp
1#include "SwapChainWebGPU.h"
2
3#include "Foundation/Logging/Logger.h"
4
5namespace{
6 Cogs::Logging::Log logger = Cogs::Logging::getLogger("SwapChainWebGPU");
7}
8
9namespace Cogs{
10
11 SwapChainWebGPU::SwapChainWebGPU()
12 {
13 }
14
15 SwapChainWebGPU::~SwapChainWebGPU()
16 {
17 // destroy(); // Done in GraphicsDevice::destroy();
18 }
19
20 void SwapChainWebGPU::initialize(WGPUDevice device_in, WGPUSurface surface_in)
21 {
22 device = device_in;
23 surface = surface_in;
24 create();
25 }
26
27 void SwapChainWebGPU::create()
28 {
29 WGPUSwapChainDescriptor swap_chain_desc = {};
30 swap_chain_desc.label = "WebGPU SwapChain";
31#ifdef EMSCRIPTEN
32 swap_chain_desc.usage = WGPUTextureUsage_RenderAttachment;
33#else
34 swap_chain_desc.usage = WGPUTextureUsage_CopyDst; // Require SurfaceCapabilities
35#endif
36 swap_chain_desc.format = swap_chain_format;
37 swap_chain_desc.width = set_width;
38 swap_chain_desc.height = set_height;
39 swap_chain_desc.presentMode = WGPUPresentMode_Fifo;
40 swapChain = wgpuDeviceCreateSwapChain(device, surface, &swap_chain_desc);
41 LOG_DEBUG(logger, "wgpuDeviceCreateSwapChain %p", swapChain);
42
43 WGPUTextureFormat formats[] = {
44 color_format,
45 };
46
47 if(samples > 1){
48 WGPUTextureDescriptor desc = {};
49 desc.label = "colorBufferTexture";
50 desc.usage = WGPUTextureUsage_RenderAttachment;
51 desc.dimension = WGPUTextureDimension_2D;
52 desc.size.width = set_width;
53 desc.size.height = set_height;
54 desc.size.depthOrArrayLayers = 1;
55 desc.format = color_format;
56 desc.mipLevelCount = 1;
57 desc.sampleCount = samples;
58 desc.viewFormatCount = sizeof(formats)/sizeof(formats[0]);
59 desc.viewFormats = formats;
60
61 colorBufferTexture = wgpuDeviceCreateTexture(device, &desc);
62 // colorBufferTexture = wgpuDeviceCreateErrorTexture(device, &desc);
63
64 WGPUTextureViewDescriptor view_desc = {};
65 view_desc.label = "colorBufferView";
66 view_desc.format = color_format;
67 view_desc.dimension = WGPUTextureViewDimension_2D;
68 view_desc.baseMipLevel = 0;
69 view_desc.mipLevelCount = 1;
70 view_desc.baseArrayLayer = 0;
71 view_desc.arrayLayerCount = 1;
72 view_desc.aspect = WGPUTextureAspect_All;
73 colorBufferView = wgpuTextureCreateView(colorBufferTexture, &view_desc);
74 }
75
76#ifndef EMSCRIPTEN
77 {
78 WGPUTextureDescriptor desc = {};
79 desc.label = "resolveTexture";
80 desc.usage = WGPUTextureUsage_RenderAttachment | WGPUTextureUsage_CopySrc;
81 desc.dimension = WGPUTextureDimension_2D;
82 desc.size.width = set_width;
83 desc.size.height = set_height;
84 desc.size.depthOrArrayLayers = 1;
85 desc.format = color_format;
86 desc.mipLevelCount = 1;
87 desc.sampleCount = 1;
88 desc.viewFormatCount = sizeof(formats)/sizeof(formats[0]);
89 desc.viewFormats = formats;
90
91 resolveTexture = wgpuDeviceCreateTexture(device, &desc);
92 // resolveTexture = wgpuDeviceCreateErrorTexture(device, &desc);
93
94 WGPUTextureViewDescriptor view_desc = {};
95 view_desc.label = "resolveView";
96 view_desc.format = color_format;
97 view_desc.dimension = WGPUTextureViewDimension_2D;
98 view_desc.baseMipLevel = 0;
99 view_desc.mipLevelCount = 1;
100 view_desc.baseArrayLayer = 0;
101 view_desc.arrayLayerCount = 1;
102 view_desc.aspect = WGPUTextureAspect_All;
103 resolveView = wgpuTextureCreateView(resolveTexture, &view_desc);
104 }
105#endif
106
107 {
108 WGPUTextureDescriptor desc = {};
109 desc.label = "depthBufferTexture";
110 desc.usage = WGPUTextureUsage_RenderAttachment;
111 desc.dimension = WGPUTextureDimension_2D;
112 desc.size.width = set_width;
113 desc.size.height = set_height;
114 desc.size.depthOrArrayLayers = 1;
115 desc.format = depth_format;
116 desc.mipLevelCount = 1;
117 desc.sampleCount = samples;
118 desc.viewFormatCount = 1;
119 desc.viewFormats = &depth_format;
120
121 depthBufferTexture = wgpuDeviceCreateTexture(device, &desc);
122 // depthBufferTexture = wgpuDeviceCreateErrorTexture(device, &desc);
123
124 WGPUTextureViewDescriptor view_desc = {};
125 view_desc.label = "depthBufferView";
126 view_desc.format = depth_format;
127 view_desc.dimension = WGPUTextureViewDimension_2D;
128 view_desc.baseMipLevel = 0;
129 view_desc.mipLevelCount = 1;
130 view_desc.baseArrayLayer = 0;
131 view_desc.arrayLayerCount = 1;
132 view_desc.aspect = WGPUTextureAspect_DepthOnly;
133 depthBufferView = wgpuTextureCreateView(depthBufferTexture, &view_desc);
134 }
135 }
136
137 void SwapChainWebGPU::destroy()
138 {
139 if(samples > 1){
140 wgpuTextureViewRelease(colorBufferView);
141 wgpuTextureDestroy(colorBufferTexture);
142 wgpuTextureRelease(colorBufferTexture);
143 }
144#ifndef EMSCRIPTEN
145 wgpuTextureViewRelease(resolveView);
146 wgpuTextureDestroy(resolveTexture);
147 wgpuTextureRelease(resolveTexture);
148#endif
149 wgpuTextureViewRelease(depthBufferView);
150 wgpuTextureDestroy(depthBufferTexture);
151 wgpuTextureRelease(depthBufferTexture);
152 wgpuSwapChainRelease(swapChain);
153 }
154
156 {
157 if(resize){
158 destroy();
159 create();
160 resize = false;
161 }
162 #ifdef EMSCRIPTEN
163 resolveView = wgpuSwapChainGetCurrentTextureView(swapChain);
164 #endif
165 }
166
167 void SwapChainWebGPU::endFrame(uint32_t syncInterval, uint32_t presentFlags)
168 {
169 (void)syncInterval; // TODO
170 (void)presentFlags; // TODO
171#ifndef EMSCRIPTEN
172 // For Emacripten: wgpuSwapChainPresent is unsupported (use requestAnimationFrame via html5.h instead
173 wgpuSwapChainPresent(swapChain);
174#endif
175 }
176
177 void SwapChainWebGPU::setSize(int width, int height, bool /*forceIt*/)
178 {
179 LOG_DEBUG(logger, "setSize %d %d", width, height);
180 set_width = width;
181 set_height = height;
182 resize = true;
183 }
184
185 void SwapChainWebGPU::setFullscreen(bool /*enabled*/)
186 {
187 }
188
190 {
191 return false;
192 }
193
195 {
197 }
198
200 {
202 }
203
204}
Log implementation class.
Definition: LogManager.h:139
virtual bool isFullscreen() override
Test whether the current swap chain is fullscreen.
virtual const DepthStencilHandle & getDepthStencil() const
Returns the depth stencil managed by this swap chain.
virtual void beginFrame() override
Signal the beginning of a new frame to the graphics device.
virtual void setFullscreen(bool enabled) override
Switch this swap chain to fullscreen or windowed depending on the parameter.
virtual void endFrame(uint32_t syncInterval=0, uint32_t presentFlags=PresentFlags::None) override
Signal the end of a frame to the graphics device.
virtual const RenderTargetHandle & getRenderTarget() const
Returns the render target managed by this swap chain.
virtual void setSize(int newWidth, int newHeight, bool forceIt=false) override
Set the size of the main drawing buffer used by the graphics device in pixels.
constexpr Log getLogger(const char(&name)[LEN]) noexcept
Definition: LogManager.h:180
Contains all Cogs related functionality.
Definition: FieldSetter.h:23
static const Handle_t InvalidHandle
Represents an invalid handle.
Definition: Common.h:80