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