Render resource handling for textures
This commit is contained in:
@@ -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; }
|
||||
|
||||
Reference in New Issue
Block a user