Rename GetMipLevelSize

Functions GetMipLevel*Size() are somehow unclear and misleading on
whether the array layers are counted into the z-axis of the returned
Extent3D (Extent3D.depthOrArrayLayers).

This change renames them to GetMipLevelSingleSubresource*Size(),
making it clear that array layers are not included in its z-axis.
Because different array layers are different subreources, they are
not in a single subresource. However, depth slices in 3D textures can
be in a single subresource and can be counted.

Bug: dawn:1288
Change-Id: Ifa1776befa863d0f5a11999cab4099e2e7e5996a
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/92124
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
Kokoro: Kokoro <noreply+kokoro@google.com>
Commit-Queue: Yunchao He <yunchao.he@intel.com>
Reviewed-by: Austin Eng <enga@chromium.org>
This commit is contained in:
Yunchao He 2022-06-02 19:07:41 +00:00 committed by Dawn LUCI CQ
parent 4313dba514
commit 7bfcdca419
13 changed files with 46 additions and 37 deletions

View File

@ -73,7 +73,7 @@ CommandIterator* CommandBufferBase::GetCommandIteratorForTesting() {
bool IsCompleteSubresourceCopiedTo(const TextureBase* texture, bool IsCompleteSubresourceCopiedTo(const TextureBase* texture,
const Extent3D copySize, const Extent3D copySize,
const uint32_t mipLevel) { const uint32_t mipLevel) {
Extent3D extent = texture->GetMipLevelPhysicalSize(mipLevel); Extent3D extent = texture->GetMipLevelSingleSubresourcePhysicalSize(mipLevel);
switch (texture->GetDimension()) { switch (texture->GetDimension()) {
case wgpu::TextureDimension::e1D: case wgpu::TextureDimension::e1D:

View File

@ -126,7 +126,8 @@ MaybeError ValidateOrSetAttachmentSize(const TextureViewBase* attachment,
uint32_t* width, uint32_t* width,
uint32_t* height) { uint32_t* height) {
const Extent3D& attachmentSize = const Extent3D& attachmentSize =
attachment->GetTexture()->GetMipLevelVirtualSize(attachment->GetBaseMipLevel()); attachment->GetTexture()->GetMipLevelSingleSubresourceVirtualSize(
attachment->GetBaseMipLevel());
if (*width == 0) { if (*width == 0) {
DAWN_ASSERT(*height == 0); DAWN_ASSERT(*height == 0);
@ -190,9 +191,11 @@ MaybeError ValidateResolveTarget(const DeviceBase* device,
resolveTarget->GetLevelCount()); resolveTarget->GetLevelCount());
const Extent3D& colorTextureSize = const Extent3D& colorTextureSize =
attachment->GetTexture()->GetMipLevelVirtualSize(attachment->GetBaseMipLevel()); attachment->GetTexture()->GetMipLevelSingleSubresourceVirtualSize(
attachment->GetBaseMipLevel());
const Extent3D& resolveTextureSize = const Extent3D& resolveTextureSize =
resolveTarget->GetTexture()->GetMipLevelVirtualSize(resolveTarget->GetBaseMipLevel()); resolveTarget->GetTexture()->GetMipLevelSingleSubresourceVirtualSize(
resolveTarget->GetBaseMipLevel());
DAWN_INVALID_IF(colorTextureSize.width != resolveTextureSize.width || DAWN_INVALID_IF(colorTextureSize.width != resolveTextureSize.width ||
colorTextureSize.height != resolveTextureSize.height, colorTextureSize.height != resolveTextureSize.height,
"The Resolve target %s size (width: %u, height: %u) does not match the color " "The Resolve target %s size (width: %u, height: %u) does not match the color "

View File

@ -275,7 +275,8 @@ MaybeError ValidateImageCopyTexture(DeviceBase const* device,
texture->GetFormat().format, textureCopy.aspect); texture->GetFormat().format, textureCopy.aspect);
if (texture->GetSampleCount() > 1 || texture->GetFormat().HasDepthOrStencil()) { if (texture->GetSampleCount() > 1 || texture->GetFormat().HasDepthOrStencil()) {
Extent3D subresourceSize = texture->GetMipLevelPhysicalSize(textureCopy.mipLevel); Extent3D subresourceSize =
texture->GetMipLevelSingleSubresourcePhysicalSize(textureCopy.mipLevel);
ASSERT(texture->GetDimension() == wgpu::TextureDimension::e2D); ASSERT(texture->GetDimension() == wgpu::TextureDimension::e2D);
DAWN_INVALID_IF( DAWN_INVALID_IF(
textureCopy.origin.x != 0 || textureCopy.origin.y != 0 || textureCopy.origin.x != 0 || textureCopy.origin.y != 0 ||
@ -297,7 +298,7 @@ MaybeError ValidateTextureCopyRange(DeviceBase const* device,
const TextureBase* texture = textureCopy.texture; const TextureBase* texture = textureCopy.texture;
// Validation for the copy being in-bounds: // Validation for the copy being in-bounds:
Extent3D mipSize = texture->GetMipLevelPhysicalSize(textureCopy.mipLevel); Extent3D mipSize = texture->GetMipLevelSingleSubresourcePhysicalSize(textureCopy.mipLevel);
// For 1D/2D textures, include the array layer as depth so it can be checked with other // For 1D/2D textures, include the array layer as depth so it can be checked with other
// dimensions. // dimensions.
if (texture->GetDimension() != wgpu::TextureDimension::e3D) { if (texture->GetDimension() != wgpu::TextureDimension::e3D) {

View File

@ -330,10 +330,10 @@ ResultOrError<Ref<TextureViewBase>> NewSwapChainBase::GetCurrentTextureView() {
ASSERT(mCurrentTextureView->GetLayerCount() == 1); ASSERT(mCurrentTextureView->GetLayerCount() == 1);
ASSERT(mCurrentTextureView->GetDimension() == wgpu::TextureViewDimension::e2D); ASSERT(mCurrentTextureView->GetDimension() == wgpu::TextureViewDimension::e2D);
ASSERT(mCurrentTextureView->GetTexture() ASSERT(mCurrentTextureView->GetTexture()
->GetMipLevelVirtualSize(mCurrentTextureView->GetBaseMipLevel()) ->GetMipLevelSingleSubresourceVirtualSize(mCurrentTextureView->GetBaseMipLevel())
.width == mWidth); .width == mWidth);
ASSERT(mCurrentTextureView->GetTexture() ASSERT(mCurrentTextureView->GetTexture()
->GetMipLevelVirtualSize(mCurrentTextureView->GetBaseMipLevel()) ->GetMipLevelSingleSubresourceVirtualSize(mCurrentTextureView->GetBaseMipLevel())
.height == mHeight); .height == mHeight);
return mCurrentTextureView; return mCurrentTextureView;

View File

@ -695,7 +695,7 @@ bool TextureBase::IsMultisampledTexture() const {
return mSampleCount > 1; return mSampleCount > 1;
} }
Extent3D TextureBase::GetMipLevelVirtualSize(uint32_t level) const { Extent3D TextureBase::GetMipLevelSingleSubresourceVirtualSize(uint32_t level) const {
Extent3D extent = {std::max(mSize.width >> level, 1u), 1u, 1u}; Extent3D extent = {std::max(mSize.width >> level, 1u), 1u, 1u};
if (mDimension == wgpu::TextureDimension::e1D) { if (mDimension == wgpu::TextureDimension::e1D) {
return extent; return extent;
@ -710,8 +710,8 @@ Extent3D TextureBase::GetMipLevelVirtualSize(uint32_t level) const {
return extent; return extent;
} }
Extent3D TextureBase::GetMipLevelPhysicalSize(uint32_t level) const { Extent3D TextureBase::GetMipLevelSingleSubresourcePhysicalSize(uint32_t level) const {
Extent3D extent = GetMipLevelVirtualSize(level); Extent3D extent = GetMipLevelSingleSubresourceVirtualSize(level);
// Compressed Textures will have paddings if their width or height is not a multiple of // Compressed Textures will have paddings if their width or height is not a multiple of
// 4 at non-zero mipmap levels. // 4 at non-zero mipmap levels.
@ -731,7 +731,7 @@ Extent3D TextureBase::GetMipLevelPhysicalSize(uint32_t level) const {
Extent3D TextureBase::ClampToMipLevelVirtualSize(uint32_t level, Extent3D TextureBase::ClampToMipLevelVirtualSize(uint32_t level,
const Origin3D& origin, const Origin3D& origin,
const Extent3D& extent) const { const Extent3D& extent) const {
const Extent3D virtualSizeAtLevel = GetMipLevelVirtualSize(level); const Extent3D virtualSizeAtLevel = GetMipLevelSingleSubresourceVirtualSize(level);
ASSERT(origin.x <= virtualSizeAtLevel.width); ASSERT(origin.x <= virtualSizeAtLevel.width);
ASSERT(origin.y <= virtualSizeAtLevel.height); ASSERT(origin.y <= virtualSizeAtLevel.height);
uint32_t clampedCopyExtentWidth = (extent.width > virtualSizeAtLevel.width - origin.x) uint32_t clampedCopyExtentWidth = (extent.width > virtualSizeAtLevel.width - origin.x)

View File

@ -87,8 +87,8 @@ class TextureBase : public ApiObjectBase {
// size is the one with paddings if necessary, which is always a multiple of the block size // size is the one with paddings if necessary, which is always a multiple of the block size
// and used in texture copying. The virtual size is the one without paddings, which is not // and used in texture copying. The virtual size is the one without paddings, which is not
// required to be a multiple of the block size and used in texture sampling. // required to be a multiple of the block size and used in texture sampling.
Extent3D GetMipLevelPhysicalSize(uint32_t level) const; Extent3D GetMipLevelSingleSubresourcePhysicalSize(uint32_t level) const;
Extent3D GetMipLevelVirtualSize(uint32_t level) const; Extent3D GetMipLevelSingleSubresourceVirtualSize(uint32_t level) const;
Extent3D ClampToMipLevelVirtualSize(uint32_t level, Extent3D ClampToMipLevelVirtualSize(uint32_t level,
const Origin3D& origin, const Origin3D& origin,
const Extent3D& extent) const; const Extent3D& extent) const;

View File

@ -1086,7 +1086,7 @@ MaybeError Texture::ClearTexture(CommandRecordingContext* commandContext,
for (Aspect aspect : IterateEnumMask(range.aspects)) { for (Aspect aspect : IterateEnumMask(range.aspects)) {
const TexelBlockInfo& blockInfo = GetFormat().GetAspectInfo(aspect).block; const TexelBlockInfo& blockInfo = GetFormat().GetAspectInfo(aspect).block;
Extent3D largestMipSize = GetMipLevelPhysicalSize(range.baseMipLevel); Extent3D largestMipSize = GetMipLevelSingleSubresourcePhysicalSize(range.baseMipLevel);
uint32_t bytesPerRow = uint32_t bytesPerRow =
Align((largestMipSize.width / blockInfo.width) * blockInfo.byteSize, Align((largestMipSize.width / blockInfo.width) * blockInfo.byteSize,
@ -1103,7 +1103,7 @@ MaybeError Texture::ClearTexture(CommandRecordingContext* commandContext,
for (uint32_t level = range.baseMipLevel; level < range.baseMipLevel + range.levelCount; for (uint32_t level = range.baseMipLevel; level < range.baseMipLevel + range.levelCount;
++level) { ++level) {
// compute d3d12 texture copy locations for texture and buffer // compute d3d12 texture copy locations for texture and buffer
Extent3D copySize = GetMipLevelPhysicalSize(level); Extent3D copySize = GetMipLevelSingleSubresourcePhysicalSize(level);
for (uint32_t layer = range.baseArrayLayer; for (uint32_t layer = range.baseArrayLayer;
layer < range.baseArrayLayer + range.layerCount; ++layer) { layer < range.baseArrayLayer + range.layerCount; ++layer) {

View File

@ -869,8 +869,9 @@ MaybeError Texture::ClearTexture(CommandRecordingContext* commandContext,
} }
} }
DAWN_TRY(EncodeEmptyMetalRenderPass(device, commandContext, descriptor, DAWN_TRY(
GetMipLevelVirtualSize(level))); EncodeEmptyMetalRenderPass(device, commandContext, descriptor,
GetMipLevelSingleSubresourceVirtualSize(level)));
} }
} }
} else { } else {
@ -883,7 +884,7 @@ MaybeError Texture::ClearTexture(CommandRecordingContext* commandContext,
NSRef<MTLRenderPassDescriptor> descriptor; NSRef<MTLRenderPassDescriptor> descriptor;
uint32_t attachment = 0; uint32_t attachment = 0;
uint32_t numZSlices = GetMipLevelVirtualSize(level).depthOrArrayLayers; uint32_t depth = GetMipLevelSingleSubresourceVirtualSize(level).depthOrArrayLayers;
for (uint32_t arrayLayer = range.baseArrayLayer; for (uint32_t arrayLayer = range.baseArrayLayer;
arrayLayer < range.baseArrayLayer + range.layerCount; arrayLayer++) { arrayLayer < range.baseArrayLayer + range.layerCount; arrayLayer++) {
@ -894,7 +895,7 @@ MaybeError Texture::ClearTexture(CommandRecordingContext* commandContext,
continue; continue;
} }
for (uint32_t z = 0; z < numZSlices; ++z) { for (uint32_t z = 0; z < depth; ++z) {
if (descriptor == nullptr) { if (descriptor == nullptr) {
// Note that this creates a descriptor that's autoreleased so we // Note that this creates a descriptor that's autoreleased so we
// don't use AcquireNSRef // don't use AcquireNSRef
@ -915,17 +916,18 @@ MaybeError Texture::ClearTexture(CommandRecordingContext* commandContext,
if (attachment == kMaxColorAttachments) { if (attachment == kMaxColorAttachments) {
attachment = 0; attachment = 0;
DAWN_TRY(EncodeEmptyMetalRenderPass(device, commandContext, DAWN_TRY(EncodeEmptyMetalRenderPass(
descriptor.Get(), device, commandContext, descriptor.Get(),
GetMipLevelVirtualSize(level))); GetMipLevelSingleSubresourceVirtualSize(level)));
descriptor = nullptr; descriptor = nullptr;
} }
} }
} }
if (descriptor != nullptr) { if (descriptor != nullptr) {
DAWN_TRY(EncodeEmptyMetalRenderPass(device, commandContext, descriptor.Get(), DAWN_TRY(
GetMipLevelVirtualSize(level))); EncodeEmptyMetalRenderPass(device, commandContext, descriptor.Get(),
GetMipLevelSingleSubresourceVirtualSize(level)));
} }
} }
} }
@ -937,7 +939,7 @@ MaybeError Texture::ClearTexture(CommandRecordingContext* commandContext,
// Computations for the bytes per row / image height are done using the physical size // Computations for the bytes per row / image height are done using the physical size
// so that enough data is reserved for compressed textures. // so that enough data is reserved for compressed textures.
Extent3D largestMipSize = GetMipLevelPhysicalSize(range.baseMipLevel); Extent3D largestMipSize = GetMipLevelSingleSubresourcePhysicalSize(range.baseMipLevel);
uint32_t largestMipBytesPerRow = uint32_t largestMipBytesPerRow =
(largestMipSize.width / blockInfo.width) * blockInfo.byteSize; (largestMipSize.width / blockInfo.width) * blockInfo.byteSize;
uint64_t largestMipBytesPerImage = static_cast<uint64_t>(largestMipBytesPerRow) * uint64_t largestMipBytesPerImage = static_cast<uint64_t>(largestMipBytesPerRow) *
@ -959,7 +961,7 @@ MaybeError Texture::ClearTexture(CommandRecordingContext* commandContext,
for (uint32_t level = range.baseMipLevel; level < range.baseMipLevel + range.levelCount; for (uint32_t level = range.baseMipLevel; level < range.baseMipLevel + range.levelCount;
++level) { ++level) {
Extent3D virtualSize = GetMipLevelVirtualSize(level); Extent3D virtualSize = GetMipLevelSingleSubresourceVirtualSize(level);
for (uint32_t arrayLayer = range.baseArrayLayer; for (uint32_t arrayLayer = range.baseArrayLayer;
arrayLayer < range.baseArrayLayer + range.layerCount; ++arrayLayer) { arrayLayer < range.baseArrayLayer + range.layerCount; ++arrayLayer) {

View File

@ -262,7 +262,7 @@ TextureBufferCopySplit ComputeTextureBufferCopySplit(const Texture* texture,
origin.z + copyExtent.depthOrArrayLayers - 1}; origin.z + copyExtent.depthOrArrayLayers - 1};
ASSERT(copyExtent.height - blockInfo.height < ASSERT(copyExtent.height - blockInfo.height <
texture->GetMipLevelVirtualSize(mipLevel).height); texture->GetMipLevelSingleSubresourceVirtualSize(mipLevel).height);
copy.copies[copy.count].copyExtent = {clampedCopyExtent.width, copy.copies[copy.count].copyExtent = {clampedCopyExtent.width,
copyExtent.height - blockInfo.height, 1}; copyExtent.height - blockInfo.height, 1};

View File

@ -422,7 +422,8 @@ void ResolveMultisampledRenderTargets(const OpenGLFunctions& gl,
Extent3D ComputeTextureCopyExtent(const TextureCopy& textureCopy, const Extent3D& copySize) { Extent3D ComputeTextureCopyExtent(const TextureCopy& textureCopy, const Extent3D& copySize) {
Extent3D validTextureCopyExtent = copySize; Extent3D validTextureCopyExtent = copySize;
const TextureBase* texture = textureCopy.texture.Get(); const TextureBase* texture = textureCopy.texture.Get();
Extent3D virtualSizeAtLevel = texture->GetMipLevelVirtualSize(textureCopy.mipLevel); Extent3D virtualSizeAtLevel =
texture->GetMipLevelSingleSubresourceVirtualSize(textureCopy.mipLevel);
ASSERT(textureCopy.origin.x <= virtualSizeAtLevel.width); ASSERT(textureCopy.origin.x <= virtualSizeAtLevel.width);
ASSERT(textureCopy.origin.y <= virtualSizeAtLevel.height); ASSERT(textureCopy.origin.y <= virtualSizeAtLevel.height);
if (copySize.width > virtualSizeAtLevel.width - textureCopy.origin.x) { if (copySize.width > virtualSizeAtLevel.width - textureCopy.origin.x) {
@ -1240,7 +1241,7 @@ void DoTexSubImage(const OpenGLFunctions& gl,
uint32_t z = destination.origin.z; uint32_t z = destination.origin.z;
if (texture->GetFormat().isCompressed) { if (texture->GetFormat().isCompressed) {
size_t rowSize = copySize.width / blockInfo.width * blockInfo.byteSize; size_t rowSize = copySize.width / blockInfo.width * blockInfo.byteSize;
Extent3D virtSize = texture->GetMipLevelVirtualSize(destination.mipLevel); Extent3D virtSize = texture->GetMipLevelSingleSubresourceVirtualSize(destination.mipLevel);
uint32_t width = std::min(copySize.width, virtSize.width - x); uint32_t width = std::min(copySize.width, virtSize.width - x);
// In GLES glPixelStorei() doesn't affect CompressedTexSubImage*D() and // In GLES glPixelStorei() doesn't affect CompressedTexSubImage*D() and

View File

@ -378,7 +378,7 @@ MaybeError Texture::ClearTexture(const SubresourceRange& range,
const GLFormat& glFormat = GetGLFormat(); const GLFormat& glFormat = GetGLFormat();
for (uint32_t level = range.baseMipLevel; level < range.baseMipLevel + range.levelCount; for (uint32_t level = range.baseMipLevel; level < range.baseMipLevel + range.levelCount;
++level) { ++level) {
Extent3D mipSize = GetMipLevelPhysicalSize(level); Extent3D mipSize = GetMipLevelSingleSubresourcePhysicalSize(level);
for (uint32_t layer = range.baseArrayLayer; for (uint32_t layer = range.baseArrayLayer;
layer < range.baseArrayLayer + range.layerCount; ++layer) { layer < range.baseArrayLayer + range.layerCount; ++layer) {
if (clearValue == TextureBase::ClearValue::Zero && if (clearValue == TextureBase::ClearValue::Zero &&
@ -448,7 +448,8 @@ MaybeError Texture::ClearTexture(const SubresourceRange& range,
DoClear(); DoClear();
break; break;
case wgpu::TextureDimension::e3D: case wgpu::TextureDimension::e3D:
uint32_t depth = GetMipLevelVirtualSize(level).depthOrArrayLayers; uint32_t depth = GetMipLevelSingleSubresourceVirtualSize(level)
.depthOrArrayLayers;
for (GLint z = 0; z < static_cast<GLint>(depth); ++z) { for (GLint z = 0; z < static_cast<GLint>(depth); ++z) {
gl.FramebufferTextureLayer(GL_DRAW_FRAMEBUFFER, attachment, gl.FramebufferTextureLayer(GL_DRAW_FRAMEBUFFER, attachment,
GetHandle(), level, z); GetHandle(), level, z);
@ -477,7 +478,7 @@ MaybeError Texture::ClearTexture(const SubresourceRange& range,
const TexelBlockInfo& blockInfo = GetFormat().GetAspectInfo(Aspect::Color).block; const TexelBlockInfo& blockInfo = GetFormat().GetAspectInfo(Aspect::Color).block;
ASSERT(kTextureBytesPerRowAlignment % blockInfo.byteSize == 0); ASSERT(kTextureBytesPerRowAlignment % blockInfo.byteSize == 0);
Extent3D largestMipSize = GetMipLevelPhysicalSize(range.baseMipLevel); Extent3D largestMipSize = GetMipLevelSingleSubresourcePhysicalSize(range.baseMipLevel);
uint32_t bytesPerRow = uint32_t bytesPerRow =
Align((largestMipSize.width / blockInfo.width) * blockInfo.byteSize, 4); Align((largestMipSize.width / blockInfo.width) * blockInfo.byteSize, 4);
@ -521,7 +522,7 @@ MaybeError Texture::ClearTexture(const SubresourceRange& range,
dataLayout.bytesPerRow = bytesPerRow; dataLayout.bytesPerRow = bytesPerRow;
dataLayout.rowsPerImage = largestMipSize.height; dataLayout.rowsPerImage = largestMipSize.height;
Extent3D mipSize = GetMipLevelPhysicalSize(level); Extent3D mipSize = GetMipLevelSingleSubresourcePhysicalSize(level);
for (uint32_t layer = range.baseArrayLayer; for (uint32_t layer = range.baseArrayLayer;
layer < range.baseArrayLayer + range.layerCount; ++layer) { layer < range.baseArrayLayer + range.layerCount; ++layer) {

View File

@ -1195,7 +1195,7 @@ MaybeError Texture::ClearTexture(CommandRecordingContext* recordingContext,
ASSERT(range.aspects == Aspect::Color); ASSERT(range.aspects == Aspect::Color);
const TexelBlockInfo& blockInfo = GetFormat().GetAspectInfo(range.aspects).block; const TexelBlockInfo& blockInfo = GetFormat().GetAspectInfo(range.aspects).block;
Extent3D largestMipSize = GetMipLevelPhysicalSize(range.baseMipLevel); Extent3D largestMipSize = GetMipLevelSingleSubresourcePhysicalSize(range.baseMipLevel);
uint32_t bytesPerRow = Align((largestMipSize.width / blockInfo.width) * blockInfo.byteSize, uint32_t bytesPerRow = Align((largestMipSize.width / blockInfo.width) * blockInfo.byteSize,
device->GetOptimalBytesPerRowAlignment()); device->GetOptimalBytesPerRowAlignment());
@ -1211,7 +1211,7 @@ MaybeError Texture::ClearTexture(CommandRecordingContext* recordingContext,
std::vector<VkBufferImageCopy> regions; std::vector<VkBufferImageCopy> regions;
for (uint32_t level = range.baseMipLevel; level < range.baseMipLevel + range.levelCount; for (uint32_t level = range.baseMipLevel; level < range.baseMipLevel + range.levelCount;
++level) { ++level) {
Extent3D copySize = GetMipLevelPhysicalSize(level); Extent3D copySize = GetMipLevelSingleSubresourcePhysicalSize(level);
imageRange.baseMipLevel = level; imageRange.baseMipLevel = level;
for (uint32_t layer = range.baseArrayLayer; for (uint32_t layer = range.baseArrayLayer;
layer < range.baseArrayLayer + range.layerCount; ++layer) { layer < range.baseArrayLayer + range.layerCount; ++layer) {

View File

@ -114,7 +114,8 @@ VkImageAspectFlags VulkanAspectMask(const Aspect& aspects) {
Extent3D ComputeTextureCopyExtent(const TextureCopy& textureCopy, const Extent3D& copySize) { Extent3D ComputeTextureCopyExtent(const TextureCopy& textureCopy, const Extent3D& copySize) {
Extent3D validTextureCopyExtent = copySize; Extent3D validTextureCopyExtent = copySize;
const TextureBase* texture = textureCopy.texture.Get(); const TextureBase* texture = textureCopy.texture.Get();
Extent3D virtualSizeAtLevel = texture->GetMipLevelVirtualSize(textureCopy.mipLevel); Extent3D virtualSizeAtLevel =
texture->GetMipLevelSingleSubresourceVirtualSize(textureCopy.mipLevel);
ASSERT(textureCopy.origin.x <= virtualSizeAtLevel.width); ASSERT(textureCopy.origin.x <= virtualSizeAtLevel.width);
ASSERT(textureCopy.origin.y <= virtualSizeAtLevel.height); ASSERT(textureCopy.origin.y <= virtualSizeAtLevel.height);
if (copySize.width > virtualSizeAtLevel.width - textureCopy.origin.x) { if (copySize.width > virtualSizeAtLevel.width - textureCopy.origin.x) {