mirror of
https://github.com/encounter/dawn-cmake.git
synced 2025-07-04 12:16:10 +00:00
D3D12: Use CheckHRESULT for allocator errors.
BUG=dawn:27 Change-Id: If28d1cbafcbdac29bafac0fb0e846208634ece33 Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/12521 Reviewed-by: Austin Eng <enga@chromium.org> Reviewed-by: Corentin Wallez <cwallez@chromium.org> Commit-Queue: Corentin Wallez <cwallez@chromium.org>
This commit is contained in:
parent
f6281a5530
commit
9cf62efda9
@ -26,4 +26,11 @@ namespace dawn_native { namespace d3d12 {
|
||||
return DAWN_DEVICE_LOST_ERROR(message);
|
||||
}
|
||||
|
||||
MaybeError CheckOutOfMemoryHRESULT(HRESULT result, const char* context) {
|
||||
if (result == E_OUTOFMEMORY) {
|
||||
return DAWN_OUT_OF_MEMORY_ERROR(context);
|
||||
}
|
||||
return CheckHRESULT(result, context);
|
||||
}
|
||||
|
||||
}} // namespace dawn_native::d3d12
|
@ -23,6 +23,9 @@ namespace dawn_native { namespace d3d12 {
|
||||
// Returns a success only if result of HResult is success
|
||||
MaybeError CheckHRESULT(HRESULT result, const char* context);
|
||||
|
||||
// Uses CheckRESULT but returns OOM specific error when recoverable.
|
||||
MaybeError CheckOutOfMemoryHRESULT(HRESULT result, const char* context);
|
||||
|
||||
}} // namespace dawn_native::d3d12
|
||||
|
||||
#endif // DAWNNATIVE_D3D12_D3D12ERROR_H_
|
@ -15,6 +15,7 @@
|
||||
#include "dawn_native/d3d12/DescriptorHeapAllocator.h"
|
||||
|
||||
#include "common/Assert.h"
|
||||
#include "dawn_native/d3d12/D3D12Error.h"
|
||||
#include "dawn_native/d3d12/DeviceD3D12.h"
|
||||
|
||||
namespace dawn_native { namespace d3d12 {
|
||||
@ -83,10 +84,9 @@ namespace dawn_native { namespace d3d12 {
|
||||
heapDescriptor.Flags = flags;
|
||||
heapDescriptor.NodeMask = 0;
|
||||
ComPtr<ID3D12DescriptorHeap> heap;
|
||||
if (FAILED(mDevice->GetD3D12Device()->CreateDescriptorHeap(&heapDescriptor,
|
||||
IID_PPV_ARGS(&heap)))) {
|
||||
return DAWN_OUT_OF_MEMORY_ERROR("Unable to allocate heap");
|
||||
}
|
||||
DAWN_TRY(CheckHRESULT(
|
||||
mDevice->GetD3D12Device()->CreateDescriptorHeap(&heapDescriptor, IID_PPV_ARGS(&heap)),
|
||||
"ID3D12Device::CreateDescriptorHeap"));
|
||||
|
||||
mDevice->ReferenceUntilUnused(heap);
|
||||
|
||||
|
@ -13,6 +13,7 @@
|
||||
// limitations under the License.
|
||||
|
||||
#include "dawn_native/d3d12/HeapAllocatorD3D12.h"
|
||||
#include "dawn_native/d3d12/D3D12Error.h"
|
||||
#include "dawn_native/d3d12/DeviceD3D12.h"
|
||||
#include "dawn_native/d3d12/HeapD3D12.h"
|
||||
|
||||
@ -41,9 +42,9 @@ namespace dawn_native { namespace d3d12 {
|
||||
heapDesc.Flags = mHeapFlags;
|
||||
|
||||
ComPtr<ID3D12Heap> heap;
|
||||
if (FAILED(mDevice->GetD3D12Device()->CreateHeap(&heapDesc, IID_PPV_ARGS(&heap)))) {
|
||||
return DAWN_OUT_OF_MEMORY_ERROR("Unable to allocate heap");
|
||||
}
|
||||
DAWN_TRY(CheckOutOfMemoryHRESULT(
|
||||
mDevice->GetD3D12Device()->CreateHeap(&heapDesc, IID_PPV_ARGS(&heap)),
|
||||
"ID3D12Device::CreateHeap"));
|
||||
|
||||
return {std::make_unique<Heap>(std::move(heap))};
|
||||
}
|
||||
|
@ -14,6 +14,7 @@
|
||||
|
||||
#include "dawn_native/d3d12/ResourceAllocatorManagerD3D12.h"
|
||||
|
||||
#include "dawn_native/d3d12/D3D12Error.h"
|
||||
#include "dawn_native/d3d12/DeviceD3D12.h"
|
||||
#include "dawn_native/d3d12/HeapAllocatorD3D12.h"
|
||||
#include "dawn_native/d3d12/HeapD3D12.h"
|
||||
@ -188,13 +189,10 @@ namespace dawn_native { namespace d3d12 {
|
||||
// barrier).
|
||||
// https://docs.microsoft.com/en-us/windows/win32/api/d3d12/nf-d3d12-id3d12device-createplacedresource
|
||||
ComPtr<ID3D12Resource> placedResource;
|
||||
if (FAILED(mDevice->GetD3D12Device()->CreatePlacedResource(
|
||||
heap, allocation.GetOffset(), &resourceDescriptor, initialUsage, nullptr,
|
||||
IID_PPV_ARGS(&placedResource)))) {
|
||||
// Note: Heap must already exist before the resource is created. If CreatePlacedResource
|
||||
// fails, it's unlikely to be OOM.
|
||||
return DAWN_DEVICE_LOST_ERROR("Unable to allocate resource");
|
||||
}
|
||||
DAWN_TRY(CheckOutOfMemoryHRESULT(mDevice->GetD3D12Device()->CreatePlacedResource(
|
||||
heap, allocation.GetOffset(), &resourceDescriptor,
|
||||
initialUsage, nullptr, IID_PPV_ARGS(&placedResource)),
|
||||
"ID3D12Device::CreatePlacedResource"));
|
||||
|
||||
return ResourceHeapAllocation{allocation.GetInfo(), allocation.GetOffset(),
|
||||
std::move(placedResource)};
|
||||
@ -214,11 +212,11 @@ namespace dawn_native { namespace d3d12 {
|
||||
// Note: Heap flags are inferred by the resource descriptor and do not need to be explicitly
|
||||
// provided to CreateCommittedResource.
|
||||
ComPtr<ID3D12Resource> committedResource;
|
||||
if (FAILED(mDevice->GetD3D12Device()->CreateCommittedResource(
|
||||
&heapProperties, D3D12_HEAP_FLAG_NONE, &resourceDescriptor, initialUsage, nullptr,
|
||||
IID_PPV_ARGS(&committedResource)))) {
|
||||
return DAWN_OUT_OF_MEMORY_ERROR("Unable to allocate resource");
|
||||
}
|
||||
DAWN_TRY(
|
||||
CheckOutOfMemoryHRESULT(mDevice->GetD3D12Device()->CreateCommittedResource(
|
||||
&heapProperties, D3D12_HEAP_FLAG_NONE, &resourceDescriptor,
|
||||
initialUsage, nullptr, IID_PPV_ARGS(&committedResource)),
|
||||
"ID3D12Device::CreateCommittedResource"));
|
||||
|
||||
AllocationInfo info;
|
||||
info.mMethod = AllocationMethod::kDirect;
|
||||
|
@ -13,6 +13,7 @@
|
||||
// limitations under the License.
|
||||
|
||||
#include "dawn_native/d3d12/StagingBufferD3D12.h"
|
||||
#include "dawn_native/d3d12/D3D12Error.h"
|
||||
#include "dawn_native/d3d12/DeviceD3D12.h"
|
||||
|
||||
namespace dawn_native { namespace d3d12 {
|
||||
@ -39,11 +40,7 @@ namespace dawn_native { namespace d3d12 {
|
||||
mDevice->AllocateMemory(D3D12_HEAP_TYPE_UPLOAD, resourceDescriptor,
|
||||
D3D12_RESOURCE_STATE_GENERIC_READ));
|
||||
|
||||
if (FAILED(GetResource()->Map(0, nullptr, &mMappedPointer))) {
|
||||
return DAWN_DEVICE_LOST_ERROR("Unable to map staging buffer.");
|
||||
}
|
||||
|
||||
return {};
|
||||
return CheckHRESULT(GetResource()->Map(0, nullptr, &mMappedPointer), "ID3D12Resource::Map");
|
||||
}
|
||||
|
||||
StagingBuffer::~StagingBuffer() {
|
||||
|
Loading…
x
Reference in New Issue
Block a user