[Perf] (MG_Backend/DirectVulkan): return VkBufferResource by raw pointer from GetOrCreateResource to drop per-draw SharedPtr refcounting

This commit is contained in:
2026-07-16 18:34:55 -04:00
parent 075471cdbd
commit 9ed5dbf483
2 changed files with 9 additions and 5 deletions
@@ -197,16 +197,20 @@ namespace MobileGL::MG_Backend::DirectVulkan {
return static_cast<VkBufferResource*>(bufferObject.GetBackendResource().get()); return static_cast<VkBufferResource*>(bufferObject.GetBackendResource().get());
} }
SharedPtr<VkBufferResource> VkBufferManager::GetOrCreateResource( VkBufferResource* VkBufferManager::GetOrCreateResource(
const SharedPtr<MG_State::GLState::BufferObject>& bufferObject) { const SharedPtr<MG_State::GLState::BufferObject>& bufferObject) {
auto existing = std::static_pointer_cast<VkBufferResource>(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) { if (existing) {
return existing; return static_cast<VkBufferResource*>(existing.get());
} }
auto resource = MakeShared<VkBufferResource>(); auto resource = MakeShared<VkBufferResource>();
VkBufferResource* raw = resource.get();
bufferObject->SetBackendResource(resource); bufferObject->SetBackendResource(resource);
TrackLiveResource(resource); TrackLiveResource(resource);
return resource; return raw;
} }
void VkBufferManager::TrackLiveResource(const SharedPtr<VkBufferResource>& resource) { void VkBufferManager::TrackLiveResource(const SharedPtr<VkBufferResource>& resource) {
@@ -124,7 +124,7 @@ namespace MobileGL::MG_Backend::DirectVulkan {
private: private:
Bool InitializeTransientArenas(); Bool InitializeTransientArenas();
static VkBufferUsageFlags GetVkBufferUsage(BufferKind kind); static VkBufferUsageFlags GetVkBufferUsage(BufferKind kind);
SharedPtr<VkBufferResource> GetOrCreateResource(const SharedPtr<MG_State::GLState::BufferObject>& bufferObject); VkBufferResource* GetOrCreateResource(const SharedPtr<MG_State::GLState::BufferObject>& bufferObject);
static VkBufferResource* ResourceOf(MG_State::GLState::BufferObject& bufferObject); static VkBufferResource* ResourceOf(MG_State::GLState::BufferObject& bufferObject);
Bool CreateResidentStorage(VkBufferResource& resource, VkDeviceSize size, VkBufferUsageFlags usage, Bool CreateResidentStorage(VkBufferResource& resource, VkDeviceSize size, VkBufferUsageFlags usage,
VkMemoryPropertyFlags requiredFlags = 0); VkMemoryPropertyFlags requiredFlags = 0);