1// Tencent is pleased to support the open source community by making ncnn available. 2// 3// Copyright (C) 2020 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 19struct sfpvec8 { f16vec4 abcd; f16vec4 efgh; }; 20#endif 21#if NCNN_fp16_arithmetic 22#extension GL_EXT_shader_explicit_arithmetic_types_float16: require 23#endif 24 25layout (constant_id = 0) const int axis = 0; 26 27#define shape_constant_id_offset 1 28layout (constant_id = shape_constant_id_offset + 0) const int dims = 0; 29layout (constant_id = shape_constant_id_offset + 1) const int w = 0; 30layout (constant_id = shape_constant_id_offset + 2) const int h = 0; 31layout (constant_id = shape_constant_id_offset + 3) const int c = 0; 32layout (constant_id = shape_constant_id_offset + 4) const int cstep = 0; 33 34layout (constant_id = shape_constant_id_offset + 5) const int outdims = 0; 35layout (constant_id = shape_constant_id_offset + 6) const int outw = 0; 36layout (constant_id = shape_constant_id_offset + 7) const int outh = 0; 37layout (constant_id = shape_constant_id_offset + 8) const int outc = 0; 38layout (constant_id = shape_constant_id_offset + 9) const int outcstep = 0; 39 40#if NCNN_image_shader 41layout (binding = 0) uniform unfp sampler3D bottom_blob_3d; 42layout (binding = 1, imfmtc4) writeonly uniform unfp image3D top_blob_3d; 43#else 44layout (binding = 0) readonly buffer bottom_blob { sfpvec8 bottom_blob_data[]; }; 45layout (binding = 1) writeonly buffer top_blob { sfpvec8 top_blob_data[]; }; 46#endif 47 48layout (push_constant) uniform parameter 49{ 50 int dims; 51 int w; 52 int h; 53 int c; 54 int cstep; 55 56 int outdims; 57 int outw; 58 int outh; 59 int outc; 60 int outcstep; 61 62 int offset; 63} p; 64 65void main() 66{ 67 int gx = int(gl_GlobalInvocationID.x); 68 int gy = int(gl_GlobalInvocationID.y); 69 int gz = int(gl_GlobalInvocationID.z); 70 71 if (gx >= psc(outw) || gy >= psc(outh) || gz >= psc(outc)) 72 return; 73 int positive_axis = axis < 0 ? psc(dims) + axis : axis; 74 75 ivec3 gxyz = ivec3(gx, gy, gz); 76 77 gxyz[psc(dims) - 1 - positive_axis] += p.offset; 78 79#if NCNN_image_shader 80 image3d_cp8(top_blob_3d, ivec3(gx, gy, gz), bottom_blob_3d, gxyz); 81#else 82 const int gi = gz * psc(outcstep) + gy * psc(outw) + gx; 83 84 int v_offset = gxyz.z * psc(cstep) + gxyz.y * psc(w) + gxyz.x; 85 86 buffer_cp8(top_blob_data, gi, bottom_blob_data, v_offset); 87#endif 88} 89