diff options
| author | 2019-02-08 20:06:49 -0400 | |
|---|---|---|
| committer | 2019-02-27 21:58:43 -0400 | |
| commit | 5bc82d124cbf26f62cf62c26dc212f556e603547 (patch) | |
| tree | 800326cd5ecf0dd7e3306bc0ffcc3cfe01f39936 /src | |
| parent | rasterizer_cache_gl: Implement Partial Reinterpretation of Surfaces. (diff) | |
| download | yuzu-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.cpp | 7 | ||||
| -rw-r--r-- | src/video_core/renderer_opengl/gl_rasterizer_cache.cpp | 39 | ||||
| -rw-r--r-- | src/video_core/renderer_opengl/gl_rasterizer_cache.h | 5 |
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 | |||
| 1392 | void RasterizerCacheOpenGL::NotifyFrameBufferChange(Surface triggering_surface) { | 1392 | void 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 | ||
| 1405 | void RasterizerCacheOpenGL::SignalPreDrawCall() { | ||
| 1406 | if (texception) { | ||
| 1407 | glTextureBarrier(); | ||
| 1408 | } | ||
| 1409 | } | ||
| 1410 | |||
| 1411 | void 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 | |||
| 1427 | void RasterizerCacheOpenGL::SignalPostFramebufferSetup() { | ||
| 1428 | if (!run_texception_pass) | ||
| 1429 | texception = false; | ||
| 1430 | } | ||
| 1431 | |||
| 1432 | void 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 | |||
| 472 | private: | 477 | private: |
| 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); |