|
|
|
@ -14,6 +14,7 @@ OpenGLState OpenGLState::cur_state;
|
|
|
|
|
bool OpenGLState::s_rgb_used;
|
|
|
|
|
OpenGLState::OpenGLState() {
|
|
|
|
|
// These all match default OpenGL values
|
|
|
|
|
geometry_shaders.enabled = false;
|
|
|
|
|
framebuffer_srgb.enabled = false;
|
|
|
|
|
cull.enabled = false;
|
|
|
|
|
cull.mode = GL_BACK;
|
|
|
|
@ -50,12 +51,12 @@ OpenGLState::OpenGLState() {
|
|
|
|
|
item.height = 0;
|
|
|
|
|
item.depth_range_near = 0.0f;
|
|
|
|
|
item.depth_range_far = 1.0f;
|
|
|
|
|
item.scissor.enabled = false;
|
|
|
|
|
item.scissor.x = 0;
|
|
|
|
|
item.scissor.y = 0;
|
|
|
|
|
item.scissor.width = 0;
|
|
|
|
|
item.scissor.height = 0;
|
|
|
|
|
}
|
|
|
|
|
scissor.enabled = false;
|
|
|
|
|
scissor.x = 0;
|
|
|
|
|
scissor.y = 0;
|
|
|
|
|
scissor.width = 0;
|
|
|
|
|
scissor.height = 0;
|
|
|
|
|
for (auto& item : blend) {
|
|
|
|
|
item.enabled = true;
|
|
|
|
|
item.rgb_equation = GL_FUNC_ADD;
|
|
|
|
@ -136,7 +137,7 @@ void OpenGLState::ApplyCulling() const {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void OpenGLState::ApplyColorMask() const {
|
|
|
|
|
if (GLAD_GL_ARB_viewport_array) {
|
|
|
|
|
if (GLAD_GL_ARB_viewport_array && independant_blend.enabled) {
|
|
|
|
|
for (size_t i = 0; i < Tegra::Engines::Maxwell3D::Regs::NumRenderTargets; i++) {
|
|
|
|
|
const auto& updated = color_mask[i];
|
|
|
|
|
const auto& current = cur_state.color_mask[i];
|
|
|
|
@ -230,26 +231,10 @@ void OpenGLState::ApplyStencilTest() const {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void OpenGLState::ApplyScissor() const {
|
|
|
|
|
const bool scissor_changed = scissor.enabled != cur_state.scissor.enabled;
|
|
|
|
|
if (scissor_changed) {
|
|
|
|
|
if (scissor.enabled) {
|
|
|
|
|
glEnable(GL_SCISSOR_TEST);
|
|
|
|
|
} else {
|
|
|
|
|
glDisable(GL_SCISSOR_TEST);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (scissor.enabled &&
|
|
|
|
|
(scissor_changed || scissor.x != cur_state.scissor.x || scissor.y != cur_state.scissor.y ||
|
|
|
|
|
scissor.width != cur_state.scissor.width || scissor.height != cur_state.scissor.height)) {
|
|
|
|
|
glScissor(scissor.x, scissor.y, scissor.width, scissor.height);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void OpenGLState::ApplyViewport() const {
|
|
|
|
|
if (GLAD_GL_ARB_viewport_array) {
|
|
|
|
|
for (GLuint i = 0;
|
|
|
|
|
i < static_cast<GLuint>(Tegra::Engines::Maxwell3D::Regs::NumRenderTargets); i++) {
|
|
|
|
|
if (GLAD_GL_ARB_viewport_array && geometry_shaders.enabled) {
|
|
|
|
|
for (GLuint i = 0; i < static_cast<GLuint>(Tegra::Engines::Maxwell3D::Regs::NumViewports);
|
|
|
|
|
i++) {
|
|
|
|
|
const auto& current = cur_state.viewports[i];
|
|
|
|
|
const auto& updated = viewports[i];
|
|
|
|
|
if (updated.x != current.x || updated.y != current.y ||
|
|
|
|
@ -260,6 +245,22 @@ void OpenGLState::ApplyViewport() const {
|
|
|
|
|
updated.depth_range_far != current.depth_range_far) {
|
|
|
|
|
glDepthRangeIndexed(i, updated.depth_range_near, updated.depth_range_far);
|
|
|
|
|
}
|
|
|
|
|
const bool scissor_changed = updated.scissor.enabled != current.scissor.enabled;
|
|
|
|
|
if (scissor_changed) {
|
|
|
|
|
if (updated.scissor.enabled) {
|
|
|
|
|
glEnablei(GL_SCISSOR_TEST, i);
|
|
|
|
|
} else {
|
|
|
|
|
glDisablei(GL_SCISSOR_TEST, i);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (updated.scissor.enabled &&
|
|
|
|
|
(scissor_changed || updated.scissor.x != current.scissor.x ||
|
|
|
|
|
updated.scissor.y != current.scissor.y ||
|
|
|
|
|
updated.scissor.width != current.scissor.width ||
|
|
|
|
|
updated.scissor.height != current.scissor.height)) {
|
|
|
|
|
glScissorIndexed(i, updated.scissor.x, updated.scissor.y, updated.scissor.width,
|
|
|
|
|
updated.scissor.height);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
const auto& current = cur_state.viewports[0];
|
|
|
|
@ -273,6 +274,21 @@ void OpenGLState::ApplyViewport() const {
|
|
|
|
|
updated.depth_range_far != current.depth_range_far) {
|
|
|
|
|
glDepthRange(updated.depth_range_near, updated.depth_range_far);
|
|
|
|
|
}
|
|
|
|
|
const bool scissor_changed = updated.scissor.enabled != current.scissor.enabled;
|
|
|
|
|
if (scissor_changed) {
|
|
|
|
|
if (updated.scissor.enabled) {
|
|
|
|
|
glEnable(GL_SCISSOR_TEST);
|
|
|
|
|
} else {
|
|
|
|
|
glDisable(GL_SCISSOR_TEST);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (updated.scissor.enabled && (scissor_changed || updated.scissor.x != current.scissor.x ||
|
|
|
|
|
updated.scissor.y != current.scissor.y ||
|
|
|
|
|
updated.scissor.width != current.scissor.width ||
|
|
|
|
|
updated.scissor.height != current.scissor.height)) {
|
|
|
|
|
glScissor(updated.scissor.x, updated.scissor.y, updated.scissor.width,
|
|
|
|
|
updated.scissor.height);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -483,7 +499,6 @@ void OpenGLState::Apply() const {
|
|
|
|
|
}
|
|
|
|
|
ApplyColorMask();
|
|
|
|
|
ApplyViewport();
|
|
|
|
|
ApplyScissor();
|
|
|
|
|
ApplyStencilTest();
|
|
|
|
|
ApplySRgb();
|
|
|
|
|
ApplyCulling();
|
|
|
|
|