f1b411c9e8
This is somewhat awkward to support, but the best effort we can do here is to analyze various Load/Store opcodes and deduce the ideal overall alignment based on this. This is not a 100% perfect solution, but should be correct for any reasonable use case. Also fix various nitpicks with BDA support while I'm at it.
57 lines
1.2 KiB
Plaintext
57 lines
1.2 KiB
Plaintext
#version 450
|
|
#extension GL_ARB_gpu_shader_int64 : require
|
|
#extension GL_EXT_buffer_reference : require
|
|
layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
|
|
|
|
layout(buffer_reference) buffer Node;
|
|
layout(buffer_reference, buffer_reference_align = 16, std430) buffer Node
|
|
{
|
|
layout(offset = 0) int value;
|
|
layout(offset = 16) Node next;
|
|
layout(offset = 32) Node prev;
|
|
};
|
|
|
|
layout(set = 0, binding = 0, std430) restrict buffer LinkedList
|
|
{
|
|
Node head1;
|
|
Node head2;
|
|
} _50;
|
|
|
|
void copy_node(restrict Node dst, restrict Node a, restrict Node b)
|
|
{
|
|
dst.value = a.value + b.value;
|
|
}
|
|
|
|
void overwrite_node(out restrict Node dst, restrict Node src)
|
|
{
|
|
dst = src;
|
|
}
|
|
|
|
void main()
|
|
{
|
|
Node _45;
|
|
if (gl_WorkGroupID.x < 4u)
|
|
{
|
|
_45 = _50.head1;
|
|
}
|
|
else
|
|
{
|
|
_45 = _50.head2;
|
|
}
|
|
restrict Node n = _45;
|
|
Node param = n.next;
|
|
Node param_1 = _50.head1;
|
|
Node param_2 = _50.head2;
|
|
copy_node(param, param_1, param_2);
|
|
Node param_4 = _50.head1;
|
|
Node param_3;
|
|
overwrite_node(param_3, param_4);
|
|
n = param_3;
|
|
int v = _50.head2.value;
|
|
n.value = 20;
|
|
n.value = v * 10;
|
|
uint64_t uptr = uint64_t(_50.head2.next);
|
|
Node unode = Node(uptr);
|
|
}
|
|
|