diff --git a/gfx/common/vulkan_common.c b/gfx/common/vulkan_common.c index 503922603c..24402cddba 100644 --- a/gfx/common/vulkan_common.c +++ b/gfx/common/vulkan_common.c @@ -979,10 +979,18 @@ static void vulkan_check_dynamic_state( { VkRect2D sci; - sci.offset.x = vk->vp.x; - sci.offset.y = vk->vp.y; - sci.extent.width = vk->vp.width; - sci.extent.height = vk->vp.height; + if (vk->tracker.use_scissor) + { + sci = vk->tracker.scissor; + } + else + { + /* No scissor -> viewport */ + sci.offset.x = vk->vp.x; + sci.offset.y = vk->vp.y; + sci.extent.width = vk->vp.width; + sci.extent.height = vk->vp.height; + } vkCmdSetViewport(vk->cmd, 0, 1, &vk->vk_vp); vkCmdSetScissor (vk->cmd, 0, 1, &sci); diff --git a/gfx/common/vulkan_common.h b/gfx/common/vulkan_common.h index 4e7e24c9b9..a66544af6a 100644 --- a/gfx/common/vulkan_common.h +++ b/gfx/common/vulkan_common.h @@ -423,6 +423,8 @@ typedef struct vk struct { uint64_t dirty; + VkRect2D scissor; + bool use_scissor; VkPipeline pipeline; VkImageView view; VkSampler sampler; diff --git a/menu/drivers_display/menu_display_vulkan.c b/menu/drivers_display/menu_display_vulkan.c index 261037aa2c..e1e5ee4699 100644 --- a/menu/drivers_display/menu_display_vulkan.c +++ b/menu/drivers_display/menu_display_vulkan.c @@ -352,25 +352,20 @@ static void menu_display_vk_scissor_begin(video_frame_info_t *video_info, VkRect2D sci; vk_t *vk = video_info ? (vk_t*)video_info->userdata : NULL; - sci.offset.x = x; - sci.offset.y = video_info->height - y - height; - sci.extent.width = width; - sci.extent.height = height; - - vkCmdSetScissor (vk->cmd, 0, 1, &sci); + vk->tracker.use_scissor = true; + vk->tracker.scissor.offset.x = x; + vk->tracker.scissor.offset.y = y; + vk->tracker.scissor.extent.width = width; + vk->tracker.scissor.extent.height = height; + vk->tracker.dirty |= VULKAN_DIRTY_DYNAMIC_BIT; } static void menu_display_vk_scissor_end(video_frame_info_t *video_info) { VkRect2D sci; vk_t *vk = video_info ? (vk_t*)video_info->userdata : NULL; - - sci.offset.x = 0; - sci.offset.y = 0; - sci.extent.width = video_info->width; - sci.extent.height = video_info->height; - - vkCmdSetScissor (vk->cmd, 0, 1, &sci); + vk->tracker.use_scissor = false; + vk->tracker.dirty |= VULKAN_DIRTY_DYNAMIC_BIT; } menu_display_ctx_driver_t menu_display_ctx_vulkan = {