Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 9 additions & 9 deletions layers/error_message/error_strings.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -220,16 +220,16 @@ std::string string_VkDependencyInfo(const Logger& logger, VkDependencyInfo set_d
return "event was set with " + set.str() + " and is being waited on with " + wait.str();
}

static std::string BuffersFromAddressStr(const vvl::DeviceProxy& validator, VkDeviceAddress address) {
std::string string_BuffersFromAddress(const vvl::DeviceState& device, VkDeviceAddress address) {
std::string buffers_str;
vvl::span<vvl::Buffer* const> buffers = validator.GetBuffersByAddress(address);
vvl::span<vvl::Buffer* const> buffers = device.GetBuffersByAddress(address);
for (vvl::Buffer* const buffer : buffers) {
if (!buffers_str.empty()) {
buffers_str += '\n';
}
buffers_str += indent;
buffers_str += indent;
buffers_str += buffer->Describe(validator);
buffers_str += buffer->Describe(device);
}
return buffers_str;
}
Expand All @@ -253,15 +253,15 @@ std::string string_VkAccelerationStructureBuildGeometryInfoKHR(const Logger& log
}

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

std::stringstream ss;
ss << indent << "vertexFormat: " << string_VkFormat(triangles.vertexFormat) << '\n';
ss << indent << "vertexData: 0x" << std::hex << triangles.vertexData.deviceAddress << '\n';
std::string vertex_buffers_list_str = BuffersFromAddressStr(validator, triangles.vertexData.deviceAddress);
std::string vertex_buffers_list_str = string_BuffersFromAddress(device_state, triangles.vertexData.deviceAddress);
if (!vertex_buffers_list_str.empty()) {
std::string vertex_buffers_str = pertains;
vertex_buffers_str += vertex_buffers_list_str;
Expand All @@ -272,7 +272,7 @@ std::string string_VkAccelerationStructureGeometryTrianglesDataKHR(
ss << indent << "indexType: " << string_VkIndexType(triangles.indexType) << '\n';
ss << indent << "indexData: " << std::hex << triangles.indexData.deviceAddress << '\n';
if (triangles.indexType != VK_INDEX_TYPE_NONE_KHR) {
std::string index_buffers_list_str = BuffersFromAddressStr(validator, triangles.indexData.deviceAddress);
std::string index_buffers_list_str = string_BuffersFromAddress(device_state, triangles.indexData.deviceAddress);
if (!index_buffers_list_str.empty()) {
std::string index_buffers_str = pertains;
index_buffers_str += index_buffers_list_str;
Expand All @@ -281,7 +281,7 @@ std::string string_VkAccelerationStructureGeometryTrianglesDataKHR(
}
ss << indent << "transformData: " << triangles.transformData.deviceAddress << '\n';
if (triangles.transformData.deviceAddress != 0) {
std::string transform_buffers_list_str = BuffersFromAddressStr(validator, triangles.transformData.deviceAddress);
std::string transform_buffers_list_str = string_BuffersFromAddress(device_state, triangles.transformData.deviceAddress);
if (!transform_buffers_list_str.empty()) {
std::string transform_buffers_str = pertains;
transform_buffers_str += transform_buffers_list_str;
Expand All @@ -293,7 +293,7 @@ std::string string_VkAccelerationStructureGeometryTrianglesDataKHR(
return ss_str;
}

std::string string_VkAccelerationStructureGeometryAabbsDataKHR(const vvl::DeviceProxy& validator,
std::string string_VkAccelerationStructureGeometryAabbsDataKHR(const vvl::DeviceState& device_state,
const VkAccelerationStructureGeometryAabbsDataKHR aabb) {
std::string pertains = indent;
pertains += indent;
Expand All @@ -302,7 +302,7 @@ std::string string_VkAccelerationStructureGeometryAabbsDataKHR(const vvl::Device
std::stringstream ss;
ss << indent << "pNext: " << aabb.pNext << '\n';
ss << indent << "data: 0x" << std::hex << aabb.data.deviceAddress << '\n';
std::string aabb_buffers_list_str = BuffersFromAddressStr(validator, aabb.data.deviceAddress);
std::string aabb_buffers_list_str = string_BuffersFromAddress(device_state, aabb.data.deviceAddress);
if (!aabb_buffers_list_str.empty()) {
std::string data_buffers_str = pertains;
data_buffers_str += aabb_buffers_list_str;
Expand Down
8 changes: 5 additions & 3 deletions layers/error_message/error_strings.h
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@

class Logger;
namespace vvl {
class DeviceProxy;
class DeviceState;
}

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

std::string string_BuffersFromAddress(const vvl::DeviceState &device, VkDeviceAddress address);

std::string string_VkAccelerationStructureBuildGeometryInfoKHR(const Logger &logger,
const VkAccelerationStructureBuildGeometryInfoKHR &info);
std::string string_VkAccelerationStructureGeometryTrianglesDataKHR(
const vvl::DeviceProxy &validator, const VkAccelerationStructureGeometryTrianglesDataKHR &triangles);
std::string string_VkAccelerationStructureGeometryAabbsDataKHR(const vvl::DeviceProxy &validator,
const vvl::DeviceState &device_state, const VkAccelerationStructureGeometryTrianglesDataKHR &triangles);
std::string string_VkAccelerationStructureGeometryAabbsDataKHR(const vvl::DeviceState &device_state,
const VkAccelerationStructureGeometryAabbsDataKHR aabb);
std::string string_VkAccelerationStructureBuildRangeInfoKHR(const VkAccelerationStructureBuildRangeInfoKHR &bri);
2 changes: 1 addition & 1 deletion layers/gpuav/core/gpuav.h
Original file line number Diff line number Diff line change
Expand Up @@ -308,7 +308,7 @@ class Validator : public GpuShaderInstrumentor {
std::string instrumented_shader_cache_path_{};

// Make sure we call the right versions of any timeline semaphore functions.
bool timeline_khr_{false};
bool timeline_khr_ = false;

public:
vko::GpuResourcesManager gpu_resources_manager_;
Expand Down
162 changes: 80 additions & 82 deletions layers/gpuav/core/gpuav_record.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -426,76 +426,74 @@ void Validator::PreCallRecordCmdDrawIndirect2KHR(VkCommandBuffer commandBuffer,
const RecordObject& record_obj) {
auto cb_state = GetWrite<vvl::CommandBuffer>(commandBuffer);

const auto buffer_states = GetBuffersByAddress(pInfo->addressRange.address);
for (const auto buffer_state : buffer_states) {
if ((buffer_state->create_info.usage & VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT) == 0) {
continue;
}
const VkBuffer buffer = buffer_state->VkHandle();
const VkDeviceSize offset = pInfo->addressRange.address - buffer_state->deviceAddress;
const uint32_t draw_count = pInfo->drawCount;
auto& sub_state = SubState(*cb_state);

const LastBound& last_bound = cb_state->GetLastBoundGraphics();
valcmd::FirstInstance<VkDrawIndirectCommand>(*this, sub_state, record_obj.location, last_bound, buffer, offset, draw_count,
VK_NULL_HANDLE, 0);
PreCallActionCommand(*this, sub_state, last_bound, record_obj.location);
const auto buffer_states = GetBuffersByAddressRange(
VkDeviceAddressRangeKHR{pInfo->addressRange.address, pInfo->addressRange.size}, VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT);
if (buffer_states.empty()) {
return;
}

const VkBuffer buffer = buffer_states[0]->VkHandle();
const VkDeviceSize offset = pInfo->addressRange.address - buffer_states[0]->deviceAddress;
const uint32_t draw_count = pInfo->drawCount;
auto& sub_state = SubState(*cb_state);

const LastBound& last_bound = cb_state->GetLastBoundGraphics();
valcmd::FirstInstance<VkDrawIndirectCommand>(*this, sub_state, record_obj.location, last_bound, buffer, offset, draw_count,
VK_NULL_HANDLE, 0);
PreCallActionCommand(*this, sub_state, last_bound, record_obj.location);
return;
}

void Validator::PreCallRecordCmdDrawIndexedIndirect2KHR(VkCommandBuffer commandBuffer, const VkDrawIndirect2InfoKHR* pInfo,
const RecordObject& record_obj) {
auto cb_state = GetWrite<vvl::CommandBuffer>(commandBuffer);

const auto buffer_states = GetBuffersByAddress(pInfo->addressRange.address);
for (const auto buffer_state : buffer_states) {
if ((buffer_state->create_info.usage & VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT) == 0) {
continue;
}
const VkBuffer buffer = buffer_state->VkHandle();
const VkDeviceSize offset = pInfo->addressRange.address - buffer_state->deviceAddress;
const uint32_t draw_count = pInfo->drawCount;
const uint32_t stride = static_cast<uint32_t>(pInfo->addressRange.stride);
const auto buffer_states = GetBuffersByAddressRange(
VkDeviceAddressRangeKHR{pInfo->addressRange.address, pInfo->addressRange.size}, VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT);
if (buffer_states.empty()) {
return;
}

auto& sub_state = SubState(*cb_state);
const VkBuffer buffer = buffer_states[0]->VkHandle();
const VkDeviceSize offset = pInfo->addressRange.address - buffer_states[0]->deviceAddress;
const uint32_t draw_count = pInfo->drawCount;
const uint32_t stride = static_cast<uint32_t>(pInfo->addressRange.stride);

const LastBound& last_bound = cb_state->GetLastBoundGraphics();
valcmd::DrawIndexedIndirectIndexBuffer(*this, sub_state, record_obj.location, last_bound, buffer, offset, stride,
draw_count, VK_NULL_HANDLE, 0,
"VUID-VkDrawIndexedIndirectCommand-robustBufferAccess2-08798");
auto& sub_state = SubState(*cb_state);

valcmd::FirstInstance<VkDrawIndexedIndirectCommand>(*this, sub_state, record_obj.location, last_bound, buffer, offset,
draw_count, VK_NULL_HANDLE, 0);
PreCallActionCommand(*this, sub_state, last_bound, record_obj.location);
return;
}
const LastBound& last_bound = cb_state->GetLastBoundGraphics();
valcmd::DrawIndexedIndirectIndexBuffer(*this, sub_state, record_obj.location, last_bound, buffer, offset, stride, draw_count,
VK_NULL_HANDLE, 0, "VUID-VkDrawIndexedIndirectCommand-robustBufferAccess2-08798");

valcmd::FirstInstance<VkDrawIndexedIndirectCommand>(*this, sub_state, record_obj.location, last_bound, buffer, offset,
draw_count, VK_NULL_HANDLE, 0);
PreCallActionCommand(*this, sub_state, last_bound, record_obj.location);
return;
}

void Validator::PreCallRecordCmdDrawIndirectCount2KHR(VkCommandBuffer commandBuffer, const VkDrawIndirectCount2InfoKHR* pInfo,
const RecordObject& record_obj) {
const auto buffer_states = GetBuffersByAddress(pInfo->addressRange.address);
const auto buffer_states = GetBuffersByAddressRange(
VkDeviceAddressRangeKHR{pInfo->addressRange.address, pInfo->addressRange.size}, VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT);
if (buffer_states.empty()) {
return;
}

// TODO - https://github.com/KhronosGroup/Vulkan-ValidationLayers/issues/11879
const auto count_buffer_states = GetBuffersByAddress(pInfo->countAddressRange.address);
for (const auto buffer_state : buffer_states) {
if ((buffer_state->create_info.usage & VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT) == 0) {
continue;
}
for (const auto count_buffer_state : count_buffer_states) {
if ((count_buffer_state->create_info.usage & VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT) == 0) {
continue;
}
const VkBuffer buffer = buffer_state->VkHandle();
const VkDeviceSize offset = pInfo->addressRange.address - buffer_state->deviceAddress;
const VkBuffer countBuffer = count_buffer_state->VkHandle();
const VkDeviceSize countBufferOffset = pInfo->countAddressRange.address - count_buffer_state->deviceAddress;
const uint32_t maxDrawCount = pInfo->maxDrawCount;
const uint32_t stride = static_cast<uint32_t>(pInfo->addressRange.stride);
PreCallRecordCmdDrawIndirectCount(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride,
record_obj);
return;
}
const auto count_buffer_states = GetBuffersByAddressRange(pInfo->countAddressRange, VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT);
if (count_buffer_states.empty()) {
return;
}

const VkBuffer buffer = buffer_states[0]->VkHandle();
const VkDeviceSize offset = pInfo->addressRange.address - buffer_states[0]->deviceAddress;
const VkBuffer countBuffer = count_buffer_states[0]->VkHandle();
const VkDeviceSize countBufferOffset = pInfo->countAddressRange.address - count_buffer_states[0]->deviceAddress;
const uint32_t maxDrawCount = pInfo->maxDrawCount;
const uint32_t stride = static_cast<uint32_t>(pInfo->addressRange.stride);
PreCallRecordCmdDrawIndirectCount(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride,
record_obj);
return;
}

void Validator::PreCallRecordCmdDrawIndexedIndirectCount2KHR(VkCommandBuffer commandBuffer,
Expand Down Expand Up @@ -656,16 +654,16 @@ void Validator::PreCallRecordCmdDispatchIndirect2KHR(VkCommandBuffer commandBuff

auto& sub_state = SubState(*cb_state);
const LastBound& last_bound = cb_state->GetLastBoundCompute();
const auto buffer_states = GetBuffersByAddress(pInfo->addressRange.address);
for (const auto buffer_state : buffer_states) {
if ((buffer_state->create_info.usage & VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT) == 0) {
continue;
}
const VkBuffer buffer = buffer_state->VkHandle();
const VkDeviceSize offset = pInfo->addressRange.address - buffer_state->deviceAddress;
valcmd::DispatchIndirect(*this, record_obj.location, sub_state, last_bound, buffer, offset);
PreCallActionCommand(*this, sub_state, last_bound, record_obj.location);

const auto buffer_states = GetBuffersByAddressRange(pInfo->addressRange, VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT);
if (buffer_states.empty()) {
return;
}

const VkBuffer buffer = buffer_states[0]->VkHandle();
const VkDeviceSize offset = pInfo->addressRange.address - buffer_states[0]->deviceAddress;
valcmd::DispatchIndirect(*this, record_obj.location, sub_state, last_bound, buffer, offset);
PreCallActionCommand(*this, sub_state, last_bound, record_obj.location);
}

void Validator::PreCallRecordCmdDispatchBase(VkCommandBuffer commandBuffer, uint32_t baseGroupX, uint32_t baseGroupY,
Expand Down Expand Up @@ -820,27 +818,27 @@ void Validator::PreCallRecordCmdCopyMemoryToImageKHR(VkCommandBuffer commandBuff
const RecordObject& record_obj) {
for (uint32_t i = 0; i < pCopyMemoryInfo->regionCount; ++i) {
// TODO - https://github.com/KhronosGroup/Vulkan-ValidationLayers/issues/11879
const auto buffer_states = GetBuffersByAddress(pCopyMemoryInfo->pRegions[i].addressRange.address);
for (const auto buffer_state : buffer_states) {
if (buffer_state->create_info.usage & VK_BUFFER_USAGE_TRANSFER_SRC_BIT) {
VkBufferImageCopy2 region = vku::InitStructHelper();
region.bufferOffset = pCopyMemoryInfo->pRegions[i].addressRange.address - buffer_state->deviceAddress;
region.bufferImageHeight = pCopyMemoryInfo->pRegions[i].addressImageHeight;
region.imageSubresource = pCopyMemoryInfo->pRegions[i].imageSubresource;
region.imageOffset = pCopyMemoryInfo->pRegions[i].imageOffset;
region.imageExtent = pCopyMemoryInfo->pRegions[i].imageExtent;

VkCopyBufferToImageInfo2 copy_buffer_to_image_info = vku::InitStructHelper();
copy_buffer_to_image_info.srcBuffer = buffer_state->VkHandle();
copy_buffer_to_image_info.dstImage = pCopyMemoryInfo->image;
copy_buffer_to_image_info.dstImageLayout = pCopyMemoryInfo->pRegions[i].imageLayout;
copy_buffer_to_image_info.regionCount = 1u;
copy_buffer_to_image_info.pRegions = &region;
valcmd::CopyBufferToImage(*this, record_obj.location, SubState(*GetWrite<vvl::CommandBuffer>(commandBuffer)),
&copy_buffer_to_image_info);
break;
}
const auto buffer_states =
GetBuffersByAddressRange(pCopyMemoryInfo->pRegions[i].addressRange, VK_BUFFER_USAGE_TRANSFER_SRC_BIT);
if (buffer_states.empty()) {
continue;
}

VkBufferImageCopy2 region = vku::InitStructHelper();
region.bufferOffset = pCopyMemoryInfo->pRegions[i].addressRange.address - buffer_states[0]->deviceAddress;
region.bufferImageHeight = pCopyMemoryInfo->pRegions[i].addressImageHeight;
region.imageSubresource = pCopyMemoryInfo->pRegions[i].imageSubresource;
region.imageOffset = pCopyMemoryInfo->pRegions[i].imageOffset;
region.imageExtent = pCopyMemoryInfo->pRegions[i].imageExtent;

VkCopyBufferToImageInfo2 copy_buffer_to_image_info = vku::InitStructHelper();
copy_buffer_to_image_info.srcBuffer = buffer_states[0]->VkHandle();
copy_buffer_to_image_info.dstImage = pCopyMemoryInfo->image;
copy_buffer_to_image_info.dstImageLayout = pCopyMemoryInfo->pRegions[i].imageLayout;
copy_buffer_to_image_info.regionCount = 1u;
copy_buffer_to_image_info.pRegions = &region;
valcmd::CopyBufferToImage(*this, record_obj.location, SubState(*GetWrite<vvl::CommandBuffer>(commandBuffer)),
&copy_buffer_to_image_info);
}
}

Expand Down
Loading
Loading