summaryrefslogtreecommitdiff
path: root/libs/hwui/renderthread/VulkanManager.cpp
diff options
context:
space:
mode:
authorStan Iliev <stani@google.com>2018-11-13 11:14:48 -0500
committerStan Iliev <stani@google.com>2018-11-13 18:44:34 +0000
commit305e13a29390fe00ac6465820cf55938a5415cc4 (patch)
tree61278bfeadbfab8bf409ef07fbe7626e2a004cb2 /libs/hwui/renderthread/VulkanManager.cpp
parent743ad8a78c8011685f2114b955090045381e153f (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.cpp21
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));