@@ -15,57 +15,58 @@ GrD3DCpuDescriptorManager::GrD3DCpuDescriptorManager(GrD3DGpu* gpu)
1515 , fCBVSRVDescriptorPool(gpu, D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV)
1616 , fSamplerDescriptorPool(gpu, D3D12_DESCRIPTOR_HEAP_TYPE_SAMPLER) {}
1717
18- D3D12_CPU_DESCRIPTOR_HANDLE GrD3DCpuDescriptorManager::createRenderTargetView (
18+ GrD3DDescriptorHeap::CPUHandle GrD3DCpuDescriptorManager::createRenderTargetView (
1919 GrD3DGpu* gpu, ID3D12Resource* textureResource) {
20- D3D12_CPU_DESCRIPTOR_HANDLE descriptor = fRTVDescriptorPool .allocateHandle (gpu);
21- gpu->device ()->CreateRenderTargetView (textureResource, nullptr , descriptor);
20+ const GrD3DDescriptorHeap::CPUHandle& descriptor = fRTVDescriptorPool .allocateHandle (gpu);
21+ gpu->device ()->CreateRenderTargetView (textureResource, nullptr , descriptor. fHandle );
2222 return descriptor;
2323}
2424
2525void GrD3DCpuDescriptorManager::recycleRenderTargetView (
26- D3D12_CPU_DESCRIPTOR_HANDLE* rtvDescriptor) {
26+ const GrD3DDescriptorHeap::CPUHandle& rtvDescriptor) {
2727 fRTVDescriptorPool .releaseHandle (rtvDescriptor);
2828}
2929
30- D3D12_CPU_DESCRIPTOR_HANDLE GrD3DCpuDescriptorManager::createDepthStencilView (
30+ GrD3DDescriptorHeap::CPUHandle GrD3DCpuDescriptorManager::createDepthStencilView (
3131 GrD3DGpu* gpu, ID3D12Resource* textureResource) {
32- D3D12_CPU_DESCRIPTOR_HANDLE descriptor = fDSVDescriptorPool .allocateHandle (gpu);
33- gpu->device ()->CreateDepthStencilView (textureResource, nullptr , descriptor);
32+ const GrD3DDescriptorHeap::CPUHandle& descriptor = fDSVDescriptorPool .allocateHandle (gpu);
33+ gpu->device ()->CreateDepthStencilView (textureResource, nullptr , descriptor. fHandle );
3434 return descriptor;
3535}
3636
3737void GrD3DCpuDescriptorManager::recycleDepthStencilView (
38- D3D12_CPU_DESCRIPTOR_HANDLE* dsvDescriptor) {
38+ const GrD3DDescriptorHeap::CPUHandle& dsvDescriptor) {
3939 fDSVDescriptorPool .releaseHandle (dsvDescriptor);
4040}
4141
42- D3D12_CPU_DESCRIPTOR_HANDLE GrD3DCpuDescriptorManager::createConstantBufferView (
42+ GrD3DDescriptorHeap::CPUHandle GrD3DCpuDescriptorManager::createConstantBufferView (
4343 GrD3DGpu* gpu, ID3D12Resource* bufferResource, size_t offset, size_t size) {
44- D3D12_CPU_DESCRIPTOR_HANDLE descriptor = fCBVSRVDescriptorPool .allocateHandle (gpu);
44+ const GrD3DDescriptorHeap::CPUHandle& descriptor = fCBVSRVDescriptorPool .allocateHandle (gpu);
4545 D3D12_CONSTANT_BUFFER_VIEW_DESC desc = {};
4646 desc.BufferLocation = bufferResource->GetGPUVirtualAddress () + offset;
4747 desc.SizeInBytes = size;
48- gpu->device ()->CreateConstantBufferView (&desc, descriptor);
48+ gpu->device ()->CreateConstantBufferView (&desc, descriptor. fHandle );
4949 return descriptor;
5050}
5151
52- D3D12_CPU_DESCRIPTOR_HANDLE GrD3DCpuDescriptorManager::createShaderResourceView (
52+ GrD3DDescriptorHeap::CPUHandle GrD3DCpuDescriptorManager::createShaderResourceView (
5353 GrD3DGpu* gpu, ID3D12Resource* resource) {
54- D3D12_CPU_DESCRIPTOR_HANDLE descriptor = fCBVSRVDescriptorPool .allocateHandle (gpu);
54+ const GrD3DDescriptorHeap::CPUHandle& descriptor = fCBVSRVDescriptorPool .allocateHandle (gpu);
5555 // TODO: for 4:2:0 YUV formats we'll need to map two different views, one for Y and one for UV.
5656 // For now map the entire resource.
57- gpu->device ()->CreateShaderResourceView (resource, nullptr , descriptor);
57+ gpu->device ()->CreateShaderResourceView (resource, nullptr , descriptor. fHandle );
5858 return descriptor;
5959}
6060
61- void GrD3DCpuDescriptorManager::recycleConstantOrShaderView (D3D12_CPU_DESCRIPTOR_HANDLE* view) {
61+ void GrD3DCpuDescriptorManager::recycleConstantOrShaderView (
62+ const GrD3DDescriptorHeap::CPUHandle& view) {
6263 fCBVSRVDescriptorPool .releaseHandle (view);
6364}
6465
65- D3D12_CPU_DESCRIPTOR_HANDLE GrD3DCpuDescriptorManager::createSampler (
66+ GrD3DDescriptorHeap::CPUHandle GrD3DCpuDescriptorManager::createSampler (
6667 GrD3DGpu* gpu, D3D12_FILTER filter, D3D12_TEXTURE_ADDRESS_MODE addressModeU,
6768 D3D12_TEXTURE_ADDRESS_MODE addressModeV) {
68- D3D12_CPU_DESCRIPTOR_HANDLE descriptor = fSamplerDescriptorPool .allocateHandle (gpu);
69+ const GrD3DDescriptorHeap::CPUHandle& descriptor = fSamplerDescriptorPool .allocateHandle (gpu);
6970 D3D12_SAMPLER_DESC desc = {};
7071 desc.Filter = filter;
7172 desc.AddressU = addressModeU;
@@ -78,11 +79,12 @@ D3D12_CPU_DESCRIPTOR_HANDLE GrD3DCpuDescriptorManager::createSampler(
7879 desc.MinLOD = 0 ;
7980 desc.MaxLOD = SK_ScalarMax;
8081
81- gpu->device ()->CreateSampler (&desc, descriptor);
82+ gpu->device ()->CreateSampler (&desc, descriptor. fHandle );
8283 return descriptor;
8384}
8485
85- void GrD3DCpuDescriptorManager::recycleSampler (D3D12_CPU_DESCRIPTOR_HANDLE* samplerDescriptor) {
86+ void GrD3DCpuDescriptorManager::recycleSampler (
87+ const GrD3DDescriptorHeap::CPUHandle& samplerDescriptor) {
8688 fSamplerDescriptorPool .releaseHandle (samplerDescriptor);
8789}
8890
@@ -99,23 +101,19 @@ std::unique_ptr<GrD3DCpuDescriptorManager::Heap> GrD3DCpuDescriptorManager::Heap
99101 return std::unique_ptr<Heap>(new Heap (heap, numDescriptors));
100102}
101103
102- D3D12_CPU_DESCRIPTOR_HANDLE GrD3DCpuDescriptorManager::Heap::allocateCPUHandle () {
104+ GrD3DDescriptorHeap::CPUHandle GrD3DCpuDescriptorManager::Heap::allocateCPUHandle () {
103105 SkBitSet::OptionalIndex freeBlock = fFreeBlocks .findFirst ();
104106 SkASSERT (freeBlock);
105107 fFreeBlocks .reset (*freeBlock);
106108 --fFreeCount ;
107109 return fHeap ->getCPUHandle (*freeBlock);
108110}
109111
110- bool GrD3DCpuDescriptorManager::Heap::freeCPUHandle (D3D12_CPU_DESCRIPTOR_HANDLE* handle) {
111- size_t index;
112- if (!fHeap ->getIndex (*handle, &index)) {
113- return false ;
114- }
112+ void GrD3DCpuDescriptorManager::Heap::freeCPUHandle (const GrD3DDescriptorHeap::CPUHandle& handle) {
113+ SkASSERT (this ->ownsHandle (handle));
114+ size_t index = fHeap ->getIndex (handle);
115115 fFreeBlocks .set (index);
116116 ++fFreeCount ;
117- handle->ptr = 0 ;
118- return true ;
119117}
120118
121119// //////////////////////////////////////////////////////////////////////////////////////////////
@@ -128,10 +126,11 @@ GrD3DCpuDescriptorManager::HeapPool::HeapPool(GrD3DGpu* gpu, D3D12_DESCRIPTOR_HE
128126 fDescriptorHeaps .push_back (std::move (heap));
129127}
130128
131- D3D12_CPU_DESCRIPTOR_HANDLE GrD3DCpuDescriptorManager::HeapPool::allocateHandle (GrD3DGpu* gpu) {
129+ GrD3DDescriptorHeap::CPUHandle GrD3DCpuDescriptorManager::HeapPool::allocateHandle (
130+ GrD3DGpu* gpu) {
132131 for (unsigned int i = 0 ; i < fDescriptorHeaps .size (); ++i) {
133132 if (fDescriptorHeaps [i]->canAllocate ()) {
134- D3D12_CPU_DESCRIPTOR_HANDLE handle = fDescriptorHeaps [i]->allocateCPUHandle ();
133+ GrD3DDescriptorHeap::CPUHandle handle = fDescriptorHeaps [i]->allocateCPUHandle ();
135134 return handle;
136135 }
137136 }
@@ -142,15 +141,16 @@ D3D12_CPU_DESCRIPTOR_HANDLE GrD3DCpuDescriptorManager::HeapPool::allocateHandle(
142141
143142 fDescriptorHeaps .push_back (std::move (heap));
144143 fMaxAvailableDescriptors *= 2 ;
145- D3D12_CPU_DESCRIPTOR_HANDLE handle =
144+ GrD3DDescriptorHeap::CPUHandle handle =
146145 fDescriptorHeaps [fDescriptorHeaps .size () - 1 ]->allocateCPUHandle ();
147146 return handle;
148147}
149148
150149void GrD3DCpuDescriptorManager::HeapPool::releaseHandle (
151- D3D12_CPU_DESCRIPTOR_HANDLE* dsvDescriptor) {
150+ const GrD3DDescriptorHeap::CPUHandle& dsvDescriptor) {
152151 for (unsigned int i = 0 ; i < fDescriptorHeaps .size (); ++i) {
153- if (fDescriptorHeaps [i]->freeCPUHandle (dsvDescriptor)) {
152+ if (fDescriptorHeaps [i]->ownsHandle (dsvDescriptor)) {
153+ fDescriptorHeaps [i]->freeCPUHandle (dsvDescriptor);
154154 return ;
155155 }
156156 }
0 commit comments