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