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 GrD3DTexture_DEFINED 9 #define GrD3DTexture_DEFINED 10 11 #include "src/core/SkLRUCache.h" 12 #include "src/gpu/GrSamplerState.h" 13 #include "src/gpu/GrTexture.h" 14 #include "src/gpu/d3d/GrD3DDescriptorHeap.h" 15 #include "src/gpu/d3d/GrD3DTextureResource.h" 16 17 class GrD3DTexture : public GrTexture, public virtual GrD3DTextureResource { 18 public: 19 static sk_sp<GrD3DTexture> MakeNewTexture(GrD3DGpu*, 20 SkBudgeted, 21 SkISize dimensions, 22 const D3D12_RESOURCE_DESC&, 23 GrProtected, 24 GrMipmapStatus); 25 26 static sk_sp<GrD3DTexture> MakeWrappedTexture(GrD3DGpu*, 27 SkISize dimensions, 28 GrWrapCacheable, 29 GrIOType, 30 const GrD3DTextureResourceInfo&, 31 sk_sp<GrD3DResourceState>); 32 33 static sk_sp<GrD3DTexture> MakeAliasingTexture(GrD3DGpu*, 34 sk_sp<GrD3DTexture>, 35 DXGI_FORMAT); 36 ~GrD3DTexture()37 ~GrD3DTexture() override {} 38 39 GrBackendTexture getBackendTexture() const override; 40 backendFormat()41 GrBackendFormat backendFormat() const override { return this->getBackendFormat(); } shaderResourceView()42 D3D12_CPU_DESCRIPTOR_HANDLE shaderResourceView() { return fShaderResourceView.fHandle; } 43 textureParamsModified()44 void textureParamsModified() override {} 45 46 protected: 47 GrD3DTexture(GrD3DGpu*, 48 SkISize dimensions, 49 const GrD3DTextureResourceInfo&, 50 sk_sp<GrD3DResourceState>, 51 const GrD3DDescriptorHeap::CPUHandle& shaderResourceView, 52 GrMipmapStatus); 53 54 GrD3DGpu* getD3DGpu() const; 55 56 void onAbandon() override; 57 void onRelease() override; 58 onStealBackendTexture(GrBackendTexture *,SkImage::BackendTextureReleaseProc *)59 bool onStealBackendTexture(GrBackendTexture*, SkImage::BackendTextureReleaseProc*) override { 60 return false; 61 } 62 63 private: 64 GrD3DTexture(GrD3DGpu*, SkBudgeted, SkISize dimensions, const GrD3DTextureResourceInfo&, 65 sk_sp<GrD3DResourceState>, 66 const GrD3DDescriptorHeap::CPUHandle& shaderResourceView, 67 GrMipmapStatus); 68 GrD3DTexture(GrD3DGpu*, SkISize dimensions, const GrD3DTextureResourceInfo&, 69 sk_sp<GrD3DResourceState>, 70 const GrD3DDescriptorHeap::CPUHandle& shaderResourceView, 71 GrMipmapStatus, GrWrapCacheable, GrIOType); 72 73 // In D3D we call the release proc after we are finished with the underlying 74 // GrSurfaceResource::Resource object (which occurs after the GPU has finished all work on it). onSetRelease(sk_sp<GrRefCntedCallback> releaseHelper)75 void onSetRelease(sk_sp<GrRefCntedCallback> releaseHelper) override { 76 // Forward the release proc on to GrSurfaceResource 77 this->setResourceRelease(std::move(releaseHelper)); 78 } 79 80 struct SamplerHash { operatorSamplerHash81 uint32_t operator()(GrSamplerState state) const { return state.asIndex(); } 82 }; 83 84 GrD3DDescriptorHeap::CPUHandle fShaderResourceView; 85 86 using INHERITED = GrTexture; 87 }; 88 89 #endif 90