VideoBackends: Restore the framebuffer as part of the API state

It's not often we switch out to draw to the EFB anyway.
This commit is contained in:
Stenzek
2018-02-09 21:41:31 +10:00
parent ed03304ce7
commit 887e3830ba
10 changed files with 7 additions and 23 deletions

View File

@ -144,7 +144,6 @@ void DXTexture::ScaleRectangleFromTexture(const AbstractTexture* source,
VertexShaderCache::GetSimpleInputLayout(), VertexShaderCache::GetSimpleInputLayout(),
GeometryShaderCache::GetCopyGeometryShader(), 1.0, 0); GeometryShaderCache::GetCopyGeometryShader(), 1.0, 0);
FramebufferManager::BindEFBRenderTarget();
g_renderer->RestoreAPIState(); g_renderer->RestoreAPIState();
} }

View File

@ -87,9 +87,7 @@ D3DTexture2D*& FramebufferManager::GetResolvedEFBDepthTexture()
PixelShaderCache::GetDepthResolveProgram(), VertexShaderCache::GetSimpleVertexShader(), PixelShaderCache::GetDepthResolveProgram(), VertexShaderCache::GetSimpleVertexShader(),
VertexShaderCache::GetSimpleInputLayout(), GeometryShaderCache::GetCopyGeometryShader()); VertexShaderCache::GetSimpleInputLayout(), GeometryShaderCache::GetCopyGeometryShader());
BindEFBRenderTarget();
g_renderer->RestoreAPIState(); g_renderer->RestoreAPIState();
return m_efb.resolved_depth_tex; return m_efb.resolved_depth_tex;
} }
else else

View File

@ -131,8 +131,6 @@ void PSTextureEncoder::Encode(u8* dst, const EFBCopyParams& params, u32 native_w
} }
} }
// Restore API
FramebufferManager::BindEFBRenderTarget();
g_renderer->RestoreAPIState(); g_renderer->RestoreAPIState();
} }

View File

@ -450,7 +450,6 @@ u32 Renderer::AccessEFB(EFBAccessType type, u32 x, u32 y, u32 poke_data)
VertexShaderCache::GetSimpleInputLayout()); VertexShaderCache::GetSimpleInputLayout());
// Restore expected game state. // Restore expected game state.
FramebufferManager::BindEFBRenderTarget();
RestoreAPIState(); RestoreAPIState();
// Copy the pixel from the renderable to cpu-readable buffer. // Copy the pixel from the renderable to cpu-readable buffer.
@ -525,7 +524,6 @@ void Renderer::PokeEFB(EFBAccessType type, const EfbPokeData* points, size_t num
D3D11_VIEWPORT vp = D3D11_VIEWPORT vp =
CD3D11_VIEWPORT(0.0f, 0.0f, (float)GetTargetWidth(), (float)GetTargetHeight()); CD3D11_VIEWPORT(0.0f, 0.0f, (float)GetTargetWidth(), (float)GetTargetHeight());
D3D::context->RSSetViewports(1, &vp); D3D::context->RSSetViewports(1, &vp);
FramebufferManager::BindEFBRenderTarget(false);
} }
else // if (type == EFBAccessType::PokeZ) else // if (type == EFBAccessType::PokeZ)
{ {
@ -536,7 +534,6 @@ void Renderer::PokeEFB(EFBAccessType type, const EfbPokeData* points, size_t num
CD3D11_VIEWPORT(0.0f, 0.0f, (float)GetTargetWidth(), (float)GetTargetHeight()); CD3D11_VIEWPORT(0.0f, 0.0f, (float)GetTargetWidth(), (float)GetTargetHeight());
D3D::context->RSSetViewports(1, &vp); D3D::context->RSSetViewports(1, &vp);
FramebufferManager::BindEFBRenderTarget();
} }
D3D::DrawEFBPokeQuads(type, points, num_points); D3D::DrawEFBPokeQuads(type, points, num_points);
@ -627,10 +624,8 @@ void Renderer::ReinterpretPixelData(unsigned int convtype)
GetTargetHeight(), pixel_shader, VertexShaderCache::GetSimpleVertexShader(), GetTargetHeight(), pixel_shader, VertexShaderCache::GetSimpleVertexShader(),
VertexShaderCache::GetSimpleInputLayout(), GeometryShaderCache::GetCopyGeometryShader()); VertexShaderCache::GetSimpleInputLayout(), GeometryShaderCache::GetCopyGeometryShader());
RestoreAPIState();
FramebufferManager::SwapReinterpretTexture(); FramebufferManager::SwapReinterpretTexture();
FramebufferManager::BindEFBRenderTarget(); RestoreAPIState();
} }
void Renderer::SetBlendingState(const BlendingState& state) void Renderer::SetBlendingState(const BlendingState& state)
@ -707,7 +702,6 @@ void Renderer::SwapImpl(AbstractTexture* texture, const EFBRectangle& xfb_region
// begin next frame // begin next frame
RestoreAPIState(); RestoreAPIState();
FramebufferManager::BindEFBRenderTarget();
} }
void Renderer::CheckForSurfaceChange() void Renderer::CheckForSurfaceChange()
@ -769,6 +763,7 @@ void Renderer::ResetAPIState()
void Renderer::RestoreAPIState() void Renderer::RestoreAPIState()
{ {
// Gets us back into a more game-like state. // Gets us back into a more game-like state.
FramebufferManager::BindEFBRenderTarget();
BPFunctions::SetViewport(); BPFunctions::SetViewport();
BPFunctions::SetScissor(); BPFunctions::SetScissor();
} }

View File

@ -160,7 +160,6 @@ void TextureCache::ConvertTexture(TCacheEntry* destination, TCacheEntry* source,
VertexShaderCache::GetSimpleVertexShader(), VertexShaderCache::GetSimpleInputLayout(), VertexShaderCache::GetSimpleVertexShader(), VertexShaderCache::GetSimpleInputLayout(),
GeometryShaderCache::GetCopyGeometryShader()); GeometryShaderCache::GetCopyGeometryShader());
FramebufferManager::BindEFBRenderTarget();
g_renderer->RestoreAPIState(); g_renderer->RestoreAPIState();
} }
@ -275,7 +274,6 @@ void TextureCache::CopyEFBToCacheEntry(TCacheEntry* entry, bool is_depth_copy,
pixel_shader, VertexShaderCache::GetSimpleVertexShader(), pixel_shader, VertexShaderCache::GetSimpleVertexShader(),
VertexShaderCache::GetSimpleInputLayout(), GeometryShaderCache::GetCopyGeometryShader()); VertexShaderCache::GetSimpleInputLayout(), GeometryShaderCache::GetCopyGeometryShader());
FramebufferManager::BindEFBRenderTarget();
g_renderer->RestoreAPIState(); g_renderer->RestoreAPIState();
} }

View File

@ -219,7 +219,6 @@ void OGLTexture::ScaleRectangleFromTexture(const AbstractTexture* source,
glUniform4f(TextureCache::GetInstance()->GetColorCopyPositionUniform(), float(srcrect.left), glUniform4f(TextureCache::GetInstance()->GetColorCopyPositionUniform(), float(srcrect.left),
float(srcrect.top), float(srcrect.GetWidth()), float(srcrect.GetHeight())); float(srcrect.top), float(srcrect.GetWidth()), float(srcrect.GetHeight()));
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
FramebufferManager::SetFramebuffer(0);
g_renderer->RestoreAPIState(); g_renderer->RestoreAPIState();
} }

View File

@ -1416,9 +1416,6 @@ void Renderer::SwapImpl(AbstractTexture* texture, const EFBRectangle& xfb_region
g_texture_cache->Cleanup(frameCount); g_texture_cache->Cleanup(frameCount);
ProgramShaderCache::RetrieveAsyncShaders(); ProgramShaderCache::RetrieveAsyncShaders();
// Render to the framebuffer.
FramebufferManager::SetFramebuffer(0);
RestoreAPIState(); RestoreAPIState();
g_Config.iSaveTargetId = 0; g_Config.iSaveTargetId = 0;
@ -1499,6 +1496,8 @@ void Renderer::ResetAPIState()
void Renderer::RestoreAPIState() void Renderer::RestoreAPIState()
{ {
FramebufferManager::SetFramebuffer(0);
// Gets us back into a more game-like state. // Gets us back into a more game-like state.
glEnable(GL_SCISSOR_TEST); glEnable(GL_SCISSOR_TEST);
if (g_ActiveConfig.backend_info.bSupportsDepthClamp) if (g_ActiveConfig.backend_info.bSupportsDepthClamp)

View File

@ -323,7 +323,6 @@ void TextureCache::ConvertTexture(TCacheEntry* destination, TCacheEntry* source,
ProgramShaderCache::BindVertexFormat(nullptr); ProgramShaderCache::BindVertexFormat(nullptr);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
FramebufferManager::SetFramebuffer(0);
g_renderer->RestoreAPIState(); g_renderer->RestoreAPIState();
} }
@ -540,7 +539,6 @@ void TextureCache::CopyEFBToCacheEntry(TCacheEntry* entry, bool is_depth_copy,
ProgramShaderCache::BindVertexFormat(nullptr); ProgramShaderCache::BindVertexFormat(nullptr);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
FramebufferManager::SetFramebuffer(0);
g_renderer->RestoreAPIState(); g_renderer->RestoreAPIState();
} }
} }

View File

@ -133,8 +133,6 @@ static void EncodeToRamUsingShader(GLuint srcTexture, u8* destAddr, u32 dst_line
s_encoding_readback_texture->CopyFromTexture(s_encoding_render_texture.get(), copy_rect, 0, 0, s_encoding_readback_texture->CopyFromTexture(s_encoding_render_texture.get(), copy_rect, 0, 0,
copy_rect); copy_rect);
s_encoding_readback_texture->ReadTexels(copy_rect, destAddr, writeStride); s_encoding_readback_texture->ReadTexels(copy_rect, destAddr, writeStride);
FramebufferManager::SetFramebuffer(0);
} }
void EncodeToRamFromTexture(u8* dest_ptr, const EFBCopyParams& params, u32 native_width, void EncodeToRamFromTexture(u8* dest_ptr, const EFBCopyParams& params, u32 native_width,
@ -157,7 +155,6 @@ void EncodeToRamFromTexture(u8* dest_ptr, const EFBCopyParams& params, u32 nativ
EncodeToRamUsingShader(read_texture, dest_ptr, bytes_per_row, num_blocks_y, memory_stride, EncodeToRamUsingShader(read_texture, dest_ptr, bytes_per_row, num_blocks_y, memory_stride,
scale_by_half && !params.depth, params.y_scale); scale_by_half && !params.depth, params.y_scale);
FramebufferManager::SetFramebuffer(0);
g_renderer->RestoreAPIState(); g_renderer->RestoreAPIState();
} }

View File

@ -1036,6 +1036,9 @@ void Renderer::ResetAPIState()
void Renderer::RestoreAPIState() void Renderer::RestoreAPIState()
{ {
StateTracker::GetInstance()->EndRenderPass();
BindEFBToStateTracker();
// Instruct the state tracker to re-bind everything before the next draw // Instruct the state tracker to re-bind everything before the next draw
StateTracker::GetInstance()->SetPendingRebind(); StateTracker::GetInstance()->SetPendingRebind();
} }