mirror of
https://github.com/simple64/simple64.git
synced 2026-11-12 05:38:44 +01:00
update parallel rdp
This commit is contained in:
1 parent
ac086b558f
commit
0739a7a9e8
4 files changed
+66
-7
No files matched your search
@@ -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;
|
||||
|
||||
Reference in new issue
Block a user