Skip to content

Commit a67dd5c

Browse files
committed
gpuav: Fix error messages
Account for functions added with device address commands
1 parent f7add88 commit a67dd5c

File tree

10 files changed

+127
-97
lines changed

10 files changed

+127
-97
lines changed

layers/error_message/error_strings.cpp

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -220,16 +220,16 @@ std::string string_VkDependencyInfo(const Logger& logger, VkDependencyInfo set_d
220220
return "event was set with " + set.str() + " and is being waited on with " + wait.str();
221221
}
222222

223-
static std::string BuffersFromAddressStr(const vvl::DeviceProxy& validator, VkDeviceAddress address) {
223+
std::string string_BuffersFromAddress(const vvl::DeviceState& device, VkDeviceAddress address) {
224224
std::string buffers_str;
225-
vvl::span<vvl::Buffer* const> buffers = validator.GetBuffersByAddress(address);
225+
vvl::span<vvl::Buffer* const> buffers = device.GetBuffersByAddress(address);
226226
for (vvl::Buffer* const buffer : buffers) {
227227
if (!buffers_str.empty()) {
228228
buffers_str += '\n';
229229
}
230230
buffers_str += indent;
231231
buffers_str += indent;
232-
buffers_str += buffer->Describe(validator);
232+
buffers_str += buffer->Describe(device);
233233
}
234234
return buffers_str;
235235
}
@@ -253,15 +253,15 @@ std::string string_VkAccelerationStructureBuildGeometryInfoKHR(const Logger& log
253253
}
254254

255255
std::string string_VkAccelerationStructureGeometryTrianglesDataKHR(
256-
const vvl::DeviceProxy& validator, const VkAccelerationStructureGeometryTrianglesDataKHR& triangles) {
256+
const vvl::DeviceState& device_state, const VkAccelerationStructureGeometryTrianglesDataKHR& triangles) {
257257
std::string pertains = indent;
258258
pertains += indent;
259259
pertains += "Pertains to the following buffer(s):\n";
260260

261261
std::stringstream ss;
262262
ss << indent << "vertexFormat: " << string_VkFormat(triangles.vertexFormat) << '\n';
263263
ss << indent << "vertexData: 0x" << std::hex << triangles.vertexData.deviceAddress << '\n';
264-
std::string vertex_buffers_list_str = BuffersFromAddressStr(validator, triangles.vertexData.deviceAddress);
264+
std::string vertex_buffers_list_str = string_BuffersFromAddress(device_state, triangles.vertexData.deviceAddress);
265265
if (!vertex_buffers_list_str.empty()) {
266266
std::string vertex_buffers_str = pertains;
267267
vertex_buffers_str += vertex_buffers_list_str;
@@ -272,7 +272,7 @@ std::string string_VkAccelerationStructureGeometryTrianglesDataKHR(
272272
ss << indent << "indexType: " << string_VkIndexType(triangles.indexType) << '\n';
273273
ss << indent << "indexData: " << std::hex << triangles.indexData.deviceAddress << '\n';
274274
if (triangles.indexType != VK_INDEX_TYPE_NONE_KHR) {
275-
std::string index_buffers_list_str = BuffersFromAddressStr(validator, triangles.indexData.deviceAddress);
275+
std::string index_buffers_list_str = string_BuffersFromAddress(device_state, triangles.indexData.deviceAddress);
276276
if (!index_buffers_list_str.empty()) {
277277
std::string index_buffers_str = pertains;
278278
index_buffers_str += index_buffers_list_str;
@@ -281,7 +281,7 @@ std::string string_VkAccelerationStructureGeometryTrianglesDataKHR(
281281
}
282282
ss << indent << "transformData: " << triangles.transformData.deviceAddress << '\n';
283283
if (triangles.transformData.deviceAddress != 0) {
284-
std::string transform_buffers_list_str = BuffersFromAddressStr(validator, triangles.transformData.deviceAddress);
284+
std::string transform_buffers_list_str = string_BuffersFromAddress(device_state, triangles.transformData.deviceAddress);
285285
if (!transform_buffers_list_str.empty()) {
286286
std::string transform_buffers_str = pertains;
287287
transform_buffers_str += transform_buffers_list_str;
@@ -293,7 +293,7 @@ std::string string_VkAccelerationStructureGeometryTrianglesDataKHR(
293293
return ss_str;
294294
}
295295

296-
std::string string_VkAccelerationStructureGeometryAabbsDataKHR(const vvl::DeviceProxy& validator,
296+
std::string string_VkAccelerationStructureGeometryAabbsDataKHR(const vvl::DeviceState& device_state,
297297
const VkAccelerationStructureGeometryAabbsDataKHR aabb) {
298298
std::string pertains = indent;
299299
pertains += indent;
@@ -302,7 +302,7 @@ std::string string_VkAccelerationStructureGeometryAabbsDataKHR(const vvl::Device
302302
std::stringstream ss;
303303
ss << indent << "pNext: " << aabb.pNext << '\n';
304304
ss << indent << "data: 0x" << std::hex << aabb.data.deviceAddress << '\n';
305-
std::string aabb_buffers_list_str = BuffersFromAddressStr(validator, aabb.data.deviceAddress);
305+
std::string aabb_buffers_list_str = string_BuffersFromAddress(device_state, aabb.data.deviceAddress);
306306
if (!aabb_buffers_list_str.empty()) {
307307
std::string data_buffers_str = pertains;
308308
data_buffers_str += aabb_buffers_list_str;

layers/error_message/error_strings.h

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222

2323
class Logger;
2424
namespace vvl {
25-
class DeviceProxy;
25+
class DeviceState;
2626
}
2727

2828
[[maybe_unused]] static std::string string_Attachment(uint32_t attachment) {
@@ -236,10 +236,12 @@ std::string string_VkDependencyInfo(const Logger& logger, VkDependencyInfo set_d
236236
return ss.str();
237237
}
238238

239+
std::string string_BuffersFromAddress(const vvl::DeviceState &device, VkDeviceAddress address);
240+
239241
std::string string_VkAccelerationStructureBuildGeometryInfoKHR(const Logger &logger,
240242
const VkAccelerationStructureBuildGeometryInfoKHR &info);
241243
std::string string_VkAccelerationStructureGeometryTrianglesDataKHR(
242-
const vvl::DeviceProxy &validator, const VkAccelerationStructureGeometryTrianglesDataKHR &triangles);
243-
std::string string_VkAccelerationStructureGeometryAabbsDataKHR(const vvl::DeviceProxy &validator,
244+
const vvl::DeviceState &device_state, const VkAccelerationStructureGeometryTrianglesDataKHR &triangles);
245+
std::string string_VkAccelerationStructureGeometryAabbsDataKHR(const vvl::DeviceState &device_state,
244246
const VkAccelerationStructureGeometryAabbsDataKHR aabb);
245247
std::string string_VkAccelerationStructureBuildRangeInfoKHR(const VkAccelerationStructureBuildRangeInfoKHR &bri);

layers/gpuav/core/gpuav_record.cpp

Lines changed: 7 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -427,8 +427,7 @@ void Validator::PreCallRecordCmdDrawIndirect2KHR(VkCommandBuffer commandBuffer,
427427
auto cb_state = GetWrite<vvl::CommandBuffer>(commandBuffer);
428428

429429
const auto buffer_states = GetBuffersByAddressRange(
430-
VkDeviceAddressRangeKHR{pInfo->addressRange.address, pInfo->addressRange.size},
431-
[](vvl::Buffer* buffer) { return buffer->safe_create_info.usage & VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT; });
430+
VkDeviceAddressRangeKHR{pInfo->addressRange.address, pInfo->addressRange.size}, VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT);
432431
if (buffer_states.empty()) {
433432
return;
434433
}
@@ -450,8 +449,7 @@ void Validator::PreCallRecordCmdDrawIndexedIndirect2KHR(VkCommandBuffer commandB
450449
auto cb_state = GetWrite<vvl::CommandBuffer>(commandBuffer);
451450

452451
const auto buffer_states = GetBuffersByAddressRange(
453-
VkDeviceAddressRangeKHR{pInfo->addressRange.address, pInfo->addressRange.size},
454-
[](vvl::Buffer* buffer) { return buffer->safe_create_info.usage & VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT; });
452+
VkDeviceAddressRangeKHR{pInfo->addressRange.address, pInfo->addressRange.size}, VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT);
455453
if (buffer_states.empty()) {
456454
return;
457455
}
@@ -476,16 +474,13 @@ void Validator::PreCallRecordCmdDrawIndexedIndirect2KHR(VkCommandBuffer commandB
476474
void Validator::PreCallRecordCmdDrawIndirectCount2KHR(VkCommandBuffer commandBuffer, const VkDrawIndirectCount2InfoKHR* pInfo,
477475
const RecordObject& record_obj) {
478476
const auto buffer_states = GetBuffersByAddressRange(
479-
VkDeviceAddressRangeKHR{pInfo->addressRange.address, pInfo->addressRange.size},
480-
[](vvl::Buffer* buffer) { return buffer->safe_create_info.usage & VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT; });
477+
VkDeviceAddressRangeKHR{pInfo->addressRange.address, pInfo->addressRange.size}, VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT);
481478
if (buffer_states.empty()) {
482479
return;
483480
}
484481

485482
// TODO - https://github.com/KhronosGroup/Vulkan-ValidationLayers/issues/11879
486-
const auto count_buffer_states = GetBuffersByAddressRange(pInfo->countAddressRange, [](vvl::Buffer* buffer) {
487-
return buffer->safe_create_info.usage & VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT;
488-
});
483+
const auto count_buffer_states = GetBuffersByAddressRange(pInfo->countAddressRange, VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT);
489484
if (count_buffer_states.empty()) {
490485
return;
491486
}
@@ -660,9 +655,7 @@ void Validator::PreCallRecordCmdDispatchIndirect2KHR(VkCommandBuffer commandBuff
660655
auto& sub_state = SubState(*cb_state);
661656
const LastBound& last_bound = cb_state->GetLastBoundCompute();
662657

663-
const auto buffer_states = GetBuffersByAddressRange(pInfo->addressRange, [](vvl::Buffer* buffer) {
664-
return buffer->safe_create_info.usage & VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT;
665-
});
658+
const auto buffer_states = GetBuffersByAddressRange(pInfo->addressRange, VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT);
666659
if (buffer_states.empty()) {
667660
return;
668661
}
@@ -825,9 +818,8 @@ void Validator::PreCallRecordCmdCopyMemoryToImageKHR(VkCommandBuffer commandBuff
825818
const RecordObject& record_obj) {
826819
for (uint32_t i = 0; i < pCopyMemoryInfo->regionCount; ++i) {
827820
// TODO - https://github.com/KhronosGroup/Vulkan-ValidationLayers/issues/11879
828-
const auto buffer_states = GetBuffersByAddressRange(pCopyMemoryInfo->pRegions[i].addressRange, [](vvl::Buffer* buffer) {
829-
return buffer->safe_create_info.usage & VK_BUFFER_USAGE_TRANSFER_SRC_BIT;
830-
});
821+
const auto buffer_states =
822+
GetBuffersByAddressRange(pCopyMemoryInfo->pRegions[i].addressRange, VK_BUFFER_USAGE_TRANSFER_SRC_BIT);
831823
if (buffer_states.empty()) {
832824
continue;
833825
}

layers/gpuav/instrumentation/vertex_attribute_fetch_oob.cpp

Lines changed: 8 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -188,9 +188,15 @@ void RegisterVertexAttributeFetchOobValidation(Validator& gpuav, CommandBufferSu
188188
case vvl::Func::vkCmdDrawIndexedIndirectCountKHR:
189189
out_vuid_msg = "VUID-vkCmdDrawIndexedIndirectCount-None-02721";
190190
break;
191+
case vvl::Func::vkCmdDrawIndexedIndirectCount2KHR:
192+
out_vuid_msg = "VUID-vkCmdDrawIndexedIndirectCount2KHR-None-02721";
193+
break;
191194
case vvl::Func::vkCmdDrawIndexedIndirect:
192195
out_vuid_msg = "VUID-vkCmdDrawIndexedIndirect-None-02721";
193196
break;
197+
case vvl::Func::vkCmdDrawIndexedIndirect2KHR:
198+
out_vuid_msg = "VUID-vkCmdDrawIndexedIndirect2KHR-None-02721";
199+
break;
194200
case vvl::Func::vkCmdDrawMultiIndexedEXT:
195201
out_vuid_msg = "VUID-vkCmdDrawMultiIndexedEXT-None-02721";
196202
break;
@@ -204,24 +210,10 @@ void RegisterVertexAttributeFetchOobValidation(Validator& gpuav, CommandBufferSu
204210

205211
auto add_vertex_buffer_binding_info =
206212
[&gpuav, error_sub_code](const VertexAttributeFetchLimit& vertex_attribute_fetch_limit, std::string& out) {
207-
out += "Vertex Buffer (";
208-
out += gpuav.FormatHandle(vertex_attribute_fetch_limit.binding_info.Buffer());
209-
out += ") binding info:\n";
210-
out += " - Binding: ";
211-
out += std::to_string(vertex_attribute_fetch_limit.attribute.binding);
212-
out += '\n';
213-
out += " - Offset: ";
214-
out += std::to_string(vertex_attribute_fetch_limit.binding_info.BufferOffset());
215-
out += " bytes\n";
216-
out += " - Effective Size: ";
217-
out += std::to_string(vertex_attribute_fetch_limit.binding_info.effective_size);
218-
out += " bytes\n";
219-
out += " - Vertices Count: ";
213+
out += vertex_attribute_fetch_limit.binding_info.String(*gpuav.device_state);
214+
out += "- Vertices count: ";
220215
out += std::to_string(vertex_attribute_fetch_limit.max_vertex_attributes_count);
221216
out += '\n';
222-
out += " - Stride: ";
223-
out += std::to_string(vertex_attribute_fetch_limit.binding_info.stride);
224-
out += " bytes\n";
225217
if (error_sub_code == glsl::kErrorSubCode_IndexedDraw_OOBInstanceIndex) {
226218
if (vertex_attribute_fetch_limit.instance_rate_divisor != vvl::kNoIndex32) {
227219
out += " - Instance rate divisor: ";

layers/gpuav/validation_cmd/gpuav_draw.cpp

Lines changed: 37 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -973,43 +973,43 @@ void DrawIndexedIndirectIndexBuffer(Validator& gpuav, CommandBufferSubState& cb_
973973
const uint32_t first_index = error_record[kValCmd_ErrorPayloadDword_1];
974974
const uint32_t index_count = error_record[kValCmd_ErrorPayloadDword_2];
975975
const uint32_t highest_accessed_index = first_index + index_count;
976-
const uint32_t index_byte_size = IndexTypeByteSize(index_buffer_binding.index_type);
977-
assert(index_byte_size != 0); // Should never be VK_INDEX_TYPE_NONE_KHR
978-
const uint32_t max_indices_in_buffer = static_cast<uint32_t>(index_buffer_binding.size / index_byte_size);
979-
980-
skip |= gpuav.LogError(
981-
vuid, objlist, loc_with_debug_region,
982-
"Index %" PRIu32 " is not within the bound index buffer. Computed from VkDrawIndexedIndirectCommand[%" PRIu32
983-
"] (.firstIndex = %" PRIu32 ", .indexCount = %" PRIu32
984-
")\n"
985-
986-
"VkDrawIndexedIndirectCommand buffer:\n"
987-
"- Buffer: %s\n"
988-
"- Buffer offset: %" PRIu64
989-
"\n"
990-
991-
"Index buffer binding info:\n"
992-
"- Buffer: %s\n"
993-
"- Index type: %s\n"
994-
"- Binding offset: %" PRIu64
995-
"\n"
996-
"- Binding size: %" PRIu64 " bytes (or %" PRIu32
997-
" %s)\n"
998-
999-
"Supplied buffer parameters in indirect command: offset = %" PRIu64 ", stride = %" PRIu32 " bytes.",
1000-
// OOB index info
1001-
highest_accessed_index, draw_i, first_index, index_count,
1002-
1003-
// Draw parameters buffer
1004-
gpuav.FormatHandle(api_buffer).c_str(), api_offset,
1005-
1006-
// Index buffer binding info
1007-
gpuav.FormatHandle(index_buffer_binding.Buffer()).c_str(), string_VkIndexType(index_buffer_binding.index_type),
1008-
index_buffer_binding.BufferOffset(), index_buffer_binding.size, max_indices_in_buffer,
1009-
string_VkIndexType(index_buffer_binding.index_type),
1010-
1011-
// VkDrawIndexedIndirectCommand info
1012-
api_offset, api_stride);
976+
977+
std::stringstream indirect_buffer_info;
978+
indirect_buffer_info << "VkDrawIndexedIndirectCommand buffer:\n";
979+
if (loc_with_debug_region.function == vvl::Func::vkCmdDrawIndexedIndirect2KHR) {
980+
auto draw_buffer_state = gpuav.Get<vvl::Buffer>(api_buffer);
981+
if (!draw_buffer_state) {
982+
gpuav.InternalError(api_buffer, loc_with_debug_region,
983+
"Could not retrieve buffer state during error logging - most likely a GPU-AV bug.");
984+
return skip;
985+
}
986+
987+
indirect_buffer_info << "- Offset address: 0x" << std::hex << draw_buffer_state->deviceAddress + api_offset
988+
<< '\n';
989+
} else {
990+
indirect_buffer_info << "- Buffer: " << gpuav.FormatHandle(api_buffer) << '\n';
991+
indirect_buffer_info << "- Buffer offset: " << api_offset << '\n';
992+
}
993+
indirect_buffer_info << "- Stride: " << api_stride << '\n';
994+
995+
skip |= gpuav.LogError(vuid, objlist, loc_with_debug_region,
996+
"Index %" PRIu32
997+
" is not within the bound index buffer. Computed from VkDrawIndexedIndirectCommand[%" PRIu32
998+
"] (.firstIndex = %" PRIu32 ", .indexCount = %" PRIu32
999+
")\n"
1000+
1001+
"%s\n"
1002+
1003+
"%s\n",
1004+
1005+
// OOB index info
1006+
highest_accessed_index, draw_i, first_index, index_count,
1007+
1008+
// Draw parameters buffer
1009+
indirect_buffer_info.str().c_str(),
1010+
1011+
// Index buffer binding info
1012+
index_buffer_binding.String(*gpuav.device_state).c_str());
10131013
break;
10141014
}
10151015

0 commit comments

Comments
 (0)