diff --git a/MobileGL/MG_Backend/DirectVulkan/Renderer/VkBufferManager.cpp b/MobileGL/MG_Backend/DirectVulkan/Renderer/VkBufferManager.cpp index 98e3d2a6..be105242 100644 --- a/MobileGL/MG_Backend/DirectVulkan/Renderer/VkBufferManager.cpp +++ b/MobileGL/MG_Backend/DirectVulkan/Renderer/VkBufferManager.cpp @@ -197,16 +197,20 @@ namespace MobileGL::MG_Backend::DirectVulkan { return static_cast(bufferObject.GetBackendResource().get()); } - SharedPtr VkBufferManager::GetOrCreateResource( + VkBufferResource* VkBufferManager::GetOrCreateResource( const SharedPtr& bufferObject) { - auto existing = std::static_pointer_cast(bufferObject->GetBackendResource()); + // Return by raw pointer: the resource is owned for its whole lifetime by the BufferObject's + // backend-resource SharedPtr (already set, or set below), so callers that only dereference + // it avoid a static_pointer_cast + SharedPtr refcount inc/dec on every per-draw buffer bind. + const auto& existing = bufferObject->GetBackendResource(); if (existing) { - return existing; + return static_cast(existing.get()); } auto resource = MakeShared(); + VkBufferResource* raw = resource.get(); bufferObject->SetBackendResource(resource); TrackLiveResource(resource); - return resource; + return raw; } void VkBufferManager::TrackLiveResource(const SharedPtr& resource) { diff --git a/MobileGL/MG_Backend/DirectVulkan/Renderer/VkBufferManager.h b/MobileGL/MG_Backend/DirectVulkan/Renderer/VkBufferManager.h index 0e346080..77b2f855 100644 --- a/MobileGL/MG_Backend/DirectVulkan/Renderer/VkBufferManager.h +++ b/MobileGL/MG_Backend/DirectVulkan/Renderer/VkBufferManager.h @@ -124,7 +124,7 @@ namespace MobileGL::MG_Backend::DirectVulkan { private: Bool InitializeTransientArenas(); static VkBufferUsageFlags GetVkBufferUsage(BufferKind kind); - SharedPtr GetOrCreateResource(const SharedPtr& bufferObject); + VkBufferResource* GetOrCreateResource(const SharedPtr& bufferObject); static VkBufferResource* ResourceOf(MG_State::GLState::BufferObject& bufferObject); Bool CreateResidentStorage(VkBufferResource& resource, VkDeviceSize size, VkBufferUsageFlags usage, VkMemoryPropertyFlags requiredFlags = 0);