blob: 8682cbdc08ab8824e722746da8cc03d8b08c5a24 [file]
// Copyright (c) 2021-2024 The Khronos Group Inc.
// Copyright (c) 2021-2024 Valve Corporation
// Copyright (c) 2021-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.
// Values used between the GLSL shaders and the GPU-AV logic
// NOTE: This header is included by the instrumentation shaders and glslang doesn't support #pragma once
#ifndef GPU_ERROR_HEADER_H
#define GPU_ERROR_HEADER_H
#include "gpuav_error_codes.h"
#ifdef __cplusplus
namespace gpuav {
namespace glsl {
#endif
// GPU-AV Error record structure:
// ------------------------------
// /---------------------------------
// | Error header
// | - Record size
// | - Shader Id
// | - Instruction Id
// | - Shader stage Id
// | - Shader stage info (3 integers)
// | - Action command index in command buffer
// | - Command resources index
// | - Error group (Id unique to the shader/instrumentation code that wrote the error)
// | - subcode (maps to VUIDs)
// | --------------------------------
// | Error specific parameters
// \---------------------------------
// Error Header offsets:
// ---------------------
// The following are offsets to fields common to all records
// Each record first contains the size of the record in 32-bit words, including
// the size word.
const int kHeaderErrorRecordSizeOffset = 0;
// This is the shader id passed by the layer when the instrumentation pass is
// created.
const int kHeaderShaderIdOffset = 1;
// This is the ordinal position of the instruction within the SPIR-V shader
// which generated the validation error.
const int kHeaderInstructionIdOffset = 2;
// This is the stage which generated the validation error. This word is used
// to determine the contents of the next two words in the record.
const int kHeaderStageIdOffset = 3; // Values come from SpvExecutionModel (See spirv.h):
// Each stage will contain different values in the next set of words of the
// record used to identify which instantiation of the shader generated the
// validation error.
const int kHeaderStageInfoOffset_0 = 4;
const int kHeaderStageInfoOffset_1 = 5;
const int kHeaderStageInfoOffset_2 = 6;
const int kHeaderActionIdOffset = 7;
const int kHeaderCommandResourceIdOffset = 8;
// This identifies the validation error
// We use groups to more easily manage the many int values not conflicting
const int kHeaderErrorGroupOffset = 9;
const int kHeaderErrorSubCodeOffset = 10;
const int kHeaderSize = 11;
// Error specific parameters offsets:
// ----------------------------------
// Descriptor Indexing
// ---
const int kInstDescriptorIndexingDescSetOffset = kHeaderSize;
const int kInstDescriptorIndexingDescBindingOffset = kHeaderSize + 1;
const int kInstDescriptorIndexingDescIndexOffset = kHeaderSize + 2;
const int kInstDescriptorIndexingParamOffset_0 = kHeaderSize + 3;
const int kInstDescriptorIndexingParamOffset_1 = kHeaderSize + 4;
// Descriptor Class
// ---
const int kInstDescriptorClassDescSetOffset = kHeaderSize;
const int kInstDescriptorClassDescBindingOffset = kHeaderSize + 1;
const int kInstDescriptorClassDescIndexOffset = kHeaderSize + 2;
const int kInstDescriptorClassParamOffset_0 = kHeaderSize + 3;
const int kInstDescriptorClassParamOffset_1 = kHeaderSize + 4;
// Buffer device addresses
// ---
// A buffer address unalloc error will output the 64-bit pointer in
// two 32-bit pieces, lower bits first.
const int kInstBuffAddrUnallocDescPtrLoOffset = kHeaderSize;
const int kInstBuffAddrUnallocDescPtrHiOffset = kHeaderSize + 1;
const int kInstBuffAddrAccessByteSizeOffset = kHeaderSize + 2;
const int kInstBuffAddrAccessOpcodeOffset = kHeaderSize + 3;
const int kInstBuffAddrAccessAlignmentOffset = kHeaderSize + 4;
// Ray query
// ---
const int kInstRayQueryParamOffset_0 = kHeaderSize;
// Pre shaders
// ---
const int kPreActionParamOffset_0 = kHeaderSize;
const int kPreActionParamOffset_1 = kHeaderSize + 1;
const int kPreActionParamOffset_2 = kHeaderSize + 2;
const int kPreActionParamOffset_3 = kHeaderSize + 3;
// Sizes/Counts
// -------------------
const int kErrorRecordSize = kHeaderSize + 5;
const int kErrorRecordCounts = 4096; // Maximum number of errors a command buffer can hold. Arbitrary value
const int kErrorBufferByteSize = 4 * kErrorRecordSize * kErrorRecordCounts + 2 * 4; // 2 * 4 bytes to store flags and errors count
#ifdef __cplusplus
} // namespace glsl
#endif
// DebugPrintf
// ---
const int kDebugPrintfOutputBufferDWordsCount = 0;
const int kDebugPrintfOutputBufferData = 1;
#ifdef __cplusplus
} // namespace gpuav
#endif
#endif