mirror of
https://github.com/MobileGL-Dev/MobileGL
synced 2026-09-11 21:58:31 +09:00
[Perf] (MG_Backend/DirectVulkan): return VkBufferResource by raw pointer from GetOrCreateResource to drop per-draw SharedPtr refcounting
This commit is contained in:
@@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user