2022-02-18 12:22:11 +00:00
|
|
|
#version 450
|
|
|
|
#extension GL_EXT_buffer_reference : require
|
|
|
|
#extension GL_EXT_buffer_reference_uvec2 : require
|
|
|
|
#extension GL_GOOGLE_include_directive : require
|
|
|
|
#include "../../../include/shader-debug/debug_channel.h"
|
|
|
|
|
|
|
|
layout(local_size_x_id = 4) in;
|
|
|
|
|
|
|
|
struct Command
|
|
|
|
{
|
|
|
|
uint type;
|
|
|
|
uint src_offset;
|
|
|
|
uint dst_offset;
|
|
|
|
};
|
|
|
|
|
|
|
|
layout(buffer_reference, std430, buffer_reference_align = 4) readonly buffer Commands
|
|
|
|
{
|
|
|
|
Command commands[];
|
|
|
|
};
|
|
|
|
|
|
|
|
layout(buffer_reference, std430, buffer_reference_align = 4) readonly buffer SrcBuffer {
|
|
|
|
uint values[];
|
|
|
|
};
|
|
|
|
|
|
|
|
layout(buffer_reference, std430, buffer_reference_align = 4) writeonly buffer DstBuffer {
|
|
|
|
uint values[];
|
|
|
|
};
|
|
|
|
|
|
|
|
layout(buffer_reference, std430, buffer_reference_align = 4) readonly buffer IndirectCount {
|
|
|
|
uint count;
|
|
|
|
};
|
|
|
|
|
|
|
|
layout(buffer_reference, std430, buffer_reference_align = 4) writeonly buffer IndirectCountWrite {
|
|
|
|
uint count;
|
|
|
|
};
|
|
|
|
|
|
|
|
layout(push_constant) uniform Registers
|
|
|
|
{
|
|
|
|
Commands commands_va;
|
|
|
|
SrcBuffer src_buffer_va;
|
|
|
|
DstBuffer dst_buffer_va;
|
|
|
|
uvec2 indirect_count_va;
|
|
|
|
IndirectCountWrite dst_indirect_count_va;
|
|
|
|
uint src_stride;
|
|
|
|
uint dst_stride;
|
|
|
|
|
|
|
|
// Debug metadata here
|
|
|
|
uint debug_tag;
|
2022-02-18 13:57:42 +00:00
|
|
|
uint implicit_instance;
|
2022-02-18 12:22:11 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
void main()
|
|
|
|
{
|
|
|
|
if (debug_tag != 0u)
|
2022-02-18 13:57:42 +00:00
|
|
|
DEBUG_CHANNEL_INIT_IMPLICIT_INSTANCE(uvec3(debug_tag, gl_WorkGroupID.x, gl_LocalInvocationIndex), implicit_instance);
|
2022-02-18 12:22:11 +00:00
|
|
|
|
|
|
|
Command cmd = commands_va.commands[gl_LocalInvocationIndex];
|
|
|
|
|
|
|
|
uint draw_id = gl_WorkGroupID.x;
|
|
|
|
uint max_draws = gl_NumWorkGroups.x;
|
|
|
|
if (any(notEqual(indirect_count_va, uvec2(0))))
|
|
|
|
{
|
|
|
|
max_draws = min(max_draws, IndirectCount(indirect_count_va).count);
|
|
|
|
if (gl_WorkGroupID.x == 0u)
|
|
|
|
dst_indirect_count_va.count = max_draws;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (debug_tag != 0u && gl_WorkGroupID.x == 0)
|
|
|
|
DEBUG_CHANNEL_MSG_UNIFORM(int(max_draws), int(gl_NumWorkGroups.x));
|
|
|
|
|
|
|
|
if (draw_id < max_draws)
|
|
|
|
{
|
|
|
|
uint src_offset = src_stride * draw_id + cmd.src_offset;
|
|
|
|
uint dst_offset = dst_stride * draw_id + cmd.dst_offset;
|
|
|
|
|
|
|
|
uint src_value = src_buffer_va.values[src_offset];
|
|
|
|
|
|
|
|
if (debug_tag != 0u)
|
|
|
|
DEBUG_CHANNEL_MSG(cmd.type, dst_offset, src_offset, src_value);
|
|
|
|
|
|
|
|
dst_buffer_va.values[dst_offset] = src_value;
|
|
|
|
}
|
|
|
|
}
|