Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Tetragramm
GitHub Repository: Tetragramm/opencv
Path: blob/master/modules/dnn/src/vkcom/shader/prior_box.comp
16349 views
#version 450
#define LOCAL_SZ_X 256

layout(push_constant) uniform pushBlock {
      int global_size;
      int nthreads;
      float step_x;
      float step_y;
      int offset_x_size;
      int width_size;
      int layer_w;
      int image_h;
      int image_w;
      int clip;
      int variance_off;
} p;

layout(binding = 0) readonly buffer Input0{
    float offset_x[];
};
layout(binding = 1) readonly buffer Input1{
    float offset_y[];
};
layout(binding = 2) readonly buffer Input2{
    float widths[];
};
layout(binding = 3) readonly buffer Input3{
    float heights[];
};
layout(binding = 4) readonly buffer Input4{
    vec4 variance[];
};
layout(binding = 5) writeonly buffer Output{
    vec4 out_buffer[];
};

layout(local_size_x = LOCAL_SZ_X, local_size_y = 1, local_size_z = 1) in;

void main()
{
    for (int index = int(gl_GlobalInvocationID.x); index < p.nthreads; index += p.global_size)
    {
        int w = index % p.layer_w;
        int h = index / p.layer_w;
        int output_offset = index * p.offset_x_size * p.width_size;

        float box_w, box_h;
        vec4 outer;
        for (int i = 0; i < p.width_size; ++i)
        {
            box_w = widths[i];
            box_h = heights[i];
            for (int j = 0; j < p.offset_x_size; ++j)
            {
                float center_x = (w + offset_x[j]) * p.step_x;
                float center_y = (h + offset_y[j]) * p.step_y;

                outer.x = (center_x - box_w * 0.5f) / p.image_w;    // xmin
                outer.y = (center_y - box_h * 0.5f) / p.image_h;  // ymin
                outer.z = (center_x + box_w * 0.5f) / p.image_w;    // xmax
                outer.w = (center_y + box_h * 0.5f) / p.image_h;  // ymax

                // clip
                if (p.clip == 1)
                {
                    vec4 start = vec4(0.f, 0.f, 0.f, 0.f);
                    vec4 end = vec4(1.f, 1.f, 1.f, 1.f);
                    outer = min(max(outer, start), end);
                }

                //set variance
                out_buffer[p.variance_off + output_offset] = variance[0];
                out_buffer[output_offset] = outer;
                output_offset++;
            }
        }
    }
}