summaryrefslogtreecommitdiffstats
path: root/src/video_core/renderer_opengl/gl_blit_screen.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/video_core/renderer_opengl/gl_blit_screen.cpp')
-rw-r--r--src/video_core/renderer_opengl/gl_blit_screen.cpp96
1 files changed, 96 insertions, 0 deletions
diff --git a/src/video_core/renderer_opengl/gl_blit_screen.cpp b/src/video_core/renderer_opengl/gl_blit_screen.cpp
new file mode 100644
index 000000000..6ba8b214b
--- /dev/null
+++ b/src/video_core/renderer_opengl/gl_blit_screen.cpp
@@ -0,0 +1,96 @@
+// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include "common/settings.h"
+#include "video_core/renderer_opengl/gl_blit_screen.h"
+#include "video_core/renderer_opengl/gl_state_tracker.h"
+#include "video_core/renderer_opengl/present/filters.h"
+#include "video_core/renderer_opengl/present/layer.h"
+#include "video_core/renderer_opengl/present/window_adapt_pass.h"
+
+namespace OpenGL {
+
+BlitScreen::BlitScreen(RasterizerOpenGL& rasterizer_,
+ Tegra::MaxwellDeviceMemoryManager& device_memory_,
+ StateTracker& state_tracker_, ProgramManager& program_manager_,
+ Device& device_)
+ : rasterizer(rasterizer_), device_memory(device_memory_), state_tracker(state_tracker_),
+ program_manager(program_manager_), device(device_) {}
+
+BlitScreen::~BlitScreen() = default;
+
+void BlitScreen::DrawScreen(std::span<const Tegra::FramebufferConfig> framebuffers,
+ const Layout::FramebufferLayout& layout) {
+ // TODO: Signal state tracker about these changes
+ state_tracker.NotifyScreenDrawVertexArray();
+ state_tracker.NotifyPolygonModes();
+ state_tracker.NotifyViewport0();
+ state_tracker.NotifyScissor0();
+ state_tracker.NotifyColorMask(0);
+ state_tracker.NotifyBlend0();
+ state_tracker.NotifyFramebuffer();
+ state_tracker.NotifyFrontFace();
+ state_tracker.NotifyCullTest();
+ state_tracker.NotifyDepthTest();
+ state_tracker.NotifyStencilTest();
+ state_tracker.NotifyPolygonOffset();
+ state_tracker.NotifyRasterizeEnable();
+ state_tracker.NotifyFramebufferSRGB();
+ state_tracker.NotifyLogicOp();
+ state_tracker.NotifyClipControl();
+ state_tracker.NotifyAlphaTest();
+ state_tracker.ClipControl(GL_LOWER_LEFT, GL_ZERO_TO_ONE);
+
+ glEnable(GL_CULL_FACE);
+ glDisable(GL_COLOR_LOGIC_OP);
+ glDisable(GL_DEPTH_TEST);
+ glDisable(GL_STENCIL_TEST);
+ glDisable(GL_POLYGON_OFFSET_FILL);
+ glDisable(GL_RASTERIZER_DISCARD);
+ glDisable(GL_ALPHA_TEST);
+ glDisablei(GL_BLEND, 0);
+ glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
+ glCullFace(GL_BACK);
+ glFrontFace(GL_CW);
+ glColorMaski(0, GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
+ glDepthRangeIndexed(0, 0.0, 0.0);
+
+ while (layers.size() < framebuffers.size()) {
+ layers.emplace_back(rasterizer, device_memory);
+ }
+
+ CreateWindowAdapt();
+ window_adapt->DrawToFramebuffer(program_manager, layers, framebuffers, layout);
+
+ // TODO
+ // program_manager.RestoreGuestPipeline();
+}
+
+void BlitScreen::CreateWindowAdapt() {
+ if (window_adapt && Settings::values.scaling_filter.GetValue() == current_window_adapt) {
+ return;
+ }
+
+ current_window_adapt = Settings::values.scaling_filter.GetValue();
+ switch (current_window_adapt) {
+ case Settings::ScalingFilter::NearestNeighbor:
+ window_adapt = MakeNearestNeighbor(device);
+ break;
+ case Settings::ScalingFilter::Bicubic:
+ window_adapt = MakeBicubic(device);
+ break;
+ case Settings::ScalingFilter::Gaussian:
+ window_adapt = MakeGaussian(device);
+ break;
+ case Settings::ScalingFilter::ScaleForce:
+ window_adapt = MakeScaleForce(device);
+ break;
+ case Settings::ScalingFilter::Fsr:
+ case Settings::ScalingFilter::Bilinear:
+ default:
+ window_adapt = MakeBilinear(device);
+ break;
+ }
+}
+
+} // namespace OpenGL