diff --git a/include/Nazara/OpenGLRenderer/OpenGLRenderWindow.hpp b/include/Nazara/OpenGLRenderer/OpenGLRenderWindow.hpp index fde356958..9fdb69561 100644 --- a/include/Nazara/OpenGLRenderer/OpenGLRenderWindow.hpp +++ b/include/Nazara/OpenGLRenderer/OpenGLRenderWindow.hpp @@ -31,6 +31,7 @@ namespace Nz bool Create(RendererImpl* renderer, RenderSurface* surface, const Vector2ui& size, const RenderWindowParameters& parameters) override; std::unique_ptr CreateCommandPool(QueueType queueType) override; + inline GL::Context& GetContext(); const OpenGLFramebuffer& GetFramebuffer() const override; const OpenGLRenderPass& GetRenderPass() const override; diff --git a/include/Nazara/OpenGLRenderer/OpenGLRenderWindow.inl b/include/Nazara/OpenGLRenderer/OpenGLRenderWindow.inl index ba24c776a..25c95ac05 100644 --- a/include/Nazara/OpenGLRenderer/OpenGLRenderWindow.inl +++ b/include/Nazara/OpenGLRenderer/OpenGLRenderWindow.inl @@ -3,10 +3,16 @@ // For conditions of distribution and use, see copyright notice in Config.hpp #include +#include #include namespace Nz { + inline GL::Context& OpenGLRenderWindow::GetContext() + { + assert(m_context); + return *m_context; + } } #include diff --git a/include/Nazara/OpenGLRenderer/Utils.hpp b/include/Nazara/OpenGLRenderer/Utils.hpp index 593c59f9a..55f1d6cff 100644 --- a/include/Nazara/OpenGLRenderer/Utils.hpp +++ b/include/Nazara/OpenGLRenderer/Utils.hpp @@ -16,10 +16,13 @@ namespace Nz { + inline GLenum ToOpenGL(BlendFunc blendFunc); + inline GLenum ToOpenGL(FaceSide filter); inline GLenum ToOpenGL(SamplerFilter filter); inline GLenum ToOpenGL(SamplerFilter minFilter, SamplerMipmapMode mipmapFilter); inline GLenum ToOpenGL(SamplerWrap wrapMode); inline GLenum ToOpenGL(ShaderStageType stageType); + inline GLenum ToOpenGL(StencilOperation stencilOp); inline GLenum ToOpenGL(GL::BufferTarget bufferTarget); inline GLenum ToOpenGL(GL::TextureTarget bufferTarget); diff --git a/include/Nazara/OpenGLRenderer/Utils.inl b/include/Nazara/OpenGLRenderer/Utils.inl index 890b2f88e..6d64a18ec 100644 --- a/include/Nazara/OpenGLRenderer/Utils.inl +++ b/include/Nazara/OpenGLRenderer/Utils.inl @@ -10,7 +10,61 @@ namespace Nz { - GLenum ToOpenGL(SamplerFilter filter) + inline GLenum ToOpenGL(BlendFunc blendFunc) + { + switch (blendFunc) + { + case BlendFunc_DestAlpha: return GL_DST_ALPHA; + case BlendFunc_DestColor: return GL_DST_COLOR; + case BlendFunc_SrcAlpha: return GL_SRC_ALPHA; + case BlendFunc_SrcColor: return GL_SRC_COLOR; + case BlendFunc_InvDestAlpha: return GL_ONE_MINUS_DST_ALPHA; + case BlendFunc_InvDestColor: return GL_ONE_MINUS_DST_COLOR; + case BlendFunc_InvSrcAlpha: return GL_ONE_MINUS_SRC_ALPHA; + case BlendFunc_InvSrcColor: return GL_ONE_MINUS_SRC_COLOR; + case BlendFunc_One: return GL_ONE; + case BlendFunc_Zero: return GL_ZERO; + } + + NazaraError("Unhandled BlendFunc 0x" + String::Number(UnderlyingCast(blendFunc), 16)); + return {}; + } + + inline GLenum ToOpenGL(FaceSide filter) + { + switch (filter) + { + case FaceSide_None: + break; + + case FaceSide_Back: return GL_BACK; + case FaceSide_Front: return GL_FRONT; + case FaceSide_FrontAndBack: return GL_FRONT_AND_BACK; + } + + NazaraError("Unhandled FaceSide 0x" + String::Number(UnderlyingCast(filter), 16)); + return {}; + } + + inline GLenum ToOpenGL(RendererComparison comparison) + { + switch (comparison) + { + case RendererComparison_Always: return GL_ALWAYS; + case RendererComparison_Equal: return GL_EQUAL; + case RendererComparison_Greater: return GL_GREATER; + case RendererComparison_GreaterOrEqual: return GL_GEQUAL; + case RendererComparison_Less: return GL_LESS; + case RendererComparison_LessOrEqual: return GL_LEQUAL; + case RendererComparison_Never: return GL_NEVER; + case RendererComparison_NotEqual: return GL_NOTEQUAL; + } + + NazaraError("Unhandled RendererComparison 0x" + String::Number(UnderlyingCast(comparison), 16)); + return {}; + } + + inline GLenum ToOpenGL(SamplerFilter filter) { switch (filter) { @@ -22,7 +76,7 @@ namespace Nz return {}; } - GLenum ToOpenGL(SamplerFilter minFilter, SamplerMipmapMode mipmapFilter) + inline GLenum ToOpenGL(SamplerFilter minFilter, SamplerMipmapMode mipmapFilter) { switch (minFilter) { @@ -55,7 +109,7 @@ namespace Nz return {}; } - GLenum ToOpenGL(SamplerWrap wrapMode) + inline GLenum ToOpenGL(SamplerWrap wrapMode) { switch (wrapMode) { @@ -68,7 +122,7 @@ namespace Nz return {}; } - GLenum ToOpenGL(ShaderStageType stageType) + inline GLenum ToOpenGL(ShaderStageType stageType) { switch (stageType) { @@ -80,7 +134,25 @@ namespace Nz return {}; } - GLenum ToOpenGL(GL::BufferTarget bufferTarget) + inline GLenum ToOpenGL(StencilOperation stencilOp) + { + switch (stencilOp) + { + case StencilOperation_Decrement: return GL_DECR; + case StencilOperation_DecrementNoClamp: return GL_DECR_WRAP; + case StencilOperation_Increment: return GL_INCR; + case StencilOperation_IncrementNoClamp: return GL_INCR_WRAP; + case StencilOperation_Invert: return GL_INVERT; + case StencilOperation_Keep: return GL_KEEP; + case StencilOperation_Replace: return GL_REPLACE; + case StencilOperation_Zero: return GL_ZERO; + } + + NazaraError("Unhandled StencilOperation 0x" + String::Number(UnderlyingCast(stencilOp), 16)); + return {}; + } + + inline GLenum ToOpenGL(GL::BufferTarget bufferTarget) { switch (bufferTarget) { @@ -98,7 +170,7 @@ namespace Nz return {}; } - GLenum ToOpenGL(GL::TextureTarget textureTarget) + inline GLenum ToOpenGL(GL::TextureTarget textureTarget) { switch (textureTarget) { diff --git a/include/Nazara/OpenGLRenderer/Wrapper/CoreFunctions.hpp b/include/Nazara/OpenGLRenderer/Wrapper/CoreFunctions.hpp index 8898ea174..1996b8e4f 100644 --- a/include/Nazara/OpenGLRenderer/Wrapper/CoreFunctions.hpp +++ b/include/Nazara/OpenGLRenderer/Wrapper/CoreFunctions.hpp @@ -23,6 +23,7 @@ typedef void (GL_APIENTRYP PFNGLSPECIALIZESHADERARBPROC) (GLuint shader, const G cb(glBeginQuery, PFNGLBEGINQUERYPROC) \ cb(glBindAttribLocation, PFNGLBINDATTRIBLOCATIONPROC) \ cb(glBindBuffer, PFNGLBINDBUFFERPROC) \ + cb(glBindBufferRange, PFNGLBINDBUFFERRANGEPROC) \ cb(glBindFramebuffer, PFNGLBINDFRAMEBUFFERPROC) \ cb(glBindRenderbuffer, PFNGLBINDRENDERBUFFERPROC) \ cb(glBindSampler, PFNGLBINDSAMPLERPROC) \ @@ -43,9 +44,10 @@ typedef void (GL_APIENTRYP PFNGLSPECIALIZESHADERARBPROC) (GLuint shader, const G cb(glColorMask, PFNGLCOLORMASKPROC) \ cb(glCompressedTexSubImage2D, PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC) \ cb(glCompressedTexSubImage3D, PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC) \ - cb(glCullFace, PFNGLCULLFACEPROC) \ cb(glCompileShader, PFNGLCOMPILESHADERPROC) \ + cb(glCopyBufferSubData, PFNGLCOPYBUFFERSUBDATAPROC) \ cb(glCopyTexSubImage2D, PFNGLCOPYTEXSUBIMAGE2DPROC) \ + cb(glCullFace, PFNGLCULLFACEPROC) \ cb(glDeleteBuffers, PFNGLDELETEBUFFERSPROC) \ cb(glDeleteFramebuffers, PFNGLDELETEFRAMEBUFFERSPROC) \ cb(glDeleteProgram, PFNGLDELETEPROGRAMPROC) \ @@ -123,7 +125,9 @@ typedef void (GL_APIENTRYP PFNGLSPECIALIZESHADERARBPROC) (GLuint shader, const G cb(glTexImage2D, PFNGLTEXIMAGE2DPROC) \ cb(glTexImage3D, PFNGLTEXIMAGE3DPROC) \ cb(glTexParameterf, PFNGLTEXPARAMETERFPROC) \ + cb(glTexParameterfv, PFNGLTEXPARAMETERFVPROC) \ cb(glTexParameteri, PFNGLTEXPARAMETERIPROC) \ + cb(glTexParameteriv, PFNGLTEXPARAMETERIVPROC) \ cb(glTexStorage2D, PFNGLTEXSTORAGE2DPROC) \ cb(glTexStorage3D, PFNGLTEXSTORAGE3DPROC) \ cb(glTexSubImage2D, PFNGLTEXSUBIMAGE2DPROC) \ diff --git a/include/Nazara/OpenGLRenderer/Wrapper/Program.hpp b/include/Nazara/OpenGLRenderer/Wrapper/Program.hpp index 5bdae0efc..6acc1eb7b 100644 --- a/include/Nazara/OpenGLRenderer/Wrapper/Program.hpp +++ b/include/Nazara/OpenGLRenderer/Wrapper/Program.hpp @@ -4,8 +4,8 @@ #pragma once -#ifndef NAZARA_OPENGLRENDERER_GLSHADER_HPP -#define NAZARA_OPENGLRENDERER_GLSHADER_HPP +#ifndef NAZARA_OPENGLRENDERER_GLPROGRAM_HPP +#define NAZARA_OPENGLRENDERER_GLPROGRAM_HPP #include #include diff --git a/include/Nazara/OpenGLRenderer/Wrapper/Texture.hpp b/include/Nazara/OpenGLRenderer/Wrapper/Texture.hpp index 1e6198146..12b3e5c08 100644 --- a/include/Nazara/OpenGLRenderer/Wrapper/Texture.hpp +++ b/include/Nazara/OpenGLRenderer/Wrapper/Texture.hpp @@ -24,6 +24,11 @@ namespace Nz::GL Texture(Texture&&) noexcept = default; ~Texture() = default; + inline void SetParameterf(GLenum pname, GLfloat param); + inline void SetParameteri(GLenum pname, GLint param); + inline void SetParameterfv(GLenum pname, const GLfloat* param); + inline void SetParameteriv(GLenum pname, const GLint* param); + inline void TexImage2D(GLint level, GLint internalFormat, GLsizei width, GLsizei height, GLint border); inline void TexImage2D(GLint level, GLint internalFormat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void* data); inline void TexSubImage2D(GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void* data); diff --git a/include/Nazara/OpenGLRenderer/Wrapper/Texture.inl b/include/Nazara/OpenGLRenderer/Wrapper/Texture.inl index 14ef42866..b63dcb0fe 100644 --- a/include/Nazara/OpenGLRenderer/Wrapper/Texture.inl +++ b/include/Nazara/OpenGLRenderer/Wrapper/Texture.inl @@ -8,6 +8,38 @@ namespace Nz::GL { + inline void Texture::SetParameterf(GLenum pname, GLfloat param) + { + assert(m_objectId); + + const Context& context = EnsureDeviceContext(); + context.glTexParameterf(m_objectId, pname, param); + } + + inline void Texture::SetParameteri(GLenum pname, GLint param) + { + assert(m_objectId); + + const Context& context = EnsureDeviceContext(); + context.glTexParameteri(m_objectId, pname, param); + } + + inline void Texture::SetParameterfv(GLenum pname, const GLfloat* param) + { + assert(m_objectId); + + const Context& context = EnsureDeviceContext(); + context.glTexParameterfv(m_objectId, pname, param); + } + + inline void Texture::SetParameteriv(GLenum pname, const GLint* param) + { + assert(m_objectId); + + const Context& context = EnsureDeviceContext(); + context.glTexParameteriv(m_objectId, pname, param); + } + inline void Texture::TexImage2D(GLint level, GLint internalFormat, GLsizei width, GLsizei height, GLint border) { return TexImage2D(level, internalFormat, width, height, border, GL_RGB, GL_UNSIGNED_BYTE, nullptr); diff --git a/include/Nazara/Renderer/RenderBufferView.hpp b/include/Nazara/Renderer/RenderBufferView.hpp index f653866eb..4f606b630 100644 --- a/include/Nazara/Renderer/RenderBufferView.hpp +++ b/include/Nazara/Renderer/RenderBufferView.hpp @@ -18,7 +18,7 @@ namespace Nz public: inline RenderBufferView(AbstractBuffer* buffer); inline RenderBufferView(AbstractBuffer* buffer, UInt64 offset, UInt64 size); - RenderBufferView(const RenderBufferView&) = delete; + RenderBufferView(const RenderBufferView&) = default; RenderBufferView(RenderBufferView&&) = default; ~RenderBufferView() = default; @@ -26,7 +26,7 @@ namespace Nz inline UInt64 GetOffset() const; inline UInt64 GetSize() const; - RenderBufferView& operator=(const RenderBufferView&) = delete; + RenderBufferView& operator=(const RenderBufferView&) = default; RenderBufferView& operator=(RenderBufferView&&) = default; private: diff --git a/include/Nazara/Renderer/UploadPool.hpp b/include/Nazara/Renderer/UploadPool.hpp index 85368e413..5127a192d 100644 --- a/include/Nazara/Renderer/UploadPool.hpp +++ b/include/Nazara/Renderer/UploadPool.hpp @@ -41,7 +41,6 @@ namespace Nz Allocation& operator=(Allocation&&) = default; void* mappedPtr; - UInt64 offset; UInt64 size; }; }; diff --git a/include/Nazara/VulkanRenderer/Utils.inl b/include/Nazara/VulkanRenderer/Utils.inl index a843b67f5..616680324 100644 --- a/include/Nazara/VulkanRenderer/Utils.inl +++ b/include/Nazara/VulkanRenderer/Utils.inl @@ -10,7 +10,7 @@ namespace Nz { - VkBufferUsageFlags ToVulkan(BufferType bufferType) + inline VkBufferUsageFlags ToVulkan(BufferType bufferType) { switch (bufferType) { @@ -23,7 +23,7 @@ namespace Nz return 0; } - VkFormat ToVulkan(ComponentType componentType) + inline VkFormat ToVulkan(ComponentType componentType) { switch (componentType) { @@ -47,7 +47,7 @@ namespace Nz return VK_FORMAT_UNDEFINED; } - VkCullModeFlagBits ToVulkan(FaceSide faceSide) + inline VkCullModeFlagBits ToVulkan(FaceSide faceSide) { switch (faceSide) { @@ -74,7 +74,7 @@ namespace Nz return VK_POLYGON_MODE_FILL; } - VkPrimitiveTopology ToVulkan(PrimitiveMode primitiveMode) + inline VkPrimitiveTopology ToVulkan(PrimitiveMode primitiveMode) { switch (primitiveMode) { @@ -108,7 +108,7 @@ namespace Nz return VK_COMPARE_OP_NEVER; } - VkFilter ToVulkan(SamplerFilter samplerFilter) + inline VkFilter ToVulkan(SamplerFilter samplerFilter) { switch (samplerFilter) { @@ -120,7 +120,7 @@ namespace Nz return VK_FILTER_NEAREST; } - VkSamplerMipmapMode ToVulkan(SamplerMipmapMode samplerMipmap) + inline VkSamplerMipmapMode ToVulkan(SamplerMipmapMode samplerMipmap) { switch (samplerMipmap) { @@ -132,7 +132,7 @@ namespace Nz return VK_SAMPLER_MIPMAP_MODE_NEAREST; } - VkSamplerAddressMode ToVulkan(SamplerWrap samplerWrap) + inline VkSamplerAddressMode ToVulkan(SamplerWrap samplerWrap) { switch (samplerWrap) { @@ -145,7 +145,7 @@ namespace Nz return VK_SAMPLER_ADDRESS_MODE_REPEAT; } - VkDescriptorType ToVulkan(ShaderBindingType bindingType) + inline VkDescriptorType ToVulkan(ShaderBindingType bindingType) { switch (bindingType) { @@ -157,7 +157,7 @@ namespace Nz return VK_DESCRIPTOR_TYPE_SAMPLER; } - VkShaderStageFlagBits ToVulkan(ShaderStageType stageType) + inline VkShaderStageFlagBits ToVulkan(ShaderStageType stageType) { switch (stageType) { @@ -169,7 +169,7 @@ namespace Nz return {}; } - VkShaderStageFlags ToVulkan(ShaderStageTypeFlags stageType) + inline VkShaderStageFlags ToVulkan(ShaderStageTypeFlags stageType) { VkShaderStageFlags shaderStageBits = 0; @@ -184,7 +184,7 @@ namespace Nz return shaderStageBits; } - VkStencilOp ToVulkan(StencilOperation stencilOp) + inline VkStencilOp ToVulkan(StencilOperation stencilOp) { switch (stencilOp) { @@ -202,7 +202,7 @@ namespace Nz return VK_STENCIL_OP_KEEP; } - VkVertexInputRate ToVulkan(VertexInputRate inputRate) + inline VkVertexInputRate ToVulkan(VertexInputRate inputRate) { switch (inputRate) { diff --git a/include/Nazara/VulkanRenderer/VulkanUploadPool.hpp b/include/Nazara/VulkanRenderer/VulkanUploadPool.hpp index b2ff27dba..fc8c9daf5 100644 --- a/include/Nazara/VulkanRenderer/VulkanUploadPool.hpp +++ b/include/Nazara/VulkanRenderer/VulkanUploadPool.hpp @@ -23,6 +23,7 @@ namespace Nz struct VulkanAllocation : Allocation { VkBuffer buffer; + UInt64 offset; }; inline VulkanUploadPool(Vk::Device& device, UInt64 blockSize); diff --git a/src/Nazara/OpenGLRenderer/OpenGLDevice.cpp b/src/Nazara/OpenGLRenderer/OpenGLDevice.cpp index 333d5d424..4590e144e 100644 --- a/src/Nazara/OpenGLRenderer/OpenGLDevice.cpp +++ b/src/Nazara/OpenGLRenderer/OpenGLDevice.cpp @@ -5,6 +5,7 @@ #include #include #include +#include #include #include #include @@ -25,7 +26,10 @@ namespace Nz m_contexts.insert(m_referenceContext.get()); } - OpenGLDevice::~OpenGLDevice() = default; + OpenGLDevice::~OpenGLDevice() + { + m_referenceContext.reset(); + } std::unique_ptr OpenGLDevice::CreateContext(const GL::ContextParams& params) const { @@ -55,7 +59,7 @@ namespace Nz std::unique_ptr OpenGLDevice::InstantiateRenderPipeline(RenderPipelineInfo pipelineInfo) { - return {}; + return std::make_unique(*this, std::move(pipelineInfo)); } std::shared_ptr OpenGLDevice::InstantiateRenderPipelineLayout(RenderPipelineLayoutInfo pipelineLayoutInfo) diff --git a/src/Nazara/OpenGLRenderer/OpenGLRenderWindow.cpp b/src/Nazara/OpenGLRenderer/OpenGLRenderWindow.cpp index 9799a9dca..317c8d0ff 100644 --- a/src/Nazara/OpenGLRenderer/OpenGLRenderWindow.cpp +++ b/src/Nazara/OpenGLRenderer/OpenGLRenderWindow.cpp @@ -4,6 +4,7 @@ #include #include +#include #include #include #include @@ -11,7 +12,8 @@ namespace Nz { OpenGLRenderWindow::OpenGLRenderWindow() : - m_currentFrame(0) + m_currentFrame(0), + m_framebuffer(*this) { } @@ -33,12 +35,18 @@ namespace Nz if (!m_context) return false; + constexpr std::size_t RenderImageCount = 2; + + m_renderImage.reserve(RenderImageCount); + for (std::size_t i = 0; i < RenderImageCount; ++i) + m_renderImage.emplace_back(*this); + return true; } std::unique_ptr OpenGLRenderWindow::CreateCommandPool(QueueType queueType) { - return {}; + return std::make_unique(); } const OpenGLFramebuffer& OpenGLRenderWindow::GetFramebuffer() const diff --git a/src/Nazara/OpenGLRenderer/Wrapper/Context.cpp b/src/Nazara/OpenGLRenderer/Wrapper/Context.cpp index e4344b3be..9b9adff90 100644 --- a/src/Nazara/OpenGLRenderer/Wrapper/Context.cpp +++ b/src/Nazara/OpenGLRenderer/Wrapper/Context.cpp @@ -49,6 +49,19 @@ namespace Nz::GL } } + void Context::BindFramebuffer(FramebufferTarget target, GLuint fbo) const + { + auto& currentFbo = (target == FramebufferTarget::Draw) ? m_state.boundDrawFBO : m_state.boundReadFBO; + if (currentFbo != fbo) + { + if (!SetCurrentContext(this)) + throw std::runtime_error("failed to activate context"); + + glBindFramebuffer((target == FramebufferTarget::Draw) ? GL_DRAW_FRAMEBUFFER : GL_READ_FRAMEBUFFER, fbo); + currentFbo = fbo; + } + } + void Context::BindSampler(UInt32 textureUnit, GLuint sampler) const { if (textureUnit >= m_state.textureUnits.size())