1 /* 2 * Copyright (c) 2017-2020 Arm Limited. 3 * 4 * SPDX-License-Identifier: MIT 5 * 6 * Permission is hereby granted, free of charge, to any person obtaining a copy 7 * of this software and associated documentation files (the "Software"), to 8 * deal in the Software without restriction, including without limitation the 9 * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or 10 * sell copies of the Software, and to permit persons to whom the Software is 11 * furnished to do so, subject to the following conditions: 12 * 13 * The above copyright notice and this permission notice shall be included in all 14 * copies or substantial portions of the Software. 15 * 16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 22 * SOFTWARE. 23 */ 24 #ifndef ARM_COMPUTE_CL_TYPES_H 25 #define ARM_COMPUTE_CL_TYPES_H 26 27 #include "arm_compute/core/CL/ICLArray.h" 28 #include "arm_compute/core/GPUTarget.h" 29 30 #include <set> 31 #include <string> 32 33 namespace arm_compute 34 { 35 /** Default string for the CLKernel configuration id */ 36 static const std::string default_config_id = "no_config_id"; 37 38 /** Available OpenCL Version */ 39 enum class CLVersion 40 { 41 CL10, /* the OpenCL 1.0 */ 42 CL11, /* the OpenCL 1.1 */ 43 CL12, /* the OpenCL 1.2 */ 44 CL20, /* the OpenCL 2.0 and above */ 45 UNKNOWN /* unkown version */ 46 }; 47 48 /** OpenCL device options */ 49 struct CLDeviceOptions 50 { 51 std::string name{}; /**< Device name */ 52 std::string device_version{}; /**< Device version string */ 53 std::set<std::string> extensions{}; /**< List of supported extensions */ 54 std::string ddk_version{}; /**< DDK version */ 55 GPUTarget gpu_target{}; /**< GPU target architecture/instance */ 56 CLVersion version{}; /**< Device OpenCL version */ 57 size_t compute_units{}; /**< Number of compute units */ 58 size_t cache_size{}; /**< Cache size */ 59 }; 60 61 /** OpenCL quantization data */ 62 struct CLQuantization 63 { 64 /** Default Constructor */ CLQuantizationCLQuantization65 CLQuantization() 66 : scale(nullptr), offset(nullptr) {}; 67 /** Constructor 68 * 69 * @param[in] scale OpenCL scale array 70 * @param[in] offset OpenCL offset array 71 */ CLQuantizationCLQuantization72 CLQuantization(const ICLFloatArray *scale, const ICLInt32Array *offset) 73 : scale(scale), offset(offset) {}; 74 75 const ICLFloatArray *scale; /**< Quantization scale array */ 76 const ICLInt32Array *offset; /**< Quantization offset array */ 77 }; 78 79 /** Internal keypoint structure for Lucas-Kanade Optical Flow */ 80 struct CLLKInternalKeypoint 81 { 82 float x{ 0.f }; /**< x coordinate of the keypoint */ 83 float y{ 0.f }; /**< y coordinate of the keypoint */ 84 float tracking_status{ 0.f }; /**< the tracking status of the keypoint */ 85 float dummy{ 0.f }; /**< Dummy field, to make sure the data structure 128-bit align, so that GPU can use vload4 */ 86 }; 87 88 /** Structure for storing Spatial Gradient Matrix and the minimum eigenvalue for each keypoint */ 89 struct CLCoefficientTable 90 { 91 float A11; /**< iA11 * FLT_SCALE */ 92 float A12; /**< iA11 * FLT_SCALE */ 93 float A22; /**< iA11 * FLT_SCALE */ 94 float min_eig; /**< Minimum eigenvalue */ 95 }; 96 97 /** Structure for storing ival, ixval and iyval for each point inside the window */ 98 struct CLOldValue 99 { 100 int16_t ival; /**< ival extracts from old image */ 101 int16_t ixval; /**< ixval extracts from scharr Gx image */ 102 int16_t iyval; /**< iyval extracts from scharr Gy image */ 103 int16_t dummy; /**< Dummy field, to make sure the data structure 128-bit align, so that GPU can use vload4 */ 104 }; 105 106 /** Interface for OpenCL Array of Internal Key Points. */ 107 using ICLLKInternalKeypointArray = ICLArray<CLLKInternalKeypoint>; 108 /** Interface for OpenCL Array of Coefficient Tables. */ 109 using ICLCoefficientTableArray = ICLArray<CLCoefficientTable>; 110 /** Interface for OpenCL Array of Old Values. */ 111 using ICLOldValArray = ICLArray<CLOldValue>; 112 113 } // namespace arm_compute 114 #endif /* ARM_COMPUTE_CL_TYPES_H */ 115