blob: dd7796ee88f4f40bd5c6abea71b2e5c199bac49d [file] [log] [blame]
Greg Daniel6be35232017-03-01 17:01:09 -05001/*
2 * Copyright 2017 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
Mike Kleinc0bd9f92019-04-23 12:05:21 -05008#include "src/gpu/vk/GrVkSemaphore.h"
Greg Daniel6be35232017-03-01 17:01:09 -05009
Mike Kleinc0bd9f92019-04-23 12:05:21 -050010#include "include/gpu/GrBackendSemaphore.h"
11#include "src/gpu/vk/GrVkGpu.h"
12#include "src/gpu/vk/GrVkUtil.h"
Greg Daniel6be35232017-03-01 17:01:09 -050013
14#ifdef VK_USE_PLATFORM_WIN32_KHR
15// windows wants to define this as CreateSemaphoreA or CreateSemaphoreW
16#undef CreateSemaphore
17#endif
18
Brian Salomon62db8d52018-08-30 10:37:47 -040019sk_sp<GrVkSemaphore> GrVkSemaphore::Make(GrVkGpu* gpu, bool isOwned) {
Greg Daniel6be35232017-03-01 17:01:09 -050020 VkSemaphoreCreateInfo createInfo;
Greg Daniel8761e0c2017-07-20 16:36:01 -040021 memset(&createInfo, 0, sizeof(VkSemaphoreCreateInfo));
Greg Daniel6be35232017-03-01 17:01:09 -050022 createInfo.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
23 createInfo.pNext = nullptr;
24 createInfo.flags = 0;
25 VkSemaphore semaphore = VK_NULL_HANDLE;
26 GR_VK_CALL_ERRCHECK(gpu->vkInterface(),
27 CreateSemaphore(gpu->device(), &createInfo, nullptr, &semaphore));
28
Greg Daniel48661b82018-01-22 16:11:35 -050029 return sk_sp<GrVkSemaphore>(new GrVkSemaphore(gpu, semaphore, false, false, isOwned));
Greg Daniel6be35232017-03-01 17:01:09 -050030}
31
Brian Salomon62db8d52018-08-30 10:37:47 -040032sk_sp<GrVkSemaphore> GrVkSemaphore::MakeWrapped(GrVkGpu* gpu,
Greg Daniela5cb7812017-06-16 09:45:32 -040033 VkSemaphore semaphore,
Greg Daniel48661b82018-01-22 16:11:35 -050034 WrapType wrapType,
Greg Daniela5cb7812017-06-16 09:45:32 -040035 GrWrapOwnership ownership) {
36 if (VK_NULL_HANDLE == semaphore) {
37 return nullptr;
38 }
Greg Daniel48661b82018-01-22 16:11:35 -050039 bool prohibitSignal = WrapType::kWillWait == wrapType;
40 bool prohibitWait = WrapType::kWillSignal == wrapType;
41 return sk_sp<GrVkSemaphore>(new GrVkSemaphore(gpu, semaphore, prohibitSignal, prohibitWait,
Greg Daniela5cb7812017-06-16 09:45:32 -040042 kBorrow_GrWrapOwnership != ownership));
43}
44
Brian Salomon62db8d52018-08-30 10:37:47 -040045GrVkSemaphore::GrVkSemaphore(GrVkGpu* gpu, VkSemaphore semaphore, bool prohibitSignal,
Greg Daniel48661b82018-01-22 16:11:35 -050046 bool prohibitWait, bool isOwned)
Greg Daniela5cb7812017-06-16 09:45:32 -040047 : INHERITED(gpu) {
Greg Daniel48661b82018-01-22 16:11:35 -050048 fResource = new Resource(semaphore, prohibitSignal, prohibitWait, isOwned);
Brian Salomonaa6ca0a2019-01-24 16:03:07 -050049 isOwned ? this->registerWithCache(SkBudgeted::kNo)
50 : this->registerWithCacheWrapped(GrWrapCacheable::kNo);
Greg Daniel6be35232017-03-01 17:01:09 -050051}
52
Brian Salomon62db8d52018-08-30 10:37:47 -040053void GrVkSemaphore::onRelease() {
54 if (fResource) {
Ethan Nicholas8e265a72018-12-12 16:22:40 -050055 fResource->unref(static_cast<GrVkGpu*>(this->getGpu()));
Brian Salomon62db8d52018-08-30 10:37:47 -040056 fResource = nullptr;
Greg Daniel6be35232017-03-01 17:01:09 -050057 }
Brian Salomon62db8d52018-08-30 10:37:47 -040058 INHERITED::onRelease();
59}
60
61void GrVkSemaphore::onAbandon() {
62 if (fResource) {
63 fResource->unrefAndAbandon();
64 fResource = nullptr;
65 }
66 INHERITED::onAbandon();
Greg Daniel6be35232017-03-01 17:01:09 -050067}
68
Ethan Nicholas8e265a72018-12-12 16:22:40 -050069void GrVkSemaphore::Resource::freeGPUData(GrVkGpu* gpu) const {
Greg Daniela5cb7812017-06-16 09:45:32 -040070 if (fIsOwned) {
71 GR_VK_CALL(gpu->vkInterface(),
72 DestroySemaphore(gpu->device(), fSemaphore, nullptr));
73 }
74}
75
Brian Salomon1e576e72018-08-30 10:20:38 -040076GrBackendSemaphore GrVkSemaphore::backendSemaphore() const {
77 GrBackendSemaphore backendSemaphore;
78 backendSemaphore.initVulkan(fResource->semaphore());
79 return backendSemaphore;
Greg Daniel6be35232017-03-01 17:01:09 -050080}