| 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 "GrRenderTarget.h" | |
| 11 #include "SkSurface.h" | 10 #include "SkSurface.h" |
| 12 #include "VulkanWindowContext.h" | 11 #include "VulkanWindowContext.h" |
| 13 | 12 |
| 14 #include "vk/GrVkInterface.h" | 13 #include "vk/GrVkInterface.h" |
| 15 #include "vk/GrVkUtil.h" | 14 #include "vk/GrVkUtil.h" |
| 16 #include "vk/GrVkTypes.h" | 15 #include "vk/GrVkTypes.h" |
| 17 | 16 |
| 18 #ifdef VK_USE_PLATFORM_WIN32_KHR | 17 #ifdef VK_USE_PLATFORM_WIN32_KHR |
| 19 // windows wants to define this as CreateSemaphoreA or CreateSemaphoreW | 18 // windows wants to define this as CreateSemaphoreA or CreateSemaphoreW |
| 20 #undef CreateSemaphore | 19 #undef CreateSemaphore |
| 21 #endif | 20 #endif |
| 22 | 21 |
| 23 #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) |
| 24 #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) |
| 25 | 24 |
| 26 namespace sk_app { | 25 namespace sk_app { |
| 27 | 26 |
| 28 VulkanWindowContext::VulkanWindowContext(void* platformData, const DisplayParams
& params) | 27 VulkanWindowContext::VulkanWindowContext(void* platformData, const DisplayParams
& params) |
| 29 : WindowContext() | 28 : fSurface(VK_NULL_HANDLE) |
| 30 , fSurface(VK_NULL_HANDLE) | |
| 31 , fSwapchain(VK_NULL_HANDLE) | 29 , fSwapchain(VK_NULL_HANDLE) |
| 32 , fImages(nullptr) | |
| 33 , fImageLayouts(nullptr) | |
| 34 , fSurfaces(nullptr) | |
| 35 , fCommandPool(VK_NULL_HANDLE) | 30 , fCommandPool(VK_NULL_HANDLE) |
| 36 , fBackbuffers(nullptr) { | 31 , fBackbuffers(nullptr) { |
| 37 | 32 |
| 38 // any config code here (particularly for msaa)? | 33 // any config code here (particularly for msaa)? |
| 39 | 34 |
| 40 this->initializeContext(platformData, params); | 35 this->initializeContext(platformData, params); |
| 41 } | 36 } |
| 42 | 37 |
| 43 void VulkanWindowContext::initializeContext(void* platformData, const DisplayPar
ams& params) { | 38 void VulkanWindowContext::initializeContext(void* platformData, const DisplayPar
ams& params) { |
| 44 | 39 |
| (...skipping 203 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 248 void VulkanWindowContext::createBuffers(VkFormat format) { | 243 void VulkanWindowContext::createBuffers(VkFormat format) { |
| 249 GrVkFormatToPixelConfig(format, &fPixelConfig); | 244 GrVkFormatToPixelConfig(format, &fPixelConfig); |
| 250 | 245 |
| 251 fGetSwapchainImagesKHR(fBackendContext->fDevice, fSwapchain, &fImageCount, n
ullptr); | 246 fGetSwapchainImagesKHR(fBackendContext->fDevice, fSwapchain, &fImageCount, n
ullptr); |
| 252 SkASSERT(fImageCount); | 247 SkASSERT(fImageCount); |
| 253 fImages = new VkImage[fImageCount]; | 248 fImages = new VkImage[fImageCount]; |
| 254 fGetSwapchainImagesKHR(fBackendContext->fDevice, fSwapchain, &fImageCount, f
Images); | 249 fGetSwapchainImagesKHR(fBackendContext->fDevice, fSwapchain, &fImageCount, f
Images); |
| 255 | 250 |
| 256 // set up initial image layouts and create surfaces | 251 // set up initial image layouts and create surfaces |
| 257 fImageLayouts = new VkImageLayout[fImageCount]; | 252 fImageLayouts = new VkImageLayout[fImageCount]; |
| 258 fRenderTargets = new sk_sp<GrRenderTarget>[fImageCount]; | |
| 259 fSurfaces = new sk_sp<SkSurface>[fImageCount]; | 253 fSurfaces = new sk_sp<SkSurface>[fImageCount]; |
| 260 for (uint32_t i = 0; i < fImageCount; ++i) { | 254 for (uint32_t i = 0; i < fImageCount; ++i) { |
| 261 fImageLayouts[i] = VK_IMAGE_LAYOUT_UNDEFINED; | 255 fImageLayouts[i] = VK_IMAGE_LAYOUT_UNDEFINED; |
| 262 | 256 |
| 263 GrBackendRenderTargetDesc desc; | 257 GrBackendRenderTargetDesc desc; |
| 264 GrVkImageInfo info; | 258 GrVkImageInfo info; |
| 265 info.fImage = fImages[i]; | 259 info.fImage = fImages[i]; |
| 266 info.fAlloc = VK_NULL_HANDLE; | 260 info.fAlloc = VK_NULL_HANDLE; |
| 267 info.fImageLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; | 261 info.fImageLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; |
| 268 info.fImageTiling = VK_IMAGE_TILING_OPTIMAL; | 262 info.fImageTiling = VK_IMAGE_TILING_OPTIMAL; |
| 269 info.fFormat = format; | 263 info.fFormat = format; |
| 270 info.fLevelCount = 1; | 264 info.fLevelCount = 1; |
| 271 desc.fWidth = fWidth; | 265 desc.fWidth = fWidth; |
| 272 desc.fHeight = fHeight; | 266 desc.fHeight = fHeight; |
| 273 desc.fConfig = fPixelConfig; | 267 desc.fConfig = fPixelConfig; |
| 274 desc.fOrigin = kTopLeft_GrSurfaceOrigin; | 268 desc.fOrigin = kTopLeft_GrSurfaceOrigin; |
| 275 desc.fSampleCnt = 0; | 269 desc.fSampleCnt = 0; |
| 276 desc.fStencilBits = 0; | 270 desc.fStencilBits = 0; |
| 277 desc.fRenderTargetHandle = (GrBackendObject) &info; | 271 desc.fRenderTargetHandle = (GrBackendObject) &info; |
| 278 fRenderTargets[i].reset(fContext->textureProvider()->wrapBackendRenderTa
rget(desc)); | 272 SkSurfaceProps props(GrPixelConfigIsSRGB(fPixelConfig) |
| 279 | 273 ? SkSurfaceProps::kGammaCorrect_Flag : 0, |
| 280 fSurfaces[i] = this->createRenderSurface(fRenderTargets[i], 24); | 274 kUnknown_SkPixelGeometry); |
| 275 fSurfaces[i] = SkSurface::MakeFromBackendRenderTarget(fContext, desc, &p
rops); |
| 281 } | 276 } |
| 282 | 277 |
| 283 // create the command pool for the command buffers | 278 // create the command pool for the command buffers |
| 284 if (VK_NULL_HANDLE == fCommandPool) { | 279 if (VK_NULL_HANDLE == fCommandPool) { |
| 285 VkCommandPoolCreateInfo commandPoolInfo; | 280 VkCommandPoolCreateInfo commandPoolInfo; |
| 286 memset(&commandPoolInfo, 0, sizeof(VkCommandPoolCreateInfo)); | 281 memset(&commandPoolInfo, 0, sizeof(VkCommandPoolCreateInfo)); |
| 287 commandPoolInfo.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO; | 282 commandPoolInfo.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO; |
| 288 // this needs to be on the render queue | 283 // this needs to be on the render queue |
| 289 commandPoolInfo.queueFamilyIndex = fBackendContext->fGraphicsQueueIndex; | 284 commandPoolInfo.queueFamilyIndex = fBackendContext->fGraphicsQueueIndex; |
| 290 commandPoolInfo.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT; | 285 commandPoolInfo.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT; |
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 359 GR_VK_CALL(fBackendContext->fInterface, | 354 GR_VK_CALL(fBackendContext->fInterface, |
| 360 DestroyFence(fBackendContext->fDevice, fBackbuffers[i].fU
sageFences[0], 0)); | 355 DestroyFence(fBackendContext->fDevice, fBackbuffers[i].fU
sageFences[0], 0)); |
| 361 GR_VK_CALL(fBackendContext->fInterface, | 356 GR_VK_CALL(fBackendContext->fInterface, |
| 362 DestroyFence(fBackendContext->fDevice, fBackbuffers[i].fU
sageFences[1], 0)); | 357 DestroyFence(fBackendContext->fDevice, fBackbuffers[i].fU
sageFences[1], 0)); |
| 363 } | 358 } |
| 364 } | 359 } |
| 365 | 360 |
| 366 delete[] fBackbuffers; | 361 delete[] fBackbuffers; |
| 367 fBackbuffers = nullptr; | 362 fBackbuffers = nullptr; |
| 368 | 363 |
| 369 // Does this actually free the surfaces? | |
| 370 delete[] fSurfaces; | 364 delete[] fSurfaces; |
| 371 fSurfaces = nullptr; | 365 fSurfaces = nullptr; |
| 372 delete[] fRenderTargets; | |
| 373 fRenderTargets = nullptr; | |
| 374 delete[] fImageLayouts; | 366 delete[] fImageLayouts; |
| 375 fImageLayouts = nullptr; | 367 fImageLayouts = nullptr; |
| 376 delete[] fImages; | 368 delete[] fImages; |
| 377 fImages = nullptr; | 369 fImages = nullptr; |
| 378 } | 370 } |
| 379 | 371 |
| 380 VulkanWindowContext::~VulkanWindowContext() { | 372 VulkanWindowContext::~VulkanWindowContext() { |
| 381 this->destroyContext(); | 373 this->destroyContext(); |
| 382 } | 374 } |
| 383 | 375 |
| (...skipping 15 matching lines...) Expand all Loading... |
| 399 if (VK_NULL_HANDLE != fSwapchain) { | 391 if (VK_NULL_HANDLE != fSwapchain) { |
| 400 fDestroySwapchainKHR(fBackendContext->fDevice, fSwapchain, nullptr); | 392 fDestroySwapchainKHR(fBackendContext->fDevice, fSwapchain, nullptr); |
| 401 fSwapchain = VK_NULL_HANDLE; | 393 fSwapchain = VK_NULL_HANDLE; |
| 402 } | 394 } |
| 403 | 395 |
| 404 if (VK_NULL_HANDLE != fSurface) { | 396 if (VK_NULL_HANDLE != fSurface) { |
| 405 fDestroySurfaceKHR(fBackendContext->fInstance, fSurface, nullptr); | 397 fDestroySurfaceKHR(fBackendContext->fInstance, fSurface, nullptr); |
| 406 fSurface = VK_NULL_HANDLE; | 398 fSurface = VK_NULL_HANDLE; |
| 407 } | 399 } |
| 408 | 400 |
| 409 fContext->abandonContext(); | 401 delete fContext; |
| 410 fContext->unref(); | |
| 411 | 402 |
| 412 fBackendContext.reset(nullptr); | 403 fBackendContext.reset(nullptr); |
| 413 } | 404 } |
| 414 | 405 |
| 415 VulkanWindowContext::BackbufferInfo* VulkanWindowContext::getAvailableBackbuffer
() { | 406 VulkanWindowContext::BackbufferInfo* VulkanWindowContext::getAvailableBackbuffer
() { |
| 416 SkASSERT(fBackbuffers); | 407 SkASSERT(fBackbuffers); |
| 417 | 408 |
| 418 ++fCurrentBackbufferIndex; | 409 ++fCurrentBackbufferIndex; |
| 419 if (fCurrentBackbufferIndex > fImageCount) { | 410 if (fCurrentBackbufferIndex > fImageCount) { |
| 420 fCurrentBackbufferIndex = 0; | 411 fCurrentBackbufferIndex = 0; |
| 421 } | 412 } |
| 422 | 413 |
| 423 BackbufferInfo* backbuffer = fBackbuffers + fCurrentBackbufferIndex; | 414 BackbufferInfo* backbuffer = fBackbuffers + fCurrentBackbufferIndex; |
| 424 | 415 |
| 425 GR_VK_CALL_ERRCHECK(fBackendContext->fInterface, | 416 GR_VK_CALL_ERRCHECK(fBackendContext->fInterface, |
| 426 WaitForFences(fBackendContext->fDevice, 2, backbuffer->f
UsageFences, | 417 WaitForFences(fBackendContext->fDevice, 2, backbuffer->f
UsageFences, |
| 427 true, UINT64_MAX)); | 418 true, UINT64_MAX)); |
| 428 return backbuffer; | 419 return backbuffer; |
| 429 } | 420 } |
| 430 | 421 |
| 431 sk_sp<SkSurface> VulkanWindowContext::getBackbufferSurface() { | 422 SkSurface* VulkanWindowContext::getBackbufferSurface() { |
| 432 BackbufferInfo* backbuffer = this->getAvailableBackbuffer(); | 423 BackbufferInfo* backbuffer = this->getAvailableBackbuffer(); |
| 433 SkASSERT(backbuffer); | 424 SkASSERT(backbuffer); |
| 434 | 425 |
| 435 // reset the fence | 426 // reset the fence |
| 436 GR_VK_CALL_ERRCHECK(fBackendContext->fInterface, | 427 GR_VK_CALL_ERRCHECK(fBackendContext->fInterface, |
| 437 ResetFences(fBackendContext->fDevice, 2, backbuffer->fUs
ageFences)); | 428 ResetFences(fBackendContext->fDevice, 2, backbuffer->fUs
ageFences)); |
| 438 // semaphores should be in unsignaled state | 429 // semaphores should be in unsignaled state |
| 439 | 430 |
| 440 // acquire the image | 431 // acquire the image |
| 441 VkResult res = fAcquireNextImageKHR(fBackendContext->fDevice, fSwapchain, UI
NT64_MAX, | 432 VkResult res = fAcquireNextImageKHR(fBackendContext->fDevice, fSwapchain, UI
NT64_MAX, |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 512 submitInfo.pWaitSemaphores = &backbuffer->fAcquireSemaphore; | 503 submitInfo.pWaitSemaphores = &backbuffer->fAcquireSemaphore; |
| 513 submitInfo.pWaitDstStageMask = &waitDstStageFlags; | 504 submitInfo.pWaitDstStageMask = &waitDstStageFlags; |
| 514 submitInfo.commandBufferCount = 1; | 505 submitInfo.commandBufferCount = 1; |
| 515 submitInfo.pCommandBuffers = &backbuffer->fTransitionCmdBuffers[0]; | 506 submitInfo.pCommandBuffers = &backbuffer->fTransitionCmdBuffers[0]; |
| 516 submitInfo.signalSemaphoreCount = 0; | 507 submitInfo.signalSemaphoreCount = 0; |
| 517 | 508 |
| 518 GR_VK_CALL_ERRCHECK(fBackendContext->fInterface, | 509 GR_VK_CALL_ERRCHECK(fBackendContext->fInterface, |
| 519 QueueSubmit(fBackendContext->fQueue, 1, &submitInfo, | 510 QueueSubmit(fBackendContext->fQueue, 1, &submitInfo, |
| 520 backbuffer->fUsageFences[0])); | 511 backbuffer->fUsageFences[0])); |
| 521 | 512 |
| 522 return sk_ref_sp(fSurfaces[backbuffer->fImageIndex].get()); | 513 return fSurfaces[backbuffer->fImageIndex].get(); |
| 523 } | 514 } |
| 524 | 515 |
| 516 |
| 525 void VulkanWindowContext::swapBuffers() { | 517 void VulkanWindowContext::swapBuffers() { |
| 526 | 518 |
| 527 BackbufferInfo* backbuffer = fBackbuffers + fCurrentBackbufferIndex; | 519 BackbufferInfo* backbuffer = fBackbuffers + fCurrentBackbufferIndex; |
| 528 | 520 |
| 529 this->presentRenderSurface(fSurfaces[backbuffer->fImageIndex], | |
| 530 fRenderTargets[backbuffer->fImageIndex], 24); | |
| 531 | |
| 532 VkImageLayout layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; | 521 VkImageLayout layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; |
| 533 VkPipelineStageFlags srcStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPU
T_BIT; | 522 VkPipelineStageFlags srcStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPU
T_BIT; |
| 534 VkPipelineStageFlags dstStageMask = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT; | 523 VkPipelineStageFlags dstStageMask = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT; |
| 535 VkAccessFlags srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT; | 524 VkAccessFlags srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT; |
| 536 VkAccessFlags dstAccessMask = VK_ACCESS_MEMORY_READ_BIT; | 525 VkAccessFlags dstAccessMask = VK_ACCESS_MEMORY_READ_BIT; |
| 537 | 526 |
| 538 VkImageMemoryBarrier imageMemoryBarrier = { | 527 VkImageMemoryBarrier imageMemoryBarrier = { |
| 539 VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, // sType | 528 VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, // sType |
| 540 NULL, // pNext | 529 NULL, // pNext |
| 541 srcAccessMask, // outputMask | 530 srcAccessMask, // outputMask |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 592 &fSwapchain, // pSwapchains | 581 &fSwapchain, // pSwapchains |
| 593 &backbuffer->fImageIndex, // pImageIndices | 582 &backbuffer->fImageIndex, // pImageIndices |
| 594 NULL // pResults | 583 NULL // pResults |
| 595 }; | 584 }; |
| 596 | 585 |
| 597 fQueuePresentKHR(fPresentQueue, &presentInfo); | 586 fQueuePresentKHR(fPresentQueue, &presentInfo); |
| 598 | 587 |
| 599 } | 588 } |
| 600 | 589 |
| 601 } //namespace sk_app | 590 } //namespace sk_app |
| OLD | NEW |