1be19b9ef9a46df7d7308f273f6f7efa905cc7d72commit-bot@chromium.org/* 2be19b9ef9a46df7d7308f273f6f7efa905cc7d72commit-bot@chromium.org * Copyright 2013 Google Inc. 3be19b9ef9a46df7d7308f273f6f7efa905cc7d72commit-bot@chromium.org * 4be19b9ef9a46df7d7308f273f6f7efa905cc7d72commit-bot@chromium.org * Use of this source code is governed by a BSD-style license that can be 5be19b9ef9a46df7d7308f273f6f7efa905cc7d72commit-bot@chromium.org * found in the LICENSE file. 6be19b9ef9a46df7d7308f273f6f7efa905cc7d72commit-bot@chromium.org */ 7be19b9ef9a46df7d7308f273f6f7efa905cc7d72commit-bot@chromium.org 8be19b9ef9a46df7d7308f273f6f7efa905cc7d72commit-bot@chromium.org#ifndef SkCLImageDiffer_DEFINED 9be19b9ef9a46df7d7308f273f6f7efa905cc7d72commit-bot@chromium.org#define SkCLImageDiffer_DEFINED 10be19b9ef9a46df7d7308f273f6f7efa905cc7d72commit-bot@chromium.org 116b87df2997980218308954ade47df7fdd6680bc7tfarina#if defined(SK_BUILD_FOR_MAC) 1235f02fb9c9f548656e1cb2cc66d3ed20006384f8zachr@google.com# include <OpenCL/cl.h> 1335f02fb9c9f548656e1cb2cc66d3ed20006384f8zachr@google.com#else 1435f02fb9c9f548656e1cb2cc66d3ed20006384f8zachr@google.com# include <CL/cl.h> 1535f02fb9c9f548656e1cb2cc66d3ed20006384f8zachr@google.com#endif 16be19b9ef9a46df7d7308f273f6f7efa905cc7d72commit-bot@chromium.org#include "SkTDArray.h" 17be19b9ef9a46df7d7308f273f6f7efa905cc7d72commit-bot@chromium.org 18be19b9ef9a46df7d7308f273f6f7efa905cc7d72commit-bot@chromium.org#include "SkImageDiffer.h" 19be19b9ef9a46df7d7308f273f6f7efa905cc7d72commit-bot@chromium.org 20be19b9ef9a46df7d7308f273f6f7efa905cc7d72commit-bot@chromium.orgclass SkStream; 21be19b9ef9a46df7d7308f273f6f7efa905cc7d72commit-bot@chromium.org 22be19b9ef9a46df7d7308f273f6f7efa905cc7d72commit-bot@chromium.org/** 23be19b9ef9a46df7d7308f273f6f7efa905cc7d72commit-bot@chromium.org * An SkImageDiffer that requires initialization with an OpenCL device and context. 24be19b9ef9a46df7d7308f273f6f7efa905cc7d72commit-bot@chromium.org */ 25be19b9ef9a46df7d7308f273f6f7efa905cc7d72commit-bot@chromium.orgclass SkCLImageDiffer : public SkImageDiffer { 26be19b9ef9a46df7d7308f273f6f7efa905cc7d72commit-bot@chromium.orgpublic: 27be19b9ef9a46df7d7308f273f6f7efa905cc7d72commit-bot@chromium.org SkCLImageDiffer(); 28be19b9ef9a46df7d7308f273f6f7efa905cc7d72commit-bot@chromium.org 2936352bf5e38f45a70ee4f4fc132a38048d38206dmtklein bool requiresOpenCL() const override { return true; } 30d658568a8260b858411e975b1a6011d2a496cc6fzachr@google.com 31be19b9ef9a46df7d7308f273f6f7efa905cc7d72commit-bot@chromium.org /** 32be19b9ef9a46df7d7308f273f6f7efa905cc7d72commit-bot@chromium.org * Initializes the OpenCL resources this differ needs to work 33be19b9ef9a46df7d7308f273f6f7efa905cc7d72commit-bot@chromium.org * @param device An OpenCL device 34be19b9ef9a46df7d7308f273f6f7efa905cc7d72commit-bot@chromium.org * @param context An OpenCL context of the given device 35be19b9ef9a46df7d7308f273f6f7efa905cc7d72commit-bot@chromium.org * @return True on success, false otherwise 36be19b9ef9a46df7d7308f273f6f7efa905cc7d72commit-bot@chromium.org */ 37be19b9ef9a46df7d7308f273f6f7efa905cc7d72commit-bot@chromium.org virtual bool init(cl_device_id device, cl_context context); 38be19b9ef9a46df7d7308f273f6f7efa905cc7d72commit-bot@chromium.org 39be19b9ef9a46df7d7308f273f6f7efa905cc7d72commit-bot@chromium.orgprotected: 40be19b9ef9a46df7d7308f273f6f7efa905cc7d72commit-bot@chromium.org /** 41be19b9ef9a46df7d7308f273f6f7efa905cc7d72commit-bot@chromium.org * Called by init after fDevice, fContext, and fCommandQueue are successfully initialized 42be19b9ef9a46df7d7308f273f6f7efa905cc7d72commit-bot@chromium.org * @return True on success, false otherwise 43be19b9ef9a46df7d7308f273f6f7efa905cc7d72commit-bot@chromium.org */ 44be19b9ef9a46df7d7308f273f6f7efa905cc7d72commit-bot@chromium.org virtual bool onInit() = 0; 45be19b9ef9a46df7d7308f273f6f7efa905cc7d72commit-bot@chromium.org 46be19b9ef9a46df7d7308f273f6f7efa905cc7d72commit-bot@chromium.org /** 47be19b9ef9a46df7d7308f273f6f7efa905cc7d72commit-bot@chromium.org * Loads an OpenCL kernel from the file with the given named entry point. This only works after 48be19b9ef9a46df7d7308f273f6f7efa905cc7d72commit-bot@chromium.org * init is called. 49be19b9ef9a46df7d7308f273f6f7efa905cc7d72commit-bot@chromium.org * @param file The file path of the kernel 50be19b9ef9a46df7d7308f273f6f7efa905cc7d72commit-bot@chromium.org * @param name The name of the entry point of the desired kernel in the file 51be19b9ef9a46df7d7308f273f6f7efa905cc7d72commit-bot@chromium.org * @param kernel A pointer to return the loaded kernel into 52be19b9ef9a46df7d7308f273f6f7efa905cc7d72commit-bot@chromium.org * @return True on success, false otherwise 53be19b9ef9a46df7d7308f273f6f7efa905cc7d72commit-bot@chromium.org */ 54be19b9ef9a46df7d7308f273f6f7efa905cc7d72commit-bot@chromium.org bool loadKernelFile(const char file[], const char name[], cl_kernel* kernel); 55be19b9ef9a46df7d7308f273f6f7efa905cc7d72commit-bot@chromium.org 56be19b9ef9a46df7d7308f273f6f7efa905cc7d72commit-bot@chromium.org /** 57be19b9ef9a46df7d7308f273f6f7efa905cc7d72commit-bot@chromium.org * Loads an OpenCL kernel from the stream with the given named entry point. This only works 58be19b9ef9a46df7d7308f273f6f7efa905cc7d72commit-bot@chromium.org * after init is called. 59be19b9ef9a46df7d7308f273f6f7efa905cc7d72commit-bot@chromium.org * @param stream The stream that contains the kernel 60be19b9ef9a46df7d7308f273f6f7efa905cc7d72commit-bot@chromium.org * @param name The name of the entry point of the desired kernel in the stream 61be19b9ef9a46df7d7308f273f6f7efa905cc7d72commit-bot@chromium.org * @param kernel A pointer to return the loaded kernel into 62be19b9ef9a46df7d7308f273f6f7efa905cc7d72commit-bot@chromium.org * @return True on success, false otherwise 63be19b9ef9a46df7d7308f273f6f7efa905cc7d72commit-bot@chromium.org */ 64be19b9ef9a46df7d7308f273f6f7efa905cc7d72commit-bot@chromium.org bool loadKernelStream(SkStream* stream, const char name[], cl_kernel* kernel); 65be19b9ef9a46df7d7308f273f6f7efa905cc7d72commit-bot@chromium.org 66be19b9ef9a46df7d7308f273f6f7efa905cc7d72commit-bot@chromium.org /** 67be19b9ef9a46df7d7308f273f6f7efa905cc7d72commit-bot@chromium.org * Loads an OpenCL kernel from the source string with the given named entry point. This only 68be19b9ef9a46df7d7308f273f6f7efa905cc7d72commit-bot@chromium.org * works after init is called. 69be19b9ef9a46df7d7308f273f6f7efa905cc7d72commit-bot@chromium.org * @param source The string that contains the kernel 70be19b9ef9a46df7d7308f273f6f7efa905cc7d72commit-bot@chromium.org * @param name The name of the entry point of the desired kernel in the source string 71be19b9ef9a46df7d7308f273f6f7efa905cc7d72commit-bot@chromium.org * @param kernel A pointer to return the loaded kernel into 72be19b9ef9a46df7d7308f273f6f7efa905cc7d72commit-bot@chromium.org * @return True on success, false otherwise 73be19b9ef9a46df7d7308f273f6f7efa905cc7d72commit-bot@chromium.org */ 74be19b9ef9a46df7d7308f273f6f7efa905cc7d72commit-bot@chromium.org bool loadKernelSource(const char source[], const char name[], cl_kernel* kernel); 75be19b9ef9a46df7d7308f273f6f7efa905cc7d72commit-bot@chromium.org 76be19b9ef9a46df7d7308f273f6f7efa905cc7d72commit-bot@chromium.org /** 77be19b9ef9a46df7d7308f273f6f7efa905cc7d72commit-bot@chromium.org * Loads a read only copy of the given bitmap into device memory and returns the block of 78be19b9ef9a46df7d7308f273f6f7efa905cc7d72commit-bot@chromium.org * memory. This only works after init is called. 79be19b9ef9a46df7d7308f273f6f7efa905cc7d72commit-bot@chromium.org * @param bitmap The bitmap to load into memory 80be19b9ef9a46df7d7308f273f6f7efa905cc7d72commit-bot@chromium.org * @param image A pointer to return the allocated image to 81be19b9ef9a46df7d7308f273f6f7efa905cc7d72commit-bot@chromium.org * @return True on success, false otherwise 82be19b9ef9a46df7d7308f273f6f7efa905cc7d72commit-bot@chromium.org */ 83efc51b79a22348e3c2596e872609a7a4b018e531djsollen@google.com bool makeImage2D(SkBitmap* bitmap, cl_mem* image) const; 84be19b9ef9a46df7d7308f273f6f7efa905cc7d72commit-bot@chromium.org 85be19b9ef9a46df7d7308f273f6f7efa905cc7d72commit-bot@chromium.org cl_device_id fDevice; 86be19b9ef9a46df7d7308f273f6f7efa905cc7d72commit-bot@chromium.org cl_context fContext; 87be19b9ef9a46df7d7308f273f6f7efa905cc7d72commit-bot@chromium.org cl_command_queue fCommandQueue; 88be19b9ef9a46df7d7308f273f6f7efa905cc7d72commit-bot@chromium.org 89efc51b79a22348e3c2596e872609a7a4b018e531djsollen@google.comprotected: 90efc51b79a22348e3c2596e872609a7a4b018e531djsollen@google.com bool fIsGood; 91efc51b79a22348e3c2596e872609a7a4b018e531djsollen@google.com 92be19b9ef9a46df7d7308f273f6f7efa905cc7d72commit-bot@chromium.orgprivate: 93be19b9ef9a46df7d7308f273f6f7efa905cc7d72commit-bot@chromium.org 94be19b9ef9a46df7d7308f273f6f7efa905cc7d72commit-bot@chromium.org typedef SkImageDiffer INHERITED; 95be19b9ef9a46df7d7308f273f6f7efa905cc7d72commit-bot@chromium.org}; 96be19b9ef9a46df7d7308f273f6f7efa905cc7d72commit-bot@chromium.org 97be19b9ef9a46df7d7308f273f6f7efa905cc7d72commit-bot@chromium.org#endif 98