• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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