Skip to content

Commit fee7b2b

Browse files
tests: More Descriptor Buffer examples
1 parent 6b13081 commit fee7b2b

File tree

5 files changed

+502
-79
lines changed

5 files changed

+502
-79
lines changed

layers/core_checks/cc_buffer_address.h

Lines changed: 21 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222

2323
#include <array>
2424
#include <functional>
25+
#include <sstream>
2526
#include <string>
2627
#include <string_view>
2728

@@ -75,25 +76,25 @@ class BufferAddressValidation {
7576
[[nodiscard]] bool HasInvalidBuffer(vvl::span<vvl::Buffer* const> buffer_list) const noexcept;
7677
// For every vuid, build an error mentioning every buffer from buffer_list that violates it, then log this error
7778
// using details provided by the other parameters.
78-
[[nodiscard]] bool LogInvalidBuffers(const CoreChecks& checker, vvl::span<vvl::Buffer* const> buffer_list,
79+
[[nodiscard]] bool LogInvalidBuffers(const CoreChecks& validator, vvl::span<vvl::Buffer* const> buffer_list,
7980
const Location& device_address_loc, const LogObjectList& objlist,
8081
VkDeviceAddress device_address) const noexcept;
8182

82-
[[nodiscard]] bool LogErrorsIfNoValidBuffer(const CoreChecks& checker, vvl::span<vvl::Buffer* const> buffer_list,
83+
[[nodiscard]] bool LogErrorsIfNoValidBuffer(const CoreChecks& validator, vvl::span<vvl::Buffer* const> buffer_list,
8384
const Location& device_address_loc, const LogObjectList& objlist,
8485
VkDeviceAddress device_address) const noexcept {
8586
bool skip = false;
8687
if (!HasValidBuffer(buffer_list)) {
87-
skip |= LogInvalidBuffers(checker, buffer_list, device_address_loc, objlist, device_address);
88+
skip |= LogInvalidBuffers(validator, buffer_list, device_address_loc, objlist, device_address);
8889
}
8990
return skip;
9091
}
91-
[[nodiscard]] bool LogErrorsIfInvalidBufferFound(const CoreChecks& checker, vvl::span<vvl::Buffer* const> buffer_list,
92+
[[nodiscard]] bool LogErrorsIfInvalidBufferFound(const CoreChecks& validator, vvl::span<vvl::Buffer* const> buffer_list,
9293
const Location& device_address_loc, const LogObjectList& objlist,
9394
VkDeviceAddress device_address) const noexcept {
9495
bool skip = false;
9596
if (HasInvalidBuffer(buffer_list)) {
96-
skip |= LogInvalidBuffers(checker, buffer_list, device_address_loc, objlist, device_address);
97+
skip |= LogInvalidBuffers(validator, buffer_list, device_address_loc, objlist, device_address);
9798
}
9899
return skip;
99100
}
@@ -175,7 +176,7 @@ bool BufferAddressValidation<ChecksCount>::HasInvalidBuffer(vvl::span<vvl::Buffe
175176
}
176177

177178
template <size_t ChecksCount>
178-
bool BufferAddressValidation<ChecksCount>::LogInvalidBuffers(const CoreChecks& checker, vvl::span<vvl::Buffer* const> buffer_list,
179+
bool BufferAddressValidation<ChecksCount>::LogInvalidBuffers(const CoreChecks& validator, vvl::span<vvl::Buffer* const> buffer_list,
179180
const Location& device_address_loc, const LogObjectList& objlist,
180181
VkDeviceAddress device_address) const noexcept {
181182
std::array<Error, ChecksCount> errors;
@@ -190,9 +191,7 @@ bool BufferAddressValidation<ChecksCount>::LogInvalidBuffers(const CoreChecks& c
190191
}();
191192
error_msg_beginning += "(";
192193
error_msg_beginning += address_string;
193-
error_msg_beginning +=
194-
") has no buffer(s) associated to it such that valid usage passes. "
195-
"At least one buffer associated to this device address must be valid.\n";
194+
error_msg_beginning += ") has no buffer(s) associated that are valid.\n";
196195
}
197196

198197
// For each buffer, and for each violated VUID, build an error message
@@ -223,7 +222,8 @@ bool BufferAddressValidation<ChecksCount>::LogInvalidBuffers(const CoreChecks& c
223222
error_msg += '\n';
224223
}
225224

226-
error_msg += checker.FormatHandle(buffer->Handle());
225+
error_msg += " "; // small indent help to visualize
226+
error_msg += validator.FormatHandle(buffer->Handle());
227227
error_msg += ": ";
228228
error_msg += buffer_error;
229229
}
@@ -236,10 +236,19 @@ bool BufferAddressValidation<ChecksCount>::LogInvalidBuffers(const CoreChecks& c
236236
const auto& vuidAndValidation = vuidsAndValidationFunctions[i];
237237
const auto& error = errors[i];
238238
if (!error.Empty()) {
239-
skip |=
240-
checker.LogError(vuidAndValidation.vuid.data(), error.objlist, device_address_loc, "%s\n", error.error_msg.c_str());
239+
skip |= validator.LogError(vuidAndValidation.vuid.data(), error.objlist, device_address_loc, "%s\n",
240+
error.error_msg.c_str());
241241
}
242242
}
243243

244244
return skip;
245245
}
246+
247+
[[maybe_unused]] static std::string PrintBufferRanges(const CoreChecks& validator, vvl::span<vvl::Buffer* const> buffers) {
248+
std::ostringstream ss;
249+
for (const auto& buffer : buffers) {
250+
ss << " " << validator.FormatHandle(buffer->Handle()) << " : range " << string_range_hex(buffer->DeviceAddressRange())
251+
<< '\n';
252+
}
253+
return ss.str();
254+
}

layers/core_checks/cc_descriptor.cpp

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
#include <sstream>
2424
#include <valarray>
2525

26+
#include "containers/range.h"
2627
#include "core_validation.h"
2728
#include "error_message/error_location.h"
2829
#include "error_message/logging.h"
@@ -2432,15 +2433,18 @@ bool CoreChecks::ValidateCmdSetDescriptorBufferOffsets(const vvl::CommandBuffer
24322433
}
24332434

24342435
if (!valid_binding) {
2436+
const vvl::range<VkDeviceAddress> access_range = {start + offset, start + offset + set_layout_size};
24352437
const char *vuid = is_2 ? "VUID-VkSetDescriptorBufferOffsetsInfoEXT-pOffsets-08063"
24362438
: "VUID-vkCmdSetDescriptorBufferOffsetsEXT-pOffsets-08063";
24372439
const LogObjectList objlist(cb_state.Handle(), set_layout->Handle(), pipeline_layout->Handle());
24382440
skip |=
24392441
LogError(vuid, objlist, loc.dot(Field::pBufferIndices, i),
24402442
"(%" PRIu32 ") points to descriptor buffer at VkDescriptorBufferBindingInfoEXT::address (0x%" PRIxLEAST64
24412443
") and the pOffsets[%" PRIu32 "] (%" PRIu64 ") with a VkDescriptorSetLayout size %" PRIu64
2442-
" is not within any VkBuffer range",
2443-
buffer_index, start, i, offset, set_layout_size);
2444+
" is not within any VkBuffer range.\nThe invalid access is at %s\nThe following are the possible buffer "
2445+
"ranges it could be at:\n%s",
2446+
buffer_index, start, i, offset, set_layout_size, vvl::string_range_hex(access_range).c_str(),
2447+
PrintBufferRanges(*this, buffer_states).c_str());
24442448
}
24452449
}
24462450

@@ -2603,8 +2607,8 @@ bool CoreChecks::PreCallValidateCmdBindDescriptorBuffersEXT(VkCommandBuffer comm
26032607
return true;
26042608
},
26052609
[buffer_usage, i]() {
2606-
return "The following buffers have a usage that does not match pBindingInfos[" + std::to_string(i) +
2607-
"].usage (" + string_VkBufferUsageFlags2(buffer_usage) + "):";
2610+
return "pBindingInfos[" + std::to_string(i) + "].usage is " + string_VkBufferUsageFlags2(buffer_usage) +
2611+
" but none of the following buffers contain it:";
26082612
}},
26092613

26102614
{"VUID-VkDescriptorBufferBindingInfoEXT-usage-08122",

tests/framework/descriptor_helper.cpp

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111
*/
1212

1313
#include "descriptor_helper.h"
14+
#include <vulkan/utility/vk_struct_helper.hpp>
15+
#include "binding.h"
1416

1517
OneOffDescriptorSet::OneOffDescriptorSet(vkt::Device *device, const std::vector<VkDescriptorSetLayoutBinding> &bindings,
1618
VkDescriptorSetLayoutCreateFlags layout_flags, void *layout_pnext,
@@ -196,3 +198,53 @@ void OneOffDescriptorSet::UpdateDescriptorSets() {
196198
}
197199
vk::UpdateDescriptorSets(device_->handle(), descriptor_writes.size(), descriptor_writes.data(), 0, NULL);
198200
}
201+
202+
namespace vkt {
203+
DescriptorGetInfo::DescriptorGetInfo(VkSampler *sampler) {
204+
get_info.type = VK_DESCRIPTOR_TYPE_SAMPLER;
205+
get_info.data.pSampler = sampler;
206+
}
207+
208+
DescriptorGetInfo::DescriptorGetInfo(VkDeviceAddress address) {
209+
get_info.type = VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR;
210+
get_info.data.accelerationStructure = address;
211+
}
212+
213+
DescriptorGetInfo::DescriptorGetInfo(VkDescriptorType type, VkSampler sampler, VkImageView image_view, VkImageLayout image_layout) {
214+
image_info = {sampler, image_view, image_layout};
215+
get_info.type = type;
216+
if (type == VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER) {
217+
get_info.data.pCombinedImageSampler = &image_info;
218+
} else if (type == VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT) {
219+
get_info.data.pInputAttachmentImage = &image_info;
220+
} else if (type == VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE) {
221+
get_info.data.pSampledImage = &image_info;
222+
} else if (type == VK_DESCRIPTOR_TYPE_STORAGE_IMAGE) {
223+
get_info.data.pStorageImage = &image_info;
224+
} else {
225+
assert(false);
226+
}
227+
}
228+
229+
DescriptorGetInfo::DescriptorGetInfo(VkDescriptorType type, VkDeviceAddress address, VkDeviceSize range, VkFormat format) {
230+
address_info = vku::InitStructHelper();
231+
address_info.address = address;
232+
address_info.range = range;
233+
address_info.format = format;
234+
get_info.type = type;
235+
if (type == VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER) {
236+
get_info.data.pUniformTexelBuffer = &address_info;
237+
} else if (type == VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER) {
238+
get_info.data.pStorageTexelBuffer = &address_info;
239+
} else if (type == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER) {
240+
get_info.data.pUniformBuffer = &address_info;
241+
} else if (type == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER) {
242+
get_info.data.pStorageBuffer = &address_info;
243+
} else {
244+
assert(false);
245+
}
246+
}
247+
248+
DescriptorGetInfo::DescriptorGetInfo(VkDescriptorType type, const vkt::Buffer &buffer, VkDeviceSize range, VkFormat format)
249+
: DescriptorGetInfo(type, buffer.Address(), range, format) {}
250+
} // namespace vkt

tests/framework/descriptor_helper.h

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@
1212

1313
#pragma once
1414

15+
#include <vulkan/vulkan_core.h>
16+
#include <vulkan/utility/vk_struct_helper.hpp>
1517
#include "layer_validation_tests.h"
1618

1719
class OneOffDescriptorSet {
@@ -78,4 +80,25 @@ class OneOffDescriptorIndexingSet : public OneOffDescriptorSet {
7880

7981
OneOffDescriptorIndexingSet(vkt::Device *device, const Bindings &bindings, void *allocate_pnext = nullptr,
8082
void *create_pool_pnext = nullptr);
81-
};
83+
};
84+
85+
namespace vkt {
86+
class Buffer;
87+
88+
// VK_EXT_descriptor_buffer
89+
struct DescriptorGetInfo {
90+
explicit DescriptorGetInfo(VkSampler *sampler); // VK_DESCRIPTOR_TYPE_SAMPLER
91+
explicit DescriptorGetInfo(VkDeviceAddress address); // VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR
92+
DescriptorGetInfo(VkDescriptorType type, VkSampler sampler, VkImageView image_view, VkImageLayout image_layout);
93+
DescriptorGetInfo(VkDescriptorType type, VkDeviceAddress address, VkDeviceSize range, VkFormat format = VK_FORMAT_UNDEFINED);
94+
DescriptorGetInfo(VkDescriptorType type, const vkt::Buffer &buffer, VkDeviceSize range, VkFormat format = VK_FORMAT_UNDEFINED);
95+
96+
VkDescriptorGetInfoEXT get_info = vku::InitStructHelper();
97+
VkSampler sampler_handle;
98+
VkDescriptorImageInfo image_info;
99+
VkDescriptorAddressInfoEXT address_info;
100+
101+
operator VkDescriptorGetInfoEXT *() { return &get_info; }
102+
};
103+
104+
} // namespace vkt

0 commit comments

Comments
 (0)