diff options
Diffstat (limited to 'testing/web-platform/mozilla/tests/webgpu/webgpu/util/texture.js')
-rw-r--r-- | testing/web-platform/mozilla/tests/webgpu/webgpu/util/texture.js | 81 |
1 files changed, 81 insertions, 0 deletions
diff --git a/testing/web-platform/mozilla/tests/webgpu/webgpu/util/texture.js b/testing/web-platform/mozilla/tests/webgpu/webgpu/util/texture.js new file mode 100644 index 0000000000..c2c980c975 --- /dev/null +++ b/testing/web-platform/mozilla/tests/webgpu/webgpu/util/texture.js @@ -0,0 +1,81 @@ +/** +* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts +**/import { assert } from '../../common/util/util.js';import { getTextureCopyLayout } from './texture/layout.js'; + +import { reifyExtent3D } from './unions.js'; + +/** + * Creates a mipmapped texture where each mipmap level's (`i`) content is + * from `texelViews[i]`. + */ +export function createTextureFromTexelViews( +device, +texelViews, +desc) +{ + // All texel views must be the same format for mipmaps. + assert(texelViews.length > 0 && texelViews.every((e) => e.format === texelViews[0].format)); + const format = texelViews[0].format; + const { width, height, depthOrArrayLayers } = reifyExtent3D(desc.size); + + // Create the texture and then initialize each mipmap level separately. + const texture = device.createTexture({ + ...desc, + format: texelViews[0].format, + usage: desc.usage | GPUTextureUsage.COPY_DST, + mipLevelCount: texelViews.length + }); + + // Copy the texel view into each mip level layer. + const commandEncoder = device.createCommandEncoder(); + const stagingBuffers = []; + for (let mipLevel = 0; mipLevel < texelViews.length; mipLevel++) { + const { + bytesPerRow, + mipSize: [mipWidth, mipHeight, mipDepthOrArray] + } = getTextureCopyLayout(format, desc.dimension ?? '2d', [width, height, depthOrArrayLayers], { + mipLevel + }); + + // Create a staging buffer to upload the texture mip level contents. + const stagingBuffer = device.createBuffer({ + mappedAtCreation: true, + size: bytesPerRow * mipHeight * mipDepthOrArray, + usage: GPUBufferUsage.COPY_SRC + }); + stagingBuffers.push(stagingBuffer); + + // Write the texels into the staging buffer. + texelViews[mipLevel].writeTextureData(new Uint8Array(stagingBuffer.getMappedRange()), { + bytesPerRow, + rowsPerImage: mipHeight, + subrectOrigin: [0, 0, 0], + subrectSize: [mipWidth, mipHeight, mipDepthOrArray] + }); + stagingBuffer.unmap(); + + // Copy from the staging buffer into the texture. + commandEncoder.copyBufferToTexture( + { buffer: stagingBuffer, bytesPerRow }, + { texture, mipLevel }, + [mipWidth, mipHeight, mipDepthOrArray] + ); + } + device.queue.submit([commandEncoder.finish()]); + + // Cleanup the staging buffers. + stagingBuffers.forEach((value) => value.destroy()); + + return texture; +} + +/** + * Creates a 1 mip level texture with the contents of a TexelView. + */ +export function createTextureFromTexelView( +device, +texelView, +desc) +{ + return createTextureFromTexelViews(device, [texelView], desc); +}
\ No newline at end of file |