1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
|
/*
* 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 defined(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();
bool requiresOpenCL() const 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
|