skia2/include/gpu/GrBackendSemaphore.h
Jim Van Verth 066ceb15b6 Implement fences and semaphores for Metal.
GrFence is implemented by a single MTLSharedEvent where we increase the
value with each new invocation. GrSemaphore uses a MTLEvent (the
assumption here is that we are signaling and waiting on the same device)
with an associated value that defaults to 1. For generating a large
number of GrSemaphores at once it should be possible to use the same
MTLEvent but with different assigned values.

Bug: skia:8243
Change-Id: Ic7de2d9d295fbe51e67bc7c3c4354257cb0774d4
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/233416
Reviewed-by: Greg Daniel <egdaniel@google.com>
Commit-Queue: Jim Van Verth <jvanverth@google.com>
2019-08-28 19:38:56 +00:00

97 lines
2.5 KiB
C++

/*
* Copyright 2017 Google Inc.
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#ifndef GrBackendSemaphore_DEFINED
#define GrBackendSemaphore_DEFINED
#include "include/gpu/GrTypes.h"
#include "include/gpu/gl/GrGLTypes.h"
#include "include/gpu/mtl/GrMtlTypes.h"
#include "include/gpu/vk/GrVkTypes.h"
/**
* Wrapper class for passing into and receiving data from Ganesh about a backend semaphore object.
*/
class GrBackendSemaphore {
public:
// For convenience we just set the backend here to OpenGL. The GrBackendSemaphore cannot be used
// until either initGL or initVulkan are called which will set the appropriate GrBackend.
GrBackendSemaphore() : fBackend(GrBackendApi::kOpenGL), fGLSync(0), fIsInitialized(false) {}
void initGL(GrGLsync sync) {
fBackend = GrBackendApi::kOpenGL;
fGLSync = sync;
fIsInitialized = true;
}
void initVulkan(VkSemaphore semaphore) {
fBackend = GrBackendApi::kVulkan;
fVkSemaphore = semaphore;
#ifdef SK_VULKAN
fIsInitialized = true;
#else
fIsInitialized = false;
#endif
}
// It is the creator's responsibility to ref the MTLEvent passed in here, via __bridge_retained.
// The other end will wrap this BackendSemaphore and take the ref, via __bridge_transfer.
void initMetal(GrMTLHandle event, uint64_t value) {
fBackend = GrBackendApi::kMetal;
fMtlEvent = event;
fMtlValue = value;
#ifdef SK_METAL
fIsInitialized = true;
#else
fIsInitialized = false;
#endif
}
bool isInitialized() const { return fIsInitialized; }
GrGLsync glSync() const {
if (!fIsInitialized || GrBackendApi::kOpenGL != fBackend) {
return 0;
}
return fGLSync;
}
VkSemaphore vkSemaphore() const {
if (!fIsInitialized || GrBackendApi::kVulkan != fBackend) {
return VK_NULL_HANDLE;
}
return fVkSemaphore;
}
GrMTLHandle mtlSemaphore() const {
if (!fIsInitialized || GrBackendApi::kMetal != fBackend) {
return nullptr;
}
return fMtlEvent;
}
uint64_t mtlValue() const {
if (!fIsInitialized || GrBackendApi::kMetal != fBackend) {
return 0;
}
return fMtlValue;
}
private:
GrBackendApi fBackend;
union {
GrGLsync fGLSync;
VkSemaphore fVkSemaphore;
GrMTLHandle fMtlEvent; // Expected to be an id<MTLEvent>
};
uint64_t fMtlValue;
bool fIsInitialized;
};
#endif