18bf80f4bSopenharmony_ci/*
28bf80f4bSopenharmony_ci * Copyright (c) 2024 Huawei Device Co., Ltd.
38bf80f4bSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
48bf80f4bSopenharmony_ci * you may not use this file except in compliance with the License.
58bf80f4bSopenharmony_ci * You may obtain a copy of the License at
68bf80f4bSopenharmony_ci *
78bf80f4bSopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
88bf80f4bSopenharmony_ci *
98bf80f4bSopenharmony_ci * Unless required by applicable law or agreed to in writing, software
108bf80f4bSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
118bf80f4bSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
128bf80f4bSopenharmony_ci * See the License for the specific language governing permissions and
138bf80f4bSopenharmony_ci * limitations under the License.
148bf80f4bSopenharmony_ci */
158bf80f4bSopenharmony_ci
168bf80f4bSopenharmony_ci#ifndef VULKAN_DEVICE_VK_H
178bf80f4bSopenharmony_ci#define VULKAN_DEVICE_VK_H
188bf80f4bSopenharmony_ci
198bf80f4bSopenharmony_ci#include <cstdint>
208bf80f4bSopenharmony_ci#include <vulkan/vulkan_core.h>
218bf80f4bSopenharmony_ci
228bf80f4bSopenharmony_ci#include <base/containers/unordered_map.h>
238bf80f4bSopenharmony_ci#include <base/containers/vector.h>
248bf80f4bSopenharmony_ci#include <base/util/formats.h>
258bf80f4bSopenharmony_ci#include <render/device/intf_device.h>
268bf80f4bSopenharmony_ci#include <render/device/pipeline_state_desc.h>
278bf80f4bSopenharmony_ci#include <render/namespace.h>
288bf80f4bSopenharmony_ci#include <render/vulkan/intf_device_vk.h>
298bf80f4bSopenharmony_ci
308bf80f4bSopenharmony_ci#include "device/device.h"
318bf80f4bSopenharmony_ci#include "platform_vk.h"
328bf80f4bSopenharmony_ci#include "vulkan/swapchain_vk.h"
338bf80f4bSopenharmony_ci
348bf80f4bSopenharmony_ciRENDER_BEGIN_NAMESPACE()
358bf80f4bSopenharmony_ciclass ComputePipelineStateObject;
368bf80f4bSopenharmony_ciclass GraphicsPipelineStateObject;
378bf80f4bSopenharmony_ciclass GpuBuffer;
388bf80f4bSopenharmony_ciclass GpuComputeProgram;
398bf80f4bSopenharmony_ciclass GpuImage;
408bf80f4bSopenharmony_ciclass GpuResourceManager;
418bf80f4bSopenharmony_ciclass GpuSemaphore;
428bf80f4bSopenharmony_ciclass GpuSampler;
438bf80f4bSopenharmony_ciclass GpuShaderProgram;
448bf80f4bSopenharmony_ciclass LowLevelDeviceVk;
458bf80f4bSopenharmony_ciclass NodeContextDescriptorSetManager;
468bf80f4bSopenharmony_ciclass NodeContextPoolManager;
478bf80f4bSopenharmony_ciclass PlatformGpuMemoryAllocator;
488bf80f4bSopenharmony_ciclass RenderFrameSync;
498bf80f4bSopenharmony_ciclass RenderBackend;
508bf80f4bSopenharmony_ciclass RenderContext;
518bf80f4bSopenharmony_ciclass ShaderModule;
528bf80f4bSopenharmony_ciclass Swapchain;
538bf80f4bSopenharmony_ci
548bf80f4bSopenharmony_cistruct GpuImagePlatformData;
558bf80f4bSopenharmony_cistruct SwapchainCreateInfo;
568bf80f4bSopenharmony_cistruct BackendSpecificImageDesc;
578bf80f4bSopenharmony_cistruct GpuAccelerationStructureDesc;
588bf80f4bSopenharmony_cistruct GpuBufferDesc;
598bf80f4bSopenharmony_cistruct GpuComputeProgramCreateData;
608bf80f4bSopenharmony_cistruct GpuImageDesc;
618bf80f4bSopenharmony_cistruct GpuSamplerDesc;
628bf80f4bSopenharmony_cistruct GpuShaderProgramCreateData;
638bf80f4bSopenharmony_cistruct PipelineLayout;
648bf80f4bSopenharmony_cistruct RenderHandle;
658bf80f4bSopenharmony_cistruct ShaderModuleCreateInfo;
668bf80f4bSopenharmony_cistruct QueueProperties;
678bf80f4bSopenharmony_ci
688bf80f4bSopenharmony_cistruct LowLevelQueueInfo {
698bf80f4bSopenharmony_ci    VkQueueFlags queueFlags { 0 };
708bf80f4bSopenharmony_ci    uint32_t queueFamilyIndex { ~0u };
718bf80f4bSopenharmony_ci    uint32_t queueCount { 0 };
728bf80f4bSopenharmony_ci    float priority { 1.0f };
738bf80f4bSopenharmony_ci};
748bf80f4bSopenharmony_ci
758bf80f4bSopenharmony_cistruct LowLevelGpuQueueVk {
768bf80f4bSopenharmony_ci    VkQueue queue { VK_NULL_HANDLE };
778bf80f4bSopenharmony_ci
788bf80f4bSopenharmony_ci    LowLevelQueueInfo queueInfo;
798bf80f4bSopenharmony_ci};
808bf80f4bSopenharmony_ci
818bf80f4bSopenharmony_cistruct DevicePlatformInternalDataVk {
828bf80f4bSopenharmony_ci    BASE_NS::vector<BASE_NS::Format> supportedDepthFormats;
838bf80f4bSopenharmony_ci};
848bf80f4bSopenharmony_ci
858bf80f4bSopenharmony_cistruct DebugFunctionUtilitiesVk {
868bf80f4bSopenharmony_ci    PFN_vkSetDebugUtilsObjectNameEXT vkSetDebugUtilsObjectNameEXT { nullptr };
878bf80f4bSopenharmony_ci    PFN_vkCmdBeginDebugUtilsLabelEXT vkCmdBeginDebugUtilsLabelEXT { nullptr };
888bf80f4bSopenharmony_ci    PFN_vkCmdEndDebugUtilsLabelEXT vkCmdEndDebugUtilsLabelEXT { nullptr };
898bf80f4bSopenharmony_ci
908bf80f4bSopenharmony_ci    VkDebugUtilsMessengerEXT debugMessenger { VK_NULL_HANDLE };
918bf80f4bSopenharmony_ci    VkDebugReportCallbackEXT debugCallback { VK_NULL_HANDLE };
928bf80f4bSopenharmony_ci};
938bf80f4bSopenharmony_ci
948bf80f4bSopenharmony_ciclass DeviceVk final : public Device {
958bf80f4bSopenharmony_cipublic:
968bf80f4bSopenharmony_ci    DeviceVk(RenderContext& renderContext, DeviceCreateInfo const& createInfo);
978bf80f4bSopenharmony_ci    ~DeviceVk() override;
988bf80f4bSopenharmony_ci
998bf80f4bSopenharmony_ci    // From IDevice
1008bf80f4bSopenharmony_ci    DeviceBackendType GetBackendType() const override;
1018bf80f4bSopenharmony_ci    const DevicePlatformData& GetPlatformData() const override;
1028bf80f4bSopenharmony_ci    FormatProperties GetFormatProperties(const BASE_NS::Format format) const override;
1038bf80f4bSopenharmony_ci    AccelerationStructureBuildSizes GetAccelerationStructureBuildSizes(
1048bf80f4bSopenharmony_ci        const AccelerationStructureBuildGeometryInfo& geometry,
1058bf80f4bSopenharmony_ci        BASE_NS::array_view<const AccelerationStructureGeometryTrianglesInfo> triangles,
1068bf80f4bSopenharmony_ci        BASE_NS::array_view<const AccelerationStructureGeometryAabbsInfo> aabbs,
1078bf80f4bSopenharmony_ci        BASE_NS::array_view<const AccelerationStructureGeometryInstancesInfo> instances) const override;
1088bf80f4bSopenharmony_ci    ILowLevelDevice& GetLowLevelDevice() const override;
1098bf80f4bSopenharmony_ci    void WaitForIdle() override;
1108bf80f4bSopenharmony_ci
1118bf80f4bSopenharmony_ci    const DevicePlatformInternalDataVk& GetPlatformInternalDataVk() const;
1128bf80f4bSopenharmony_ci    const DevicePlatformDataVk& GetPlatformDataVk() const;
1138bf80f4bSopenharmony_ci
1148bf80f4bSopenharmony_ci    PlatformGpuMemoryAllocator* GetPlatformGpuMemoryAllocator() override;
1158bf80f4bSopenharmony_ci
1168bf80f4bSopenharmony_ci    BASE_NS::unique_ptr<Swapchain> CreateDeviceSwapchain(const SwapchainCreateInfo& swapchainCreateInfo) override;
1178bf80f4bSopenharmony_ci    void DestroyDeviceSwapchain() override;
1188bf80f4bSopenharmony_ci
1198bf80f4bSopenharmony_ci    void Activate() override;
1208bf80f4bSopenharmony_ci    void Deactivate() override;
1218bf80f4bSopenharmony_ci
1228bf80f4bSopenharmony_ci    bool AllowThreadedProcessing() const override;
1238bf80f4bSopenharmony_ci
1248bf80f4bSopenharmony_ci    GpuQueue GetValidGpuQueue(const GpuQueue& gpuQueue) const override;
1258bf80f4bSopenharmony_ci    uint32_t GetGpuQueueCount() const override;
1268bf80f4bSopenharmony_ci
1278bf80f4bSopenharmony_ci    void InitializePipelineCache(BASE_NS::array_view<const uint8_t> initialData) override;
1288bf80f4bSopenharmony_ci    BASE_NS::vector<uint8_t> GetPipelineCache() const override;
1298bf80f4bSopenharmony_ci
1308bf80f4bSopenharmony_ci    LowLevelGpuQueueVk GetGpuQueue(const GpuQueue& gpuQueue) const;
1318bf80f4bSopenharmony_ci    LowLevelGpuQueueVk GetPresentationGpuQueue() const;
1328bf80f4bSopenharmony_ci    BASE_NS::vector<LowLevelGpuQueueVk> GetLowLevelGpuQueues() const;
1338bf80f4bSopenharmony_ci
1348bf80f4bSopenharmony_ci    BASE_NS::unique_ptr<GpuBuffer> CreateGpuBuffer(const GpuBufferDesc& desc) override;
1358bf80f4bSopenharmony_ci    BASE_NS::unique_ptr<GpuBuffer> CreateGpuBuffer(const GpuAccelerationStructureDesc& desc) override;
1368bf80f4bSopenharmony_ci
1378bf80f4bSopenharmony_ci    BASE_NS::unique_ptr<GpuImage> CreateGpuImage(const GpuImageDesc& desc) override;
1388bf80f4bSopenharmony_ci    BASE_NS::unique_ptr<GpuImage> CreateGpuImageView(
1398bf80f4bSopenharmony_ci        const GpuImageDesc& desc, const GpuImagePlatformData& platformData) override;
1408bf80f4bSopenharmony_ci    BASE_NS::unique_ptr<GpuImage> CreateGpuImageView(
1418bf80f4bSopenharmony_ci        const GpuImageDesc& desc, const BackendSpecificImageDesc& platformData) override;
1428bf80f4bSopenharmony_ci    BASE_NS::unique_ptr<GpuImage> CreateGpuImageView(
1438bf80f4bSopenharmony_ci        const GpuImageDesc& desc, const GpuImagePlatformData& platformData, const uintptr_t hwBuffer);
1448bf80f4bSopenharmony_ci    BASE_NS::vector<BASE_NS::unique_ptr<GpuImage>> CreateGpuImageViews(const Swapchain& platformData) override;
1458bf80f4bSopenharmony_ci
1468bf80f4bSopenharmony_ci    BASE_NS::unique_ptr<GpuSampler> CreateGpuSampler(const GpuSamplerDesc& desc) override;
1478bf80f4bSopenharmony_ci
1488bf80f4bSopenharmony_ci    BASE_NS::unique_ptr<RenderFrameSync> CreateRenderFrameSync() override;
1498bf80f4bSopenharmony_ci
1508bf80f4bSopenharmony_ci    BASE_NS::unique_ptr<RenderBackend> CreateRenderBackend(
1518bf80f4bSopenharmony_ci        GpuResourceManager& gpuResourceMgr, const CORE_NS::IParallelTaskQueue::Ptr& queue) override;
1528bf80f4bSopenharmony_ci
1538bf80f4bSopenharmony_ci    BASE_NS::unique_ptr<ShaderModule> CreateShaderModule(const ShaderModuleCreateInfo& data) override;
1548bf80f4bSopenharmony_ci    BASE_NS::unique_ptr<ShaderModule> CreateComputeShaderModule(const ShaderModuleCreateInfo& data) override;
1558bf80f4bSopenharmony_ci    BASE_NS::unique_ptr<GpuShaderProgram> CreateGpuShaderProgram(const GpuShaderProgramCreateData& data) override;
1568bf80f4bSopenharmony_ci    BASE_NS::unique_ptr<GpuComputeProgram> CreateGpuComputeProgram(const GpuComputeProgramCreateData& data) override;
1578bf80f4bSopenharmony_ci
1588bf80f4bSopenharmony_ci    BASE_NS::unique_ptr<NodeContextDescriptorSetManager> CreateNodeContextDescriptorSetManager() override;
1598bf80f4bSopenharmony_ci    BASE_NS::unique_ptr<NodeContextPoolManager> CreateNodeContextPoolManager(
1608bf80f4bSopenharmony_ci        class GpuResourceManager& gpuResourceMgr, const GpuQueue& gpuQueue) override;
1618bf80f4bSopenharmony_ci
1628bf80f4bSopenharmony_ci    BASE_NS::unique_ptr<GraphicsPipelineStateObject> CreateGraphicsPipelineStateObject(
1638bf80f4bSopenharmony_ci        const GpuShaderProgram& gpuProgram, const GraphicsState& graphicsState, const PipelineLayout& pipelineLayout,
1648bf80f4bSopenharmony_ci        const VertexInputDeclarationView& vertexInputDeclaration,
1658bf80f4bSopenharmony_ci        const ShaderSpecializationConstantDataView& specializationConstants,
1668bf80f4bSopenharmony_ci        const BASE_NS::array_view<const DynamicStateEnum> dynamicStates, const RenderPassDesc& renderPassDesc,
1678bf80f4bSopenharmony_ci        const BASE_NS::array_view<const RenderPassSubpassDesc>& renderPassSubpassDescs, const uint32_t subpassIndex,
1688bf80f4bSopenharmony_ci        const LowLevelRenderPassData* renderPassData, const LowLevelPipelineLayoutData* pipelineLayoutData) override;
1698bf80f4bSopenharmony_ci
1708bf80f4bSopenharmony_ci    BASE_NS::unique_ptr<ComputePipelineStateObject> CreateComputePipelineStateObject(
1718bf80f4bSopenharmony_ci        const GpuComputeProgram& gpuProgram, const PipelineLayout& pipelineLayout,
1728bf80f4bSopenharmony_ci        const ShaderSpecializationConstantDataView& specializationConstants,
1738bf80f4bSopenharmony_ci        const LowLevelPipelineLayoutData* pipelineLayoutData) override;
1748bf80f4bSopenharmony_ci
1758bf80f4bSopenharmony_ci    BASE_NS::unique_ptr<GpuSemaphore> CreateGpuSemaphore() override;
1768bf80f4bSopenharmony_ci    BASE_NS::unique_ptr<GpuSemaphore> CreateGpuSemaphoreView(const uint64_t handle) override;
1778bf80f4bSopenharmony_ci
1788bf80f4bSopenharmony_ci    struct FeatureConfigurations {
1798bf80f4bSopenharmony_ci        float minSampleShading { 0.25f };
1808bf80f4bSopenharmony_ci    };
1818bf80f4bSopenharmony_ci    const FeatureConfigurations& GetFeatureConfigurations() const;
1828bf80f4bSopenharmony_ci
1838bf80f4bSopenharmony_ci    struct CommonDeviceExtensions {
1848bf80f4bSopenharmony_ci        bool swapchain { false };
1858bf80f4bSopenharmony_ci
1868bf80f4bSopenharmony_ci        // external_memory and external_memory_capabilities
1878bf80f4bSopenharmony_ci        bool externalMemory { false };
1888bf80f4bSopenharmony_ci        bool getMemoryRequirements2 { false };
1898bf80f4bSopenharmony_ci        bool samplerYcbcrConversion { false };
1908bf80f4bSopenharmony_ci        bool queueFamilyForeign { false };
1918bf80f4bSopenharmony_ci
1928bf80f4bSopenharmony_ci        bool renderPass2 { false };
1938bf80f4bSopenharmony_ci        bool fragmentShadingRate { false };
1948bf80f4bSopenharmony_ci        bool multiView { false };
1958bf80f4bSopenharmony_ci        bool descriptorIndexing { false };
1968bf80f4bSopenharmony_ci    };
1978bf80f4bSopenharmony_ci    const CommonDeviceExtensions& GetCommonDeviceExtensions() const;
1988bf80f4bSopenharmony_ci    const PlatformDeviceExtensions& GetPlatformDeviceExtensions() const;
1998bf80f4bSopenharmony_ci    bool HasDeviceExtension(const BASE_NS::string_view extensionName) const;
2008bf80f4bSopenharmony_ci
2018bf80f4bSopenharmony_ci    const DebugFunctionUtilitiesVk& GetDebugFunctionUtilities() const;
2028bf80f4bSopenharmony_ci    void CreateDebugFunctions();
2038bf80f4bSopenharmony_ci
2048bf80f4bSopenharmony_ci    struct ExtFunctions {
2058bf80f4bSopenharmony_ci        // VK_KHR_sampler_ycbcr_conversion or Vulkan 1.1
2068bf80f4bSopenharmony_ci        PFN_vkCreateSamplerYcbcrConversion vkCreateSamplerYcbcrConversion { nullptr };
2078bf80f4bSopenharmony_ci        PFN_vkDestroySamplerYcbcrConversion vkDestroySamplerYcbcrConversion { nullptr };
2088bf80f4bSopenharmony_ci
2098bf80f4bSopenharmony_ci        // VK_KHR_get_memory_requirements2 or Vulkan 1.1
2108bf80f4bSopenharmony_ci        PFN_vkGetImageMemoryRequirements2 vkGetImageMemoryRequirements2 { nullptr };
2118bf80f4bSopenharmony_ci        // VK_KHR_get_physical_device_properties2 or Vulkan 1.1
2128bf80f4bSopenharmony_ci        PFN_vkGetPhysicalDeviceFeatures2 vkGetPhysicalDeviceFeatures2 { nullptr };
2138bf80f4bSopenharmony_ci        PFN_vkGetPhysicalDeviceProperties2 vkGetPhysicalDeviceProperties2 { nullptr };
2148bf80f4bSopenharmony_ci
2158bf80f4bSopenharmony_ci        // VK_KHR_create_renderpass2 or Vulkan 1.2
2168bf80f4bSopenharmony_ci        PFN_vkCreateRenderPass2KHR vkCreateRenderPass2KHR { nullptr };
2178bf80f4bSopenharmony_ci
2188bf80f4bSopenharmony_ci        // VK_KHR_swapchain
2198bf80f4bSopenharmony_ci        PFN_vkAcquireNextImageKHR vkAcquireNextImageKHR { nullptr };
2208bf80f4bSopenharmony_ci
2218bf80f4bSopenharmony_ci#if (RENDER_VULKAN_FSR_ENABLED == 1)
2228bf80f4bSopenharmony_ci        // VK_KHR_fragment_shading_rate
2238bf80f4bSopenharmony_ci        PFN_vkCmdSetFragmentShadingRateKHR vkCmdSetFragmentShadingRateKHR { nullptr };
2248bf80f4bSopenharmony_ci#endif
2258bf80f4bSopenharmony_ci
2268bf80f4bSopenharmony_ci#if (RENDER_VULKAN_RT_ENABLED == 1)
2278bf80f4bSopenharmony_ci        // VK_KHR_acceleration_structure
2288bf80f4bSopenharmony_ci        PFN_vkGetAccelerationStructureBuildSizesKHR vkGetAccelerationStructureBuildSizesKHR { nullptr };
2298bf80f4bSopenharmony_ci        PFN_vkCmdBuildAccelerationStructuresKHR vkCmdBuildAccelerationStructuresKHR { nullptr };
2308bf80f4bSopenharmony_ci        PFN_vkCreateAccelerationStructureKHR vkCreateAccelerationStructureKHR { nullptr };
2318bf80f4bSopenharmony_ci        PFN_vkDestroyAccelerationStructureKHR vkDestroyAccelerationStructureKHR { nullptr };
2328bf80f4bSopenharmony_ci        PFN_vkGetAccelerationStructureDeviceAddressKHR vkGetAccelerationStructureDeviceAddressKHR { nullptr };
2338bf80f4bSopenharmony_ci#endif
2348bf80f4bSopenharmony_ci    };
2358bf80f4bSopenharmony_ci    const ExtFunctions& GetExtFunctions() const;
2368bf80f4bSopenharmony_ci    void CreateExtFunctions();
2378bf80f4bSopenharmony_ci
2388bf80f4bSopenharmony_ci    const PlatformExtFunctions& GetPlatformExtFunctions() const;
2398bf80f4bSopenharmony_ci    void CreatePlatformExtFunctions();
2408bf80f4bSopenharmony_ci
2418bf80f4bSopenharmony_ciprivate:
2428bf80f4bSopenharmony_ci    BASE_NS::vector<QueueProperties> CheckExternalConfig(const BackendExtraVk* backendConfiguration);
2438bf80f4bSopenharmony_ci    void CreateInstance();
2448bf80f4bSopenharmony_ci    void CreatePhysicalDevice();
2458bf80f4bSopenharmony_ci    void CreateDevice(const BackendExtraVk* backendExtra, const BASE_NS::vector<LowLevelQueueInfo>& availableQueues);
2468bf80f4bSopenharmony_ci    void SortAvailableQueues(const BASE_NS::vector<LowLevelQueueInfo>& availableQueues);
2478bf80f4bSopenharmony_ci
2488bf80f4bSopenharmony_ci    BASE_NS::unique_ptr<PlatformGpuMemoryAllocator> platformGpuMemoryAllocator_;
2498bf80f4bSopenharmony_ci
2508bf80f4bSopenharmony_ci    DevicePlatformDataVk plat_;
2518bf80f4bSopenharmony_ci    bool ownInstanceAndDevice_ { true };
2528bf80f4bSopenharmony_ci    DevicePlatformInternalDataVk platInternal_;
2538bf80f4bSopenharmony_ci
2548bf80f4bSopenharmony_ci    FeatureConfigurations featureConfigurations_;
2558bf80f4bSopenharmony_ci
2568bf80f4bSopenharmony_ci    struct LowLevelGpuQueues {
2578bf80f4bSopenharmony_ci        BASE_NS::vector<LowLevelGpuQueueVk> graphicsQueues;
2588bf80f4bSopenharmony_ci        BASE_NS::vector<LowLevelGpuQueueVk> computeQueues;
2598bf80f4bSopenharmony_ci        BASE_NS::vector<LowLevelGpuQueueVk> transferQueues;
2608bf80f4bSopenharmony_ci
2618bf80f4bSopenharmony_ci        LowLevelGpuQueueVk defaultQueue;
2628bf80f4bSopenharmony_ci    };
2638bf80f4bSopenharmony_ci    LowLevelGpuQueues lowLevelGpuQueues_;
2648bf80f4bSopenharmony_ci
2658bf80f4bSopenharmony_ci    uint32_t gpuQueueCount_ { 0 };
2668bf80f4bSopenharmony_ci
2678bf80f4bSopenharmony_ci    BASE_NS::unordered_map<BASE_NS::string, uint32_t> extensions_;
2688bf80f4bSopenharmony_ci    CommonDeviceExtensions commonDeviceExtensions_;
2698bf80f4bSopenharmony_ci    PlatformDeviceExtensions platformDeviceExtensions_;
2708bf80f4bSopenharmony_ci    BASE_NS::unique_ptr<LowLevelDeviceVk> lowLevelDevice_;
2718bf80f4bSopenharmony_ci
2728bf80f4bSopenharmony_ci    BASE_NS::vector<FormatProperties> formatProperties_;
2738bf80f4bSopenharmony_ci
2748bf80f4bSopenharmony_ci    DebugFunctionUtilitiesVk debugFunctionUtilities_;
2758bf80f4bSopenharmony_ci    ExtFunctions extFunctions_;
2768bf80f4bSopenharmony_ci    PlatformExtFunctions platformExtFunctions_;
2778bf80f4bSopenharmony_ci};
2788bf80f4bSopenharmony_ci
2798bf80f4bSopenharmony_ciBASE_NS::unique_ptr<Device> CreateDeviceVk(RenderContext& renderContext, DeviceCreateInfo const& createInfo);
2808bf80f4bSopenharmony_ci
2818bf80f4bSopenharmony_ci// Wrapper for low level device access
2828bf80f4bSopenharmony_ciclass LowLevelDeviceVk final : public ILowLevelDeviceVk {
2838bf80f4bSopenharmony_cipublic:
2848bf80f4bSopenharmony_ci    explicit LowLevelDeviceVk(DeviceVk& deviceVk);
2858bf80f4bSopenharmony_ci    ~LowLevelDeviceVk() = default;
2868bf80f4bSopenharmony_ci
2878bf80f4bSopenharmony_ci    DeviceBackendType GetBackendType() const override;
2888bf80f4bSopenharmony_ci    const DevicePlatformDataVk& GetPlatformDataVk() const override;
2898bf80f4bSopenharmony_ci
2908bf80f4bSopenharmony_ci    GpuBufferPlatformDataVk GetBuffer(RenderHandle handle) const override;
2918bf80f4bSopenharmony_ci    GpuImagePlatformDataVk GetImage(RenderHandle handle) const override;
2928bf80f4bSopenharmony_ci    GpuSamplerPlatformDataVk GetSampler(RenderHandle handle) const override;
2938bf80f4bSopenharmony_ci
2948bf80f4bSopenharmony_ciprivate:
2958bf80f4bSopenharmony_ci    DeviceVk& deviceVk_;
2968bf80f4bSopenharmony_ci    GpuResourceManager& gpuResourceMgr_;
2978bf80f4bSopenharmony_ci};
2988bf80f4bSopenharmony_ciRENDER_END_NAMESPACE()
2998bf80f4bSopenharmony_ci
3008bf80f4bSopenharmony_ci#endif // VULKAN_DEVICE_VK_H
301