#version 460 #extension GL_EXT_descriptor_heap : require #extension GL_EXT_structured_descriptor_heap : require #extension GL_EXT_scalar_block_layout : require #extension GL_EXT_buffer_reference : require layout(local_size_x = 1) in; layout(buffer_type, scalar) buffer DataBuffer { uint data0; uint data1; }; layout(buffer_type, scalar) readonly buffer ReadOnlyBuffer { uint value; }; layout(buffer_type, scalar) uniform UniformBuffer { uint value; }; layout(buffer_reference, scalar, buffer_reference_align = 4) buffer BufferReference { uint value; }; struct HeapData { uvec2 vector; uint values[2]; }; layout(heap_offset = 0) resourceheap BufferHeap0 { uint count; DataBuffer dataBuffer; ReadOnlyBuffer readOnlyBuffer; UniformBuffer uniformBuffer; BufferReference reference; HeapData data; } bufferHeap0; layout(heap_offset = 0) samplerheap SamplerHeap0 { uint count; } samplerHeap0; void writeValue(out uint value) { value = 1; } void updateValue(inout uint value) { value += 1; } void main() { uint index = gl_GlobalInvocationID.x & 1u; bufferHeap0.count = 3; // Issue #4399: the heap itself is read-only. bufferHeap0.count += 1; ++bufferHeap0.count; bufferHeap0.count--; bufferHeap0.data.vector.xy = uvec2(1); bufferHeap0.data.values[0] = 1; bufferHeap0.data.values[index] = 1; writeValue(bufferHeap0.count); updateValue(bufferHeap0.data.values[index]); samplerHeap0.count = 3; bufferHeap0.dataBuffer = bufferHeap0.dataBuffer; bufferHeap0.reference = bufferHeap0.reference; bufferHeap0.readOnlyBuffer.value = 1; // Buffer access must still honor readonly. bufferHeap0.uniformBuffer.value = 1; // Uniform buffer contents are also read-only. }