KhronosGroup / KhronosGroup/Vulkan-ValidationLayers

GPU-AV / GPU Dump handle GL_EXT_structured_descriptor_heap fully

Open
#12,978 0 comments 0 reactions 1 assignee View on GitHub

@spencer-lunarg is already working on this.

Since Sep 2, 2026.

GPU Dump GPU-AV
Dominant language
C++
Stars
1k
Forks
505
Avg merge
11h 25m
Merged PRs (30d)
229

Description

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);
    }
}

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.