VTK  9.4.20250206
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 const auto wgpuTexture = this->WebGPUTextures[textureIndex];
233 auto& texture = this->Textures[textureIndex];
234
235 if (numBytes > static_cast<std::size_t>(texture->GetByteSize()))
236 {
237 vtkLog(ERROR,
238 "The given data is larger than what the texture \""
239 << texture->GetLabel() << "\" with byte size: " << texture->GetByteSize());
240
241 return;
242 }
243
244 // Uploading from std::vector or vtkDataArray if one of the two is present
245 const std::string textureLabel = texture->GetLabel();
246 const char* textureLabelCStr = textureLabel.c_str();
247 const uint32_t bytesPerRow = texture->GetBytesPerPixel() * texture->GetWidth();
248 this->ParentPassWGPUConfiguration->WriteTexture(
249 wgpuTexture, bytesPerRow, numBytes, bytes, textureLabelCStr);
250 }
251
256
261 static wgpu::TextureDimension ComputeTextureDimensionToWebGPU(
263
273 static wgpu::TextureViewDimension ComputeTextureDimensionToViewDimension(
275
280 static wgpu::TextureFormat ComputeTextureFormatToWebGPU(
282
289 static wgpu::TextureUsage ComputeTextureModeToUsage(
290 vtkWebGPUComputeTexture::TextureMode mode, const std::string& textureLabel);
291
297 static wgpu::StorageTextureAccess ComputeTextureModeToShaderStorage(
298 vtkWebGPUComputeTexture::TextureMode mode, const std::string& textureLabel);
299
305 static wgpu::StorageTextureAccess ComputeTextureViewModeToShaderStorage(
306 vtkWebGPUComputeTextureView::TextureViewMode mode, const std::string& textureViewLabel);
307
312 static wgpu::TextureSampleType ComputeTextureSampleTypeToWebGPU(
314
319 static wgpu::TextureAspect ComputeTextureViewAspectToWebGPU(
321
322protected:
325
326private:
328
331 void operator=(const vtkWebGPUComputePassTextureStorageInternals&) = delete;
332
333 // Compute pass that uses this texture storage
334 vtkWeakPointer<vtkWebGPUComputePass> ParentComputePass = nullptr;
335 // Device of the parent compute pass that is used when creating textures and texture views
336 vtkSmartPointer<vtkWebGPUConfiguration> ParentPassWGPUConfiguration;
337
338 // Compute textures of the storage
339 std::vector<vtkSmartPointer<vtkWebGPUComputeTexture>> Textures;
340 // Compute render textures of this the storage
341 std::vector<vtkSmartPointer<vtkWebGPUComputeRenderTexture>> RenderTextures;
342 // Maps the compute render texture to the internal wgpu::Texture that they use
343 std::unordered_map<vtkSmartPointer<vtkWebGPUComputeRenderTexture>, wgpu::Texture>
344 RenderTexturesToWebGPUTexture;
345 // WebGPU textures associated with the compute texture in the same order
346 std::vector<wgpu::Texture> WebGPUTextures;
347
348 // A map of the compute textures associated with all the texture views of it
349 // that have been created
350 std::unordered_map<vtkSmartPointer<vtkWebGPUComputeTexture>,
351 std::unordered_set<vtkSmartPointer<vtkWebGPUComputeTextureView>>>
352 ComputeTextureToViews;
353 // List of the texture views added by the user. Can be used to find a texture
354 // view from its index (indices which the user manipulates)
355 std::vector<vtkSmartPointer<vtkWebGPUComputeTextureView>> TextureViews;
356 // Compute textures views mapped to their WebGPU textures views
357 std::unordered_map<vtkSmartPointer<vtkWebGPUComputeTextureView>, wgpu::TextureView>
358 TextureViewsToWebGPUTextureViews;
359};
360
361VTK_ABI_NAMESPACE_END
362
363#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.
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.
void WriteTexture(wgpu::Texture texture, uint32_t bytesPerRow, uint32_t byteSize, const void *data, const char *description=nullptr)
Upload byteSize of data from the data pointer to the given texture, assuming bytesPerRow bytes of dat...
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