2017-09-30 07:22:46 +03:00
|
|
|
#version 450 core
|
|
|
|
|
|
|
|
#extension GL_ARB_gpu_shader_int64: enable
|
|
|
|
#extension GL_NV_shader_atomic_int64: enable
|
|
|
|
|
|
|
|
layout(local_size_x = 16, local_size_y = 16) in;
|
|
|
|
|
|
|
|
layout(binding = 0) buffer Buffer
|
|
|
|
{
|
|
|
|
int64_t i64;
|
|
|
|
uint64_t u64;
|
|
|
|
} buf;
|
|
|
|
|
|
|
|
struct Struct
|
|
|
|
{
|
|
|
|
int64_t i64;
|
|
|
|
uint64_t u64;
|
|
|
|
};
|
|
|
|
|
|
|
|
shared Struct s;
|
|
|
|
|
|
|
|
void main()
|
|
|
|
{
|
|
|
|
const int64_t i64c = -24;
|
2018-01-14 03:06:05 +03:00
|
|
|
const uint64_t u64c = 0xF00000000Ful;
|
2017-09-30 07:22:46 +03:00
|
|
|
|
|
|
|
// Test shader storage block
|
|
|
|
int64_t i64 = 0;
|
|
|
|
uint64_t u64 = 0;
|
|
|
|
|
|
|
|
i64 += atomicMin(buf.i64, i64c);
|
|
|
|
u64 += atomicMin(buf.u64, u64c);
|
|
|
|
|
|
|
|
i64 += atomicMax(buf.i64, i64c);
|
|
|
|
u64 += atomicMax(buf.u64, u64c);
|
|
|
|
|
|
|
|
i64 += atomicAnd(buf.i64, i64c);
|
|
|
|
u64 += atomicAnd(buf.u64, u64c);
|
|
|
|
|
|
|
|
i64 += atomicOr(buf.i64, i64c);
|
|
|
|
u64 += atomicOr(buf.u64, u64c);
|
|
|
|
|
|
|
|
i64 += atomicXor(buf.i64, i64c);
|
|
|
|
u64 += atomicXor(buf.u64, u64c);
|
|
|
|
|
|
|
|
i64 += atomicAdd(buf.i64, i64c);
|
|
|
|
i64 += atomicExchange(buf.i64, i64c);
|
|
|
|
i64 += atomicCompSwap(buf.i64, i64c, i64);
|
|
|
|
|
|
|
|
buf.i64 = i64;
|
|
|
|
buf.u64 = u64;
|
|
|
|
|
|
|
|
// Test shared variable
|
|
|
|
i64 = 0;
|
|
|
|
u64 = 0;
|
|
|
|
|
|
|
|
i64 += atomicMin(s.i64, i64c);
|
|
|
|
u64 += atomicMin(s.u64, u64c);
|
|
|
|
|
|
|
|
i64 += atomicMax(s.i64, i64c);
|
|
|
|
u64 += atomicMax(s.u64, u64c);
|
|
|
|
|
|
|
|
i64 += atomicAnd(s.i64, i64c);
|
|
|
|
u64 += atomicAnd(s.u64, u64c);
|
|
|
|
|
|
|
|
i64 += atomicOr(s.i64, i64c);
|
|
|
|
u64 += atomicOr(s.u64, u64c);
|
|
|
|
|
|
|
|
i64 += atomicXor(s.i64, i64c);
|
|
|
|
u64 += atomicXor(s.u64, u64c);
|
|
|
|
|
|
|
|
i64 += atomicAdd(s.i64, i64c);
|
|
|
|
i64 += atomicExchange(s.i64, i64c);
|
|
|
|
i64 += atomicCompSwap(s.i64, i64c, i64);
|
|
|
|
|
|
|
|
s.i64 = i64;
|
|
|
|
s.u64 = u64;
|
|
|
|
}
|
|
|
|
|