| Karl Schultz | 7b024b4 | 2018-08-30 16:18:18 -0600 | [diff] [blame] | 1 | /* Copyright (c) 2018-2019 The Khronos Group Inc. |
| 2 | * Copyright (c) 2018-2019 Valve Corporation |
| 3 | * Copyright (c) 2018-2019 LunarG, Inc. |
| 4 | * Copyright (C) 2018-2019 Google Inc. |
| 5 | * |
| 6 | * Licensed under the Apache License, Version 2.0 (the "License"); |
| 7 | * you may not use this file except in compliance with the License. |
| 8 | * You may obtain a copy of the License at |
| 9 | * |
| 10 | * http://www.apache.org/licenses/LICENSE-2.0 |
| 11 | * |
| 12 | * Unless required by applicable law or agreed to in writing, software |
| 13 | * distributed under the License is distributed on an "AS IS" BASIS, |
| 14 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| 15 | * See the License for the specific language governing permissions and |
| 16 | * limitations under the License. |
| 17 | * |
| 18 | */ |
| 19 | |
| Tony-LunarG | 0e56472 | 2019-03-19 16:09:14 -0600 | [diff] [blame] | 20 | #include "vk_mem_alloc.h" |
| 21 | |
| Karl Schultz | 7b024b4 | 2018-08-30 16:18:18 -0600 | [diff] [blame] | 22 | #ifndef VULKAN_GPU_VALIDATION_H |
| 23 | #define VULKAN_GPU_VALIDATION_H |
| 24 | |
| Mark Lobodzinski | 2a3ee4a | 2019-03-13 13:11:39 -0600 | [diff] [blame] | 25 | struct GpuDeviceMemoryBlock { |
| 26 | VkBuffer buffer; |
| Tony-LunarG | 0e56472 | 2019-03-19 16:09:14 -0600 | [diff] [blame] | 27 | VmaAllocation allocation; |
| Tony-LunarG | 81efe39 | 2019-03-07 15:43:27 -0700 | [diff] [blame] | 28 | std::unordered_map<uint32_t, const cvdescriptorset::Descriptor *> update_at_submit; |
| Mark Lobodzinski | 2a3ee4a | 2019-03-13 13:11:39 -0600 | [diff] [blame] | 29 | }; |
| 30 | |
| 31 | struct GpuBufferInfo { |
| Tony-LunarG | 1b2e0c3 | 2019-02-07 17:13:27 -0700 | [diff] [blame] | 32 | GpuDeviceMemoryBlock output_mem_block; |
| 33 | GpuDeviceMemoryBlock input_mem_block; |
| Mark Lobodzinski | 2a3ee4a | 2019-03-13 13:11:39 -0600 | [diff] [blame] | 34 | VkDescriptorSet desc_set; |
| 35 | VkDescriptorPool desc_pool; |
| Tony-LunarG | 1b2e0c3 | 2019-02-07 17:13:27 -0700 | [diff] [blame] | 36 | GpuBufferInfo(GpuDeviceMemoryBlock output_mem_block, GpuDeviceMemoryBlock input_mem_block, VkDescriptorSet desc_set, |
| 37 | VkDescriptorPool desc_pool) |
| 38 | : output_mem_block(output_mem_block), input_mem_block(input_mem_block), desc_set(desc_set), desc_pool(desc_pool){}; |
| Mark Lobodzinski | 2a3ee4a | 2019-03-13 13:11:39 -0600 | [diff] [blame] | 39 | }; |
| 40 | |
| Karl Schultz | 7b024b4 | 2018-08-30 16:18:18 -0600 | [diff] [blame] | 41 | // Class to encapsulate Descriptor Set allocation. This manager creates and destroys Descriptor Pools |
| 42 | // as needed to satisfy requests for descriptor sets. |
| 43 | class GpuDescriptorSetManager { |
| 44 | public: |
| Mark Lobodzinski | 3bf82a5 | 2019-03-11 11:49:34 -0600 | [diff] [blame] | 45 | GpuDescriptorSetManager(CoreChecks *dev_data); |
| Mark Lobodzinski | b56bbb9 | 2019-02-18 11:49:59 -0700 | [diff] [blame] | 46 | ~GpuDescriptorSetManager(); |
| Karl Schultz | 7b024b4 | 2018-08-30 16:18:18 -0600 | [diff] [blame] | 47 | |
| Karl Schultz | 7b024b4 | 2018-08-30 16:18:18 -0600 | [diff] [blame] | 48 | VkResult GetDescriptorSets(uint32_t count, VkDescriptorPool *pool, std::vector<VkDescriptorSet> *desc_sets); |
| 49 | void PutBackDescriptorSet(VkDescriptorPool desc_pool, VkDescriptorSet desc_set); |
| 50 | |
| 51 | private: |
| 52 | static const uint32_t kItemsPerChunk = 512; |
| 53 | struct PoolTracker { |
| 54 | uint32_t size; |
| 55 | uint32_t used; |
| 56 | }; |
| 57 | |
| Mark Lobodzinski | 3bf82a5 | 2019-03-11 11:49:34 -0600 | [diff] [blame] | 58 | CoreChecks *dev_data_; |
| Karl Schultz | 7b024b4 | 2018-08-30 16:18:18 -0600 | [diff] [blame] | 59 | std::unordered_map<VkDescriptorPool, struct PoolTracker> desc_pool_map_; |
| 60 | }; |
| 61 | |
| Mark Lobodzinski | 2a3ee4a | 2019-03-13 13:11:39 -0600 | [diff] [blame] | 62 | struct GpuValidationState { |
| 63 | bool aborted; |
| 64 | bool reserve_binding_slot; |
| 65 | VkDescriptorSetLayout debug_desc_layout; |
| 66 | VkDescriptorSetLayout dummy_desc_layout; |
| 67 | uint32_t adjusted_max_desc_sets; |
| 68 | uint32_t desc_set_bind_index; |
| 69 | uint32_t unique_shader_module_id; |
| 70 | std::unordered_map<uint32_t, ShaderTracker> shader_map; |
| Mark Lobodzinski | 2a3ee4a | 2019-03-13 13:11:39 -0600 | [diff] [blame] | 71 | std::unique_ptr<GpuDescriptorSetManager> desc_set_manager; |
| 72 | VkCommandPool barrier_command_pool; |
| 73 | VkCommandBuffer barrier_command_buffer; |
| 74 | std::unordered_map<VkCommandBuffer, std::vector<GpuBufferInfo>> command_buffer_map; // gpu_buffer_list; |
| Tony-LunarG | 0e56472 | 2019-03-19 16:09:14 -0600 | [diff] [blame] | 75 | uint32_t output_buffer_size; |
| 76 | VmaAllocator vmaAllocator; |
| Tony-LunarG | 2ab9ede | 2019-05-10 14:34:31 -0600 | [diff] [blame] | 77 | PFN_vkSetDeviceLoaderData vkSetDeviceLoaderData; |
| Tony-LunarG | 76cdcac | 2019-05-22 16:13:12 -0600 | [diff] [blame] | 78 | GpuValidationState(bool aborted = false, bool reserve_binding_slot = false, uint32_t unique_shader_module_id = 0, |
| 79 | VkCommandPool barrier_command_pool = VK_NULL_HANDLE, VkCommandBuffer barrier_command_buffer = VK_NULL_HANDLE, |
| 80 | VmaAllocator vmaAllocator = {}) |
| Tony-LunarG | 29f48a7 | 2019-04-16 11:53:37 -0600 | [diff] [blame] | 81 | : aborted(aborted), |
| 82 | reserve_binding_slot(reserve_binding_slot), |
| Tony-LunarG | 76cdcac | 2019-05-22 16:13:12 -0600 | [diff] [blame] | 83 | unique_shader_module_id(unique_shader_module_id), |
| Tony-LunarG | 29f48a7 | 2019-04-16 11:53:37 -0600 | [diff] [blame] | 84 | barrier_command_pool(barrier_command_pool), |
| 85 | barrier_command_buffer(barrier_command_buffer), |
| 86 | vmaAllocator(vmaAllocator){}; |
| Mark Lobodzinski | 2a3ee4a | 2019-03-13 13:11:39 -0600 | [diff] [blame] | 87 | |
| 88 | std::vector<GpuBufferInfo> &GetGpuBufferInfo(const VkCommandBuffer command_buffer) { |
| 89 | auto buffer_list = command_buffer_map.find(command_buffer); |
| 90 | if (buffer_list == command_buffer_map.end()) { |
| 91 | std::vector<GpuBufferInfo> new_list{}; |
| 92 | command_buffer_map[command_buffer] = new_list; |
| 93 | return command_buffer_map[command_buffer]; |
| 94 | } |
| 95 | return buffer_list->second; |
| 96 | } |
| 97 | }; |
| 98 | |
| Karl Schultz | 7b024b4 | 2018-08-30 16:18:18 -0600 | [diff] [blame] | 99 | using mutex_t = std::mutex; |
| 100 | using lock_guard_t = std::lock_guard<mutex_t>; |
| 101 | using unique_lock_t = std::unique_lock<mutex_t>; |
| 102 | |
| Karl Schultz | 7b024b4 | 2018-08-30 16:18:18 -0600 | [diff] [blame] | 103 | #endif // VULKAN_GPU_VALIDATION_H |