Add render resource handling for geometry

This commit is contained in:
Georg Hagen
2024-08-21 14:33:45 +02:00
parent b13c1c54ae
commit 2d08b3ab91
6 changed files with 59 additions and 68 deletions

View File

@@ -45,8 +45,8 @@ namespace OpenVulkano
public:
RenderResourcePtr() = default;
RenderResourcePtr(const RenderResourcePtr& ignored) { /* Do not copy, copy will be created by renderer */ }
RenderResourcePtr(RenderResourcePtr&& move) : renderObject(move.renderObject) { move.renderObject = nullptr; }
RenderResourcePtr(const RenderResourcePtr& ignored) noexcept { /* Do not copy, copy will be created by renderer */ }
RenderResourcePtr(RenderResourcePtr&& move) noexcept : renderObject(move.renderObject) { move.renderObject = nullptr; }
~RenderResourcePtr()
{
@@ -67,6 +67,14 @@ namespace OpenVulkano
operator T() { return static_cast<T>(renderObject); }
operator bool() const { return renderObject; }
RenderResourcePtr& operator =(RenderResourcePtr&& move) noexcept
{
if (renderObject) renderObject->Release();
renderObject = move.renderObject;
move.renderObject = nullptr;
return *this;
}
};
inline void IRenderResourceHelper::UpdateRenderResource(RenderResourcePtr* resource)
@@ -94,7 +102,7 @@ namespace OpenVulkano
IRenderResource(const IRenderResource<API_INDEPENDENT_CLASS>& copy) = delete;
IRenderResource(IRenderResource<API_INDEPENDENT_CLASS>&& move)
IRenderResource(IRenderResource<API_INDEPENDENT_CLASS>&& move) noexcept
: m_owner(move.m_owner)
{
if (m_owner)
@@ -139,8 +147,8 @@ namespace OpenVulkano
protected:
RenderResourceHolder() = default;
RenderResourceHolder(const RenderResourceHolder& ignored) {}
RenderResourceHolder(RenderResourceHolder&& move)
RenderResourceHolder(const RenderResourceHolder& ignored) noexcept {}
RenderResourceHolder(RenderResourceHolder&& move) noexcept
: renderResource(std::move(move.renderResource))
{
if (IRenderResource<T>* renderRes = renderResource)
@@ -158,5 +166,20 @@ namespace OpenVulkano
operator RT() const { return renderResource; }
bool HasRenderResource() const { return renderResource; }
RenderResourceHolder& operator =(RenderResourceHolder&& move) noexcept
{
renderResource = std::move(move.renderResource);
if (IRenderResource<T>* renderRes = renderResource)
renderRes->UpdateAddress(static_cast<T*>(this));
return *this;
}
void Swap(RenderResourceHolder& other) noexcept
{
RenderResourceHolder tmp(std::move(*this));
*this = std::move(other);
other = std::move(tmp);
}
};
}