gl_state: Remove stencil test tracking
This commit is contained in:
parent
07a954e67f
commit
7d9a5e9e30
@ -427,32 +427,6 @@ void RasterizerOpenGL::Clear() {
|
||||
if (regs.clear_buffers.S) {
|
||||
ASSERT_MSG(regs.zeta_enable != 0, "Tried to clear stencil but buffer is not enabled!");
|
||||
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) {
|
||||
@ -1011,35 +985,30 @@ void RasterizerOpenGL::SyncDepthTestState() {
|
||||
void RasterizerOpenGL::SyncStencilTestState() {
|
||||
auto& maxwell3d = system.GPU().Maxwell3D();
|
||||
const auto& regs = maxwell3d.regs;
|
||||
state.stencil.test_enabled = regs.stencil_enable != 0;
|
||||
|
||||
oglEnable(GL_STENCIL_TEST, regs.stencil_enable);
|
||||
if (!regs.stencil_enable) {
|
||||
return;
|
||||
}
|
||||
|
||||
state.stencil.front.test_func = MaxwellToGL::ComparisonOp(regs.stencil_front_func_func);
|
||||
state.stencil.front.test_ref = regs.stencil_front_func_ref;
|
||||
state.stencil.front.test_mask = regs.stencil_front_func_mask;
|
||||
state.stencil.front.action_stencil_fail = MaxwellToGL::StencilOp(regs.stencil_front_op_fail);
|
||||
state.stencil.front.action_depth_fail = MaxwellToGL::StencilOp(regs.stencil_front_op_zfail);
|
||||
state.stencil.front.action_depth_pass = MaxwellToGL::StencilOp(regs.stencil_front_op_zpass);
|
||||
state.stencil.front.write_mask = regs.stencil_front_mask;
|
||||
glStencilFuncSeparate(GL_FRONT, MaxwellToGL::ComparisonOp(regs.stencil_front_func_func),
|
||||
regs.stencil_front_func_ref, regs.stencil_front_func_mask);
|
||||
glStencilOpSeparate(GL_FRONT, MaxwellToGL::StencilOp(regs.stencil_front_op_fail),
|
||||
MaxwellToGL::StencilOp(regs.stencil_front_op_zfail),
|
||||
MaxwellToGL::StencilOp(regs.stencil_front_op_zpass));
|
||||
glStencilMaskSeparate(GL_FRONT, regs.stencil_front_mask);
|
||||
|
||||
if (regs.stencil_two_side_enable) {
|
||||
state.stencil.back.test_func = MaxwellToGL::ComparisonOp(regs.stencil_back_func_func);
|
||||
state.stencil.back.test_ref = regs.stencil_back_func_ref;
|
||||
state.stencil.back.test_mask = regs.stencil_back_func_mask;
|
||||
state.stencil.back.action_stencil_fail = MaxwellToGL::StencilOp(regs.stencil_back_op_fail);
|
||||
state.stencil.back.action_depth_fail = MaxwellToGL::StencilOp(regs.stencil_back_op_zfail);
|
||||
state.stencil.back.action_depth_pass = MaxwellToGL::StencilOp(regs.stencil_back_op_zpass);
|
||||
state.stencil.back.write_mask = regs.stencil_back_mask;
|
||||
glStencilFuncSeparate(GL_BACK, MaxwellToGL::ComparisonOp(regs.stencil_back_func_func),
|
||||
regs.stencil_back_func_ref, regs.stencil_back_func_mask);
|
||||
glStencilOpSeparate(GL_BACK, MaxwellToGL::StencilOp(regs.stencil_back_op_fail),
|
||||
MaxwellToGL::StencilOp(regs.stencil_back_op_zfail),
|
||||
MaxwellToGL::StencilOp(regs.stencil_back_op_zpass));
|
||||
glStencilMaskSeparate(GL_BACK, regs.stencil_back_mask);
|
||||
} else {
|
||||
state.stencil.back.test_func = GL_ALWAYS;
|
||||
state.stencil.back.test_ref = 0;
|
||||
state.stencil.back.test_mask = 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;
|
||||
glStencilFuncSeparate(GL_BACK, GL_ALWAYS, 0, 0xFFFFFFFF);
|
||||
glStencilOpSeparate(GL_BACK, GL_KEEP, GL_KEEP, GL_KEEP);
|
||||
glStencilMaskSeparate(GL_BACK, 0xFFFFFFFF);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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() {
|
||||
const Blend& updated = blend[0];
|
||||
Blend& current = cur_state.blend[0];
|
||||
@ -235,7 +206,6 @@ void OpenGLState::Apply() {
|
||||
ApplyFramebufferState();
|
||||
ApplyShaderProgram();
|
||||
ApplyProgramPipeline();
|
||||
ApplyStencilTest();
|
||||
ApplyBlending();
|
||||
ApplyTextures();
|
||||
ApplySamplers();
|
||||
|
@ -13,19 +13,6 @@ namespace OpenGL {
|
||||
|
||||
class OpenGLState {
|
||||
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 {
|
||||
bool enabled = false; // GL_BLEND
|
||||
GLenum rgb_equation = GL_FUNC_ADD; // GL_BLEND_EQUATION_RGB
|
||||
@ -69,7 +56,6 @@ public:
|
||||
void ApplyFramebufferState();
|
||||
void ApplyShaderProgram();
|
||||
void ApplyProgramPipeline();
|
||||
void ApplyStencilTest();
|
||||
void ApplyTargetBlending(std::size_t target, bool force);
|
||||
void ApplyGlobalBlending();
|
||||
void ApplyBlending();
|
||||
|
@ -579,6 +579,7 @@ void RendererOpenGL::DrawScreen(const Layout::FramebufferLayout& layout) {
|
||||
glDisable(GL_COLOR_LOGIC_OP);
|
||||
glDisable(GL_ALPHA_TEST);
|
||||
glDisable(GL_DEPTH_TEST);
|
||||
glDisable(GL_STENCIL_TEST);
|
||||
glDisable(GL_POLYGON_OFFSET_FILL);
|
||||
glDisable(GL_RASTERIZER_DISCARD);
|
||||
glDisablei(GL_SCISSOR_TEST, 0);
|
||||
|
Loading…
Reference in New Issue
Block a user