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