xref: /aosp_15_r20/external/OpenCL-CTS/test_conformance/profiling/copy.cpp (revision 6467f958c7de8070b317fc65bcb0f6472e388d82)
1*6467f958SSadaf Ebrahimi //
2*6467f958SSadaf Ebrahimi // Copyright (c) 2017 The Khronos Group Inc.
3*6467f958SSadaf Ebrahimi //
4*6467f958SSadaf Ebrahimi // Licensed under the Apache License, Version 2.0 (the "License");
5*6467f958SSadaf Ebrahimi // you may not use this file except in compliance with the License.
6*6467f958SSadaf Ebrahimi // You may obtain a copy of the License at
7*6467f958SSadaf Ebrahimi //
8*6467f958SSadaf Ebrahimi //    http://www.apache.org/licenses/LICENSE-2.0
9*6467f958SSadaf Ebrahimi //
10*6467f958SSadaf Ebrahimi // Unless required by applicable law or agreed to in writing, software
11*6467f958SSadaf Ebrahimi // distributed under the License is distributed on an "AS IS" BASIS,
12*6467f958SSadaf Ebrahimi // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*6467f958SSadaf Ebrahimi // See the License for the specific language governing permissions and
14*6467f958SSadaf Ebrahimi // limitations under the License.
15*6467f958SSadaf Ebrahimi //
16*6467f958SSadaf Ebrahimi #include "harness/compat.h"
17*6467f958SSadaf Ebrahimi 
18*6467f958SSadaf Ebrahimi #include <stdio.h>
19*6467f958SSadaf Ebrahimi #include <string.h>
20*6467f958SSadaf Ebrahimi #include <sys/types.h>
21*6467f958SSadaf Ebrahimi #include <sys/stat.h>
22*6467f958SSadaf Ebrahimi 
23*6467f958SSadaf Ebrahimi #include "procs.h"
24*6467f958SSadaf Ebrahimi #include "harness/testHarness.h"
25*6467f958SSadaf Ebrahimi #include "harness/errorHelpers.h"
26*6467f958SSadaf Ebrahimi #include "harness/conversions.h"
27*6467f958SSadaf Ebrahimi 
28*6467f958SSadaf Ebrahimi //--- the code for the kernel executables
29*6467f958SSadaf Ebrahimi static const char *write_kernel_code =
30*6467f958SSadaf Ebrahimi "\n"
31*6467f958SSadaf Ebrahimi "__kernel void test_write(__global unsigned char *src, write_only image2d_t dstimg)\n"
32*6467f958SSadaf Ebrahimi "{\n"
33*6467f958SSadaf Ebrahimi "    int            tid_x = get_global_id(0);\n"
34*6467f958SSadaf Ebrahimi "    int            tid_y = get_global_id(1);\n"
35*6467f958SSadaf Ebrahimi "    int            indx = tid_y * get_image_width(dstimg) + tid_x;\n"
36*6467f958SSadaf Ebrahimi "    float4         color;\n"
37*6467f958SSadaf Ebrahimi "\n"
38*6467f958SSadaf Ebrahimi "    indx *= 4;\n"
39*6467f958SSadaf Ebrahimi "    color = (float4)((float)src[indx+0], (float)src[indx+1], (float)src[indx+2], (float)src[indx+3]);\n"
40*6467f958SSadaf Ebrahimi "    color /= (float4)(255.0f, 255.0f, 255.0f, 255.0f);\n"
41*6467f958SSadaf Ebrahimi "    write_imagef(dstimg, (int2)(tid_x, tid_y), color);\n"
42*6467f958SSadaf Ebrahimi "\n"
43*6467f958SSadaf Ebrahimi "}\n";
44*6467f958SSadaf Ebrahimi 
45*6467f958SSadaf Ebrahimi 
46*6467f958SSadaf Ebrahimi //--- the verify functions
verify_subimage(unsigned char * src,unsigned char * dst,size_t srcx,size_t srcy,size_t dstx,size_t dsty,size_t subw,size_t subh,size_t pitch,size_t element_pitch)47*6467f958SSadaf Ebrahimi static int verify_subimage( unsigned char *src, unsigned char *dst, size_t srcx, size_t srcy,
48*6467f958SSadaf Ebrahimi                            size_t dstx, size_t dsty, size_t subw, size_t subh, size_t pitch, size_t element_pitch )
49*6467f958SSadaf Ebrahimi {
50*6467f958SSadaf Ebrahimi     size_t        i, j, k;
51*6467f958SSadaf Ebrahimi     size_t        srcj, dstj;
52*6467f958SSadaf Ebrahimi     size_t        srcLoc, dstLoc;
53*6467f958SSadaf Ebrahimi 
54*6467f958SSadaf Ebrahimi     for( j = 0; j < subh; j++ ){
55*6467f958SSadaf Ebrahimi         srcj = ( j + srcy ) * pitch * element_pitch;
56*6467f958SSadaf Ebrahimi         dstj = ( j + dsty ) * pitch * element_pitch;
57*6467f958SSadaf Ebrahimi         for( i = 0; i < subw; i++ ){
58*6467f958SSadaf Ebrahimi             srcLoc = srcj + ( i + srcx ) * element_pitch;
59*6467f958SSadaf Ebrahimi             dstLoc = dstj + ( i + dstx ) * element_pitch;
60*6467f958SSadaf Ebrahimi             for( k = 0; k < element_pitch; k++ ){    // test each channel
61*6467f958SSadaf Ebrahimi                 if( src[srcLoc+k] != dst[dstLoc+k] ){
62*6467f958SSadaf Ebrahimi                     return -1;
63*6467f958SSadaf Ebrahimi                 }
64*6467f958SSadaf Ebrahimi             }
65*6467f958SSadaf Ebrahimi         }
66*6467f958SSadaf Ebrahimi     }
67*6467f958SSadaf Ebrahimi 
68*6467f958SSadaf Ebrahimi     return 0;
69*6467f958SSadaf Ebrahimi }
70*6467f958SSadaf Ebrahimi 
71*6467f958SSadaf Ebrahimi 
verify_copy_array(int * inptr,int * outptr,int n)72*6467f958SSadaf Ebrahimi static int verify_copy_array( int *inptr, int *outptr, int n )
73*6467f958SSadaf Ebrahimi {
74*6467f958SSadaf Ebrahimi     int    i;
75*6467f958SSadaf Ebrahimi 
76*6467f958SSadaf Ebrahimi     for( i = 0; i < n; i++ ) {
77*6467f958SSadaf Ebrahimi         if( outptr[i] != inptr[i] )
78*6467f958SSadaf Ebrahimi             return -1;
79*6467f958SSadaf Ebrahimi     }
80*6467f958SSadaf Ebrahimi 
81*6467f958SSadaf Ebrahimi     return 0;
82*6467f958SSadaf Ebrahimi }
83*6467f958SSadaf Ebrahimi 
84*6467f958SSadaf Ebrahimi 
85*6467f958SSadaf Ebrahimi //----- helper functions
generate_image(int n,MTdata d)86*6467f958SSadaf Ebrahimi static cl_uchar *generate_image( int n, MTdata d )
87*6467f958SSadaf Ebrahimi {
88*6467f958SSadaf Ebrahimi     cl_uchar   *ptr = (cl_uchar *)malloc( n );
89*6467f958SSadaf Ebrahimi     int i;
90*6467f958SSadaf Ebrahimi 
91*6467f958SSadaf Ebrahimi     for( i = 0; i < n; i++ )
92*6467f958SSadaf Ebrahimi         ptr[i] = (cl_uchar)genrand_int32(d);
93*6467f958SSadaf Ebrahimi 
94*6467f958SSadaf Ebrahimi     return ptr;
95*6467f958SSadaf Ebrahimi }
96*6467f958SSadaf Ebrahimi 
97*6467f958SSadaf Ebrahimi 
copy_size(cl_device_id device,cl_context context,cl_command_queue queue,int num_elements,MTdata d)98*6467f958SSadaf Ebrahimi static int copy_size( cl_device_id device, cl_context context, cl_command_queue queue, int num_elements, MTdata d )
99*6467f958SSadaf Ebrahimi {
100*6467f958SSadaf Ebrahimi     cl_mem                streams[2];
101*6467f958SSadaf Ebrahimi     cl_event            copyEvent;
102*6467f958SSadaf Ebrahimi     cl_ulong            queueStart, submitStart, writeStart, writeEnd;
103*6467f958SSadaf Ebrahimi     cl_int                *int_input_ptr, *int_output_ptr;
104*6467f958SSadaf Ebrahimi     int                    err = 0;
105*6467f958SSadaf Ebrahimi     int                    i;
106*6467f958SSadaf Ebrahimi 
107*6467f958SSadaf Ebrahimi     int_input_ptr = (cl_int*)malloc(sizeof(cl_int) * num_elements);
108*6467f958SSadaf Ebrahimi     int_output_ptr = (cl_int*)malloc(sizeof(cl_int) * num_elements);
109*6467f958SSadaf Ebrahimi 
110*6467f958SSadaf Ebrahimi     streams[0] = clCreateBuffer(context, CL_MEM_READ_WRITE,
111*6467f958SSadaf Ebrahimi                                 sizeof(cl_int) * num_elements, NULL, &err);
112*6467f958SSadaf Ebrahimi     if( !streams[0] ){
113*6467f958SSadaf Ebrahimi         log_error("clCreateBuffer failed\n");
114*6467f958SSadaf Ebrahimi         return -1;
115*6467f958SSadaf Ebrahimi     }
116*6467f958SSadaf Ebrahimi     streams[1] = clCreateBuffer(context, CL_MEM_READ_WRITE,
117*6467f958SSadaf Ebrahimi                                 sizeof(cl_int) * num_elements, NULL, &err);
118*6467f958SSadaf Ebrahimi     if( !streams[1] ){
119*6467f958SSadaf Ebrahimi         log_error("clCreateBuffer failed\n");
120*6467f958SSadaf Ebrahimi         return -1;
121*6467f958SSadaf Ebrahimi     }
122*6467f958SSadaf Ebrahimi 
123*6467f958SSadaf Ebrahimi     for (i=0; i<num_elements; i++){
124*6467f958SSadaf Ebrahimi         int_input_ptr[i] = (int)genrand_int32(d);
125*6467f958SSadaf Ebrahimi         int_output_ptr[i] = (int)genrand_int32(d) >> 30;    // seed with incorrect data
126*6467f958SSadaf Ebrahimi     }
127*6467f958SSadaf Ebrahimi 
128*6467f958SSadaf Ebrahimi     err = clEnqueueWriteBuffer( queue, streams[0], true, 0, sizeof(cl_int)*num_elements, (void *)int_input_ptr, 0, NULL, NULL );
129*6467f958SSadaf Ebrahimi     if( err != CL_SUCCESS ){
130*6467f958SSadaf Ebrahimi         print_error( err, "clWriteArray failed" );
131*6467f958SSadaf Ebrahimi         clReleaseMemObject( streams[0] );
132*6467f958SSadaf Ebrahimi         clReleaseMemObject( streams[1] );
133*6467f958SSadaf Ebrahimi         free( (void *)int_output_ptr );
134*6467f958SSadaf Ebrahimi         free( (void *)int_input_ptr );
135*6467f958SSadaf Ebrahimi         return -1;
136*6467f958SSadaf Ebrahimi     }
137*6467f958SSadaf Ebrahimi 
138*6467f958SSadaf Ebrahimi     err = clEnqueueCopyBuffer( queue, streams[0], streams[1], 0, 0, sizeof(cl_int)*num_elements, 0, NULL, &copyEvent );
139*6467f958SSadaf Ebrahimi     if( err != CL_SUCCESS ){
140*6467f958SSadaf Ebrahimi         print_error( err, "clCopyArray failed" );
141*6467f958SSadaf Ebrahimi         clReleaseMemObject( streams[0] );
142*6467f958SSadaf Ebrahimi         clReleaseMemObject( streams[1] );
143*6467f958SSadaf Ebrahimi         free( (void *)int_output_ptr );
144*6467f958SSadaf Ebrahimi         free( (void *)int_input_ptr );
145*6467f958SSadaf Ebrahimi         return -1;
146*6467f958SSadaf Ebrahimi     }
147*6467f958SSadaf Ebrahimi 
148*6467f958SSadaf Ebrahimi     // This synchronization point is needed in order to assume the data is valid.
149*6467f958SSadaf Ebrahimi     // Getting profiling information is not a synchronization point.
150*6467f958SSadaf Ebrahimi     err = clWaitForEvents( 1, &copyEvent );
151*6467f958SSadaf Ebrahimi     if( err != CL_SUCCESS )
152*6467f958SSadaf Ebrahimi     {
153*6467f958SSadaf Ebrahimi         clReleaseEvent(copyEvent);
154*6467f958SSadaf Ebrahimi         clReleaseMemObject( streams[0] );
155*6467f958SSadaf Ebrahimi         clReleaseMemObject( streams[1] );
156*6467f958SSadaf Ebrahimi         free( (void *)int_output_ptr );
157*6467f958SSadaf Ebrahimi         free( (void *)int_input_ptr );
158*6467f958SSadaf Ebrahimi         return -1;
159*6467f958SSadaf Ebrahimi     }
160*6467f958SSadaf Ebrahimi 
161*6467f958SSadaf Ebrahimi     // test profiling
162*6467f958SSadaf Ebrahimi     while( ( err = clGetEventProfilingInfo( copyEvent, CL_PROFILING_COMMAND_QUEUED, sizeof( cl_ulong ), &queueStart, NULL ) ) ==
163*6467f958SSadaf Ebrahimi           CL_PROFILING_INFO_NOT_AVAILABLE );
164*6467f958SSadaf Ebrahimi     if( err != CL_SUCCESS ){
165*6467f958SSadaf Ebrahimi         print_error( err, "clGetEventProfilingInfo failed" );
166*6467f958SSadaf Ebrahimi         clReleaseEvent(copyEvent);
167*6467f958SSadaf Ebrahimi         clReleaseMemObject( streams[0] );
168*6467f958SSadaf Ebrahimi         clReleaseMemObject( streams[1] );
169*6467f958SSadaf Ebrahimi         free( (void *)int_output_ptr );
170*6467f958SSadaf Ebrahimi         free( (void *)int_input_ptr );
171*6467f958SSadaf Ebrahimi         return -1;
172*6467f958SSadaf Ebrahimi     }
173*6467f958SSadaf Ebrahimi 
174*6467f958SSadaf Ebrahimi     while( ( err = clGetEventProfilingInfo( copyEvent, CL_PROFILING_COMMAND_SUBMIT, sizeof( cl_ulong ), &submitStart, NULL ) ) ==
175*6467f958SSadaf Ebrahimi           CL_PROFILING_INFO_NOT_AVAILABLE );
176*6467f958SSadaf Ebrahimi     if( err != CL_SUCCESS ){
177*6467f958SSadaf Ebrahimi         print_error( err, "clGetEventProfilingInfo failed" );
178*6467f958SSadaf Ebrahimi         clReleaseEvent(copyEvent);
179*6467f958SSadaf Ebrahimi         clReleaseMemObject( streams[0] );
180*6467f958SSadaf Ebrahimi         clReleaseMemObject( streams[1] );
181*6467f958SSadaf Ebrahimi         free( (void *)int_output_ptr );
182*6467f958SSadaf Ebrahimi         free( (void *)int_input_ptr );
183*6467f958SSadaf Ebrahimi         return -1;
184*6467f958SSadaf Ebrahimi     }
185*6467f958SSadaf Ebrahimi 
186*6467f958SSadaf Ebrahimi     err = clGetEventProfilingInfo( copyEvent, CL_PROFILING_COMMAND_START, sizeof( cl_ulong ), &writeStart, NULL );
187*6467f958SSadaf Ebrahimi     if( err != CL_SUCCESS ){
188*6467f958SSadaf Ebrahimi         print_error( err, "clGetEventProfilingInfo failed" );
189*6467f958SSadaf Ebrahimi         clReleaseEvent(copyEvent);
190*6467f958SSadaf Ebrahimi         clReleaseMemObject( streams[0] );
191*6467f958SSadaf Ebrahimi         clReleaseMemObject( streams[1] );
192*6467f958SSadaf Ebrahimi         free( (void *)int_output_ptr );
193*6467f958SSadaf Ebrahimi         free( (void *)int_input_ptr );
194*6467f958SSadaf Ebrahimi         return -1;
195*6467f958SSadaf Ebrahimi     }
196*6467f958SSadaf Ebrahimi 
197*6467f958SSadaf Ebrahimi     err = clGetEventProfilingInfo( copyEvent, CL_PROFILING_COMMAND_END, sizeof( cl_ulong ), &writeEnd, NULL );
198*6467f958SSadaf Ebrahimi     if( err != CL_SUCCESS ){
199*6467f958SSadaf Ebrahimi         print_error( err, "clGetEventProfilingInfo failed" );
200*6467f958SSadaf Ebrahimi         clReleaseEvent(copyEvent);
201*6467f958SSadaf Ebrahimi         clReleaseMemObject( streams[0] );
202*6467f958SSadaf Ebrahimi         clReleaseMemObject( streams[1] );
203*6467f958SSadaf Ebrahimi         free( (void *)int_output_ptr );
204*6467f958SSadaf Ebrahimi         free( (void *)int_input_ptr );
205*6467f958SSadaf Ebrahimi         return -1;
206*6467f958SSadaf Ebrahimi     }
207*6467f958SSadaf Ebrahimi 
208*6467f958SSadaf Ebrahimi     err = clEnqueueReadBuffer( queue, streams[1], true, 0, sizeof(cl_int)*num_elements, (void *)int_output_ptr, 0, NULL, NULL );
209*6467f958SSadaf Ebrahimi     if( err != CL_SUCCESS ){
210*6467f958SSadaf Ebrahimi         print_error( err, "clEnqueueReadBuffer failed" );
211*6467f958SSadaf Ebrahimi         clReleaseEvent(copyEvent);
212*6467f958SSadaf Ebrahimi         clReleaseMemObject( streams[0] );
213*6467f958SSadaf Ebrahimi         clReleaseMemObject( streams[1] );
214*6467f958SSadaf Ebrahimi         free( (void *)int_output_ptr );
215*6467f958SSadaf Ebrahimi         free( (void *)int_input_ptr );
216*6467f958SSadaf Ebrahimi         return -1;
217*6467f958SSadaf Ebrahimi     }
218*6467f958SSadaf Ebrahimi 
219*6467f958SSadaf Ebrahimi     if( verify_copy_array(int_input_ptr, int_output_ptr, num_elements) ){
220*6467f958SSadaf Ebrahimi         log_error( "test failed\n" );
221*6467f958SSadaf Ebrahimi         err = -1;
222*6467f958SSadaf Ebrahimi     }
223*6467f958SSadaf Ebrahimi     else{
224*6467f958SSadaf Ebrahimi         log_info( "test passed\n" );
225*6467f958SSadaf Ebrahimi         err = 0;
226*6467f958SSadaf Ebrahimi     }
227*6467f958SSadaf Ebrahimi 
228*6467f958SSadaf Ebrahimi     // cleanup
229*6467f958SSadaf Ebrahimi     clReleaseEvent(copyEvent);
230*6467f958SSadaf Ebrahimi     clReleaseMemObject( streams[0] );
231*6467f958SSadaf Ebrahimi     clReleaseMemObject( streams[1] );
232*6467f958SSadaf Ebrahimi     free( (void *)int_output_ptr );
233*6467f958SSadaf Ebrahimi     free( (void *)int_input_ptr );
234*6467f958SSadaf Ebrahimi 
235*6467f958SSadaf Ebrahimi     if (check_times(queueStart, submitStart, writeStart, writeEnd, device))
236*6467f958SSadaf Ebrahimi         err = -1;
237*6467f958SSadaf Ebrahimi 
238*6467f958SSadaf Ebrahimi     return err;
239*6467f958SSadaf Ebrahimi 
240*6467f958SSadaf Ebrahimi }    // end copy_size()
241*6467f958SSadaf Ebrahimi 
242*6467f958SSadaf Ebrahimi 
copy_partial_size(cl_device_id device,cl_context context,cl_command_queue queue,int num_elements,cl_uint srcStart,cl_uint dstStart,int size,MTdata d)243*6467f958SSadaf Ebrahimi static int copy_partial_size( cl_device_id device, cl_context context, cl_command_queue queue, int num_elements, cl_uint srcStart, cl_uint dstStart, int size, MTdata d )
244*6467f958SSadaf Ebrahimi {
245*6467f958SSadaf Ebrahimi     cl_mem                streams[2];
246*6467f958SSadaf Ebrahimi     cl_event            copyEvent;
247*6467f958SSadaf Ebrahimi     cl_ulong            queueStart, submitStart, writeStart, writeEnd;
248*6467f958SSadaf Ebrahimi     cl_int                *inptr, *outptr;
249*6467f958SSadaf Ebrahimi     int                    err = 0;
250*6467f958SSadaf Ebrahimi     int                    i;
251*6467f958SSadaf Ebrahimi 
252*6467f958SSadaf Ebrahimi     inptr = (cl_int *)malloc(sizeof(cl_int) * num_elements);
253*6467f958SSadaf Ebrahimi     outptr = (cl_int *)malloc(sizeof(cl_int) * num_elements);
254*6467f958SSadaf Ebrahimi 
255*6467f958SSadaf Ebrahimi     streams[0] = clCreateBuffer(context, CL_MEM_READ_WRITE,
256*6467f958SSadaf Ebrahimi                                 sizeof(cl_int) * num_elements, NULL, &err);
257*6467f958SSadaf Ebrahimi     if (!streams[0])
258*6467f958SSadaf Ebrahimi     {
259*6467f958SSadaf Ebrahimi         log_error("clCreateBuffer failed\n");
260*6467f958SSadaf Ebrahimi         return -1;
261*6467f958SSadaf Ebrahimi     }
262*6467f958SSadaf Ebrahimi     streams[1] = clCreateBuffer(context, CL_MEM_READ_WRITE,
263*6467f958SSadaf Ebrahimi                                 sizeof(cl_int) * num_elements, NULL, &err);
264*6467f958SSadaf Ebrahimi     if (!streams[1])
265*6467f958SSadaf Ebrahimi     {
266*6467f958SSadaf Ebrahimi         log_error("clCreateBuffer failed\n");
267*6467f958SSadaf Ebrahimi         return -1;
268*6467f958SSadaf Ebrahimi     }
269*6467f958SSadaf Ebrahimi 
270*6467f958SSadaf Ebrahimi     for (i=0; i<num_elements; i++){
271*6467f958SSadaf Ebrahimi         inptr[i] = (int)genrand_int32(d);
272*6467f958SSadaf Ebrahimi         outptr[i] = (int)get_random_float( -1.f, 1.f, d );    // seed with incorrect data
273*6467f958SSadaf Ebrahimi     }
274*6467f958SSadaf Ebrahimi 
275*6467f958SSadaf Ebrahimi     err = clEnqueueWriteBuffer(queue, streams[0], true, 0, sizeof(cl_int)*num_elements, (void *)inptr, 0, NULL, NULL);
276*6467f958SSadaf Ebrahimi     if (err != CL_SUCCESS)
277*6467f958SSadaf Ebrahimi     {
278*6467f958SSadaf Ebrahimi         log_error("clWriteArray failed\n");
279*6467f958SSadaf Ebrahimi         return -1;
280*6467f958SSadaf Ebrahimi     }
281*6467f958SSadaf Ebrahimi 
282*6467f958SSadaf Ebrahimi     err = clEnqueueCopyBuffer( queue, streams[0], streams[1], srcStart*sizeof(cl_int), dstStart*sizeof(cl_int),
283*6467f958SSadaf Ebrahimi                        sizeof(cl_int)*size, 0, NULL, &copyEvent );
284*6467f958SSadaf Ebrahimi     if( err != CL_SUCCESS){
285*6467f958SSadaf Ebrahimi         print_error( err, "clCopyArray failed" );
286*6467f958SSadaf Ebrahimi         clReleaseMemObject( streams[0] );
287*6467f958SSadaf Ebrahimi         clReleaseMemObject( streams[1] );
288*6467f958SSadaf Ebrahimi         free( outptr );
289*6467f958SSadaf Ebrahimi         free( inptr );
290*6467f958SSadaf Ebrahimi         return -1;
291*6467f958SSadaf Ebrahimi     }
292*6467f958SSadaf Ebrahimi 
293*6467f958SSadaf Ebrahimi     // This synchronization point is needed in order to assume the data is valid.
294*6467f958SSadaf Ebrahimi     // Getting profiling information is not a synchronization point.
295*6467f958SSadaf Ebrahimi     err = clWaitForEvents( 1, &copyEvent );
296*6467f958SSadaf Ebrahimi     if( err != CL_SUCCESS )
297*6467f958SSadaf Ebrahimi     {
298*6467f958SSadaf Ebrahimi         clReleaseEvent(copyEvent);
299*6467f958SSadaf Ebrahimi         clReleaseMemObject( streams[0] );
300*6467f958SSadaf Ebrahimi         clReleaseMemObject( streams[1] );
301*6467f958SSadaf Ebrahimi         free( outptr );
302*6467f958SSadaf Ebrahimi         free( inptr );
303*6467f958SSadaf Ebrahimi         return -1;
304*6467f958SSadaf Ebrahimi     }
305*6467f958SSadaf Ebrahimi 
306*6467f958SSadaf Ebrahimi     // test profiling
307*6467f958SSadaf Ebrahimi     while( ( err = clGetEventProfilingInfo( copyEvent, CL_PROFILING_COMMAND_QUEUED, sizeof( cl_ulong ), &queueStart, NULL ) ) ==
308*6467f958SSadaf Ebrahimi           CL_PROFILING_INFO_NOT_AVAILABLE );
309*6467f958SSadaf Ebrahimi     if( err != CL_SUCCESS ){
310*6467f958SSadaf Ebrahimi         print_error( err, "clGetEventProfilingInfo failed" );
311*6467f958SSadaf Ebrahimi         clReleaseEvent(copyEvent);
312*6467f958SSadaf Ebrahimi         clReleaseMemObject( streams[0] );
313*6467f958SSadaf Ebrahimi         clReleaseMemObject( streams[1] );
314*6467f958SSadaf Ebrahimi         free( outptr );
315*6467f958SSadaf Ebrahimi         free( inptr );
316*6467f958SSadaf Ebrahimi         return -1;
317*6467f958SSadaf Ebrahimi     }
318*6467f958SSadaf Ebrahimi 
319*6467f958SSadaf Ebrahimi     while( ( err = clGetEventProfilingInfo( copyEvent, CL_PROFILING_COMMAND_SUBMIT, sizeof( cl_ulong ), &submitStart, NULL ) ) ==
320*6467f958SSadaf Ebrahimi           CL_PROFILING_INFO_NOT_AVAILABLE );
321*6467f958SSadaf Ebrahimi     if( err != CL_SUCCESS ){
322*6467f958SSadaf Ebrahimi         print_error( err, "clGetEventProfilingInfo failed" );
323*6467f958SSadaf Ebrahimi         clReleaseEvent(copyEvent);
324*6467f958SSadaf Ebrahimi         clReleaseMemObject( streams[0] );
325*6467f958SSadaf Ebrahimi         clReleaseMemObject( streams[1] );
326*6467f958SSadaf Ebrahimi         free( outptr );
327*6467f958SSadaf Ebrahimi         free( inptr );
328*6467f958SSadaf Ebrahimi         return -1;
329*6467f958SSadaf Ebrahimi     }
330*6467f958SSadaf Ebrahimi 
331*6467f958SSadaf Ebrahimi 
332*6467f958SSadaf Ebrahimi     err = clGetEventProfilingInfo( copyEvent, CL_PROFILING_COMMAND_START, sizeof( cl_ulong ), &writeStart, NULL );
333*6467f958SSadaf Ebrahimi     if( err != CL_SUCCESS ){
334*6467f958SSadaf Ebrahimi         print_error( err, "clGetEventProfilingInfo failed" );
335*6467f958SSadaf Ebrahimi         clReleaseEvent(copyEvent);
336*6467f958SSadaf Ebrahimi         clReleaseMemObject( streams[0] );
337*6467f958SSadaf Ebrahimi         clReleaseMemObject( streams[1] );
338*6467f958SSadaf Ebrahimi         free( outptr );
339*6467f958SSadaf Ebrahimi         free( inptr );
340*6467f958SSadaf Ebrahimi         return -1;
341*6467f958SSadaf Ebrahimi     }
342*6467f958SSadaf Ebrahimi 
343*6467f958SSadaf Ebrahimi     err = clGetEventProfilingInfo( copyEvent, CL_PROFILING_COMMAND_END, sizeof( cl_ulong ), &writeEnd, NULL );
344*6467f958SSadaf Ebrahimi     if( err != CL_SUCCESS ){
345*6467f958SSadaf Ebrahimi         print_error( err, "clGetEventProfilingInfo failed" );
346*6467f958SSadaf Ebrahimi         clReleaseEvent(copyEvent);
347*6467f958SSadaf Ebrahimi         clReleaseMemObject( streams[0] );
348*6467f958SSadaf Ebrahimi         clReleaseMemObject( streams[1] );
349*6467f958SSadaf Ebrahimi         free( outptr );
350*6467f958SSadaf Ebrahimi         free( inptr );
351*6467f958SSadaf Ebrahimi         return -1;
352*6467f958SSadaf Ebrahimi     }
353*6467f958SSadaf Ebrahimi 
354*6467f958SSadaf Ebrahimi     err = clEnqueueReadBuffer( queue, streams[1], true, 0, sizeof(cl_int)*num_elements, (void *)outptr, 0, NULL, NULL );
355*6467f958SSadaf Ebrahimi     if( err != CL_SUCCESS){
356*6467f958SSadaf Ebrahimi         log_error("clReadVariableStream failed\n");
357*6467f958SSadaf Ebrahimi         return -1;
358*6467f958SSadaf Ebrahimi     }
359*6467f958SSadaf Ebrahimi 
360*6467f958SSadaf Ebrahimi     if( verify_copy_array(inptr + srcStart, outptr + dstStart, size) ){
361*6467f958SSadaf Ebrahimi         log_error("test failed\n");
362*6467f958SSadaf Ebrahimi         err = -1;
363*6467f958SSadaf Ebrahimi     }
364*6467f958SSadaf Ebrahimi     else{
365*6467f958SSadaf Ebrahimi         log_info("test passed\n");
366*6467f958SSadaf Ebrahimi         err = 0;
367*6467f958SSadaf Ebrahimi     }
368*6467f958SSadaf Ebrahimi 
369*6467f958SSadaf Ebrahimi     // cleanup
370*6467f958SSadaf Ebrahimi     clReleaseEvent(copyEvent);
371*6467f958SSadaf Ebrahimi     clReleaseMemObject(streams[0]);
372*6467f958SSadaf Ebrahimi     clReleaseMemObject(streams[1]);
373*6467f958SSadaf Ebrahimi     free(outptr);
374*6467f958SSadaf Ebrahimi     free(inptr);
375*6467f958SSadaf Ebrahimi 
376*6467f958SSadaf Ebrahimi     if (check_times(queueStart, submitStart, writeStart, writeEnd, device))
377*6467f958SSadaf Ebrahimi         err = -1;
378*6467f958SSadaf Ebrahimi 
379*6467f958SSadaf Ebrahimi     return err;
380*6467f958SSadaf Ebrahimi 
381*6467f958SSadaf Ebrahimi }    // end copy_partial_size()
382*6467f958SSadaf Ebrahimi 
383*6467f958SSadaf Ebrahimi 
test_copy_array(cl_device_id device,cl_context context,cl_command_queue queue,int num_elements)384*6467f958SSadaf Ebrahimi int test_copy_array( cl_device_id device, cl_context context, cl_command_queue queue, int num_elements )
385*6467f958SSadaf Ebrahimi {
386*6467f958SSadaf Ebrahimi     int        i, err = 0;
387*6467f958SSadaf Ebrahimi     int        size;
388*6467f958SSadaf Ebrahimi     MTdata  d = init_genrand( gRandomSeed );
389*6467f958SSadaf Ebrahimi 
390*6467f958SSadaf Ebrahimi     // test the preset size
391*6467f958SSadaf Ebrahimi     log_info( "set size: %d: ", num_elements );
392*6467f958SSadaf Ebrahimi     err = copy_size( device, context, queue, num_elements, d );
393*6467f958SSadaf Ebrahimi 
394*6467f958SSadaf Ebrahimi     // now test random sizes
395*6467f958SSadaf Ebrahimi     for( i = 0; i < 8; i++ ){
396*6467f958SSadaf Ebrahimi         size = (int)get_random_float(2.f,131072.f, d);
397*6467f958SSadaf Ebrahimi         log_info( "random size: %d: ", size );
398*6467f958SSadaf Ebrahimi         err |= copy_size( device, context, queue, size, d );
399*6467f958SSadaf Ebrahimi     }
400*6467f958SSadaf Ebrahimi 
401*6467f958SSadaf Ebrahimi     free_mtdata(d);
402*6467f958SSadaf Ebrahimi 
403*6467f958SSadaf Ebrahimi     return err;
404*6467f958SSadaf Ebrahimi 
405*6467f958SSadaf Ebrahimi }    // end copy_array()
406*6467f958SSadaf Ebrahimi 
407*6467f958SSadaf Ebrahimi 
test_copy_partial_array(cl_device_id device,cl_context context,cl_command_queue queue,int num_elements)408*6467f958SSadaf Ebrahimi int test_copy_partial_array( cl_device_id device, cl_context context, cl_command_queue queue, int num_elements )
409*6467f958SSadaf Ebrahimi {
410*6467f958SSadaf Ebrahimi     int        i, err = 0;
411*6467f958SSadaf Ebrahimi     int        size;
412*6467f958SSadaf Ebrahimi     cl_uint    srcStart, dstStart;
413*6467f958SSadaf Ebrahimi     MTdata  d = init_genrand( gRandomSeed );
414*6467f958SSadaf Ebrahimi 
415*6467f958SSadaf Ebrahimi     // now test copy of partial sizes
416*6467f958SSadaf Ebrahimi     for( i = 0; i < 8; i++ ){
417*6467f958SSadaf Ebrahimi         srcStart = (cl_uint)get_random_float( 0.f, (float)(num_elements - 8), d );
418*6467f958SSadaf Ebrahimi         size = (int)get_random_float( 8.f, (float)(num_elements - srcStart), d );
419*6467f958SSadaf Ebrahimi         dstStart = (cl_uint)get_random_float( 0.f, (float)(num_elements - size), d );
420*6467f958SSadaf Ebrahimi         log_info( "random partial copy from %d to %d, size: %d: ", (int)srcStart, (int)dstStart, size );
421*6467f958SSadaf Ebrahimi         err |= copy_partial_size( device, context, queue, num_elements, srcStart, dstStart, size, d );
422*6467f958SSadaf Ebrahimi     }
423*6467f958SSadaf Ebrahimi 
424*6467f958SSadaf Ebrahimi     free_mtdata(d);
425*6467f958SSadaf Ebrahimi     return err;
426*6467f958SSadaf Ebrahimi }    // end copy_partial_array()
427*6467f958SSadaf Ebrahimi 
428*6467f958SSadaf Ebrahimi 
copy_image_size(cl_device_id device,cl_context context,cl_command_queue queue,size_t srcx,size_t srcy,size_t dstx,size_t dsty,size_t subw,size_t subh,MTdata d)429*6467f958SSadaf Ebrahimi static int copy_image_size( cl_device_id device, cl_context context,
430*6467f958SSadaf Ebrahimi                                                         cl_command_queue queue, size_t srcx, size_t srcy,
431*6467f958SSadaf Ebrahimi                                                         size_t dstx, size_t dsty, size_t subw, size_t subh,
432*6467f958SSadaf Ebrahimi                                                         MTdata d )
433*6467f958SSadaf Ebrahimi {
434*6467f958SSadaf Ebrahimi     cl_mem                        memobjs[3];
435*6467f958SSadaf Ebrahimi     cl_program                program[1];
436*6467f958SSadaf Ebrahimi     cl_image_format        image_format_desc = { CL_RGBA, CL_UNORM_INT8 };
437*6467f958SSadaf Ebrahimi     cl_event                    copyEvent;
438*6467f958SSadaf Ebrahimi     cl_ulong                    queueStart, submitStart, writeStart, writeEnd;
439*6467f958SSadaf Ebrahimi     void                            *inptr;
440*6467f958SSadaf Ebrahimi     void                            *dst = NULL;
441*6467f958SSadaf Ebrahimi     cl_kernel                    kernel[1];
442*6467f958SSadaf Ebrahimi     size_t                        threads[2];
443*6467f958SSadaf Ebrahimi     int                                err = 0;
444*6467f958SSadaf Ebrahimi     cl_mem_flags            flags;
445*6467f958SSadaf Ebrahimi     unsigned int            num_channels = 4;
446*6467f958SSadaf Ebrahimi     size_t                        w = 256, h = 256;
447*6467f958SSadaf Ebrahimi     size_t                        element_nbytes;
448*6467f958SSadaf Ebrahimi     size_t                        num_bytes;
449*6467f958SSadaf Ebrahimi     size_t                        channel_nbytes = sizeof( cl_char );
450*6467f958SSadaf Ebrahimi 
451*6467f958SSadaf Ebrahimi 
452*6467f958SSadaf Ebrahimi     PASSIVE_REQUIRE_IMAGE_SUPPORT( device )
453*6467f958SSadaf Ebrahimi 
454*6467f958SSadaf Ebrahimi     element_nbytes = channel_nbytes * num_channels;
455*6467f958SSadaf Ebrahimi     num_bytes = w * h * element_nbytes;
456*6467f958SSadaf Ebrahimi 
457*6467f958SSadaf Ebrahimi     threads[0] = (size_t)w;
458*6467f958SSadaf Ebrahimi     threads[1] = (size_t)h;
459*6467f958SSadaf Ebrahimi 
460*6467f958SSadaf Ebrahimi     inptr = (void *)generate_image( (int)num_bytes, d );
461*6467f958SSadaf Ebrahimi     if( ! inptr ){
462*6467f958SSadaf Ebrahimi         log_error("unable to allocate inptr at %d x %d\n", (int)w, (int)h );
463*6467f958SSadaf Ebrahimi         return -1;
464*6467f958SSadaf Ebrahimi     }
465*6467f958SSadaf Ebrahimi 
466*6467f958SSadaf Ebrahimi     dst = malloc( num_bytes );
467*6467f958SSadaf Ebrahimi     if( ! dst ){
468*6467f958SSadaf Ebrahimi         free( (void *)inptr );
469*6467f958SSadaf Ebrahimi         log_error("unable to allocate dst at %d x %d\n", (int)w, (int)h );
470*6467f958SSadaf Ebrahimi         return -1;
471*6467f958SSadaf Ebrahimi     }
472*6467f958SSadaf Ebrahimi 
473*6467f958SSadaf Ebrahimi     // allocate the input image
474*6467f958SSadaf Ebrahimi     flags = CL_MEM_READ_WRITE;
475*6467f958SSadaf Ebrahimi     memobjs[0] = create_image_2d(context, flags, &image_format_desc, w, h, 0, NULL, &err);
476*6467f958SSadaf Ebrahimi     if( memobjs[0] == (cl_mem)0 ) {
477*6467f958SSadaf Ebrahimi         free( dst );
478*6467f958SSadaf Ebrahimi         free( (void *)inptr );
479*6467f958SSadaf Ebrahimi         log_error("unable to create Image2D\n");
480*6467f958SSadaf Ebrahimi         return -1;
481*6467f958SSadaf Ebrahimi     }
482*6467f958SSadaf Ebrahimi 
483*6467f958SSadaf Ebrahimi     memobjs[1] =
484*6467f958SSadaf Ebrahimi         clCreateBuffer(context, CL_MEM_READ_WRITE, num_bytes, NULL, &err);
485*6467f958SSadaf Ebrahimi     if( memobjs[1] == (cl_mem)0 ) {
486*6467f958SSadaf Ebrahimi         clReleaseMemObject(memobjs[0]);
487*6467f958SSadaf Ebrahimi         free( dst );
488*6467f958SSadaf Ebrahimi         free( (void *)inptr );
489*6467f958SSadaf Ebrahimi         log_error("unable to create array\n");
490*6467f958SSadaf Ebrahimi         return -1;
491*6467f958SSadaf Ebrahimi     }
492*6467f958SSadaf Ebrahimi 
493*6467f958SSadaf Ebrahimi     // allocate the input image
494*6467f958SSadaf Ebrahimi     memobjs[2] = create_image_2d(context, flags, &image_format_desc, w, h, 0, NULL, &err);
495*6467f958SSadaf Ebrahimi     if( memobjs[2] == (cl_mem)0 ) {
496*6467f958SSadaf Ebrahimi         clReleaseMemObject(memobjs[0]);
497*6467f958SSadaf Ebrahimi         clReleaseMemObject(memobjs[1]);
498*6467f958SSadaf Ebrahimi         free( dst );
499*6467f958SSadaf Ebrahimi         free( (void *)inptr );
500*6467f958SSadaf Ebrahimi         log_error("unable to create Image2D\n");
501*6467f958SSadaf Ebrahimi         return -1;
502*6467f958SSadaf Ebrahimi     }
503*6467f958SSadaf Ebrahimi 
504*6467f958SSadaf Ebrahimi     err = clEnqueueWriteBuffer( queue, memobjs[1], true, 0, num_bytes, inptr, 0, NULL, NULL );
505*6467f958SSadaf Ebrahimi     if( err != CL_SUCCESS ){
506*6467f958SSadaf Ebrahimi         log_error("clWriteArray failed\n");
507*6467f958SSadaf Ebrahimi         return -1;
508*6467f958SSadaf Ebrahimi     }
509*6467f958SSadaf Ebrahimi 
510*6467f958SSadaf Ebrahimi     err = create_single_kernel_helper( context, &program[0], &kernel[0], 1, &write_kernel_code, "test_write" );
511*6467f958SSadaf Ebrahimi     if( err ){
512*6467f958SSadaf Ebrahimi         clReleaseMemObject( memobjs[0] );
513*6467f958SSadaf Ebrahimi         clReleaseMemObject( memobjs[1] );
514*6467f958SSadaf Ebrahimi         clReleaseMemObject( memobjs[2] );
515*6467f958SSadaf Ebrahimi         free( dst );
516*6467f958SSadaf Ebrahimi         free( inptr );
517*6467f958SSadaf Ebrahimi         return -1;
518*6467f958SSadaf Ebrahimi     }
519*6467f958SSadaf Ebrahimi 
520*6467f958SSadaf Ebrahimi     err = clSetKernelArg( kernel[0], 0, sizeof( cl_mem ), (void *)&memobjs[1] );
521*6467f958SSadaf Ebrahimi     err |= clSetKernelArg( kernel[0], 1, sizeof( cl_mem ), (void *)&memobjs[0] );
522*6467f958SSadaf Ebrahimi     if (err != CL_SUCCESS){
523*6467f958SSadaf Ebrahimi         log_error("clSetKernelArg failed\n");
524*6467f958SSadaf Ebrahimi         clReleaseKernel( kernel[0] );
525*6467f958SSadaf Ebrahimi         clReleaseProgram( program[0] );
526*6467f958SSadaf Ebrahimi         clReleaseMemObject( memobjs[0] );
527*6467f958SSadaf Ebrahimi         clReleaseMemObject( memobjs[1] );
528*6467f958SSadaf Ebrahimi         clReleaseMemObject( memobjs[2] );
529*6467f958SSadaf Ebrahimi         free( dst );
530*6467f958SSadaf Ebrahimi         free( inptr );
531*6467f958SSadaf Ebrahimi         return -1;
532*6467f958SSadaf Ebrahimi     }
533*6467f958SSadaf Ebrahimi 
534*6467f958SSadaf Ebrahimi     err = clEnqueueNDRangeKernel( queue, kernel[0], 2, NULL, threads, NULL, 0, NULL, NULL );
535*6467f958SSadaf Ebrahimi 
536*6467f958SSadaf Ebrahimi     if (err != CL_SUCCESS){
537*6467f958SSadaf Ebrahimi         print_error( err, "clEnqueueNDRangeKernel failed" );
538*6467f958SSadaf Ebrahimi         clReleaseKernel( kernel[0] );
539*6467f958SSadaf Ebrahimi         clReleaseProgram( program[0] );
540*6467f958SSadaf Ebrahimi         clReleaseMemObject( memobjs[0] );
541*6467f958SSadaf Ebrahimi         clReleaseMemObject( memobjs[1] );
542*6467f958SSadaf Ebrahimi         clReleaseMemObject( memobjs[2] );
543*6467f958SSadaf Ebrahimi         free( dst );
544*6467f958SSadaf Ebrahimi         free( inptr );
545*6467f958SSadaf Ebrahimi         return -1;
546*6467f958SSadaf Ebrahimi     }
547*6467f958SSadaf Ebrahimi 
548*6467f958SSadaf Ebrahimi     // now do the copy
549*6467f958SSadaf Ebrahimi     size_t srcPt[3] = { srcx, srcy, 0 };
550*6467f958SSadaf Ebrahimi     size_t destPt[3] = { dstx, dsty, 0 };
551*6467f958SSadaf Ebrahimi     size_t region[3] = { subw, subh, 1 };
552*6467f958SSadaf Ebrahimi     err = clEnqueueCopyImage( queue, memobjs[0], memobjs[2], srcPt, destPt, region, 0, NULL, &copyEvent );
553*6467f958SSadaf Ebrahimi     if (err != CL_SUCCESS){
554*6467f958SSadaf Ebrahimi         print_error( err, "clCopyImage failed" );
555*6467f958SSadaf Ebrahimi         clReleaseKernel( kernel[0] );
556*6467f958SSadaf Ebrahimi         clReleaseProgram( program[0] );
557*6467f958SSadaf Ebrahimi         clReleaseMemObject( memobjs[0] );
558*6467f958SSadaf Ebrahimi         clReleaseMemObject( memobjs[1] );
559*6467f958SSadaf Ebrahimi         clReleaseMemObject( memobjs[2] );
560*6467f958SSadaf Ebrahimi         free( dst );
561*6467f958SSadaf Ebrahimi         free( inptr );
562*6467f958SSadaf Ebrahimi         return -1;
563*6467f958SSadaf Ebrahimi     }
564*6467f958SSadaf Ebrahimi 
565*6467f958SSadaf Ebrahimi     // This synchronization point is needed in order to assume the data is valid.
566*6467f958SSadaf Ebrahimi     // Getting profiling information is not a synchronization point.
567*6467f958SSadaf Ebrahimi     err = clWaitForEvents( 1, &copyEvent );
568*6467f958SSadaf Ebrahimi     if( err != CL_SUCCESS )
569*6467f958SSadaf Ebrahimi     {
570*6467f958SSadaf Ebrahimi         clReleaseEvent(copyEvent);
571*6467f958SSadaf Ebrahimi         clReleaseKernel( kernel[0] );
572*6467f958SSadaf Ebrahimi         clReleaseProgram( program[0] );
573*6467f958SSadaf Ebrahimi         clReleaseMemObject( memobjs[0] );
574*6467f958SSadaf Ebrahimi         clReleaseMemObject( memobjs[1] );
575*6467f958SSadaf Ebrahimi         clReleaseMemObject( memobjs[2] );
576*6467f958SSadaf Ebrahimi         free( dst );
577*6467f958SSadaf Ebrahimi         free( inptr );
578*6467f958SSadaf Ebrahimi         return -1;
579*6467f958SSadaf Ebrahimi     }
580*6467f958SSadaf Ebrahimi 
581*6467f958SSadaf Ebrahimi     // test profiling
582*6467f958SSadaf Ebrahimi     while( ( err = clGetEventProfilingInfo( copyEvent, CL_PROFILING_COMMAND_QUEUED, sizeof( cl_ulong ), &queueStart, NULL ) ) ==
583*6467f958SSadaf Ebrahimi           CL_PROFILING_INFO_NOT_AVAILABLE );
584*6467f958SSadaf Ebrahimi     if( err != CL_SUCCESS ){
585*6467f958SSadaf Ebrahimi         print_error( err, "clGetEventProfilingInfo failed" );
586*6467f958SSadaf Ebrahimi         clReleaseEvent(copyEvent);
587*6467f958SSadaf Ebrahimi         clReleaseKernel( kernel[0] );
588*6467f958SSadaf Ebrahimi         clReleaseProgram( program[0] );
589*6467f958SSadaf Ebrahimi         clReleaseMemObject( memobjs[0] );
590*6467f958SSadaf Ebrahimi         clReleaseMemObject( memobjs[1] );
591*6467f958SSadaf Ebrahimi         clReleaseMemObject( memobjs[2] );
592*6467f958SSadaf Ebrahimi         free( dst );
593*6467f958SSadaf Ebrahimi         free( inptr );
594*6467f958SSadaf Ebrahimi         return -1;
595*6467f958SSadaf Ebrahimi     }
596*6467f958SSadaf Ebrahimi 
597*6467f958SSadaf Ebrahimi     while( ( err = clGetEventProfilingInfo( copyEvent, CL_PROFILING_COMMAND_SUBMIT, sizeof( cl_ulong ), &submitStart, NULL ) ) ==
598*6467f958SSadaf Ebrahimi           CL_PROFILING_INFO_NOT_AVAILABLE );
599*6467f958SSadaf Ebrahimi     if( err != CL_SUCCESS ){
600*6467f958SSadaf Ebrahimi         print_error( err, "clGetEventProfilingInfo failed" );
601*6467f958SSadaf Ebrahimi         clReleaseEvent(copyEvent);
602*6467f958SSadaf Ebrahimi         clReleaseKernel( kernel[0] );
603*6467f958SSadaf Ebrahimi         clReleaseProgram( program[0] );
604*6467f958SSadaf Ebrahimi         clReleaseMemObject( memobjs[0] );
605*6467f958SSadaf Ebrahimi         clReleaseMemObject( memobjs[1] );
606*6467f958SSadaf Ebrahimi         clReleaseMemObject( memobjs[2] );
607*6467f958SSadaf Ebrahimi         free( dst );
608*6467f958SSadaf Ebrahimi         free( inptr );
609*6467f958SSadaf Ebrahimi         return -1;
610*6467f958SSadaf Ebrahimi     }
611*6467f958SSadaf Ebrahimi 
612*6467f958SSadaf Ebrahimi     err = clGetEventProfilingInfo( copyEvent, CL_PROFILING_COMMAND_START, sizeof( cl_ulong ), &writeStart, NULL );
613*6467f958SSadaf Ebrahimi     if( err != CL_SUCCESS ){
614*6467f958SSadaf Ebrahimi         print_error( err, "clGetEventProfilingInfo failed" );
615*6467f958SSadaf Ebrahimi         clReleaseEvent(copyEvent);
616*6467f958SSadaf Ebrahimi         clReleaseKernel( kernel[0] );
617*6467f958SSadaf Ebrahimi         clReleaseProgram( program[0] );
618*6467f958SSadaf Ebrahimi         clReleaseMemObject( memobjs[0] );
619*6467f958SSadaf Ebrahimi         clReleaseMemObject( memobjs[1] );
620*6467f958SSadaf Ebrahimi         clReleaseMemObject( memobjs[2] );
621*6467f958SSadaf Ebrahimi         free( dst );
622*6467f958SSadaf Ebrahimi         free( inptr );
623*6467f958SSadaf Ebrahimi         return -1;
624*6467f958SSadaf Ebrahimi     }
625*6467f958SSadaf Ebrahimi 
626*6467f958SSadaf Ebrahimi     err = clGetEventProfilingInfo( copyEvent, CL_PROFILING_COMMAND_END, sizeof( cl_ulong ), &writeEnd, NULL );
627*6467f958SSadaf Ebrahimi     if( err != CL_SUCCESS ){
628*6467f958SSadaf Ebrahimi         print_error( err, "clGetEventProfilingInfo failed" );
629*6467f958SSadaf Ebrahimi         clReleaseEvent(copyEvent);
630*6467f958SSadaf Ebrahimi         clReleaseKernel( kernel[0] );
631*6467f958SSadaf Ebrahimi         clReleaseProgram( program[0] );
632*6467f958SSadaf Ebrahimi         clReleaseMemObject( memobjs[0] );
633*6467f958SSadaf Ebrahimi         clReleaseMemObject( memobjs[1] );
634*6467f958SSadaf Ebrahimi         clReleaseMemObject( memobjs[2] );
635*6467f958SSadaf Ebrahimi         free( dst );
636*6467f958SSadaf Ebrahimi         free( inptr );
637*6467f958SSadaf Ebrahimi         return -1;
638*6467f958SSadaf Ebrahimi     }
639*6467f958SSadaf Ebrahimi 
640*6467f958SSadaf Ebrahimi     size_t origin[3] = { 0, 0, 0 };
641*6467f958SSadaf Ebrahimi     size_t region2[3] = { w, h, 1 };
642*6467f958SSadaf Ebrahimi     err = clEnqueueReadImage( queue, memobjs[2], true, origin, region2, 0, 0, dst, 0, NULL, NULL );
643*6467f958SSadaf Ebrahimi     if (err != CL_SUCCESS){
644*6467f958SSadaf Ebrahimi         print_error( err, "clReadImage failed" );
645*6467f958SSadaf Ebrahimi         clReleaseEvent(copyEvent);
646*6467f958SSadaf Ebrahimi         clReleaseKernel( kernel[0] );
647*6467f958SSadaf Ebrahimi         clReleaseProgram( program[0] );
648*6467f958SSadaf Ebrahimi         clReleaseMemObject( memobjs[0] );
649*6467f958SSadaf Ebrahimi         clReleaseMemObject( memobjs[1] );
650*6467f958SSadaf Ebrahimi         clReleaseMemObject( memobjs[2] );
651*6467f958SSadaf Ebrahimi         free( dst );
652*6467f958SSadaf Ebrahimi         free( inptr );
653*6467f958SSadaf Ebrahimi         return -1;
654*6467f958SSadaf Ebrahimi     }
655*6467f958SSadaf Ebrahimi 
656*6467f958SSadaf Ebrahimi     err = verify_subimage( (unsigned char *)inptr, (unsigned char *)dst, srcx, srcy,
657*6467f958SSadaf Ebrahimi                           dstx, dsty, subw, subh, w, 4 );
658*6467f958SSadaf Ebrahimi     //err = verify_image( (unsigned char *)inptr, (unsigned char *)dst, w * h * 4 );
659*6467f958SSadaf Ebrahimi     if( err ){
660*6467f958SSadaf Ebrahimi         log_error( "Image failed to verify.\n " );
661*6467f958SSadaf Ebrahimi     }
662*6467f958SSadaf Ebrahimi     else{
663*6467f958SSadaf Ebrahimi         log_info( "Image verified.\n" );
664*6467f958SSadaf Ebrahimi     }
665*6467f958SSadaf Ebrahimi 
666*6467f958SSadaf Ebrahimi     // cleanup
667*6467f958SSadaf Ebrahimi     clReleaseEvent(copyEvent);
668*6467f958SSadaf Ebrahimi     clReleaseKernel( kernel[0] );
669*6467f958SSadaf Ebrahimi     clReleaseProgram( program[0] );
670*6467f958SSadaf Ebrahimi     clReleaseMemObject( memobjs[0] );
671*6467f958SSadaf Ebrahimi     clReleaseMemObject( memobjs[1] );
672*6467f958SSadaf Ebrahimi     clReleaseMemObject( memobjs[2] );
673*6467f958SSadaf Ebrahimi     free( dst );
674*6467f958SSadaf Ebrahimi     free( inptr );
675*6467f958SSadaf Ebrahimi 
676*6467f958SSadaf Ebrahimi     if (check_times(queueStart, submitStart, writeStart, writeEnd, device))
677*6467f958SSadaf Ebrahimi         err = -1;
678*6467f958SSadaf Ebrahimi 
679*6467f958SSadaf Ebrahimi     return err;
680*6467f958SSadaf Ebrahimi 
681*6467f958SSadaf Ebrahimi }    // end copy_image_size()
682*6467f958SSadaf Ebrahimi 
683*6467f958SSadaf Ebrahimi 
test_copy_image(cl_device_id device,cl_context context,cl_command_queue queue,int num_elements)684*6467f958SSadaf Ebrahimi int test_copy_image( cl_device_id device, cl_context context, cl_command_queue queue, int num_elements )
685*6467f958SSadaf Ebrahimi {
686*6467f958SSadaf Ebrahimi     int            err = 0;
687*6467f958SSadaf Ebrahimi     int            i;
688*6467f958SSadaf Ebrahimi     size_t    srcx, srcy, dstx, dsty, subw, subh;
689*6467f958SSadaf Ebrahimi     MTdata    d;
690*6467f958SSadaf Ebrahimi 
691*6467f958SSadaf Ebrahimi     srcx = srcy = dstx = dsty = 0;
692*6467f958SSadaf Ebrahimi     subw = subh = 256;
693*6467f958SSadaf Ebrahimi 
694*6467f958SSadaf Ebrahimi     PASSIVE_REQUIRE_IMAGE_SUPPORT( device )
695*6467f958SSadaf Ebrahimi 
696*6467f958SSadaf Ebrahimi     d = init_genrand( gRandomSeed );
697*6467f958SSadaf Ebrahimi     err = copy_image_size( device, context, queue, srcx, srcy, dstx, dsty, subw, subh, d );
698*6467f958SSadaf Ebrahimi     if( err ){
699*6467f958SSadaf Ebrahimi         log_error( "testing copy image, full size\n" );
700*6467f958SSadaf Ebrahimi     }
701*6467f958SSadaf Ebrahimi     else{
702*6467f958SSadaf Ebrahimi         log_info( "testing copy image, full size\n" );
703*6467f958SSadaf Ebrahimi     }
704*6467f958SSadaf Ebrahimi 
705*6467f958SSadaf Ebrahimi     // now test random sub images
706*6467f958SSadaf Ebrahimi     srcx = srcy = 0;
707*6467f958SSadaf Ebrahimi     subw = subh = 16;
708*6467f958SSadaf Ebrahimi     dstx = dsty = 0;
709*6467f958SSadaf Ebrahimi     err = copy_image_size( device, context, queue, srcx, srcy, dstx, dsty, subw, subh, d );
710*6467f958SSadaf Ebrahimi     if( err ){
711*6467f958SSadaf Ebrahimi         log_error( "test copy of subimage size %d,%d  %d,%d  %d x %d\n", (int)srcx, (int)srcy,
712*6467f958SSadaf Ebrahimi                   (int)dstx, (int)dsty, (int)subw, (int)subh );
713*6467f958SSadaf Ebrahimi     }
714*6467f958SSadaf Ebrahimi     else{
715*6467f958SSadaf Ebrahimi         log_info( "test copy of subimage size %d,%d  %d,%d  %d x %d\n", (int)srcx, (int)srcy,
716*6467f958SSadaf Ebrahimi                  (int)dstx, (int)dsty, (int)subw, (int)subh );
717*6467f958SSadaf Ebrahimi     }
718*6467f958SSadaf Ebrahimi 
719*6467f958SSadaf Ebrahimi     srcx = srcy = 8;
720*6467f958SSadaf Ebrahimi     subw = subh = 16;
721*6467f958SSadaf Ebrahimi     dstx = dsty = 32;
722*6467f958SSadaf Ebrahimi     err = copy_image_size( device, context, queue, srcx, srcy, dstx, dsty, subw, subh, d );
723*6467f958SSadaf Ebrahimi     if( err ){
724*6467f958SSadaf Ebrahimi         log_error( "test copy of subimage size %d,%d  %d,%d  %d x %d\n", (int)srcx, (int)srcy,
725*6467f958SSadaf Ebrahimi                   (int)dstx, (int)dsty, (int)subw, (int)subh );
726*6467f958SSadaf Ebrahimi     }
727*6467f958SSadaf Ebrahimi     else{
728*6467f958SSadaf Ebrahimi         log_info( "test copy of subimage size %d,%d  %d,%d  %d x %d\n", (int)srcx, (int)srcy,
729*6467f958SSadaf Ebrahimi                  (int)dstx, (int)dsty, (int)subw, (int)subh );
730*6467f958SSadaf Ebrahimi     }
731*6467f958SSadaf Ebrahimi 
732*6467f958SSadaf Ebrahimi     for( i = 0; i < 16; i++ ) {
733*6467f958SSadaf Ebrahimi         srcx = (size_t)get_random_float( 0.f, 248.f, d );
734*6467f958SSadaf Ebrahimi         srcy = (size_t)get_random_float( 0.f, 248.f, d );
735*6467f958SSadaf Ebrahimi         subw = (size_t)get_random_float( 8.f, (float)(256 - srcx), d );
736*6467f958SSadaf Ebrahimi         subh = (size_t)get_random_float( 8.f, (float)(256 - srcy), d );
737*6467f958SSadaf Ebrahimi         dstx = (size_t)get_random_float( 0.f, (float)(256 - subw), d );
738*6467f958SSadaf Ebrahimi         dsty = (size_t)get_random_float( 0.f, (float)(256 - subh), d );
739*6467f958SSadaf Ebrahimi         err = copy_image_size( device, context, queue, srcx, srcy, dstx, dsty, subw, subh, d );
740*6467f958SSadaf Ebrahimi         if( err ){
741*6467f958SSadaf Ebrahimi             log_error( "test copy of subimage size %d,%d  %d,%d  %d x %d\n", (int)srcx, (int)srcy,
742*6467f958SSadaf Ebrahimi                       (int)dstx, (int)dsty, (int)subw, (int)subh );
743*6467f958SSadaf Ebrahimi         }
744*6467f958SSadaf Ebrahimi         else{
745*6467f958SSadaf Ebrahimi             log_info( "test copy of subimage size %d,%d  %d,%d  %d x %d\n", (int)srcx, (int)srcy,
746*6467f958SSadaf Ebrahimi                      (int)dstx, (int)dsty, (int)subw, (int)subh );
747*6467f958SSadaf Ebrahimi         }
748*6467f958SSadaf Ebrahimi     }
749*6467f958SSadaf Ebrahimi 
750*6467f958SSadaf Ebrahimi     free_mtdata(d);
751*6467f958SSadaf Ebrahimi 
752*6467f958SSadaf Ebrahimi     return err;
753*6467f958SSadaf Ebrahimi 
754*6467f958SSadaf Ebrahimi }    // end copy_image()
755*6467f958SSadaf Ebrahimi 
756*6467f958SSadaf Ebrahimi 
test_copy_array_to_image(cl_device_id device,cl_context context,cl_command_queue queue,int num_elements)757*6467f958SSadaf Ebrahimi int test_copy_array_to_image( cl_device_id device, cl_context context, cl_command_queue queue, int num_elements )
758*6467f958SSadaf Ebrahimi {
759*6467f958SSadaf Ebrahimi     cl_mem            memobjs[3];
760*6467f958SSadaf Ebrahimi     cl_image_format    image_format_desc = { CL_RGBA, CL_UNORM_INT8 };
761*6467f958SSadaf Ebrahimi     void            *inptr;
762*6467f958SSadaf Ebrahimi     void            *dst;
763*6467f958SSadaf Ebrahimi     int                err;
764*6467f958SSadaf Ebrahimi     cl_mem_flags    flags;
765*6467f958SSadaf Ebrahimi     unsigned int    num_channels = (unsigned int)get_format_channel_count( &image_format_desc );
766*6467f958SSadaf Ebrahimi     size_t            w = 256, h = 256;
767*6467f958SSadaf Ebrahimi     size_t            element_nbytes;
768*6467f958SSadaf Ebrahimi     size_t            num_bytes;
769*6467f958SSadaf Ebrahimi     size_t            channel_nbytes = sizeof( cl_char );
770*6467f958SSadaf Ebrahimi     MTdata          d;
771*6467f958SSadaf Ebrahimi 
772*6467f958SSadaf Ebrahimi     PASSIVE_REQUIRE_IMAGE_SUPPORT( device )
773*6467f958SSadaf Ebrahimi 
774*6467f958SSadaf Ebrahimi     element_nbytes = channel_nbytes * num_channels;
775*6467f958SSadaf Ebrahimi     num_bytes = w * h * element_nbytes;
776*6467f958SSadaf Ebrahimi     d = init_genrand( gRandomSeed );
777*6467f958SSadaf Ebrahimi     inptr = (void *)generate_image( (int)num_bytes, d );
778*6467f958SSadaf Ebrahimi     free_mtdata(d); d = NULL;
779*6467f958SSadaf Ebrahimi     if( ! inptr ){
780*6467f958SSadaf Ebrahimi         log_error("unable to allocate inptr at %d x %d\n", (int)w, (int)h );
781*6467f958SSadaf Ebrahimi         return -1;
782*6467f958SSadaf Ebrahimi     }
783*6467f958SSadaf Ebrahimi 
784*6467f958SSadaf Ebrahimi     dst = malloc( num_bytes );
785*6467f958SSadaf Ebrahimi     if( ! dst ){
786*6467f958SSadaf Ebrahimi         free( inptr );
787*6467f958SSadaf Ebrahimi         log_error( " unable to allocate dst at %d x %d\n", (int)w, (int)h );
788*6467f958SSadaf Ebrahimi         return -1;
789*6467f958SSadaf Ebrahimi     }
790*6467f958SSadaf Ebrahimi 
791*6467f958SSadaf Ebrahimi     // allocate the input image
792*6467f958SSadaf Ebrahimi     flags = CL_MEM_READ_WRITE;
793*6467f958SSadaf Ebrahimi     memobjs[0] = create_image_2d( context, flags, &image_format_desc, w, h, 0, NULL, &err );
794*6467f958SSadaf Ebrahimi     if( memobjs[0] == (cl_mem)0 ){
795*6467f958SSadaf Ebrahimi         free( dst );
796*6467f958SSadaf Ebrahimi         free( inptr );
797*6467f958SSadaf Ebrahimi         log_error( " unable to create Image2D\n" );
798*6467f958SSadaf Ebrahimi         return -1;
799*6467f958SSadaf Ebrahimi     }
800*6467f958SSadaf Ebrahimi 
801*6467f958SSadaf Ebrahimi     memobjs[1] =
802*6467f958SSadaf Ebrahimi         clCreateBuffer(context, CL_MEM_READ_WRITE,
803*6467f958SSadaf Ebrahimi                        channel_nbytes * num_channels * w * h, NULL, &err);
804*6467f958SSadaf Ebrahimi     if( memobjs[1] == (cl_mem)0 ) {
805*6467f958SSadaf Ebrahimi         clReleaseMemObject( memobjs[0] );
806*6467f958SSadaf Ebrahimi         free( dst );
807*6467f958SSadaf Ebrahimi         free( inptr );
808*6467f958SSadaf Ebrahimi         log_error( " unable to create array: " );
809*6467f958SSadaf Ebrahimi         return -1;
810*6467f958SSadaf Ebrahimi     }
811*6467f958SSadaf Ebrahimi 
812*6467f958SSadaf Ebrahimi     err = clEnqueueWriteBuffer( queue, memobjs[1], true, 0, num_bytes, (const void *)inptr, 0, NULL, NULL );
813*6467f958SSadaf Ebrahimi     if( err != CL_SUCCESS ){
814*6467f958SSadaf Ebrahimi         print_error( err, "clWriteArray failed" );
815*6467f958SSadaf Ebrahimi         clReleaseMemObject( memobjs[1] );
816*6467f958SSadaf Ebrahimi         clReleaseMemObject( memobjs[0] );
817*6467f958SSadaf Ebrahimi         free( dst );
818*6467f958SSadaf Ebrahimi         free( inptr );
819*6467f958SSadaf Ebrahimi         return -1;
820*6467f958SSadaf Ebrahimi     }
821*6467f958SSadaf Ebrahimi 
822*6467f958SSadaf Ebrahimi     size_t origin[3] = { 0, 0, 0 };
823*6467f958SSadaf Ebrahimi     size_t region[3] = { w, h, 1 };
824*6467f958SSadaf Ebrahimi     err = clEnqueueCopyBufferToImage( queue, memobjs[1], memobjs[0], 0, origin, region, 0, NULL, NULL );
825*6467f958SSadaf Ebrahimi     if( err != CL_SUCCESS ){
826*6467f958SSadaf Ebrahimi         print_error( err, "clCopyArrayToImage failed" );
827*6467f958SSadaf Ebrahimi         clReleaseMemObject( memobjs[1] );
828*6467f958SSadaf Ebrahimi         clReleaseMemObject( memobjs[0] );
829*6467f958SSadaf Ebrahimi         free( dst );
830*6467f958SSadaf Ebrahimi         free( inptr );
831*6467f958SSadaf Ebrahimi         return -1;
832*6467f958SSadaf Ebrahimi     }
833*6467f958SSadaf Ebrahimi 
834*6467f958SSadaf Ebrahimi     err = clEnqueueReadImage( queue, memobjs[0], true, origin, region, 0, 0, dst, 0, NULL, NULL );
835*6467f958SSadaf Ebrahimi     if( err != CL_SUCCESS ){
836*6467f958SSadaf Ebrahimi         print_error( err, "clReadImage failed" );
837*6467f958SSadaf Ebrahimi         clReleaseMemObject( memobjs[1] );
838*6467f958SSadaf Ebrahimi         clReleaseMemObject( memobjs[0] );
839*6467f958SSadaf Ebrahimi         free( dst );
840*6467f958SSadaf Ebrahimi         free( inptr );
841*6467f958SSadaf Ebrahimi         return -1;
842*6467f958SSadaf Ebrahimi     }
843*6467f958SSadaf Ebrahimi 
844*6467f958SSadaf Ebrahimi     err = verify_subimage( (cl_uchar *)inptr, (cl_uchar *)dst, 0, 0, 0, 0, w, h, w, num_channels );
845*6467f958SSadaf Ebrahimi     if( err ){
846*6467f958SSadaf Ebrahimi         log_error( " test failed: " );
847*6467f958SSadaf Ebrahimi     }
848*6467f958SSadaf Ebrahimi     else{
849*6467f958SSadaf Ebrahimi         log_info( " test passed: " );
850*6467f958SSadaf Ebrahimi     }
851*6467f958SSadaf Ebrahimi 
852*6467f958SSadaf Ebrahimi     // cleanup
853*6467f958SSadaf Ebrahimi     clReleaseMemObject( memobjs[1] );
854*6467f958SSadaf Ebrahimi     clReleaseMemObject( memobjs[0] );
855*6467f958SSadaf Ebrahimi     free( dst );
856*6467f958SSadaf Ebrahimi     free( inptr );
857*6467f958SSadaf Ebrahimi 
858*6467f958SSadaf Ebrahimi     return err;
859*6467f958SSadaf Ebrahimi 
860*6467f958SSadaf Ebrahimi }    // end copy_array_to_image()
861