| Index: tools/viewer/sk_app/VulkanWindowContext.cpp
|
| diff --git a/tools/viewer/sk_app/VulkanWindowContext.cpp b/tools/viewer/sk_app/VulkanWindowContext.cpp
|
| index 8f5f4209a45c190375c2cbc9fcf52b2964d89c07..f21ec9c0cb5f74e282e28036dae07b737bef94d6 100644
|
| --- a/tools/viewer/sk_app/VulkanWindowContext.cpp
|
| +++ b/tools/viewer/sk_app/VulkanWindowContext.cpp
|
| @@ -24,7 +24,7 @@
|
|
|
| namespace sk_app {
|
|
|
| -VulkanWindowContext::VulkanWindowContext(void* platformData, int msaaSampleCount)
|
| +VulkanWindowContext::VulkanWindowContext(void* platformData, const DisplayParams& params)
|
| : fSurface(VK_NULL_HANDLE)
|
| , fSwapchain(VK_NULL_HANDLE)
|
| , fCommandPool(VK_NULL_HANDLE)
|
| @@ -32,10 +32,10 @@ VulkanWindowContext::VulkanWindowContext(void* platformData, int msaaSampleCount
|
|
|
| // any config code here (particularly for msaa)?
|
|
|
| - this->initializeContext(platformData);
|
| + this->initializeContext(platformData, params);
|
| }
|
|
|
| -void VulkanWindowContext::initializeContext(void* platformData) {
|
| +void VulkanWindowContext::initializeContext(void* platformData, const DisplayParams& params) {
|
|
|
| fBackendContext.reset(GrVkBackendContext::Create(&fPresentQueueIndex, canPresent));
|
| if (!(fBackendContext->fExtensions & kKHR_surface_GrVkExtensionFlag) ||
|
| @@ -74,7 +74,7 @@ void VulkanWindowContext::initializeContext(void* platformData) {
|
| return;
|
| }
|
|
|
| - if (!this->createSwapchain(-1, -1)) {
|
| + if (!this->createSwapchain(-1, -1, params)) {
|
| this->destroyContext();
|
| return;
|
| }
|
| @@ -83,7 +83,8 @@ void VulkanWindowContext::initializeContext(void* platformData) {
|
| vkGetDeviceQueue(fBackendContext->fDevice, fPresentQueueIndex, 0, &fPresentQueue);
|
| }
|
|
|
| -bool VulkanWindowContext::createSwapchain(uint32_t width, uint32_t height) {
|
| +bool VulkanWindowContext::createSwapchain(uint32_t width, uint32_t height,
|
| + const DisplayParams& params) {
|
| // check for capabilities
|
| VkSurfaceCapabilitiesKHR caps;
|
| VkResult res = fGetPhysicalDeviceSurfaceCapabilitiesKHR(fBackendContext->fPhysicalDevice,
|
| @@ -162,9 +163,24 @@ bool VulkanWindowContext::createSwapchain(uint32_t width, uint32_t height) {
|
| VK_COMPOSITE_ALPHA_INHERIT_BIT_KHR :
|
| VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR;
|
|
|
| - // Pick our surface format -- for now, the first one
|
| - VkFormat surfaceFormat = surfaceFormats[0].format;
|
| - VkColorSpaceKHR colorSpace = surfaceFormats[0].colorSpace;
|
| + // Pick our surface format. For now, just make sure it matches our sRGB request:
|
| + VkFormat surfaceFormat = VK_FORMAT_UNDEFINED;
|
| + VkColorSpaceKHR colorSpace = VK_COLORSPACE_SRGB_NONLINEAR_KHR;
|
| + bool wantSRGB = kSRGB_SkColorProfileType == params.fProfileType;
|
| + for (uint32_t i = 0; i < surfaceFormatCount; ++i) {
|
| + GrPixelConfig config;
|
| + if (GrVkFormatToPixelConfig(surfaceFormats[i].format, &config) &&
|
| + GrPixelConfigIsSRGB(config) == wantSRGB) {
|
| + surfaceFormat = surfaceFormats[i].format;
|
| + colorSpace = surfaceFormats[i].colorSpace;
|
| + break;
|
| + }
|
| + }
|
| + fDisplayParams = params;
|
| +
|
| + if (VK_FORMAT_UNDEFINED == surfaceFormat) {
|
| + return false;
|
| + }
|
|
|
| // If mailbox mode is available, use it, as it is the lowest-latency non-
|
| // tearing mode. If not, fall back to FIFO which is always available.
|
| @@ -252,7 +268,9 @@ void VulkanWindowContext::createBuffers(VkFormat format) {
|
| desc.fSampleCnt = 0;
|
| desc.fStencilBits = 0;
|
| desc.fRenderTargetHandle = (GrBackendObject) &info;
|
| - SkSurfaceProps props(0, kUnknown_SkPixelGeometry);
|
| + SkSurfaceProps props(GrPixelConfigIsSRGB(fPixelConfig)
|
| + ? SkSurfaceProps::kGammaCorrect_Flag : 0,
|
| + kUnknown_SkPixelGeometry);
|
| fSurfaces[i] = SkSurface::MakeFromBackendRenderTarget(fContext, desc, &props);
|
| }
|
|
|
| @@ -420,7 +438,7 @@ SkSurface* VulkanWindowContext::getBackbufferSurface() {
|
| }
|
| if (VK_ERROR_OUT_OF_DATE_KHR == res) {
|
| // tear swapchain down and try again
|
| - if (!this->createSwapchain(0, 0)) {
|
| + if (!this->createSwapchain(0, 0, fDisplayParams)) {
|
| return nullptr;
|
| }
|
|
|
|
|