Files
NazaraEngine/src/Nazara/OpenGLRenderer/OpenGLBuffer.cpp
2024-01-02 12:02:14 +01:00

71 lines
2.0 KiB
C++

// Copyright (C) 2024 Jérôme "SirLynix" Leclercq (lynix680@gmail.com)
// This file is part of the "Nazara Engine - OpenGL renderer"
// For conditions of distribution and use, see copyright notice in Config.hpp
#include <Nazara/OpenGLRenderer/OpenGLBuffer.hpp>
#include <NazaraUtils/CallOnExit.hpp>
#include <stdexcept>
#include <Nazara/OpenGLRenderer/Debug.hpp>
namespace Nz
{
OpenGLBuffer::OpenGLBuffer(OpenGLDevice& device, BufferType type, UInt64 size, BufferUsageFlags usage, const void* initialData) :
RenderBuffer(device, type, size, usage)
{
if (!m_buffer.Create(device))
throw std::runtime_error("failed to create buffer"); //< TODO: Handle OpenGL error
GL::BufferTarget target;
switch (type)
{
case BufferType::Index: target = GL::BufferTarget::ElementArray; break;
case BufferType::Storage: target = GL::BufferTarget::Storage; break;
case BufferType::Uniform: target = GL::BufferTarget::Uniform; break;
case BufferType::Vertex: target = GL::BufferTarget::Array; break;
default:
throw std::runtime_error("unknown buffer type 0x" + NumberToString(UnderlyingCast(type), 16));
}
GLenum hint = GL_STREAM_COPY;
if (usage & BufferUsage::Dynamic)
hint = GL_DYNAMIC_DRAW;
else if (usage & BufferUsage::DeviceLocal)
hint = GL_STATIC_DRAW;
if (usage & BufferUsage::DirectMapping)
hint = GL_DYNAMIC_COPY;
m_buffer.Reset(target, size, initialData, hint);
}
bool OpenGLBuffer::Fill(const void* data, UInt64 offset, UInt64 size)
{
m_buffer.SubData(GLintptr(offset), GLsizeiptr(size), data);
return true;
}
void* OpenGLBuffer::Map(UInt64 offset, UInt64 size)
{
GLbitfield accessBit = 0;
if (GetUsageFlags() & BufferUsage::Read)
accessBit |= GL_MAP_READ_BIT;
if (GetUsageFlags() & BufferUsage::Write)
accessBit |= GL_MAP_WRITE_BIT;
return m_buffer.MapRange(offset, size, accessBit);
}
bool OpenGLBuffer::Unmap()
{
return m_buffer.Unmap();
}
void OpenGLBuffer::UpdateDebugName(std::string_view name)
{
m_buffer.SetDebugName(name);
}
}