VTK  9.3.20240919
vtkWebGPUComputePassTextureStorageInternals.h
Go to the documentation of this file.
1// SPDX-FileCopyrightText: Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
2// SPDX-License-Identifier: BSD-3-Clause
3
4#ifndef vtkWebGPUComputePassTextureStorageInternals_h
5#define vtkWebGPUComputePassTextureStorageInternals_h
6
7#include "vtkObject.h"
8#include "vtkSmartPointer.h" // for smart pointers
9#include "vtkWeakPointer.h" // for the weak pointer of the parent compute pass
10#include "vtkWebGPUComputePass.h" // for enum
11#include "vtkWebGPUComputeRenderTexture.h" // for compute render textures
12#include "vtkWebGPUComputeTexture.h" // for compute textures
13#include "vtkWebGPUComputeTextureView.h" // for compute texture views
14#include "vtkWebGPUConfiguration.h" // for ivar
15#include "vtk_wgpu.h" // for webgpu
16
17#include <cstddef>
18#include <unordered_map>
19#include <unordered_set>
20
21VTK_ABI_NAMESPACE_BEGIN
22
24
32{
33public:
36
43 vtkSetSmartPointerMacro(ParentPassWGPUConfiguration, vtkWebGPUConfiguration);
44
49
57 bool CheckTextureIndex(std::size_t textureIndex, const std::string& callerFunctionName);
58
67 bool CheckTextureViewIndex(std::size_t textureViewIndex, const std::string& callerFunctionName);
68
73
78
82 bool CheckParentComputePass(const std::string& callerFunctionName);
83
87 void RecreateTexture(std::size_t textureIndex);
88
96
104
111 void RecreateComputeTexture(std::size_t textureIndex);
112
120 void RecreateTextureViews(std::size_t textureIndex);
121
126 void RecreateTextureView(std::size_t textureViewIndex);
127
132 wgpu::TextureView CreateWebGPUTextureView(
133 vtkSmartPointer<vtkWebGPUComputeTextureView> textureView, wgpu::Texture wgpuTexture);
134
146 vtkSmartPointer<vtkWebGPUComputeTexture> texture, wgpu::Texture newWgpuTexture);
147
159
167
172
178
188
192 void DeleteTextureViews(std::size_t textureIndex);
193
209 void RebindTextureView(std::size_t group, uint32_t binding, std::size_t textureViewIndex);
210
211 /*
212 * This function maps the buffer, making it accessible to the CPU. This is
213 * an asynchronous operation, meaning that the given callback will be called
214 * when the mapping is done.
215 *
216 * The buffer data can then be read from the callback and stored
217 * in a buffer (std::vector<>, vtkDataArray, ...) passed in via the userdata pointer for example
218 */
219 void ReadTextureFromGPU(std::size_t textureIndex, int mipLevel,
220 vtkWebGPUComputePass::TextureMapAsyncCallback callback, void* userdata);
221
225 void WriteTexture(std::size_t textureIndex, const void* bytes, std::size_t numBytes)
226 {
227 if (!CheckTextureIndex(textureIndex, "UpdateTextureData"))
228 {
229 return;
230 }
231
232 wgpu::Texture wgpuTexture;
234 wgpuTexture = this->WebGPUTextures[textureIndex];
235 texture = this->Textures[textureIndex];
236
237 if (numBytes > static_cast<std::size_t>(texture->GetByteSize()))
238 {
239 vtkLog(ERROR,
240 "The given data is larger than what the texture \""
241 << texture->GetLabel() << "\" with byte size: " << texture->GetByteSize());
242
243 return;
244 }
245
246 wgpu::Extent3D textureExtents = { texture->GetWidth(), texture->GetHeight(),
247 texture->GetDepth() };
248
249 wgpu::ImageCopyTexture copyTexture;
250 copyTexture.aspect = wgpu::TextureAspect::All;
251 copyTexture.mipLevel = 0;
252 copyTexture.origin = { 0, 0, 0 };
253 copyTexture.texture = wgpuTexture;
254
255 wgpu::TextureDataLayout textureDataLayout;
256 textureDataLayout.nextInChain = nullptr;
257 textureDataLayout.bytesPerRow = texture->GetBytesPerPixel() * textureExtents.width;
258 textureDataLayout.offset = 0;
259 textureDataLayout.rowsPerImage = textureExtents.height;
260
261 // Uploading from std::vector or vtkDataArray if one of the two is present
262 this->ParentPassWGPUConfiguration->GetDevice().GetQueue().WriteTexture(
263 &copyTexture, bytes, numBytes, &textureDataLayout, &textureExtents);
264 }
265
270
275 static wgpu::TextureDimension ComputeTextureDimensionToWebGPU(
277
287 static wgpu::TextureViewDimension ComputeTextureDimensionToViewDimension(
289
294 static wgpu::TextureFormat ComputeTextureFormatToWebGPU(
296
303 static wgpu::TextureUsage ComputeTextureModeToUsage(
304 vtkWebGPUComputeTexture::TextureMode mode, const std::string& textureLabel);
305
311 static wgpu::StorageTextureAccess ComputeTextureModeToShaderStorage(
312 vtkWebGPUComputeTexture::TextureMode mode, const std::string& textureLabel);
313
319 static wgpu::StorageTextureAccess ComputeTextureViewModeToShaderStorage(
320 vtkWebGPUComputeTextureView::TextureViewMode mode, const std::string& textureViewLabel);
321
326 static wgpu::TextureSampleType ComputeTextureSampleTypeToWebGPU(
328
333 static wgpu::TextureAspect ComputeTextureViewAspectToWebGPU(
335
336protected:
339
340private:
342
343 // Compute pass that uses this texture storage
344 vtkWeakPointer<vtkWebGPUComputePass> ParentComputePass = nullptr;
345 // Device of the parent compute pass that is used when creating textures and texture views
346 vtkSmartPointer<vtkWebGPUConfiguration> ParentPassWGPUConfiguration;
347
348 // Compute textures of the storage
349 std::vector<vtkSmartPointer<vtkWebGPUComputeTexture>> Textures;
350 // Compute render textures of this the storage
351 std::vector<vtkSmartPointer<vtkWebGPUComputeRenderTexture>> RenderTextures;
352 // Maps the compute render texture to the internal wgpu::Texture that they use
353 std::unordered_map<vtkSmartPointer<vtkWebGPUComputeRenderTexture>, wgpu::Texture>
354 RenderTexturesToWebGPUTexture;
355 // WebGPU textures associated with the compute texture in the same order
356 std::vector<wgpu::Texture> WebGPUTextures;
357
358 // A map of the compute textures associated with all the texture views of it
359 // that have been created
360 std::unordered_map<vtkSmartPointer<vtkWebGPUComputeTexture>,
361 std::unordered_set<vtkSmartPointer<vtkWebGPUComputeTextureView>>>
362 ComputeTextureToViews;
363 // List of the texture views added by the user. Can be used to find a texture
364 // view from its index (indices which the user manipulates)
365 std::vector<vtkSmartPointer<vtkWebGPUComputeTextureView>> TextureViews;
366 // Compute textures views mapped to their WebGPU textures views
367 std::unordered_map<vtkSmartPointer<vtkWebGPUComputeTextureView>, wgpu::TextureView>
368 TextureViewsToWebGPUTextureViews;
369};
370
371VTK_ABI_NAMESPACE_END
372
373#endif
abstract base class for most VTK objects
Definition vtkObject.h:162
Hold a reference to a vtkObjectBase instance.
a weak reference to a vtkObject.
Internals of the vtkWebGPUComputePass.
This class manages the creation/deletion/recreation/ of compute textures used by a compute pass.
vtkSetSmartPointerMacro(ParentPassWGPUConfiguration, vtkWebGPUConfiguration)
Sets the device that will be used by this texture storage when creating textures / texture views.
bool CheckTextureViewCorrectness(vtkWebGPUComputeTextureView *textureView)
Makes sure the texture view is correct with regards to its properties (binding, group,...
vtkSmartPointer< vtkWebGPUComputeTextureView > GetTextureView(std::size_t textureViewIndex)
Retrieves the texture view associated with the given texture view index.
static wgpu::TextureFormat ComputeTextureFormatToWebGPU(vtkWebGPUComputeTexture::TextureFormat format)
Internal method used to convert the user friendly TextureFormat enum to its wgpu::TextureFormat equiv...
int AddTextureView(vtkSmartPointer< vtkWebGPUComputeTextureView > textureView)
Adds a texture view to the compute pass and returns its index.
void ReadTextureFromGPU(std::size_t textureIndex, int mipLevel, vtkWebGPUComputePass::TextureMapAsyncCallback callback, void *userdata)
static wgpu::StorageTextureAccess ComputeTextureViewModeToShaderStorage(vtkWebGPUComputeTextureView::TextureViewMode mode, const std::string &textureViewLabel)
Internal method used to get the StorageTextureAccess mode associated with a TextureViewMode.
void RecreateTextureViews(std::size_t textureIndex)
Recreates all the texture views of a texture given its index.
vtkSmartPointer< vtkWebGPUComputeTexture > GetComputeTexture(std::size_t textureIndex)
Retrieves the compute texture associated with the given texture index.
static vtkWebGPUComputePassTextureStorageInternals * New()
wgpu::TextureView CreateWebGPUTextureView(vtkSmartPointer< vtkWebGPUComputeTextureView > textureView, wgpu::Texture wgpuTexture)
Utilitary method to create a wgpu::TextureView from a ComputeTextureView and the texture this wgpu::T...
static wgpu::TextureUsage ComputeTextureModeToUsage(vtkWebGPUComputeTexture::TextureMode mode, const std::string &textureLabel)
Internal method used to convert the user friendly TextureMode enum to its wgpu::TextureUsage equivale...
void ReleaseResources()
Releases the textures & resources held by this texture storage.
void RebindTextureView(std::size_t group, uint32_t binding, std::size_t textureViewIndex)
This function allows the usage of multiple texture views on a single binding point (group / binding c...
void WriteTexture(std::size_t textureIndex, const void *bytes, std::size_t numBytes)
Uploads the given data to the texture starting at pixel (0, 0)
static wgpu::TextureViewDimension ComputeTextureDimensionToViewDimension(vtkWebGPUComputeTexture::TextureDimension dimension)
This function does a simple mapping between the dimension of the texture (vtkWebGPUComputeTexture::Te...
static wgpu::StorageTextureAccess ComputeTextureModeToShaderStorage(vtkWebGPUComputeTexture::TextureMode mode, const std::string &textureLabel)
Internal method used to get the StorageTextureAccess mode associated with a TextureMode.
int AddRenderTexture(vtkSmartPointer< vtkWebGPUComputeRenderTexture > renderTexture)
Adds a render texture to the storage.
bool CheckTextureCorrectness(vtkWebGPUComputeTexture *texture)
Makes sure the texture is correct with regards to its properties (size, ...)
void DeleteTextureViews(std::size_t textureIndex)
Deletes all the texture views of a given texture (given by its index)
void SetComputePass(vtkWeakPointer< vtkWebGPUComputePass > parentComputePass)
Sets the compute pass that uses the textures and texture views used by this storage.
void RecreateRenderTexture(vtkSmartPointer< vtkWebGPUComputeRenderTexture > renderTexture)
Recreates a render texture given a new textureView and possibly new parameters as specified in the 'r...
static wgpu::TextureSampleType ComputeTextureSampleTypeToWebGPU(vtkWebGPUComputeTexture::TextureSampleType sampleType)
Internal method used to convert the user friendly TextureSampleType enum to its wgpu::TextureSampleTy...
bool CheckTextureIndex(std::size_t textureIndex, const std::string &callerFunctionName)
Checks if a given index is suitable for indexing this->Textures.
static wgpu::TextureAspect ComputeTextureViewAspectToWebGPU(vtkWebGPUComputeTextureView::TextureViewAspect aspect)
Internal method used to convert the user friendly TextureAspect enum to its wgpu::TextureAspect equiv...
void UpdateComputeTextureAndViews(vtkSmartPointer< vtkWebGPUComputeTexture > texture, wgpu::Texture newWgpuTexture)
Makes sure that the compute texture given in parameter internally points to the given newWgpuTexture.
int AddTexture(vtkSmartPointer< vtkWebGPUComputeTexture > texture)
Adds a texture to the storage and upload its data to the device.
void RecreateTextureView(std::size_t textureViewIndex)
Recreates a compute texture view.
void RecreateComputeTexture(std::size_t textureIndex)
Recreates a compute texture.
static wgpu::TextureDimension ComputeTextureDimensionToWebGPU(vtkWebGPUComputeTexture::TextureDimension dimension)
Internal method used to convert the user friendly Dimension enum to its wgpu::TextureDimension equiva...
void RecreateTexture(std::size_t textureIndex)
Destroys and recreates the texture with the given index.
bool CheckTextureViewIndex(std::size_t textureViewIndex, const std::string &callerFunctionName)
Checks if a given index is suitable for indexing this->TextureViews.
vtkSmartPointer< vtkWebGPUComputeTextureView > CreateTextureView(std::size_t textureIndex)
Returns a new texture view on the given texture (given by the index) that can be configured and then ...
bool CheckParentComputePass(const std::string &callerFunctionName)
Checks whether or not the associated ParentComputePass and ParentPassDevice are non-null.
A compute pass is an abstraction for offloading computation from the CPU onto the GPU using WebGPU co...
std::function< void(const void *, int, void *)> TextureMapAsyncCallback
Represents the set of parameters that will be used to create a compute shader texture on the device w...
Create a webgpu device for use in rendering and compute pipelines.
wgpu::Device GetDevice()
Get handles of the WGPU adapter/device/instance.
TextureViewAspect
What will the shader sample from the texture when calling a sampling function.
TextureViewMode
The mode of the texture view to define what operations will be doable on the texture in the shader.
TextureMode
How will the texture be used by the shader.
TextureDimension
How the texture data is arranged.
TextureSampleType
Determines what kind of value is returned when reading from the texture in the compute shader.
TextureFormat
RGBA8_UNORM: Uses RGB + alpha.
#define vtkLog(verbosity_name, x)
Add to log given the verbosity level.
Definition vtkLogger.h:513