Exemple #1
0
Fichier : ocl.c Projet : aosp/dvp
DVP_Error_e ocl_Scharr8(ocl_t *ocl, DVP_Image_t *pInput, DVP_Image_t *pOutput)
{
    DVP_PRINT(DVP_ZONE_API, "OCL:  %p (env=%p) SCHARR in %p out %p\n", ocl, ocl->env, pInput, pOutput);
    if (ocl && ocl->env)
    {
        cl_char operator[2][3][3] = { { {3,10,3}, {0,0,0}, {-3,-10,-3} }, { {3,0,-3}, {10,0,-10}, {3,0,-3} } };
        cl_uint limit = 255;
        cl_uint range = range_of_operator((cl_char *)operator, 3, limit);
        cl_int err = imgfilter1d_opt(ocl->env,
                                     pInput->width,
                                     pInput->height,
                                     pInput->pData[0],
                                     pInput->y_stride,
                                     pOutput->pData[0],
                                     pOutput->y_stride,
                                     (cl_char *)operator,
                                     3,
                                     range,limit);
        return DVP_SUCCESS;
    }
    return DVP_ERROR_INVALID_PARAMETER;
}
int main(int argc, char *argv[])
{
    if (argc >= 5)
    {
        FILE *fi = NULL;
        FILE *fo = NULL;
        cl_uint width = atoi(argv[2]);
        cl_uint height = atoi(argv[3]);
        cl_int err = CL_SUCCESS;

#ifdef CL_BUILD_RUNTIME
		cl_environment_t *pEnv = clCreateEnvironment(KDIR"kernel_imgfilter.cl", CL_DEVICE_TYPE_GPU, 2, notify, CL_ARGS);
#else
        cl_environment_t *pEnv = clCreateEnvironmentFromBins(&gKernelBins, notify, CL_ARGS);
#endif
        if (!pEnv)
        {
            clDeleteEnvironment(pEnv);
            return -1;
        }

        clPrintAllKernelInfo(pEnv->kernels[0]);

        fi = fopen(argv[1], "rb");
        fo = fopen(argv[4], "wb+");
        if (fi && fo)
        {
            cl_char sobel[2][3][3] = { { {1,2,1}, {0,0,0}, {-1,-2,-1} }, { {-1,0,1}, {-2,0,2}, {-1,0,1} } };
            size_t numBytes = width * height * sizeof(unsigned char);
            cl_uchar *input_image = (cl_uchar *)malloc(numBytes);
            cl_uchar *output_image = (cl_uchar *)malloc(numBytes);
            clock_t c_start, c_diff;
            cl_uint limit = 255;
            cl_uint range = range_of_operator((cl_char *)sobel, 3, limit);
            printf("Range of Sobel = %u, Limit = %u\n",range,limit);
            do {
                numBytes = fread(input_image, 1, numBytes, fi);
                if (numBytes == 0)
                    break;
                c_start = clock();
                err = imgfilter1d_opt(pEnv, width, height,
                                  input_image, width,
                                  output_image, width,
                                  (cl_char *)sobel, 3,
                                  range, limit);
                c_diff = clock() - c_start;
                printf("Sobel took %lu ticks\n", c_diff);
                numBytes = fwrite(output_image, 1, numBytes, fo);
            } while (err == CL_SUCCESS);

            free(input_image);
            free(output_image);

            fclose(fi);
            fclose(fo);
        }
        clDeleteEnvironment(pEnv);
    }
    else
    {
        printf("%s <filename> <width> <height> <outfile>\n",argv[0]);
    }
    return 0;
}