158190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger/* 258190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger * Copyright 2013 Google Inc. 358190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger * 458190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger * Use of this source code is governed by a BSD-style license that can be 558190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger * found in the LICENSE file. 658190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger */ 758190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger 858190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger#ifndef SkCLImageDiffer_DEFINED 958190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger#define SkCLImageDiffer_DEFINED 1058190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger 1158190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger#if SK_BUILD_FOR_MAC 1258190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger# include <OpenCL/cl.h> 1358190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger#else 1458190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger# include <CL/cl.h> 1558190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger#endif 1658190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger#include "SkTDArray.h" 1758190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger 1858190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger#include "SkImageDiffer.h" 1958190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger 2058190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenbergerclass SkStream; 2158190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger 2258190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger/** 2358190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger * An SkImageDiffer that requires initialization with an OpenCL device and context. 2458190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger */ 2558190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenbergerclass SkCLImageDiffer : public SkImageDiffer { 2658190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenbergerpublic: 2758190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger SkCLImageDiffer(); 2858190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger 29910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger virtual bool requiresOpenCL() const SK_OVERRIDE { return true; } 3058190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger 3158190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger /** 3258190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger * Initializes the OpenCL resources this differ needs to work 3358190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger * @param device An OpenCL device 3458190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger * @param context An OpenCL context of the given device 3558190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger * @return True on success, false otherwise 3658190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger */ 3758190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger virtual bool init(cl_device_id device, cl_context context); 3858190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger 3958190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenbergerprotected: 4058190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger /** 4158190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger * Called by init after fDevice, fContext, and fCommandQueue are successfully initialized 4258190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger * @return True on success, false otherwise 4358190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger */ 4458190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger virtual bool onInit() = 0; 4558190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger 4658190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger /** 4758190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger * Loads an OpenCL kernel from the file with the given named entry point. This only works after 4858190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger * init is called. 4958190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger * @param file The file path of the kernel 5058190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger * @param name The name of the entry point of the desired kernel in the file 5158190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger * @param kernel A pointer to return the loaded kernel into 5258190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger * @return True on success, false otherwise 5358190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger */ 5458190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger bool loadKernelFile(const char file[], const char name[], cl_kernel* kernel); 5558190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger 5658190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger /** 5758190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger * Loads an OpenCL kernel from the stream with the given named entry point. This only works 5858190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger * after init is called. 5958190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger * @param stream The stream that contains the kernel 6058190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger * @param name The name of the entry point of the desired kernel in the stream 6158190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger * @param kernel A pointer to return the loaded kernel into 6258190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger * @return True on success, false otherwise 6358190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger */ 6458190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger bool loadKernelStream(SkStream* stream, const char name[], cl_kernel* kernel); 6558190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger 6658190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger /** 6758190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger * Loads an OpenCL kernel from the source string with the given named entry point. This only 6858190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger * works after init is called. 6958190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger * @param source The string that contains the kernel 7058190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger * @param name The name of the entry point of the desired kernel in the source string 7158190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger * @param kernel A pointer to return the loaded kernel into 7258190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger * @return True on success, false otherwise 7358190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger */ 7458190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger bool loadKernelSource(const char source[], const char name[], cl_kernel* kernel); 7558190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger 7658190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger /** 7758190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger * Loads a read only copy of the given bitmap into device memory and returns the block of 7858190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger * memory. This only works after init is called. 7958190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger * @param bitmap The bitmap to load into memory 8058190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger * @param image A pointer to return the allocated image to 8158190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger * @return True on success, false otherwise 8258190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger */ 83910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger bool makeImage2D(SkBitmap* bitmap, cl_mem* image) const; 8458190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger 8558190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger cl_device_id fDevice; 8658190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger cl_context fContext; 8758190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger cl_command_queue fCommandQueue; 8858190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger 89910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenbergerprotected: 90910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger bool fIsGood; 91910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger 9258190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenbergerprivate: 9358190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger 9458190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger typedef SkImageDiffer INHERITED; 9558190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger}; 9658190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger 9758190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger#endif 98