/* Copyright (c) 2015-2024 The Khronos Group Inc. * Copyright (c) 2015-2024 Valve Corporation * Copyright (c) 2015-2024 LunarG, Inc. * Modifications Copyright (C) 2020-2022 Advanced Micro Devices, Inc. All rights reserved. * Modifications Copyright (C) 2022 RasterGrid Kft. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #pragma once #include "generated/chassis.h" #include "state_tracker/state_tracker.h" #include "state_tracker/cmd_buffer_state.h" #include <string> #include <deque> #include <chrono> static const uint32_t kMemoryObjectWarningLimit = …; // Maximum number of instanced vertex buffers which should be used static const uint32_t kMaxInstancedVertexBuffers = …; // Recommended allocation size for vkAllocateMemory static const VkDeviceSize kMinDeviceAllocationSize = …; // If a buffer or image is allocated and it consumes an entire VkDeviceMemory, it should at least be this large. // This is slightly different from minDeviceAllocationSize since the 256K buffer can still be sensibly // suballocated from. If we consume an entire allocation with one image or buffer, it should at least be for a // very large allocation. static const VkDeviceSize kMinDedicatedAllocationSize = …; // AMD best practices // Note: These are initial ball park numbers for good performance // We expect to adjust them as we get more data on layer usage // Avoid small command buffers static const uint32_t kMinRecommendedCommandBufferSizeAMD = …; // Avoid small secondary command buffers static const uint32_t kMinRecommendedDrawsInSecondaryCommandBufferSizeAMD = …; // Idealy, only 1 fence per frame, so 3 for triple buffering static const uint32_t kMaxRecommendedFenceObjectsSizeAMD = …; // Avoid excessive sempahores static const uint32_t kMaxRecommendedSemaphoreObjectsSizeAMD = …; // Avoid excessive barriers static const uint32_t kMaxRecommendedBarriersSizeAMD = …; // Avoid excessive pipelines static const uint32_t kMaxRecommendedNumberOfPSOAMD = …; // Unlikely that the user needs all the dynamic states enabled at the same time, and they encur a cost static const uint32_t kDynamicStatesWarningLimitAMD = …; // Too many dynamic descriptor sets can cause a large pipeline layout static const uint32_t kPipelineLayoutSizeWarningLimitAMD = …; // Check that the user is submitting excessivly to a queue static const uint32_t kNumberOfSubmissionWarningLimitAMD = …; // Check that there is enough work per vertex stream change static const float kVertexStreamToDrawRatioWarningLimitAMD = …; // Check that there is enough work per pipeline change static const float kDrawsPerPipelineRatioWarningLimitAMD = …; // Check that command buffers are used with an appropriatly sized pool static const float kCmdBufferToCmdPoolRatioWarningLimitAMD = …; // Size for fast descriptor reads on modern NVIDIA devices static const uint32_t kPipelineLayoutFastDescriptorSpaceNVIDIA = …; // Time threshold for flagging allocations that could have been reused static const auto kAllocateMemoryReuseTimeThresholdNVIDIA = …; // Number of switches in tessellation, gemetry, and mesh shader state before signalling a message static const uint32_t kNumBindPipelineTessGeometryMeshSwitchesThresholdNVIDIA = …; // Ratio where the Z-cull direction starts being considered balanced static const int kZcullDirectionBalanceRatioNVIDIA = …; // Maximum number of custom clear colors static const size_t kMaxRecommendedNumberOfClearColorsNVIDIA = …; // How many small indexed drawcalls in a command buffer before a warning is thrown static const uint32_t kMaxSmallIndexedDrawcalls = …; // How many indices make a small indexed drawcall static const int kSmallIndexedDrawcallIndices = …; // Minimum number of vertices/indices to take into account when doing depth pre-pass checks for Arm Mali GPUs static const int kDepthPrePassMinDrawCountArm = …; // Minimum, number of draw calls in order to trigger depth pre-pass warnings for Arm Mali GPUs static const int kDepthPrePassNumDrawCallsArm = …; // Maximum sample count for full throughput on Mali GPUs static const VkSampleCountFlagBits kMaxEfficientSamplesArm = …; // On Arm Mali architectures, it's generally best to align work group dimensions to 4. static const uint32_t kThreadGroupDispatchCountAlignmentArm = …; // Maximum number of threads which can efficiently be part of a compute workgroup when using thread group barriers. static const uint32_t kMaxEfficientWorkGroupThreadCountArm = …; // Minimum number of vertices/indices a draw needs to have before considering it in depth prepass warnings on PowerVR static const int kDepthPrePassMinDrawCountIMG = …; // Minimum, number of draw calls matching the above criteria before triggerring a depth prepass warning on PowerVR static const int kDepthPrePassNumDrawCallsIMG = …; // Maximum sample count on PowerVR before showing a warning static const VkSampleCountFlagBits kMaxEfficientSamplesImg = …; enum class DeprecationReason { … }; struct DeprecationData { … }; DeprecationData GetDeprecatedData(vvl::Extension extension); std::string GetSpecialUse(vvl::Extension extension); struct SpecialUseVUIDs { … }; BPVendorFlagBits; BPVendorFlags; enum CALL_STATE { … }; enum IMAGE_SUBRESOURCE_USAGE_BP { … }; enum class ZcullDirection { … }; namespace bp_state { class PhysicalDevice; class CommandBuffer; class Swapchain; class Image; class DescriptorPool; class Pipeline; } // namespace bp_state VALSTATETRACK_DERIVED_STATE_OBJECT(…) VALSTATETRACK_DERIVED_STATE_OBJECT(…) VALSTATETRACK_DERIVED_STATE_OBJECT(…) VALSTATETRACK_DERIVED_STATE_OBJECT(…) VALSTATETRACK_DERIVED_STATE_OBJECT(…) VALSTATETRACK_DERIVED_STATE_OBJECT(…) class BestPractices : public ValidationStateTracker { … };