diff options
author | Stan Iliev <stani@google.com> | 2018-11-13 11:14:48 -0500 |
---|---|---|
committer | Stan Iliev <stani@google.com> | 2018-11-13 18:44:34 +0000 |
commit | 305e13a29390fe00ac6465820cf55938a5415cc4 (patch) | |
tree | 61278bfeadbfab8bf409ef07fbe7626e2a004cb2 /libs/hwui/renderthread/VulkanManager.cpp | |
parent | 743ad8a78c8011685f2114b955090045381e153f (diff) |
Handle ANativeWindow resize with Vulkan swapchain
Recreate VulkanSurface, if ANativeWindow has been resized. This
new code is hit when wallpaper is resized from 64x64 to real size.
Bug: 119111018
Test: Wallpaper is shawn correctly with Vulkan rendering
Change-Id: I5e43310e5ee8597a7f326d51b1773e2cf68b603a
Diffstat (limited to 'libs/hwui/renderthread/VulkanManager.cpp')
-rw-r--r-- | libs/hwui/renderthread/VulkanManager.cpp | 21 |
1 files changed, 19 insertions, 2 deletions
diff --git a/libs/hwui/renderthread/VulkanManager.cpp b/libs/hwui/renderthread/VulkanManager.cpp index f96b1f897921..d84ec8508ee4 100644 --- a/libs/hwui/renderthread/VulkanManager.cpp +++ b/libs/hwui/renderthread/VulkanManager.cpp @@ -16,6 +16,8 @@ #include "VulkanManager.h" +#include <gui/Surface.h> + #include "Properties.h" #include "RenderThread.h" #include "renderstate/RenderState.h" @@ -452,7 +454,20 @@ VulkanSurface::BackbufferInfo* VulkanManager::getAvailableBackbuffer(VulkanSurfa return backbuffer; } -SkSurface* VulkanManager::getBackbufferSurface(VulkanSurface* surface) { +SkSurface* VulkanManager::getBackbufferSurface(VulkanSurface** surfaceOut) { + // Recreate VulkanSurface, if ANativeWindow has been resized. + VulkanSurface* surface = *surfaceOut; + int windowWidth = 0, windowHeight = 0; + ANativeWindow* window = surface->mNativeWindow; + window->query(window, NATIVE_WINDOW_WIDTH, &windowWidth); + window->query(window, NATIVE_WINDOW_HEIGHT, &windowHeight); + if (windowWidth != surface->mWindowWidth || windowHeight != surface->mWindowHeight) { + ColorMode colorMode = surface->mColorMode; + destroySurface(surface); + *surfaceOut = createSurface(window, colorMode); + surface = *surfaceOut; + } + VulkanSurface::BackbufferInfo* backbuffer = getAvailableBackbuffer(surface); SkASSERT(backbuffer); @@ -717,6 +732,8 @@ bool VulkanManager::createSwapchain(VulkanSurface* surface) { extent.height = caps.minImageExtent.height; } SkASSERT(extent.height <= caps.maxImageExtent.height); + surface->mWindowWidth = extent.width; + surface->mWindowHeight = extent.height; uint32_t imageCount = caps.minImageCount + 2; if (caps.maxImageCount > 0 && imageCount > caps.maxImageCount) { @@ -814,7 +831,7 @@ VulkanSurface* VulkanManager::createSurface(ANativeWindow* window, ColorMode col return nullptr; } - VulkanSurface* surface = new VulkanSurface(colorMode); + VulkanSurface* surface = new VulkanSurface(colorMode, window); VkAndroidSurfaceCreateInfoKHR surfaceCreateInfo; memset(&surfaceCreateInfo, 0, sizeof(VkAndroidSurfaceCreateInfoKHR)); |