1 /* 2 * test-binary-kernel.cpp - Compile the source kernel into binary kernel 3 * 4 * Copyright (c) 2015 Intel Corporation 5 * 6 * Licensed under the Apache License, Version 2.0 (the "License"); 7 * you may not use this file except in compliance with the License. 8 * You may obtain a copy of the License at 9 * 10 * http://www.apache.org/licenses/LICENSE-2.0 11 * 12 * Unless required by applicable law or agreed to in writing, software 13 * distributed under the License is distributed on an "AS IS" BASIS, 14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 15 * See the License for the specific language governing permissions and 16 * limitations under the License. 17 * 18 * Author: Yinhang Liu <yinhangx.liu (at) intel.com> 19 */ 20 21 #include "test_common.h" 22 #include "test_inline.h" 23 #include "file_handle.h" 24 #include "ocl/cl_device.h" 25 #include "ocl/cl_context.h" 26 #include "ocl/cl_kernel.h" 27 #include <getopt.h> 28 29 using namespace XCam; 30 31 static void 32 print_help (const char *arg0) 33 { 34 printf ("Usage: %s --src-kernel <source-kernel> --bin-kernel <binary-kernel> --kernel-name <kernel-name>\n" 35 "\t --src-kernel specify source kernel path\n" 36 "\t --bin-kernel specify binary kernel path\n" 37 "\t --kernel-name specify kernel name\n" 38 "\t --help help\n" 39 , arg0); 40 } 41 42 #define FAILED_STATEMENT { \ 43 if (kernel_body) xcam_free (kernel_body); \ 44 if (kernel_name) xcam_free (kernel_name); \ 45 if (program_binaries) xcam_free (program_binaries); \ 46 return -1; } 47 48 int main (int argc, char *argv[]) 49 { 50 char *src_path = NULL, *bin_path = NULL; 51 size_t src_size = 0; 52 size_t bin_size = 0; 53 char *kernel_name = NULL; 54 char *kernel_body = NULL; 55 uint8_t *program_binaries = NULL; 56 FileHandle src_file, bin_file; 57 XCamReturn ret = XCAM_RETURN_NO_ERROR; 58 59 const struct option long_opts [] = { 60 {"src-kernel", required_argument, NULL, 's'}, 61 {"bin-kernel", required_argument, NULL, 'b'}, 62 {"kernel-name", required_argument, NULL, 'n'}, 63 {"help", no_argument, NULL, 'h'}, 64 {NULL, 0, NULL, 0} 65 }; 66 67 int opt = 0; 68 while ((opt = getopt_long (argc, argv, "", long_opts, NULL)) != -1) { 69 switch (opt) { 70 case 's': 71 src_path = optarg; 72 break; 73 case 'b': 74 bin_path = optarg; 75 break; 76 case 'n': 77 kernel_name = strndup (optarg, 1024); 78 break; 79 case 'h': 80 print_help (argv[0]); 81 return 0; 82 83 default: 84 print_help (argv[0]); 85 return -1; 86 } 87 } 88 89 if (!src_path || !bin_path) { 90 XCAM_LOG_ERROR ("path of source/binary kernel is null"); 91 return -1; 92 } 93 if (!kernel_name) { 94 XCAM_LOG_ERROR ("kernel name is null"); 95 return -1; 96 } 97 98 if (src_file.open (src_path, "r") != XCAM_RETURN_NO_ERROR || 99 bin_file.open (bin_path, "wb") != XCAM_RETURN_NO_ERROR) { 100 XCAM_LOG_ERROR ("open source/binary kernel failed"); 101 return -1; 102 } 103 104 ret = src_file.get_file_size (src_size); 105 CHECK_STATEMENT (ret, FAILED_STATEMENT, "get source sizes from %s failed", src_path); 106 107 kernel_body = (char *) xcam_malloc0 (sizeof (char) * (src_size + 1)); 108 XCAM_ASSERT(kernel_body); 109 110 src_file.read_file (kernel_body, src_size); 111 CHECK_STATEMENT (ret, FAILED_STATEMENT, "read source from %s failed", src_path); 112 kernel_body[src_size] = '\0'; 113 114 SmartPtr<CLContext> context; 115 context = CLDevice::instance ()->get_context (); 116 SmartPtr<CLKernel> kernel = new CLKernel (context, kernel_name); 117 kernel->load_from_source (kernel_body, strlen (kernel_body), &program_binaries, &bin_size); 118 119 ret = bin_file.write_file (program_binaries, bin_size); 120 CHECK_STATEMENT (ret, FAILED_STATEMENT, "write binary to %s failed", bin_path); 121 122 xcam_free (kernel_name); 123 xcam_free (kernel_body); 124 xcam_free (program_binaries); 125 return 0; 126 } 127