KhronosGroup / GLSL

GLSL Shading Language Specification and Extensions
Other
337 stars 98 forks source link

GLSL_EXT_buffer_reference syntax - Vulkan #156

Open Eichenherz opened 3 years ago

Eichenherz commented 3 years ago

There's a lot of movement towards truly bindless not just descriptor indexing. Buffer references are a feature that's important for not binding buffers ( even images with VK_NVX_image_view_handle: https://www.khronos.org/registry/vulkan/specs/1.2-extensions/man/html/VK_NVX_image_view_handle.html ). However the syntax is quite cumbersome. A C-like syntax would require giving new meaning to type*, having an alignof( type ) operator maybe even sizeof all in the GLSL language/compiler. DX12 doesn't really have device pointers, but it has something that would be great to have in Vk/GLSL too, namely ByteBufferAddress. This works a lot like a C array. So having said this I'd like to request a feature/update/improvement in this regard. Let's make device pointers ~great again~ ! :-) Cheers !

ghost commented 3 years ago

Needs SPIR-V extension for… https://www.khronos.org/registry/OpenGL/extensions/ARB/ARB_bindless_texture.txt Other issues for Vulkan… https://github.com/KhronosGroup/Vulkan-Docs/issues/1474

Eichenherz commented 3 years ago

Yeah, I see the part about textures being bindless. But this is more about buffer_reference syntax. In it current state it is cumbersome and confusing even. It'd be much better if VkDeviceBufferAddress would be "operatable" as ByteBufferAddress from DX12 or like a C pointer: uint64_t myVertexBufferAddress; my_vertex_struct vtx = my_vertex_struct( myVertexBufferAddress + sizeof(my_vertex_struct) someIndex ); or my_vertex_struct pVtx = myVertexBufferAddress; my_vertex_struct vtx = pVtx[ someIndex ];

ghost commented 3 years ago

I'm currently used such… you can do that...

#define RawData uint64_t

layout(buffer_reference, scalar, buffer_reference_align = 1) buffer RawDataByte {
    uint8_t data[];
};

layout(buffer_reference, scalar, buffer_reference_align = 1) buffer RawDataShort {
    uint16_t data[];
};

layout(buffer_reference, scalar, buffer_reference_align = 1) buffer RawDataUint {
    uint32_t data[];
};

uint8_t readUint8(in RawData ptr, in uint byteOffset) 
{
    return RawDataByte(ptr+byteOffset).data[0u];
};

uint16_t readUint16(in RawData ptr, in uint byteOffset) 
{
    return RawDataShort(ptr+byteOffset).data[0u];
};

uint32_t readUint32(in RawData ptr, in uint byteOffset) 
{
    return RawDataUint(ptr+byteOffset).data[0u];
};
Eichenherz commented 3 years ago

Yeah, I found a similar way of doing stuff. At first glance it seemed less manageable. My bad. Anyways would it be possible for true-ish C-like pointers to exist in GLSL ?