1 /******************************************************************************
2  * $Id: gdalwarpkernel_opencl.h 81cf50eb5388867c88b73e923d9e9264653b5fec 2021-04-24 00:34:42 +0200 Even Rouault $
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) */
200