blob: d0fe4d1544aa9918fb4dc24f1646ca5f027afbd1 [file] [log] [blame]
/*
* Copyright 2024 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#pragma once
#include <include/gpu/vk/VulkanBackendContext.h>
#include <include/gpu/vk/VulkanExtensions.h>
#include <include/gpu/vk/VulkanTypes.h>
#include <vulkan/vulkan.h>
using namespace skgpu;
namespace android {
namespace renderengine {
namespace skia {
class VulkanInterface {
public:
// Create an uninitialized interface. Initialize with `init`.
VulkanInterface() = default;
~VulkanInterface() = default;
VulkanInterface(const VulkanInterface&) = delete;
VulkanInterface& operator=(const VulkanInterface&) = delete;
VulkanInterface& operator=(VulkanInterface&&) = delete;
void init(bool protectedContent = false);
// Returns true and marks this VulkanInterface as "owned" if it is initialized but unused by any
// RenderEngine instances. Returns false if already owned, indicating that it must not be used
// by a new RE instance.
bool takeOwnership();
void teardown();
// TODO(b/309785258) Combine these into one now that they are the same implementation.
VulkanBackendContext getGaneshBackendContext();
VulkanBackendContext getGraphiteBackendContext();
VkSemaphore createExportableSemaphore();
VkSemaphore importSemaphoreFromSyncFd(int syncFd);
int exportSemaphoreSyncFd(VkSemaphore semaphore);
void destroySemaphore(VkSemaphore semaphore);
bool isInitialized() const { return mInitialized; }
bool isRealtimePriority() const { return mIsRealtimePriority; }
const std::vector<std::string>& getInstanceExtensionNames() { return mInstanceExtensionNames; }
const std::vector<std::string>& getDeviceExtensionNames() { return mDeviceExtensionNames; }
private:
struct VulkanFuncs {
PFN_vkCreateSemaphore vkCreateSemaphore = nullptr;
PFN_vkImportSemaphoreFdKHR vkImportSemaphoreFdKHR = nullptr;
PFN_vkGetSemaphoreFdKHR vkGetSemaphoreFdKHR = nullptr;
PFN_vkDestroySemaphore vkDestroySemaphore = nullptr;
PFN_vkDeviceWaitIdle vkDeviceWaitIdle = nullptr;
PFN_vkDestroyDevice vkDestroyDevice = nullptr;
PFN_vkDestroyInstance vkDestroyInstance = nullptr;
};
static void onVkDeviceFault(void* callbackContext, const std::string& description,
const std::vector<VkDeviceFaultAddressInfoEXT>& addressInfos,
const std::vector<VkDeviceFaultVendorInfoEXT>& vendorInfos,
const std::vector<std::byte>& vendorBinaryData);
// Note: keep all field defaults in sync with teardown()
bool mInitialized = false;
bool mIsOwned = false;
VkInstance mInstance = VK_NULL_HANDLE;
VkPhysicalDevice mPhysicalDevice = VK_NULL_HANDLE;
VkDevice mDevice = VK_NULL_HANDLE;
VkQueue mQueue = VK_NULL_HANDLE;
int mQueueIndex = 0;
uint32_t mApiVersion = 0;
skgpu::VulkanExtensions mVulkanExtensions;
VkPhysicalDeviceFeatures2* mPhysicalDeviceFeatures2 = nullptr;
VkPhysicalDeviceSamplerYcbcrConversionFeatures* mSamplerYcbcrConversionFeatures = nullptr;
VkPhysicalDeviceProtectedMemoryFeatures* mProtectedMemoryFeatures = nullptr;
VkPhysicalDeviceFaultFeaturesEXT* mDeviceFaultFeatures = nullptr;
skgpu::VulkanGetProc mGrGetProc = nullptr;
bool mIsProtected = false;
bool mIsRealtimePriority = false;
VulkanFuncs mFuncs;
std::vector<std::string> mInstanceExtensionNames;
std::vector<std::string> mDeviceExtensionNames;
};
} // namespace skia
} // namespace renderengine
} // namespace android