From 4cfe1e32035dfdbe3b14ec97b22e2f6ea72f754c Mon Sep 17 00:00:00 2001 From: DrChat Date: Thu, 21 Dec 2017 22:38:35 -0600 Subject: [PATCH] [Vulkan] Support window scissor in IssueCopy --- src/xenia/gpu/registers.h | 22 ++ .../gpu/vulkan/vulkan_command_processor.cc | 77 +++++-- src/xenia/ui/vulkan/blitter.cc | 37 ++-- src/xenia/ui/vulkan/blitter.h | 19 +- .../ui/vulkan/shaders/bin/blit_color_frag.h | 6 +- .../ui/vulkan/shaders/bin/blit_color_frag.spv | Bin 1000 -> 1000 bytes .../ui/vulkan/shaders/bin/blit_color_frag.txt | 6 +- .../ui/vulkan/shaders/bin/blit_depth_frag.h | 6 +- .../ui/vulkan/shaders/bin/blit_depth_frag.spv | Bin 912 -> 912 bytes .../ui/vulkan/shaders/bin/blit_depth_frag.txt | 6 +- src/xenia/ui/vulkan/shaders/bin/blit_vert.h | 207 ++++++++++-------- src/xenia/ui/vulkan/shaders/bin/blit_vert.spv | Bin 1648 -> 2072 bytes src/xenia/ui/vulkan/shaders/bin/blit_vert.txt | 84 ++++--- .../ui/vulkan/shaders/bin/immediate_frag.h | 2 +- .../ui/vulkan/shaders/bin/immediate_frag.spv | Bin 1524 -> 1524 bytes .../ui/vulkan/shaders/bin/immediate_frag.txt | 2 +- .../ui/vulkan/shaders/bin/immediate_vert.h | 2 +- .../ui/vulkan/shaders/bin/immediate_vert.spv | Bin 1512 -> 1512 bytes .../ui/vulkan/shaders/bin/immediate_vert.txt | 2 +- src/xenia/ui/vulkan/shaders/blit.vert | 22 +- src/xenia/ui/vulkan/shaders/blit_color.frag | 4 +- src/xenia/ui/vulkan/shaders/blit_depth.frag | 4 +- 22 files changed, 324 insertions(+), 184 deletions(-) diff --git a/src/xenia/gpu/registers.h b/src/xenia/gpu/registers.h index 21666568f..0d7b9a1b0 100644 --- a/src/xenia/gpu/registers.h +++ b/src/xenia/gpu/registers.h @@ -179,6 +179,28 @@ union PA_CL_VTE_CNTL { uint32_t value; }; +union PA_SC_WINDOW_OFFSET { + xe::bf window_x_offset; + xe::bf window_y_offset; + + uint32_t value; +}; + +union PA_SC_WINDOW_SCISSOR_TL { + xe::bf tl_x; + xe::bf tl_y; + xe::bf window_offset_disable; + + uint32_t value; +}; + +union PA_SC_WINDOW_SCISSOR_BR { + xe::bf br_x; + xe::bf br_y; + + uint32_t value; +}; + /************************************************** ___ ___ | _ \ _ ) diff --git a/src/xenia/gpu/vulkan/vulkan_command_processor.cc b/src/xenia/gpu/vulkan/vulkan_command_processor.cc index 924b80caf..5727ab634 100644 --- a/src/xenia/gpu/vulkan/vulkan_command_processor.cc +++ b/src/xenia/gpu/vulkan/vulkan_command_processor.cc @@ -472,17 +472,26 @@ void VulkanCommandProcessor::PerformSwap(uint32_t frontbuffer_ptr, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, 0, 0, nullptr, 0, nullptr, 1, &barrier); + // Part of the source image that we want to blit from. VkRect2D src_rect = { {0, 0}, - {frontbuffer_width, frontbuffer_height}, + {texture->texture_info.width + 1, texture->texture_info.height + 1}, }; + VkRect2D dst_rect = {{0, 0}, {frontbuffer_width, frontbuffer_height}}; + + VkViewport viewport = { + 0.f, 0.f, float(frontbuffer_width), float(frontbuffer_height), + 0.f, 1.f}; + + VkRect2D scissor = {{0, 0}, {frontbuffer_width, frontbuffer_height}}; + blitter_->BlitTexture2D( copy_commands, current_batch_fence_, texture_cache_->DemandView(texture, 0x688)->view, src_rect, {texture->texture_info.width + 1, texture->texture_info.height + 1}, - VK_FORMAT_R8G8B8A8_UNORM, {0, 0}, - {frontbuffer_width, frontbuffer_height}, fb_framebuffer_, - VK_FILTER_LINEAR, true, true); + VK_FORMAT_R8G8B8A8_UNORM, dst_rect, + {frontbuffer_width, frontbuffer_height}, fb_framebuffer_, viewport, + scissor, VK_FILTER_LINEAR, true, true); std::swap(barrier.oldLayout, barrier.newLayout); barrier.srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT; @@ -923,7 +932,15 @@ bool VulkanCommandProcessor::IssueCopy() { uint32_t copy_ref; uint32_t copy_mask; uint32_t copy_surface_slice; - }* copy_regs = (decltype(copy_regs)) & regs[XE_GPU_REG_RB_COPY_CONTROL].u32; + }* copy_regs = reinterpret_cast( + ®s[XE_GPU_REG_RB_COPY_CONTROL].u32); + + struct { + reg::PA_SC_WINDOW_OFFSET window_offset; + reg::PA_SC_WINDOW_SCISSOR_TL window_scissor_tl; + reg::PA_SC_WINDOW_SCISSOR_BR window_scissor_br; + }* window_regs = reinterpret_cast( + ®s[XE_GPU_REG_PA_SC_WINDOW_OFFSET].u32); // True if the source tile is a color target bool is_color_source = copy_regs->copy_control.copy_src_select <= 3; @@ -963,6 +980,8 @@ bool VulkanCommandProcessor::IssueCopy() { uint32_t dest_logical_width = copy_dest_pitch; uint32_t dest_logical_height = copy_dest_height; + // vtx_window_offset_enable + assert_true(regs[XE_GPU_REG_PA_SU_SC_MODE_CNTL].u32 & 0x00010000); uint32_t window_offset = regs[XE_GPU_REG_PA_SC_WINDOW_OFFSET].u32; int16_t window_offset_x = window_offset & 0x7FFF; int16_t window_offset_y = (window_offset >> 16) & 0x7FFF; @@ -1029,6 +1048,10 @@ bool VulkanCommandProcessor::IssueCopy() { int32_t dest_max_y = int32_t( (std::max(std::max(dest_points[1], dest_points[3]), dest_points[5]))); + VkOffset2D resolve_offset = {dest_min_x, dest_min_y}; + VkExtent2D resolve_extent = {uint32_t(dest_max_x - dest_min_x), + uint32_t(dest_max_y - dest_min_y)}; + uint32_t color_edram_base = 0; uint32_t depth_edram_base = 0; ColorRenderTargetFormat color_format; @@ -1136,10 +1159,6 @@ bool VulkanCommandProcessor::IssueCopy() { VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT, 0, 0, nullptr, 0, nullptr, 1, &image_barrier); - VkOffset2D resolve_offset = {dest_min_x, dest_min_y}; - VkExtent2D resolve_extent = {uint32_t(dest_max_x - dest_min_x), - uint32_t(dest_max_y - dest_min_y)}; - // Ask the render cache to copy to the resolve texture. auto edram_base = is_color_source ? color_edram_base : depth_edram_base; uint32_t src_format = is_color_source ? static_cast(color_format) @@ -1223,12 +1242,44 @@ bool VulkanCommandProcessor::IssueCopy() { CheckResult(res, "vkCreateFramebuffer"); } + VkRect2D src_rect = { + {0, 0}, + resolve_extent, + }; + + VkRect2D dst_rect = { + resolve_offset, + resolve_extent, + }; + + VkViewport viewport = { + 0.f, + 0.f, // Ignored because this offset is applied earlier. + float(copy_dest_pitch), + float(copy_dest_height), + 0.f, + 1.f, + }; + + VkRect2D scissor = { + { + int32_t(window_regs->window_scissor_tl.tl_x.value()), + int32_t(window_regs->window_scissor_tl.tl_y.value()), + }, + { + window_regs->window_scissor_br.br_x.value() - + window_regs->window_scissor_tl.tl_x.value(), + window_regs->window_scissor_br.br_y.value() - + window_regs->window_scissor_tl.tl_y.value(), + }, + }; + blitter_->BlitTexture2D( command_buffer, current_batch_fence_, - is_color_source ? view->image_view : view->image_view_depth, - {{0, 0}, {resolve_extent.width, resolve_extent.height}}, - view->GetSize(), texture->format, resolve_offset, resolve_extent, - texture->framebuffer, filter, is_color_source, + is_color_source ? view->image_view : view->image_view_depth, src_rect, + view->GetSize(), texture->format, dst_rect, + {copy_dest_pitch, copy_dest_height}, texture->framebuffer, viewport, + scissor, filter, is_color_source, copy_regs->copy_dest_info.copy_dest_swap != 0); // Pull the tile view back to a color/depth attachment. diff --git a/src/xenia/ui/vulkan/blitter.cc b/src/xenia/ui/vulkan/blitter.cc index c5ca6778b..37c336f71 100644 --- a/src/xenia/ui/vulkan/blitter.cc +++ b/src/xenia/ui/vulkan/blitter.cc @@ -100,15 +100,12 @@ VkResult Blitter::Initialize(VulkanDevice* device) { pipeline_layout_info.pSetLayouts = set_layouts; VkPushConstantRange push_constant_ranges[2]; - // vec4 src_uv push_constant_ranges[0].stageFlags = VK_SHADER_STAGE_VERTEX_BIT; push_constant_ranges[0].offset = 0; - push_constant_ranges[0].size = sizeof(float) * 4; - - // bool swap_channels + push_constant_ranges[0].size = sizeof(VtxPushConstants); push_constant_ranges[1].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT; - push_constant_ranges[1].offset = sizeof(float) * 4; - push_constant_ranges[1].size = sizeof(int) * 4; + push_constant_ranges[1].offset = sizeof(VtxPushConstants); + push_constant_ranges[1].size = sizeof(PixPushConstants); pipeline_layout_info.pushConstantRangeCount = static_cast(xe::countof(push_constant_ranges)); @@ -220,8 +217,9 @@ void Blitter::Scavenge() { void Blitter::BlitTexture2D(VkCommandBuffer command_buffer, VkFence fence, VkImageView src_image_view, VkRect2D src_rect, VkExtent2D src_extents, VkFormat dst_image_format, - VkOffset2D dst_offset, VkExtent2D dst_extents, - VkFramebuffer dst_framebuffer, VkFilter filter, + VkRect2D dst_rect, VkExtent2D dst_extents, + VkFramebuffer dst_framebuffer, VkViewport viewport, + VkRect2D scissor, VkFilter filter, bool color_or_depth, bool swap_channels) { // Do we need a full draw, or can we cheap out with a blit command? bool full_draw = swap_channels || true; @@ -237,7 +235,7 @@ void Blitter::BlitTexture2D(VkCommandBuffer command_buffer, VkFence fence, nullptr, render_pass, dst_framebuffer, - {{dst_offset.x, dst_offset.y}, {dst_extents.width, dst_extents.height}}, + {{0, 0}, dst_extents}, 0, nullptr, }; @@ -245,22 +243,7 @@ void Blitter::BlitTexture2D(VkCommandBuffer command_buffer, VkFence fence, vkCmdBeginRenderPass(command_buffer, &render_pass_info, VK_SUBPASS_CONTENTS_INLINE); - VkViewport viewport = { - float(dst_offset.x), - float(dst_offset.y), - float(dst_extents.width), - float(dst_extents.height), - 0.f, - 1.f, - }; vkCmdSetViewport(command_buffer, 0, 1, &viewport); - - VkRect2D scissor = { - dst_offset.x, - dst_offset.y, - dst_extents.width, - dst_extents.height, - }; vkCmdSetScissor(command_buffer, 0, 1, &scissor); // Acquire a pipeline. @@ -307,6 +290,12 @@ void Blitter::BlitTexture2D(VkCommandBuffer command_buffer, VkFence fence, float(src_rect.extent.width) / src_extents.width, float(src_rect.extent.height) / src_extents.height, }, + { + float(dst_rect.offset.x) / dst_extents.width, + float(dst_rect.offset.y) / dst_extents.height, + float(dst_rect.extent.width) / dst_extents.width, + float(dst_rect.extent.height) / dst_extents.height, + }, }; vkCmdPushConstants(command_buffer, pipeline_layout_, VK_SHADER_STAGE_VERTEX_BIT, 0, sizeof(VtxPushConstants), diff --git a/src/xenia/ui/vulkan/blitter.h b/src/xenia/ui/vulkan/blitter.h index a3ab19126..2de0997d1 100644 --- a/src/xenia/ui/vulkan/blitter.h +++ b/src/xenia/ui/vulkan/blitter.h @@ -32,13 +32,21 @@ class Blitter { void Shutdown(); // Queues commands to blit a texture to another texture. + // + // src_rect is the rectangle of pixels to copy from the source + // src_extents is the actual size of the source image + // dst_rect is the rectangle of pixels that are replaced with the source + // dst_extents is the actual size of the destination image // dst_framebuffer must only have one attachment, the target texture. + // viewport is the viewport rect (set to {0, 0, dst_w, dst_h} if unsure) + // scissor is the scissor rect for the dest (set to dst size if unsure) void BlitTexture2D(VkCommandBuffer command_buffer, VkFence fence, VkImageView src_image_view, VkRect2D src_rect, VkExtent2D src_extents, VkFormat dst_image_format, - VkOffset2D dst_offset, VkExtent2D dst_extents, - VkFramebuffer dst_framebuffer, VkFilter filter, - bool color_or_depth, bool swap_channels); + VkRect2D dst_rect, VkExtent2D dst_extents, + VkFramebuffer dst_framebuffer, VkViewport viewport, + VkRect2D scissor, VkFilter filter, bool color_or_depth, + bool swap_channels); void CopyColorTexture2D(VkCommandBuffer command_buffer, VkFence fence, VkImage src_image, VkImageView src_image_view, @@ -56,11 +64,12 @@ class Blitter { private: struct VtxPushConstants { float src_uv[4]; // 0x00 + float dst_uv[4]; // 0x10 }; struct PixPushConstants { - int _pad[3]; // 0x10 - int swap; // 0x1C + int _pad[3]; // 0x20 + int swap; // 0x2C }; VkPipeline GetPipeline(VkRenderPass render_pass, VkShaderModule frag_shader, diff --git a/src/xenia/ui/vulkan/shaders/bin/blit_color_frag.h b/src/xenia/ui/vulkan/shaders/bin/blit_color_frag.h index d1a735f3b..3f558165f 100644 --- a/src/xenia/ui/vulkan/shaders/bin/blit_color_frag.h +++ b/src/xenia/ui/vulkan/shaders/bin/blit_color_frag.h @@ -1,7 +1,7 @@ // generated from `xb genspirv` // source: blit_color.frag const uint8_t blit_color_frag[] = { - 0x03, 0x02, 0x23, 0x07, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x08, 0x00, + 0x03, 0x02, 0x23, 0x07, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x08, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x06, 0x00, 0x01, 0x00, 0x00, 0x00, 0x47, 0x4C, 0x53, 0x4C, 0x2E, 0x73, 0x74, 0x64, 0x2E, 0x34, 0x35, 0x30, @@ -30,8 +30,8 @@ const uint8_t blit_color_frag[] = { 0x00, 0x00, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00, 0x11, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x00, 0x05, 0x00, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x48, 0x00, 0x05, 0x00, 0x16, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, + 0x20, 0x00, 0x00, 0x00, 0x48, 0x00, 0x05, 0x00, 0x16, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x2C, 0x00, 0x00, 0x00, 0x47, 0x00, 0x03, 0x00, 0x16, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x13, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x21, 0x00, 0x03, 0x00, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x16, 0x00, 0x03, 0x00, diff --git a/src/xenia/ui/vulkan/shaders/bin/blit_color_frag.spv b/src/xenia/ui/vulkan/shaders/bin/blit_color_frag.spv index fa5feae3f4499813563f9a5e4474e3fd7a0526c3..a7aa8961ef8ac9f32c62adae4b4eb38c615462b1 100644 GIT binary patch delta 45 wcmaFC{(_y8nMs+Qfq{{MX(MMaqo@J{1A_+xD}xx2W&~noAlBJj$XLz<0FhP&t^fc4 delta 45 wcmaFC{(_y8nMs+Qfq{{MaU*9iqo@D_1A_+xD}xx2W&~noAePx&$XLz<0FO2WjQ{`u diff --git a/src/xenia/ui/vulkan/shaders/bin/blit_color_frag.txt b/src/xenia/ui/vulkan/shaders/bin/blit_color_frag.txt index 0eeeed778..afb470980 100644 --- a/src/xenia/ui/vulkan/shaders/bin/blit_color_frag.txt +++ b/src/xenia/ui/vulkan/shaders/bin/blit_color_frag.txt @@ -1,6 +1,6 @@ ; SPIR-V ; Version: 1.0 -; Generator: Khronos Glslang Reference Front End; 1 +; Generator: Khronos Glslang Reference Front End; 2 ; Bound: 36 ; Schema: 0 OpCapability Shader @@ -21,8 +21,8 @@ OpDecorate %src_texture DescriptorSet 0 OpDecorate %src_texture Binding 0 OpDecorate %vtx_uv Location 0 - OpMemberDecorate %PushConstants 0 Offset 16 - OpMemberDecorate %PushConstants 1 Offset 28 + OpMemberDecorate %PushConstants 0 Offset 32 + OpMemberDecorate %PushConstants 1 Offset 44 OpDecorate %PushConstants Block %void = OpTypeVoid %3 = OpTypeFunction %void diff --git a/src/xenia/ui/vulkan/shaders/bin/blit_depth_frag.h b/src/xenia/ui/vulkan/shaders/bin/blit_depth_frag.h index 77c1426c8..b92bfb75d 100644 --- a/src/xenia/ui/vulkan/shaders/bin/blit_depth_frag.h +++ b/src/xenia/ui/vulkan/shaders/bin/blit_depth_frag.h @@ -1,7 +1,7 @@ // generated from `xb genspirv` // source: blit_depth.frag const uint8_t blit_depth_frag[] = { - 0x03, 0x02, 0x23, 0x07, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x08, 0x00, + 0x03, 0x02, 0x23, 0x07, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x08, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x06, 0x00, 0x01, 0x00, 0x00, 0x00, 0x47, 0x4C, 0x53, 0x4C, 0x2E, 0x73, 0x74, 0x64, 0x2E, 0x34, 0x35, 0x30, @@ -33,9 +33,9 @@ const uint8_t blit_depth_frag[] = { 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00, 0x10, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x00, 0x05, 0x00, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x23, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x48, 0x00, 0x05, 0x00, + 0x23, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x48, 0x00, 0x05, 0x00, 0x19, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, - 0x1C, 0x00, 0x00, 0x00, 0x47, 0x00, 0x03, 0x00, 0x19, 0x00, 0x00, 0x00, + 0x2C, 0x00, 0x00, 0x00, 0x47, 0x00, 0x03, 0x00, 0x19, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00, 0x1D, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x13, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x21, 0x00, 0x03, 0x00, 0x03, 0x00, 0x00, 0x00, diff --git a/src/xenia/ui/vulkan/shaders/bin/blit_depth_frag.spv b/src/xenia/ui/vulkan/shaders/bin/blit_depth_frag.spv index 92660a07fce126acdd8990e9df6349bd6eb65ee4..22ad38b07e56533e4eff7c05bfff2a1b6e1d26a8 100644 GIT binary patch delta 45 wcmbQhK7pN+nMs+Qfq{{MX(MMfqo@J{1A_+xD}yAEW&~noAlBJDlkqzv0C{r-&;S4c delta 45 wcmbQhK7pN+nMs+Qfq{{MaU*9nqo@D_1A_+xD}yAEW&~noAePxYlkqzv0C!UbuK)l5 diff --git a/src/xenia/ui/vulkan/shaders/bin/blit_depth_frag.txt b/src/xenia/ui/vulkan/shaders/bin/blit_depth_frag.txt index 87e1cb326..faad8f145 100644 --- a/src/xenia/ui/vulkan/shaders/bin/blit_depth_frag.txt +++ b/src/xenia/ui/vulkan/shaders/bin/blit_depth_frag.txt @@ -1,6 +1,6 @@ ; SPIR-V ; Version: 1.0 -; Generator: Khronos Glslang Reference Front End; 1 +; Generator: Khronos Glslang Reference Front End; 2 ; Bound: 30 ; Schema: 0 OpCapability Shader @@ -23,8 +23,8 @@ OpDecorate %src_texture DescriptorSet 0 OpDecorate %src_texture Binding 0 OpDecorate %vtx_uv Location 0 - OpMemberDecorate %PushConstants 0 Offset 16 - OpMemberDecorate %PushConstants 1 Offset 28 + OpMemberDecorate %PushConstants 0 Offset 32 + OpMemberDecorate %PushConstants 1 Offset 44 OpDecorate %PushConstants Block OpDecorate %oC Location 0 %void = OpTypeVoid diff --git a/src/xenia/ui/vulkan/shaders/bin/blit_vert.h b/src/xenia/ui/vulkan/shaders/bin/blit_vert.h index 582bc80a4..271ae099e 100644 --- a/src/xenia/ui/vulkan/shaders/bin/blit_vert.h +++ b/src/xenia/ui/vulkan/shaders/bin/blit_vert.h @@ -1,14 +1,14 @@ // generated from `xb genspirv` // source: blit.vert const uint8_t blit_vert[] = { - 0x03, 0x02, 0x23, 0x07, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x08, 0x00, - 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x02, 0x00, + 0x03, 0x02, 0x23, 0x07, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x08, 0x00, + 0x4C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x06, 0x00, 0x01, 0x00, 0x00, 0x00, 0x47, 0x4C, 0x53, 0x4C, 0x2E, 0x73, 0x74, 0x64, 0x2E, 0x34, 0x35, 0x30, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x6D, 0x61, 0x69, 0x6E, 0x00, 0x00, 0x00, 0x00, - 0x16, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x2E, 0x00, 0x00, 0x00, + 0x16, 0x00, 0x00, 0x00, 0x32, 0x00, 0x00, 0x00, 0x42, 0x00, 0x00, 0x00, 0x03, 0x00, 0x03, 0x00, 0x02, 0x00, 0x00, 0x00, 0xC2, 0x01, 0x00, 0x00, 0x05, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x6D, 0x61, 0x69, 0x6E, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x05, 0x00, 0x09, 0x00, 0x00, 0x00, @@ -16,39 +16,46 @@ const uint8_t blit_vert[] = { 0x05, 0x00, 0x06, 0x00, 0x16, 0x00, 0x00, 0x00, 0x67, 0x6C, 0x5F, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x49, 0x6E, 0x64, 0x65, 0x78, 0x00, 0x00, 0x05, 0x00, 0x05, 0x00, 0x19, 0x00, 0x00, 0x00, 0x69, 0x6E, 0x64, 0x65, - 0x78, 0x61, 0x62, 0x6C, 0x65, 0x00, 0x00, 0x00, 0x05, 0x00, 0x06, 0x00, - 0x1F, 0x00, 0x00, 0x00, 0x67, 0x6C, 0x5F, 0x50, 0x65, 0x72, 0x56, 0x65, + 0x78, 0x61, 0x62, 0x6C, 0x65, 0x00, 0x00, 0x00, 0x05, 0x00, 0x05, 0x00, + 0x1C, 0x00, 0x00, 0x00, 0x73, 0x63, 0x61, 0x6C, 0x65, 0x64, 0x5F, 0x70, + 0x6F, 0x73, 0x00, 0x00, 0x05, 0x00, 0x06, 0x00, 0x24, 0x00, 0x00, 0x00, + 0x73, 0x63, 0x61, 0x6C, 0x65, 0x64, 0x5F, 0x64, 0x73, 0x74, 0x5F, 0x75, + 0x76, 0x00, 0x00, 0x00, 0x05, 0x00, 0x06, 0x00, 0x25, 0x00, 0x00, 0x00, + 0x50, 0x75, 0x73, 0x68, 0x43, 0x6F, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x74, + 0x73, 0x00, 0x00, 0x00, 0x06, 0x00, 0x05, 0x00, 0x25, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x73, 0x72, 0x63, 0x5F, 0x75, 0x76, 0x00, 0x00, + 0x06, 0x00, 0x05, 0x00, 0x25, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x64, 0x73, 0x74, 0x5F, 0x75, 0x76, 0x00, 0x00, 0x05, 0x00, 0x06, 0x00, + 0x27, 0x00, 0x00, 0x00, 0x70, 0x75, 0x73, 0x68, 0x5F, 0x63, 0x6F, 0x6E, + 0x73, 0x74, 0x61, 0x6E, 0x74, 0x73, 0x00, 0x00, 0x05, 0x00, 0x06, 0x00, + 0x30, 0x00, 0x00, 0x00, 0x67, 0x6C, 0x5F, 0x50, 0x65, 0x72, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, - 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x67, 0x6C, 0x5F, 0x50, + 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x67, 0x6C, 0x5F, 0x50, 0x6F, 0x73, 0x69, 0x74, 0x69, 0x6F, 0x6E, 0x00, 0x06, 0x00, 0x07, 0x00, - 0x1F, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x67, 0x6C, 0x5F, 0x50, + 0x30, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x67, 0x6C, 0x5F, 0x50, 0x6F, 0x69, 0x6E, 0x74, 0x53, 0x69, 0x7A, 0x65, 0x00, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x07, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x06, 0x00, 0x07, 0x00, 0x30, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x67, 0x6C, 0x5F, 0x43, 0x6C, 0x69, 0x70, 0x44, 0x69, 0x73, 0x74, 0x61, - 0x6E, 0x63, 0x65, 0x00, 0x06, 0x00, 0x07, 0x00, 0x1F, 0x00, 0x00, 0x00, + 0x6E, 0x63, 0x65, 0x00, 0x06, 0x00, 0x07, 0x00, 0x30, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x67, 0x6C, 0x5F, 0x43, 0x75, 0x6C, 0x6C, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x00, 0x05, 0x00, 0x03, 0x00, - 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x04, 0x00, - 0x2E, 0x00, 0x00, 0x00, 0x76, 0x74, 0x78, 0x5F, 0x75, 0x76, 0x00, 0x00, - 0x05, 0x00, 0x06, 0x00, 0x30, 0x00, 0x00, 0x00, 0x50, 0x75, 0x73, 0x68, - 0x43, 0x6F, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x74, 0x73, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x05, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x73, 0x72, 0x63, 0x5F, 0x75, 0x76, 0x00, 0x00, 0x05, 0x00, 0x06, 0x00, - 0x32, 0x00, 0x00, 0x00, 0x70, 0x75, 0x73, 0x68, 0x5F, 0x63, 0x6F, 0x6E, - 0x73, 0x74, 0x61, 0x6E, 0x74, 0x73, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00, - 0x16, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x2A, 0x00, 0x00, 0x00, - 0x48, 0x00, 0x05, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x00, 0x05, 0x00, - 0x1F, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x48, 0x00, 0x05, 0x00, 0x1F, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x48, 0x00, 0x05, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x0B, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x47, 0x00, 0x03, 0x00, - 0x1F, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00, - 0x2E, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x48, 0x00, 0x05, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x23, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x00, 0x03, 0x00, - 0x30, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x13, 0x00, 0x02, 0x00, + 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x04, 0x00, + 0x42, 0x00, 0x00, 0x00, 0x76, 0x74, 0x78, 0x5F, 0x75, 0x76, 0x00, 0x00, + 0x47, 0x00, 0x04, 0x00, 0x16, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, + 0x2A, 0x00, 0x00, 0x00, 0x48, 0x00, 0x05, 0x00, 0x25, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x00, 0x05, 0x00, 0x25, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x23, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x47, 0x00, 0x03, 0x00, + 0x25, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x48, 0x00, 0x05, 0x00, + 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x48, 0x00, 0x05, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x48, 0x00, 0x05, 0x00, 0x30, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x0B, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x48, 0x00, 0x05, 0x00, + 0x30, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x47, 0x00, 0x03, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00, 0x42, 0x00, 0x00, 0x00, + 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x13, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x21, 0x00, 0x03, 0x00, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x16, 0x00, 0x03, 0x00, 0x06, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x17, 0x00, 0x04, 0x00, 0x07, 0x00, 0x00, 0x00, @@ -75,33 +82,41 @@ const uint8_t blit_vert[] = { 0x14, 0x00, 0x00, 0x00, 0x3B, 0x00, 0x04, 0x00, 0x15, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x20, 0x00, 0x04, 0x00, 0x18, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, - 0x17, 0x00, 0x04, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x2B, 0x00, 0x04, 0x00, 0x0A, 0x00, 0x00, 0x00, - 0x1D, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x04, 0x00, - 0x1E, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x1D, 0x00, 0x00, 0x00, - 0x1E, 0x00, 0x06, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x04, 0x00, 0x20, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x1F, 0x00, 0x00, 0x00, 0x3B, 0x00, 0x04, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x21, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x2B, 0x00, 0x04, 0x00, - 0x14, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x2B, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, + 0x2B, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x2C, 0x00, 0x05, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x25, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x04, 0x00, 0x2B, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x1C, 0x00, 0x00, 0x00, 0x20, 0x00, 0x04, 0x00, 0x2D, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x3B, 0x00, 0x04, 0x00, - 0x2D, 0x00, 0x00, 0x00, 0x2E, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x1E, 0x00, 0x03, 0x00, 0x30, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x04, 0x00, 0x31, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, - 0x30, 0x00, 0x00, 0x00, 0x3B, 0x00, 0x04, 0x00, 0x31, 0x00, 0x00, 0x00, - 0x32, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x20, 0x00, 0x04, 0x00, - 0x33, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, - 0x36, 0x00, 0x05, 0x00, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x02, 0x00, - 0x05, 0x00, 0x00, 0x00, 0x3B, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x09, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x3B, 0x00, 0x04, 0x00, - 0x18, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x1F, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, + 0x17, 0x00, 0x04, 0x00, 0x22, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x20, 0x00, 0x04, 0x00, 0x23, 0x00, 0x00, 0x00, + 0x07, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x04, 0x00, + 0x25, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, + 0x20, 0x00, 0x04, 0x00, 0x26, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, + 0x25, 0x00, 0x00, 0x00, 0x3B, 0x00, 0x04, 0x00, 0x26, 0x00, 0x00, 0x00, + 0x27, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x2B, 0x00, 0x04, 0x00, + 0x14, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x20, 0x00, 0x04, 0x00, 0x29, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, + 0x22, 0x00, 0x00, 0x00, 0x2C, 0x00, 0x07, 0x00, 0x22, 0x00, 0x00, 0x00, + 0x2C, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, + 0x1E, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x2B, 0x00, 0x04, 0x00, + 0x0A, 0x00, 0x00, 0x00, 0x2E, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x1C, 0x00, 0x04, 0x00, 0x2F, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x2E, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x06, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x22, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x2F, 0x00, 0x00, 0x00, + 0x2F, 0x00, 0x00, 0x00, 0x20, 0x00, 0x04, 0x00, 0x31, 0x00, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x3B, 0x00, 0x04, 0x00, + 0x31, 0x00, 0x00, 0x00, 0x32, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, + 0x2B, 0x00, 0x04, 0x00, 0x14, 0x00, 0x00, 0x00, 0x33, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x04, 0x00, 0x3F, 0x00, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, 0x20, 0x00, 0x04, 0x00, + 0x41, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x3B, 0x00, 0x04, 0x00, 0x41, 0x00, 0x00, 0x00, 0x42, 0x00, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x00, 0x36, 0x00, 0x05, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, + 0xF8, 0x00, 0x02, 0x00, 0x05, 0x00, 0x00, 0x00, 0x3B, 0x00, 0x04, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x3B, 0x00, 0x04, 0x00, 0x18, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, + 0x07, 0x00, 0x00, 0x00, 0x3B, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x1C, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x3B, 0x00, 0x04, 0x00, + 0x23, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x3D, 0x00, 0x04, 0x00, 0x14, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x03, 0x00, 0x19, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x41, 0x00, 0x05, 0x00, 0x08, 0x00, 0x00, 0x00, @@ -109,34 +124,54 @@ const uint8_t blit_vert[] = { 0x3D, 0x00, 0x04, 0x00, 0x07, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x00, 0x00, 0x1A, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x03, 0x00, 0x09, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x00, 0x00, 0x3D, 0x00, 0x04, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x23, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x85, 0x00, 0x05, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x26, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, - 0x25, 0x00, 0x00, 0x00, 0x83, 0x00, 0x05, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x27, 0x00, 0x00, 0x00, 0x26, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, - 0x51, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, - 0x27, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x51, 0x00, 0x05, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x29, 0x00, 0x00, 0x00, 0x27, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x50, 0x00, 0x07, 0x00, 0x1C, 0x00, 0x00, 0x00, - 0x2A, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x29, 0x00, 0x00, 0x00, - 0x0D, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x41, 0x00, 0x05, 0x00, - 0x2B, 0x00, 0x00, 0x00, 0x2C, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, - 0x22, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x03, 0x00, 0x2C, 0x00, 0x00, 0x00, - 0x2A, 0x00, 0x00, 0x00, 0x3D, 0x00, 0x04, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x2F, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x41, 0x00, 0x05, 0x00, - 0x33, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, 0x32, 0x00, 0x00, 0x00, - 0x22, 0x00, 0x00, 0x00, 0x3D, 0x00, 0x04, 0x00, 0x1C, 0x00, 0x00, 0x00, - 0x35, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, 0x4F, 0x00, 0x07, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x00, 0x35, 0x00, 0x00, 0x00, - 0x35, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x85, 0x00, 0x05, 0x00, 0x07, 0x00, 0x00, 0x00, 0x37, 0x00, 0x00, 0x00, - 0x2F, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x00, 0x41, 0x00, 0x05, 0x00, - 0x33, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x32, 0x00, 0x00, 0x00, - 0x22, 0x00, 0x00, 0x00, 0x3D, 0x00, 0x04, 0x00, 0x1C, 0x00, 0x00, 0x00, - 0x39, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x4F, 0x00, 0x07, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x3A, 0x00, 0x00, 0x00, 0x39, 0x00, 0x00, 0x00, - 0x39, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x81, 0x00, 0x05, 0x00, 0x07, 0x00, 0x00, 0x00, 0x3B, 0x00, 0x00, 0x00, - 0x37, 0x00, 0x00, 0x00, 0x3A, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x03, 0x00, - 0x2E, 0x00, 0x00, 0x00, 0x3B, 0x00, 0x00, 0x00, 0xFD, 0x00, 0x01, 0x00, - 0x38, 0x00, 0x01, 0x00, + 0x1D, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x85, 0x00, 0x05, 0x00, + 0x07, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x1D, 0x00, 0x00, 0x00, + 0x1F, 0x00, 0x00, 0x00, 0x83, 0x00, 0x05, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x21, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, + 0x3E, 0x00, 0x03, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, + 0x41, 0x00, 0x05, 0x00, 0x29, 0x00, 0x00, 0x00, 0x2A, 0x00, 0x00, 0x00, + 0x27, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x3D, 0x00, 0x04, 0x00, + 0x22, 0x00, 0x00, 0x00, 0x2B, 0x00, 0x00, 0x00, 0x2A, 0x00, 0x00, 0x00, + 0x85, 0x00, 0x05, 0x00, 0x22, 0x00, 0x00, 0x00, 0x2D, 0x00, 0x00, 0x00, + 0x2B, 0x00, 0x00, 0x00, 0x2C, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x03, 0x00, + 0x24, 0x00, 0x00, 0x00, 0x2D, 0x00, 0x00, 0x00, 0x3D, 0x00, 0x04, 0x00, + 0x22, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, + 0x4F, 0x00, 0x07, 0x00, 0x07, 0x00, 0x00, 0x00, 0x35, 0x00, 0x00, 0x00, + 0x34, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x83, 0x00, 0x05, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x36, 0x00, 0x00, 0x00, 0x35, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, + 0x3D, 0x00, 0x04, 0x00, 0x07, 0x00, 0x00, 0x00, 0x37, 0x00, 0x00, 0x00, + 0x09, 0x00, 0x00, 0x00, 0x3D, 0x00, 0x04, 0x00, 0x22, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x4F, 0x00, 0x07, 0x00, + 0x07, 0x00, 0x00, 0x00, 0x39, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, + 0x85, 0x00, 0x05, 0x00, 0x07, 0x00, 0x00, 0x00, 0x3A, 0x00, 0x00, 0x00, + 0x37, 0x00, 0x00, 0x00, 0x39, 0x00, 0x00, 0x00, 0x81, 0x00, 0x05, 0x00, + 0x07, 0x00, 0x00, 0x00, 0x3B, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x00, + 0x3A, 0x00, 0x00, 0x00, 0x51, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x3C, 0x00, 0x00, 0x00, 0x3B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x51, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, 0x3D, 0x00, 0x00, 0x00, + 0x3B, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x50, 0x00, 0x07, 0x00, + 0x22, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00, + 0x3D, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, + 0x41, 0x00, 0x05, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, + 0x32, 0x00, 0x00, 0x00, 0x33, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x03, 0x00, + 0x40, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x3D, 0x00, 0x04, 0x00, + 0x07, 0x00, 0x00, 0x00, 0x43, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, + 0x41, 0x00, 0x05, 0x00, 0x29, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, + 0x27, 0x00, 0x00, 0x00, 0x33, 0x00, 0x00, 0x00, 0x3D, 0x00, 0x04, 0x00, + 0x22, 0x00, 0x00, 0x00, 0x45, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, + 0x4F, 0x00, 0x07, 0x00, 0x07, 0x00, 0x00, 0x00, 0x46, 0x00, 0x00, 0x00, + 0x45, 0x00, 0x00, 0x00, 0x45, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x00, 0x85, 0x00, 0x05, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x47, 0x00, 0x00, 0x00, 0x43, 0x00, 0x00, 0x00, 0x46, 0x00, 0x00, 0x00, + 0x41, 0x00, 0x05, 0x00, 0x29, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, + 0x27, 0x00, 0x00, 0x00, 0x33, 0x00, 0x00, 0x00, 0x3D, 0x00, 0x04, 0x00, + 0x22, 0x00, 0x00, 0x00, 0x49, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, + 0x4F, 0x00, 0x07, 0x00, 0x07, 0x00, 0x00, 0x00, 0x4A, 0x00, 0x00, 0x00, + 0x49, 0x00, 0x00, 0x00, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x81, 0x00, 0x05, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x4B, 0x00, 0x00, 0x00, 0x47, 0x00, 0x00, 0x00, 0x4A, 0x00, 0x00, 0x00, + 0x3E, 0x00, 0x03, 0x00, 0x42, 0x00, 0x00, 0x00, 0x4B, 0x00, 0x00, 0x00, + 0xFD, 0x00, 0x01, 0x00, 0x38, 0x00, 0x01, 0x00, }; diff --git a/src/xenia/ui/vulkan/shaders/bin/blit_vert.spv b/src/xenia/ui/vulkan/shaders/bin/blit_vert.spv index 404ac61ea1f1778aaeed858480c9d7b829735b94..27380e97b583bfd9b278bd43ad737601ff591623 100644 GIT binary patch literal 2072 zcmZ9MYfn=_5QewK78L~%0WXL}R8%V708!+Q7L-H`iC>%A9_1vpZ8(R9_(@~@WBw|? znD{>19ZFa->^tvVc4l@@d$No+otY%9&CJd{!K2^x zct?B&6vsLv`BsS=;1S6)$-1ORe_8E+3b}*CS!LG3`mUQjcog_&Z&$mZasww)f4uyV`dTll_fmBS|Zb zRLAMGoaY5ya!~co#?hZ8psp$DEyb6s-30IqMfL7R2c43oitX@VY|SK2<7Pu_ulFan z=i^4Y7k{UnV;l35ZKEEyHe)KSM#nZLkL|EtKepvGW9H3b#>~B)9{FBM(z%a5$wSH3 ziGC-gvy7uAxJ#0faxyP!!R{|!m^>`wh=F4_ju<#r1JvdkYVZPJ+FUS(?Peh$E05nk1rf{a$l6Nis}_xzXT33 zp8;X#eyo@ebArRixWS;q8+Tb4y~FkT^M|B!204hqhuW`bFG!dty$uHpzZi7x)9hD; zsh6It&M?bWJO7q!a0v6et(~5^3(nxq$pJquoqGo(*zalQJB6nP^r^scCbiv{SWORt zjrgK6clK@#RtvG*)l7)xZXOF$8{D`M?}T_bYzQ?y)z16CPEF{118`Q;b72<#E84MH zPisM^Z{pF{12?ZXkQHV=EaLu($!W)z_r^RdmOJ3L$#m@eE}1?l%x@CX{eDPCeGg3t{@Od<()S z^SzV~hj2gKi}n0Un0S1ChMpINIS1QEalE0|5_pzzOTuu}x2wwObya8#wa=N#YICA1+Ik$vQ=iC+tZ#mxy Z!yzpCv)Q~CCNDnpu&y2MpS%_%{{c5rii`jN literal 1648 zcmZ9MYfn=_5QZ19prRlm;03W2?;zd)QM?8dG$9c~;@75@qnxC+gdPa-lg9YR{8fH2 z@p;ZUTaDXHcjldUXJ=-o9q6AO3ZakB(eNY`Yb^9*hcFxl^L>3|Yh$6CZ7(b?-IXyC z26CdDQO>!JAfFp)TYVC#Aq&U=pMLhAkSnnM(6g`Bm&m-p)mYAG~jg_`|#7?7Y7uZmK|2VdH7{fDi z%>4{|6|vveHc{&0tEKJRMgLiJ^R*^>GtF*2zC*12BD#EQ_Z{?$&7k>C@r*vjd#mjB zU%&Ti*AOw|n$Km#75j6gFki&FuVRZS#++mKy!UC}E^YJo4sB;e&J5qqMC9H>_jfHO zSKHYZGuDGrm%q##Ive)DWxQV?6?V@$FP@9{+C%>bw4dU)wkgCuKjXAM-|Hn2JbNAy zlOx}A7Z7pz#@3F$S#+@<