1*b7893ccfSSadaf Ebrahimi /* Copyright (c) 2015-2019 The Khronos Group Inc. 2*b7893ccfSSadaf Ebrahimi * Copyright (c) 2015-2019 Valve Corporation 3*b7893ccfSSadaf Ebrahimi * Copyright (c) 2015-2019 LunarG, Inc. 4*b7893ccfSSadaf Ebrahimi * 5*b7893ccfSSadaf Ebrahimi * Licensed under the Apache License, Version 2.0 (the "License"); 6*b7893ccfSSadaf Ebrahimi * you may not use this file except in compliance with the License. 7*b7893ccfSSadaf Ebrahimi * You may obtain a copy of the License at 8*b7893ccfSSadaf Ebrahimi * 9*b7893ccfSSadaf Ebrahimi * http://www.apache.org/licenses/LICENSE-2.0 10*b7893ccfSSadaf Ebrahimi * 11*b7893ccfSSadaf Ebrahimi * Unless required by applicable law or agreed to in writing, software 12*b7893ccfSSadaf Ebrahimi * distributed under the License is distributed on an "AS IS" BASIS, 13*b7893ccfSSadaf Ebrahimi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14*b7893ccfSSadaf Ebrahimi * See the License for the specific language governing permissions and 15*b7893ccfSSadaf Ebrahimi * limitations under the License. 16*b7893ccfSSadaf Ebrahimi * 17*b7893ccfSSadaf Ebrahimi * Author: Camden Stocker <[email protected]> 18*b7893ccfSSadaf Ebrahimi */ 19*b7893ccfSSadaf Ebrahimi 20*b7893ccfSSadaf Ebrahimi #pragma once 21*b7893ccfSSadaf Ebrahimi 22*b7893ccfSSadaf Ebrahimi #include "chassis.h" 23*b7893ccfSSadaf Ebrahimi #include <string> 24*b7893ccfSSadaf Ebrahimi 25*b7893ccfSSadaf Ebrahimi static const uint32_t kMemoryObjectWarningLimit = 250; 26*b7893ccfSSadaf Ebrahimi 27*b7893ccfSSadaf Ebrahimi class BestPractices : public ValidationObject { 28*b7893ccfSSadaf Ebrahimi public: 29*b7893ccfSSadaf Ebrahimi std::string GetAPIVersionName(uint32_t version); 30*b7893ccfSSadaf Ebrahimi 31*b7893ccfSSadaf Ebrahimi bool PreCallValidateCreateInstance(const VkInstanceCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, 32*b7893ccfSSadaf Ebrahimi VkInstance* pInstance); 33*b7893ccfSSadaf Ebrahimi void PreCallRecordCreateInstance(const VkInstanceCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, 34*b7893ccfSSadaf Ebrahimi VkInstance* pInstance); 35*b7893ccfSSadaf Ebrahimi bool PreCallValidateCreateDevice(VkPhysicalDevice physicalDevice, const VkDeviceCreateInfo* pCreateInfo, 36*b7893ccfSSadaf Ebrahimi const VkAllocationCallbacks* pAllocator, VkDevice* pDevice); 37*b7893ccfSSadaf Ebrahimi bool PreCallValidateCreateBuffer(VkDevice device, const VkBufferCreateInfo* pCreateInfo, 38*b7893ccfSSadaf Ebrahimi const VkAllocationCallbacks* pAllocator, VkBuffer* pBuffer); 39*b7893ccfSSadaf Ebrahimi bool PreCallValidateCreateImage(VkDevice device, const VkImageCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, 40*b7893ccfSSadaf Ebrahimi VkImage* pImage); 41*b7893ccfSSadaf Ebrahimi bool PreCallValidateCreateSwapchainKHR(VkDevice device, const VkSwapchainCreateInfoKHR* pCreateInfo, 42*b7893ccfSSadaf Ebrahimi const VkAllocationCallbacks* pAllocator, VkSwapchainKHR* pSwapchain); 43*b7893ccfSSadaf Ebrahimi bool PreCallValidateCreateSharedSwapchainsKHR(VkDevice device, uint32_t swapchainCount, 44*b7893ccfSSadaf Ebrahimi const VkSwapchainCreateInfoKHR* pCreateInfos, 45*b7893ccfSSadaf Ebrahimi const VkAllocationCallbacks* pAllocator, VkSwapchainKHR* pSwapchains); 46*b7893ccfSSadaf Ebrahimi bool PreCallValidateCreateRenderPass(VkDevice device, const VkRenderPassCreateInfo* pCreateInfo, 47*b7893ccfSSadaf Ebrahimi const VkAllocationCallbacks* pAllocator, VkRenderPass* pRenderPass); 48*b7893ccfSSadaf Ebrahimi bool PreCallValidateAllocateMemory(VkDevice device, const VkMemoryAllocateInfo* pAllocateInfo, 49*b7893ccfSSadaf Ebrahimi const VkAllocationCallbacks* pAllocator, VkDeviceMemory* pMemory); 50*b7893ccfSSadaf Ebrahimi void PreCallRecordFreeMemory(VkDevice device, VkDeviceMemory memory, const VkAllocationCallbacks* pAllocator); 51*b7893ccfSSadaf Ebrahimi bool PreCallValidateCreateGraphicsPipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t createInfoCount, 52*b7893ccfSSadaf Ebrahimi const VkGraphicsPipelineCreateInfo* pCreateInfos, 53*b7893ccfSSadaf Ebrahimi const VkAllocationCallbacks* pAllocator, VkPipeline* pPipelines); 54*b7893ccfSSadaf Ebrahimi bool PreCallValidateCreateComputePipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t createInfoCount, 55*b7893ccfSSadaf Ebrahimi const VkComputePipelineCreateInfo* pCreateInfos, 56*b7893ccfSSadaf Ebrahimi const VkAllocationCallbacks* pAllocator, VkPipeline* pPipelines); 57*b7893ccfSSadaf Ebrahimi 58*b7893ccfSSadaf Ebrahimi bool CheckPipelineStageFlags(std::string api_name, const VkPipelineStageFlags flags); 59*b7893ccfSSadaf Ebrahimi bool PreCallValidateQueueSubmit(VkQueue queue, uint32_t submitCount, const VkSubmitInfo* pSubmits, VkFence fence); 60*b7893ccfSSadaf Ebrahimi bool PreCallValidateCmdSetEvent(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask); 61*b7893ccfSSadaf Ebrahimi bool PreCallValidateCmdResetEvent(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask); 62*b7893ccfSSadaf Ebrahimi bool PreCallValidateCmdWaitEvents(VkCommandBuffer commandBuffer, uint32_t eventCount, const VkEvent* pEvents, 63*b7893ccfSSadaf Ebrahimi VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask, 64*b7893ccfSSadaf Ebrahimi uint32_t memoryBarrierCount, const VkMemoryBarrier* pMemoryBarriers, 65*b7893ccfSSadaf Ebrahimi uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier* pBufferMemoryBarriers, 66*b7893ccfSSadaf Ebrahimi uint32_t imageMemoryBarrierCount, const VkImageMemoryBarrier* pImageMemoryBarriers); 67*b7893ccfSSadaf Ebrahimi bool PreCallValidateCmdPipelineBarrier(VkCommandBuffer commandBuffer, VkPipelineStageFlags srcStageMask, 68*b7893ccfSSadaf Ebrahimi VkPipelineStageFlags dstStageMask, VkDependencyFlags dependencyFlags, 69*b7893ccfSSadaf Ebrahimi uint32_t memoryBarrierCount, const VkMemoryBarrier* pMemoryBarriers, 70*b7893ccfSSadaf Ebrahimi uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier* pBufferMemoryBarriers, 71*b7893ccfSSadaf Ebrahimi uint32_t imageMemoryBarrierCount, const VkImageMemoryBarrier* pImageMemoryBarriers); 72*b7893ccfSSadaf Ebrahimi bool PreCallValidateCmdWriteTimestamp(VkCommandBuffer commandBuffer, VkPipelineStageFlagBits pipelineStage, 73*b7893ccfSSadaf Ebrahimi VkQueryPool queryPool, uint32_t query); 74*b7893ccfSSadaf Ebrahimi bool PreCallValidateCmdDraw(VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount, uint32_t firstVertex, 75*b7893ccfSSadaf Ebrahimi uint32_t firstInstance); 76*b7893ccfSSadaf Ebrahimi bool PreCallValidateCmdDrawIndexed(VkCommandBuffer commandBuffer, uint32_t indexCount, uint32_t instanceCount, 77*b7893ccfSSadaf Ebrahimi uint32_t firstIndex, int32_t vertexOffset, uint32_t firstInstance); 78*b7893ccfSSadaf Ebrahimi bool PreCallValidateCmdDrawIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t drawCount, 79*b7893ccfSSadaf Ebrahimi uint32_t stride); 80*b7893ccfSSadaf Ebrahimi bool PreCallValidateCmdDrawIndexedIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, 81*b7893ccfSSadaf Ebrahimi uint32_t drawCount, uint32_t stride); 82*b7893ccfSSadaf Ebrahimi bool PreCallValidateCmdDispatch(VkCommandBuffer commandBuffer, uint32_t groupCountX, uint32_t groupCountY, 83*b7893ccfSSadaf Ebrahimi uint32_t groupCountZ); 84*b7893ccfSSadaf Ebrahimi 85*b7893ccfSSadaf Ebrahimi private: 86*b7893ccfSSadaf Ebrahimi uint32_t instance_api_version; 87*b7893ccfSSadaf Ebrahimi uint32_t device_api_version; 88*b7893ccfSSadaf Ebrahimi 89*b7893ccfSSadaf Ebrahimi uint32_t num_mem_objects; 90*b7893ccfSSadaf Ebrahimi }; 91