d3d11: fix several OOM end2end test on trybot

BufferTests.CreateBufferOOM/D3D11_Intel_R_UHD_Graphics_630 fails on
trybots due to buffer size overflow UINT which is used as size for
create ID3D11Buffer.

This CL fixes above issue and also uses CheckOutOfMemoryHRESULT()
to handle hresult from texture and buffer creation. It makes OOM
an allowed error.

Bug: dawn:1705
Change-Id: I2c4a4841cac15934fe83b7f7d6e568e9f3c8d210
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/128280
Reviewed-by: Austin Eng <enga@chromium.org>
Auto-Submit: Peng Huang <penghuang@chromium.org>
Kokoro: Kokoro <noreply+kokoro@google.com>
Commit-Queue: Peng Huang <penghuang@chromium.org>
This commit is contained in:
Peng Huang 2023-04-20 17:27:17 +00:00 committed by Dawn LUCI CQ
parent 45ff7a8c4a
commit bd696e91d2
2 changed files with 15 additions and 14 deletions

View File

@ -162,7 +162,8 @@ MaybeError Buffer::Initialize(bool mappedAtCreation) {
// Allocate at least 4 bytes so clamped accesses are always in bounds. // Allocate at least 4 bytes so clamped accesses are always in bounds.
uint64_t size = std::max(GetSize(), uint64_t(4u)); uint64_t size = std::max(GetSize(), uint64_t(4u));
size_t alignment = D3D11BufferSizeAlignment(GetUsage()); size_t alignment = D3D11BufferSizeAlignment(GetUsage());
if (size > std::numeric_limits<uint64_t>::max() - alignment) { // Check for overflow, bufferDescriptor.ByteWidth is a UINT.
if (size > std::numeric_limits<UINT>::max() - alignment) {
// Alignment would overlow. // Alignment would overlow.
return DAWN_OUT_OF_MEMORY_ERROR("Buffer allocation is too large"); return DAWN_OUT_OF_MEMORY_ERROR("Buffer allocation is too large");
} }
@ -177,10 +178,10 @@ MaybeError Buffer::Initialize(bool mappedAtCreation) {
bufferDescriptor.MiscFlags = D3D11BufferMiscFlags(GetUsage()); bufferDescriptor.MiscFlags = D3D11BufferMiscFlags(GetUsage());
bufferDescriptor.StructureByteStride = 0; bufferDescriptor.StructureByteStride = 0;
DAWN_TRY(CheckHRESULT(ToBackend(GetDevice()) DAWN_TRY(CheckOutOfMemoryHRESULT(ToBackend(GetDevice())
->GetD3D11Device() ->GetD3D11Device()
->CreateBuffer(&bufferDescriptor, nullptr, &mD3d11Buffer), ->CreateBuffer(&bufferDescriptor, nullptr, &mD3d11Buffer),
"ID3D11Device::CreateBuffer")); "ID3D11Device::CreateBuffer"));
SetLabelImpl(); SetLabelImpl();
return {}; return {};

View File

@ -85,9 +85,9 @@ MaybeError Texture::InitializeAsInternalTexture() {
textureDescriptor.CPUAccessFlags = 0; textureDescriptor.CPUAccessFlags = 0;
textureDescriptor.MiscFlags = 0; textureDescriptor.MiscFlags = 0;
ComPtr<ID3D11Texture1D> d3d11Texture1D; ComPtr<ID3D11Texture1D> d3d11Texture1D;
DAWN_TRY(CheckHRESULT(device->GetD3D11Device()->CreateTexture1D( DAWN_TRY(CheckOutOfMemoryHRESULT(device->GetD3D11Device()->CreateTexture1D(
&textureDescriptor, nullptr, &d3d11Texture1D), &textureDescriptor, nullptr, &d3d11Texture1D),
"D3D11 create texture1d")); "D3D11 create texture1d"));
mD3d11Resource = std::move(d3d11Texture1D); mD3d11Resource = std::move(d3d11Texture1D);
break; break;
} }
@ -109,9 +109,9 @@ MaybeError Texture::InitializeAsInternalTexture() {
textureDescriptor.MiscFlags |= D3D11_RESOURCE_MISC_TEXTURECUBE; textureDescriptor.MiscFlags |= D3D11_RESOURCE_MISC_TEXTURECUBE;
} }
ComPtr<ID3D11Texture2D> d3d11Texture2D; ComPtr<ID3D11Texture2D> d3d11Texture2D;
DAWN_TRY(CheckHRESULT(device->GetD3D11Device()->CreateTexture2D( DAWN_TRY(CheckOutOfMemoryHRESULT(device->GetD3D11Device()->CreateTexture2D(
&textureDescriptor, nullptr, &d3d11Texture2D), &textureDescriptor, nullptr, &d3d11Texture2D),
"D3D11 create texture2d")); "D3D11 create texture2d"));
mD3d11Resource = std::move(d3d11Texture2D); mD3d11Resource = std::move(d3d11Texture2D);
break; break;
} }
@ -127,9 +127,9 @@ MaybeError Texture::InitializeAsInternalTexture() {
textureDescriptor.CPUAccessFlags = 0; textureDescriptor.CPUAccessFlags = 0;
textureDescriptor.MiscFlags = 0; textureDescriptor.MiscFlags = 0;
ComPtr<ID3D11Texture3D> d3d11Texture3D; ComPtr<ID3D11Texture3D> d3d11Texture3D;
DAWN_TRY(CheckHRESULT(device->GetD3D11Device()->CreateTexture3D( DAWN_TRY(CheckOutOfMemoryHRESULT(device->GetD3D11Device()->CreateTexture3D(
&textureDescriptor, nullptr, &d3d11Texture3D), &textureDescriptor, nullptr, &d3d11Texture3D),
"D3D11 create texture3d")); "D3D11 create texture3d"));
mD3d11Resource = std::move(d3d11Texture3D); mD3d11Resource = std::move(d3d11Texture3D);
break; break;
} }