Render resource handling for textures

This commit is contained in:
Georg Hagen
2024-08-21 13:13:43 +02:00
parent 33c8b74342
commit 3940a72084
7 changed files with 57 additions and 47 deletions

View File

@@ -12,6 +12,11 @@
namespace OpenVulkano
{
namespace Vulkan
{
class MetalBackedTexture;
}
class RenderResourcePtr;
class IRenderResourceHelper
@@ -19,9 +24,11 @@ namespace OpenVulkano
friend class RenderResourcePtr;
protected:
void UpdateRenderResource(RenderResourcePtr& resource);
void UpdateRenderResource(RenderResourcePtr* resource);
void ResetRenderResource(RenderResourcePtr& resource);
void ResetRenderResource(RenderResourcePtr* resource);
virtual void DoRelease() = 0;
virtual void Release() = 0;
};
@@ -32,6 +39,7 @@ namespace OpenVulkano
class RenderResourcePtr final
{
friend class IRenderResourceHelper;
friend class Vulkan::MetalBackedTexture;
IRenderResourceHelper* renderObject = nullptr;
@@ -48,7 +56,7 @@ namespace OpenVulkano
void Release()
{
if (!renderObject) return;
renderObject->Release();
renderObject->DoRelease();
renderObject = nullptr;
}
@@ -61,14 +69,16 @@ namespace OpenVulkano
operator bool() const { return renderObject; }
};
inline void IRenderResourceHelper::UpdateRenderResource(RenderResourcePtr& resource)
inline void IRenderResourceHelper::UpdateRenderResource(RenderResourcePtr* resource)
{
resource.renderObject = this;
if (resource)
resource->renderObject = this;
}
inline void IRenderResourceHelper::ResetRenderResource(RenderResourcePtr& resource)
inline void IRenderResourceHelper::ResetRenderResource(RenderResourcePtr* resource)
{
resource.renderObject = nullptr;
if (resource)
resource->renderObject = nullptr;
}
template<Renderable API_INDEPENDENT_CLASS>
@@ -94,7 +104,13 @@ namespace OpenVulkano
move.m_owner = nullptr;
}
RenderResourcePtr& GetOwnerResource() { return static_cast<RenderResourcePtr&>(*m_owner); }
RenderResourcePtr* GetOwnerResource() { if (!m_owner) return nullptr; else return &static_cast<RenderResourcePtr&>(*m_owner); }
void DoRelease() final override
{
m_owner = nullptr;
Release();
}
public:
virtual ~IRenderResource()
@@ -136,7 +152,7 @@ namespace OpenVulkano
public:
operator RenderResourcePtr&() { return renderResource; }
RenderResourcePtr& GetRenderResource() { return renderResource; }
RenderResourcePtr& GetRenderResource() const { return const_cast<RenderResourceHolder*>(this)->renderResource; }
template<Renderable RT>
operator RT() const { return renderResource; }