Cogs.Core
RenderTargetsWebGPU.cpp
1#include "RenderTargetsWebGPU.h"
2
3#include "GraphicsDeviceWebGPU.h"
4
5#include <cassert>
6
7namespace Cogs{
8
9 void RenderTargetsWebGPU::initialize(GraphicsDeviceWebGPU *graphicsDeviceIn)
10 {
11 graphicsDevice = graphicsDeviceIn;
12 }
13
15 {
16 RenderTargetWebGPU render_target = {};
17
18 for(size_t i=0; i<numViews; i++){
19 const RenderTargetViewDescription &set = renderTargetViews[i];
20 const TextureWebGPU &texture = graphicsDevice->textures.textures[set.texture];
21
22 WGPUTextureViewDescriptor desc = {};
23 desc.format = texture.view_format;
24 desc.dimension = texture.view_dimension;
25 if(set.numLayers == 1){
26 switch(desc.dimension){
27 case WGPUTextureViewDimension_2DArray:
28 desc.dimension = WGPUTextureViewDimension_2D;
29 break;
30 case WGPUTextureViewDimension_CubeArray:
31 desc.dimension = WGPUTextureViewDimension_Cube;
32 break;
33 default:
34 break;
35 }
36 }
37 desc.baseMipLevel = set.levelIndex;
38 desc.mipLevelCount = 1;
39 desc.baseArrayLayer = set.layerIndex;
40 desc.arrayLayerCount = set.numLayers;
41 desc.aspect = WGPUTextureAspect_All;
42 render_target.view[i] = wgpuTextureCreateView(texture.texture, &desc);
43 render_target.textureHandle[i] = set.texture;
44 render_target.format[i] = texture.view_format;
45 }
46 render_target.count = (uint32_t)numViews;
47
48 if(numViews){
49 const RenderTargetViewDescription &set = renderTargetViews[0];
50 const TextureWebGPU &texture = graphicsDevice->textures.textures[set.texture];
51 render_target.width = texture.width;
52 render_target.height = texture.height;
53 render_target.samples = texture.samples;
54
55 }
56
57 return render_targets.addResource(std::move(render_target));
58 }
59
61 {
62 if(!HandleIsValid(handle)) return;
63 RenderTargetWebGPU &target = render_targets[handle];
64 for(size_t i=0; i<target.count; i++){
65 wgpuTextureViewRelease(target.view[i]);
66 }
67 render_targets.removeResource(handle);
68 }
69
71 {
72 RenderTargetWebGPU &target = render_targets[handle];
73 assert(target.width);
74 assert(target.height);
75 assert(target.samples);
76 TextureDescription tex_desc = {};
77 tex_desc.target = ResourceDimensions::Texture2D;
78 tex_desc.width = target.width;
79 tex_desc.height = target.height;
80 tex_desc.depth = 1;
81 tex_desc.layers = 1;
82 tex_desc.faces = 1;
83 tex_desc.levels = 1;
84 tex_desc.samples = target.samples;
85 tex_desc.format = TextureFormat::D32_FLOAT;
86 tex_desc.flags = TextureFlags::DepthBuffer;
87 TextureHandle textureHandle = graphicsDevice->textures.loadTexture(tex_desc, nullptr);
88 DepthStencilViewDescription view_desc = {};
89 view_desc.texture = textureHandle;
90 view_desc.layerIndex = 0;
91 view_desc.numLayers = 1;
92 view_desc.levelIndex = 0;
93 DepthStencilHandle ret = createDepthStencilTarget(handle, view_desc);
94 DepthStencilTargetWebGPU &ds = depth_stencil_targets[ret];
95 ds.textureHandle = textureHandle;
96 return ret;
97 }
98
100 {
101 DepthStencilViewDescription view_desc = {};
102 view_desc.texture = textureHandle;
103 view_desc.layerIndex = 0;
104 view_desc.numLayers = 1;
105 view_desc.levelIndex = 0;
106 return createDepthStencilTarget(handle, view_desc);
107 }
108
110 {
111 DepthStencilTargetWebGPU depth_stencil_target;
112
113 {
114 const DepthStencilViewDescription &set = depthStencilView;
115 const TextureWebGPU &texture = graphicsDevice->textures.textures[set.texture];
116
117 WGPUTextureViewDescriptor desc = {};
118 desc.format = texture.view_format;
119 desc.dimension = texture.view_dimension;
120 if(set.numLayers == 1){
121 switch(desc.dimension){
122 case WGPUTextureViewDimension_2DArray:
123 desc.dimension = WGPUTextureViewDimension_2D;
124 break;
125 case WGPUTextureViewDimension_CubeArray:
126 desc.dimension = WGPUTextureViewDimension_Cube;
127 break;
128 default:
129 break;
130 }
131 }
132 desc.baseMipLevel = set.levelIndex;
133 desc.mipLevelCount = 1;
134 desc.baseArrayLayer = set.layerIndex;
135 desc.arrayLayerCount = set.numLayers;
136 desc.aspect = WGPUTextureAspect_All;
137 depth_stencil_target.view = wgpuTextureCreateView(texture.texture, &desc);
138 depth_stencil_target.format = texture.view_format;
139 depth_stencil_target.samples = texture.samples;
140 }
141
142 return depth_stencil_targets.addResource(std::move(depth_stencil_target));
143 }
144
146 {
147 if(!HandleIsValid(handle)) return;
148 DepthStencilTargetWebGPU &target = depth_stencil_targets[handle];
149 wgpuTextureViewRelease(target.view);
150 depth_stencil_targets.removeResource(handle);
151 }
152
153}
virtual void releaseRenderTarget(RenderTargetHandle handle) override
Release the render target with the given renderTargetHandle.
virtual DepthStencilHandle createDepthStencilTarget(const RenderTargetHandle handle) override
Creates a depth/stencil target to back the render target with the given handle.
virtual void releaseDepthStencilTarget(DepthStencilHandle handle) override
Release the depth target with the given depthStencilHandle.
virtual RenderTargetHandle createRenderTarget(const RenderTargetViewDescription *renderTargetViews, const size_t numViews) override
Create a render target using the given view descriptions.
virtual TextureHandle loadTexture(const TextureDescription &desc, const TextureData *data) override
Load a texture from the given description.
Contains all Cogs related functionality.
Definition: FieldSetter.h:23
Describes a single depth stencil view and which resources to use from the underlying texture.
TextureHandle texture
Texture handle.
uint16_t numLayers
Number of available layers to write to.
uint8_t levelIndex
Index of the mipmap level to render to.
uint16_t layerIndex
Index of the first layer (if array) to write depth to.
Describes a single render target view and which resources to use from the underlying texture.
uint16_t layerIndex
Index of the first layer (if array) to render to.
uint16_t numLayers
Number of available layers to render to.
TextureHandle texture
Texture handle.
uint8_t levelIndex
Index of the mipmap level to render to.
@ DepthBuffer
The texture can be used as a depth target and have depth buffer values written into.
Definition: Flags.h:122