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 */
49extern "C"
50{
51#endif
52
53 typedef enum
54 {
55 OCL_Bilinear = 10,
56 OCL_Cubic = 11,
57 OCL_CubicSpline = 12,
58 OCL_Lanczos = 13
59 } OCLResampAlg;
60
61 typedef enum
62 {
63 VENDOR_OTHER,
64 VENDOR_AMD,
65 VENDOR_INTEL
66 } OCLVendor;
67
68 struct oclWarper
69 {
70 cl_command_queue queue;
71 cl_context context;
72 cl_device_id dev;
73 cl_kernel kern1;
74 cl_kernel kern4;
75
76 int srcWidth;
77 int srcHeight;
78 int dstWidth;
79 int dstHeight;
80
81 int useUnifiedSrcDensity;
82 int useUnifiedSrcValid;
83 int useDstDensity;
84 int useDstValid;
85
86 int numBands;
87 int numImages;
88 OCLResampAlg resampAlg;
89
90 cl_channel_type imageFormat;
91 cl_mem *realWorkCL;
92 union
93 {
94 void **v;
95 char **c;
96 unsigned char **uc;
97 short **s;
98 unsigned short **us;
99 float **f;
100 } realWork;
101
102 cl_mem *imagWorkCL;
103 union
104 {
105 void **v;
106 char **c;
107 unsigned char **uc;
108 short **s;
109 unsigned short **us;
110 float **f;
111 } imagWork;
112
113 cl_mem *dstRealWorkCL;
114 union
115 {
116 void **v;
117 char **c;
118 unsigned char **uc;
119 short **s;
120 unsigned short **us;
121 float **f;
122 } dstRealWork;
123
124 cl_mem *dstImagWorkCL;
125 union
126 {
127 void **v;
128 char **c;
129 unsigned char **uc;
130 short **s;
131 unsigned short **us;
132 float **f;
133 } dstImagWork;
134
135 unsigned int imgChSize1;
136 cl_channel_order imgChOrder1;
137 unsigned int imgChSize4;
138 cl_channel_order imgChOrder4;
139 char useVec;
140
141 cl_mem useBandSrcValidCL;
142 char *useBandSrcValid;
143
144 cl_mem nBandSrcValidCL;
145 float *nBandSrcValid;
146
147 cl_mem xyWorkCL;
148 float *xyWork;
149
150 int xyWidth;
151 int xyHeight;
152 int coordMult;
153
154 unsigned int xyChSize;
155 cl_channel_order xyChOrder;
156
157 cl_mem fDstNoDataRealCL;
158 float *fDstNoDataReal;
159
160 OCLVendor eCLVendor;
161 };
162
163 struct oclWarper *GDALWarpKernelOpenCL_createEnv(
164 int srcWidth, int srcHeight, int dstWidth, int dstHeight,
165 cl_channel_type imageFormat, int numBands, int coordMult, int useImag,
166 int useBandSrcValid, float *fDstDensity, double *dfDstNoDataReal,
167 OCLResampAlg resampAlg, cl_int *envErr);
168
169 cl_int GDALWarpKernelOpenCL_setSrcValid(struct oclWarper *warper,
170 int *bandSrcValid, int bandNum);
171
172 cl_int GDALWarpKernelOpenCL_setSrcImg(struct oclWarper *warper,
173 void *imgData, int bandNum);
174
175 cl_int GDALWarpKernelOpenCL_setDstImg(struct oclWarper *warper,
176 void *imgData, int bandNum);
177
178 cl_int GDALWarpKernelOpenCL_setCoordRow(struct oclWarper *warper,
179 double *rowSrcX, double *rowSrcY,
180 double srcXOff, double srcYOff,
181 int *success, int rowNum);
182
183 cl_int GDALWarpKernelOpenCL_runResamp(
184 struct oclWarper *warper, float *unifiedSrcDensity,
185 unsigned int *unifiedSrcValid, float *dstDensity,
186 unsigned int *dstValid, double dfXScale, double dfYScale,
187 double dfXFilter, double dfYFilter, int nXRadius, int nYRadius,
188 int nFiltInitX, int nFiltInitY);
189
190 cl_int GDALWarpKernelOpenCL_getRow(struct oclWarper *warper, void **rowReal,
191 void **rowImag, 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) */