blob: f7caea4a0ab4c6d65844d61ef8ba5b1696b4dada [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.
#include "gpuav_error_header.h"
#include "gpuav_shaders_constants.h"
layout(set = kDiagCommonDescriptorSet, binding = kBindingDiagErrorBuffer) buffer ErrorBuffer {
uint flags;
uint errors_count;
uint errors_buffer[];
};
layout(set = kDiagCommonDescriptorSet, binding = kBindingDiagActionIndex) readonly buffer ActionIndexBuffer {
uint action_index[];
};
layout(set = kDiagCommonDescriptorSet, binding = kBindingDiagCmdResourceIndex) readonly buffer ResourceIndexBuffer {
uint resource_index[];
};
layout(set = kDiagCommonDescriptorSet, binding = kBindingDiagCmdErrorsCount) buffer CmdErrorsCountBuffer {
uint cmd_errors_count[];
};
bool MaxCmdErrorsCountReached() {
const uint cmd_id = resource_index[0];
const uint cmd_errors_count = atomicAdd(cmd_errors_count[cmd_id], 1);
return cmd_errors_count >= kMaxErrorsPerCmd;
}
void GpuavLogError4(uint error_group, uint error_sub_code, uint param_0, uint param_1, uint param_2, uint param_3) {
if (MaxCmdErrorsCountReached()) return;
uint vo_idx = atomicAdd(errors_count, kErrorRecordSize);
const bool errors_buffer_filled = (vo_idx + kErrorRecordSize) > errors_buffer.length();
if (errors_buffer_filled) return;
errors_buffer[vo_idx + kHeaderErrorRecordSizeOffset] = kErrorRecordSize;
errors_buffer[vo_idx + kHeaderActionIdOffset] = action_index[0];
errors_buffer[vo_idx + kHeaderCommandResourceIdOffset] = resource_index[0];
errors_buffer[vo_idx + kHeaderErrorGroupOffset] = error_group;
errors_buffer[vo_idx + kHeaderErrorSubCodeOffset] = error_sub_code;
errors_buffer[vo_idx + kPreActionParamOffset_0] = param_0;
errors_buffer[vo_idx + kPreActionParamOffset_1] = param_1;
errors_buffer[vo_idx + kPreActionParamOffset_2] = param_2;
errors_buffer[vo_idx + kPreActionParamOffset_3] = param_3;
}
void GpuavLogError2(uint error_group, uint error_sub_code, uint param_0, uint param_1) {
GpuavLogError4(error_group, error_sub_code, param_0, param_1, 0, 0);
}