summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar Fernando Sahmkow2019-02-08 20:06:49 -0400
committerGravatar FernandoS272019-02-27 21:58:43 -0400
commit5bc82d124cbf26f62cf62c26dc212f556e603547 (patch)
tree800326cd5ecf0dd7e3306bc0ffcc3cfe01f39936 /src
parentrasterizer_cache_gl: Implement Partial Reinterpretation of Surfaces. (diff)
downloadyuzu-5bc82d124cbf26f62cf62c26dc212f556e603547.tar.gz
yuzu-5bc82d124cbf26f62cf62c26dc212f556e603547.tar.xz
yuzu-5bc82d124cbf26f62cf62c26dc212f556e603547.zip
rasterizer_cache_gl: Implement Texception Pass
Diffstat (limited to 'src')
-rw-r--r--src/video_core/renderer_opengl/gl_rasterizer.cpp7
-rw-r--r--src/video_core/renderer_opengl/gl_rasterizer_cache.cpp39
-rw-r--r--src/video_core/renderer_opengl/gl_rasterizer_cache.h5
3 files changed, 51 insertions, 0 deletions
diff --git a/src/video_core/renderer_opengl/gl_rasterizer.cpp b/src/video_core/renderer_opengl/gl_rasterizer.cpp
index ee04569fa..1a0a18c3e 100644
--- a/src/video_core/renderer_opengl/gl_rasterizer.cpp
+++ b/src/video_core/renderer_opengl/gl_rasterizer.cpp
@@ -575,6 +575,8 @@ std::pair<bool, bool> RasterizerOpenGL::ConfigureFramebuffers(
575 SetupCachedFramebuffer(fbkey, current_state); 575 SetupCachedFramebuffer(fbkey, current_state);
576 SyncViewport(current_state); 576 SyncViewport(current_state);
577 577
578 res_cache.SignalPostFramebufferSetup();
579
578 return current_depth_stencil_usage = {static_cast<bool>(depth_surface), fbkey.stencil_enable}; 580 return current_depth_stencil_usage = {static_cast<bool>(depth_surface), fbkey.stencil_enable};
579} 581}
580 582
@@ -738,9 +740,13 @@ void RasterizerOpenGL::DrawArrays() {
738 shader_program_manager->ApplyTo(state); 740 shader_program_manager->ApplyTo(state);
739 state.Apply(); 741 state.Apply();
740 742
743 res_cache.SignalPreDrawCall();
744
741 // Execute draw call 745 // Execute draw call
742 params.DispatchDraw(); 746 params.DispatchDraw();
743 747
748 res_cache.SignalPostDrawCall();
749
744 // Disable scissor test 750 // Disable scissor test
745 state.viewports[0].scissor.enabled = false; 751 state.viewports[0].scissor.enabled = false;
746 752
@@ -1013,6 +1019,7 @@ void RasterizerOpenGL::SetupTextures(Maxwell::ShaderStage stage, const Shader& s
1013 texture_samplers[current_bindpoint].SyncWithConfig(texture.tsc); 1019 texture_samplers[current_bindpoint].SyncWithConfig(texture.tsc);
1014 1020
1015 Surface surface = res_cache.GetTextureSurface(texture, entry); 1021 Surface surface = res_cache.GetTextureSurface(texture, entry);
1022 res_cache.SignalSurfaceParameter(surface);
1016 if (surface != nullptr) { 1023 if (surface != nullptr) {
1017 state.texture_units[current_bindpoint].texture = 1024 state.texture_units[current_bindpoint].texture =
1018 entry.IsArray() ? surface->TextureLayer().handle : surface->Texture().handle; 1025 entry.IsArray() ? surface->TextureLayer().handle : surface->Texture().handle;
diff --git a/src/video_core/renderer_opengl/gl_rasterizer_cache.cpp b/src/video_core/renderer_opengl/gl_rasterizer_cache.cpp
index 367dbd041..5e97e2f7a 100644
--- a/src/video_core/renderer_opengl/gl_rasterizer_cache.cpp
+++ b/src/video_core/renderer_opengl/gl_rasterizer_cache.cpp
@@ -1392,10 +1392,49 @@ bool RasterizerCacheOpenGL::PartialReinterpretSurface(Surface triggering_surface
1392void RasterizerCacheOpenGL::NotifyFrameBufferChange(Surface triggering_surface) { 1392void RasterizerCacheOpenGL::NotifyFrameBufferChange(Surface triggering_surface) {
1393 if (triggering_surface == nullptr) 1393 if (triggering_surface == nullptr)
1394 return; 1394 return;
1395 run_texception_pass = false;
1396 if (texception) {
1397 return;
1398 }
1395 Surface intersect = CollideOnReinterpretedSurface(triggering_surface->GetAddr()); 1399 Surface intersect = CollideOnReinterpretedSurface(triggering_surface->GetAddr());
1396 if (intersect != nullptr) { 1400 if (intersect != nullptr) {
1397 PartialReinterpretSurface(triggering_surface, intersect); 1401 PartialReinterpretSurface(triggering_surface, intersect);
1398 } 1402 }
1399} 1403}
1400 1404
1405void RasterizerCacheOpenGL::SignalPreDrawCall() {
1406 if (texception) {
1407 glTextureBarrier();
1408 }
1409}
1410
1411void RasterizerCacheOpenGL::SignalPostDrawCall() {
1412 if (!run_texception_pass)
1413 return;
1414 for (u32 i = 0; i < Maxwell::NumRenderTargets; i++) {
1415 if (current_color_buffers[i] != nullptr) {
1416 Surface intersect = CollideOnReinterpretedSurface(current_color_buffers[i]->GetAddr());
1417 if (intersect != nullptr) {
1418 PartialReinterpretSurface(current_color_buffers[i], intersect);
1419 texception = true;
1420 }
1421 }
1422 }
1423 if (!texception)
1424 run_texception_pass = false;
1425}
1426
1427void RasterizerCacheOpenGL::SignalPostFramebufferSetup() {
1428 if (!run_texception_pass)
1429 texception = false;
1430}
1431
1432void RasterizerCacheOpenGL::SignalSurfaceParameter(Surface& surface) {
1433 if (surface == nullptr)
1434 return;
1435 if (surface->IsReinterpreted()) {
1436 run_texception_pass = true;
1437 }
1438}
1439
1401} // namespace OpenGL 1440} // namespace OpenGL
diff --git a/src/video_core/renderer_opengl/gl_rasterizer_cache.h b/src/video_core/renderer_opengl/gl_rasterizer_cache.h
index 2be056f0a..8c3cddf6a 100644
--- a/src/video_core/renderer_opengl/gl_rasterizer_cache.h
+++ b/src/video_core/renderer_opengl/gl_rasterizer_cache.h
@@ -469,6 +469,11 @@ public:
469 const Common::Rectangle<u32>& src_rect, 469 const Common::Rectangle<u32>& src_rect,
470 const Common::Rectangle<u32>& dst_rect); 470 const Common::Rectangle<u32>& dst_rect);
471 471
472 void SignalPreDrawCall();
473 void SignalPostDrawCall();
474 void SignalSurfaceParameter(Surface& surface);
475 void SignalPostFramebufferSetup();
476
472private: 477private:
473 void LoadSurface(const Surface& surface); 478 void LoadSurface(const Surface& surface);
474 Surface GetSurface(const SurfaceParams& params, bool preserve_contents = true); 479 Surface GetSurface(const SurfaceParams& params, bool preserve_contents = true);