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