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, ©Event );
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, ©Event );
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, ©Event );
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, ©Event );
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, ©Event );
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, ©Event );
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