| /* |
| * test-binary-kernel.cpp - Compile the source kernel into binary kernel |
| * |
| * Copyright (c) 2015 Intel Corporation |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| * |
| * Author: Yinhang Liu <[email protected]> |
| */ |
| |
| #include "test_common.h" |
| #include "test_inline.h" |
| #include "file_handle.h" |
| #include "ocl/cl_device.h" |
| #include "ocl/cl_context.h" |
| #include "ocl/cl_kernel.h" |
| #include <getopt.h> |
| |
| using namespace XCam; |
| |
| static void |
| print_help (const char *arg0) |
| { |
| printf ("Usage: %s --src-kernel <source-kernel> --bin-kernel <binary-kernel> --kernel-name <kernel-name>\n" |
| "\t --src-kernel specify source kernel path\n" |
| "\t --bin-kernel specify binary kernel path\n" |
| "\t --kernel-name specify kernel name\n" |
| "\t --help help\n" |
| , arg0); |
| } |
| |
| #define FAILED_STATEMENT { \ |
| if (kernel_body) xcam_free (kernel_body); \ |
| if (kernel_name) xcam_free (kernel_name); \ |
| if (program_binaries) xcam_free (program_binaries); \ |
| return -1; } |
| |
| int main (int argc, char *argv[]) |
| { |
| char *src_path = NULL, *bin_path = NULL; |
| size_t src_size = 0; |
| size_t bin_size = 0; |
| char *kernel_name = NULL; |
| char *kernel_body = NULL; |
| uint8_t *program_binaries = NULL; |
| FileHandle src_file, bin_file; |
| XCamReturn ret = XCAM_RETURN_NO_ERROR; |
| |
| const struct option long_opts [] = { |
| {"src-kernel", required_argument, NULL, 's'}, |
| {"bin-kernel", required_argument, NULL, 'b'}, |
| {"kernel-name", required_argument, NULL, 'n'}, |
| {"help", no_argument, NULL, 'h'}, |
| {NULL, 0, NULL, 0} |
| }; |
| |
| int opt = 0; |
| while ((opt = getopt_long (argc, argv, "", long_opts, NULL)) != -1) { |
| switch (opt) { |
| case 's': |
| src_path = optarg; |
| break; |
| case 'b': |
| bin_path = optarg; |
| break; |
| case 'n': |
| kernel_name = strndup (optarg, 1024); |
| break; |
| case 'h': |
| print_help (argv[0]); |
| return 0; |
| |
| default: |
| print_help (argv[0]); |
| return -1; |
| } |
| } |
| |
| if (!src_path || !bin_path) { |
| XCAM_LOG_ERROR ("path of source/binary kernel is null"); |
| return -1; |
| } |
| if (!kernel_name) { |
| XCAM_LOG_ERROR ("kernel name is null"); |
| return -1; |
| } |
| |
| if (src_file.open (src_path, "r") != XCAM_RETURN_NO_ERROR || |
| bin_file.open (bin_path, "wb") != XCAM_RETURN_NO_ERROR) { |
| XCAM_LOG_ERROR ("open source/binary kernel failed"); |
| return -1; |
| } |
| |
| ret = src_file.get_file_size (src_size); |
| CHECK_STATEMENT (ret, FAILED_STATEMENT, "get source sizes from %s failed", src_path); |
| |
| kernel_body = (char *) xcam_malloc0 (sizeof (char) * (src_size + 1)); |
| XCAM_ASSERT(kernel_body); |
| |
| src_file.read_file (kernel_body, src_size); |
| CHECK_STATEMENT (ret, FAILED_STATEMENT, "read source from %s failed", src_path); |
| kernel_body[src_size] = '\0'; |
| |
| SmartPtr<CLContext> context; |
| context = CLDevice::instance ()->get_context (); |
| SmartPtr<CLKernel> kernel = new CLKernel (context, kernel_name); |
| kernel->load_from_source (kernel_body, strlen (kernel_body), &program_binaries, &bin_size); |
| |
| ret = bin_file.write_file (program_binaries, bin_size); |
| CHECK_STATEMENT (ret, FAILED_STATEMENT, "write binary to %s failed", bin_path); |
| |
| xcam_free (kernel_name); |
| xcam_free (kernel_body); |
| xcam_free (program_binaries); |
| return 0; |
| } |