GLState: Allow enabling/disabling GL_COLOR_LOGIC_OP independently from blending.

This commit is contained in:
Subv 2018-08-20 18:43:11 -05:00
parent 6bcdf37d4f
commit f24ab6d9e6
2 changed files with 19 additions and 6 deletions

View file

@ -45,7 +45,8 @@ OpenGLState::OpenGLState() {
blend.color.blue = 0.0f; blend.color.blue = 0.0f;
blend.color.alpha = 0.0f; blend.color.alpha = 0.0f;
logic_op = GL_COPY; logic_op.enabled = false;
logic_op.operation = GL_COPY;
for (auto& texture_unit : texture_units) { for (auto& texture_unit : texture_units) {
texture_unit.Reset(); texture_unit.Reset();
@ -148,11 +149,10 @@ void OpenGLState::Apply() const {
// Blending // Blending
if (blend.enabled != cur_state.blend.enabled) { if (blend.enabled != cur_state.blend.enabled) {
if (blend.enabled) { if (blend.enabled) {
ASSERT(!logic_op.enabled);
glEnable(GL_BLEND); glEnable(GL_BLEND);
glDisable(GL_COLOR_LOGIC_OP);
} else { } else {
glDisable(GL_BLEND); glDisable(GL_BLEND);
glEnable(GL_COLOR_LOGIC_OP);
} }
} }
@ -176,8 +176,18 @@ void OpenGLState::Apply() const {
glBlendEquationSeparate(blend.rgb_equation, blend.a_equation); glBlendEquationSeparate(blend.rgb_equation, blend.a_equation);
} }
if (logic_op != cur_state.logic_op) { // Logic Operation
glLogicOp(logic_op); if (logic_op.enabled != cur_state.logic_op.enabled) {
if (logic_op.enabled) {
ASSERT(!blend.enabled);
glEnable(GL_COLOR_LOGIC_OP);
} else {
glDisable(GL_COLOR_LOGIC_OP);
}
}
if (logic_op.operation != cur_state.logic_op.operation) {
glLogicOp(logic_op.operation);
} }
// Textures // Textures

View file

@ -83,7 +83,10 @@ public:
} color; // GL_BLEND_COLOR } color; // GL_BLEND_COLOR
} blend; } blend;
GLenum logic_op; // GL_LOGIC_OP_MODE struct {
bool enabled; // GL_LOGIC_OP_MODE
GLenum operation;
} logic_op;
// 3 texture units - one for each that is used in PICA fragment shader emulation // 3 texture units - one for each that is used in PICA fragment shader emulation
struct TextureUnit { struct TextureUnit {