xref: /OK3568_Linux_fs/external/rknpu2/examples/3rdparty/rga/RK3588/include/im2d_buffer.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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