| // Copyright 2013 The Flutter Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style license that can be | |
| // found in the LICENSE file. | |
| layout(local_size_x_id = 0) in; | |
| layout(std430) buffer; | |
| #include <impeller/prefix_sum.glsl> | |
| #define BLOCK_SIZE 1024 | |
| layout(binding = 0) readonly buffer InputData { | |
| uint count; | |
| uint data[]; | |
| } | |
| input_data; | |
| layout(binding = 1) writeonly buffer OutputData { | |
| uint data[]; | |
| } | |
| output_data; | |
| // Needs to be number of threads per threadgroup. | |
| shared uint memory[BLOCK_SIZE]; | |
| void main() { | |
| uint ident = gl_GlobalInvocationID.x; | |
| uint value = 0; | |
| if (ident < input_data.count) { | |
| value = input_data.data[ident]; | |
| } | |
| if (ident < BLOCK_SIZE) { | |
| memory[ident] = value; | |
| } | |
| barrier(); | |
| ExclusivePrefixSum(ident, memory, BLOCK_SIZE); | |
| if (ident < input_data.count) { | |
| // Convert exclusive to inclusive sum. | |
| output_data.data[ident] = memory[ident] + value; | |
| } | |
| } |