| OLD | NEW |
| 1 | 1 |
| 2 /* | 2 /* |
| 3 * Copyright 2015 Google Inc. | 3 * Copyright 2015 Google Inc. |
| 4 * | 4 * |
| 5 * Use of this source code is governed by a BSD-style license that can be | 5 * Use of this source code is governed by a BSD-style license that can be |
| 6 * found in the LICENSE file. | 6 * found in the LICENSE file. |
| 7 */ | 7 */ |
| 8 | 8 |
| 9 #include "GrContext.h" | 9 #include "GrContext.h" |
| 10 #include "SkSurface.h" | 10 #include "SkSurface.h" |
| 11 #include "VulkanTestContext.h" | 11 #include "VulkanWindowContext.h" |
| 12 | 12 |
| 13 #include "vk/GrVkInterface.h" | 13 #include "vk/GrVkInterface.h" |
| 14 #include "vk/GrVkUtil.h" | 14 #include "vk/GrVkUtil.h" |
| 15 #include "vk/GrVkTypes.h" | 15 #include "vk/GrVkTypes.h" |
| 16 | 16 |
| 17 #ifdef VK_USE_PLATFORM_WIN32_KHR | 17 #ifdef VK_USE_PLATFORM_WIN32_KHR |
| 18 // windows wants to define this as CreateSemaphoreA or CreateSemaphoreW | 18 // windows wants to define this as CreateSemaphoreA or CreateSemaphoreW |
| 19 #undef CreateSemaphore | 19 #undef CreateSemaphore |
| 20 #endif | 20 #endif |
| 21 | 21 |
| 22 #define GET_PROC(F) f ## F = (PFN_vk ## F) vkGetInstanceProcAddr(instance, "vk"
#F) | 22 #define GET_PROC(F) f ## F = (PFN_vk ## F) vkGetInstanceProcAddr(instance, "vk"
#F) |
| 23 #define GET_DEV_PROC(F) f ## F = (PFN_vk ## F) vkGetDeviceProcAddr(device, "vk"
#F) | 23 #define GET_DEV_PROC(F) f ## F = (PFN_vk ## F) vkGetDeviceProcAddr(device, "vk"
#F) |
| 24 | 24 |
| 25 VulkanTestContext::VulkanTestContext(void* platformData, int msaaSampleCount) | 25 namespace sk_app { |
| 26 : fSurface(VK_NULL_HANDLE) | 26 |
| 27 , fSwapchain(VK_NULL_HANDLE) | 27 VulkanWindowContext::VulkanWindowContext(void* platformData, int msaaSampleCount
) |
| 28 , fCommandPool(VK_NULL_HANDLE) | 28 : fSurface(VK_NULL_HANDLE) |
| 29 , fBackbuffers(nullptr) { | 29 , fSwapchain(VK_NULL_HANDLE) |
| 30 , fCommandPool(VK_NULL_HANDLE) |
| 31 , fBackbuffers(nullptr) { |
| 30 | 32 |
| 31 // any config code here (particularly for msaa)? | 33 // any config code here (particularly for msaa)? |
| 32 | 34 |
| 33 this->initializeContext(platformData); | 35 this->initializeContext(platformData); |
| 34 } | 36 } |
| 35 | 37 |
| 36 void VulkanTestContext::initializeContext(void* platformData) { | 38 void VulkanWindowContext::initializeContext(void* platformData) { |
| 37 | 39 |
| 38 fBackendContext.reset(GrVkBackendContext::Create(&fPresentQueueIndex, canPre
sent)); | 40 fBackendContext.reset(GrVkBackendContext::Create(&fPresentQueueIndex, canPre
sent)); |
| 39 if (!(fBackendContext->fExtensions & kKHR_surface_GrVkExtensionFlag) || | 41 if (!(fBackendContext->fExtensions & kKHR_surface_GrVkExtensionFlag) || |
| 40 !(fBackendContext->fExtensions & kKHR_swapchain_GrVkExtensionFlag)) { | 42 !(fBackendContext->fExtensions & kKHR_swapchain_GrVkExtensionFlag)) { |
| 41 fBackendContext.reset(nullptr); | 43 fBackendContext.reset(nullptr); |
| 42 return; | 44 return; |
| 43 } | 45 } |
| 44 | 46 |
| 45 VkInstance instance = fBackendContext->fInstance; | 47 VkInstance instance = fBackendContext->fInstance; |
| 46 VkDevice device = fBackendContext->fDevice; | 48 VkDevice device = fBackendContext->fDevice; |
| 47 GET_PROC(DestroySurfaceKHR); | 49 GET_PROC(DestroySurfaceKHR); |
| 48 GET_PROC(GetPhysicalDeviceSurfaceSupportKHR); | 50 GET_PROC(GetPhysicalDeviceSurfaceSupportKHR); |
| 49 GET_PROC(GetPhysicalDeviceSurfaceCapabilitiesKHR); | 51 GET_PROC(GetPhysicalDeviceSurfaceCapabilitiesKHR); |
| 50 GET_PROC(GetPhysicalDeviceSurfaceFormatsKHR); | 52 GET_PROC(GetPhysicalDeviceSurfaceFormatsKHR); |
| 51 GET_PROC(GetPhysicalDeviceSurfacePresentModesKHR); | 53 GET_PROC(GetPhysicalDeviceSurfacePresentModesKHR); |
| 52 GET_DEV_PROC(CreateSwapchainKHR); | 54 GET_DEV_PROC(CreateSwapchainKHR); |
| 53 GET_DEV_PROC(DestroySwapchainKHR); | 55 GET_DEV_PROC(DestroySwapchainKHR); |
| 54 GET_DEV_PROC(GetSwapchainImagesKHR); | 56 GET_DEV_PROC(GetSwapchainImagesKHR); |
| 55 GET_DEV_PROC(AcquireNextImageKHR); | 57 GET_DEV_PROC(AcquireNextImageKHR); |
| 56 GET_DEV_PROC(QueuePresentKHR); | 58 GET_DEV_PROC(QueuePresentKHR); |
| 57 | 59 |
| 58 fContext = GrContext::Create(kVulkan_GrBackend, (GrBackendContext)fBackendCo
ntext.get()); | 60 fContext = GrContext::Create(kVulkan_GrBackend, (GrBackendContext) fBackendC
ontext.get()); |
| 59 | 61 |
| 60 fSurface = createVkSurface(instance, platformData); | 62 fSurface = createVkSurface(instance, platformData); |
| 61 if (VK_NULL_HANDLE == fSurface) { | 63 if (VK_NULL_HANDLE == fSurface) { |
| 62 fBackendContext.reset(nullptr); | 64 fBackendContext.reset(nullptr); |
| 63 return; | 65 return; |
| 64 } | 66 } |
| 65 | 67 |
| 66 VkBool32 supported; | 68 VkBool32 supported; |
| 67 VkResult res = fGetPhysicalDeviceSurfaceSupportKHR(fBackendContext->fPhysica
lDevice, | 69 VkResult res = fGetPhysicalDeviceSurfaceSupportKHR(fBackendContext->fPhysica
lDevice, |
| 68 fPresentQueueIndex, fSurf
ace, | 70 fPresentQueueIndex, fSurf
ace, |
| 69 &supported); | 71 &supported); |
| 70 if (VK_SUCCESS != res) { | 72 if (VK_SUCCESS != res) { |
| 71 this->destroyContext(); | 73 this->destroyContext(); |
| 72 return; | 74 return; |
| 73 } | 75 } |
| 74 | 76 |
| 75 if (!this->createSwapchain(-1, -1)) { | 77 if (!this->createSwapchain(-1, -1)) { |
| 76 this->destroyContext(); | 78 this->destroyContext(); |
| 77 return; | 79 return; |
| 78 } | 80 } |
| 79 | 81 |
| 80 // create presentQueue | 82 // create presentQueue |
| 81 vkGetDeviceQueue(fBackendContext->fDevice, fPresentQueueIndex, 0, &fPresentQ
ueue); | 83 vkGetDeviceQueue(fBackendContext->fDevice, fPresentQueueIndex, 0, &fPresentQ
ueue); |
| 82 } | 84 } |
| 83 | 85 |
| 84 bool VulkanTestContext::createSwapchain(uint32_t width, uint32_t height) | 86 bool VulkanWindowContext::createSwapchain(uint32_t width, uint32_t height) { |
| 85 { | |
| 86 // check for capabilities | 87 // check for capabilities |
| 87 VkSurfaceCapabilitiesKHR caps; | 88 VkSurfaceCapabilitiesKHR caps; |
| 88 VkResult res = fGetPhysicalDeviceSurfaceCapabilitiesKHR(fBackendContext->fPh
ysicalDevice, | 89 VkResult res = fGetPhysicalDeviceSurfaceCapabilitiesKHR(fBackendContext->fPh
ysicalDevice, |
| 89 fSurface, &caps); | 90 fSurface, &caps); |
| 90 if (VK_SUCCESS != res) { | 91 if (VK_SUCCESS != res) { |
| 91 return false; | 92 return false; |
| 92 } | 93 } |
| 93 | 94 |
| 94 uint32_t surfaceFormatCount; | 95 uint32_t surfaceFormatCount; |
| 95 res = fGetPhysicalDeviceSurfaceFormatsKHR(fBackendContext->fPhysicalDevice,
fSurface, | 96 res = fGetPhysicalDeviceSurfaceFormatsKHR(fBackendContext->fPhysicalDevice,
fSurface, |
| (...skipping 13 matching lines...) Expand all Loading... |
| 109 uint32_t presentModeCount; | 110 uint32_t presentModeCount; |
| 110 res = fGetPhysicalDeviceSurfacePresentModesKHR(fBackendContext->fPhysicalDev
ice, fSurface, | 111 res = fGetPhysicalDeviceSurfacePresentModesKHR(fBackendContext->fPhysicalDev
ice, fSurface, |
| 111 &presentModeCount, nullptr); | 112 &presentModeCount, nullptr); |
| 112 if (VK_SUCCESS != res) { | 113 if (VK_SUCCESS != res) { |
| 113 return false; | 114 return false; |
| 114 } | 115 } |
| 115 | 116 |
| 116 SkAutoMalloc presentModeAlloc(presentModeCount * sizeof(VkPresentModeKHR)); | 117 SkAutoMalloc presentModeAlloc(presentModeCount * sizeof(VkPresentModeKHR)); |
| 117 VkPresentModeKHR* presentModes = (VkPresentModeKHR*)presentModeAlloc.get(); | 118 VkPresentModeKHR* presentModes = (VkPresentModeKHR*)presentModeAlloc.get(); |
| 118 res = fGetPhysicalDeviceSurfacePresentModesKHR(fBackendContext->fPhysicalDev
ice, fSurface, | 119 res = fGetPhysicalDeviceSurfacePresentModesKHR(fBackendContext->fPhysicalDev
ice, fSurface, |
| 119 &presentModeCount, presentMo
des); | 120 &presentModeCount, presentMod
es); |
| 120 if (VK_SUCCESS != res) { | 121 if (VK_SUCCESS != res) { |
| 121 return false; | 122 return false; |
| 122 } | 123 } |
| 123 | 124 |
| 124 VkExtent2D extent = caps.currentExtent; | 125 VkExtent2D extent = caps.currentExtent; |
| 125 // use the hints | 126 // use the hints |
| 126 if (extent.width == (uint32_t)-1) { | 127 if (extent.width == (uint32_t)-1) { |
| 127 extent.width = width; | 128 extent.width = width; |
| 128 extent.height = height; | 129 extent.height = height; |
| 129 } | 130 } |
| (...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 216 this->destroyBuffers(); | 217 this->destroyBuffers(); |
| 217 | 218 |
| 218 fDestroySwapchainKHR(fBackendContext->fDevice, swapchainCreateInfo.oldSw
apchain, nullptr); | 219 fDestroySwapchainKHR(fBackendContext->fDevice, swapchainCreateInfo.oldSw
apchain, nullptr); |
| 219 } | 220 } |
| 220 | 221 |
| 221 this->createBuffers(swapchainCreateInfo.imageFormat); | 222 this->createBuffers(swapchainCreateInfo.imageFormat); |
| 222 | 223 |
| 223 return true; | 224 return true; |
| 224 } | 225 } |
| 225 | 226 |
| 226 void VulkanTestContext::createBuffers(VkFormat format) { | 227 void VulkanWindowContext::createBuffers(VkFormat format) { |
| 227 GrVkFormatToPixelConfig(format, &fPixelConfig); | 228 GrVkFormatToPixelConfig(format, &fPixelConfig); |
| 228 | 229 |
| 229 fGetSwapchainImagesKHR(fBackendContext->fDevice, fSwapchain, &fImageCount, n
ullptr); | 230 fGetSwapchainImagesKHR(fBackendContext->fDevice, fSwapchain, &fImageCount, n
ullptr); |
| 230 SkASSERT(fImageCount); | 231 SkASSERT(fImageCount); |
| 231 fImages = new VkImage[fImageCount]; | 232 fImages = new VkImage[fImageCount]; |
| 232 fGetSwapchainImagesKHR(fBackendContext->fDevice, fSwapchain, &fImageCount, f
Images); | 233 fGetSwapchainImagesKHR(fBackendContext->fDevice, fSwapchain, &fImageCount, f
Images); |
| 233 | 234 |
| 234 // set up initial image layouts and create surfaces | 235 // set up initial image layouts and create surfaces |
| 235 fImageLayouts = new VkImageLayout[fImageCount]; | 236 fImageLayouts = new VkImageLayout[fImageCount]; |
| 236 fSurfaces = new sk_sp<SkSurface>[fImageCount]; | 237 fSurfaces = new sk_sp<SkSurface>[fImageCount]; |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 304 GR_VK_CALL_ERRCHECK(fBackendContext->fInterface, | 305 GR_VK_CALL_ERRCHECK(fBackendContext->fInterface, |
| 305 CreateFence(fBackendContext->fDevice, &fenceInfo, nu
llptr, | 306 CreateFence(fBackendContext->fDevice, &fenceInfo, nu
llptr, |
| 306 &fBackbuffers[i].fUsageFences[0])); | 307 &fBackbuffers[i].fUsageFences[0])); |
| 307 GR_VK_CALL_ERRCHECK(fBackendContext->fInterface, | 308 GR_VK_CALL_ERRCHECK(fBackendContext->fInterface, |
| 308 CreateFence(fBackendContext->fDevice, &fenceInfo, nu
llptr, | 309 CreateFence(fBackendContext->fDevice, &fenceInfo, nu
llptr, |
| 309 &fBackbuffers[i].fUsageFences[1])); | 310 &fBackbuffers[i].fUsageFences[1])); |
| 310 } | 311 } |
| 311 fCurrentBackbufferIndex = fImageCount; | 312 fCurrentBackbufferIndex = fImageCount; |
| 312 } | 313 } |
| 313 | 314 |
| 314 void VulkanTestContext::destroyBuffers() { | 315 void VulkanWindowContext::destroyBuffers() { |
| 315 | 316 |
| 316 if (fBackbuffers) { | 317 if (fBackbuffers) { |
| 317 for (uint32_t i = 0; i < fImageCount + 1; ++i) { | 318 for (uint32_t i = 0; i < fImageCount + 1; ++i) { |
| 318 GR_VK_CALL_ERRCHECK(fBackendContext->fInterface, | 319 GR_VK_CALL_ERRCHECK(fBackendContext->fInterface, |
| 319 WaitForFences(fBackendContext->fDevice, 2, | 320 WaitForFences(fBackendContext->fDevice, 2, |
| 320 fBackbuffers[i].fUsageFences, | 321 fBackbuffers[i].fUsageFences, |
| 321 true, UINT64_MAX)); | 322 true, UINT64_MAX)); |
| 322 fBackbuffers[i].fImageIndex = -1; | 323 fBackbuffers[i].fImageIndex = -1; |
| 323 GR_VK_CALL(fBackendContext->fInterface, | 324 GR_VK_CALL(fBackendContext->fInterface, |
| 324 DestroySemaphore(fBackendContext->fDevice, | 325 DestroySemaphore(fBackendContext->fDevice, |
| 325 fBackbuffers[i].fAcquireSemaphore, | 326 fBackbuffers[i].fAcquireSemaphore, |
| 326 nullptr)); | 327 nullptr)); |
| 327 GR_VK_CALL(fBackendContext->fInterface, | 328 GR_VK_CALL(fBackendContext->fInterface, |
| 328 DestroySemaphore(fBackendContext->fDevice, | 329 DestroySemaphore(fBackendContext->fDevice, |
| 329 fBackbuffers[i].fRenderSemaphore, | 330 fBackbuffers[i].fRenderSemaphore, |
| 330 nullptr)); | 331 nullptr)); |
| 331 GR_VK_CALL(fBackendContext->fInterface, | 332 GR_VK_CALL(fBackendContext->fInterface, |
| (...skipping 10 matching lines...) Expand all Loading... |
| 342 fBackbuffers = nullptr; | 343 fBackbuffers = nullptr; |
| 343 | 344 |
| 344 delete[] fSurfaces; | 345 delete[] fSurfaces; |
| 345 fSurfaces = nullptr; | 346 fSurfaces = nullptr; |
| 346 delete[] fImageLayouts; | 347 delete[] fImageLayouts; |
| 347 fImageLayouts = nullptr; | 348 fImageLayouts = nullptr; |
| 348 delete[] fImages; | 349 delete[] fImages; |
| 349 fImages = nullptr; | 350 fImages = nullptr; |
| 350 } | 351 } |
| 351 | 352 |
| 352 VulkanTestContext::~VulkanTestContext() { | 353 VulkanWindowContext::~VulkanWindowContext() { |
| 353 this->destroyContext(); | 354 this->destroyContext(); |
| 354 } | 355 } |
| 355 | 356 |
| 356 void VulkanTestContext::destroyContext() { | 357 void VulkanWindowContext::destroyContext() { |
| 357 if (!fBackendContext.get()) { | 358 if (!fBackendContext.get()) { |
| 358 return; | 359 return; |
| 359 } | 360 } |
| 360 | 361 |
| 361 GR_VK_CALL(fBackendContext->fInterface, DeviceWaitIdle(fBackendContext->fDev
ice)); | 362 GR_VK_CALL(fBackendContext->fInterface, DeviceWaitIdle(fBackendContext->fDev
ice)); |
| 362 | 363 |
| 363 this->destroyBuffers(); | 364 this->destroyBuffers(); |
| 364 | 365 |
| 365 if (VK_NULL_HANDLE != fCommandPool) { | 366 if (VK_NULL_HANDLE != fCommandPool) { |
| 366 GR_VK_CALL(fBackendContext->fInterface, DestroyCommandPool(fBackendConte
xt->fDevice, | 367 GR_VK_CALL(fBackendContext->fInterface, DestroyCommandPool(fBackendConte
xt->fDevice, |
| 367 fCommandPool,
nullptr)); | 368 fCommandPool,
nullptr)); |
| 368 fCommandPool = VK_NULL_HANDLE; | 369 fCommandPool = VK_NULL_HANDLE; |
| 369 } | 370 } |
| 370 | 371 |
| 371 if (VK_NULL_HANDLE != fSwapchain) { | 372 if (VK_NULL_HANDLE != fSwapchain) { |
| 372 fDestroySwapchainKHR(fBackendContext->fDevice, fSwapchain, nullptr); | 373 fDestroySwapchainKHR(fBackendContext->fDevice, fSwapchain, nullptr); |
| 373 fSwapchain = VK_NULL_HANDLE; | 374 fSwapchain = VK_NULL_HANDLE; |
| 374 } | 375 } |
| 375 | 376 |
| 376 if (VK_NULL_HANDLE != fSurface) { | 377 if (VK_NULL_HANDLE != fSurface) { |
| 377 fDestroySurfaceKHR(fBackendContext->fInstance, fSurface, nullptr); | 378 fDestroySurfaceKHR(fBackendContext->fInstance, fSurface, nullptr); |
| 378 fSurface = VK_NULL_HANDLE; | 379 fSurface = VK_NULL_HANDLE; |
| 379 } | 380 } |
| 380 | 381 |
| 381 delete fContext; | 382 delete fContext; |
| 382 | 383 |
| 383 fBackendContext.reset(nullptr); | 384 fBackendContext.reset(nullptr); |
| 384 } | 385 } |
| 385 | 386 |
| 386 VulkanTestContext::BackbufferInfo* VulkanTestContext::getAvailableBackbuffer() { | 387 VulkanWindowContext::BackbufferInfo* VulkanWindowContext::getAvailableBackbuffer
() { |
| 387 SkASSERT(fBackbuffers); | 388 SkASSERT(fBackbuffers); |
| 388 | 389 |
| 389 ++fCurrentBackbufferIndex; | 390 ++fCurrentBackbufferIndex; |
| 390 if (fCurrentBackbufferIndex > fImageCount) { | 391 if (fCurrentBackbufferIndex > fImageCount) { |
| 391 fCurrentBackbufferIndex = 0; | 392 fCurrentBackbufferIndex = 0; |
| 392 } | 393 } |
| 393 | 394 |
| 394 BackbufferInfo* backbuffer = fBackbuffers + fCurrentBackbufferIndex; | 395 BackbufferInfo* backbuffer = fBackbuffers + fCurrentBackbufferIndex; |
| 395 | 396 |
| 396 GR_VK_CALL_ERRCHECK(fBackendContext->fInterface, | 397 GR_VK_CALL_ERRCHECK(fBackendContext->fInterface, |
| 397 WaitForFences(fBackendContext->fDevice, 2, backbuffer->f
UsageFences, | 398 WaitForFences(fBackendContext->fDevice, 2, backbuffer->f
UsageFences, |
| 398 true, UINT64_MAX)); | 399 true, UINT64_MAX)); |
| 399 return backbuffer; | 400 return backbuffer; |
| 400 } | 401 } |
| 401 | 402 |
| 402 SkSurface* VulkanTestContext::getBackbufferSurface() { | 403 SkSurface* VulkanWindowContext::getBackbufferSurface() { |
| 403 BackbufferInfo* backbuffer = this->getAvailableBackbuffer(); | 404 BackbufferInfo* backbuffer = this->getAvailableBackbuffer(); |
| 404 SkASSERT(backbuffer); | 405 SkASSERT(backbuffer); |
| 405 | 406 |
| 406 // reset the fence | 407 // reset the fence |
| 407 GR_VK_CALL_ERRCHECK(fBackendContext->fInterface, | 408 GR_VK_CALL_ERRCHECK(fBackendContext->fInterface, |
| 408 ResetFences(fBackendContext->fDevice, 2, backbuffer->fUs
ageFences)); | 409 ResetFences(fBackendContext->fDevice, 2, backbuffer->fUs
ageFences)); |
| 409 // semaphores should be in unsignaled state | 410 // semaphores should be in unsignaled state |
| 410 | 411 |
| 411 // acquire the image | 412 // acquire the image |
| 412 VkResult res = fAcquireNextImageKHR(fBackendContext->fDevice, fSwapchain, UI
NT64_MAX, | 413 VkResult res = fAcquireNextImageKHR(fBackendContext->fDevice, fSwapchain, UI
NT64_MAX, |
| 413 backbuffer->fAcquireSemaphore, VK_NULL_H
ANDLE, | 414 backbuffer->fAcquireSemaphore, VK_NULL_H
ANDLE, |
| 414 &backbuffer->fImageIndex); | 415 &backbuffer->fImageIndex); |
| 415 if (VK_ERROR_SURFACE_LOST_KHR == res) { | 416 if (VK_ERROR_SURFACE_LOST_KHR == res) { |
| 416 // need to figure out how to create a new vkSurface without the platform
Data* | 417 // need to figure out how to create a new vkSurface without the platform
Data* |
| 417 // maybe use attach somehow? but need a Window | 418 // maybe use attach somehow? but need a Window |
| 418 return nullptr; | 419 return nullptr; |
| 419 } | 420 } |
| 420 if (VK_ERROR_OUT_OF_DATE_KHR == res) { | 421 if (VK_ERROR_OUT_OF_DATE_KHR == res) { |
| 421 // tear swapchain down and try again | 422 // tear swapchain down and try again |
| 422 if (!this->createSwapchain(0, 0)) { | 423 if (!this->createSwapchain(0, 0)) { |
| 423 return nullptr; | 424 return nullptr; |
| 424 } | 425 } |
| 425 | 426 |
| 426 // acquire the image | 427 // acquire the image |
| 427 res = fAcquireNextImageKHR(fBackendContext->fDevice, fSwapchain, UINT64
_MAX, | 428 res = fAcquireNextImageKHR(fBackendContext->fDevice, fSwapchain, UINT64_
MAX, |
| 428 backbuffer->fAcquireSemaphore, VK_NULL_HANDLE
, | 429 backbuffer->fAcquireSemaphore, VK_NULL_HANDLE
, |
| 429 &backbuffer->fImageIndex); | 430 &backbuffer->fImageIndex); |
| 430 | 431 |
| 431 if (VK_SUCCESS != res) { | 432 if (VK_SUCCESS != res) { |
| 432 return nullptr; | 433 return nullptr; |
| 433 } | 434 } |
| 434 } | 435 } |
| 435 | 436 |
| 436 // set up layout transfer from initial to color attachment | 437 // set up layout transfer from initial to color attachment |
| 437 VkImageLayout layout = fImageLayouts[backbuffer->fImageIndex]; | 438 VkImageLayout layout = fImageLayouts[backbuffer->fImageIndex]; |
| 438 VkPipelineStageFlags srcStageMask = (VK_IMAGE_LAYOUT_UNDEFINED == layout) ? | 439 VkPipelineStageFlags srcStageMask = (VK_IMAGE_LAYOUT_UNDEFINED == layout) ? |
| 439 VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT : | 440 VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT : |
| 440 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPU
T_BIT; | 441 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPU
T_BIT; |
| 441 VkPipelineStageFlags dstStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPU
T_BIT; | 442 VkPipelineStageFlags dstStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPU
T_BIT; |
| 442 VkAccessFlags srcAccessMask = (VK_IMAGE_LAYOUT_UNDEFINED == layout) ? | 443 VkAccessFlags srcAccessMask = (VK_IMAGE_LAYOUT_UNDEFINED == layout) ? |
| 443 0 : VK_ACCESS_MEMORY_READ_BIT; | 444 0 : VK_ACCESS_MEMORY_READ_BIT; |
| 444 VkAccessFlags dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT; | 445 VkAccessFlags dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT; |
| 445 | 446 |
| 446 VkImageMemoryBarrier imageMemoryBarrier = { | 447 VkImageMemoryBarrier imageMemoryBarrier = { |
| 447 VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, // sType | 448 VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, // sType |
| 448 NULL, // pNext | 449 NULL, // pNext |
| 449 srcAccessMask, // outputMask | 450 srcAccessMask, // outputMask |
| 450 dstAccessMask, // inputMask | 451 dstAccessMask, // inputMask |
| 451 layout, // oldLayout | 452 layout, // oldLayout |
| 452 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, // newLayout | 453 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, // newLayout |
| 453 fPresentQueueIndex, // srcQueueFamilyIndex | 454 fPresentQueueIndex, // srcQueueFamilyIndex |
| 454 fBackendContext->fGraphicsQueueIndex, // dstQueueFamilyIndex | 455 fBackendContext->fGraphicsQueueIndex, // dstQueueFamilyIndex |
| 455 fImages[backbuffer->fImageIndex], // image | 456 fImages[backbuffer->fImageIndex], // image |
| 456 { VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1 } // subresourceRange | 457 { VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1 } // subresourceRange |
| 457 }; | 458 }; |
| 458 GR_VK_CALL_ERRCHECK(fBackendContext->fInterface, | 459 GR_VK_CALL_ERRCHECK(fBackendContext->fInterface, |
| 459 ResetCommandBuffer(backbuffer->fTransitionCmdBuffers[0],
0)); | 460 ResetCommandBuffer(backbuffer->fTransitionCmdBuffers[0],
0)); |
| 460 VkCommandBufferBeginInfo info; | 461 VkCommandBufferBeginInfo info; |
| 461 memset(&info, 0, sizeof(VkCommandBufferBeginInfo)); | 462 memset(&info, 0, sizeof(VkCommandBufferBeginInfo)); |
| 462 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO; | 463 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO; |
| 463 info.flags = 0; | 464 info.flags = 0; |
| 464 GR_VK_CALL_ERRCHECK(fBackendContext->fInterface, | 465 GR_VK_CALL_ERRCHECK(fBackendContext->fInterface, |
| 465 BeginCommandBuffer(backbuffer->fTransitionCmdBuffers[0],
&info)); | 466 BeginCommandBuffer(backbuffer->fTransitionCmdBuffers[0],
&info)); |
| 466 | 467 |
| 467 GR_VK_CALL(fBackendContext->fInterface, | 468 GR_VK_CALL(fBackendContext->fInterface, |
| 468 CmdPipelineBarrier(backbuffer->fTransitionCmdBuffers[0], | 469 CmdPipelineBarrier(backbuffer->fTransitionCmdBuffers[0], |
| 469 srcStageMask, dstStageMask, 0, | 470 srcStageMask, dstStageMask, 0, |
| 470 0, nullptr, | 471 0, nullptr, |
| 471 0, nullptr, | 472 0, nullptr, |
| 472 1, &imageMemoryBarrier)); | 473 1, &imageMemoryBarrier)); |
| 473 | 474 |
| 474 GR_VK_CALL_ERRCHECK(fBackendContext->fInterface, | 475 GR_VK_CALL_ERRCHECK(fBackendContext->fInterface, |
| 475 EndCommandBuffer(backbuffer->fTransitionCmdBuffers[0]));
| 476 EndCommandBuffer(backbuffer->fTransitionCmdBuffers[0])); |
| 476 | 477 |
| 477 VkPipelineStageFlags waitDstStageFlags = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_
OUTPUT_BIT; | 478 VkPipelineStageFlags waitDstStageFlags = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_
OUTPUT_BIT; |
| 478 // insert the layout transfer into the queue and wait on the acquire | 479 // insert the layout transfer into the queue and wait on the acquire |
| 479 VkSubmitInfo submitInfo; | 480 VkSubmitInfo submitInfo; |
| 480 memset(&submitInfo, 0, sizeof(VkSubmitInfo)); | 481 memset(&submitInfo, 0, sizeof(VkSubmitInfo)); |
| 481 submitInfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO; | 482 submitInfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO; |
| 482 submitInfo.waitSemaphoreCount = 1; | 483 submitInfo.waitSemaphoreCount = 1; |
| 483 submitInfo.pWaitSemaphores = &backbuffer->fAcquireSemaphore; | 484 submitInfo.pWaitSemaphores = &backbuffer->fAcquireSemaphore; |
| 484 submitInfo.pWaitDstStageMask = &waitDstStageFlags; | 485 submitInfo.pWaitDstStageMask = &waitDstStageFlags; |
| 485 submitInfo.commandBufferCount = 1; | 486 submitInfo.commandBufferCount = 1; |
| 486 submitInfo.pCommandBuffers = &backbuffer->fTransitionCmdBuffers[0]; | 487 submitInfo.pCommandBuffers = &backbuffer->fTransitionCmdBuffers[0]; |
| 487 submitInfo.signalSemaphoreCount = 0; | 488 submitInfo.signalSemaphoreCount = 0; |
| 488 | 489 |
| 489 GR_VK_CALL_ERRCHECK(fBackendContext->fInterface, | 490 GR_VK_CALL_ERRCHECK(fBackendContext->fInterface, |
| 490 QueueSubmit(fBackendContext->fQueue, 1, &submitInfo, | 491 QueueSubmit(fBackendContext->fQueue, 1, &submitInfo, |
| 491 backbuffer->fUsageFences[0])); | 492 backbuffer->fUsageFences[0])); |
| 492 | 493 |
| 493 return fSurfaces[backbuffer->fImageIndex].get(); | 494 return fSurfaces[backbuffer->fImageIndex].get(); |
| 494 } | 495 } |
| 495 | 496 |
| 496 | 497 |
| 497 void VulkanTestContext::swapBuffers() { | 498 void VulkanWindowContext::swapBuffers() { |
| 498 | 499 |
| 499 BackbufferInfo* backbuffer = fBackbuffers + fCurrentBackbufferIndex; | 500 BackbufferInfo* backbuffer = fBackbuffers + fCurrentBackbufferIndex; |
| 500 | 501 |
| 501 VkImageLayout layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; | 502 VkImageLayout layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; |
| 502 VkPipelineStageFlags srcStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPU
T_BIT; | 503 VkPipelineStageFlags srcStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPU
T_BIT; |
| 503 VkPipelineStageFlags dstStageMask = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT; | 504 VkPipelineStageFlags dstStageMask = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT; |
| 504 VkAccessFlags srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT; | 505 VkAccessFlags srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT; |
| 505 VkAccessFlags dstAccessMask = VK_ACCESS_MEMORY_READ_BIT; | 506 VkAccessFlags dstAccessMask = VK_ACCESS_MEMORY_READ_BIT; |
| 506 | 507 |
| 507 VkImageMemoryBarrier imageMemoryBarrier = { | 508 VkImageMemoryBarrier imageMemoryBarrier = { |
| (...skipping 10 matching lines...) Expand all Loading... |
| 518 }; | 519 }; |
| 519 GR_VK_CALL_ERRCHECK(fBackendContext->fInterface, | 520 GR_VK_CALL_ERRCHECK(fBackendContext->fInterface, |
| 520 ResetCommandBuffer(backbuffer->fTransitionCmdBuffers[1],
0)); | 521 ResetCommandBuffer(backbuffer->fTransitionCmdBuffers[1],
0)); |
| 521 VkCommandBufferBeginInfo info; | 522 VkCommandBufferBeginInfo info; |
| 522 memset(&info, 0, sizeof(VkCommandBufferBeginInfo)); | 523 memset(&info, 0, sizeof(VkCommandBufferBeginInfo)); |
| 523 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO; | 524 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO; |
| 524 info.flags = 0; | 525 info.flags = 0; |
| 525 GR_VK_CALL_ERRCHECK(fBackendContext->fInterface, | 526 GR_VK_CALL_ERRCHECK(fBackendContext->fInterface, |
| 526 BeginCommandBuffer(backbuffer->fTransitionCmdBuffers[1],
&info)); | 527 BeginCommandBuffer(backbuffer->fTransitionCmdBuffers[1],
&info)); |
| 527 GR_VK_CALL(fBackendContext->fInterface, | 528 GR_VK_CALL(fBackendContext->fInterface, |
| 528 CmdPipelineBarrier(backbuffer->fTransitionCmdBuffers[1], | 529 CmdPipelineBarrier(backbuffer->fTransitionCmdBuffers[1], |
| 529 srcStageMask, dstStageMask, 0, | 530 srcStageMask, dstStageMask, 0, |
| 530 0, nullptr, | 531 0, nullptr, |
| 531 0, nullptr, | 532 0, nullptr, |
| 532 1, &imageMemoryBarrier)); | 533 1, &imageMemoryBarrier)); |
| 533 GR_VK_CALL_ERRCHECK(fBackendContext->fInterface, | 534 GR_VK_CALL_ERRCHECK(fBackendContext->fInterface, |
| 534 EndCommandBuffer(backbuffer->fTransitionCmdBuffers[1])); | 535 EndCommandBuffer(backbuffer->fTransitionCmdBuffers[1])); |
| 535 | 536 |
| 536 fImageLayouts[backbuffer->fImageIndex] = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR; | 537 fImageLayouts[backbuffer->fImageIndex] = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR; |
| 537 | 538 |
| 538 // insert the layout transfer into the queue and wait on the acquire | 539 // insert the layout transfer into the queue and wait on the acquire |
| 539 VkSubmitInfo submitInfo; | 540 VkSubmitInfo submitInfo; |
| 540 memset(&submitInfo, 0, sizeof(VkSubmitInfo)); | 541 memset(&submitInfo, 0, sizeof(VkSubmitInfo)); |
| 541 submitInfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO; | 542 submitInfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO; |
| 542 submitInfo.waitSemaphoreCount = 0; | 543 submitInfo.waitSemaphoreCount = 0; |
| 543 submitInfo.pWaitDstStageMask = 0; | 544 submitInfo.pWaitDstStageMask = 0; |
| 544 submitInfo.commandBufferCount = 1; | 545 submitInfo.commandBufferCount = 1; |
| 545 submitInfo.pCommandBuffers = &backbuffer->fTransitionCmdBuffers[1]; | 546 submitInfo.pCommandBuffers = &backbuffer->fTransitionCmdBuffers[1]; |
| 546 submitInfo.signalSemaphoreCount = 1; | 547 submitInfo.signalSemaphoreCount = 1; |
| 547 submitInfo.pSignalSemaphores = &backbuffer->fRenderSemaphore; | 548 submitInfo.pSignalSemaphores = &backbuffer->fRenderSemaphore; |
| 548 | 549 |
| 549 GR_VK_CALL_ERRCHECK(fBackendContext->fInterface, | 550 GR_VK_CALL_ERRCHECK(fBackendContext->fInterface, |
| 550 QueueSubmit(fBackendContext->fQueue, 1, &submitInfo, | 551 QueueSubmit(fBackendContext->fQueue, 1, &submitInfo, |
| 551 backbuffer->fUsageFences[1])); | 552 backbuffer->fUsageFences[1])); |
| 552 | 553 |
| 553 // Submit present operation to present queue | 554 // Submit present operation to present queue |
| 554 const VkPresentInfoKHR presentInfo = | 555 const VkPresentInfoKHR presentInfo = |
| 555 { | 556 { |
| 556 VK_STRUCTURE_TYPE_PRESENT_INFO_KHR, // sType | 557 VK_STRUCTURE_TYPE_PRESENT_INFO_KHR, // sType |
| 557 NULL, // pNext | 558 NULL, // pNext |
| 558 1, // waitSemaphoreCount | 559 1, // waitSemaphoreCount |
| 559 &backbuffer->fRenderSemaphore, // pWaitSemaphores | 560 &backbuffer->fRenderSemaphore, // pWaitSemaphores |
| 560 1, // swapchainCount | 561 1, // swapchainCount |
| 561 &fSwapchain, // pSwapchains | 562 &fSwapchain, // pSwapchains |
| 562 &backbuffer->fImageIndex, // pImageIndices | 563 &backbuffer->fImageIndex, // pImageIndices |
| 563 NULL // pResults | 564 NULL // pResults |
| 564 }; | 565 }; |
| 565 | 566 |
| 566 fQueuePresentKHR(fPresentQueue, &presentInfo); | 567 fQueuePresentKHR(fPresentQueue, &presentInfo); |
| 567 | 568 |
| 568 } | 569 } |
| 570 |
| 571 } //namespace sk_app |
| OLD | NEW |