1 /*
2  * Copyright 2020 Google LLC
3  *
4  * Use of this source code is governed by a BSD-style license that can be
5  * found in the LICENSE file.
6  */
7 
8 #ifndef GrD3DAMDMemoryAllocator_DEFINED
9 #define GrD3DAMDMemoryAllocator_DEFINED
10 
11 #include "include/core/SkRefCnt.h"
12 #include "include/gpu/d3d/GrD3DTypes.h"
13 
14 #if defined(__clang__)
15 #pragma clang diagnostic push
16 #pragma clang diagnostic ignored "-Wdeprecated-dynamic-exception-spec"
17 #endif
18 #include "D3D12MemAlloc.h"
19 #if defined(__clang__)
20 #pragma clang diagnostic pop
21 #endif
22 
23 class GrD3DAMDMemoryAllocator : public GrD3DMemoryAllocator {
24 public:
25     static sk_sp<GrD3DMemoryAllocator> Make(IDXGIAdapter* adapter, ID3D12Device* device);
26 
~GrD3DAMDMemoryAllocator()27     ~GrD3DAMDMemoryAllocator() override { fAllocator->Release(); }
28 
29     gr_cp<ID3D12Resource> createResource(D3D12_HEAP_TYPE, const D3D12_RESOURCE_DESC*,
30                                          D3D12_RESOURCE_STATES initialResourceState,
31                                          sk_sp<GrD3DAlloc>* allocation,
32                                          const D3D12_CLEAR_VALUE*) override;
33 
34     gr_cp<ID3D12Resource> createAliasingResource(sk_sp<GrD3DAlloc>& allocation,
35                                                  uint64_t localOffset,
36                                                  const D3D12_RESOURCE_DESC*,
37                                                  D3D12_RESOURCE_STATES initialResourceState,
38                                                  const D3D12_CLEAR_VALUE*) override;
39 
40     class Alloc : public GrD3DAlloc {
41     public:
Alloc(D3D12MA::Allocation * allocation)42         Alloc(D3D12MA::Allocation* allocation) : fAllocation(allocation) {}
~Alloc()43         ~Alloc() override {
44             fAllocation->Release();
45         }
46     private:
47         friend class GrD3DAMDMemoryAllocator;
48         D3D12MA::Allocation* fAllocation;
49     };
50 
51 private:
GrD3DAMDMemoryAllocator(D3D12MA::Allocator * allocator)52     GrD3DAMDMemoryAllocator(D3D12MA::Allocator* allocator) : fAllocator(allocator) {}
53 
54     D3D12MA::Allocator* fAllocator;
55 };
56 
57 #endif
58