Style fix to OpenCL SVG Filters
[WebKit-https.git] / Source / WebCore / platform / graphics / gpu / opencl / FilterContextOpenCL.h
1 /*
2  * Copyright (C) 2012 University of Szeged
3  * Copyright (C) 2012 Tamas Czene <tczene@inf.u-szeged.hu>
4  * All rights reserved.
5  *
6  * Redistribution and use in source and binary forms, with or without
7  * modification, are permitted provided that the following conditions
8  * are met:
9  * 1. Redistributions of source code must retain the above copyright
10  *    notice, this list of conditions and the following disclaimer.
11  * 2. Redistributions in binary form must reproduce the above copyright
12  *    notice, this list of conditions and the following disclaimer in the
13  *    documentation and/or other materials provided with the distribution.
14  *
15  * THIS SOFTWARE IS PROVIDED BY UNIVERSITY OF SZEGED ``AS IS'' AND ANY
16  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
18  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL UNIVERSITY OF SZEGED OR
19  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
20  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
21  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
22  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
23  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
25  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26  */
27
28 #ifndef FilterContextOpenCL_h
29 #define FilterContextOpenCL_h
30
31 #if ENABLE(OPENCL)
32 #include "CL/cl.h"
33 #include "Color.h"
34 #include "ColorSpace.h"
35 #include "IntRect.h"
36 #include "IntSize.h"
37 #include "OpenCLHandle.h"
38
39 #define PROGRAM_STR(...)  #__VA_ARGS__
40 #define PROGRAM(...) PROGRAM_STR(__VA_ARGS__)
41
42 namespace WebCore {
43
44 class FilterContextOpenCL {
45 public:
46     FilterContextOpenCL()
47         : m_deviceId(0)
48         , m_deviceContext(0)
49         , m_commandQueue(0)
50         , m_transformColorSpaceProgram(0)
51         , m_transformColorSpaceKernel(0)
52         , m_colorMatrixCompileStatus(openclNotCompiledYet)
53         , m_colorMatrixProgram(0)
54         , m_matrixOperation(0)
55         , m_saturateAndHueRotateOperation(0)
56         , m_luminanceOperation(0)
57         , m_turbulenceCompileStatus(openclNotCompiledYet)
58         , m_turbulenceProgram(0)
59         , m_turbulenceOperation(0)
60     {
61     }
62
63     // Returns 0 if initialization failed.
64     static FilterContextOpenCL* context();
65
66     cl_device_id deviceId() { return m_deviceId; }
67     cl_context deviceContext() { return m_deviceContext; }
68     cl_command_queue commandQueue() { return m_commandQueue; }
69
70     OpenCLHandle createOpenCLImage(IntSize);
71     void openCLTransformColorSpace(OpenCLHandle&, IntRect, ColorSpace, ColorSpace);
72
73     inline bool compileFEColorMatrix();
74     inline bool compileFETurbulence();
75
76     inline void applyFEColorMatrix(OpenCLHandle, IntSize, OpenCLHandle, IntPoint, float*, int);
77     inline void applyFETurbulence(OpenCLHandle, IntSize, int, void*, void*, void*, void*, void*,
78         int*, int, int, int, int, float, float, bool, int, int);
79
80 private:
81
82     class RunKernel {
83         public:
84             RunKernel(FilterContextOpenCL* context, cl_kernel kernel, size_t width, size_t height)
85                 : m_context(context)
86                 , m_kernel(kernel)
87                 , index(0)
88             {
89                 m_globalSize[0] = width;
90                 m_globalSize[1] = height;
91             }
92
93             void addArgument(OpenCLHandle handle)
94             {
95                 clSetKernelArg(m_kernel, index++, sizeof(OpenCLHandle), handle.handleAddress());
96             }
97
98             void addArgument(cl_int value)
99             {
100                 clSetKernelArg(m_kernel, index++, sizeof(cl_int), reinterpret_cast<void*>(&value));
101             }
102
103             void addArgument(cl_float value)
104             {
105                 clSetKernelArg(m_kernel, index++, sizeof(cl_float), reinterpret_cast<void*>(&value));
106             }
107
108             void addArgument(cl_sampler handle)
109             {
110                 clSetKernelArg(m_kernel, index++, sizeof(cl_sampler), reinterpret_cast<void*>(&handle));
111             }
112
113             OpenCLHandle addArgument(void* buffer, int size)
114             {
115                 OpenCLHandle handle(clCreateBuffer(m_context->deviceContext(), CL_MEM_READ_ONLY, size, 0, 0));
116                 clEnqueueWriteBuffer(m_context->commandQueue(), handle, CL_TRUE, 0, size, buffer, 0, 0, 0);
117                 clSetKernelArg(m_kernel, index++, sizeof(OpenCLHandle), handle.handleAddress());
118                 return handle;
119             }
120
121             void run()
122             {
123                 clFinish(m_context->m_commandQueue);
124                 clEnqueueNDRangeKernel(m_context->m_commandQueue, m_kernel, 2, 0, m_globalSize, 0, 0, 0, 0);
125             }
126
127             FilterContextOpenCL* m_context;
128             cl_kernel m_kernel;
129             size_t m_globalSize[2];
130             int index;
131         };
132
133     enum OpenCLCompileStatus {
134         openclNotCompiledYet,
135         openclCompileFailed,
136         openclCompileSuccessful
137     };
138
139     static cl_program compileProgram(const char*);
140     static inline cl_kernel kernelByName(cl_program program, const char* name) { return clCreateKernel(program, name, 0); }
141
142     static FilterContextOpenCL* m_context;
143     static int m_alreadyInitialized;
144
145     cl_device_id m_deviceId;
146     cl_context m_deviceContext;
147     cl_command_queue m_commandQueue;
148
149     cl_program m_transformColorSpaceProgram;
150     cl_kernel m_transformColorSpaceKernel;
151
152     OpenCLCompileStatus m_colorMatrixCompileStatus;
153     cl_program m_colorMatrixProgram;
154     cl_kernel m_matrixOperation;
155     cl_kernel m_saturateAndHueRotateOperation; 
156     cl_kernel m_luminanceOperation;
157
158     OpenCLCompileStatus m_turbulenceCompileStatus;
159     cl_program m_turbulenceProgram;
160     cl_kernel m_turbulenceOperation;
161 };
162
163 } // namespace WebCore
164
165 #endif // ENABLE(OPENCL)
166
167 #endif