1// Tencent is pleased to support the open source community by making ncnn available. 2// 3// Copyright (C) 2018 THL A29 Limited, a Tencent company. All rights reserved. 4// 5// Licensed under the BSD 3-Clause License (the "License"); you may not use this file except 6// in compliance with the License. You may obtain a copy of the License at 7// 8// https://opensource.org/licenses/BSD-3-Clause 9// 10// Unless required by applicable law or agreed to in writing, software distributed 11// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR 12// CONDITIONS OF ANY KIND, either express or implied. See the License for the 13// specific language governing permissions and limitations under the License. 14 15#version 450 16 17#if NCNN_fp16_storage 18#extension GL_EXT_shader_16bit_storage: require 19#endif 20#if NCNN_fp16_arithmetic 21#extension GL_EXT_shader_explicit_arithmetic_types_float16: require 22#endif 23 24layout (constant_id = 0) const int op_type = 0; 25 26#define shape_constant_id_offset 1 27layout (constant_id = shape_constant_id_offset + 0) const int dims = 0; 28layout (constant_id = shape_constant_id_offset + 1) const int w = 0; 29layout (constant_id = shape_constant_id_offset + 2) const int h = 0; 30layout (constant_id = shape_constant_id_offset + 3) const int c = 0; 31layout (constant_id = shape_constant_id_offset + 4) const int cstep = 0; 32 33#if NCNN_image_shader 34layout (binding = 0) uniform unfp sampler3D bottom_blob_3d; 35layout (binding = 1, imfmtc1) writeonly uniform unfp image3D top_blob_3d; 36#else 37layout (binding = 0) buffer bottom_top_blob { sfp bottom_top_blob_data[]; }; 38#endif 39 40layout (push_constant) uniform parameter 41{ 42 int dims; 43 int w; 44 int h; 45 int c; 46 int cstep; 47} p; 48 49void main() 50{ 51 int gx = int(gl_GlobalInvocationID.x); 52 int gy = int(gl_GlobalInvocationID.y); 53 int gz = int(gl_GlobalInvocationID.z); 54 55 if (gx >= psc(w) || gy >= psc(h) || gz >= psc(c)) 56 return; 57 58#if NCNN_image_shader 59 afp v = image3d_ld1(bottom_blob_3d, ivec3(gx, gy, gz)); 60#else 61 const int gi = gz * psc(cstep) + gy * psc(w) + gx; 62 63 afp v = buffer_ld1(bottom_top_blob_data, gi); 64#endif 65 66 afp res; 67 68 if (op_type == 0) res = abs(v); 69 if (op_type == 1) res = -v; 70 if (op_type == 2) res = floor(v); 71 if (op_type == 3) res = ceil(v); 72 if (op_type == 4) res = v * v; 73 if (op_type == 5) res = sqrt(v); 74 if (op_type == 6) res = inversesqrt(v); 75 if (op_type == 7) res = exp(v); 76 if (op_type == 8) res = log(v); 77 if (op_type == 9) res = sin(v); 78 if (op_type == 10) res = cos(v); 79 if (op_type == 11) res = tan(v); 80 if (op_type == 12) res = asin(v); 81 if (op_type == 13) res = acos(v); 82 if (op_type == 14) res = atan(v); 83 if (op_type == 15) res = afp(1.f) / v; 84 if (op_type == 16) res = tanh(v); 85 86#if NCNN_image_shader 87 image3d_st1(top_blob_3d, ivec3(gx, gy, gz), res); 88#else 89 buffer_st1(bottom_top_blob_data, gi, res); 90#endif 91} 92