1 /* 2 * Copyright (C) 2022 Rockchip Electronics Co., Ltd. 3 * Authors: 4 * Cerf Yu <cerf.yu@rock-chips.com> 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 #ifndef _im2d_buffer_h_ 19 #define _im2d_buffer_h_ 20 21 #include "im2d_type.h" 22 23 /** 24 * Import external buffers into RGA driver. 25 * 26 * @param fd/va/pa 27 * Select dma_fd/virtual_address/physical_address by buffer type 28 * @param size 29 * Describes the size of the image buffer 30 * 31 * @return rga_buffer_handle_t 32 */ 33 #ifdef __cplusplus 34 IM_API rga_buffer_handle_t importbuffer_fd(int fd, int size); 35 IM_API rga_buffer_handle_t importbuffer_virtualaddr(void *va, int size); 36 IM_API rga_buffer_handle_t importbuffer_physicaladdr(uint64_t pa, int size); 37 #endif 38 39 /** 40 * Import external buffers into RGA driver. 41 * 42 * @param fd/va/pa 43 * Select dma_fd/virtual_address/physical_address by buffer type 44 * @param width 45 * Describes the pixel width stride of the image buffer 46 * @param height 47 * Describes the pixel height stride of the image buffer 48 * @param format 49 * Describes the pixel format of the image buffer 50 * 51 * @return rga_buffer_handle_t 52 */ 53 #ifdef __cplusplus 54 IM_API rga_buffer_handle_t importbuffer_fd(int fd, int width, int height, int format); 55 IM_API rga_buffer_handle_t importbuffer_virtualaddr(void *va, int width, int height, int format); 56 IM_API rga_buffer_handle_t importbuffer_physicaladdr(uint64_t pa, int width, int height, int format); 57 #endif 58 59 /** 60 * Import external buffers into RGA driver. 61 * 62 * @param fd/va/pa 63 * Select dma_fd/virtual_address/physical_address by buffer type 64 * @param param 65 * Configure buffer parameters 66 * 67 * @return rga_buffer_handle_t 68 */ 69 IM_EXPORT_API rga_buffer_handle_t importbuffer_fd(int fd, im_handle_param_t *param); 70 IM_EXPORT_API rga_buffer_handle_t importbuffer_virtualaddr(void *va, im_handle_param_t *param); 71 IM_EXPORT_API rga_buffer_handle_t importbuffer_physicaladdr(uint64_t pa, im_handle_param_t *param); 72 73 /** 74 * Import external buffers into RGA driver. 75 * 76 * @param handle 77 * rga buffer handle 78 * 79 * @return success or else negative error code. 80 */ 81 IM_EXPORT_API IM_STATUS releasebuffer_handle(rga_buffer_handle_t handle); 82 83 /** 84 * Wrap image Parameters. 85 * 86 * @param handle/virtualaddr/physicaladdr/fd 87 * RGA buffer handle/virtualaddr/physicaladdr/fd. 88 * @param width 89 * Width of image manipulation area. 90 * @param height 91 * Height of image manipulation area. 92 * @param wstride 93 * Width pixel stride, default (width = wstride). 94 * @param hstride 95 * Height pixel stride, default (height = hstride). 96 * @param format 97 * Image format. 98 * 99 * @return rga_buffer_t 100 */ 101 #define wrapbuffer_handle(handle, width, height, format, ...) \ 102 ({ \ 103 rga_buffer_t im2d_api_buffer; \ 104 int __args[] = {__VA_ARGS__}; \ 105 int __argc = sizeof(__args)/sizeof(int); \ 106 if (__argc == 0) { \ 107 im2d_api_buffer = wrapbuffer_handle_t(handle, width, height, width, height, format); \ 108 } else if (__argc == 2){ \ 109 im2d_api_buffer = wrapbuffer_handle_t(handle, width, height, __args[0], __args[1], format); \ 110 } else { \ 111 memset(&im2d_api_buffer, 0x0, sizeof(im2d_api_buffer)); \ 112 printf("invalid parameter\n"); \ 113 } \ 114 im2d_api_buffer; \ 115 }) 116 117 #define wrapbuffer_virtualaddr(vir_addr, width, height, format, ...) \ 118 ({ \ 119 rga_buffer_t im2d_api_buffer; \ 120 int __args[] = {__VA_ARGS__}; \ 121 int __argc = sizeof(__args)/sizeof(int); \ 122 if (__argc == 0) { \ 123 im2d_api_buffer = wrapbuffer_virtualaddr_t(vir_addr, width, height, width, height, format); \ 124 } else if (__argc == 2){ \ 125 im2d_api_buffer = wrapbuffer_virtualaddr_t(vir_addr, width, height, __args[0], __args[1], format); \ 126 } else { \ 127 memset(&im2d_api_buffer, 0x0, sizeof(im2d_api_buffer)); \ 128 printf("invalid parameter\n"); \ 129 } \ 130 im2d_api_buffer; \ 131 }) 132 133 #define wrapbuffer_physicaladdr(phy_addr, width, height, format, ...) \ 134 ({ \ 135 rga_buffer_t im2d_api_buffer; \ 136 int __args[] = {__VA_ARGS__}; \ 137 int __argc = sizeof(__args)/sizeof(int); \ 138 if (__argc == 0) { \ 139 im2d_api_buffer = wrapbuffer_physicaladdr_t(phy_addr, width, height, width, height, format); \ 140 } else if (__argc == 2){ \ 141 im2d_api_buffer = wrapbuffer_physicaladdr_t(phy_addr, width, height, __args[0], __args[1], format); \ 142 } else { \ 143 memset(&im2d_api_buffer, 0x0, sizeof(im2d_api_buffer)); \ 144 printf("invalid parameter\n"); \ 145 } \ 146 im2d_api_buffer; \ 147 }) 148 149 #define wrapbuffer_fd(fd, width, height, format, ...) \ 150 ({ \ 151 rga_buffer_t im2d_api_buffer; \ 152 int __args[] = {__VA_ARGS__}; \ 153 int __argc = sizeof(__args)/sizeof(int); \ 154 if (__argc == 0) { \ 155 im2d_api_buffer = wrapbuffer_fd_t(fd, width, height, width, height, format); \ 156 } else if (__argc == 2){ \ 157 im2d_api_buffer = wrapbuffer_fd_t(fd, width, height, __args[0], __args[1], format); \ 158 } else { \ 159 memset(&im2d_api_buffer, 0x0, sizeof(im2d_api_buffer)); \ 160 printf("invalid parameter\n"); \ 161 } \ 162 im2d_api_buffer; \ 163 }) 164 /* Symbols for define *_t functions */ 165 IM_C_API rga_buffer_t wrapbuffer_handle_t(rga_buffer_handle_t handle, int width, int height, int wstride, int hstride, int format); 166 IM_C_API rga_buffer_t wrapbuffer_virtualaddr_t(void* vir_addr, int width, int height, int wstride, int hstride, int format); 167 IM_C_API rga_buffer_t wrapbuffer_physicaladdr_t(void* phy_addr, int width, int height, int wstride, int hstride, int format); 168 IM_C_API rga_buffer_t wrapbuffer_fd_t(int fd, int width, int height, int wstride, int hstride, int format); 169 170 #ifdef __cplusplus 171 #undef wrapbuffer_handle 172 IM_API rga_buffer_t wrapbuffer_handle(rga_buffer_handle_t handle, 173 int width, int height, int format); 174 IM_API rga_buffer_t wrapbuffer_handle(rga_buffer_handle_t handle, 175 int width, int height, int format, 176 int wstride, int hstride); 177 #endif 178 179 #endif /* #ifndef _im2d_buffer_h_ */ 180