Skip to content
Permalink
Browse files

OGL: Invalidate tracked state when calling ResetAPIState()

Due to the current design, any of the GL state can be mutated after
calling this function, so we can't assume that the tracked state will
match if we call SetPipeline() after ResetAPIState().
  • Loading branch information...
stenzek committed Jan 19, 2019
1 parent 224b23b commit 396b7c2978498712f6e6eea7f353408f3c33c147
@@ -357,7 +357,10 @@ Renderer::Renderer(std::unique_ptr<GLContext> main_gl_context)
: ::Renderer(static_cast<int>(std::max(main_gl_context->GetBackBufferWidth(), 1u)),
static_cast<int>(std::max(main_gl_context->GetBackBufferHeight(), 1u)),
AbstractTextureFormat::RGBA8),
m_main_gl_context(std::move(main_gl_context))
m_main_gl_context(std::move(main_gl_context)),
m_current_rasterization_state(RenderState::GetInvalidRasterizationState()),
m_current_depth_state(RenderState::GetInvalidDepthState()),
m_current_blend_state(RenderState::GetInvalidBlendingState())
{
bool bSuccess = true;

@@ -1585,6 +1588,9 @@ void Renderer::ResetAPIState()
}
glDepthMask(GL_FALSE);
glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
m_current_rasterization_state = RenderState::GetInvalidRasterizationState();
m_current_depth_state = RenderState::GetInvalidDepthState();
m_current_blend_state = RenderState::GetInvalidBlendingState();
}

void Renderer::RestoreAPIState()
@@ -1603,10 +1609,6 @@ void Renderer::RestoreAPIState()
}
BPFunctions::SetScissor();
BPFunctions::SetViewport();

ApplyRasterizationState(m_current_rasterization_state, true);
ApplyDepthState(m_current_depth_state, true);
ApplyBlendingState(m_current_blend_state, true);
}

void Renderer::ApplyRasterizationState(const RasterizationState state, bool force)
@@ -168,8 +168,8 @@ class Renderer : public ::Renderer
std::unique_ptr<GLContext> m_main_gl_context;
std::array<const AbstractTexture*, 8> m_bound_textures{};
const OGLPipeline* m_graphics_pipeline = nullptr;
RasterizationState m_current_rasterization_state = {};
DepthState m_current_depth_state = {};
BlendingState m_current_blend_state = {};
RasterizationState m_current_rasterization_state;
DepthState m_current_depth_state;
BlendingState m_current_blend_state;
};
} // namespace OGL
@@ -199,13 +199,27 @@ SamplerState& SamplerState::operator=(const SamplerState& rhs)

namespace RenderState
{
RasterizationState GetInvalidRasterizationState()
{
RasterizationState state;
state.hex = UINT32_C(0xFFFFFFFF);
return state;
}

RasterizationState GetNoCullRasterizationState()
{
RasterizationState state = {};
state.cullmode = GenMode::CULL_NONE;
return state;
}

DepthState GetInvalidDepthState()
{
DepthState state;
state.hex = UINT32_C(0xFFFFFFFF);
return state;
}

DepthState GetNoDepthTestingDepthStencilState()
{
DepthState state = {};
@@ -215,6 +229,13 @@ DepthState GetNoDepthTestingDepthStencilState()
return state;
}

BlendingState GetInvalidBlendingState()
{
BlendingState state;
state.hex = UINT32_C(0xFFFFFFFF);
return state;
}

BlendingState GetNoBlendingBlendState()
{
BlendingState state = {};
@@ -230,6 +251,13 @@ BlendingState GetNoBlendingBlendState()
return state;
}

SamplerState GetInvalidSamplerState()
{
SamplerState state;
state.hex = UINT64_C(0xFFFFFFFFFFFFFFFF);
return state;
}

SamplerState GetPointSamplerState()
{
SamplerState state = {};
@@ -113,9 +113,13 @@ union SamplerState

namespace RenderState
{
RasterizationState GetInvalidRasterizationState();
RasterizationState GetNoCullRasterizationState();
DepthState GetInvalidDepthState();
DepthState GetNoDepthTestingDepthStencilState();
BlendingState GetInvalidBlendingState();
BlendingState GetNoBlendingBlendState();
SamplerState GetInvalidSamplerState();
SamplerState GetPointSamplerState();
SamplerState GetLinearSamplerState();
}

0 comments on commit 396b7c2

Please sign in to comment.
You can’t perform that action at this time.