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