@@ -33,6 +33,8 @@ namespace DX12
3333 std::mutex upload;
3434 std::mutex read_back;
3535
36+
37+ ResourceHeapAllocator allocator;
3638 public:
3739
3840 std::shared_ptr<UploadBuffer> get_upload (UINT64 size);
@@ -168,31 +170,46 @@ namespace DX12
168170 template <class LockPolicy = Free>
169171 class GPUCompiledManager : public Uploader
170172 {
171- // using cb_buffer = virtual_gpu_buffer<std::byte>;
173+ enum_array<DescriptorHeapType, typename DynamicDescriptor<LockPolicy>::ptr> cpu_heaps;
174+ enum_array<DescriptorHeapType, typename DynamicDescriptor<LockPolicy>::ptr> gpu_heaps;
172175
173- // static Cache<std::shared_ptr<cb_buffer>> cbv_cache;
174176 public:
175- DynamicDescriptor<DescriptorHeapType::CBV_SRV_UAV, LockPolicy, DescriptorHeapFlags::SHADER_VISIBLE> srv;
176- DynamicDescriptor<DescriptorHeapType::SAMPLER, LockPolicy, DescriptorHeapFlags::SHADER_VISIBLE> smp;
177177
178- DynamicDescriptor<DescriptorHeapType::CBV_SRV_UAV, LockPolicy> srv_uav_cbv_cpu;
179- DynamicDescriptor<DescriptorHeapType::RTV, LockPolicy> rtv_cpu;
180- DynamicDescriptor<DescriptorHeapType::DSV, LockPolicy> dsv_cpu;
181- DynamicDescriptor<DescriptorHeapType::SAMPLER, LockPolicy> smp_cpu;
178+ DynamicDescriptor<LockPolicy>& get_cpu_heap (DescriptorHeapType type)
179+ {
180+ assert (cpu_heaps[type]);
181+ return *cpu_heaps[type];
182+ }
182183
183- // std::shared_ptr<cb_buffer> cb;
184+ DynamicDescriptor<LockPolicy>& get_gpu_heap (DescriptorHeapType type)
185+ {
186+ assert (cpu_heaps[type]);
187+ return *gpu_heaps[type];
188+ }
189+
190+ GPUCompiledManager ()
191+ {
192+ gpu_heaps[DescriptorHeapType::CBV_SRV_UAV] = std::make_shared<DynamicDescriptor<LockPolicy>>(DescriptorHeapType::CBV_SRV_UAV, DescriptorHeapFlags::SHADER_VISIBLE);
193+ gpu_heaps[DescriptorHeapType::SAMPLER] = std::make_shared<DynamicDescriptor<LockPolicy>>(DescriptorHeapType::SAMPLER, DescriptorHeapFlags::SHADER_VISIBLE);
194+
195+ cpu_heaps[DescriptorHeapType::CBV_SRV_UAV] = std::make_shared<DynamicDescriptor<LockPolicy>>(DescriptorHeapType::CBV_SRV_UAV, DescriptorHeapFlags::NONE);
196+ cpu_heaps[DescriptorHeapType::RTV] = std::make_shared<DynamicDescriptor<LockPolicy>>(DescriptorHeapType::RTV, DescriptorHeapFlags::NONE);
197+ cpu_heaps[DescriptorHeapType::DSV] = std::make_shared<DynamicDescriptor<LockPolicy>>(DescriptorHeapType::DSV, DescriptorHeapFlags::NONE);
198+ cpu_heaps[DescriptorHeapType::SAMPLER] = std::make_shared<DynamicDescriptor<LockPolicy>>(DescriptorHeapType::SAMPLER, DescriptorHeapFlags::NONE);
199+ }
184200
185201 void reset ()
186202 {
187- srv.reset ();
188- smp.reset ();
189203
190- srv_uav_cbv_cpu.reset ();
191- rtv_cpu.reset ();
192- dsv_cpu.reset ();
193- smp_cpu.reset ();
194- Uploader::reset ();
204+ for (auto & h : gpu_heaps)
205+ if (h)
206+ h->reset ();
195207
208+ for (auto & h : cpu_heaps)
209+ if (h)
210+ h->reset ();
211+
212+ Uploader::reset ();
196213 }
197214
198215 };
@@ -556,6 +573,7 @@ namespace DX12
556573 {
557574 std::shared_ptr<CPUBuffer> resource;
558575 UINT64 offset;
576+ UINT64 size;
559577 };
560578
561579 ReadBackInfo read_data (UINT64 uploadBufferSize);
@@ -641,7 +659,7 @@ namespace DX12
641659
642660 // timers
643661 void insert_time (QueryHeap& pQueryHeap, uint32_t QueryIdx);
644- void resolve_times (Resource* resource, QueryHeap& pQueryHeap, uint32_t NumQueries, std::function<void ()>);
662+ void resolve_times (QueryHeap& pQueryHeap, uint32_t NumQueries, std::function<void (std::span<UINT64> )>);
645663
646664 };
647665
@@ -856,7 +874,7 @@ namespace DX12
856874 transition_uav (h.resource_info );
857875
858876 flush_transitions ();
859- auto handle = srv .place (h);
877+ auto handle = get_cpu_heap (DescriptorHeapType::CBV_SRV_UAV) .place (h);
860878 get_native_list ()->ClearUnorderedAccessViewUint (handle.gpu , h.cpu , resource->get_native ().Get (), reinterpret_cast <UINT*>(ClearColor.data ()), 0 , nullptr );
861879 }
862880
@@ -866,7 +884,7 @@ namespace DX12
866884 transition_uav (h.resource_info );
867885
868886 flush_transitions ();
869- auto handle = srv .place (h);
887+ auto handle = get_cpu_heap (DescriptorHeapType::CBV_SRV_UAV) .place (h);
870888 get_native_list ()->ClearUnorderedAccessViewFloat (handle.gpu , h.cpu , resource->get_native ().Get (), reinterpret_cast <FLOAT*>(ClearColor.data ()), 0 , nullptr );
871889 }
872890
@@ -1124,22 +1142,22 @@ namespace DX12
11241142
11251143 HandleTableLight place_rtv (UINT count)
11261144 {
1127- return get_base ().rtv_cpu .place (count);
1145+ return get_base ().get_cpu_heap (DescriptorHeapType::RTV) .place (count);
11281146 }
11291147
11301148 HandleTableLight place_dsv (UINT count)
11311149 {
1132- return get_base ().dsv_cpu .place (count);
1150+ return get_base ().get_cpu_heap (DescriptorHeapType::DSV) .place (count);
11331151 }
11341152
11351153 HandleTableLight place_rtv (std::initializer_list<Handle> list)
11361154 {
1137- return get_base ().rtv_cpu .place (list);
1155+ return get_base ().get_cpu_heap (DescriptorHeapType::RTV) .place (list);
11381156 }
11391157
11401158 HandleTableLight place_dsv (std::initializer_list<Handle> list)
11411159 {
1142- return get_base ().dsv_cpu .place (list);
1160+ return get_base ().get_cpu_heap (DescriptorHeapType::DSV) .place (list);
11431161 }
11441162
11451163 void set_rtvs_internal (D3D12_CPU_DESCRIPTOR_HANDLE* t, Handle h)
0 commit comments