int
UnsharpMask::runCLKernels()
{
    int status;

    try
    {
        if(!dImageBuffer)
        {
            // Set kernel arguments for 1st pass
            status = unsharp_mask_pass1.setArg(0, inputImageObj);
            status = unsharp_mask_pass1.setArg(1, tmpImageObj);
            status = unsharp_mask_pass1.setArg(2, width);
            status = unsharp_mask_pass1.setArg(3, gaussian1DBuffer);
            status = unsharp_mask_pass1.setArg(4, radius);

            //enqueue the two kernels
            cl::NDRange globalThreads(width,height);
            status = queue.enqueueNDRangeKernel(unsharp_mask_pass1,cl::NullRange,
                                                globalThreads);

            // Set kernel arguments 2nd pass
            status = unsharp_mask_pass2.setArg(0, inputImageObj);
            status = unsharp_mask_pass2.setArg(1, tmpImageObj);
            status = unsharp_mask_pass2.setArg(2, sharpenImageObj);
            status = unsharp_mask_pass2.setArg(3, width);
            status = unsharp_mask_pass2.setArg(4, height);
            status = unsharp_mask_pass2.setArg(5, gaussian1DBuffer);
            status = unsharp_mask_pass2.setArg(6, radius);
            status = unsharp_mask_pass2.setArg(7, threshold);
            status = unsharp_mask_pass2.setArg(8, amount);

            status = queue.enqueueNDRangeKernel(unsharp_mask_pass2,cl::NullRange,
                                                globalThreads);
        }
        else
        {
            // Set kernel arguments 2nd pass
            status = unsharp_mask_filter.setArg(0, inputBuffer);
            status = unsharp_mask_filter.setArg(1, outputBuffer);
            status = unsharp_mask_filter.setArg(2, width);
            status = unsharp_mask_filter.setArg(3, height);
            status = unsharp_mask_filter.setArg(4, gaussian2DBuffer);
            status = unsharp_mask_filter.setArg(5, radius);
            status = unsharp_mask_filter.setArg(6, threshold);
            status = unsharp_mask_filter.setArg(7, amount);
            cl::NDRange globalThreads(width,height);

            status = queue.enqueueNDRangeKernel(unsharp_mask_filter,cl::NullRange,
                                                globalThreads);
        }
    }
    catch (cl::Error e)
    {
        std::cout << e.what() << std::endl;
        std::cout << "Error code: " << e.err() << std::endl;
        return SDK_FAILURE;
    }
    return SDK_SUCCESS;
}
示例#2
0
void TestOpenCL::process()
{
	//create opencl context and command queue
	if(!initOpenCl())
		return;

	//create texture, must be done after openCl context created (at least for AMD)
	if(!initTexture())
		return;

	//load and compile kernel
	if(!initKernel())
		return;

	cl::Event event;
	cl_int status;
	cl::NDRange globalThreads(m_testImage.width(), m_testImage.height());
	int pos=0;
	int outputIndex=0;

	while(m_process)
	{
		//setup kernel arguments
		status=m_kernel.setArg(0, *m_testImage.image());
		if(status != CL_SUCCESS)
			assert(false);
		
		status=m_kernel.setArg(1, *m_outputImage[outputIndex].image());
		if(status != CL_SUCCESS)
			assert(false);

		status=m_kernel.setArg(2, pos);
		if(status != CL_SUCCESS)
			assert(false);

		//execute kernel
		status=m_openCLComandQueue.enqueueNDRangeKernel(m_kernel, cl::NullRange, globalThreads, cl::NullRange, NULL, &event);
		if(status != CL_SUCCESS)
			assert(false);

		m_openCLComandQueue.flush();

		pos++;
		if(pos > m_testImage.width())
			pos=0;

		event.wait();
		m_openCLComandQueue.finish();

		m_mainView->display(&m_outputImage[outputIndex]);
		m_auxView->display(&m_outputImage[outputIndex]);

		outputIndex++;
		if(outputIndex >= m_outputImage.size())
			outputIndex=0;
	}
	m_openCLComandQueue.finish();
}
void zeroBuffer(::cl::Context &context, ::cl::CommandQueue &commandQueue, ::cl::Buffer &buffer, size_t size, std::vector<::cl::Event> *events, ::cl::Event &event)
{
    cl_int status;
    ::cl::Kernel kernel=getKernel(context, "zeroMemory", "utils.cl", utils_cl);

    status=kernel.setArg(0, buffer);

    ::cl::NDRange globalThreads(size);

    status=commandQueue.enqueueNDRangeKernel(kernel, ::cl::NullRange, globalThreads, ::cl::NullRange, events, &event);
}
void zeroImage(::cl::Context &context, ::cl::CommandQueue &commandQueue, ::cl::Image2D &image, std::vector<::cl::Event> *events, ::cl::Event &event)
{
    cl_int status;
    size_t width, height;
    ::cl::Kernel kernel=getKernel(context, "zeroFloatImage", "utils.cl", utils_cl);

    image.getImageInfo(CL_IMAGE_WIDTH, &width);
    image.getImageInfo(CL_IMAGE_HEIGHT, &height);
    status=kernel.setArg(0, image);

    ::cl::NDRange globalThreads(width, height);

    status=commandQueue.enqueueNDRangeKernel(kernel, ::cl::NullRange, globalThreads, ::cl::NullRange, events, &event);
}
示例#5
0
int SobelFilterImage::runCLKernels()
{
    cl_int status;

    cl::size_t<3> origin;
    origin[0] = 0;
    origin[1] = 0;
    origin[2] = 0;

    cl::size_t<3> region;
    region[0] = width;
    region[1] = height;
    region[2] = 1;

    cl::Event writeEvt;
    status = commandQueue.enqueueWriteImage(
                inputImage2D,
                CL_TRUE,
                origin,
                region,
                0,
                0,
                inputImageData,
                NULL,
                &writeEvt);
    CHECK_OPENCL_ERROR(status,
                       "CommandQueue::enqueueWriteImage failed. (inputImage2D)");

    status = commandQueue.flush();
    CHECK_OPENCL_ERROR(status, "cl::CommandQueue.flush failed.");

    cl_int eventStatus = CL_QUEUED;
    while(eventStatus != CL_COMPLETE)
    {
        status = writeEvt.getInfo<cl_int>(
                    CL_EVENT_COMMAND_EXECUTION_STATUS,
                    &eventStatus);
        CHECK_OPENCL_ERROR(status,
                           "cl:Event.getInfo(CL_EVENT_COMMAND_EXECUTION_STATUS) failed.");

    }

    // Set appropriate arguments to the kernel
    // input buffer image
    status = kernel.setArg(0, inputImage2D);
    CHECK_OPENCL_ERROR(status, "Kernel::setArg() failed. (inputImageBuffer)");

    // outBuffer imager
    status = kernel.setArg(1, outputImage2D);
    CHECK_OPENCL_ERROR(status, "Kernel::setArg() failed. (outputImageBuffer)");

    /*
    * Enqueue a kernel run call.
    */
    cl::NDRange globalThreads(width, height);

    if (blockSizeX > width)
        blockSizeX = width;

    cl::NDRange localThreads(blockSizeX, blockSizeY);

    cl::Event ndrEvt;
    status = commandQueue.enqueueNDRangeKernel(
                kernel,
                cl::NullRange,
                globalThreads,
                localThreads,
                0,
                &ndrEvt);
    CHECK_OPENCL_ERROR(status, "CommandQueue::enqueueNDRangeKernel() failed.");

    status = commandQueue.flush();
    CHECK_OPENCL_ERROR(status, "cl::CommandQueue.flush failed.");

    eventStatus = CL_QUEUED;
    while(eventStatus != CL_COMPLETE)
    {
        status = ndrEvt.getInfo<cl_int>(
                    CL_EVENT_COMMAND_EXECUTION_STATUS,
                    &eventStatus);
        CHECK_OPENCL_ERROR(status,
                           "cl:Event.getInfo(CL_EVENT_COMMAND_EXECUTION_STATUS) failed.");
    }

    // Enqueue Read Image
    origin[0] = 0;
    origin[1] = 0;
    origin[2] = 0;

    region[0] = width;
    region[1] = height;
    region[2] = 1;

    // Enqueue readBuffer
    cl::Event readEvt;
    status = commandQueue.enqueueReadImage(
                outputImage2D,
                CL_FALSE,
                origin,
                region,
                0,
                0,
                outputImageData,
                NULL,
                &readEvt);
    CHECK_OPENCL_ERROR(status, "CommandQueue::enqueueReadImage failed.");

    status = commandQueue.flush();
    CHECK_OPENCL_ERROR(status, "cl::CommandQueue.flush failed.");

    eventStatus = CL_QUEUED;
    while(eventStatus != CL_COMPLETE)
    {
        status = readEvt.getInfo<cl_int>(
                    CL_EVENT_COMMAND_EXECUTION_STATUS,
                    &eventStatus);
        CHECK_OPENCL_ERROR(status,
                           "cl:Event.getInfo(CL_EVENT_COMMAND_EXECUTION_STATUS) failed.");

    }

    return 0;
}
int 
GaussianNoise::runCLKernels()
{
    cl_int status;
    cl_int eventStatus = CL_QUEUED;

    cl::Event writeEvt;
    status = commandQueue.enqueueWriteBuffer(
                inputImageBuffer,
                CL_FALSE,
                0,
                width * height * pixelSize,
                inputImageData,
                NULL,
                &writeEvt);
    CHECK_OPENCL_ERROR(status, "CommandQueue::enqueueWriteBuffer() failed. (inputImageBuffer)");
    
    status = commandQueue.flush();
    CHECK_OPENCL_ERROR(status, "cl::CommandQueue.flush failed.");

    eventStatus = CL_QUEUED;
    while(eventStatus != CL_COMPLETE)
    {
        status = writeEvt.getInfo<cl_int>(
                    CL_EVENT_COMMAND_EXECUTION_STATUS, 
                    &eventStatus);
        CHECK_OPENCL_ERROR(status, "cl:Event.getInfo(CL_EVENT_COMMAND_EXECUTION_STATUS) failed.");
    }

    // Set appropriate arguments to the kernel 

    // input buffer image 
    status = kernel.setArg(0, inputImageBuffer);
    CHECK_OPENCL_ERROR(status, "Kernel::setArg() failed. (inputImageBuffer)");

    // outBuffer imager 
    status = kernel.setArg(1, outputImageBuffer);
    CHECK_OPENCL_ERROR(status, "Kernel::setArg() failed. (outputImageBuffer)");

    // factor 
    status = kernel.setArg(2, factor);
    CHECK_OPENCL_ERROR(status, "Kernel::setArg() failed. (factor)");

    /* 
    * Enqueue a kernel run call.
    */

    // Each thread calculates 2 gaussian numbers 
    cl::NDRange globalThreads(width / 2, height);
    cl::NDRange localThreads(blockSizeX, blockSizeY);

    cl::Event ndrEvt;
    status = commandQueue.enqueueNDRangeKernel(
                kernel,
                cl::NullRange,
                globalThreads,
                localThreads,
                NULL, 
                &ndrEvt);
    CHECK_OPENCL_ERROR(status, "CommandQueue::enqueueNDRangeKernel() failed.");

    status = commandQueue.flush();
    CHECK_OPENCL_ERROR(status, "cl::CommandQueue.flush failed.");

    eventStatus = CL_QUEUED;
    while(eventStatus != CL_COMPLETE)
    {
        status = ndrEvt.getInfo<cl_int>(
                    CL_EVENT_COMMAND_EXECUTION_STATUS, 
                    &eventStatus);
        CHECK_OPENCL_ERROR(status, "cl:Event.getInfo(CL_EVENT_COMMAND_EXECUTION_STATUS) failed.");
    }

    // Enqueue readBuffer
    cl::Event readEvt;
    status = commandQueue.enqueueReadBuffer(
                outputImageBuffer,
                CL_FALSE,
                0,
                width * height * pixelSize,
                outputImageData,
                NULL,
                &readEvt);
    CHECK_OPENCL_ERROR(status, "CommandQueue::enqueueReadBuffer failed. (outputImageBuffer)");

    status = commandQueue.flush();
    CHECK_OPENCL_ERROR(status, "cl::CommandQueue.flush failed.");

    eventStatus = CL_QUEUED;
    while(eventStatus != CL_COMPLETE)
    {
        status = readEvt.getInfo<cl_int>(
                    CL_EVENT_COMMAND_EXECUTION_STATUS, 
                    &eventStatus);
        CHECK_OPENCL_ERROR(status, "cl:Event.getInfo(CL_EVENT_COMMAND_EXECUTION_STATUS) failed.");
    }

    return SDK_SUCCESS;
}
int 
HDRToneMapping::runCLKernels()
{
    cl_int status;
    cl_int eventStatus = CL_QUEUED;

    if (deviceType.compare("gpu") == 0)
    {
        cl::Event mapEvt; 
        void *mapPtr = commandQueue.enqueueMapBuffer(inputImageBuffer, 
                                CL_FALSE,
                                CL_MAP_WRITE,
                                0,
                                width * height * numChannels * sizeof(cl_float),
                                NULL,
                                &mapEvt,
                                &status);
        CHECK_OPENCL_ERROR(status, "CommandQueue::enqueueWriteBuffer() failed. (inputImageBuffer)");

        status = commandQueue.flush();
        CHECK_OPENCL_ERROR(status, "cl::CommandQueue.flush failed.");

        eventStatus = CL_QUEUED;
        while(eventStatus != CL_COMPLETE)
        {
            status = mapEvt.getInfo<cl_int>(
                        CL_EVENT_COMMAND_EXECUTION_STATUS, 
                        &eventStatus);
            CHECK_OPENCL_ERROR(status, "cl:Event.getInfo(CL_EVENT_COMMAND_EXECUTION_STATUS) failed.");
        }

        memcpy(mapPtr, 
            input, 
            height * width * numChannels * sizeof(cl_float));

        cl::Event unMapEvt;

        status = commandQueue.enqueueUnmapMemObject(inputImageBuffer, 
                                mapPtr, 
                                NULL, 
                                &unMapEvt);
        CHECK_OPENCL_ERROR(status, "commandQueue.enqueueUnmapObject failed");

        status = commandQueue.flush();
        CHECK_OPENCL_ERROR(status, "cl::CommandQueue.flush failed.");

        eventStatus = CL_QUEUED;
        while(eventStatus != CL_COMPLETE)
        {
            status = unMapEvt.getInfo<cl_int>(
                        CL_EVENT_COMMAND_EXECUTION_STATUS, 
                        &eventStatus);
            CHECK_OPENCL_ERROR(status, "cl:Event.getInfo(CL_EVENT_COMMAND_EXECUTION_STATUS) failed.");
        }
    }

    // input buffer image 
    status = kernel.setArg(0, inputImageBuffer);
    CHECK_OPENCL_ERROR(status, "Kernel::setArg() failed. (inputImageBuffer)");

    // outBuffer imager 
    status = kernel.setArg(1, outputImageBuffer);
    CHECK_OPENCL_ERROR(status, "Kernel::setArg() failed. (outputImageBuffer)");

    // Average Luminance 
    status = kernel.setArg(2, averageLuminance);
    CHECK_OPENCL_ERROR(status, "Kernel::setArg() failed. (averageLuminance)");

    // Gamma 
    status = kernel.setArg(3, gammaPattanaik);
    CHECK_OPENCL_ERROR(status, "Kernel::setArg() failed. (gammaPattanaik)");

    // C 
    status = kernel.setArg(4, cPattanaik);
    CHECK_OPENCL_ERROR(status, "Kernel::setArg() failed. (cPattanaik)");

    // Delta 
    status = kernel.setArg(5, deltaPattanaik);
    CHECK_OPENCL_ERROR(status, "Kernel::setArg() failed. (deltaPattanaik)");

    // Width 
    status = kernel.setArg(6, width);
    CHECK_OPENCL_ERROR(status, "Kernel::setArg() failed. (width)");

    // numChannels 
    status = kernel.setArg(7, numChannels);
    CHECK_OPENCL_ERROR(status, "Kernel::setArg() failed. (numChannels)");

    // Height 
    status = kernel.setArg(8, height);
    CHECK_OPENCL_ERROR(status, "Kernel::setArg() failed. (height)");

    /* 
    * Enqueue a kernel run call.
    */

    cl::NDRange globalThreads(width, height);
    cl::NDRange localThreads(blockSizeX, blockSizeY);

    cl::Event ndrEvt;
    status = commandQueue.enqueueNDRangeKernel(
                kernel,
                cl::NullRange,
                globalThreads,
                localThreads,
                NULL, 
                &ndrEvt);
    CHECK_OPENCL_ERROR(status, "CommandQueue::enqueueNDRangeKernel() failed.");

    status = commandQueue.flush();
    CHECK_OPENCL_ERROR(status, "cl::CommandQueue.flush failed.");

    eventStatus = CL_QUEUED;
    while(eventStatus != CL_COMPLETE)
    {
        status = ndrEvt.getInfo<cl_int>(
                    CL_EVENT_COMMAND_EXECUTION_STATUS, 
                    &eventStatus);
        CHECK_OPENCL_ERROR(status, "cl:Event.getInfo(CL_EVENT_COMMAND_EXECUTION_STATUS) failed.");
    }

    if (deviceType.compare("gpu") == 0)
    {
        // Enqueue readBuffer
        cl::Event readEvt;
        status = commandQueue.enqueueReadBuffer(
                    outputImageBuffer,
                    CL_FALSE,
                    0,
                    width * height * numChannels * sizeof(cl_float),
                    output,
                    NULL,
                    &readEvt);
        CHECK_OPENCL_ERROR(status, "CommandQueue::enqueueReadBuffer failed. (outputImageBuffer)");

        status = commandQueue.flush();
        CHECK_OPENCL_ERROR(status, "cl::CommandQueue.flush failed.");

        eventStatus = CL_QUEUED;
        while(eventStatus != CL_COMPLETE)
        {
            status = readEvt.getInfo<cl_int>(
                        CL_EVENT_COMMAND_EXECUTION_STATUS, 
                        &eventStatus);
            CHECK_OPENCL_ERROR(status, "cl:Event.getInfo(CL_EVENT_COMMAND_EXECUTION_STATUS) failed.");
        }
    }
    return SDK_SUCCESS;
}