/* * Copyright 2020 Google LLC * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #ifndef GrD3DTextureResource_DEFINED #define GrD3DTextureResource_DEFINED #include "include/core/SkTypes.h" #include "include/gpu/ganesh/GrBackendSurface.h" #include "include/gpu/ganesh/d3d/GrD3DTypes.h" #include "include/private/gpu/ganesh/GrTypesPriv.h" #include "src/gpu/ganesh/GrManagedResource.h" #include "src/gpu/ganesh/d3d/GrD3DResourceState.h" class GrD3DGpu; class GrD3DTextureResource : SkNoncopyable { private: class Resource; public: GrD3DTextureResource(const GrD3DTextureResourceInfo& info, sk_sp state) : fInfo(info) , fState(std::move(state)) , fResource(new Resource(fInfo.fResource, info.fAlloc)) { // gr_cp will implicitly ref the ID3D12Resource for us, so we don't need to worry about // whether it's borrowed or not } virtual ~GrD3DTextureResource(); ID3D12Resource* d3dResource() const { SkASSERT(fResource); return fInfo.fResource.get(); } DXGI_FORMAT dxgiFormat() const { return fInfo.fFormat; } GrBackendFormat getBackendFormat() const { return GrBackendFormat::MakeDxgi(this->dxgiFormat()); } sk_sp resource() const { SkASSERT(fResource); return fResource; } uint32_t mipLevels() const { return fInfo.fLevelCount; } sk_sp grD3DResourceState() const { return fState; } D3D12_RESOURCE_STATES currentState() const { return fState->getResourceState(); } void setResourceState(const GrD3DGpu* gpu, D3D12_RESOURCE_STATES newResourceState, unsigned int subresource = D3D12_RESOURCE_BARRIER_ALL_SUBRESOURCES); // Changes the layout to present void prepareForPresent(GrD3DGpu* gpu); unsigned int sampleQualityPattern() const { return fInfo.fSampleQualityPattern; } // This simply updates our tracking of the resourceState and does not actually do any gpu work. // Externally, primarily used for implicit changes in resourceState due to certain GPU commands. void updateResourceState(D3D12_RESOURCE_STATES newState) { SkASSERT(fResource); fState->setResourceState(newState); } static bool InitTextureResourceInfo(GrD3DGpu* gpu, const D3D12_RESOURCE_DESC& desc, D3D12_RESOURCE_STATES initialState, GrProtected, D3D12_CLEAR_VALUE*, GrD3DTextureResourceInfo*); static std::pair> CreateMSAA( GrD3DGpu* gpu, SkISize dimensions, int sampleCnt, const GrD3DTextureResourceInfo& info, SkColor4f clearColor); void setResourceRelease(sk_sp releaseHelper); protected: void releaseResource(GrD3DGpu* gpu); GrD3DTextureResourceInfo fInfo; sk_sp fState; private: class Resource : public GrTextureResource { public: explicit Resource() : fResource(nullptr) , fAlloc(nullptr) { } Resource(const gr_cp& textureResource, const sk_sp& alloc) : fResource(textureResource) , fAlloc(alloc) { } ~Resource() override {} #ifdef SK_TRACE_MANAGED_RESOURCES void dumpInfo() const override { SkDebugf("GrD3DTextureResource: %p (%d refs)\n", fResource.get(), this->getRefCnt()); } #endif private: void freeGPUData() const override; mutable gr_cp fResource; mutable sk_sp fAlloc; using INHERITED = GrTextureResource; }; sk_sp fResource; friend class GrD3DRenderTarget; }; #endif