From 3f41cd533b986b5e30ea8d49b72cf438f42b1039 Mon Sep 17 00:00:00 2001 From: Themaister Date: Tue, 16 Oct 2018 23:25:31 +0200 Subject: [PATCH] Fix RGUI regression on Vulkan. --- gfx/common/vulkan_common.h | 1 + gfx/drivers/vulkan.c | 42 ++++++++++++++++++++++++++------------ 2 files changed, 30 insertions(+), 13 deletions(-) diff --git a/gfx/common/vulkan_common.h b/gfx/common/vulkan_common.h index 10d6a1b1ba..4e7e24c9b9 100644 --- a/gfx/common/vulkan_common.h +++ b/gfx/common/vulkan_common.h @@ -501,6 +501,7 @@ static INLINE unsigned vulkan_format_to_bpp(VkFormat format) return 4; case VK_FORMAT_R4G4B4A4_UNORM_PACK16: + case VK_FORMAT_B4G4R4A4_UNORM_PACK16: case VK_FORMAT_R5G6B5_UNORM_PACK16: return 2; diff --git a/gfx/drivers/vulkan.c b/gfx/drivers/vulkan.c index 3ac5d1fc12..a65ee5e477 100644 --- a/gfx/drivers/vulkan.c +++ b/gfx/drivers/vulkan.c @@ -1779,6 +1779,30 @@ static bool vulkan_frame(void *data, const void *frame, vulkan_filter_chain_build_offscreen_passes( (vulkan_filter_chain_t*)vk->filter_chain, vk->cmd, &vk->vk_vp); + +#if defined(HAVE_MENU) + /* Upload menu texture. */ + if (vk->menu.enable) + { + if (vk->menu.textures[vk->menu.last_index].image != VK_NULL_HANDLE || + vk->menu.textures[vk->menu.last_index].buffer != VK_NULL_HANDLE) + { + struct vk_texture *optimal = &vk->menu.textures_optimal[vk->menu.last_index]; + struct vk_texture *texture = &vk->menu.textures[vk->menu.last_index]; + + if (optimal->memory != VK_NULL_HANDLE) + { + if (vk->menu.dirty[vk->menu.last_index]) + { + vulkan_copy_staging_to_dynamic(vk, vk->cmd, + optimal, texture); + vk->menu.dirty[vk->menu.last_index] = false; + } + } + } + } +#endif + /* Render to backbuffer. */ if (chain->backbuffer.image != VK_NULL_HANDLE && vk->context->has_acquired_swapchain) { @@ -1813,7 +1837,8 @@ static bool vulkan_frame(void *data, const void *frame, { menu_driver_frame(video_info); - if (vk->menu.textures[vk->menu.last_index].image != VK_NULL_HANDLE) + if (vk->menu.textures[vk->menu.last_index].image != VK_NULL_HANDLE || + vk->menu.textures[vk->menu.last_index].buffer != VK_NULL_HANDLE) { struct vk_draw_quad quad; struct vk_texture *optimal = &vk->menu.textures_optimal[vk->menu.last_index]; @@ -1823,16 +1848,7 @@ static bool vulkan_frame(void *data, const void *frame, quad.texture = &vk->menu.textures[vk->menu.last_index]; if (optimal->memory != VK_NULL_HANDLE) - { - if (vk->menu.dirty[vk->menu.last_index]) - { - vulkan_copy_staging_to_dynamic(vk, vk->cmd, - optimal, - quad.texture); - vk->menu.dirty[vk->menu.last_index] = false; - } quad.texture = optimal; - } quad.sampler = optimal->mipmap ? vk->samplers.mipmap_linear : vk->samplers.linear; @@ -2197,9 +2213,6 @@ static void vulkan_set_texture_frame(void *data, for (y = 0; y < height; y++, dst += texture->stride, src += stride) memcpy(dst, src, stride); - vulkan_sync_texture_to_gpu(vk, texture); - vkUnmapMemory(vk->context->device, texture->memory); - vk->menu.alpha = alpha; vk->menu.last_index = index; @@ -2212,7 +2225,10 @@ static void vulkan_set_texture_frame(void *data, NULL, rgb32 ? NULL : &br_swizzle, VULKAN_TEXTURE_DYNAMIC); } + else + vulkan_sync_texture_to_gpu(vk, texture); + vkUnmapMemory(vk->context->device, texture->memory); vk->menu.dirty[index] = true; }