drop support for non separate alpha as it seems to cause issues in some games

This commit is contained in:
Rodolfo Bogado 2018-11-18 03:44:48 -03:00
parent 81a9c5fe6f
commit 4d1a0a24cc
3 changed files with 35 additions and 61 deletions

View file

@ -1077,15 +1077,15 @@ void RasterizerOpenGL::SyncBlendState() {
state.independant_blend.enabled = regs.independent_blend_enable; state.independant_blend.enabled = regs.independent_blend_enable;
if (!state.independant_blend.enabled) { if (!state.independant_blend.enabled) {
auto& blend = state.blend[0]; auto& blend = state.blend[0];
blend.enabled = regs.blend.enable[0] != 0; const auto& src = regs.blend;
blend.separate_alpha = regs.blend.separate_alpha; blend.enabled = src.enable[0] != 0;
blend.rgb_equation = MaxwellToGL::BlendEquation(regs.blend.equation_rgb); if (blend.enabled) {
blend.src_rgb_func = MaxwellToGL::BlendFunc(regs.blend.factor_source_rgb); blend.rgb_equation = MaxwellToGL::BlendEquation(src.equation_rgb);
blend.dst_rgb_func = MaxwellToGL::BlendFunc(regs.blend.factor_dest_rgb); blend.src_rgb_func = MaxwellToGL::BlendFunc(src.factor_source_rgb);
if (blend.separate_alpha) { blend.dst_rgb_func = MaxwellToGL::BlendFunc(src.factor_dest_rgb);
blend.a_equation = MaxwellToGL::BlendEquation(regs.blend.equation_a); blend.a_equation = MaxwellToGL::BlendEquation(src.equation_a);
blend.src_a_func = MaxwellToGL::BlendFunc(regs.blend.factor_source_a); blend.src_a_func = MaxwellToGL::BlendFunc(src.factor_source_a);
blend.dst_a_func = MaxwellToGL::BlendFunc(regs.blend.factor_dest_a); blend.dst_a_func = MaxwellToGL::BlendFunc(src.factor_dest_a);
} }
for (std::size_t i = 1; i < Tegra::Engines::Maxwell3D::Regs::NumRenderTargets; i++) { for (std::size_t i = 1; i < Tegra::Engines::Maxwell3D::Regs::NumRenderTargets; i++) {
state.blend[i].enabled = false; state.blend[i].enabled = false;
@ -1095,18 +1095,16 @@ void RasterizerOpenGL::SyncBlendState() {
for (std::size_t i = 0; i < Tegra::Engines::Maxwell3D::Regs::NumRenderTargets; i++) { for (std::size_t i = 0; i < Tegra::Engines::Maxwell3D::Regs::NumRenderTargets; i++) {
auto& blend = state.blend[i]; auto& blend = state.blend[i];
const auto& src = regs.independent_blend[i];
blend.enabled = regs.blend.enable[i] != 0; blend.enabled = regs.blend.enable[i] != 0;
if (!blend.enabled) if (!blend.enabled)
continue; continue;
blend.separate_alpha = regs.independent_blend[i].separate_alpha; blend.rgb_equation = MaxwellToGL::BlendEquation(src.equation_rgb);
blend.rgb_equation = MaxwellToGL::BlendEquation(regs.independent_blend[i].equation_rgb); blend.src_rgb_func = MaxwellToGL::BlendFunc(src.factor_source_rgb);
blend.src_rgb_func = MaxwellToGL::BlendFunc(regs.independent_blend[i].factor_source_rgb); blend.dst_rgb_func = MaxwellToGL::BlendFunc(src.factor_dest_rgb);
blend.dst_rgb_func = MaxwellToGL::BlendFunc(regs.independent_blend[i].factor_dest_rgb); blend.a_equation = MaxwellToGL::BlendEquation(src.equation_a);
if (blend.separate_alpha) { blend.src_a_func = MaxwellToGL::BlendFunc(src.factor_source_a);
blend.a_equation = MaxwellToGL::BlendEquation(regs.independent_blend[i].equation_a); blend.dst_a_func = MaxwellToGL::BlendFunc(src.factor_dest_a);
blend.src_a_func = MaxwellToGL::BlendFunc(regs.independent_blend[i].factor_source_a);
blend.dst_a_func = MaxwellToGL::BlendFunc(regs.independent_blend[i].factor_dest_a);
}
} }
} }

View file

@ -309,10 +309,9 @@ void OpenGLState::ApplyGlobalBlending() const {
if (!updated.enabled) { if (!updated.enabled) {
return; return;
} }
if (updated.separate_alpha) {
if (blend_changed || updated.src_rgb_func != current.src_rgb_func || if (blend_changed || updated.src_rgb_func != current.src_rgb_func ||
updated.dst_rgb_func != current.dst_rgb_func || updated.dst_rgb_func != current.dst_rgb_func || updated.src_a_func != current.src_a_func ||
updated.src_a_func != current.src_a_func || updated.dst_a_func != current.dst_a_func) { updated.dst_a_func != current.dst_a_func) {
glBlendFuncSeparate(updated.src_rgb_func, updated.dst_rgb_func, updated.src_a_func, glBlendFuncSeparate(updated.src_rgb_func, updated.dst_rgb_func, updated.src_a_func,
updated.dst_a_func); updated.dst_a_func);
} }
@ -321,16 +320,6 @@ void OpenGLState::ApplyGlobalBlending() const {
updated.a_equation != current.a_equation) { updated.a_equation != current.a_equation) {
glBlendEquationSeparate(updated.rgb_equation, updated.a_equation); glBlendEquationSeparate(updated.rgb_equation, updated.a_equation);
} }
} else {
if (blend_changed || updated.src_rgb_func != current.src_rgb_func ||
updated.dst_rgb_func != current.dst_rgb_func) {
glBlendFunc(updated.src_rgb_func, updated.dst_rgb_func);
}
if (blend_changed || updated.rgb_equation != current.rgb_equation) {
glBlendEquation(updated.rgb_equation);
}
}
} }
void OpenGLState::ApplyTargetBlending(std::size_t target, bool force) const { void OpenGLState::ApplyTargetBlending(std::size_t target, bool force) const {
@ -347,10 +336,9 @@ void OpenGLState::ApplyTargetBlending(std::size_t target, bool force) const {
if (!updated.enabled) { if (!updated.enabled) {
return; return;
} }
if (updated.separate_alpha) {
if (blend_changed || updated.src_rgb_func != current.src_rgb_func || if (blend_changed || updated.src_rgb_func != current.src_rgb_func ||
updated.dst_rgb_func != current.dst_rgb_func || updated.dst_rgb_func != current.dst_rgb_func || updated.src_a_func != current.src_a_func ||
updated.src_a_func != current.src_a_func || updated.dst_a_func != current.dst_a_func) { updated.dst_a_func != current.dst_a_func) {
glBlendFuncSeparateiARB(static_cast<GLuint>(target), updated.src_rgb_func, glBlendFuncSeparateiARB(static_cast<GLuint>(target), updated.src_rgb_func,
updated.dst_rgb_func, updated.src_a_func, updated.dst_a_func); updated.dst_rgb_func, updated.src_a_func, updated.dst_a_func);
} }
@ -360,17 +348,6 @@ void OpenGLState::ApplyTargetBlending(std::size_t target, bool force) const {
glBlendEquationSeparateiARB(static_cast<GLuint>(target), updated.rgb_equation, glBlendEquationSeparateiARB(static_cast<GLuint>(target), updated.rgb_equation,
updated.a_equation); updated.a_equation);
} }
} else {
if (blend_changed || updated.src_rgb_func != current.src_rgb_func ||
updated.dst_rgb_func != current.dst_rgb_func) {
glBlendFunciARB(static_cast<GLuint>(target), updated.src_rgb_func,
updated.dst_rgb_func);
}
if (blend_changed || updated.rgb_equation != current.rgb_equation) {
glBlendEquationiARB(static_cast<GLuint>(target), updated.rgb_equation);
}
}
} }
void OpenGLState::ApplyBlending() const { void OpenGLState::ApplyBlending() const {

View file

@ -92,7 +92,6 @@ public:
struct Blend { struct Blend {
bool enabled; // GL_BLEND bool enabled; // GL_BLEND
bool separate_alpha; // Independent blend enabled
GLenum rgb_equation; // GL_BLEND_EQUATION_RGB GLenum rgb_equation; // GL_BLEND_EQUATION_RGB
GLenum a_equation; // GL_BLEND_EQUATION_ALPHA GLenum a_equation; // GL_BLEND_EQUATION_ALPHA
GLenum src_rgb_func; // GL_BLEND_SRC_RGB GLenum src_rgb_func; // GL_BLEND_SRC_RGB