gl_state: Remove stencil test tracking
This commit is contained in:
parent
07a954e67f
commit
7d9a5e9e30
4 changed files with 18 additions and 92 deletions
|
@ -427,32 +427,6 @@ void RasterizerOpenGL::Clear() {
|
||||||
if (regs.clear_buffers.S) {
|
if (regs.clear_buffers.S) {
|
||||||
ASSERT_MSG(regs.zeta_enable != 0, "Tried to clear stencil but buffer is not enabled!");
|
ASSERT_MSG(regs.zeta_enable != 0, "Tried to clear stencil but buffer is not enabled!");
|
||||||
use_stencil = true;
|
use_stencil = true;
|
||||||
clear_state.stencil.test_enabled = true;
|
|
||||||
|
|
||||||
if (regs.clear_flags.stencil) {
|
|
||||||
// Stencil affects the clear so fill it with the used masks
|
|
||||||
clear_state.stencil.front.test_func = GL_ALWAYS;
|
|
||||||
clear_state.stencil.front.test_mask = regs.stencil_front_func_mask;
|
|
||||||
clear_state.stencil.front.action_stencil_fail = GL_KEEP;
|
|
||||||
clear_state.stencil.front.action_depth_fail = GL_KEEP;
|
|
||||||
clear_state.stencil.front.action_depth_pass = GL_KEEP;
|
|
||||||
clear_state.stencil.front.write_mask = regs.stencil_front_mask;
|
|
||||||
if (regs.stencil_two_side_enable) {
|
|
||||||
clear_state.stencil.back.test_func = GL_ALWAYS;
|
|
||||||
clear_state.stencil.back.test_mask = regs.stencil_back_func_mask;
|
|
||||||
clear_state.stencil.back.action_stencil_fail = GL_KEEP;
|
|
||||||
clear_state.stencil.back.action_depth_fail = GL_KEEP;
|
|
||||||
clear_state.stencil.back.action_depth_pass = GL_KEEP;
|
|
||||||
clear_state.stencil.back.write_mask = regs.stencil_back_mask;
|
|
||||||
} else {
|
|
||||||
clear_state.stencil.back.test_func = GL_ALWAYS;
|
|
||||||
clear_state.stencil.back.test_mask = 0xFFFFFFFF;
|
|
||||||
clear_state.stencil.back.write_mask = 0xFFFFFFFF;
|
|
||||||
clear_state.stencil.back.action_stencil_fail = GL_KEEP;
|
|
||||||
clear_state.stencil.back.action_depth_fail = GL_KEEP;
|
|
||||||
clear_state.stencil.back.action_depth_pass = GL_KEEP;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!use_color && !use_depth && !use_stencil) {
|
if (!use_color && !use_depth && !use_stencil) {
|
||||||
|
@ -1011,35 +985,30 @@ void RasterizerOpenGL::SyncDepthTestState() {
|
||||||
void RasterizerOpenGL::SyncStencilTestState() {
|
void RasterizerOpenGL::SyncStencilTestState() {
|
||||||
auto& maxwell3d = system.GPU().Maxwell3D();
|
auto& maxwell3d = system.GPU().Maxwell3D();
|
||||||
const auto& regs = maxwell3d.regs;
|
const auto& regs = maxwell3d.regs;
|
||||||
state.stencil.test_enabled = regs.stencil_enable != 0;
|
|
||||||
|
|
||||||
|
oglEnable(GL_STENCIL_TEST, regs.stencil_enable);
|
||||||
if (!regs.stencil_enable) {
|
if (!regs.stencil_enable) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
state.stencil.front.test_func = MaxwellToGL::ComparisonOp(regs.stencil_front_func_func);
|
glStencilFuncSeparate(GL_FRONT, MaxwellToGL::ComparisonOp(regs.stencil_front_func_func),
|
||||||
state.stencil.front.test_ref = regs.stencil_front_func_ref;
|
regs.stencil_front_func_ref, regs.stencil_front_func_mask);
|
||||||
state.stencil.front.test_mask = regs.stencil_front_func_mask;
|
glStencilOpSeparate(GL_FRONT, MaxwellToGL::StencilOp(regs.stencil_front_op_fail),
|
||||||
state.stencil.front.action_stencil_fail = MaxwellToGL::StencilOp(regs.stencil_front_op_fail);
|
MaxwellToGL::StencilOp(regs.stencil_front_op_zfail),
|
||||||
state.stencil.front.action_depth_fail = MaxwellToGL::StencilOp(regs.stencil_front_op_zfail);
|
MaxwellToGL::StencilOp(regs.stencil_front_op_zpass));
|
||||||
state.stencil.front.action_depth_pass = MaxwellToGL::StencilOp(regs.stencil_front_op_zpass);
|
glStencilMaskSeparate(GL_FRONT, regs.stencil_front_mask);
|
||||||
state.stencil.front.write_mask = regs.stencil_front_mask;
|
|
||||||
if (regs.stencil_two_side_enable) {
|
if (regs.stencil_two_side_enable) {
|
||||||
state.stencil.back.test_func = MaxwellToGL::ComparisonOp(regs.stencil_back_func_func);
|
glStencilFuncSeparate(GL_BACK, MaxwellToGL::ComparisonOp(regs.stencil_back_func_func),
|
||||||
state.stencil.back.test_ref = regs.stencil_back_func_ref;
|
regs.stencil_back_func_ref, regs.stencil_back_func_mask);
|
||||||
state.stencil.back.test_mask = regs.stencil_back_func_mask;
|
glStencilOpSeparate(GL_BACK, MaxwellToGL::StencilOp(regs.stencil_back_op_fail),
|
||||||
state.stencil.back.action_stencil_fail = MaxwellToGL::StencilOp(regs.stencil_back_op_fail);
|
MaxwellToGL::StencilOp(regs.stencil_back_op_zfail),
|
||||||
state.stencil.back.action_depth_fail = MaxwellToGL::StencilOp(regs.stencil_back_op_zfail);
|
MaxwellToGL::StencilOp(regs.stencil_back_op_zpass));
|
||||||
state.stencil.back.action_depth_pass = MaxwellToGL::StencilOp(regs.stencil_back_op_zpass);
|
glStencilMaskSeparate(GL_BACK, regs.stencil_back_mask);
|
||||||
state.stencil.back.write_mask = regs.stencil_back_mask;
|
|
||||||
} else {
|
} else {
|
||||||
state.stencil.back.test_func = GL_ALWAYS;
|
glStencilFuncSeparate(GL_BACK, GL_ALWAYS, 0, 0xFFFFFFFF);
|
||||||
state.stencil.back.test_ref = 0;
|
glStencilOpSeparate(GL_BACK, GL_KEEP, GL_KEEP, GL_KEEP);
|
||||||
state.stencil.back.test_mask = 0xFFFFFFFF;
|
glStencilMaskSeparate(GL_BACK, 0xFFFFFFFF);
|
||||||
state.stencil.back.write_mask = 0xFFFFFFFF;
|
|
||||||
state.stencil.back.action_stencil_fail = GL_KEEP;
|
|
||||||
state.stencil.back.action_depth_fail = GL_KEEP;
|
|
||||||
state.stencil.back.action_depth_pass = GL_KEEP;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -106,35 +106,6 @@ void OpenGLState::ApplyProgramPipeline() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void OpenGLState::ApplyStencilTest() {
|
|
||||||
Enable(GL_STENCIL_TEST, cur_state.stencil.test_enabled, stencil.test_enabled);
|
|
||||||
|
|
||||||
const auto ConfigStencil = [](GLenum face, const auto& config, auto& current) {
|
|
||||||
if (current.test_func != config.test_func || current.test_ref != config.test_ref ||
|
|
||||||
current.test_mask != config.test_mask) {
|
|
||||||
current.test_func = config.test_func;
|
|
||||||
current.test_ref = config.test_ref;
|
|
||||||
current.test_mask = config.test_mask;
|
|
||||||
glStencilFuncSeparate(face, config.test_func, config.test_ref, config.test_mask);
|
|
||||||
}
|
|
||||||
if (current.action_depth_fail != config.action_depth_fail ||
|
|
||||||
current.action_depth_pass != config.action_depth_pass ||
|
|
||||||
current.action_stencil_fail != config.action_stencil_fail) {
|
|
||||||
current.action_depth_fail = config.action_depth_fail;
|
|
||||||
current.action_depth_pass = config.action_depth_pass;
|
|
||||||
current.action_stencil_fail = config.action_stencil_fail;
|
|
||||||
glStencilOpSeparate(face, config.action_stencil_fail, config.action_depth_fail,
|
|
||||||
config.action_depth_pass);
|
|
||||||
}
|
|
||||||
if (current.write_mask != config.write_mask) {
|
|
||||||
current.write_mask = config.write_mask;
|
|
||||||
glStencilMaskSeparate(face, config.write_mask);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
ConfigStencil(GL_FRONT, stencil.front, cur_state.stencil.front);
|
|
||||||
ConfigStencil(GL_BACK, stencil.back, cur_state.stencil.back);
|
|
||||||
}
|
|
||||||
|
|
||||||
void OpenGLState::ApplyGlobalBlending() {
|
void OpenGLState::ApplyGlobalBlending() {
|
||||||
const Blend& updated = blend[0];
|
const Blend& updated = blend[0];
|
||||||
Blend& current = cur_state.blend[0];
|
Blend& current = cur_state.blend[0];
|
||||||
|
@ -235,7 +206,6 @@ void OpenGLState::Apply() {
|
||||||
ApplyFramebufferState();
|
ApplyFramebufferState();
|
||||||
ApplyShaderProgram();
|
ApplyShaderProgram();
|
||||||
ApplyProgramPipeline();
|
ApplyProgramPipeline();
|
||||||
ApplyStencilTest();
|
|
||||||
ApplyBlending();
|
ApplyBlending();
|
||||||
ApplyTextures();
|
ApplyTextures();
|
||||||
ApplySamplers();
|
ApplySamplers();
|
||||||
|
|
|
@ -13,19 +13,6 @@ namespace OpenGL {
|
||||||
|
|
||||||
class OpenGLState {
|
class OpenGLState {
|
||||||
public:
|
public:
|
||||||
struct {
|
|
||||||
bool test_enabled = false; // GL_STENCIL_TEST
|
|
||||||
struct {
|
|
||||||
GLenum test_func = GL_ALWAYS; // GL_STENCIL_FUNC
|
|
||||||
GLint test_ref = 0; // GL_STENCIL_REF
|
|
||||||
GLuint test_mask = 0xFFFFFFFF; // GL_STENCIL_VALUE_MASK
|
|
||||||
GLuint write_mask = 0xFFFFFFFF; // GL_STENCIL_WRITEMASK
|
|
||||||
GLenum action_stencil_fail = GL_KEEP; // GL_STENCIL_FAIL
|
|
||||||
GLenum action_depth_fail = GL_KEEP; // GL_STENCIL_PASS_DEPTH_FAIL
|
|
||||||
GLenum action_depth_pass = GL_KEEP; // GL_STENCIL_PASS_DEPTH_PASS
|
|
||||||
} front, back;
|
|
||||||
} stencil;
|
|
||||||
|
|
||||||
struct Blend {
|
struct Blend {
|
||||||
bool enabled = false; // GL_BLEND
|
bool enabled = false; // GL_BLEND
|
||||||
GLenum rgb_equation = GL_FUNC_ADD; // GL_BLEND_EQUATION_RGB
|
GLenum rgb_equation = GL_FUNC_ADD; // GL_BLEND_EQUATION_RGB
|
||||||
|
@ -69,7 +56,6 @@ public:
|
||||||
void ApplyFramebufferState();
|
void ApplyFramebufferState();
|
||||||
void ApplyShaderProgram();
|
void ApplyShaderProgram();
|
||||||
void ApplyProgramPipeline();
|
void ApplyProgramPipeline();
|
||||||
void ApplyStencilTest();
|
|
||||||
void ApplyTargetBlending(std::size_t target, bool force);
|
void ApplyTargetBlending(std::size_t target, bool force);
|
||||||
void ApplyGlobalBlending();
|
void ApplyGlobalBlending();
|
||||||
void ApplyBlending();
|
void ApplyBlending();
|
||||||
|
|
|
@ -579,6 +579,7 @@ void RendererOpenGL::DrawScreen(const Layout::FramebufferLayout& layout) {
|
||||||
glDisable(GL_COLOR_LOGIC_OP);
|
glDisable(GL_COLOR_LOGIC_OP);
|
||||||
glDisable(GL_ALPHA_TEST);
|
glDisable(GL_ALPHA_TEST);
|
||||||
glDisable(GL_DEPTH_TEST);
|
glDisable(GL_DEPTH_TEST);
|
||||||
|
glDisable(GL_STENCIL_TEST);
|
||||||
glDisable(GL_POLYGON_OFFSET_FILL);
|
glDisable(GL_POLYGON_OFFSET_FILL);
|
||||||
glDisable(GL_RASTERIZER_DISCARD);
|
glDisable(GL_RASTERIZER_DISCARD);
|
||||||
glDisablei(GL_SCISSOR_TEST, 0);
|
glDisablei(GL_SCISSOR_TEST, 0);
|
||||||
|
|
Loading…
Reference in a new issue