blob: fe54a1b022d3f8e9974bdf6539605f493763c99a [file] [log] [blame]
/*
* 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 GrD3DGpuDescriptorTableManager_DEFINED
#define GrD3DGpuDescriptorTableManager_DEFINED
#include "src/gpu/d3d/GrD3DDescriptorHeap.h"
class GrD3DCommandList;
class GrD3DDirectCommandList;
class GrD3DGpu;
class GrD3DDescriptorTable : public SkRefCnt {
public:
GrD3DDescriptorTable(D3D12_CPU_DESCRIPTOR_HANDLE baseCPU, D3D12_GPU_DESCRIPTOR_HANDLE baseGPU,
ID3D12DescriptorHeap* heap, D3D12_DESCRIPTOR_HEAP_TYPE type)
: fDescriptorTableCpuStart(baseCPU)
, fDescriptorTableGpuStart(baseGPU)
, fHeap(heap)
, fType(type) {}
const D3D12_CPU_DESCRIPTOR_HANDLE* baseCpuDescriptorPtr() {
return &fDescriptorTableCpuStart;
}
const D3D12_GPU_DESCRIPTOR_HANDLE baseGpuDescriptor() {
return fDescriptorTableGpuStart;
}
ID3D12DescriptorHeap* heap() const { return fHeap; }
D3D12_DESCRIPTOR_HEAP_TYPE type() const { return fType; }
private:
D3D12_CPU_DESCRIPTOR_HANDLE fDescriptorTableCpuStart;
D3D12_GPU_DESCRIPTOR_HANDLE fDescriptorTableGpuStart;
ID3D12DescriptorHeap* fHeap;
D3D12_DESCRIPTOR_HEAP_TYPE fType;
};
class GrD3DDescriptorTableManager {
public:
GrD3DDescriptorTableManager(GrD3DGpu*);
sk_sp<GrD3DDescriptorTable> createShaderViewTable(GrD3DGpu*, unsigned int count);
sk_sp<GrD3DDescriptorTable> createSamplerTable(GrD3DGpu*, unsigned int count);
void prepForSubmit(GrD3DGpu* gpu);
private:
class Heap : public GrRecycledResource {
public:
static sk_sp<Heap> Make(GrD3DGpu* gpu, D3D12_DESCRIPTOR_HEAP_TYPE type,
unsigned int numDescriptors);
sk_sp<GrD3DDescriptorTable> allocateTable(unsigned int count);
bool canAllocate(unsigned int count) const {
return (fDescriptorCount - fNextAvailable) >= count;
}
ID3D12DescriptorHeap* d3dDescriptorHeap() const { return fHeap->descriptorHeap(); }
D3D12_DESCRIPTOR_HEAP_TYPE type() const { return fType; }
unsigned int descriptorCount() { return fDescriptorCount; }
bool used() { return fNextAvailable > 0; }
void reset() {
fNextAvailable = 0;
}
private:
Heap(GrD3DGpu* gpu, std::unique_ptr<GrD3DDescriptorHeap>& heap,
D3D12_DESCRIPTOR_HEAP_TYPE type, unsigned int descriptorCount)
: INHERITED()
, fGpu(gpu)
, fHeap(std::move(heap))
, fType(type)
, fDescriptorCount(descriptorCount)
, fNextAvailable(0) {
}
void freeGPUData() const override {}
void onRecycle() const override;
#ifdef SK_TRACE_MANAGED_RESOURCES
void dumpInfo() const override {
SkDebugf("GrD3DDescriptorTable::Heap: %p (%d refs)\n", fHeap.get(), this->getRefCnt());
}
#endif
GrD3DGpu* fGpu;
std::unique_ptr<GrD3DDescriptorHeap> fHeap;
D3D12_DESCRIPTOR_HEAP_TYPE fType;
unsigned int fDescriptorCount;
unsigned int fNextAvailable;
using INHERITED = GrRecycledResource;
};
class HeapPool {
public:
HeapPool(GrD3DGpu*, D3D12_DESCRIPTOR_HEAP_TYPE);
sk_sp<GrD3DDescriptorTable> allocateTable(GrD3DGpu*, unsigned int count);
void recycle(sk_sp<Heap>);
sk_sp<Heap>& currentDescriptorHeap();
void prepForSubmit(GrD3DGpu* gpu);
private:
static constexpr int kInitialHeapDescriptorCount = 256;
std::vector<sk_sp<Heap>> fDescriptorHeaps;
D3D12_DESCRIPTOR_HEAP_TYPE fHeapType;
unsigned int fCurrentHeapDescriptorCount;
};
void recycle(Heap*);
HeapPool fShaderViewDescriptorPool;
HeapPool fSamplerDescriptorPool;
};
#endif