diff options
Diffstat (limited to 'libs/hwui/renderthread/VulkanManager.cpp')
-rw-r--r-- | libs/hwui/renderthread/VulkanManager.cpp | 28 |
1 files changed, 21 insertions, 7 deletions
diff --git a/libs/hwui/renderthread/VulkanManager.cpp b/libs/hwui/renderthread/VulkanManager.cpp index 4be8bd9a863e..aa7a141f6da3 100644 --- a/libs/hwui/renderthread/VulkanManager.cpp +++ b/libs/hwui/renderthread/VulkanManager.cpp @@ -473,8 +473,10 @@ SkSurface* VulkanManager::getBackbufferSurface(VulkanSurface** surfaceOut) { if (windowWidth != surface->mWindowWidth || windowHeight != surface->mWindowHeight) { ColorMode colorMode = surface->mColorMode; sk_sp<SkColorSpace> colorSpace = surface->mColorSpace; + SkColorSpace::Gamut colorGamut = surface->mColorGamut; + SkColorType colorType = surface->mColorType; destroySurface(surface); - *surfaceOut = createSurface(window, colorMode, colorSpace); + *surfaceOut = createSurface(window, colorMode, colorSpace, colorGamut, colorType); surface = *surfaceOut; } @@ -647,8 +649,7 @@ void VulkanManager::createBuffers(VulkanSurface* surface, VkFormat format, VkExt VulkanSurface::ImageInfo& imageInfo = surface->mImageInfos[i]; imageInfo.mSurface = SkSurface::MakeFromBackendRenderTarget( mRenderThread.getGrContext(), backendRT, kTopLeft_GrSurfaceOrigin, - surface->mColorMode == ColorMode::WideColorGamut ? kRGBA_F16_SkColorType - : kRGBA_8888_SkColorType, surface->mColorSpace, &props); + surface->mColorType, surface->mColorSpace, &props); } SkASSERT(mCommandPool != VK_NULL_HANDLE); @@ -767,10 +768,20 @@ bool VulkanManager::createSwapchain(VulkanSurface* surface) { VkFormat surfaceFormat = VK_FORMAT_R8G8B8A8_UNORM; VkColorSpaceKHR colorSpace = VK_COLORSPACE_SRGB_NONLINEAR_KHR; - if (surface->mColorMode == ColorMode::WideColorGamut) { + if (surface->mColorType == SkColorType::kRGBA_F16_SkColorType) { surfaceFormat = VK_FORMAT_R16G16B16A16_SFLOAT; - colorSpace = VK_COLOR_SPACE_EXTENDED_SRGB_NONLINEAR_EXT; } + + if (surface->mColorMode == ColorMode::WideColorGamut) { + if (surface->mColorGamut == SkColorSpace::Gamut::kSRGB_Gamut) { + colorSpace = VK_COLOR_SPACE_EXTENDED_SRGB_NONLINEAR_EXT; + } else if (surface->mColorGamut == SkColorSpace::Gamut::kDCIP3_D65_Gamut) { + colorSpace = VK_COLOR_SPACE_DISPLAY_P3_NONLINEAR_EXT; + } else { + LOG_ALWAYS_FATAL("Unreachable: unsupported wide color space."); + } + } + bool foundSurfaceFormat = false; for (uint32_t i = 0; i < surfaceFormatCount; ++i) { if (surfaceFormat == surfaceFormats[i].format @@ -840,14 +851,17 @@ bool VulkanManager::createSwapchain(VulkanSurface* surface) { } VulkanSurface* VulkanManager::createSurface(ANativeWindow* window, ColorMode colorMode, - sk_sp<SkColorSpace> surfaceColorSpace) { + sk_sp<SkColorSpace> surfaceColorSpace, + SkColorSpace::Gamut surfaceColorGamut, + SkColorType surfaceColorType) { initialize(); if (!window) { return nullptr; } - VulkanSurface* surface = new VulkanSurface(colorMode, window, surfaceColorSpace); + VulkanSurface* surface = new VulkanSurface(colorMode, window, surfaceColorSpace, + surfaceColorGamut, surfaceColorType); VkAndroidSurfaceCreateInfoKHR surfaceCreateInfo; memset(&surfaceCreateInfo, 0, sizeof(VkAndroidSurfaceCreateInfoKHR)); |