blob: 8de47ff5e0b54e1ce7b224485fb28cd658d61cb6 [file] [log] [blame]
/* Copyright (c) 2023-2024 The Khronos Group Inc.
* Copyright (c) 2023-2024 Valve Corporation
* Copyright (c) 2023-2024 LunarG, Inc.
*
* 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 <vulkan/vulkan.h>
#include "error_message/error_location.h"
class ValidationStateTracker;
namespace spirv {
struct ResourceInterfaceVariable;
} // namespace spirv
namespace vvl {
struct DrawDispatchVuid;
class DescriptorBinding;
class BufferDescriptor;
class ImageDescriptor;
class ImageSamplerDescriptor;
class TexelDescriptor;
class AccelerationStructureDescriptor;
class SamplerDescriptor;
class CommandBuffer;
class Sampler;
class DescriptorSet;
class DescriptorValidator {
public:
DescriptorValidator(ValidationStateTracker& dev, vvl::CommandBuffer& cb_state, vvl::DescriptorSet& descriptor_set,
uint32_t set_index, VkFramebuffer framebuffer, const Location& loc);
// Used with normal validation where we know which descriptors are accessed.
bool ValidateBindingStatic(const spirv::ResourceInterfaceVariable& binding_info, const vvl::DescriptorBinding& binding) const;
// Used with GPU-AV when we need to run the GPU to know which descriptors are accessed.
// The main reason we can't combine is one function needs to be const and the other is non-const.
bool ValidateBindingDynamic(const spirv::ResourceInterfaceVariable& binding_info, DescriptorBinding& binding,
const uint32_t index);
private:
template <typename T>
bool ValidateDescriptorsStatic(const spirv::ResourceInterfaceVariable& binding_info, const T& binding) const;
template <typename T>
bool ValidateDescriptorsDynamic(const spirv::ResourceInterfaceVariable& binding_info, const T& binding, const uint32_t index);
bool ValidateDescriptor(const spirv::ResourceInterfaceVariable& binding_info, const uint32_t index,
VkDescriptorType descriptor_type, const vvl::BufferDescriptor& descriptor) const;
bool ValidateDescriptor(const spirv::ResourceInterfaceVariable& binding_info, const uint32_t index,
VkDescriptorType descriptor_type, const vvl::ImageDescriptor& descriptor) const;
bool ValidateDescriptor(const spirv::ResourceInterfaceVariable& binding_info, const uint32_t index,
VkDescriptorType descriptor_type, const vvl::ImageSamplerDescriptor& descriptor) const;
bool ValidateDescriptor(const spirv::ResourceInterfaceVariable& binding_info, const uint32_t index,
VkDescriptorType descriptor_type, const vvl::TexelDescriptor& descriptor) const;
bool ValidateDescriptor(const spirv::ResourceInterfaceVariable& binding_info, const uint32_t index,
VkDescriptorType descriptor_type, const vvl::AccelerationStructureDescriptor& descriptor) const;
bool ValidateDescriptor(const spirv::ResourceInterfaceVariable& binding_info, const uint32_t index,
VkDescriptorType descriptor_type, const vvl::SamplerDescriptor& descriptor) const;
// helper for the common parts of ImageSamplerDescriptor and SamplerDescriptor validation
bool ValidateSamplerDescriptor(const spirv::ResourceInterfaceVariable& binding_info, uint32_t index, VkSampler sampler,
bool is_immutable, const vvl::Sampler* sampler_state) const;
std::string DescribeDescriptor(const spirv::ResourceInterfaceVariable& binding_info, uint32_t index) const;
ValidationStateTracker& dev_state;
vvl::CommandBuffer& cb_state;
vvl::DescriptorSet& descriptor_set;
const uint32_t set_index;
const VkFramebuffer framebuffer;
const Location& loc;
const DrawDispatchVuid& vuids;
};
} // namespace vvl