Jim Van Verth | 8b932b1 | 2020-03-24 14:58:03 -0400 | [diff] [blame] | 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 | |
Jim Van Verth | 6ec5688 | 2020-03-26 11:47:26 -0400 | [diff] [blame] | 8 | #ifndef GrD3DTextureResource_DEFINED |
| 9 | #define GrD3DTextureResource_DEFINED |
Jim Van Verth | 8b932b1 | 2020-03-24 14:58:03 -0400 | [diff] [blame] | 10 | |
| 11 | #include "include/core/SkTypes.h" |
| 12 | #include "include/gpu/GrBackendSurface.h" |
Jim Van Verth | 9aa9a68 | 2020-04-01 10:13:48 -0400 | [diff] [blame] | 13 | #include "include/gpu/d3d/GrD3DTypes.h" |
Jim Van Verth | 8b932b1 | 2020-03-24 14:58:03 -0400 | [diff] [blame] | 14 | #include "include/private/GrTypesPriv.h" |
| 15 | #include "src/gpu/GrManagedResource.h" |
Jim Van Verth | 8b932b1 | 2020-03-24 14:58:03 -0400 | [diff] [blame] | 16 | #include "src/gpu/d3d/GrD3DResourceState.h" |
| 17 | |
| 18 | class GrD3DGpu; |
| 19 | |
Jim Van Verth | 6ec5688 | 2020-03-26 11:47:26 -0400 | [diff] [blame] | 20 | class GrD3DTextureResource : SkNoncopyable { |
Jim Van Verth | 8b932b1 | 2020-03-24 14:58:03 -0400 | [diff] [blame] | 21 | private: |
| 22 | class Resource; |
| 23 | |
| 24 | public: |
Greg Daniel | c9624d5 | 2020-04-13 15:36:31 -0400 | [diff] [blame] | 25 | static const unsigned int kDefaultQualityLevel = 0; |
| 26 | |
Jim Van Verth | aa90dad | 2020-03-30 15:00:39 -0400 | [diff] [blame] | 27 | GrD3DTextureResource(const GrD3DTextureResourceInfo& info, sk_sp<GrD3DResourceState> state) |
Jim Van Verth | 8b932b1 | 2020-03-24 14:58:03 -0400 | [diff] [blame] | 28 | : fInfo(info) |
| 29 | , fState(std::move(state)) |
Jim Van Verth | 6ec5688 | 2020-03-26 11:47:26 -0400 | [diff] [blame] | 30 | , fResource(new Resource(fInfo.fResource)) { |
Jim Van Verth | aa90dad | 2020-03-30 15:00:39 -0400 | [diff] [blame] | 31 | // gr_cp will implicitly ref the ID3D12Resource for us, so we don't need to worry about |
| 32 | // whether it's borrowed or not |
Jim Van Verth | 8b932b1 | 2020-03-24 14:58:03 -0400 | [diff] [blame] | 33 | } |
Jim Van Verth | 6ec5688 | 2020-03-26 11:47:26 -0400 | [diff] [blame] | 34 | virtual ~GrD3DTextureResource(); |
Jim Van Verth | 8b932b1 | 2020-03-24 14:58:03 -0400 | [diff] [blame] | 35 | |
Jim Van Verth | aa90dad | 2020-03-30 15:00:39 -0400 | [diff] [blame] | 36 | ID3D12Resource* d3dResource() const { |
Jim Van Verth | 8b932b1 | 2020-03-24 14:58:03 -0400 | [diff] [blame] | 37 | SkASSERT(fResource); |
Jim Van Verth | 9aa9a68 | 2020-04-01 10:13:48 -0400 | [diff] [blame] | 38 | return fInfo.fResource.get(); |
Jim Van Verth | 8b932b1 | 2020-03-24 14:58:03 -0400 | [diff] [blame] | 39 | } |
| 40 | DXGI_FORMAT dxgiFormat() const { return fInfo.fFormat; } |
| 41 | GrBackendFormat getBackendFormat() const { |
| 42 | return GrBackendFormat::MakeDxgi(this->dxgiFormat()); |
| 43 | } |
Greg Daniel | a5a6b32 | 2020-04-23 12:52:27 -0400 | [diff] [blame] | 44 | sk_sp<Resource> resource() const { |
Jim Van Verth | aa90dad | 2020-03-30 15:00:39 -0400 | [diff] [blame] | 45 | SkASSERT(fResource); |
Greg Daniel | a5a6b32 | 2020-04-23 12:52:27 -0400 | [diff] [blame] | 46 | return fResource; |
Jim Van Verth | aa90dad | 2020-03-30 15:00:39 -0400 | [diff] [blame] | 47 | } |
Jim Van Verth | 8b932b1 | 2020-03-24 14:58:03 -0400 | [diff] [blame] | 48 | uint32_t mipLevels() const { return fInfo.fLevelCount; } |
Jim Van Verth | 8b932b1 | 2020-03-24 14:58:03 -0400 | [diff] [blame] | 49 | |
| 50 | sk_sp<GrD3DResourceState> grD3DResourceState() const { return fState; } |
| 51 | |
| 52 | D3D12_RESOURCE_STATES currentState() const { |
| 53 | return fState->getResourceState(); |
| 54 | } |
| 55 | |
| 56 | void setResourceState(const GrD3DGpu* gpu, D3D12_RESOURCE_STATES newResourceState); |
| 57 | |
Greg Daniel | c9624d5 | 2020-04-13 15:36:31 -0400 | [diff] [blame] | 58 | unsigned int sampleQualityLevel() const { return fInfo.fSampleQualityLevel; } |
| 59 | |
Jim Van Verth | 8b932b1 | 2020-03-24 14:58:03 -0400 | [diff] [blame] | 60 | // This simply updates our tracking of the resourceState and does not actually do any gpu work. |
| 61 | // Externally, primarily used for implicit changes in resourceState due to certain GPU commands. |
Jim Van Verth | c632aa6 | 2020-04-17 16:58:20 -0400 | [diff] [blame] | 62 | void updateResourceState(D3D12_RESOURCE_STATES newState) { |
Jim Van Verth | 8b932b1 | 2020-03-24 14:58:03 -0400 | [diff] [blame] | 63 | SkASSERT(fResource); |
| 64 | fState->setResourceState(newState); |
Jim Van Verth | 8b932b1 | 2020-03-24 14:58:03 -0400 | [diff] [blame] | 65 | } |
| 66 | |
Jim Van Verth | 2b9f53e | 2020-04-14 11:47:34 -0400 | [diff] [blame] | 67 | static bool InitTextureResourceInfo(GrD3DGpu* gpu, const D3D12_RESOURCE_DESC& desc, |
| 68 | D3D12_RESOURCE_STATES initialState, GrProtected, |
Jim Van Verth | 280d4f7 | 2020-05-04 10:04:24 -0400 | [diff] [blame] | 69 | D3D12_CLEAR_VALUE*, GrD3DTextureResourceInfo*); |
Jim Van Verth | 8b932b1 | 2020-03-24 14:58:03 -0400 | [diff] [blame] | 70 | |
| 71 | void setResourceRelease(sk_sp<GrRefCntedCallback> releaseHelper); |
| 72 | |
| 73 | protected: |
Jim Van Verth | fd89e0b | 2020-03-26 15:33:02 -0400 | [diff] [blame] | 74 | void releaseResource(GrD3DGpu* gpu); |
Jim Van Verth | 8b932b1 | 2020-03-24 14:58:03 -0400 | [diff] [blame] | 75 | |
Greg Daniel | a5a6b32 | 2020-04-23 12:52:27 -0400 | [diff] [blame] | 76 | void addResourceIdleProc(GrTexture* owningTexture, sk_sp<GrRefCntedCallback> idleProc) { |
| 77 | if (fResource) { |
| 78 | fResource->addIdleProc(owningTexture, std::move(idleProc)); |
| 79 | } |
| 80 | } |
| 81 | void resetResourceIdleProcs() { |
| 82 | SkASSERT(fResource); |
| 83 | fResource->resetIdleProcs(); |
| 84 | } |
| 85 | bool resourceIsQueuedForWorkOnGpu() const { |
| 86 | SkASSERT(fResource); |
| 87 | return fResource->isQueuedForWorkOnGpu(); |
| 88 | } |
| 89 | int resourceIdleProcCnt() const { |
| 90 | SkASSERT(fResource); |
| 91 | return fResource->idleProcCnt(); |
| 92 | } |
| 93 | sk_sp<GrRefCntedCallback> resourceIdleProc(int i) const { |
| 94 | SkASSERT(fResource); |
| 95 | return fResource->idleProc(i); |
| 96 | } |
| 97 | |
Jim Van Verth | 6ec5688 | 2020-03-26 11:47:26 -0400 | [diff] [blame] | 98 | GrD3DTextureResourceInfo fInfo; |
Jim Van Verth | 8b932b1 | 2020-03-24 14:58:03 -0400 | [diff] [blame] | 99 | sk_sp<GrD3DResourceState> fState; |
Jim Van Verth | 8b932b1 | 2020-03-24 14:58:03 -0400 | [diff] [blame] | 100 | |
| 101 | private: |
| 102 | class Resource : public GrTextureResource { |
| 103 | public: |
| 104 | explicit Resource() |
| 105 | : fResource(nullptr) { |
| 106 | } |
| 107 | |
Jim Van Verth | 9aa9a68 | 2020-04-01 10:13:48 -0400 | [diff] [blame] | 108 | Resource(const gr_cp<ID3D12Resource>& textureResource) |
Jim Van Verth | 8b932b1 | 2020-03-24 14:58:03 -0400 | [diff] [blame] | 109 | : fResource(textureResource) { |
Jim Van Verth | 8b932b1 | 2020-03-24 14:58:03 -0400 | [diff] [blame] | 110 | } |
| 111 | |
| 112 | ~Resource() override {} |
| 113 | |
| 114 | #ifdef SK_TRACE_MANAGED_RESOURCES |
| 115 | void dumpInfo() const override { |
Jim Van Verth | 9aa9a68 | 2020-04-01 10:13:48 -0400 | [diff] [blame] | 116 | SkDebugf("GrD3DTextureResource: %d (%d refs)\n", fResource.get(), this->getRefCnt()); |
Jim Van Verth | 8b932b1 | 2020-03-24 14:58:03 -0400 | [diff] [blame] | 117 | } |
| 118 | #endif |
| 119 | |
| 120 | private: |
| 121 | void freeGPUData() const override; |
| 122 | |
Jim Van Verth | aa90dad | 2020-03-30 15:00:39 -0400 | [diff] [blame] | 123 | mutable gr_cp<ID3D12Resource> fResource; |
Jim Van Verth | 8b932b1 | 2020-03-24 14:58:03 -0400 | [diff] [blame] | 124 | |
| 125 | typedef GrTextureResource INHERITED; |
| 126 | }; |
| 127 | |
| 128 | sk_sp<Resource> fResource; |
Jim Van Verth | fd89e0b | 2020-03-26 15:33:02 -0400 | [diff] [blame] | 129 | |
| 130 | friend class GrD3DRenderTarget; |
Jim Van Verth | 8b932b1 | 2020-03-24 14:58:03 -0400 | [diff] [blame] | 131 | }; |
| 132 | |
| 133 | #endif |