From d80785cbb5271e7bd6ddb8e82c188a2256acb7a3 Mon Sep 17 00:00:00 2001 From: wheremyfoodat <44909372+wheremyfoodat@users.noreply.github.com> Date: Wed, 5 Jul 2023 18:23:14 +0300 Subject: [PATCH] [OpenGL] More efficient colour mask handling --- include/gl_state.hpp | 15 +++++++++++++++ src/core/renderer_gl/renderer_gl.cpp | 3 ++- src/gl_state.cpp | 6 ++++++ 3 files changed, 23 insertions(+), 1 deletion(-) diff --git a/include/gl_state.hpp b/include/gl_state.hpp index 6a495c72..fe0eba60 100644 --- a/include/gl_state.hpp +++ b/include/gl_state.hpp @@ -22,12 +22,16 @@ struct GLStateManager { bool depthEnabled; bool scissorEnabled; + // Colour mask + bool redMask, greenMask, blueMask, alphaMask; + GLuint boundVAO; GLuint boundVBO; GLuint currentProgram; void reset(); void resetBlend(); + void resetColourMask(); void resetDepth(); void resetVAO(); void resetVBO(); @@ -97,6 +101,17 @@ struct GLStateManager { } } + void setColourMask(bool r, bool g, bool b, bool a) { + if (r != redMask || g != greenMask || b != blueMask || a != alphaMask) { + r = redMask; + g = greenMask; + b = blueMask; + a = alphaMask; + + glColorMask(r, g, b, a); + } + } + void bindVAO(const OpenGL::VertexArray& vao) { bindVAO(vao.handle()); } void bindVBO(const OpenGL::VertexBuffer& vbo) { bindVBO(vbo.handle()); } void useProgram(const OpenGL::Program& program) { useProgram(program.handle()); } diff --git a/src/core/renderer_gl/renderer_gl.cpp b/src/core/renderer_gl/renderer_gl.cpp index 917075e0..9ca9f2d1 100644 --- a/src/core/renderer_gl/renderer_gl.cpp +++ b/src/core/renderer_gl/renderer_gl.cpp @@ -850,7 +850,7 @@ void Renderer::drawVertices(PICA::PrimType primType, std::span ver const bool depthWriteEnable = getBit<12>(depthControl); const int depthFunc = getBits<4, 3>(depthControl); const int colourMask = getBits<8, 4>(depthControl); - glColorMask(colourMask & 1, colourMask & 2, colourMask & 4, colourMask & 8); + gl.setColourMask(colourMask & 1, colourMask & 2, colourMask & 4, colourMask & 8); static constexpr std::array depthModes = { GL_NEVER, GL_ALWAYS, GL_EQUAL, GL_NOTEQUAL, GL_LESS, GL_LEQUAL, GL_GREATER, GL_GEQUAL @@ -1012,6 +1012,7 @@ void Renderer::displayTransfer(u32 inputAddr, u32 outputAddr, u32 inputSize, u32 gl.disableBlend(); gl.disableDepth(); gl.disableScissor(); + gl.setColourMask(true, true, true, true); gl.useProgram(displayProgram); gl.bindVAO(dummyVAO); diff --git a/src/gl_state.cpp b/src/gl_state.cpp index 030797a4..2f286f70 100644 --- a/src/gl_state.cpp +++ b/src/gl_state.cpp @@ -5,6 +5,11 @@ void GLStateManager::resetBlend() { OpenGL::disableBlend(); } +void GLStateManager::resetColourMask() { + redMask = greenMask = blueMask = alphaMask = true; + glColorMask(redMask, greenMask, blueMask, alphaMask); +} + void GLStateManager::resetDepth() { depthEnabled = false; OpenGL::disableDepth(); @@ -33,6 +38,7 @@ void GLStateManager::resetProgram() { void GLStateManager::reset() { resetBlend(); + resetColourMask(); resetDepth(); resetVAO();