| // |
| // 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); |
| } |