1*c8dee2aaSAndroid Build Coastguard Worker /* 2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2020 Google LLC 3*c8dee2aaSAndroid Build Coastguard Worker * 4*c8dee2aaSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license that can be 5*c8dee2aaSAndroid Build Coastguard Worker * found in the LICENSE file. 6*c8dee2aaSAndroid Build Coastguard Worker */ 7*c8dee2aaSAndroid Build Coastguard Worker 8*c8dee2aaSAndroid Build Coastguard Worker #ifndef GrD3DTexture_DEFINED 9*c8dee2aaSAndroid Build Coastguard Worker #define GrD3DTexture_DEFINED 10*c8dee2aaSAndroid Build Coastguard Worker 11*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/ganesh/SkImageGanesh.h" 12*c8dee2aaSAndroid Build Coastguard Worker #include "src/core/SkLRUCache.h" 13*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrSamplerState.h" 14*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrTexture.h" 15*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/d3d/GrD3DDescriptorHeap.h" 16*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/d3d/GrD3DTextureResource.h" 17*c8dee2aaSAndroid Build Coastguard Worker 18*c8dee2aaSAndroid Build Coastguard Worker class GrD3DTexture : public GrTexture, public virtual GrD3DTextureResource { 19*c8dee2aaSAndroid Build Coastguard Worker public: 20*c8dee2aaSAndroid Build Coastguard Worker static sk_sp<GrD3DTexture> MakeNewTexture(GrD3DGpu*, 21*c8dee2aaSAndroid Build Coastguard Worker skgpu::Budgeted, 22*c8dee2aaSAndroid Build Coastguard Worker SkISize dimensions, 23*c8dee2aaSAndroid Build Coastguard Worker const D3D12_RESOURCE_DESC&, 24*c8dee2aaSAndroid Build Coastguard Worker GrProtected, 25*c8dee2aaSAndroid Build Coastguard Worker GrMipmapStatus, 26*c8dee2aaSAndroid Build Coastguard Worker std::string_view label); 27*c8dee2aaSAndroid Build Coastguard Worker 28*c8dee2aaSAndroid Build Coastguard Worker static sk_sp<GrD3DTexture> MakeWrappedTexture(GrD3DGpu*, 29*c8dee2aaSAndroid Build Coastguard Worker SkISize dimensions, 30*c8dee2aaSAndroid Build Coastguard Worker GrWrapCacheable, 31*c8dee2aaSAndroid Build Coastguard Worker GrIOType, 32*c8dee2aaSAndroid Build Coastguard Worker const GrD3DTextureResourceInfo&, 33*c8dee2aaSAndroid Build Coastguard Worker sk_sp<GrD3DResourceState>); 34*c8dee2aaSAndroid Build Coastguard Worker 35*c8dee2aaSAndroid Build Coastguard Worker static sk_sp<GrD3DTexture> MakeAliasingTexture(GrD3DGpu*, 36*c8dee2aaSAndroid Build Coastguard Worker sk_sp<GrD3DTexture>, 37*c8dee2aaSAndroid Build Coastguard Worker const D3D12_RESOURCE_DESC& newDesc, 38*c8dee2aaSAndroid Build Coastguard Worker D3D12_RESOURCE_STATES); 39*c8dee2aaSAndroid Build Coastguard Worker ~GrD3DTexture()40*c8dee2aaSAndroid Build Coastguard Worker ~GrD3DTexture() override {} 41*c8dee2aaSAndroid Build Coastguard Worker 42*c8dee2aaSAndroid Build Coastguard Worker GrBackendTexture getBackendTexture() const override; 43*c8dee2aaSAndroid Build Coastguard Worker backendFormat()44*c8dee2aaSAndroid Build Coastguard Worker GrBackendFormat backendFormat() const override { return this->getBackendFormat(); } shaderResourceView()45*c8dee2aaSAndroid Build Coastguard Worker D3D12_CPU_DESCRIPTOR_HANDLE shaderResourceView() { return fShaderResourceView.fHandle; } 46*c8dee2aaSAndroid Build Coastguard Worker textureParamsModified()47*c8dee2aaSAndroid Build Coastguard Worker void textureParamsModified() override {} 48*c8dee2aaSAndroid Build Coastguard Worker 49*c8dee2aaSAndroid Build Coastguard Worker protected: 50*c8dee2aaSAndroid Build Coastguard Worker GrD3DTexture(GrD3DGpu*, 51*c8dee2aaSAndroid Build Coastguard Worker SkISize dimensions, 52*c8dee2aaSAndroid Build Coastguard Worker const GrD3DTextureResourceInfo&, 53*c8dee2aaSAndroid Build Coastguard Worker sk_sp<GrD3DResourceState>, 54*c8dee2aaSAndroid Build Coastguard Worker const GrD3DDescriptorHeap::CPUHandle& shaderResourceView, 55*c8dee2aaSAndroid Build Coastguard Worker GrMipmapStatus, 56*c8dee2aaSAndroid Build Coastguard Worker std::string_view label); 57*c8dee2aaSAndroid Build Coastguard Worker 58*c8dee2aaSAndroid Build Coastguard Worker GrD3DGpu* getD3DGpu() const; 59*c8dee2aaSAndroid Build Coastguard Worker 60*c8dee2aaSAndroid Build Coastguard Worker void onAbandon() override; 61*c8dee2aaSAndroid Build Coastguard Worker void onRelease() override; 62*c8dee2aaSAndroid Build Coastguard Worker onStealBackendTexture(GrBackendTexture *,SkImages::BackendTextureReleaseProc *)63*c8dee2aaSAndroid Build Coastguard Worker bool onStealBackendTexture(GrBackendTexture*, SkImages::BackendTextureReleaseProc*) override { 64*c8dee2aaSAndroid Build Coastguard Worker return false; 65*c8dee2aaSAndroid Build Coastguard Worker } 66*c8dee2aaSAndroid Build Coastguard Worker 67*c8dee2aaSAndroid Build Coastguard Worker void onSetLabel() override; 68*c8dee2aaSAndroid Build Coastguard Worker 69*c8dee2aaSAndroid Build Coastguard Worker private: 70*c8dee2aaSAndroid Build Coastguard Worker GrD3DTexture(GrD3DGpu*, 71*c8dee2aaSAndroid Build Coastguard Worker skgpu::Budgeted, 72*c8dee2aaSAndroid Build Coastguard Worker SkISize dimensions, 73*c8dee2aaSAndroid Build Coastguard Worker const GrD3DTextureResourceInfo&, 74*c8dee2aaSAndroid Build Coastguard Worker sk_sp<GrD3DResourceState>, 75*c8dee2aaSAndroid Build Coastguard Worker const GrD3DDescriptorHeap::CPUHandle& shaderResourceView, 76*c8dee2aaSAndroid Build Coastguard Worker GrMipmapStatus, 77*c8dee2aaSAndroid Build Coastguard Worker std::string_view label); 78*c8dee2aaSAndroid Build Coastguard Worker GrD3DTexture(GrD3DGpu*, SkISize dimensions, const GrD3DTextureResourceInfo&, 79*c8dee2aaSAndroid Build Coastguard Worker sk_sp<GrD3DResourceState>, 80*c8dee2aaSAndroid Build Coastguard Worker const GrD3DDescriptorHeap::CPUHandle& shaderResourceView, 81*c8dee2aaSAndroid Build Coastguard Worker GrMipmapStatus, 82*c8dee2aaSAndroid Build Coastguard Worker GrWrapCacheable, 83*c8dee2aaSAndroid Build Coastguard Worker GrIOType, 84*c8dee2aaSAndroid Build Coastguard Worker std::string_view label); 85*c8dee2aaSAndroid Build Coastguard Worker 86*c8dee2aaSAndroid Build Coastguard Worker // In D3D we call the release proc after we are finished with the underlying 87*c8dee2aaSAndroid Build Coastguard Worker // GrSurfaceResource::Resource object (which occurs after the GPU has finished all work on it). onSetRelease(sk_sp<RefCntedReleaseProc> releaseHelper)88*c8dee2aaSAndroid Build Coastguard Worker void onSetRelease(sk_sp<RefCntedReleaseProc> releaseHelper) override { 89*c8dee2aaSAndroid Build Coastguard Worker // Forward the release proc on to GrSurfaceResource 90*c8dee2aaSAndroid Build Coastguard Worker this->setResourceRelease(std::move(releaseHelper)); 91*c8dee2aaSAndroid Build Coastguard Worker } 92*c8dee2aaSAndroid Build Coastguard Worker 93*c8dee2aaSAndroid Build Coastguard Worker struct SamplerHash { operatorSamplerHash94*c8dee2aaSAndroid Build Coastguard Worker uint32_t operator()(GrSamplerState state) const { 95*c8dee2aaSAndroid Build Coastguard Worker // In D3D anisotropic filtering uses the same field (D3D12_SAMPLER_DESC::Filter) as 96*c8dee2aaSAndroid Build Coastguard Worker // min/mag/mip settings and so is not orthogonal to them. 97*c8dee2aaSAndroid Build Coastguard Worker return state.asKey(/*anisoIsOrthogonal=*/false); 98*c8dee2aaSAndroid Build Coastguard Worker } 99*c8dee2aaSAndroid Build Coastguard Worker }; 100*c8dee2aaSAndroid Build Coastguard Worker 101*c8dee2aaSAndroid Build Coastguard Worker GrD3DDescriptorHeap::CPUHandle fShaderResourceView; 102*c8dee2aaSAndroid Build Coastguard Worker 103*c8dee2aaSAndroid Build Coastguard Worker using INHERITED = GrTexture; 104*c8dee2aaSAndroid Build Coastguard Worker }; 105*c8dee2aaSAndroid Build Coastguard Worker 106*c8dee2aaSAndroid Build Coastguard Worker #endif 107