| /* |
| * Copyright 2017 Google Inc. |
| * |
| * Use of this source code is governed by a BSD-style license that can be |
| * found in the LICENSE file. |
| */ |
| |
| #include "GrVkSemaphore.h" |
| |
| #include "GrBackendSemaphore.h" |
| #include "GrVkGpu.h" |
| #include "GrVkUtil.h" |
| |
| #ifdef VK_USE_PLATFORM_WIN32_KHR |
| // windows wants to define this as CreateSemaphoreA or CreateSemaphoreW |
| #undef CreateSemaphore |
| #endif |
| |
| SkMutex GrVkSemaphore::Resource::gMutex; |
| |
| sk_sp<GrVkSemaphore> GrVkSemaphore::Make(const GrVkGpu* gpu, bool isOwned) { |
| VkSemaphoreCreateInfo createInfo; |
| memset(&createInfo, 0, sizeof(VkSemaphoreCreateInfo)); |
| createInfo.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO; |
| createInfo.pNext = nullptr; |
| createInfo.flags = 0; |
| VkSemaphore semaphore = VK_NULL_HANDLE; |
| GR_VK_CALL_ERRCHECK(gpu->vkInterface(), |
| CreateSemaphore(gpu->device(), &createInfo, nullptr, &semaphore)); |
| |
| return sk_sp<GrVkSemaphore>(new GrVkSemaphore(gpu, semaphore, false, false, isOwned)); |
| } |
| |
| sk_sp<GrVkSemaphore> GrVkSemaphore::MakeWrapped(const GrVkGpu* gpu, |
| VkSemaphore semaphore, |
| WrapType wrapType, |
| GrWrapOwnership ownership) { |
| if (VK_NULL_HANDLE == semaphore) { |
| return nullptr; |
| } |
| bool prohibitSignal = WrapType::kWillWait == wrapType; |
| bool prohibitWait = WrapType::kWillSignal == wrapType; |
| return sk_sp<GrVkSemaphore>(new GrVkSemaphore(gpu, semaphore, prohibitSignal, prohibitWait, |
| kBorrow_GrWrapOwnership != ownership)); |
| } |
| |
| GrVkSemaphore::GrVkSemaphore(const GrVkGpu* gpu, VkSemaphore semaphore, bool prohibitSignal, |
| bool prohibitWait, bool isOwned) |
| : INHERITED(gpu) { |
| fResource = new Resource(semaphore, prohibitSignal, prohibitWait, isOwned); |
| } |
| |
| GrVkSemaphore::~GrVkSemaphore() { |
| if (fGpu) { |
| fResource->unref(static_cast<const GrVkGpu*>(fGpu)); |
| } else { |
| fResource->unrefAndAbandon(); |
| } |
| } |
| |
| void GrVkSemaphore::Resource::freeGPUData(const GrVkGpu* gpu) const { |
| if (fIsOwned) { |
| GR_VK_CALL(gpu->vkInterface(), |
| DestroySemaphore(gpu->device(), fSemaphore, nullptr)); |
| } |
| } |
| |
| void GrVkSemaphore::setBackendSemaphore(GrBackendSemaphore* backendSemaphore) const { |
| backendSemaphore->initVulkan(fResource->semaphore()); |
| } |
| |