aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/core/hle/service/nvnflinger
diff options
context:
space:
mode:
authorLiam <[email protected]>2024-01-26 16:10:21 -0500
committerLiam <[email protected]>2024-02-09 09:20:53 -0500
commit0cb413c3d31b93ce347e997b9674c304094dab09 (patch)
tree959ef73963ea1e7975690d31eaf4ddc2f2ad6e19 /src/core/hle/service/nvnflinger
parent962c82540c304f909957776908aabcd261f2a7ba (diff)
downloadyuzu-mainline-0cb413c3d31b93ce347e997b9674c304094dab09.tar.gz
yuzu-mainline-0cb413c3d31b93ce347e997b9674c304094dab09.zip
nvnflinger/gpu: implement applet capture
Diffstat (limited to 'src/core/hle/service/nvnflinger')
-rw-r--r--src/core/hle/service/nvnflinger/fb_share_buffer_manager.cpp28
1 files changed, 25 insertions, 3 deletions
diff --git a/src/core/hle/service/nvnflinger/fb_share_buffer_manager.cpp b/src/core/hle/service/nvnflinger/fb_share_buffer_manager.cpp
index 6a7da0cae..90f7248a0 100644
--- a/src/core/hle/service/nvnflinger/fb_share_buffer_manager.cpp
+++ b/src/core/hle/service/nvnflinger/fb_share_buffer_manager.cpp
@@ -15,6 +15,7 @@
#include "core/hle/service/vi/layer/vi_layer.h"
#include "core/hle/service/vi/vi_results.h"
#include "video_core/gpu.h"
+#include "video_core/host1x/host1x.h"
namespace Service::Nvnflinger {
@@ -414,9 +415,30 @@ Result FbShareBufferManager::GetSharedFrameBufferAcquirableEvent(Kernel::KReadab
R_SUCCEED();
}
-Result FbShareBufferManager::WriteAppletCaptureBuffer(bool* out_was_written,
- s32* out_layer_index) {
- // TODO
+Result FbShareBufferManager::WriteAppletCaptureBuffer(bool* out_was_written, s32* out_layer_index) {
+ std::vector<u8> capture_buffer(m_system.GPU().GetAppletCaptureBuffer());
+ Common::ScratchBuffer<u32> scratch;
+
+ // TODO: this could be optimized
+ s64 e = -1280 * 768 * 4;
+ for (auto& block : *m_buffer_page_group) {
+ u8* start = m_system.DeviceMemory().GetPointer<u8>(block.GetAddress());
+ u8* end = m_system.DeviceMemory().GetPointer<u8>(block.GetAddress() + block.GetSize());
+
+ for (; start < end; start++) {
+ *start = 0;
+
+ if (e >= 0 && e < static_cast<s64>(capture_buffer.size())) {
+ *start = capture_buffer[e];
+ }
+ e++;
+ }
+
+ m_system.GPU().Host1x().MemoryManager().ApplyOpOnPointer(start, scratch, [&](DAddr addr) {
+ m_system.GPU().InvalidateRegion(addr, end - start);
+ });
+ }
+
*out_was_written = true;
*out_layer_index = 1;
R_SUCCEED();