skia2/include/gpu/GrBackendSemaphore.h
Robert Phillips 59ba27bc6a Move Ganesh specific headers into include/private/gpu/ganesh
Change-Id: Ia799cdff5288efe5d5d53e8d8f77cf32f3343371
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/529131
Reviewed-by: Jim Van Verth <jvanverth@google.com>
Reviewed-by: Greg Daniel <egdaniel@google.com>
Commit-Queue: Robert Phillips <robertphillips@google.com>
2022-04-12 17:30:07 +00:00

141 lines
3.4 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"
#ifdef SK_METAL
#include "include/gpu/mtl/GrMtlTypes.h"
#endif
#ifdef SK_VULKAN
#include "include/gpu/vk/GrVkTypes.h"
#endif
#ifdef SK_DIRECT3D
#include "include/private/gpu/ganesh/GrD3DTypesMinimal.h"
#endif
/**
* 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 init* is called, which will set the appropriate GrBackend.
GrBackendSemaphore()
: fBackend(GrBackendApi::kOpenGL), fGLSync(nullptr), fIsInitialized(false) {}
#ifdef SK_DIRECT3D
// We only need to specify these if Direct3D is enabled, because it requires special copy
// characteristics.
~GrBackendSemaphore();
GrBackendSemaphore(const GrBackendSemaphore&);
GrBackendSemaphore& operator=(const GrBackendSemaphore&);
#endif
void initGL(GrGLsync sync) {
fBackend = GrBackendApi::kOpenGL;
fGLSync = sync;
fIsInitialized = true;
}
#ifdef SK_VULKAN
void initVulkan(VkSemaphore semaphore) {
fBackend = GrBackendApi::kVulkan;
fVkSemaphore = semaphore;
fIsInitialized = true;
}
VkSemaphore vkSemaphore() const {
if (!fIsInitialized || GrBackendApi::kVulkan != fBackend) {
return VK_NULL_HANDLE;
}
return fVkSemaphore;
}
#endif
#ifdef SK_METAL
// 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;
fIsInitialized = true;
}
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;
}
#endif
#ifdef SK_DIRECT3D
void initDirect3D(const GrD3DFenceInfo& info) {
fBackend = GrBackendApi::kDirect3D;
this->assignD3DFenceInfo(info);
fIsInitialized = true;
}
#endif
bool isInitialized() const { return fIsInitialized; }
GrGLsync glSync() const {
if (!fIsInitialized || GrBackendApi::kOpenGL != fBackend) {
return nullptr;
}
return fGLSync;
}
#ifdef SK_DIRECT3D
bool getD3DFenceInfo(GrD3DFenceInfo* outInfo) const;
#endif
private:
#ifdef SK_DIRECT3D
void assignD3DFenceInfo(const GrD3DFenceInfo& info);
#endif
GrBackendApi fBackend;
union {
GrGLsync fGLSync;
#ifdef SK_VULKAN
VkSemaphore fVkSemaphore;
#endif
#ifdef SK_METAL
GrMTLHandle fMtlEvent; // Expected to be an id<MTLEvent>
#endif
#ifdef SK_DIRECT3D
GrD3DFenceInfo* fD3DFenceInfo;
#endif
};
#ifdef SK_METAL
uint64_t fMtlValue;
#endif
bool fIsInitialized;
};
#endif