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