[Migrated] MCP: Bindless support
Dieses Issue hat noch niemand übernommen.
- Vorherrschende Sprache
- Rust
- Sterne
- 3.4k
- Forks
- 126
- PR-Merge-Kennzahlen
- Keine gemergten PRs in 30 T.
Beschreibung
Issue automatically imported from old repo: https://github.com/EmbarkStudios/rust-gpu/issues/389
Old labels: mcp: accepted,a: ark
Originally creatd by Jasper-Bekkers on 2021-01-21T10:12:41Z
Let's start off with the simplest hlsl shader I can more or less come up with to do bindless support, which I would like to port to rust-gpu.
Notice that instead of ByteArrayBuffer here, for the full feature one should be able to have (RW)Texture2D and other types as well.
ByteAddressBuffer g_byteAddressBuffer[] : register(t0, space3);
RWByteAddressBuffer g_rwByteAddressBuffer[] : register(u0, space4);
[numthreads(64, 1, 1)]
void main(int threadId: SV_DispatchThreadID)
{
g_rwByteAddressBuffer[0].Store(threadId, g_byteAddressBuffer[0].Load(threadId));
}
Emitted SPIR-V from DXC:
; SPIR-V
; Version: 1.0
; Generator: Google spiregg; 0
; Bound: 30
; Schema: 0
OpCapability Shader
OpCapability RuntimeDescriptorArray
OpExtension "SPV_EXT_descriptor_indexing"
OpMemoryModel Logical GLSL450
OpEntryPoint GLCompute %main "main" %gl_GlobalInvocationID
OpExecutionMode %main LocalSize 64 1 1
OpSource HLSL 660
OpName %type_ByteAddressBuffer "type.ByteAddressBuffer"
OpName %g_byteAddressBuffer "g_byteAddressBuffer"
OpName %type_RWByteAddressBuffer "type.RWByteAddressBuffer"
OpName %g_rwByteAddressBuffer "g_rwByteAddressBuffer"
OpName %main "main"
OpDecorate %gl_GlobalInvocationID BuiltIn GlobalInvocationId
OpDecorate %g_byteAddressBuffer DescriptorSet 3
OpDecorate %g_byteAddressBuffer Binding 0
OpDecorate %g_rwByteAddressBuffer DescriptorSet 4
OpDecorate %g_rwByteAddressBuffer Binding 0
OpDecorate %_runtimearr_uint ArrayStride 4
OpMemberDecorate %type_ByteAddressBuffer 0 Offset 0
OpMemberDecorate %type_ByteAddressBuffer 0 NonWritable
OpDecorate %type_ByteAddressBuffer BufferBlock
OpMemberDecorate %type_RWByteAddressBuffer 0 Offset 0
OpDecorate %type_RWByteAddressBuffer BufferBlock
%int = OpTypeInt 32 1
%int_0 = OpConstant %int 0
%uint = OpTypeInt 32 0
%uint_2 = OpConstant %uint 2
%uint_0 = OpConstant %uint 0
%_runtimearr_uint = OpTypeRuntimeArray %uint
%type_ByteAddressBuffer = OpTypeStruct %_runtimearr_uint
%_runtimearr_type_ByteAddressBuffer = OpTypeRuntimeArray %type_ByteAddressBuffer
%_ptr_Uniform__runtimearr_type_ByteAddressBuffer = OpTypePointer Uniform %_runtimearr_type_ByteAddressBuffer
%type_RWByteAddressBuffer = OpTypeStruct %_runtimearr_uint
%_runtimearr_type_RWByteAddressBuffer = OpTypeRuntimeArray %type_RWByteAddressBuffer
%_ptr_Uniform__runtimearr_type_RWByteAddressBuffer = OpTypePointer Uniform %_runtimearr_type_RWByteAddressBuffer
%v3int = OpTypeVector %int 3
%_ptr_Input_v3int = OpTypePointer Input %v3int
%void = OpTypeVoid
%20 = OpTypeFunction %void
%_ptr_Uniform_uint = OpTypePointer Uniform %uint
%g_byteAddressBuffer = OpVariable %_ptr_Uniform__runtimearr_type_ByteAddressBuffer Uniform
%g_rwByteAddressBuffer = OpVariable %_ptr_Uniform__runtimearr_type_RWByteAddressBuffer Uniform
%gl_GlobalInvocationID = OpVariable %_ptr_Input_v3int Input
%main = OpFunction %void None %20
%22 = OpLabel
%23 = OpLoad %v3int %gl_GlobalInvocationID
%24 = OpCompositeExtract %int %23 0
%25 = OpBitcast %uint %24
%26 = OpShiftRightLogical %uint %25 %uint_2
%27 = OpAccessChain %_ptr_Uniform_uint %g_byteAddressBuffer %int_0 %uint_0 %26
%28 = OpLoad %uint %27
%29 = OpAccessChain %_ptr_Uniform_uint %g_rwByteAddressBuffer %int_0 %uint_0 %26
OpStore %29 %28
OpReturn
OpFunctionEnd
First attempt:
#[allow(unused_attributes)]
#[spirv(gl_compute)]
pub fn main_cs(
#[spirv(descriptor_set = 0, binding = 0)] img: Uniform<&[u32]>,
) {
let img = img.load();
let stuff = &img[0];
}
This seems to emit a OpRuntimeArray but then proceed to do some things wrong. I had even more trouble making the slice mutable (for storing data) since that leads to a bunch of compiler errors down the line around .load not being available etc.
Ideally we would also like to declare the bindless arrays as globals, so it's nicer to create our own wrapper types around Image2d and other (so they can do the indirection through the bindless array).
Beitragsleitfaden
Erste Schritte
- Lies das ganze Issue und danach den Beitragsleitfaden des Projekts.
- Schreib ins Issue, dass du es übernimmst — das erspart doppelte Arbeit.
- Forke das Repository und arbeite in einem Branch.
- Öffne einen Pull Request, der die Issue-Nummer nennt.
Rechercherichtung
Beginne mit dem Vergleich des HLSL/DXC SPIR-V-Beispiels mit dem aktuellen Uniform<&[u32]>-Versuch im Issue. Verfolge, wie Runtime-Arrays, veränderlicher Zugriff und Ressourcenindizierung dargestellt werden, und definiere anschließend die Unterstützung für bindless arrays und globale Wrapper-Typen für die genannten Ressourcenarten. Als abgeschlossen gilt die Arbeit, wenn das Beispiel in die erwartete Struktur aus Runtime-Array und Descriptor-Indizierung kompiliert werden kann.
Vom Indexierungsmodell aus dem Issue-Text verfasst.
Bewertung
- Tech-Stack
- rust
- Bereich
- compilers, computer-graphics
- Issue-Typ
- Feature
- Schwierigkeit
- 5/5
- Geschätzter Aufwand
- Über eine Woche
- Aktivitätsstatus
- Veraltet
- Klarheit
- Größtenteils klar
- Anfängerfreundlichkeit
- 25/100