Renderer: Implement renderpass attachments clear for OpenGL

This commit is contained in:
Jérôme Leclercq
2021-05-28 22:55:56 +02:00
parent 392a23eeb1
commit 299585a7de
14 changed files with 276 additions and 96 deletions

View File

@@ -24,6 +24,7 @@ namespace Nz
{
class OpenGLCommandPool;
class OpenGLFramebuffer;
class OpenGLRenderPass;
class NAZARA_OPENGLRENDERER_API OpenGLCommandBuffer final : public CommandBuffer
{
@@ -55,7 +56,7 @@ namespace Nz
inline std::size_t GetPoolIndex() const;
inline const OpenGLCommandPool& GetOwner() const;
inline void SetFramebuffer(const OpenGLFramebuffer& framebuffer, const RenderPass& renderPass, const CommandBufferBuilder::ClearValues* clearValues, std::size_t clearValueCount);
inline void SetFramebuffer(const OpenGLFramebuffer& framebuffer, const OpenGLRenderPass& renderPass, const CommandBufferBuilder::ClearValues* clearValues, std::size_t clearValueCount);
inline void SetScissor(Nz::Recti scissorRegion);
inline void SetViewport(Nz::Recti viewportRegion);
@@ -103,8 +104,8 @@ namespace Nz
const OpenGLRenderPipeline* pipeline = nullptr;
const OpenGLShaderBinding* shaderBindings = nullptr;
UInt64 indexBufferOffset;
std::optional<Nz::Recti> scissorRegion;
std::optional<Nz::Recti> viewportRegion;
std::optional<Recti> scissorRegion;
std::optional<Recti> viewportRegion;
std::vector<VertexBuffer> vertexBuffers;
bool shouldFlipY = false;
};
@@ -135,6 +136,7 @@ namespace Nz
{
std::array<CommandBufferBuilder::ClearValues, 16> clearValues; //< TODO: Remove hard limit?
const OpenGLFramebuffer* framebuffer;
const OpenGLRenderPass* renderpass;
};
using CommandData = std::variant<

View File

@@ -135,12 +135,13 @@ namespace Nz
return *m_owner;
}
inline void OpenGLCommandBuffer::SetFramebuffer(const OpenGLFramebuffer& framebuffer, const RenderPass& /*renderPass*/, const CommandBufferBuilder::ClearValues* clearValues, std::size_t clearValueCount)
inline void OpenGLCommandBuffer::SetFramebuffer(const OpenGLFramebuffer& framebuffer, const OpenGLRenderPass& renderPass, const CommandBufferBuilder::ClearValues* clearValues, std::size_t clearValueCount)
{
m_maxColorBufferCount = std::max(m_maxColorBufferCount, framebuffer.GetColorBufferCount());
SetFrameBufferData setFramebuffer;
setFramebuffer.framebuffer = &framebuffer;
setFramebuffer.renderpass = &renderPass;
assert(clearValueCount < setFramebuffer.clearValues.size());
std::copy(clearValues, clearValues + clearValueCount, setFramebuffer.clearValues.begin());

View File

@@ -40,10 +40,10 @@ namespace Nz
void Present();
private:
std::optional<OpenGLRenderPass> m_renderPass;
std::size_t m_currentFrame;
std::vector<std::unique_ptr<OpenGLRenderImage>> m_renderImage;
std::unique_ptr<GL::Context> m_context;
OpenGLRenderPass m_renderPass;
OpenGLWindowFramebuffer m_framebuffer;
RenderWindow& m_owner;
Vector2ui m_size;

View File

@@ -134,6 +134,10 @@ namespace Nz::GL
bool ProcessErrorStack() const;
inline void ResetColorWriteMasks() const;
inline void ResetDepthWriteMasks() const;
inline void ResetStencilWriteMasks() const;
void SetCurrentTextureUnit(UInt32 textureUnit) const;
void SetScissorBox(GLint x, GLint y, GLsizei width, GLsizei height) const;
void SetViewport(GLint x, GLint y, GLsizei width, GLsizei height) const;

View File

@@ -99,6 +99,35 @@ namespace Nz::GL
if (m_state.boundVertexArray == vao)
m_state.boundVertexArray = 0;
}
inline void Context::ResetColorWriteMasks() const
{
if (!m_state.renderStates.colorWrite)
{
glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
m_state.renderStates.colorWrite = true;
}
}
inline void Context::ResetDepthWriteMasks() const
{
if (!m_state.renderStates.depthWrite)
{
glDepthMask(GL_TRUE);
m_state.renderStates.depthWrite = true;
}
}
inline void Context::ResetStencilWriteMasks() const
{
if (m_state.renderStates.stencilBack.writeMask != 0xFFFFFFFF || m_state.renderStates.stencilFront.writeMask != 0xFFFFFFFF)
{
glStencilMaskSeparate(GL_FRONT_AND_BACK, 0xFFFFFFFF);
m_state.renderStates.stencilBack.writeMask = 0xFFFFFFFF;
m_state.renderStates.stencilFront.writeMask = 0xFFFFFFFF;
}
}
}
#include <Nazara/OpenGLRenderer/DebugOff.hpp>

View File

@@ -129,6 +129,7 @@ typedef void (GL_APIENTRYP PFNGLSPECIALIZESHADERARBPROC) (GLuint shader, const G
cb(glStencilFuncSeparate, PFNGLSTENCILFUNCSEPARATEPROC) \
cb(glStencilOp, PFNGLSTENCILOPPROC) \
cb(glStencilOpSeparate, PFNGLSTENCILOPSEPARATEPROC) \
cb(glStencilMaskSeparate, PFNGLSTENCILMASKSEPARATEPROC) \
cb(glTexImage2D, PFNGLTEXIMAGE2DPROC) \
cb(glTexImage3D, PFNGLTEXIMAGE3DPROC) \
cb(glTexParameterf, PFNGLTEXPARAMETERFPROC) \

View File

@@ -13,7 +13,9 @@
#include <Nazara/Renderer/Config.hpp>
#include <Nazara/Renderer/RenderDevice.hpp>
#include <Nazara/Renderer/RenderFrame.hpp>
#include <Nazara/Renderer/RenderPass.hpp>
#include <Nazara/Renderer/RenderWindowParameters.hpp>
#include <vector>
namespace Nz
{
@@ -21,7 +23,6 @@ namespace Nz
class Framebuffer;
class RendererImpl;
class RenderDevice;
class RenderPass;
class RenderSurface;
class NAZARA_RENDERER_API RenderWindowImpl
@@ -37,6 +38,9 @@ namespace Nz
virtual const Framebuffer& GetFramebuffer() const = 0;
virtual const RenderPass& GetRenderPass() const = 0;
protected:
static void BuildRenderPass(PixelFormat colorFormat, PixelFormat depthFormat, std::vector<RenderPass::Attachment>& attachments, std::vector<RenderPass::SubpassDescription>& subpassDescriptions, std::vector<RenderPass::SubpassDependency>& subpassDependencies);
};
}

View File

@@ -15,7 +15,7 @@ namespace Nz
{
struct RenderWindowParameters
{
std::vector<PixelFormat> depthFormats = {Nz::PixelFormat::Depth32, Nz::PixelFormat::Depth24}; //< By order of preference
std::vector<PixelFormat> depthFormats = {Nz::PixelFormat::Depth24Stencil8, Nz::PixelFormat::Depth32, Nz::PixelFormat::Depth24}; //< By order of preference
bool verticalSync = false;
};
}