diff --git a/include/Nazara/OpenGLRenderer/Wrapper/Buffer.hpp b/include/Nazara/OpenGLRenderer/Wrapper/Buffer.hpp index 34e897bf9..84fe50299 100644 --- a/include/Nazara/OpenGLRenderer/Wrapper/Buffer.hpp +++ b/include/Nazara/OpenGLRenderer/Wrapper/Buffer.hpp @@ -19,7 +19,7 @@ namespace Nz::GL friend DeviceObject; public: - Buffer() = default; + using DeviceObject::DeviceObject; Buffer(const Buffer&) = delete; Buffer(Buffer&&) noexcept = default; ~Buffer() = default; diff --git a/include/Nazara/OpenGLRenderer/Wrapper/ContextObject.hpp b/include/Nazara/OpenGLRenderer/Wrapper/ContextObject.hpp index cc5d0d4af..09add77aa 100644 --- a/include/Nazara/OpenGLRenderer/Wrapper/ContextObject.hpp +++ b/include/Nazara/OpenGLRenderer/Wrapper/ContextObject.hpp @@ -19,6 +19,7 @@ namespace Nz::GL { public: ContextObject() = default; + ContextObject(const Context& context, CreateArgs... args); ContextObject(const ContextObject&) = delete; ContextObject(ContextObject&& object) noexcept = default; ~ContextObject(); @@ -26,6 +27,8 @@ namespace Nz::GL bool Create(const Context& context, CreateArgs... args); void Destroy(); + const Context& EnsureContext() const; + bool IsValid() const; const Context* GetContext() const; @@ -39,8 +42,6 @@ namespace Nz::GL static constexpr GLuint InvalidObject = 0; protected: - void EnsureContext(); - MovablePtr m_context; MovableValue m_objectId; }; diff --git a/include/Nazara/OpenGLRenderer/Wrapper/ContextObject.inl b/include/Nazara/OpenGLRenderer/Wrapper/ContextObject.inl index a48a71a94..cf177b833 100644 --- a/include/Nazara/OpenGLRenderer/Wrapper/ContextObject.inl +++ b/include/Nazara/OpenGLRenderer/Wrapper/ContextObject.inl @@ -4,11 +4,19 @@ #include #include +#include #include #include namespace Nz::GL { + template + ContextObject::ContextObject(const Context& context, CreateArgs... args) + { + ErrorFlags errFlags(ErrorMode::ThrowException); + Create(context, args...); + } + template ContextObject::~ContextObject() { @@ -46,6 +54,19 @@ namespace Nz::GL } } + template + const Context& ContextObject::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 bool ContextObject::IsValid() const { @@ -72,17 +93,6 @@ namespace Nz::GL if (m_context->glObjectLabel) m_context->glObjectLabel(ObjectType, m_objectId, name.size(), name.data()); } - - template - void ContextObject::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 diff --git a/include/Nazara/OpenGLRenderer/Wrapper/DeviceObject.hpp b/include/Nazara/OpenGLRenderer/Wrapper/DeviceObject.hpp index 9f7063875..4036fbdf3 100644 --- a/include/Nazara/OpenGLRenderer/Wrapper/DeviceObject.hpp +++ b/include/Nazara/OpenGLRenderer/Wrapper/DeviceObject.hpp @@ -20,6 +20,7 @@ namespace Nz::GL { public: DeviceObject() = default; + DeviceObject(OpenGLDevice& device, CreateArgs... args); DeviceObject(const DeviceObject&) = delete; DeviceObject(DeviceObject&& object) noexcept = default; ~DeviceObject(); diff --git a/include/Nazara/OpenGLRenderer/Wrapper/DeviceObject.inl b/include/Nazara/OpenGLRenderer/Wrapper/DeviceObject.inl index 9bd7ad465..563c5e725 100644 --- a/include/Nazara/OpenGLRenderer/Wrapper/DeviceObject.inl +++ b/include/Nazara/OpenGLRenderer/Wrapper/DeviceObject.inl @@ -4,12 +4,20 @@ #include #include +#include #include #include #include namespace Nz::GL { + template + DeviceObject::DeviceObject(OpenGLDevice& device, CreateArgs... args) + { + ErrorFlags errFlags(ErrorMode::ThrowException); + Create(device, args...); + } + template DeviceObject::~DeviceObject() { diff --git a/include/Nazara/OpenGLRenderer/Wrapper/Program.hpp b/include/Nazara/OpenGLRenderer/Wrapper/Program.hpp index 199c1d51b..51e774b0b 100644 --- a/include/Nazara/OpenGLRenderer/Wrapper/Program.hpp +++ b/include/Nazara/OpenGLRenderer/Wrapper/Program.hpp @@ -19,7 +19,7 @@ namespace Nz::GL friend DeviceObject; public: - Program() = default; + using DeviceObject::DeviceObject; Program(const Program&) = delete; Program(Program&&) noexcept = default; ~Program() = default; diff --git a/include/Nazara/OpenGLRenderer/Wrapper/Sampler.hpp b/include/Nazara/OpenGLRenderer/Wrapper/Sampler.hpp index 38fd5b542..3642411d5 100644 --- a/include/Nazara/OpenGLRenderer/Wrapper/Sampler.hpp +++ b/include/Nazara/OpenGLRenderer/Wrapper/Sampler.hpp @@ -19,7 +19,7 @@ namespace Nz::GL friend DeviceObject; public: - Sampler() = default; + using DeviceObject::DeviceObject; Sampler(const Sampler&) = delete; Sampler(Sampler&&) noexcept = default; ~Sampler() = default; diff --git a/include/Nazara/OpenGLRenderer/Wrapper/Shader.hpp b/include/Nazara/OpenGLRenderer/Wrapper/Shader.hpp index b99e752fa..cbb999576 100644 --- a/include/Nazara/OpenGLRenderer/Wrapper/Shader.hpp +++ b/include/Nazara/OpenGLRenderer/Wrapper/Shader.hpp @@ -19,7 +19,7 @@ namespace Nz::GL friend DeviceObject; public: - Shader() = default; + using DeviceObject::DeviceObject; Shader(const Shader&) = delete; Shader(Shader&&) noexcept = default; ~Shader() = default; @@ -30,6 +30,7 @@ namespace Nz::GL inline void SetBinarySource(GLenum binaryFormat, const void* binary, GLsizei length); inline void SetSource(const char* source, GLint length); + inline void SetSource(const std::string_view& source); // GL_ARB_gl_spirv inline void SpecializeShader(const GLchar* pEntryPoint, GLuint numSpecializationConstants, const GLuint* pConstantIndex, const GLuint* pConstantValue); diff --git a/include/Nazara/OpenGLRenderer/Wrapper/Shader.inl b/include/Nazara/OpenGLRenderer/Wrapper/Shader.inl index f73421706..764e6db91 100644 --- a/include/Nazara/OpenGLRenderer/Wrapper/Shader.inl +++ b/include/Nazara/OpenGLRenderer/Wrapper/Shader.inl @@ -59,6 +59,11 @@ namespace Nz::GL 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) { assert(m_objectId); diff --git a/include/Nazara/OpenGLRenderer/Wrapper/Texture.hpp b/include/Nazara/OpenGLRenderer/Wrapper/Texture.hpp index e27392d08..a007dc07b 100644 --- a/include/Nazara/OpenGLRenderer/Wrapper/Texture.hpp +++ b/include/Nazara/OpenGLRenderer/Wrapper/Texture.hpp @@ -19,11 +19,13 @@ namespace Nz::GL friend DeviceObject; public: - Texture() = default; + using DeviceObject::DeviceObject; Texture(const Texture&) = delete; Texture(Texture&&) noexcept = default; ~Texture() = default; + inline TextureTarget GetTarget() const; + inline void SetParameterf(GLenum pname, GLfloat param); inline void SetParameteri(GLenum pname, GLint param); inline void SetParameterfv(GLenum pname, const GLfloat* param); diff --git a/include/Nazara/OpenGLRenderer/Wrapper/Texture.inl b/include/Nazara/OpenGLRenderer/Wrapper/Texture.inl index eb3e4f778..b40bc73b5 100644 --- a/include/Nazara/OpenGLRenderer/Wrapper/Texture.inl +++ b/include/Nazara/OpenGLRenderer/Wrapper/Texture.inl @@ -8,6 +8,11 @@ namespace Nz::GL { + inline TextureTarget Texture::GetTarget() const + { + return m_target; + } + inline void Texture::SetParameterf(GLenum pname, GLfloat param) { assert(m_objectId); diff --git a/src/Nazara/OpenGLRenderer/OpenGLTexture.cpp b/src/Nazara/OpenGLRenderer/OpenGLTexture.cpp index e08410ade..98436cbee 100644 --- a/src/Nazara/OpenGLRenderer/OpenGLTexture.cpp +++ b/src/Nazara/OpenGLRenderer/OpenGLTexture.cpp @@ -20,6 +20,9 @@ namespace Nz if (!format) throw std::runtime_error("unsupported texture format"); + const GL::Context& context = m_texture.EnsureDeviceContext(); + context.ClearErrorStack(); + switch (params.type) { case ImageType::E1D: @@ -46,6 +49,9 @@ namespace Nz 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_SWIZZLE_R, format->swizzleR); m_texture.SetParameteri(GL_TEXTURE_SWIZZLE_G, format->swizzleG);