diff --git a/include/Nazara/OpenGLRenderer/OpenGLDevice.hpp b/include/Nazara/OpenGLRenderer/OpenGLDevice.hpp index a3de66041..d7dbafebd 100644 --- a/include/Nazara/OpenGLRenderer/OpenGLDevice.hpp +++ b/include/Nazara/OpenGLRenderer/OpenGLDevice.hpp @@ -49,7 +49,6 @@ namespace Nz bool IsTextureFormatSupported(PixelFormat format, TextureUsage usage) const override; inline void NotifyBufferDestruction(GLuint buffer) const; - inline void NotifyFramebufferDestruction(GLuint fbo) const; inline void NotifyProgramDestruction(GLuint program) const; inline void NotifySamplerDestruction(GLuint sampler) const; inline void NotifyTextureDestruction(GLuint texture) const; diff --git a/include/Nazara/OpenGLRenderer/OpenGLDevice.inl b/include/Nazara/OpenGLRenderer/OpenGLDevice.inl index e995edbb9..a9c823a7e 100644 --- a/include/Nazara/OpenGLRenderer/OpenGLDevice.inl +++ b/include/Nazara/OpenGLRenderer/OpenGLDevice.inl @@ -18,12 +18,6 @@ namespace Nz context->NotifyBufferDestruction(buffer); } - inline void OpenGLDevice::NotifyFramebufferDestruction(GLuint fbo) const - { - for (const GL::Context* context : m_contexts) - context->NotifyFramebufferDestruction(fbo); - } - inline void OpenGLDevice::NotifyProgramDestruction(GLuint program) const { for (const GL::Context* context : m_contexts) diff --git a/include/Nazara/OpenGLRenderer/Wrapper/Context.hpp b/include/Nazara/OpenGLRenderer/Wrapper/Context.hpp index 303aab549..67e305f4a 100644 --- a/include/Nazara/OpenGLRenderer/Wrapper/Context.hpp +++ b/include/Nazara/OpenGLRenderer/Wrapper/Context.hpp @@ -111,7 +111,7 @@ namespace Nz::GL virtual ~Context(); void BindBuffer(BufferTarget target, GLuint buffer, bool force = false) const; - void BindFramebuffer(GLuint fbo) const; + GLenum BindFramebuffer(GLuint fbo) const; void BindFramebuffer(FramebufferTarget target, GLuint fbo) const; void BindProgram(GLuint program) const; void BindSampler(UInt32 textureUnit, GLuint sampler) const; diff --git a/include/Nazara/OpenGLRenderer/Wrapper/Framebuffer.hpp b/include/Nazara/OpenGLRenderer/Wrapper/Framebuffer.hpp index 4d9c27ad1..26c337688 100644 --- a/include/Nazara/OpenGLRenderer/Wrapper/Framebuffer.hpp +++ b/include/Nazara/OpenGLRenderer/Wrapper/Framebuffer.hpp @@ -8,16 +8,16 @@ #define NAZARA_OPENGLRENDERER_GLFRAMEBUFFER_HPP #include -#include +#include namespace Nz::GL { - class Framebuffer : public DeviceObject + class Framebuffer : public ContextObject { - friend DeviceObject; + friend ContextObject; public: - Framebuffer() = default; + using ContextObject::ContextObject; Framebuffer(const Framebuffer&) = delete; Framebuffer(Framebuffer&&) noexcept = default; ~Framebuffer() = default; @@ -31,8 +31,8 @@ namespace Nz::GL Framebuffer& operator=(Framebuffer&&) noexcept = default; private: - static inline GLuint CreateHelper(OpenGLDevice& device, const Context& context); - static inline void DestroyHelper(OpenGLDevice& device, const Context& context, GLuint objectId); + static inline GLuint CreateHelper(const Context& context); + static inline void DestroyHelper(const Context& context, GLuint objectId); }; } diff --git a/include/Nazara/OpenGLRenderer/Wrapper/Framebuffer.inl b/include/Nazara/OpenGLRenderer/Wrapper/Framebuffer.inl index 54017a96a..3d4d6d4b0 100644 --- a/include/Nazara/OpenGLRenderer/Wrapper/Framebuffer.inl +++ b/include/Nazara/OpenGLRenderer/Wrapper/Framebuffer.inl @@ -12,30 +12,30 @@ namespace Nz::GL { assert(m_objectId); - const Context& context = EnsureDeviceContext(); - context.BindFramebuffer(m_objectId); - return context.glCheckFramebufferStatus(GL_FRAMEBUFFER); + const Context& context = EnsureContext(); + GLenum target = context.BindFramebuffer(m_objectId); + return context.glCheckFramebufferStatus(target); } inline void Framebuffer::Renderbuffer(GLenum attachment, GLenum renderbuffer) { assert(m_objectId); - const Context& context = EnsureDeviceContext(); - context.BindFramebuffer(m_objectId); - context.glFramebufferRenderbuffer(GL_FRAMEBUFFER, attachment, GL_RENDERBUFFER, renderbuffer); + const Context& context = EnsureContext(); + GLenum target = context.BindFramebuffer(m_objectId); + context.glFramebufferRenderbuffer(target, attachment, GL_RENDERBUFFER, renderbuffer); } inline void Framebuffer::Texture2D(GLenum attachment, GLenum textarget, GLuint texture, GLint level) { assert(m_objectId); - const Context& context = EnsureDeviceContext(); - context.BindFramebuffer(m_objectId); - context.glFramebufferTexture2D(GL_FRAMEBUFFER, attachment, textarget, texture, level); + const Context& context = EnsureContext(); + GLenum target = context.BindFramebuffer(m_objectId); + context.glFramebufferTexture2D(target, attachment, textarget, texture, level); } - inline GLuint Framebuffer::CreateHelper(OpenGLDevice& /*device*/, const Context& context) + inline GLuint Framebuffer::CreateHelper(const Context& context) { GLuint fbo = 0; context.glGenFramebuffers(1U, &fbo); @@ -43,11 +43,11 @@ namespace Nz::GL return fbo; } - inline void Framebuffer::DestroyHelper(OpenGLDevice& device, const Context& context, GLuint objectId) + inline void Framebuffer::DestroyHelper(const Context& context, GLuint objectId) { context.glDeleteFramebuffers(1U, &objectId); - device.NotifyFramebufferDestruction(objectId); + context.NotifyFramebufferDestruction(objectId); } } diff --git a/src/Nazara/OpenGLRenderer/OpenGLFboFramebuffer.cpp b/src/Nazara/OpenGLRenderer/OpenGLFboFramebuffer.cpp index e28012c2f..01d373f01 100644 --- a/src/Nazara/OpenGLRenderer/OpenGLFboFramebuffer.cpp +++ b/src/Nazara/OpenGLRenderer/OpenGLFboFramebuffer.cpp @@ -13,7 +13,7 @@ namespace Nz OpenGLFboFramebuffer::OpenGLFboFramebuffer(OpenGLDevice& device, const std::vector>& attachments) : OpenGLFramebuffer(FramebufferType::Texture) { - if (!m_framebuffer.Create(device)) + if (!m_framebuffer.Create(device.GetReferenceContext())) throw std::runtime_error("failed to create framebuffer object"); std::size_t colorAttachmentCount = 0; @@ -80,7 +80,7 @@ namespace Nz void OpenGLFboFramebuffer::Activate() const { - const GL::Context& context = m_framebuffer.EnsureDeviceContext(); + const GL::Context& context = m_framebuffer.EnsureContext(); context.BindFramebuffer(GL::FramebufferTarget::Draw, m_framebuffer.GetObjectId()); } diff --git a/src/Nazara/OpenGLRenderer/Utils_OpenGLRenderer.cpp b/src/Nazara/OpenGLRenderer/Utils_OpenGLRenderer.cpp index 35af067e2..9e77cce70 100644 --- a/src/Nazara/OpenGLRenderer/Utils_OpenGLRenderer.cpp +++ b/src/Nazara/OpenGLRenderer/Utils_OpenGLRenderer.cpp @@ -12,35 +12,23 @@ namespace Nz switch (code) { // OpenGL/OpenGL ES error codes - case GL_INVALID_ENUM: - return "an unacceptable value is specified for an enumerated argument"; - break; + case GL_INVALID_ENUM: return "GL_INVALID_ENUM: an unacceptable value is specified for an enumerated argument"; + case GL_INVALID_VALUE: return "GL_INVALID_VALUE: a numeric argument is out of range"; + case GL_INVALID_OPERATION: return "GL_INVALID_OPERATION: the specified operation is not allowed in the current state"; + case GL_INVALID_FRAMEBUFFER_OPERATION: return "GL_INVALID_FRAMEBUFFER_OPERATION: the framebuffer object is not complete"; + case GL_OUT_OF_MEMORY: return "GL_OUT_OF_MEMORY: there is not enough memory left to execute the command"; - case GL_INVALID_VALUE: - return "a numeric argument is out of range"; - break; - - case GL_INVALID_OPERATION: - return "the specified operation is not allowed in the current state"; - break; - - case GL_INVALID_FRAMEBUFFER_OPERATION: - return "the framebuffer object is not complete"; - break; - - case GL_OUT_OF_MEMORY: - return "there is not enough memory left to execute the command"; - break; - - // OpenGL error codes - case GL_STACK_UNDERFLOW: - return "an attempt has been made to perform an operation that would cause an internal stack to underflow."; - break; - - case GL_STACK_OVERFLOW: - return "an attempt has been made to perform an operation that would cause an internal stack to overflow."; - break; + // OpenGL error codes + case GL_STACK_UNDERFLOW: return "GL_STACK_UNDERFLOW: an attempt has been made to perform an operation that would cause an internal stack to underflow"; + case GL_STACK_OVERFLOW: return "GL_STACK_OVERFLOW: an attempt has been made to perform an operation that would cause an internal stack to overflow"; + // Framebuffer error codes + case GL_FRAMEBUFFER_UNDEFINED: return "GL_FRAMEBUFFER_UNDEFINED: default framebuffer does not exist"; + case GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT: return "GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT: some framebuffer attachment points are incomplete"; + case GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT: return "GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT: framebuffer has no image attached to it"; + case GL_FRAMEBUFFER_UNSUPPORTED: return "GL_FRAMEBUFFER_UNSUPPORTED: framebuffer internal formats violates an implementation-dependent set of restrictions"; + case GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE: return "GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE: framebuffer mixes multiple samples size for attachements"; + case GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS: return "GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS: a framebuffer attachment is layered and a populated attachment is not (or color attachements are not from textures of the same target)"; } return "Unknown OpenGL error (0x" + NumberToString(code, 16) + ')'; diff --git a/src/Nazara/OpenGLRenderer/Wrapper/Context.cpp b/src/Nazara/OpenGLRenderer/Wrapper/Context.cpp index c68f756d8..adcde76e7 100644 --- a/src/Nazara/OpenGLRenderer/Wrapper/Context.cpp +++ b/src/Nazara/OpenGLRenderer/Wrapper/Context.cpp @@ -118,9 +118,13 @@ namespace Nz::GL } } - void Context::BindFramebuffer(GLuint fbo) const + GLenum Context::BindFramebuffer(GLuint fbo) const { - if (m_state.boundDrawFBO != fbo || m_state.boundReadFBO != fbo) + if (m_state.boundDrawFBO == fbo) + return GL_DRAW_FRAMEBUFFER; + else if (m_state.boundReadFBO == fbo) + return GL_READ_FRAMEBUFFER; + else { if (!SetCurrentContext(this)) throw std::runtime_error("failed to activate context"); @@ -128,6 +132,7 @@ namespace Nz::GL glBindFramebuffer(GL_FRAMEBUFFER, fbo); m_state.boundDrawFBO = fbo; m_state.boundReadFBO = fbo; + return GL_FRAMEBUFFER; } }