• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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