Renderer: Implement renderpass attachments clear for OpenGL
This commit is contained in:
@@ -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<
|
||||
|
||||
@@ -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());
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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) \
|
||||
|
||||
Reference in New Issue
Block a user