OpenGLRenderer: Improve OpenGL wrapper
This commit is contained in:
parent
250044b47a
commit
78358337f3
|
|
@ -19,7 +19,7 @@ namespace Nz::GL
|
||||||
friend DeviceObject;
|
friend DeviceObject;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
Buffer() = default;
|
using DeviceObject::DeviceObject;
|
||||||
Buffer(const Buffer&) = delete;
|
Buffer(const Buffer&) = delete;
|
||||||
Buffer(Buffer&&) noexcept = default;
|
Buffer(Buffer&&) noexcept = default;
|
||||||
~Buffer() = default;
|
~Buffer() = default;
|
||||||
|
|
|
||||||
|
|
@ -19,6 +19,7 @@ namespace Nz::GL
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
ContextObject() = default;
|
ContextObject() = default;
|
||||||
|
ContextObject(const Context& context, CreateArgs... args);
|
||||||
ContextObject(const ContextObject&) = delete;
|
ContextObject(const ContextObject&) = delete;
|
||||||
ContextObject(ContextObject&& object) noexcept = default;
|
ContextObject(ContextObject&& object) noexcept = default;
|
||||||
~ContextObject();
|
~ContextObject();
|
||||||
|
|
@ -26,6 +27,8 @@ namespace Nz::GL
|
||||||
bool Create(const Context& context, CreateArgs... args);
|
bool Create(const Context& context, CreateArgs... args);
|
||||||
void Destroy();
|
void Destroy();
|
||||||
|
|
||||||
|
const Context& EnsureContext() const;
|
||||||
|
|
||||||
bool IsValid() const;
|
bool IsValid() const;
|
||||||
|
|
||||||
const Context* GetContext() const;
|
const Context* GetContext() const;
|
||||||
|
|
@ -39,8 +42,6 @@ namespace Nz::GL
|
||||||
static constexpr GLuint InvalidObject = 0;
|
static constexpr GLuint InvalidObject = 0;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void EnsureContext();
|
|
||||||
|
|
||||||
MovablePtr<const Context> m_context;
|
MovablePtr<const Context> m_context;
|
||||||
MovableValue<GLuint> m_objectId;
|
MovableValue<GLuint> m_objectId;
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -4,11 +4,19 @@
|
||||||
|
|
||||||
#include <Nazara/OpenGLRenderer/Wrapper/ContextObject.hpp>
|
#include <Nazara/OpenGLRenderer/Wrapper/ContextObject.hpp>
|
||||||
#include <Nazara/Core/Error.hpp>
|
#include <Nazara/Core/Error.hpp>
|
||||||
|
#include <Nazara/Core/ErrorFlags.hpp>
|
||||||
#include <Nazara/OpenGLRenderer/Utils.hpp>
|
#include <Nazara/OpenGLRenderer/Utils.hpp>
|
||||||
#include <Nazara/OpenGLRenderer/Debug.hpp>
|
#include <Nazara/OpenGLRenderer/Debug.hpp>
|
||||||
|
|
||||||
namespace Nz::GL
|
namespace Nz::GL
|
||||||
{
|
{
|
||||||
|
template<typename C, GLenum ObjectType, typename... CreateArgs>
|
||||||
|
ContextObject<C, ObjectType, CreateArgs...>::ContextObject(const Context& context, CreateArgs... args)
|
||||||
|
{
|
||||||
|
ErrorFlags errFlags(ErrorMode::ThrowException);
|
||||||
|
Create(context, args...);
|
||||||
|
}
|
||||||
|
|
||||||
template<typename C, GLenum ObjectType, typename... CreateArgs>
|
template<typename C, GLenum ObjectType, typename... CreateArgs>
|
||||||
ContextObject<C, ObjectType, CreateArgs...>::~ContextObject()
|
ContextObject<C, ObjectType, CreateArgs...>::~ContextObject()
|
||||||
{
|
{
|
||||||
|
|
@ -46,6 +54,19 @@ namespace Nz::GL
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template<typename C, GLenum ObjectType, typename... CreateArgs>
|
||||||
|
const Context& ContextObject<C, ObjectType, CreateArgs...>::EnsureContext() const
|
||||||
|
{
|
||||||
|
const Context* activeContext = Context::GetCurrentContext();
|
||||||
|
if (activeContext != m_context.Get())
|
||||||
|
{
|
||||||
|
if (!Context::SetCurrentContext(m_context.Get()))
|
||||||
|
throw std::runtime_error("failed to activate context");
|
||||||
|
}
|
||||||
|
|
||||||
|
return *m_context;
|
||||||
|
}
|
||||||
|
|
||||||
template<typename C, GLenum ObjectType, typename... CreateArgs>
|
template<typename C, GLenum ObjectType, typename... CreateArgs>
|
||||||
bool ContextObject<C, ObjectType, CreateArgs...>::IsValid() const
|
bool ContextObject<C, ObjectType, CreateArgs...>::IsValid() const
|
||||||
{
|
{
|
||||||
|
|
@ -72,17 +93,6 @@ namespace Nz::GL
|
||||||
if (m_context->glObjectLabel)
|
if (m_context->glObjectLabel)
|
||||||
m_context->glObjectLabel(ObjectType, m_objectId, name.size(), name.data());
|
m_context->glObjectLabel(ObjectType, m_objectId, name.size(), name.data());
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename C, GLenum ObjectType, typename... CreateArgs>
|
|
||||||
void ContextObject<C, ObjectType, CreateArgs...>::EnsureContext()
|
|
||||||
{
|
|
||||||
const Context* activeContext = Context::GetCurrentContext();
|
|
||||||
if (activeContext != m_context.Get())
|
|
||||||
{
|
|
||||||
if (!Context::SetCurrentContext(m_context.Get()))
|
|
||||||
throw std::runtime_error("failed to activate context");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#include <Nazara/OpenGLRenderer/DebugOff.hpp>
|
#include <Nazara/OpenGLRenderer/DebugOff.hpp>
|
||||||
|
|
|
||||||
|
|
@ -20,6 +20,7 @@ namespace Nz::GL
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
DeviceObject() = default;
|
DeviceObject() = default;
|
||||||
|
DeviceObject(OpenGLDevice& device, CreateArgs... args);
|
||||||
DeviceObject(const DeviceObject&) = delete;
|
DeviceObject(const DeviceObject&) = delete;
|
||||||
DeviceObject(DeviceObject&& object) noexcept = default;
|
DeviceObject(DeviceObject&& object) noexcept = default;
|
||||||
~DeviceObject();
|
~DeviceObject();
|
||||||
|
|
|
||||||
|
|
@ -4,12 +4,20 @@
|
||||||
|
|
||||||
#include <Nazara/OpenGLRenderer/Wrapper/DeviceObject.hpp>
|
#include <Nazara/OpenGLRenderer/Wrapper/DeviceObject.hpp>
|
||||||
#include <Nazara/Core/Error.hpp>
|
#include <Nazara/Core/Error.hpp>
|
||||||
|
#include <Nazara/Core/ErrorFlags.hpp>
|
||||||
#include <Nazara/OpenGLRenderer/OpenGLDevice.hpp>
|
#include <Nazara/OpenGLRenderer/OpenGLDevice.hpp>
|
||||||
#include <Nazara/OpenGLRenderer/Utils.hpp>
|
#include <Nazara/OpenGLRenderer/Utils.hpp>
|
||||||
#include <Nazara/OpenGLRenderer/Debug.hpp>
|
#include <Nazara/OpenGLRenderer/Debug.hpp>
|
||||||
|
|
||||||
namespace Nz::GL
|
namespace Nz::GL
|
||||||
{
|
{
|
||||||
|
template<typename C, GLenum ObjectType, typename... CreateArgs>
|
||||||
|
DeviceObject<C, ObjectType, CreateArgs...>::DeviceObject(OpenGLDevice& device, CreateArgs... args)
|
||||||
|
{
|
||||||
|
ErrorFlags errFlags(ErrorMode::ThrowException);
|
||||||
|
Create(device, args...);
|
||||||
|
}
|
||||||
|
|
||||||
template<typename C, GLenum ObjectType, typename... CreateArgs>
|
template<typename C, GLenum ObjectType, typename... CreateArgs>
|
||||||
DeviceObject<C, ObjectType, CreateArgs...>::~DeviceObject()
|
DeviceObject<C, ObjectType, CreateArgs...>::~DeviceObject()
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -19,7 +19,7 @@ namespace Nz::GL
|
||||||
friend DeviceObject;
|
friend DeviceObject;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
Program() = default;
|
using DeviceObject::DeviceObject;
|
||||||
Program(const Program&) = delete;
|
Program(const Program&) = delete;
|
||||||
Program(Program&&) noexcept = default;
|
Program(Program&&) noexcept = default;
|
||||||
~Program() = default;
|
~Program() = default;
|
||||||
|
|
|
||||||
|
|
@ -19,7 +19,7 @@ namespace Nz::GL
|
||||||
friend DeviceObject;
|
friend DeviceObject;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
Sampler() = default;
|
using DeviceObject::DeviceObject;
|
||||||
Sampler(const Sampler&) = delete;
|
Sampler(const Sampler&) = delete;
|
||||||
Sampler(Sampler&&) noexcept = default;
|
Sampler(Sampler&&) noexcept = default;
|
||||||
~Sampler() = default;
|
~Sampler() = default;
|
||||||
|
|
|
||||||
|
|
@ -19,7 +19,7 @@ namespace Nz::GL
|
||||||
friend DeviceObject;
|
friend DeviceObject;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
Shader() = default;
|
using DeviceObject::DeviceObject;
|
||||||
Shader(const Shader&) = delete;
|
Shader(const Shader&) = delete;
|
||||||
Shader(Shader&&) noexcept = default;
|
Shader(Shader&&) noexcept = default;
|
||||||
~Shader() = default;
|
~Shader() = default;
|
||||||
|
|
@ -30,6 +30,7 @@ namespace Nz::GL
|
||||||
|
|
||||||
inline void SetBinarySource(GLenum binaryFormat, const void* binary, GLsizei length);
|
inline void SetBinarySource(GLenum binaryFormat, const void* binary, GLsizei length);
|
||||||
inline void SetSource(const char* source, GLint length);
|
inline void SetSource(const char* source, GLint length);
|
||||||
|
inline void SetSource(const std::string_view& source);
|
||||||
|
|
||||||
// GL_ARB_gl_spirv
|
// GL_ARB_gl_spirv
|
||||||
inline void SpecializeShader(const GLchar* pEntryPoint, GLuint numSpecializationConstants, const GLuint* pConstantIndex, const GLuint* pConstantValue);
|
inline void SpecializeShader(const GLchar* pEntryPoint, GLuint numSpecializationConstants, const GLuint* pConstantIndex, const GLuint* pConstantValue);
|
||||||
|
|
|
||||||
|
|
@ -59,6 +59,11 @@ namespace Nz::GL
|
||||||
m_device->GetReferenceContext().glShaderSource(m_objectId, 1U, &source, &length);
|
m_device->GetReferenceContext().glShaderSource(m_objectId, 1U, &source, &length);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inline void Shader::SetSource(const std::string_view& source)
|
||||||
|
{
|
||||||
|
return SetSource(source.data(), GLint(source.size()));
|
||||||
|
}
|
||||||
|
|
||||||
inline void Shader::SpecializeShader(const GLchar* pEntryPoint, GLuint numSpecializationConstants, const GLuint* pConstantIndex, const GLuint* pConstantValue)
|
inline void Shader::SpecializeShader(const GLchar* pEntryPoint, GLuint numSpecializationConstants, const GLuint* pConstantIndex, const GLuint* pConstantValue)
|
||||||
{
|
{
|
||||||
assert(m_objectId);
|
assert(m_objectId);
|
||||||
|
|
|
||||||
|
|
@ -19,11 +19,13 @@ namespace Nz::GL
|
||||||
friend DeviceObject;
|
friend DeviceObject;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
Texture() = default;
|
using DeviceObject::DeviceObject;
|
||||||
Texture(const Texture&) = delete;
|
Texture(const Texture&) = delete;
|
||||||
Texture(Texture&&) noexcept = default;
|
Texture(Texture&&) noexcept = default;
|
||||||
~Texture() = default;
|
~Texture() = default;
|
||||||
|
|
||||||
|
inline TextureTarget GetTarget() const;
|
||||||
|
|
||||||
inline void SetParameterf(GLenum pname, GLfloat param);
|
inline void SetParameterf(GLenum pname, GLfloat param);
|
||||||
inline void SetParameteri(GLenum pname, GLint param);
|
inline void SetParameteri(GLenum pname, GLint param);
|
||||||
inline void SetParameterfv(GLenum pname, const GLfloat* param);
|
inline void SetParameterfv(GLenum pname, const GLfloat* param);
|
||||||
|
|
|
||||||
|
|
@ -8,6 +8,11 @@
|
||||||
|
|
||||||
namespace Nz::GL
|
namespace Nz::GL
|
||||||
{
|
{
|
||||||
|
inline TextureTarget Texture::GetTarget() const
|
||||||
|
{
|
||||||
|
return m_target;
|
||||||
|
}
|
||||||
|
|
||||||
inline void Texture::SetParameterf(GLenum pname, GLfloat param)
|
inline void Texture::SetParameterf(GLenum pname, GLfloat param)
|
||||||
{
|
{
|
||||||
assert(m_objectId);
|
assert(m_objectId);
|
||||||
|
|
|
||||||
|
|
@ -20,6 +20,9 @@ namespace Nz
|
||||||
if (!format)
|
if (!format)
|
||||||
throw std::runtime_error("unsupported texture format");
|
throw std::runtime_error("unsupported texture format");
|
||||||
|
|
||||||
|
const GL::Context& context = m_texture.EnsureDeviceContext();
|
||||||
|
context.ClearErrorStack();
|
||||||
|
|
||||||
switch (params.type)
|
switch (params.type)
|
||||||
{
|
{
|
||||||
case ImageType::E1D:
|
case ImageType::E1D:
|
||||||
|
|
@ -46,6 +49,9 @@ namespace Nz
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!context.DidLastCallSucceed())
|
||||||
|
throw std::runtime_error("failed to create texture");
|
||||||
|
|
||||||
m_texture.SetParameteri(GL_TEXTURE_MAX_LEVEL, m_params.mipmapLevel);
|
m_texture.SetParameteri(GL_TEXTURE_MAX_LEVEL, m_params.mipmapLevel);
|
||||||
m_texture.SetParameteri(GL_TEXTURE_SWIZZLE_R, format->swizzleR);
|
m_texture.SetParameteri(GL_TEXTURE_SWIZZLE_R, format->swizzleR);
|
||||||
m_texture.SetParameteri(GL_TEXTURE_SWIZZLE_G, format->swizzleG);
|
m_texture.SetParameteri(GL_TEXTURE_SWIZZLE_G, format->swizzleG);
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue