summaryrefslogtreecommitdiffstats
path: root/src/core/hle/service/nvdrv
diff options
context:
space:
mode:
authorLiam <byteslice@airmail.cc>2024-01-22 18:40:50 +0100
committerLiam <byteslice@airmail.cc>2024-01-31 17:27:21 +0100
commita595e9e8a7a6a742481b1cd05455d3c639095413 (patch)
tree03f8dfaec328171c42b090988e93c51e8d726eda /src/core/hle/service/nvdrv
parentrenderer_opengl: implement layer stack composition (diff)
downloadyuzu-a595e9e8a7a6a742481b1cd05455d3c639095413.tar
yuzu-a595e9e8a7a6a742481b1cd05455d3c639095413.tar.gz
yuzu-a595e9e8a7a6a742481b1cd05455d3c639095413.tar.bz2
yuzu-a595e9e8a7a6a742481b1cd05455d3c639095413.tar.lz
yuzu-a595e9e8a7a6a742481b1cd05455d3c639095413.tar.xz
yuzu-a595e9e8a7a6a742481b1cd05455d3c639095413.tar.zst
yuzu-a595e9e8a7a6a742481b1cd05455d3c639095413.zip
Diffstat (limited to 'src/core/hle/service/nvdrv')
-rw-r--r--src/core/hle/service/nvdrv/devices/nvdisp_disp0.cpp35
-rw-r--r--src/core/hle/service/nvdrv/devices/nvdisp_disp0.h10
2 files changed, 27 insertions, 18 deletions
diff --git a/src/core/hle/service/nvdrv/devices/nvdisp_disp0.cpp b/src/core/hle/service/nvdrv/devices/nvdisp_disp0.cpp
index c1ebbd62d..abe95303e 100644
--- a/src/core/hle/service/nvdrv/devices/nvdisp_disp0.cpp
+++ b/src/core/hle/service/nvdrv/devices/nvdisp_disp0.cpp
@@ -1,6 +1,8 @@
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
+#include <boost/container/small_vector.hpp>
+
#include "common/assert.h"
#include "common/logging/log.h"
#include "core/core.h"
@@ -38,19 +40,30 @@ NvResult nvdisp_disp0::Ioctl3(DeviceFD fd, Ioctl command, std::span<const u8> in
void nvdisp_disp0::OnOpen(NvCore::SessionId session_id, DeviceFD fd) {}
void nvdisp_disp0::OnClose(DeviceFD fd) {}
-void nvdisp_disp0::flip(u32 buffer_handle, u32 offset, android::PixelFormat format, u32 width,
- u32 height, u32 stride, android::BufferTransformFlags transform,
- const Common::Rectangle<int>& crop_rect,
- std::array<Service::Nvidia::NvFence, 4>& fences, u32 num_fences) {
- const DAddr addr = nvmap.GetHandleAddress(buffer_handle);
- LOG_TRACE(Service,
- "Drawing from address {:X} offset {:08X} Width {} Height {} Stride {} Format {}",
- addr, offset, width, height, stride, format);
+void nvdisp_disp0::Composite(std::span<const Nvnflinger::HwcLayer> sorted_layers) {
+ std::vector<Tegra::FramebufferConfig> output_layers;
+ std::vector<Service::Nvidia::NvFence> output_fences;
+ output_layers.reserve(sorted_layers.size());
+ output_fences.reserve(sorted_layers.size());
+
+ for (auto& layer : sorted_layers) {
+ output_layers.emplace_back(Tegra::FramebufferConfig{
+ .address = nvmap.GetHandleAddress(layer.buffer_handle),
+ .offset = layer.offset,
+ .width = layer.width,
+ .height = layer.height,
+ .stride = layer.stride,
+ .pixel_format = layer.format,
+ .transform_flags = layer.transform,
+ .crop_rect = layer.crop_rect,
+ });
- const Tegra::FramebufferConfig framebuffer{addr, offset, width, height,
- stride, format, transform, crop_rect};
+ for (size_t i = 0; i < layer.acquire_fence.num_fences; i++) {
+ output_fences.push_back(layer.acquire_fence.fences[i]);
+ }
+ }
- system.GPU().RequestSwapBuffers(&framebuffer, fences, num_fences);
+ system.GPU().RequestComposite(std::move(output_layers), std::move(output_fences));
system.SpeedLimiter().DoSpeedLimiting(system.CoreTiming().GetGlobalTimeUs());
system.GetPerfStats().EndSystemFrame();
system.GetPerfStats().BeginSystemFrame();
diff --git a/src/core/hle/service/nvdrv/devices/nvdisp_disp0.h b/src/core/hle/service/nvdrv/devices/nvdisp_disp0.h
index 5f13a50a2..1082b85c2 100644
--- a/src/core/hle/service/nvdrv/devices/nvdisp_disp0.h
+++ b/src/core/hle/service/nvdrv/devices/nvdisp_disp0.h
@@ -8,8 +8,7 @@
#include "common/common_types.h"
#include "common/math_util.h"
#include "core/hle/service/nvdrv/devices/nvdevice.h"
-#include "core/hle/service/nvnflinger/buffer_transform_flags.h"
-#include "core/hle/service/nvnflinger/pixel_format.h"
+#include "core/hle/service/nvnflinger/hwc_layer.h"
namespace Service::Nvidia::NvCore {
class Container;
@@ -35,11 +34,8 @@ public:
void OnOpen(NvCore::SessionId session_id, DeviceFD fd) override;
void OnClose(DeviceFD fd) override;
- /// Performs a screen flip, drawing the buffer pointed to by the handle.
- void flip(u32 buffer_handle, u32 offset, android::PixelFormat format, u32 width, u32 height,
- u32 stride, android::BufferTransformFlags transform,
- const Common::Rectangle<int>& crop_rect,
- std::array<Service::Nvidia::NvFence, 4>& fences, u32 num_fences);
+ /// Performs a screen flip, compositing each buffer.
+ void Composite(std::span<const Nvnflinger::HwcLayer> sorted_layers);
Kernel::KEvent* QueryEvent(u32 event_id) override;