Most common cases of GL_EXT_structured_descriptor_heap are handled, but wrote some more nasty edge cases in https://gitlab.khronos.org/Tracker/vk-gl-cts/-/work_items/6878 want to ensure work (maybe they just do already 馃槃 )
I wrote these 2, but know they fail on local driver, so saving for later
TEST_F(PositiveDescriptorHeapUntyped, GlslStructuredDirectAccess) {
RETURN_IF_SKIP(InitUntypedDescriptorHeap());
vkt::DescriptorHeap desc_heap(*this);
desc_heap.CreateResourceHeap(heap_props.bufferDescriptorSize + 64);
vkt::Buffer ssbo_a(*m_device, 64, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, vkt::device_address);
desc_heap.WriteBufferDescriptor(ssbo_a, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER);
uint32_t* heap_raw_data = (uint32_t*)(desc_heap.resource_heap_data_ + heap_props.bufferDescriptorSize);
heap_raw_data[0] = 11; // r
heap_raw_data[1] = 5; // Data::s
heap_raw_data[2] = 5; // Data::s
heap_raw_data[3] = 5; // Data::s
heap_raw_data[4] = 5; // Data::s
heap_raw_data[5] = 22; // Data::t
char const* cs_source = R"glsl(
#version 460
#extension GL_EXT_descriptor_heap : require
#extension GL_EXT_structured_descriptor_heap : require
#extension GL_EXT_scalar_block_layout : require
layout(buffer_type, scalar) buffer SSBO_A {
uint x;
uint y;
};
struct Data {
uvec4 s;
uint t;
};
layout(heap_offset = 0) resourceheap BufferHeap0 {
SSBO_A buf_a;
uint r;
Data data;
} bufferHeap;
void main() {
bufferHeap.buf_a.x = bufferHeap.r;
bufferHeap.buf_a.y = bufferHeap.data.t;
}
)glsl";
vkt::HeapComputePipeline pipe(*m_device, cs_source, SPV_ENV_VULKAN_1_2);
m_command_buffer.Begin();
desc_heap.BindResourceHeap(m_command_buffer);
vk::CmdBindPipeline(m_command_buffer, VK_PIPELINE_BIND_POINT_COMPUTE, pipe);
vk::CmdDispatch(m_command_buffer, 1, 1, 1);
m_command_buffer.End();
m_default_queue->SubmitAndWait(m_command_buffer);
if (!IsPlatformMockICD()) {
uint32_t* data = static_cast<uint32_t*>(ssbo_a.Memory().Map());
ASSERT_EQ(data[0], 11);
ASSERT_EQ(data[1], 22);
}
}
TEST_F(PositiveDescriptorHeapUntyped, GlslStructuredDirectAccessOnly) {
SetTargetApiVersion(VK_API_VERSION_1_2);
AddRequiredFeature(vkt::Feature::shaderInt8);
RETURN_IF_SKIP(InitUntypedDescriptorHeap());
vkt::DescriptorHeap desc_heap(*this);
desc_heap.CreateResourceHeap(64);
vkt::Buffer ssbo_a(*m_device, 64, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, vkt::device_address);
desc_heap.WriteBufferDescriptor(ssbo_a, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER);
VkDescriptorSetAndBindingMappingEXT mapping = MakeZeroSetAndBindingMapping(0, 0);
VkShaderDescriptorSetAndBindingMappingInfoEXT mapping_info = vku::InitStructHelper();
mapping_info.mappingCount = 1u;
mapping_info.pMappings = &mapping;
char const* cs_source = R"glsl(
#version 460
#extension GL_EXT_descriptor_heap : require
#extension GL_EXT_structured_descriptor_heap : require
#extension GL_EXT_scalar_block_layout : require
layout(set = 0, binding = 0) buffer SSBO_A {
uint x[16];
};
layout(heap_offset = 16) resourceheap BufferHeap {
uint y[4];
uint z;
} bufferHeap;
void main() {
x[0] = bufferHeap.y[0];
x[1] = bufferHeap.z;
}
)glsl";
vkt::HeapComputePipeline pipe(*m_device, cs_source, SPV_ENV_VULKAN_1_2, &mapping_info);
uint32_t* heap_raw_data = (uint32_t*)(desc_heap.resource_heap_data_);
heap_raw_data[4] = 44;
heap_raw_data[8] = 55;
m_command_buffer.Begin();
desc_heap.BindResourceHeap(m_command_buffer);
vk::CmdBindPipeline(m_command_buffer, VK_PIPELINE_BIND_POINT_COMPUTE, pipe);
vk::CmdDispatch(m_command_buffer, 1, 1, 1);
m_command_buffer.End();
m_default_queue->SubmitAndWait(m_command_buffer);
if (!IsPlatformMockICD()) {
uint32_t* data = static_cast<uint32_t*>(ssbo_a.Memory().Map());
ASSERT_EQ(data[0], 22);
ASSERT_EQ(data[1], 55);
}
}
Most common cases of
GL_EXT_structured_descriptor_heapare handled, but wrote some more nasty edge cases in https://gitlab.khronos.org/Tracker/vk-gl-cts/-/work_items/6878 want to ensure work (maybe they just do already 馃槃 )I wrote these 2, but know they fail on local driver, so saving for later