Big buffer refactor
Replaced RenderBuffer class, replaced AbstractBuffer by Buffer
This commit is contained in:
@@ -3,100 +3,18 @@
|
||||
// For conditions of distribution and use, see copyright notice in Config.hpp
|
||||
|
||||
#include <Nazara/Renderer/RenderBuffer.hpp>
|
||||
#include <Nazara/Core/Error.hpp>
|
||||
#include <Nazara/Renderer/RenderDevice.hpp>
|
||||
#include <Nazara/Renderer/Debug.hpp>
|
||||
|
||||
namespace Nz
|
||||
{
|
||||
bool RenderBuffer::Fill(const void* data, UInt64 offset, UInt64 size)
|
||||
RenderBuffer::~RenderBuffer() = default;
|
||||
|
||||
BufferFactory GetRenderBufferFactory(std::shared_ptr<RenderDevice> device)
|
||||
{
|
||||
if (m_softwareBuffer.Fill(data, offset, size))
|
||||
return [device = std::move(device)](BufferType type, UInt64 size, BufferUsageFlags usage, const void* initialData) -> std::shared_ptr<Buffer>
|
||||
{
|
||||
for (auto& bufferPair : m_hardwareBuffers)
|
||||
bufferPair.second.synchronized = false;
|
||||
|
||||
return true;
|
||||
}
|
||||
else
|
||||
return false;
|
||||
return device->InstantiateBuffer(type, size, usage, initialData);
|
||||
};
|
||||
}
|
||||
|
||||
bool RenderBuffer::Initialize(UInt64 size, BufferUsageFlags usage)
|
||||
{
|
||||
m_size = size;
|
||||
m_softwareBuffer.Initialize(size, usage);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
AbstractBuffer* RenderBuffer::GetHardwareBuffer(RenderDevice* device)
|
||||
{
|
||||
if (HardwareBuffer* hwBuffer = GetHardwareBufferData(device))
|
||||
return hwBuffer->buffer.get();
|
||||
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
UInt64 RenderBuffer::GetSize() const
|
||||
{
|
||||
return m_size;
|
||||
}
|
||||
|
||||
DataStorage RenderBuffer::GetStorage() const
|
||||
{
|
||||
return DataStorage::Hardware;
|
||||
}
|
||||
|
||||
void* RenderBuffer::Map(BufferAccess access, UInt64 offset, UInt64 size)
|
||||
{
|
||||
if (void* ptr = m_softwareBuffer.Map(access, offset, size))
|
||||
{
|
||||
if (access != BufferAccess::ReadOnly)
|
||||
{
|
||||
for (auto& bufferPair : m_hardwareBuffers)
|
||||
bufferPair.second.synchronized = false;
|
||||
}
|
||||
|
||||
return ptr;
|
||||
}
|
||||
else
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
bool RenderBuffer::Unmap()
|
||||
{
|
||||
return m_softwareBuffer.Unmap();
|
||||
}
|
||||
|
||||
bool RenderBuffer::Synchronize(RenderDevice* device)
|
||||
{
|
||||
HardwareBuffer* hwBuffer = GetHardwareBufferData(device);
|
||||
if (!hwBuffer)
|
||||
return false;
|
||||
|
||||
if (hwBuffer->synchronized)
|
||||
return true;
|
||||
|
||||
return hwBuffer->buffer->Fill(m_softwareBuffer.GetData(), 0, m_size);
|
||||
}
|
||||
|
||||
auto RenderBuffer::GetHardwareBufferData(RenderDevice* device) -> HardwareBuffer*
|
||||
{
|
||||
auto it = m_hardwareBuffers.find(device);
|
||||
if (it == m_hardwareBuffers.end())
|
||||
{
|
||||
HardwareBuffer hwBuffer;
|
||||
hwBuffer.buffer = device->InstantiateBuffer(m_type);
|
||||
if (!hwBuffer.buffer->Initialize(m_size, m_usage))
|
||||
{
|
||||
NazaraError("Failed to initialize hardware buffer");
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
it = m_hardwareBuffers.emplace(device, std::move(hwBuffer)).first;
|
||||
}
|
||||
|
||||
return &it->second;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -9,7 +9,6 @@
|
||||
#include <Nazara/Core/StringExt.hpp>
|
||||
#include <Nazara/Platform/Platform.hpp>
|
||||
#include <Nazara/Renderer/RenderBuffer.hpp>
|
||||
#include <Nazara/Utility/AbstractBuffer.hpp>
|
||||
#include <Nazara/Utility/Buffer.hpp>
|
||||
#include <Nazara/Utility/Image.hpp>
|
||||
#include <Nazara/Utility/Utility.hpp>
|
||||
@@ -35,15 +34,11 @@ namespace Nz
|
||||
ModuleBase("Renderer", this)
|
||||
{
|
||||
LoadBackend(config);
|
||||
|
||||
Buffer::SetBufferFactory(DataStorage::Hardware, [](Buffer* parent, BufferType type) -> std::unique_ptr<AbstractBuffer> { return std::make_unique<RenderBuffer>(parent, type); });
|
||||
}
|
||||
|
||||
Renderer::~Renderer()
|
||||
{
|
||||
// Uninitialize module here
|
||||
Buffer::SetBufferFactory(DataStorage::Hardware, nullptr);
|
||||
|
||||
// reset Renderer impl before unloading library
|
||||
m_rendererImpl.reset();
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user