diff --git a/source/blender/gpu/vulkan/render_graph/vk_render_graph.cc b/source/blender/gpu/vulkan/render_graph/vk_render_graph.cc index 10d9ab5fbb4..1ef83a1ef55 100644 --- a/source/blender/gpu/vulkan/render_graph/vk_render_graph.cc +++ b/source/blender/gpu/vulkan/render_graph/vk_render_graph.cc @@ -20,13 +20,16 @@ VKRenderGraph::VKRenderGraph(VKResourceStateTracker &resources) : resources_(res void VKRenderGraph::reset() { +#if 0 + memstats(); +#endif submission_id.next(); - links_.clear(); + links_.clear_and_shrink(); for (VKRenderGraphNode &node : nodes_) { node.free_data(storage_); } - nodes_.clear(); + nodes_.clear_and_shrink(); storage_.reset(); debug_.node_group_map.clear(); @@ -35,6 +38,27 @@ void VKRenderGraph::reset() debug_.groups.clear(); } +void VKRenderGraph::memstats() const +{ + std::cout << __func__ << " nodes: (" << nodes_.size() << "/" << nodes_.capacity() << "), " + << "links: (" << links_.size() << "/" << links_.capacity() << ")\n"; +#define PRINT_STORAGE(name) \ + std::cout << " " #name " : (" << storage_.name.size() << " / " << storage_.name.capacity() \ + << ")\n " + + PRINT_STORAGE(begin_rendering); + PRINT_STORAGE(clear_attachments); + PRINT_STORAGE(blit_image); + PRINT_STORAGE(copy_buffer_to_image); + PRINT_STORAGE(copy_image); + PRINT_STORAGE(copy_image_to_buffer); + PRINT_STORAGE(draw); + PRINT_STORAGE(draw_indexed); + PRINT_STORAGE(draw_indexed_indirect); + PRINT_STORAGE(draw_indirect); +#undef PRINT_STORAGE +} + /** \} */ /* -------------------------------------------------------------------- */ diff --git a/source/blender/gpu/vulkan/render_graph/vk_render_graph.hh b/source/blender/gpu/vulkan/render_graph/vk_render_graph.hh index 8aed4c514e0..31b6ac19c6d 100644 --- a/source/blender/gpu/vulkan/render_graph/vk_render_graph.hh +++ b/source/blender/gpu/vulkan/render_graph/vk_render_graph.hh @@ -69,9 +69,9 @@ class VKRenderGraph : public NonCopyable { using DebugGroupID = int64_t; /** All links inside the graph indexable via NodeHandle. */ - Vector links_; + Vector links_; /** All nodes inside the graph indexable via NodeHandle. */ - Vector nodes_; + Vector nodes_; /** Storage for large node datas to improve CPU cache pre-loading. */ VKRenderGraphStorage storage_; @@ -250,6 +250,8 @@ class VKRenderGraph : public NonCopyable { */ void reset(); + void memstats() const; + private: }; diff --git a/source/blender/gpu/vulkan/render_graph/vk_render_graph_node.hh b/source/blender/gpu/vulkan/render_graph/vk_render_graph_node.hh index 396ca6eb394..87cc5fe893f 100644 --- a/source/blender/gpu/vulkan/render_graph/vk_render_graph_node.hh +++ b/source/blender/gpu/vulkan/render_graph/vk_render_graph_node.hh @@ -48,29 +48,29 @@ using NodeHandle = uint64_t; * */ struct VKRenderGraphStorage { - Vector begin_rendering; - Vector clear_attachments; - Vector blit_image; - Vector copy_buffer_to_image; - Vector copy_image; - Vector copy_image_to_buffer; - Vector draw; - Vector draw_indexed; - Vector draw_indexed_indirect; - Vector draw_indirect; + Vector begin_rendering; + Vector clear_attachments; + Vector blit_image; + Vector copy_buffer_to_image; + Vector copy_image; + Vector copy_image_to_buffer; + Vector draw; + Vector draw_indexed; + Vector draw_indexed_indirect; + Vector draw_indirect; void reset() { - begin_rendering.clear(); - clear_attachments.clear(); - blit_image.clear(); - copy_buffer_to_image.clear(); - copy_image.clear(); - copy_image_to_buffer.clear(); - draw.clear(); - draw_indexed.clear(); - draw_indexed_indirect.clear(); - draw_indirect.clear(); + begin_rendering.clear_and_shrink(); + clear_attachments.clear_and_shrink(); + blit_image.clear_and_shrink(); + copy_buffer_to_image.clear_and_shrink(); + copy_image.clear_and_shrink(); + copy_image_to_buffer.clear_and_shrink(); + draw.clear_and_shrink(); + draw_indexed.clear_and_shrink(); + draw_indexed_indirect.clear_and_shrink(); + draw_indirect.clear_and_shrink(); } }; diff --git a/source/blender/gpu/vulkan/render_graph/vk_resource_state_tracker.cc b/source/blender/gpu/vulkan/render_graph/vk_resource_state_tracker.cc index 7098ddc53c0..ab5bd5b6e3e 100644 --- a/source/blender/gpu/vulkan/render_graph/vk_resource_state_tracker.cc +++ b/source/blender/gpu/vulkan/render_graph/vk_resource_state_tracker.cc @@ -177,4 +177,14 @@ void VKResourceStateTracker::validate() const } #endif +void VKResourceStateTracker::debug_print() const +{ + std::ostream &os = std::cout; + os << "VKResourceStateTracker\n"; + os << " resources=(" << resources_.size() << "/" << resources_.capacity() << ")\n"; + os << " buffers=(" << buffer_resources_.size() << "/" << buffer_resources_.capacity() << ")\n"; + os << " images=(" << image_resources_.size() << "/" << image_resources_.capacity() << ")\n"; + os << " unused=(" << unused_handles_.size() << "/" << unused_handles_.capacity() << ")\n"; +} + } // namespace blender::gpu::render_graph diff --git a/source/blender/gpu/vulkan/render_graph/vk_resource_state_tracker.hh b/source/blender/gpu/vulkan/render_graph/vk_resource_state_tracker.hh index 82c2d94ea5d..ecf2d8f7ae6 100644 --- a/source/blender/gpu/vulkan/render_graph/vk_resource_state_tracker.hh +++ b/source/blender/gpu/vulkan/render_graph/vk_resource_state_tracker.hh @@ -260,6 +260,8 @@ class VKResourceStateTracker { bool use_dynamic_rendering = true; bool use_dynamic_rendering_local_read = true; + void debug_print() const; + private: /** * Get the current stamp of the resource. diff --git a/source/blender/gpu/vulkan/vk_device.cc b/source/blender/gpu/vulkan/vk_device.cc index d1fc8620de5..4b3887c80be 100644 --- a/source/blender/gpu/vulkan/vk_device.cc +++ b/source/blender/gpu/vulkan/vk_device.cc @@ -563,6 +563,11 @@ void VKDevice::debug_print() os << "Discard pool\n"; debug_print(os, orphaned_data); os << "\n"; + + for (const std::reference_wrapper &context : contexts_) { + os << " VKContext \n"; + debug_print(os, context.get().discard_pool); + } } /** \} */