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