#ifndef GPU_VULKAN_VULKAN_IMPLEMENTATION_H_
#define GPU_VULKAN_VULKAN_IMPLEMENTATION_H_
#include <vulkan/vulkan_core.h>
#include <memory>
#include <vector>
#include "base/component_export.h"
#include "build/build_config.h"
#include "components/viz/common/resources/shared_image_format.h"
#include "gpu/vulkan/semaphore_handle.h"
#include "ui/gfx/buffer_types.h"
#include "ui/gfx/color_space.h"
#include "ui/gfx/geometry/size.h"
#include "ui/gfx/gpu_memory_buffer_handle.h"
#include "ui/gfx/native_ui_types.h"
#if BUILDFLAG(IS_ANDROID)
#include "base/android/scoped_hardware_buffer_handle.h"
#elif BUILDFLAG(IS_OHOS)
#include "base/ohos/scoped_native_buffer_handle.h"
#endif
namespace gfx {
class GpuFence;
}
namespace gpu {
class VulkanDeviceQueue;
class VulkanSurface;
class VulkanImage;
class VulkanInstance;
struct GPUInfo;
struct VulkanYCbCrInfo;
class COMPONENT_EXPORT(VULKAN) VulkanImplementation {
public:
explicit VulkanImplementation(bool use_swiftshader = false,
bool allow_protected_memory = false);
VulkanImplementation(const VulkanImplementation&) = delete;
VulkanImplementation& operator=(const VulkanImplementation&) = delete;
virtual ~VulkanImplementation();
virtual bool InitializeVulkanInstance(bool using_surface = true) = 0;
virtual VulkanInstance* GetVulkanInstance() = 0;
virtual std::unique_ptr<VulkanSurface> CreateViewSurface(
gfx::AcceleratedWidget window) = 0;
virtual bool GetPhysicalDevicePresentationSupport(
VkPhysicalDevice device,
const std::vector<VkQueueFamilyProperties>& queue_family_properties,
uint32_t queue_family_index) = 0;
virtual std::vector<const char*> GetRequiredDeviceExtensions() = 0;
virtual std::vector<const char*> GetOptionalDeviceExtensions() = 0;
virtual VkFence CreateVkFenceForGpuFence(VkDevice vk_device) = 0;
virtual std::unique_ptr<gfx::GpuFence> ExportVkFenceToGpuFence(
VkDevice vk_device,
VkFence vk_fence) = 0;
virtual VkSemaphore CreateExternalSemaphore(VkDevice vk_device);
virtual VkSemaphore ImportSemaphoreHandle(VkDevice vk_device,
SemaphoreHandle handle);
virtual SemaphoreHandle GetSemaphoreHandle(VkDevice vk_device,
VkSemaphore vk_semaphore);
virtual VkExternalSemaphoreHandleTypeFlagBits
GetExternalSemaphoreHandleType() = 0;
virtual bool CanImportGpuMemoryBuffer(
VulkanDeviceQueue* device_queue,
gfx::GpuMemoryBufferType memory_buffer_type) = 0;
virtual std::unique_ptr<VulkanImage> CreateImageFromGpuMemoryHandle(
VulkanDeviceQueue* device_queue,
gfx::GpuMemoryBufferHandle gmb_handle,
gfx::Size size,
VkFormat vk_format,
const gfx::ColorSpace& color_space) = 0;
virtual bool IsExternalSemaphoreSupported(VulkanDeviceQueue* device_queue);
#if BUILDFLAG(IS_ANDROID)
virtual bool GetSamplerYcbcrConversionInfo(
const VkDevice& vk_device,
base::android::ScopedHardwareBufferHandle ahb_handle,
VulkanYCbCrInfo* ycbcr_info) = 0;
#endif
#if BUILDFLAG(ARKWEB_VULKAN)
virtual bool GetSamplerYcbcrConversionInfo(
const VkDevice& vk_device,
ScopedNativeBufferHandle ahb_handle,
VulkanYCbCrInfo* ycbcr_info) = 0;
#endif
#if BUILDFLAG(IS_FUCHSIA)
virtual void RegisterSysmemBufferCollection(
VkDevice device,
zx::eventpair service_handle,
zx::channel sysmem_token,
viz::SharedImageFormat format,
gfx::BufferUsage usage,
gfx::Size size,
size_t min_buffer_count,
bool register_with_image_pipe) = 0;
#endif
bool use_swiftshader() const { return use_swiftshader_; }
bool allow_protected_memory() const { return allow_protected_memory_; }
private:
const bool use_swiftshader_;
const bool allow_protected_memory_;
};
COMPONENT_EXPORT(VULKAN)
std::unique_ptr<VulkanDeviceQueue> CreateVulkanDeviceQueue(
VulkanImplementation* vulkan_implementation,
uint32_t option,
const GPUInfo* gpu_info = nullptr,
uint32_t heap_memory_limit = 0,
const bool is_thread_safe = false);
}
#endif