diff options
Diffstat (limited to 'dom/webgpu/tests/cts/checkout/src/webgpu/util/texture/subresource.ts')
-rw-r--r-- | dom/webgpu/tests/cts/checkout/src/webgpu/util/texture/subresource.ts | 68 |
1 files changed, 68 insertions, 0 deletions
diff --git a/dom/webgpu/tests/cts/checkout/src/webgpu/util/texture/subresource.ts b/dom/webgpu/tests/cts/checkout/src/webgpu/util/texture/subresource.ts new file mode 100644 index 0000000000..b8d6e3eb21 --- /dev/null +++ b/dom/webgpu/tests/cts/checkout/src/webgpu/util/texture/subresource.ts @@ -0,0 +1,68 @@ +/** A range of indices expressed as `{ begin, count }`. */ +export interface BeginCountRange { + begin: number; + count: number; +} + +/* A range of indices, expressed as `{ begin, end }`. */ +export interface BeginEndRange { + begin: number; + end: number; +} + +function endOfRange(r: BeginEndRange | BeginCountRange): number { + return 'count' in r ? r.begin + r.count : r.end; +} + +function* rangeAsIterator(r: BeginEndRange | BeginCountRange): Generator<number> { + for (let i = r.begin; i < endOfRange(r); ++i) { + yield i; + } +} + +/** + * Represents a range of subresources of a single-plane texture: + * a min/max mip level and min/max array layer. + */ +export class SubresourceRange { + readonly mipRange: BeginEndRange; + readonly layerRange: BeginEndRange; + + constructor(subresources: { + mipRange: BeginEndRange | BeginCountRange; + layerRange: BeginEndRange | BeginCountRange; + }) { + this.mipRange = { + begin: subresources.mipRange.begin, + end: endOfRange(subresources.mipRange), + }; + this.layerRange = { + begin: subresources.layerRange.begin, + end: endOfRange(subresources.layerRange), + }; + } + + /** + * Iterates over the "rectangle" of `{ level, layer }` pairs represented by the range. + */ + *each(): Generator<{ level: number; layer: number }> { + for (let level = this.mipRange.begin; level < this.mipRange.end; ++level) { + for (let layer = this.layerRange.begin; layer < this.layerRange.end; ++layer) { + yield { level, layer }; + } + } + } + + /** + * Iterates over the mip levels represented by the range, each level including an iterator + * over the array layers at that level. + */ + *mipLevels(): Generator<{ level: number; layers: Generator<number> }> { + for (let level = this.mipRange.begin; level < this.mipRange.end; ++level) { + yield { + level, + layers: rangeAsIterator(this.layerRange), + }; + } + } +} |