blob: 00aab16673a5fe4cce84039d36649ce33d98cde0 [file] [log] [blame]
//
// Copyright 2018 The ANGLE Project Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//
// BufferUtils.comp: various utilities such as clear and copy.
//
// The following defines tweak the functionality, and a different shader is built based on these.
//
// - Flags:
// * IsAligned: if true, assumes the workgroup size divides the buffer size, so there is no
// need for bound checking
// - Format:
// * IsFloat
// * IsSint
// * IsUint
// - Function:
// * IsClear: the buffer will be cleared
// * IsCopy: a buffer will be copied to another
//
#version 450 core
layout (local_size_x = 64, local_size_y = 1, local_size_z = 1) in;
#if IsFloat
#define ADD_TYPE_PREFIX(type) type
#define BUFFER_FORMAT rgba32f
#define GVEC4 vec4
#elif IsSint
#define ADD_TYPE_PREFIX(type) i ## type
#define BUFFER_FORMAT rgba32i
#define GVEC4 ivec4
#elif IsUint
#define ADD_TYPE_PREFIX(type) u ## type
#define BUFFER_FORMAT rgba32ui
#define GVEC4 uvec4
#else
#error "Not all formats are accounted for"
#endif
#define BUFFER_WRITE_TYPE ADD_TYPE_PREFIX(imageBuffer)
#define BUFFER_READ_TYPE ADD_TYPE_PREFIX(samplerBuffer)
layout (set = 0, binding = 0, BUFFER_FORMAT) uniform writeonly BUFFER_WRITE_TYPE dest;
#if IsCopy
layout (set = 0, binding = 1) uniform BUFFER_READ_TYPE src;
#endif // IsCopy
layout (push_constant) uniform PushConstants
{
// destOffset: used in all cases
uint destOffset;
// size: used if !IsAligned
uint size;
// srcOffset: used if IsCopy
uint srcOffset;
uint padding;
// clearValue: used if IsClear
GVEC4 clearValue;
} params;
void main()
{
#if !IsAligned
if (gl_GlobalInvocationID.x >= params.size)
return;
#endif // IsAligned
int destIndex = int(params.destOffset.x + gl_GlobalInvocationID.x);
int srcIndex = int(params.srcOffset.x + gl_GlobalInvocationID.x);
#if IsClear
GVEC4 srcValue = params.clearValue;
#elif IsCopy
GVEC4 srcValue = texelFetch(src, srcIndex);
#else
#error "Not all functions are accounted for"
#endif // Function
imageStore(dest, destIndex, srcValue);
}