1 /* 2 * Copyright (C) 2023 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16 #ifndef VULKAN_DEVICE_VK_H 17 #define VULKAN_DEVICE_VK_H 18 19 #include <cstdint> 20 #include <vulkan/vulkan_core.h> 21 22 #include <base/containers/unordered_map.h> 23 #include <base/containers/vector.h> 24 #include <base/util/formats.h> 25 #include <render/device/intf_device.h> 26 #include <render/device/pipeline_state_desc.h> 27 #include <render/namespace.h> 28 #include <render/resource_handle.h> 29 #include <render/vulkan/intf_device_vk.h> 30 31 #include "device/device.h" 32 #include "platform_vk.h" 33 34 RENDER_BEGIN_NAMESPACE() 35 class RenderContext; 36 37 class ComputePipelineStateObject; 38 class GraphicsPipelineStateObject; 39 class GpuAccelerationStructure; 40 class GpuBuffer; 41 class GpuComputeProgram; 42 class GpuImage; 43 class GpuResourceManager; 44 class GpuSampler; 45 class GpuShaderProgram; 46 class LowLevelDeviceVk; 47 class NodeContextDescriptorSetManager; 48 class NodeContextPoolManager; 49 class PlatformGpuMemoryAllocator; 50 class RenderFrameSync; 51 class RenderBackend; 52 class ShaderManager; 53 class Swapchain; 54 class SwapchainVk; 55 struct BackendSpecificImageDesc; 56 struct GpuAccelerationStructureDesc; 57 struct GpuBufferDesc; 58 struct GpuComputeProgramCreateData; 59 struct GpuImageDesc; 60 struct GpuImagePlatformData; 61 struct GpuSamplerDesc; 62 struct GpuShaderProgramCreateData; 63 struct PipelineLayout; 64 struct ShaderModuleCreateInfo; 65 struct SwapchainCreateInfo; 66 struct QueueProperties; 67 68 struct LowLevelQueueInfo { 69 VkQueueFlags queueFlags { 0 }; 70 uint32_t queueFamilyIndex { ~0u }; 71 uint32_t queueCount { 0 }; 72 float priority { 1.0f }; 73 }; 74 75 struct LowLevelGpuQueueVk { 76 VkQueue queue { VK_NULL_HANDLE }; 77 78 LowLevelQueueInfo queueInfo; 79 }; 80 81 struct DevicePlatformInternalDataVk { 82 BASE_NS::vector<BASE_NS::Format> supportedDepthFormats; 83 }; 84 85 struct DebugFunctionUtilitiesVk { 86 PFN_vkSetDebugUtilsObjectNameEXT vkSetDebugUtilsObjectNameEXT { nullptr }; 87 PFN_vkCmdBeginDebugUtilsLabelEXT vkCmdBeginDebugUtilsLabelEXT { nullptr }; 88 PFN_vkCmdEndDebugUtilsLabelEXT vkCmdEndDebugUtilsLabelEXT { nullptr }; 89 90 VkDebugUtilsMessengerEXT debugMessenger { VK_NULL_HANDLE }; 91 VkDebugReportCallbackEXT debugCallback { VK_NULL_HANDLE }; 92 }; 93 94 class DeviceVk final : public Device { 95 public: 96 DeviceVk(RenderContext& renderContext, DeviceCreateInfo const& createInfo); 97 ~DeviceVk() override; 98 99 // From IDevice 100 DeviceBackendType GetBackendType() const override; 101 const DevicePlatformData& GetPlatformData() const override; 102 FormatProperties GetFormatProperties(const BASE_NS::Format format) const override; 103 AccelerationStructureBuildSizes GetAccelerationStructureBuildSizes( 104 const AccelerationStructureBuildGeometryInfo& geometry, 105 BASE_NS::array_view<const AccelerationStructureGeometryTrianglesInfo> triangles, 106 BASE_NS::array_view<const AccelerationStructureGeometryAabbsInfo> aabbs, 107 BASE_NS::array_view<const AccelerationStructureGeometryInstancesInfo> instances) const override; 108 ILowLevelDevice& GetLowLevelDevice() const override; 109 void WaitForIdle() override; 110 111 const DevicePlatformInternalDataVk& GetPlatformInternalDataVk() const; 112 const DevicePlatformDataVk& GetPlatformDataVk() const; 113 114 PlatformGpuMemoryAllocator* GetPlatformGpuMemoryAllocator() override; 115 116 void CreateDeviceSwapchain(const SwapchainCreateInfo& swapchainCreateInfo) override; 117 void DestroyDeviceSwapchain() override; 118 119 void Activate() override; 120 void Deactivate() override; 121 122 bool AllowThreadedProcessing() const override; 123 124 GpuQueue GetValidGpuQueue(const GpuQueue& gpuQueue) const override; 125 uint32_t GetGpuQueueCount() const override; 126 127 void InitializePipelineCache(BASE_NS::array_view<const uint8_t> initialData) override; 128 BASE_NS::vector<uint8_t> GetPipelineCache() const override; 129 130 LowLevelGpuQueueVk GetGpuQueue(const GpuQueue& gpuQueue) const; 131 LowLevelGpuQueueVk GetPresentationGpuQueue() const; 132 BASE_NS::vector<LowLevelGpuQueueVk> GetLowLevelGpuQueues() const; 133 134 BASE_NS::unique_ptr<GpuBuffer> CreateGpuBuffer(const GpuBufferDesc& desc) override; 135 136 BASE_NS::unique_ptr<GpuImage> CreateGpuImage(const GpuImageDesc& desc) override; 137 BASE_NS::unique_ptr<GpuImage> CreateGpuImageView( 138 const GpuImageDesc& desc, const GpuImagePlatformData& platformData) override; 139 BASE_NS::unique_ptr<GpuImage> CreateGpuImageView( 140 const GpuImageDesc& desc, const BackendSpecificImageDesc& platformData) override; 141 BASE_NS::unique_ptr<GpuImage> CreateGpuImageView( 142 const GpuImageDesc& desc, const GpuImagePlatformData& platformData, const uintptr_t hwBuffer); 143 BASE_NS::vector<BASE_NS::unique_ptr<GpuImage>> CreateGpuImageViews(const Swapchain& platformData) override; 144 145 BASE_NS::unique_ptr<GpuSampler> CreateGpuSampler(const GpuSamplerDesc& desc) override; 146 147 BASE_NS::unique_ptr<GpuAccelerationStructure> CreateGpuAccelerationStructure( 148 const GpuAccelerationStructureDesc& desc) override; 149 150 BASE_NS::unique_ptr<RenderFrameSync> CreateRenderFrameSync() override; 151 152 BASE_NS::unique_ptr<RenderBackend> CreateRenderBackend( 153 GpuResourceManager& gpuResourceMgr, const CORE_NS::IParallelTaskQueue::Ptr& queue) override; 154 155 BASE_NS::unique_ptr<ShaderModule> CreateShaderModule(const ShaderModuleCreateInfo& data) override; 156 BASE_NS::unique_ptr<ShaderModule> CreateComputeShaderModule(const ShaderModuleCreateInfo& data) override; 157 BASE_NS::unique_ptr<GpuShaderProgram> CreateGpuShaderProgram(const GpuShaderProgramCreateData& data) override; 158 BASE_NS::unique_ptr<GpuComputeProgram> CreateGpuComputeProgram(const GpuComputeProgramCreateData& data) override; 159 160 BASE_NS::unique_ptr<NodeContextDescriptorSetManager> CreateNodeContextDescriptorSetManager() override; 161 BASE_NS::unique_ptr<NodeContextPoolManager> CreateNodeContextPoolManager( 162 class GpuResourceManager& gpuResourceMgr, const GpuQueue& gpuQueue) override; 163 164 BASE_NS::unique_ptr<GraphicsPipelineStateObject> CreateGraphicsPipelineStateObject( 165 const GpuShaderProgram& gpuProgram, const GraphicsState& graphicsState, const PipelineLayout& pipelineLayout, 166 const VertexInputDeclarationView& vertexInputDeclaration, 167 const ShaderSpecializationConstantDataView& specializationConstants, const DynamicStateFlags dynamicStateFlags, 168 const RenderPassDesc& renderPassDesc, 169 const BASE_NS::array_view<const RenderPassSubpassDesc>& renderPassSubpassDescs, const uint32_t subpassIndex, 170 const LowLevelRenderPassData* renderPassData, const LowLevelPipelineLayoutData* pipelineLayoutData) override; 171 172 BASE_NS::unique_ptr<ComputePipelineStateObject> CreateComputePipelineStateObject( 173 const GpuComputeProgram& gpuProgram, const PipelineLayout& pipelineLayout, 174 const ShaderSpecializationConstantDataView& specializationConstants, 175 const LowLevelPipelineLayoutData* pipelineLayoutData) override; 176 177 struct FeatureConfigurations { 178 float minSampleShading { 0.25f }; 179 }; 180 const FeatureConfigurations& GetFeatureConfigurations() const; 181 182 struct CommonDeviceExtensions { 183 bool swapchain { false }; 184 185 // external_memory and external_memory_capabilities 186 bool externalMemory { false }; 187 bool getMemoryRequirements2 { false }; 188 bool samplerYcbcrConversion { false }; 189 bool queueFamilyForeign { false }; 190 191 bool renderPass2 { false }; 192 }; 193 const CommonDeviceExtensions& GetCommonDeviceExtensions() const; 194 const PlatformDeviceExtensions& GetPlatformDeviceExtensions() const; 195 bool HasDeviceExtension(const BASE_NS::string_view extensionName) const; 196 197 const DebugFunctionUtilitiesVk& GetDebugFunctionUtilities() const; 198 void CreateDebugFunctions(); 199 200 struct ExtFunctions { 201 // VK_KHR_sampler_ycbcr_conversion or Vulkan 1.1 202 PFN_vkCreateSamplerYcbcrConversion vkCreateSamplerYcbcrConversion { nullptr }; 203 PFN_vkDestroySamplerYcbcrConversion vkDestroySamplerYcbcrConversion { nullptr }; 204 205 // VK_KHR_get_memory_requirements2 or Vulkan 1.1 206 PFN_vkGetImageMemoryRequirements2 vkGetImageMemoryRequirements2 { nullptr }; 207 208 // VK_KHR_create_renderpass2 or Vulkan 1.2 209 PFN_vkCreateRenderPass2KHR vkCreateRenderPass2KHR { nullptr }; 210 211 // VK_KHR_swapchain 212 PFN_vkAcquireNextImageKHR vkAcquireNextImageKHR { nullptr }; 213 214 #if (RENDER_VULKAN_RT_ENABLED == 1) 215 // VK_KHR_acceleration_structure 216 PFN_vkGetAccelerationStructureBuildSizesKHR vkGetAccelerationStructureBuildSizesKHR { nullptr }; 217 PFN_vkCmdBuildAccelerationStructuresKHR vkCmdBuildAccelerationStructuresKHR { nullptr }; 218 PFN_vkCreateAccelerationStructureKHR vkCreateAccelerationStructureKHR { nullptr }; 219 PFN_vkDestroyAccelerationStructureKHR vkDestroyAccelerationStructureKHR { nullptr }; 220 PFN_vkGetAccelerationStructureDeviceAddressKHR vkGetAccelerationStructureDeviceAddressKHR { nullptr }; 221 #endif 222 }; 223 const ExtFunctions& GetExtFunctions() const; 224 void CreateExtFunctions(); 225 226 const PlatformExtFunctions& GetPlatformExtFunctions() const; 227 void CreatePlatformExtFunctions(); 228 229 private: 230 BASE_NS::vector<QueueProperties> CheckExternalConfig(const BackendExtraVk* backendConfiguration); 231 void CreateInstanceAndPhysicalDevice(); 232 void CreateDevice(const BackendExtraVk* backendExtra, const BASE_NS::vector<LowLevelQueueInfo>& availableQueues); 233 void SortAvailableQueues(const BASE_NS::vector<LowLevelQueueInfo>& availableQueues); 234 235 BASE_NS::unique_ptr<PlatformGpuMemoryAllocator> platformGpuMemoryAllocator_; 236 237 DevicePlatformDataVk plat_; 238 bool ownInstanceAndDevice_ { true }; 239 DevicePlatformInternalDataVk platInternal_; 240 241 FeatureConfigurations featureConfigurations_; 242 243 struct LowLevelGpuQueues { 244 BASE_NS::vector<LowLevelGpuQueueVk> graphicsQueues; 245 BASE_NS::vector<LowLevelGpuQueueVk> computeQueues; 246 BASE_NS::vector<LowLevelGpuQueueVk> transferQueues; 247 248 LowLevelGpuQueueVk defaultQueue; 249 }; 250 LowLevelGpuQueues lowLevelGpuQueues_; 251 252 uint32_t gpuQueueCount_ { 0 }; 253 254 BASE_NS::unordered_map<BASE_NS::string, uint32_t> extensions_; 255 CommonDeviceExtensions commonDeviceExtensions_; 256 PlatformDeviceExtensions platformDeviceExtensions_; 257 BASE_NS::unique_ptr<LowLevelDeviceVk> lowLevelDevice_; 258 259 BASE_NS::vector<FormatProperties> formatProperties_; 260 261 DebugFunctionUtilitiesVk debugFunctionUtilities_; 262 ExtFunctions extFunctions_; 263 PlatformExtFunctions platformExtFunctions_; 264 }; 265 266 BASE_NS::unique_ptr<Device> CreateDeviceVk(RenderContext& renderContext, DeviceCreateInfo const& createInfo); 267 268 // Wrapper for low level device access 269 class LowLevelDeviceVk final : public ILowLevelDeviceVk { 270 public: 271 explicit LowLevelDeviceVk(DeviceVk& deviceVk); 272 ~LowLevelDeviceVk() = default; 273 274 DeviceBackendType GetBackendType() const override; 275 const DevicePlatformDataVk& GetPlatformDataVk() const override; 276 277 GpuBufferPlatformDataVk GetBuffer(RenderHandle handle) const override; 278 GpuImagePlatformDataVk GetImage(RenderHandle handle) const override; 279 GpuSamplerPlatformDataVk GetSampler(RenderHandle handle) const override; 280 281 private: 282 DeviceVk& deviceVk_; 283 GpuResourceManager& gpuResourceMgr_; 284 }; 285 RENDER_END_NAMESPACE() 286 287 #endif // VULKAN_DEVICE_VK_H 288