From 0739a7a9e865d3c4173689a45215e2755d0e5e7c Mon Sep 17 00:00:00 2001 From: Logan McNaughton <848146+loganmc10@users.noreply.github.com> Date: Tue, 5 Jul 2022 10:58:09 -0600 Subject: [PATCH] update parallel rdp --- parallel-rdp-standalone/gfx_m64p.c | 8 ++-- parallel-rdp-standalone/parallel_imp.cpp | 58 +++++++++++++++++++++++- parallel-rdp-standalone/parallel_imp.h | 1 + parallel-rdp-standalone/vkguts.h | 6 +-- 4 files changed, 66 insertions(+), 7 deletions(-) diff --git a/parallel-rdp-standalone/gfx_m64p.c b/parallel-rdp-standalone/gfx_m64p.c index dbbd2d6..a7b6af1 100644 --- a/parallel-rdp-standalone/gfx_m64p.c +++ b/parallel-rdp-standalone/gfx_m64p.c @@ -75,9 +75,9 @@ static bool plugin_initialized; bool window_fullscreen; bool window_widescreen; -int32_t window_width; -int32_t window_height; -int32_t window_vsync; +uint32_t window_width; +uint32_t window_height; +bool window_vsync; void (*debug_callback)(void *, int, const char *); void *debug_call_context; @@ -337,6 +337,8 @@ EXPORT void CALL ReadScreen2(void *dest, int *width, int *height, int front) { *width = window_width; *height = window_height; + if (dest) + vk_read_screen(dest); } EXPORT void CALL SetRenderingCallback(void (*callback)(int)) diff --git a/parallel-rdp-standalone/parallel_imp.cpp b/parallel-rdp-standalone/parallel_imp.cpp index 2ae55e0..6b77b22 100644 --- a/parallel-rdp-standalone/parallel_imp.cpp +++ b/parallel-rdp-standalone/parallel_imp.cpp @@ -21,7 +21,6 @@ static QT_WSIPlatform* wsi_platform; int32_t vk_rescaling; bool vk_ssreadbacks; bool vk_ssdither; -unsigned width, height; unsigned vk_overscan; unsigned vk_vertical_stretch; unsigned vk_downscaling_steps; @@ -265,6 +264,63 @@ void vk_rasterize() wsi->begin_frame(); } +void vk_read_screen(unsigned char* dest) +{ + Vulkan::Fence fence; + Vulkan::BufferHandle buffer; + Vulkan::BufferCreateInfo info = {}; + Vulkan::ImageView* image = &wsi->get_device().get_swapchain_view(); + info.size = window_width * window_height * sizeof(uint32_t); + info.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT; + info.domain = Vulkan::BufferDomain::CachedHost; + if (!buffer || buffer->get_create_info().size < info.size) + buffer = wsi->get_device().create_buffer(info); + + auto cmd = wsi->get_device().request_command_buffer(); + cmd->copy_image_to_buffer(*buffer, image->get_image(), 0, {}, { window_width, window_height, 1 }, 0, 0, { VK_IMAGE_ASPECT_COLOR_BIT, 0, 0, 1 }); + cmd->barrier(VK_PIPELINE_STAGE_TRANSFER_BIT, VK_ACCESS_TRANSFER_WRITE_BIT, + VK_PIPELINE_STAGE_HOST_BIT, VK_ACCESS_HOST_READ_BIT); + + fence.reset(); + wsi->get_device().submit(cmd, &fence); + + fence->wait(); + unsigned char *image_buffer = (unsigned char*)wsi->get_device().map_host_buffer(*buffer, Vulkan::MEMORY_ACCESS_READ_BIT); + + image_buffer = image_buffer + info.size; + for (int i = 0; i < window_height; ++i) + { + image_buffer -= window_width * 4; + for (int j = 0; j < window_width; ++j) + { + switch (image->get_format()) { + case VK_FORMAT_B8G8R8A8_UNORM: + dest[0] = image_buffer[2]; + dest[1] = image_buffer[1]; + dest[2] = image_buffer[0]; + break; + case VK_FORMAT_R8G8B8A8_UNORM: + dest[0] = image_buffer[0]; + dest[1] = image_buffer[1]; + dest[2] = image_buffer[2]; + break; + case VK_FORMAT_A8B8G8R8_UNORM_PACK32: + dest[0] = image_buffer[3]; + dest[1] = image_buffer[2]; + dest[2] = image_buffer[1]; + break; + default: + wsi->get_device().unmap_host_buffer(*buffer, Vulkan::MEMORY_ACCESS_READ_BIT); + return; + } + dest += 3; + image_buffer += 4; + } + image_buffer -= window_width * 4; + } + wsi->get_device().unmap_host_buffer(*buffer, Vulkan::MEMORY_ACCESS_READ_BIT); +} + void vk_process_commands() { const uint32_t DP_CURRENT = *GET_GFX_INFO(DPC_CURRENT_REG) & 0x00FFFFF8; diff --git a/parallel-rdp-standalone/parallel_imp.h b/parallel-rdp-standalone/parallel_imp.h index 9f94b82..3792816 100644 --- a/parallel-rdp-standalone/parallel_imp.h +++ b/parallel-rdp-standalone/parallel_imp.h @@ -29,6 +29,7 @@ extern "C" bool vk_init(); void vk_destroy(); void vk_resize(); + void vk_read_screen(unsigned char* dest); #ifdef __cplusplus } diff --git a/parallel-rdp-standalone/vkguts.h b/parallel-rdp-standalone/vkguts.h index 6a911f7..1810c15 100644 --- a/parallel-rdp-standalone/vkguts.h +++ b/parallel-rdp-standalone/vkguts.h @@ -17,9 +17,9 @@ extern "C" extern bool window_fullscreen; extern bool window_widescreen; - extern int32_t window_width; - extern int32_t window_height; - extern int32_t window_vsync; + extern uint32_t window_width; + extern uint32_t window_height; + extern bool window_vsync; #ifdef __cplusplus }