GDAL

gdalwarpkernel_opencl.h
1 /******************************************************************************
2 * $Id$
3 *
4 * Project: OpenCL Image Reprojector
5 * Purpose: Implementation of the GDALWarpKernel reprojector in OpenCL.
6 * Author: Seth Price, seth@pricepages.org
7 *
8 ******************************************************************************
9 * Copyright (c) 2010, Seth Price <seth@pricepages.org>
10 *
11 * Permission is hereby granted, free of charge, to any person obtaining a
12 * copy of this software and associated documentation files (the "Software"),
13 * to deal in the Software without restriction, including without limitation
14 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
15 * and/or sell copies of the Software, and to permit persons to whom the
16 * Software is furnished to do so, subject to the following conditions:
17 *
18 * The above copyright notice and this permission notice shall be included
19 * in all copies or substantial portions of the Software.
20 *
21 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
22 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
23 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
24 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
25 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
26 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
27 * DEALINGS IN THE SOFTWARE.
28 ****************************************************************************/
29
30 #if defined(HAVE_OPENCL)
31
32 /* The following relates to the profiling calls to
33 clSetCommandQueueProperty() which are not available by default
34 with some OpenCL implementation (i.e. ATI) */
35
36 #if defined(DEBUG_OPENCL) && DEBUG_OPENCL == 1
37 #define CL_USE_DEPRECATED_OPENCL_1_0_APIS
38 #endif
39
40 #define CL_TARGET_OPENCL_VERSION 100
41
42 #ifdef __APPLE__
43 #include <OpenCL/OpenCL.h>
44 #else
45 #include <CL/opencl.h>
46 #endif
47
48 #ifdef __cplusplus /* If this is a C++ compiler, use C linkage */
49 extern "C" {
50 #endif
51
52 typedef enum {
53 OCL_Bilinear=10,
54 OCL_Cubic=11,
55 OCL_CubicSpline=12,
56 OCL_Lanczos=13
57 } OCLResampAlg;
58
59 typedef enum
60 {
61 VENDOR_OTHER,
62 VENDOR_AMD,
63 VENDOR_INTEL
64 } OCLVendor;
65
66 struct oclWarper {
67 cl_command_queue queue;
68 cl_context context;
69 cl_device_id dev;
70 cl_kernel kern1;
71 cl_kernel kern4;
72
73 int srcWidth;
74 int srcHeight;
75 int dstWidth;
76 int dstHeight;
77
78 int useUnifiedSrcDensity;
79 int useUnifiedSrcValid;
80 int useDstDensity;
81 int useDstValid;
82
83 int numBands;
84 int numImages;
85 OCLResampAlg resampAlg;
86
87 cl_channel_type imageFormat;
88 cl_mem *realWorkCL;
89 union {
90 void **v;
91 char **c;
92 unsigned char **uc;
93 short **s;
94 unsigned short **us;
95 float **f;
96 } realWork;
97
98 cl_mem *imagWorkCL;
99 union {
100 void **v;
101 char **c;
102 unsigned char **uc;
103 short **s;
104 unsigned short **us;
105 float **f;
106 } imagWork;
107
108 cl_mem *dstRealWorkCL;
109 union {
110 void **v;
111 char **c;
112 unsigned char **uc;
113 short **s;
114 unsigned short **us;
115 float **f;
116 } dstRealWork;
117
118 cl_mem *dstImagWorkCL;
119 union {
120 void **v;
121 char **c;
122 unsigned char **uc;
123 short **s;
124 unsigned short **us;
125 float **f;
126 } dstImagWork;
127
128 unsigned int imgChSize1;
129 cl_channel_order imgChOrder1;
130 unsigned int imgChSize4;
131 cl_channel_order imgChOrder4;
132 char useVec;
133
134 cl_mem useBandSrcValidCL;
135 char *useBandSrcValid;
136
137 cl_mem nBandSrcValidCL;
138 float *nBandSrcValid;
139
140 cl_mem xyWorkCL;
141 float *xyWork;
142
143 int xyWidth;
144 int xyHeight;
145 int coordMult;
146
147 unsigned int xyChSize;
148 cl_channel_order xyChOrder;
149
150 cl_mem fDstNoDataRealCL;
151 float *fDstNoDataReal;
152
153 OCLVendor eCLVendor;
154 };
155
156 struct oclWarper* GDALWarpKernelOpenCL_createEnv(int srcWidth, int srcHeight,
157 int dstWidth, int dstHeight,
158 cl_channel_type imageFormat,
159 int numBands, int coordMult,
160 int useImag, int useBandSrcValid,
161 float *fDstDensity,
162 double *dfDstNoDataReal,
163 OCLResampAlg resampAlg, cl_int *envErr);
164
165 cl_int GDALWarpKernelOpenCL_setSrcValid(struct oclWarper *warper,
166 int *bandSrcValid, int bandNum);
167
168 cl_int GDALWarpKernelOpenCL_setSrcImg(struct oclWarper *warper, void *imgData,
169 int bandNum);
170
171 cl_int GDALWarpKernelOpenCL_setDstImg(struct oclWarper *warper, void *imgData,
172 int bandNum);
173
174 cl_int GDALWarpKernelOpenCL_setCoordRow(struct oclWarper *warper,
175 double *rowSrcX, double *rowSrcY,
176 double srcXOff, double srcYOff,
177 int *success, int rowNum);
178
179 cl_int GDALWarpKernelOpenCL_runResamp(struct oclWarper *warper,
180 float *unifiedSrcDensity,
181 unsigned int *unifiedSrcValid,
182 float *dstDensity,
183 unsigned int *dstValid,
184 double dfXScale, double dfYScale,
185 double dfXFilter, double dfYFilter,
186 int nXRadius, int nYRadius,
187 int nFiltInitX, int nFiltInitY);
188
189 cl_int GDALWarpKernelOpenCL_getRow(struct oclWarper *warper,
190 void **rowReal, void **rowImag,
191 int rowNum, int bandNum);
192
193 cl_int GDALWarpKernelOpenCL_deleteEnv(struct oclWarper *warper);
194
195 #ifdef __cplusplus /* If this is a C++ compiler, end C linkage */
196 }
197 #endif
198
199 #endif /* defined(HAVE_OPENCL) */