xref: /aosp_15_r20/external/vulkan-validation-layers/layers/best_practices.h (revision b7893ccf7851cd6a48cc5a1e965257d8a5cdcc70)
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