1 /*
2 * Texel access utility functions
3 */
4
5 // Broadcasting: compute input texel position from broadcasted output position
map_output_pos_to_input_pos(ivec3 output_pos,ivec4 output_sizes,ivec4 input_sizes)6 ivec3 map_output_pos_to_input_pos(
7 ivec3 output_pos,
8 ivec4 output_sizes,
9 ivec4 input_sizes) {
10 ivec3 input_pos;
11 // HW: use modulo
12 input_pos.xy = output_pos.xy % input_sizes.xy;
13 if (output_sizes.w == input_sizes.w && output_sizes.z != input_sizes.z) {
14 // C: divide by ceil(C/4) to map to input tensor range
15 input_pos.z = output_pos.z / int(ceil(output_sizes.z / 4.0));
16 } else {
17 // N: use modulo. z-range of input is batch * ceil(channel/4)
18 input_pos.z =
19 output_pos.z % (input_sizes.w * int(ceil(input_sizes.z / 4.0)));
20 }
21 return input_pos;
22 }
23
24 // Broadcasting: load texel from an image texture, applying broadcasting
load_texel(ivec3 mapped_pos,ivec4 output_sizes,ivec4 input_sizes,sampler3D uInput)25 vec4 load_texel(
26 ivec3 mapped_pos,
27 ivec4 output_sizes,
28 ivec4 input_sizes,
29 sampler3D uInput) {
30 return (output_sizes.z != input_sizes.z)
31 ? texelFetch(uInput, mapped_pos, 0).xxxx
32 : texelFetch(uInput, mapped_pos, 0);
33 }
34