# include  <string.h> 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  <assert.h> 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  "clutil.h" 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  "rgb_to_yuv.h" 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								void  rgb_to_yuv_init ( RGBToYUVState *  s ,  cl_context  ctx ,  cl_device_id  device_id ,  int  width ,  int  height ,  int  rgb_stride )  { 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  int  err  =  0 ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  memset ( s ,  0 ,  sizeof ( * s ) ) ; 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								  printf ( " width %d, height %d, rgb_stride %d \n " ,  width ,  height ,  rgb_stride ) ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  assert ( width  %  2  = =  0 ) ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  assert ( height  %  2  = =  0 ) ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  s - > width  =  width ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  s - > height  =  height ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  char  args [ 1024 ] ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  snprintf ( args ,  sizeof ( args ) , 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								           " -cl-fast-relaxed-math -cl-denorms-are-zero  " 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# ifdef CL_DEBUG 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								           " -DCL_DEBUG  " 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								           " -DWIDTH=%d -DHEIGHT=%d -DUV_WIDTH=%d -DUV_HEIGHT=%d -DRGB_STRIDE=%d -DRGB_SIZE=%d " , 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								           width ,  height ,  width /  2 ,  height  /  2 ,  rgb_stride ,  width  *  height ) ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  cl_program  prg  =  CLU_LOAD_FROM_FILE ( ctx ,  device_id ,  " transforms/rgb_to_yuv.cl " ,  args ) ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  s - > rgb_to_yuv_krnl  =  clCreateKernel ( prg ,  " rgb_to_yuv " ,  & err ) ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  assert ( err  = =  0 ) ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  // done with this
   
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  err  =  clReleaseProgram ( prg ) ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  assert ( err  = =  0 ) ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								} 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								void  rgb_to_yuv_destroy ( RGBToYUVState *  s )  { 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  int  err  =  0 ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  err  =  clReleaseKernel ( s - > rgb_to_yuv_krnl ) ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  assert ( err  = =  0 ) ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								} 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								void  rgb_to_yuv_queue ( RGBToYUVState *  s ,  cl_command_queue  q ,  cl_mem  rgb_cl ,  cl_mem  yuv_cl )  { 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  int  err  =  0 ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  err  =  clSetKernelArg ( s - > rgb_to_yuv_krnl ,  0 ,  sizeof ( cl_mem ) ,  & rgb_cl ) ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  assert ( err  = =  0 ) ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  err  =  clSetKernelArg ( s - > rgb_to_yuv_krnl ,  1 ,  sizeof ( cl_mem ) ,  & yuv_cl ) ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  assert ( err  = =  0 ) ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  const  size_t  work_size [ 2 ]  =  { 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								    ( size_t ) ( s - > width  +  ( s - > width  %  4  = =  0  ?  0  :  ( 4  -  s - > width  %  4 ) ) )  /  4 , 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    ( size_t ) ( s - > height  +  ( s - > height  %  4  = =  0  ?  0  :  ( 4  -  s - > height  %  4 ) ) )  /  4 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  } ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  cl_event  event ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  err  =  clEnqueueNDRangeKernel ( q ,  s - > rgb_to_yuv_krnl ,  2 ,  NULL ,  & work_size [ 0 ] ,  NULL ,  0 ,  0 ,  & event ) ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  assert ( err  = =  0 ) ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  clWaitForEvents ( 1 ,  & event ) ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  clReleaseEvent ( event ) ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}