blob: 7d0bbb422d422e8bba1aa1bba98a8413c33a34a2 [file] [edit]
/* Copyright (c) 2025-2026 The Khronos Group Inc.
* Copyright (c) 2025-2026 Valve Corporation
* Copyright (c) 2025-2026 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 "error_message/logging.h"
#include "generated/error_location_helper.h"
#include "generated/sync_validation_types.h"
class Logger;
namespace syncval {
struct SyncEnvironment;
class CommandBufferContext;
class HazardResult;
class SyncValidator;
LogObjectList BaseObjectList(const SyncEnvironment& env, const CommandBufferContext& cb_context, const VulkanTypedHandle& resource);
// Collection of named values that describe key information associated with an error message.
// This can be useful to filter out messages or for quick inspection as a more structured (but lose)
// representation of the main error message text. The main error message might change relatively
// often due to wording improvements and minor fixes (e.g. punctuation fix), but the associated
// properties will change less frequently and are more suited for automatic processing.
struct ReportProperties {
struct NameValue {
std::string name;
std::string value;
};
std::vector<NameValue> name_values;
void Add(std::string_view property_name, std::string_view value);
void Add(std::string_view property_name, uint64_t value);
std::string FormatExtraPropertiesSection() const;
};
// Customization options to modify the standard form of the synchronization error message.
struct AdditionalMessageInfo {
// These are message-specific properties. They are combined with common message properties.
ReportProperties properties;
// When we need something more complex than vvl::Func
std::string access_initiator;
// Replaces standard "writes to"/"reads" access wording.
// For example, "clears" for a clear operation might be more specific than a write
std::string access_action;
std::string hazard_overview;
std::string brief_description_end_text;
std::string pre_synchronization_text;
std::string message_end_text;
// TODO: remove when the command conversion is finished and clients are notified
// that instead of message_type = SubmitTimeError we will print more specific
// message type (as we do during record time validation).
const char* message_type_override = nullptr;
};
ReportProperties GetErrorMessageProperties(const SyncEnvironment& env, const HazardResult& hazard, vvl::Func command,
const char* message_type, const AdditionalMessageInfo& additional_info);
std::string FormatErrorMessage(const SyncEnvironment& env, const HazardResult& hazard, vvl::Func command,
const std::string& resouce_description, const AdditionalMessageInfo& additional_info);
std::string FormatSyncAccesses(const SyncValidator& validator, const SyncAccessFlags& sync_accesses,
VkQueueFlags allowed_queue_flags, bool format_as_extra_property);
void FormatVideoPictureResouce(const Logger& logger, const VkVideoPictureResourceInfoKHR& video_picture, std::ostringstream& ss);
void FormatVideoQuantizationMap(const Logger& logger, const VkVideoEncodeQuantizationMapInfoKHR& quantization_map,
std::ostringstream& ss);
// Common properties
inline constexpr const char* kPropertyMessageType = "message_type";
inline constexpr const char* kPropertyHazardType = "hazard_type";
inline constexpr const char* kPropertyCommand = "command";
inline constexpr const char* kPropertyPriorCommand = "prior_command";
inline constexpr const char* kPropertyDebugRegion = "debug_region";
inline constexpr const char* kPropertyPriorDebugRegion = "prior_debug_region";
inline constexpr const char* kPropertyAccess = "access";
inline constexpr const char* kPropertyPriorAccess = "prior_access";
inline constexpr const char* kPropertyReadBarriers = "read_barriers";
inline constexpr const char* kPropertyWriteBarriers = "write_barriers";
// Message-specific properties
inline constexpr const char* kPropertyRegionIndex = "region_index";
inline constexpr const char* kPropertyLoadOp = "load_op";
inline constexpr const char* kPropertyStoreOp = "store_op";
inline constexpr const char* kPropertyResolveMode = "resolve_mode";
inline constexpr const char* kPropertyOldLayout = "old_layout";
inline constexpr const char* kPropertyNewLayout = "new_layout";
inline constexpr const char* kPropertyDescriptorType = "descriptor_type";
inline constexpr const char* kPropertyDescriptorBinding = "descriptor_binding";
inline constexpr const char* kPropertyDescriptorArrayElement = "descriptor_array_element";
inline constexpr const char* kPropertyImageLayout = "image_layout";
inline constexpr const char* kPropertyImageAspects = "image_aspects";
inline constexpr const char* kPropertySubmitIndex = "submit_index";
inline constexpr const char* kPropertyBatchIndex = "batch_index";
inline constexpr const char* kPropertyCommandBufferIndex = "command_buffer_index";
inline constexpr const char* kPropertySwapchainIndex = "swapchain_index";
// Debug properties
inline constexpr const char* kPropertySeqNo = "seq_no";
inline constexpr const char* kPropertyResetNo = "reset_no";
inline constexpr const char* kPropertyBatchTag = "batch_tag";
} // namespace syncval