/*
* Copyright 2013 Google Inc.
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#ifndef SkCLImageDiffer_DEFINED
#define SkCLImageDiffer_DEFINED
#if SK_BUILD_FOR_MAC
# include <OpenCL/cl.h>
#else
# include <CL/cl.h>
#endif
#include "SkTDArray.h"
#include "SkImageDiffer.h"
class SkStream;
/**
* An SkImageDiffer that requires initialization with an OpenCL device and context.
*/
class SkCLImageDiffer : public SkImageDiffer {
public:
SkCLImageDiffer();
virtual bool requiresOpenCL() const SK_OVERRIDE { return true; }
/**
* Initializes the OpenCL resources this differ needs to work
* @param device An OpenCL device
* @param context An OpenCL context of the given device
* @return True on success, false otherwise
*/
virtual bool init(cl_device_id device, cl_context context);
protected:
/**
* Called by init after fDevice, fContext, and fCommandQueue are successfully initialized
* @return True on success, false otherwise
*/
virtual bool onInit() = 0;
/**
* Loads an OpenCL kernel from the file with the given named entry point. This only works after
* init is called.
* @param file The file path of the kernel
* @param name The name of the entry point of the desired kernel in the file
* @param kernel A pointer to return the loaded kernel into
* @return True on success, false otherwise
*/
bool loadKernelFile(const char file[], const char name[], cl_kernel* kernel);
/**
* Loads an OpenCL kernel from the stream with the given named entry point. This only works
* after init is called.
* @param stream The stream that contains the kernel
* @param name The name of the entry point of the desired kernel in the stream
* @param kernel A pointer to return the loaded kernel into
* @return True on success, false otherwise
*/
bool loadKernelStream(SkStream* stream, const char name[], cl_kernel* kernel);
/**
* Loads an OpenCL kernel from the source string with the given named entry point. This only
* works after init is called.
* @param source The string that contains the kernel
* @param name The name of the entry point of the desired kernel in the source string
* @param kernel A pointer to return the loaded kernel into
* @return True on success, false otherwise
*/
bool loadKernelSource(const char source[], const char name[], cl_kernel* kernel);
/**
* Loads a read only copy of the given bitmap into device memory and returns the block of
* memory. This only works after init is called.
* @param bitmap The bitmap to load into memory
* @param image A pointer to return the allocated image to
* @return True on success, false otherwise
*/
bool makeImage2D(SkBitmap* bitmap, cl_mem* image) const;
cl_device_id fDevice;
cl_context fContext;
cl_command_queue fCommandQueue;
protected:
bool fIsGood;
private:
typedef SkImageDiffer INHERITED;
};
#endif