1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun * Copyright (C) 2020 Rockchip Electronics Co., Ltd.
3*4882a593Smuzhiyun * Authors:
4*4882a593Smuzhiyun * PutinLee <putin.lee@rock-chips.com>
5*4882a593Smuzhiyun * Cerf Yu <cerf.yu@rock-chips.com>
6*4882a593Smuzhiyun *
7*4882a593Smuzhiyun * Licensed under the Apache License, Version 2.0 (the "License");
8*4882a593Smuzhiyun * you may not use this file except in compliance with the License.
9*4882a593Smuzhiyun * You may obtain a copy of the License at
10*4882a593Smuzhiyun *
11*4882a593Smuzhiyun * http://www.apache.org/licenses/LICENSE-2.0
12*4882a593Smuzhiyun *
13*4882a593Smuzhiyun * Unless required by applicable law or agreed to in writing, software
14*4882a593Smuzhiyun * distributed under the License is distributed on an "AS IS" BASIS,
15*4882a593Smuzhiyun * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16*4882a593Smuzhiyun * See the License for the specific language governing permissions and
17*4882a593Smuzhiyun * limitations under the License.
18*4882a593Smuzhiyun */
19*4882a593Smuzhiyun
20*4882a593Smuzhiyun #ifdef LOG_TAG
21*4882a593Smuzhiyun #undef LOG_TAG
22*4882a593Smuzhiyun #define LOG_TAG "im2d_rga"
23*4882a593Smuzhiyun #else
24*4882a593Smuzhiyun #define LOG_TAG "im2d_rga"
25*4882a593Smuzhiyun #endif
26*4882a593Smuzhiyun
27*4882a593Smuzhiyun #include <math.h>
28*4882a593Smuzhiyun #include <sstream>
29*4882a593Smuzhiyun
30*4882a593Smuzhiyun #include "RgaUtils.h"
31*4882a593Smuzhiyun #include "utils.h"
32*4882a593Smuzhiyun #include "core/rga_sync.h"
33*4882a593Smuzhiyun #include "core/NormalRga.h"
34*4882a593Smuzhiyun #include "RockchipRga.h"
35*4882a593Smuzhiyun #include "im2d_hardware.h"
36*4882a593Smuzhiyun #include "im2d_impl.h"
37*4882a593Smuzhiyun #include "im2d_log.h"
38*4882a593Smuzhiyun #include "im2d.hpp"
39*4882a593Smuzhiyun
40*4882a593Smuzhiyun #ifdef ANDROID
41*4882a593Smuzhiyun using namespace android;
42*4882a593Smuzhiyun #endif
43*4882a593Smuzhiyun using namespace std;
44*4882a593Smuzhiyun
45*4882a593Smuzhiyun extern __thread im_context_t g_im2d_context;
46*4882a593Smuzhiyun extern __thread char g_rga_err_str[IM_ERR_MSG_LEN];
47*4882a593Smuzhiyun
imStrError_t(IM_STATUS status)48*4882a593Smuzhiyun IM_API const char* imStrError_t(IM_STATUS status) {
49*4882a593Smuzhiyun const char *error_type[] = {
50*4882a593Smuzhiyun "No errors during operation",
51*4882a593Smuzhiyun "Run successfully",
52*4882a593Smuzhiyun "Unsupported function",
53*4882a593Smuzhiyun "Memory overflow",
54*4882a593Smuzhiyun "Invalid parameters",
55*4882a593Smuzhiyun "Illegal parameters",
56*4882a593Smuzhiyun "Version verification failed",
57*4882a593Smuzhiyun "Fatal error",
58*4882a593Smuzhiyun "unkown status"
59*4882a593Smuzhiyun };
60*4882a593Smuzhiyun static __thread char error_str[IM_ERR_MSG_LEN] = "The current error message is empty!";
61*4882a593Smuzhiyun const char *ptr = NULL;
62*4882a593Smuzhiyun
63*4882a593Smuzhiyun switch(status) {
64*4882a593Smuzhiyun case IM_STATUS_NOERROR :
65*4882a593Smuzhiyun return error_type[0];
66*4882a593Smuzhiyun
67*4882a593Smuzhiyun case IM_STATUS_SUCCESS :
68*4882a593Smuzhiyun return error_type[1];
69*4882a593Smuzhiyun
70*4882a593Smuzhiyun case IM_STATUS_NOT_SUPPORTED :
71*4882a593Smuzhiyun ptr = error_type[2];
72*4882a593Smuzhiyun break;
73*4882a593Smuzhiyun
74*4882a593Smuzhiyun case IM_STATUS_OUT_OF_MEMORY :
75*4882a593Smuzhiyun ptr = error_type[3];
76*4882a593Smuzhiyun break;
77*4882a593Smuzhiyun
78*4882a593Smuzhiyun case IM_STATUS_INVALID_PARAM :
79*4882a593Smuzhiyun ptr = error_type[4];
80*4882a593Smuzhiyun break;
81*4882a593Smuzhiyun
82*4882a593Smuzhiyun case IM_STATUS_ILLEGAL_PARAM :
83*4882a593Smuzhiyun ptr = error_type[5];
84*4882a593Smuzhiyun break;
85*4882a593Smuzhiyun
86*4882a593Smuzhiyun case IM_STATUS_ERROR_VERSION :
87*4882a593Smuzhiyun ptr = error_type[6];
88*4882a593Smuzhiyun break;
89*4882a593Smuzhiyun
90*4882a593Smuzhiyun case IM_STATUS_FAILED :
91*4882a593Smuzhiyun ptr = error_type[7];
92*4882a593Smuzhiyun break;
93*4882a593Smuzhiyun
94*4882a593Smuzhiyun default :
95*4882a593Smuzhiyun return error_type[8];
96*4882a593Smuzhiyun }
97*4882a593Smuzhiyun
98*4882a593Smuzhiyun snprintf(error_str, IM_ERR_MSG_LEN, "%s: %s", ptr, g_rga_err_str);
99*4882a593Smuzhiyun rga_error_msg_set("No error message, it has been cleared.");
100*4882a593Smuzhiyun
101*4882a593Smuzhiyun return error_str;
102*4882a593Smuzhiyun }
103*4882a593Smuzhiyun
importbuffer_fd(int fd,int size)104*4882a593Smuzhiyun IM_API rga_buffer_handle_t importbuffer_fd(int fd, int size) {
105*4882a593Smuzhiyun return rga_import_buffer((uint64_t)fd, RGA_DMA_BUFFER, (uint32_t)size);
106*4882a593Smuzhiyun }
107*4882a593Smuzhiyun
importbuffer_fd(int fd,im_handle_param_t * param)108*4882a593Smuzhiyun IM_API rga_buffer_handle_t importbuffer_fd(int fd, im_handle_param_t *param) {
109*4882a593Smuzhiyun return rga_import_buffer((uint64_t)fd, RGA_DMA_BUFFER, param);
110*4882a593Smuzhiyun }
111*4882a593Smuzhiyun
importbuffer_fd(int fd,int width,int height,int format)112*4882a593Smuzhiyun IM_API rga_buffer_handle_t importbuffer_fd(int fd, int width, int height, int format) {
113*4882a593Smuzhiyun im_handle_param_t param = {(uint32_t)width, (uint32_t)height, (uint32_t)format};
114*4882a593Smuzhiyun return rga_import_buffer((uint64_t)fd, RGA_DMA_BUFFER, ¶m);
115*4882a593Smuzhiyun }
116*4882a593Smuzhiyun
importbuffer_virtualaddr(void * va,im_handle_param_t * param)117*4882a593Smuzhiyun IM_API rga_buffer_handle_t importbuffer_virtualaddr(void *va, im_handle_param_t *param) {
118*4882a593Smuzhiyun return rga_import_buffer(ptr_to_u64(va), RGA_VIRTUAL_ADDRESS, param);
119*4882a593Smuzhiyun }
120*4882a593Smuzhiyun
importbuffer_virtualaddr(void * va,int size)121*4882a593Smuzhiyun IM_API rga_buffer_handle_t importbuffer_virtualaddr(void *va, int size) {
122*4882a593Smuzhiyun return rga_import_buffer(ptr_to_u64(va), RGA_VIRTUAL_ADDRESS, (uint32_t)size);
123*4882a593Smuzhiyun }
124*4882a593Smuzhiyun
importbuffer_virtualaddr(void * va,int width,int height,int format)125*4882a593Smuzhiyun IM_API rga_buffer_handle_t importbuffer_virtualaddr(void *va, int width, int height, int format) {
126*4882a593Smuzhiyun im_handle_param_t param = {(uint32_t)width, (uint32_t)height, (uint32_t)format};
127*4882a593Smuzhiyun return rga_import_buffer(ptr_to_u64(va), RGA_VIRTUAL_ADDRESS, ¶m);
128*4882a593Smuzhiyun }
129*4882a593Smuzhiyun
importbuffer_physicaladdr(uint64_t pa,im_handle_param_t * param)130*4882a593Smuzhiyun IM_API rga_buffer_handle_t importbuffer_physicaladdr(uint64_t pa, im_handle_param_t *param) {
131*4882a593Smuzhiyun return rga_import_buffer(pa, RGA_PHYSICAL_ADDRESS, param);
132*4882a593Smuzhiyun }
133*4882a593Smuzhiyun
importbuffer_physicaladdr(uint64_t pa,int size)134*4882a593Smuzhiyun IM_API rga_buffer_handle_t importbuffer_physicaladdr(uint64_t pa, int size) {
135*4882a593Smuzhiyun return rga_import_buffer(pa, RGA_PHYSICAL_ADDRESS, (uint32_t)size);
136*4882a593Smuzhiyun }
137*4882a593Smuzhiyun
importbuffer_physicaladdr(uint64_t pa,int width,int height,int format)138*4882a593Smuzhiyun IM_API rga_buffer_handle_t importbuffer_physicaladdr(uint64_t pa, int width, int height, int format) {
139*4882a593Smuzhiyun im_handle_param_t param = {(uint32_t)width, (uint32_t)height, (uint32_t)format};
140*4882a593Smuzhiyun return rga_import_buffer(pa, RGA_PHYSICAL_ADDRESS, ¶m);
141*4882a593Smuzhiyun }
142*4882a593Smuzhiyun
releasebuffer_handle(rga_buffer_handle_t handle)143*4882a593Smuzhiyun IM_API IM_STATUS releasebuffer_handle(rga_buffer_handle_t handle) {
144*4882a593Smuzhiyun return rga_release_buffer(handle);
145*4882a593Smuzhiyun }
146*4882a593Smuzhiyun
147*4882a593Smuzhiyun #undef wrapbuffer_virtualaddr
wrapbuffer_virtualaddr(void * vir_addr,int width,int height,int format,int wstride,int hstride)148*4882a593Smuzhiyun static rga_buffer_t wrapbuffer_virtualaddr(void* vir_addr,
149*4882a593Smuzhiyun int width, int height, int format,
150*4882a593Smuzhiyun int wstride, int hstride) {
151*4882a593Smuzhiyun rga_buffer_t buffer;
152*4882a593Smuzhiyun
153*4882a593Smuzhiyun memset(&buffer, 0, sizeof(rga_buffer_t));
154*4882a593Smuzhiyun
155*4882a593Smuzhiyun buffer.vir_addr = vir_addr;
156*4882a593Smuzhiyun buffer.width = width;
157*4882a593Smuzhiyun buffer.height = height;
158*4882a593Smuzhiyun buffer.format = format;
159*4882a593Smuzhiyun buffer.wstride = wstride ? wstride : width;
160*4882a593Smuzhiyun buffer.hstride = hstride ? hstride : height;
161*4882a593Smuzhiyun
162*4882a593Smuzhiyun return buffer;
163*4882a593Smuzhiyun }
164*4882a593Smuzhiyun
165*4882a593Smuzhiyun #undef wrapbuffer_physicaladdr
wrapbuffer_physicaladdr(void * phy_addr,int width,int height,int format,int wstride,int hstride)166*4882a593Smuzhiyun static rga_buffer_t wrapbuffer_physicaladdr(void* phy_addr,
167*4882a593Smuzhiyun int width, int height, int format,
168*4882a593Smuzhiyun int wstride, int hstride) {
169*4882a593Smuzhiyun rga_buffer_t buffer;
170*4882a593Smuzhiyun
171*4882a593Smuzhiyun memset(&buffer, 0, sizeof(rga_buffer_t));
172*4882a593Smuzhiyun
173*4882a593Smuzhiyun buffer.phy_addr = phy_addr;
174*4882a593Smuzhiyun buffer.width = width;
175*4882a593Smuzhiyun buffer.height = height;
176*4882a593Smuzhiyun buffer.format = format;
177*4882a593Smuzhiyun buffer.wstride = wstride ? wstride : width;
178*4882a593Smuzhiyun buffer.hstride = hstride ? hstride : height;
179*4882a593Smuzhiyun
180*4882a593Smuzhiyun return buffer;
181*4882a593Smuzhiyun }
182*4882a593Smuzhiyun
183*4882a593Smuzhiyun #undef wrapbuffer_fd
wrapbuffer_fd(int fd,int width,int height,int format,int wstride,int hstride)184*4882a593Smuzhiyun static rga_buffer_t wrapbuffer_fd(int fd,
185*4882a593Smuzhiyun int width, int height, int format,
186*4882a593Smuzhiyun int wstride, int hstride) {
187*4882a593Smuzhiyun rga_buffer_t buffer;
188*4882a593Smuzhiyun
189*4882a593Smuzhiyun memset(&buffer, 0, sizeof(rga_buffer_t));
190*4882a593Smuzhiyun
191*4882a593Smuzhiyun buffer.fd = fd;
192*4882a593Smuzhiyun buffer.width = width;
193*4882a593Smuzhiyun buffer.height = height;
194*4882a593Smuzhiyun buffer.format = format;
195*4882a593Smuzhiyun buffer.wstride = wstride ? wstride : width;
196*4882a593Smuzhiyun buffer.hstride = hstride ? hstride : height;
197*4882a593Smuzhiyun
198*4882a593Smuzhiyun return buffer;
199*4882a593Smuzhiyun }
200*4882a593Smuzhiyun
201*4882a593Smuzhiyun #undef wrapbuffer_handle
wrapbuffer_handle(rga_buffer_handle_t handle,int width,int height,int format,int wstride,int hstride)202*4882a593Smuzhiyun IM_API rga_buffer_t wrapbuffer_handle(rga_buffer_handle_t handle,
203*4882a593Smuzhiyun int width, int height, int format,
204*4882a593Smuzhiyun int wstride, int hstride) {
205*4882a593Smuzhiyun rga_buffer_t buffer;
206*4882a593Smuzhiyun
207*4882a593Smuzhiyun memset(&buffer, 0, sizeof(rga_buffer_t));
208*4882a593Smuzhiyun
209*4882a593Smuzhiyun buffer.handle = handle;
210*4882a593Smuzhiyun buffer.width = width;
211*4882a593Smuzhiyun buffer.height = height;
212*4882a593Smuzhiyun buffer.format = format;
213*4882a593Smuzhiyun buffer.wstride = wstride ? wstride : width;
214*4882a593Smuzhiyun buffer.hstride = hstride ? hstride : height;
215*4882a593Smuzhiyun
216*4882a593Smuzhiyun return buffer;
217*4882a593Smuzhiyun }
218*4882a593Smuzhiyun
wrapbuffer_handle(rga_buffer_handle_t handle,int width,int height,int format)219*4882a593Smuzhiyun IM_API rga_buffer_t wrapbuffer_handle(rga_buffer_handle_t handle,
220*4882a593Smuzhiyun int width, int height,
221*4882a593Smuzhiyun int format) {
222*4882a593Smuzhiyun return wrapbuffer_handle(handle, width, height, format, width, height);
223*4882a593Smuzhiyun }
224*4882a593Smuzhiyun
225*4882a593Smuzhiyun #ifdef ANDROID
importbuffer_GraphicBuffer_handle(buffer_handle_t hnd)226*4882a593Smuzhiyun IM_API rga_buffer_handle_t importbuffer_GraphicBuffer_handle(buffer_handle_t hnd) {
227*4882a593Smuzhiyun int ret = 0;
228*4882a593Smuzhiyun int fd = -1;
229*4882a593Smuzhiyun void *virt_addr = NULL;
230*4882a593Smuzhiyun std::vector<int> dstAttrs;
231*4882a593Smuzhiyun im_handle_param_t param;
232*4882a593Smuzhiyun
233*4882a593Smuzhiyun RockchipRga& rkRga(RockchipRga::get());
234*4882a593Smuzhiyun
235*4882a593Smuzhiyun ret = RkRgaGetHandleAttributes(hnd, &dstAttrs);
236*4882a593Smuzhiyun if (ret) {
237*4882a593Smuzhiyun IM_LOGE("handle get Attributes fail ret = %d,hnd=%p", ret, &hnd);
238*4882a593Smuzhiyun return -1;
239*4882a593Smuzhiyun }
240*4882a593Smuzhiyun
241*4882a593Smuzhiyun param.width = dstAttrs.at(ASTRIDE);
242*4882a593Smuzhiyun param.height = dstAttrs.at(AHEIGHT);
243*4882a593Smuzhiyun param.format = dstAttrs.at(AFORMAT);
244*4882a593Smuzhiyun
245*4882a593Smuzhiyun ret = rkRga.RkRgaGetBufferFd(hnd, &fd);
246*4882a593Smuzhiyun if (ret)
247*4882a593Smuzhiyun IM_LOGE("rga_im2d: get buffer fd fail: %s, hnd=%p", strerror(errno), (void*)(hnd));
248*4882a593Smuzhiyun
249*4882a593Smuzhiyun if (fd <= 0) {
250*4882a593Smuzhiyun ret = rkRga.RkRgaGetHandleMapCpuAddress(hnd, &virt_addr);
251*4882a593Smuzhiyun if(!virt_addr) {
252*4882a593Smuzhiyun IM_LOGE("invaild GraphicBuffer, can not get fd and virtual address, hnd = %p", (void *)hnd);
253*4882a593Smuzhiyun return -1;
254*4882a593Smuzhiyun } else {
255*4882a593Smuzhiyun return importbuffer_virtualaddr(virt_addr, ¶m);
256*4882a593Smuzhiyun }
257*4882a593Smuzhiyun } else {
258*4882a593Smuzhiyun return importbuffer_fd(fd, ¶m);
259*4882a593Smuzhiyun }
260*4882a593Smuzhiyun }
261*4882a593Smuzhiyun
importbuffer_GraphicBuffer(sp<GraphicBuffer> buf)262*4882a593Smuzhiyun IM_API rga_buffer_handle_t importbuffer_GraphicBuffer(sp<GraphicBuffer> buf) {
263*4882a593Smuzhiyun return importbuffer_GraphicBuffer_handle(buf->handle);
264*4882a593Smuzhiyun }
265*4882a593Smuzhiyun
266*4882a593Smuzhiyun /*When wrapbuffer_GraphicBuffer and wrapbuffer_AHardwareBuffer are used, */
267*4882a593Smuzhiyun /*it is necessary to check whether fd and virtual address of the return rga_buffer_t are valid parameters*/
wrapbuffer_handle(buffer_handle_t hnd)268*4882a593Smuzhiyun IM_API rga_buffer_t wrapbuffer_handle(buffer_handle_t hnd) {
269*4882a593Smuzhiyun int ret = 0;
270*4882a593Smuzhiyun rga_buffer_t buffer;
271*4882a593Smuzhiyun std::vector<int> dstAttrs;
272*4882a593Smuzhiyun
273*4882a593Smuzhiyun RockchipRga& rkRga(RockchipRga::get());
274*4882a593Smuzhiyun
275*4882a593Smuzhiyun memset(&buffer, 0, sizeof(rga_buffer_t));
276*4882a593Smuzhiyun
277*4882a593Smuzhiyun ret = rkRga.RkRgaGetBufferFd(hnd, &buffer.fd);
278*4882a593Smuzhiyun if (ret)
279*4882a593Smuzhiyun IM_LOGE("rga_im2d: get buffer fd fail: %s, hnd=%p", strerror(errno), (void*)(hnd));
280*4882a593Smuzhiyun
281*4882a593Smuzhiyun if (buffer.fd <= 0) {
282*4882a593Smuzhiyun ret = rkRga.RkRgaGetHandleMapCpuAddress(hnd, &buffer.vir_addr);
283*4882a593Smuzhiyun if(!buffer.vir_addr) {
284*4882a593Smuzhiyun IM_LOGE("invaild GraphicBuffer, can not get fd and virtual address, hnd = %p", (void *)hnd);
285*4882a593Smuzhiyun goto INVAILD;
286*4882a593Smuzhiyun }
287*4882a593Smuzhiyun }
288*4882a593Smuzhiyun
289*4882a593Smuzhiyun ret = RkRgaGetHandleAttributes(hnd, &dstAttrs);
290*4882a593Smuzhiyun if (ret) {
291*4882a593Smuzhiyun IM_LOGE("handle get Attributes fail, ret = %d,hnd = %p", ret, (void *)hnd);
292*4882a593Smuzhiyun goto INVAILD;
293*4882a593Smuzhiyun }
294*4882a593Smuzhiyun
295*4882a593Smuzhiyun buffer.width = dstAttrs.at(AWIDTH);
296*4882a593Smuzhiyun buffer.height = dstAttrs.at(AHEIGHT);
297*4882a593Smuzhiyun buffer.wstride = dstAttrs.at(ASTRIDE);
298*4882a593Smuzhiyun buffer.hstride = dstAttrs.at(AHEIGHT);
299*4882a593Smuzhiyun buffer.format = dstAttrs.at(AFORMAT);
300*4882a593Smuzhiyun
301*4882a593Smuzhiyun if (buffer.wstride % 16) {
302*4882a593Smuzhiyun IM_LOGE("Graphicbuffer wstride needs align to 16, please align to 16 or use other buffer types, wstride = %d", buffer.wstride);
303*4882a593Smuzhiyun goto INVAILD;
304*4882a593Smuzhiyun }
305*4882a593Smuzhiyun
306*4882a593Smuzhiyun INVAILD:
307*4882a593Smuzhiyun return buffer;
308*4882a593Smuzhiyun }
309*4882a593Smuzhiyun
wrapbuffer_GraphicBuffer(sp<GraphicBuffer> buf)310*4882a593Smuzhiyun IM_API rga_buffer_t wrapbuffer_GraphicBuffer(sp<GraphicBuffer> buf) {
311*4882a593Smuzhiyun int ret = 0;
312*4882a593Smuzhiyun rga_buffer_t buffer;
313*4882a593Smuzhiyun std::vector<int> dstAttrs;
314*4882a593Smuzhiyun
315*4882a593Smuzhiyun RockchipRga& rkRga(RockchipRga::get());
316*4882a593Smuzhiyun
317*4882a593Smuzhiyun memset(&buffer, 0, sizeof(rga_buffer_t));
318*4882a593Smuzhiyun
319*4882a593Smuzhiyun ret = rkRga.RkRgaGetBufferFd(buf->handle, &buffer.fd);
320*4882a593Smuzhiyun if (ret)
321*4882a593Smuzhiyun IM_LOGE("rga_im2d: get buffer fd fail: %s, hnd=%p", strerror(errno), (void*)(buf->handle));
322*4882a593Smuzhiyun
323*4882a593Smuzhiyun if (buffer.fd <= 0) {
324*4882a593Smuzhiyun ret = rkRga.RkRgaGetHandleMapCpuAddress(buf->handle, &buffer.vir_addr);
325*4882a593Smuzhiyun if(!buffer.vir_addr) {
326*4882a593Smuzhiyun IM_LOGE("invaild GraphicBuffer, can not get fd and virtual address, hnd = %p", (void *)(buf->handle));
327*4882a593Smuzhiyun goto INVAILD;
328*4882a593Smuzhiyun }
329*4882a593Smuzhiyun }
330*4882a593Smuzhiyun
331*4882a593Smuzhiyun ret = RkRgaGetHandleAttributes(buf->handle, &dstAttrs);
332*4882a593Smuzhiyun if (ret) {
333*4882a593Smuzhiyun IM_LOGE("handle get Attributes fail, ret = %d, hnd = %p", ret, (void *)(buf->handle));
334*4882a593Smuzhiyun goto INVAILD;
335*4882a593Smuzhiyun }
336*4882a593Smuzhiyun
337*4882a593Smuzhiyun buffer.width = dstAttrs.at(AWIDTH);
338*4882a593Smuzhiyun buffer.height = dstAttrs.at(AHEIGHT);
339*4882a593Smuzhiyun buffer.wstride = dstAttrs.at(ASTRIDE);
340*4882a593Smuzhiyun buffer.hstride = dstAttrs.at(AHEIGHT);
341*4882a593Smuzhiyun buffer.format = dstAttrs.at(AFORMAT);
342*4882a593Smuzhiyun
343*4882a593Smuzhiyun if (buffer.wstride % 16) {
344*4882a593Smuzhiyun IM_LOGE("Graphicbuffer wstride needs align to 16, please align to 16 or use other buffer types, wstride = %d", buffer.wstride);
345*4882a593Smuzhiyun goto INVAILD;
346*4882a593Smuzhiyun }
347*4882a593Smuzhiyun
348*4882a593Smuzhiyun INVAILD:
349*4882a593Smuzhiyun return buffer;
350*4882a593Smuzhiyun }
351*4882a593Smuzhiyun
352*4882a593Smuzhiyun #if USE_AHARDWAREBUFFER
353*4882a593Smuzhiyun #include <android/hardware_buffer.h>
importbuffer_AHardwareBuffer(AHardwareBuffer * buf)354*4882a593Smuzhiyun IM_API rga_buffer_handle_t importbuffer_AHardwareBuffer(AHardwareBuffer *buf) {
355*4882a593Smuzhiyun GraphicBuffer *gbuffer = reinterpret_cast<GraphicBuffer*>(buf);
356*4882a593Smuzhiyun
357*4882a593Smuzhiyun return importbuffer_GraphicBuffer_handle(gbuffer->handle);
358*4882a593Smuzhiyun }
359*4882a593Smuzhiyun
wrapbuffer_AHardwareBuffer(AHardwareBuffer * buf)360*4882a593Smuzhiyun IM_API rga_buffer_t wrapbuffer_AHardwareBuffer(AHardwareBuffer *buf) {
361*4882a593Smuzhiyun int ret = 0;
362*4882a593Smuzhiyun rga_buffer_t buffer;
363*4882a593Smuzhiyun std::vector<int> dstAttrs;
364*4882a593Smuzhiyun
365*4882a593Smuzhiyun RockchipRga& rkRga(RockchipRga::get());
366*4882a593Smuzhiyun
367*4882a593Smuzhiyun memset(&buffer, 0, sizeof(rga_buffer_t));
368*4882a593Smuzhiyun
369*4882a593Smuzhiyun GraphicBuffer *gbuffer = reinterpret_cast<GraphicBuffer*>(buf);
370*4882a593Smuzhiyun
371*4882a593Smuzhiyun ret = rkRga.RkRgaGetBufferFd(gbuffer->handle, &buffer.fd);
372*4882a593Smuzhiyun if (ret)
373*4882a593Smuzhiyun IM_LOGE("rga_im2d: get buffer fd fail: %s, hnd=%p", strerror(errno), (void*)(gbuffer->handle));
374*4882a593Smuzhiyun
375*4882a593Smuzhiyun if (buffer.fd <= 0) {
376*4882a593Smuzhiyun ret = rkRga.RkRgaGetHandleMapCpuAddress(gbuffer->handle, &buffer.vir_addr);
377*4882a593Smuzhiyun if(!buffer.vir_addr) {
378*4882a593Smuzhiyun IM_LOGE("invaild GraphicBuffer, can not get fd and virtual address, hnd = %p", (void *)(gbuffer->handle));
379*4882a593Smuzhiyun goto INVAILD;
380*4882a593Smuzhiyun }
381*4882a593Smuzhiyun }
382*4882a593Smuzhiyun
383*4882a593Smuzhiyun ret = RkRgaGetHandleAttributes(gbuffer->handle, &dstAttrs);
384*4882a593Smuzhiyun if (ret) {
385*4882a593Smuzhiyun IM_LOGE("handle get Attributes fail, ret = %d, hnd = %p", ret, (void *)(gbuffer->handle));
386*4882a593Smuzhiyun goto INVAILD;
387*4882a593Smuzhiyun }
388*4882a593Smuzhiyun
389*4882a593Smuzhiyun buffer.width = dstAttrs.at(AWIDTH);
390*4882a593Smuzhiyun buffer.height = dstAttrs.at(AHEIGHT);
391*4882a593Smuzhiyun buffer.wstride = dstAttrs.at(ASTRIDE);
392*4882a593Smuzhiyun buffer.hstride = dstAttrs.at(AHEIGHT);
393*4882a593Smuzhiyun buffer.format = dstAttrs.at(AFORMAT);
394*4882a593Smuzhiyun
395*4882a593Smuzhiyun if (buffer.wstride % 16) {
396*4882a593Smuzhiyun IM_LOGE("Graphicbuffer wstride needs align to 16, please align to 16 or use other buffer types, wstride = %d", buffer.wstride);
397*4882a593Smuzhiyun goto INVAILD;
398*4882a593Smuzhiyun }
399*4882a593Smuzhiyun
400*4882a593Smuzhiyun INVAILD:
401*4882a593Smuzhiyun return buffer;
402*4882a593Smuzhiyun }
403*4882a593Smuzhiyun #endif
404*4882a593Smuzhiyun #endif
405*4882a593Smuzhiyun
querystring(int name)406*4882a593Smuzhiyun IM_API const char* querystring(int name) {
407*4882a593Smuzhiyun bool all_output = 0, all_output_prepared = 0;
408*4882a593Smuzhiyun int rga_version = 0;
409*4882a593Smuzhiyun long usage = 0;
410*4882a593Smuzhiyun enum {
411*4882a593Smuzhiyun RGA_API = 0,
412*4882a593Smuzhiyun };
413*4882a593Smuzhiyun const char *temp;
414*4882a593Smuzhiyun const char *output_vendor = "Rockchip Electronics Co.,Ltd.";
415*4882a593Smuzhiyun const char *output_name[] = {
416*4882a593Smuzhiyun "RGA vendor : ",
417*4882a593Smuzhiyun "RGA version : ",
418*4882a593Smuzhiyun "Max input : ",
419*4882a593Smuzhiyun "Max output : ",
420*4882a593Smuzhiyun "Byte stride : ",
421*4882a593Smuzhiyun "Scale limit : ",
422*4882a593Smuzhiyun "Input support format : ",
423*4882a593Smuzhiyun "output support format : ",
424*4882a593Smuzhiyun "RGA feature : ",
425*4882a593Smuzhiyun "expected performance : ",
426*4882a593Smuzhiyun };
427*4882a593Smuzhiyun const char *version_name[] = {
428*4882a593Smuzhiyun "RGA_api version : ",
429*4882a593Smuzhiyun };
430*4882a593Smuzhiyun const char *output_version[] = {
431*4882a593Smuzhiyun "unknown ",
432*4882a593Smuzhiyun "RGA_1 ",
433*4882a593Smuzhiyun "RGA_1_plus ",
434*4882a593Smuzhiyun "RGA_2 ",
435*4882a593Smuzhiyun "RGA_2_lite0 ",
436*4882a593Smuzhiyun "RGA_2_lite1 ",
437*4882a593Smuzhiyun "RGA_2_Enhance ",
438*4882a593Smuzhiyun "RGA_3 ",
439*4882a593Smuzhiyun };
440*4882a593Smuzhiyun const char *output_resolution[] = {
441*4882a593Smuzhiyun "unknown",
442*4882a593Smuzhiyun "2048x2048",
443*4882a593Smuzhiyun "4096x4096",
444*4882a593Smuzhiyun "8192x8192",
445*4882a593Smuzhiyun "8128x8128",
446*4882a593Smuzhiyun };
447*4882a593Smuzhiyun const char *output_scale_limit[] = {
448*4882a593Smuzhiyun "unknown",
449*4882a593Smuzhiyun "0.125 ~ 8",
450*4882a593Smuzhiyun "0.0625 ~ 16"
451*4882a593Smuzhiyun };
452*4882a593Smuzhiyun const char *output_format[] = {
453*4882a593Smuzhiyun "unknown",
454*4882a593Smuzhiyun "RGBA_8888 RGB_888 RGB_565 ",
455*4882a593Smuzhiyun "RGBA_4444 RGBA_5551 ",
456*4882a593Smuzhiyun "BPP8 BPP4 BPP2 BPP1 ",
457*4882a593Smuzhiyun "YUV420_sp_8bit ",
458*4882a593Smuzhiyun "YUV420_sp_10bit ",
459*4882a593Smuzhiyun "YUV420_p_8bit ",
460*4882a593Smuzhiyun "YUV420_p_10bit ",
461*4882a593Smuzhiyun "YUV422_sp_8bit ",
462*4882a593Smuzhiyun "YUV422_sp_10bit ",
463*4882a593Smuzhiyun "YUV422_p_8bit ",
464*4882a593Smuzhiyun "YUV422_p_10bit ",
465*4882a593Smuzhiyun "YUYV420 ",
466*4882a593Smuzhiyun "YUYV422 ",
467*4882a593Smuzhiyun "YUV400/Y4 "
468*4882a593Smuzhiyun };
469*4882a593Smuzhiyun const char *feature[] = {
470*4882a593Smuzhiyun "unknown ",
471*4882a593Smuzhiyun "color_fill ",
472*4882a593Smuzhiyun "color_palette ",
473*4882a593Smuzhiyun "ROP ",
474*4882a593Smuzhiyun "quantize ",
475*4882a593Smuzhiyun "src1_r2y_csc ",
476*4882a593Smuzhiyun "dst_full_csc ",
477*4882a593Smuzhiyun "FBC_mode ",
478*4882a593Smuzhiyun "blend_in_YUV ",
479*4882a593Smuzhiyun "BT.2020 ",
480*4882a593Smuzhiyun "mosaic ",
481*4882a593Smuzhiyun "OSD ",
482*4882a593Smuzhiyun "early_interruption ",
483*4882a593Smuzhiyun };
484*4882a593Smuzhiyun const char *performance[] = {
485*4882a593Smuzhiyun "unknown",
486*4882a593Smuzhiyun "max 1 pixel/cycle ",
487*4882a593Smuzhiyun "max 2 pixel/cycle ",
488*4882a593Smuzhiyun "max 4 pixel/cycle ",
489*4882a593Smuzhiyun };
490*4882a593Smuzhiyun ostringstream out;
491*4882a593Smuzhiyun static string info;
492*4882a593Smuzhiyun
493*4882a593Smuzhiyun rga_info_table_entry rga_info;
494*4882a593Smuzhiyun
495*4882a593Smuzhiyun memset(&rga_info, 0x0, sizeof(rga_info));
496*4882a593Smuzhiyun usage = rga_get_info(&rga_info);
497*4882a593Smuzhiyun if (IM_STATUS_FAILED == usage) {
498*4882a593Smuzhiyun IM_LOGE("rga im2d: rga2 get info failed!\n");
499*4882a593Smuzhiyun return "get info failed";
500*4882a593Smuzhiyun }
501*4882a593Smuzhiyun
502*4882a593Smuzhiyun do {
503*4882a593Smuzhiyun switch(name) {
504*4882a593Smuzhiyun case RGA_VENDOR :
505*4882a593Smuzhiyun out << output_name[name] << output_vendor << endl;
506*4882a593Smuzhiyun break;
507*4882a593Smuzhiyun
508*4882a593Smuzhiyun case RGA_VERSION :
509*4882a593Smuzhiyun out << version_name[RGA_API] << "v" << RGA_API_VERSION << endl;
510*4882a593Smuzhiyun
511*4882a593Smuzhiyun out << output_name[name];
512*4882a593Smuzhiyun if (rga_info.version == IM_RGA_HW_VERSION_RGA_V_ERR) {
513*4882a593Smuzhiyun out << output_version[IM_RGA_HW_VERSION_RGA_V_ERR_INDEX];
514*4882a593Smuzhiyun } else {
515*4882a593Smuzhiyun if (rga_info.version & IM_RGA_HW_VERSION_RGA_1)
516*4882a593Smuzhiyun out << output_version[IM_RGA_HW_VERSION_RGA_1_INDEX];
517*4882a593Smuzhiyun if (rga_info.version & IM_RGA_HW_VERSION_RGA_1_PLUS)
518*4882a593Smuzhiyun out << output_version[IM_RGA_HW_VERSION_RGA_1_PLUS_INDEX];
519*4882a593Smuzhiyun if (rga_info.version & IM_RGA_HW_VERSION_RGA_2)
520*4882a593Smuzhiyun out << output_version[IM_RGA_HW_VERSION_RGA_2_INDEX];
521*4882a593Smuzhiyun if (rga_info.version & IM_RGA_HW_VERSION_RGA_2_LITE0)
522*4882a593Smuzhiyun out << output_version[IM_RGA_HW_VERSION_RGA_2_LITE0_INDEX];
523*4882a593Smuzhiyun if (rga_info.version & IM_RGA_HW_VERSION_RGA_2_LITE1)
524*4882a593Smuzhiyun out << output_version[IM_RGA_HW_VERSION_RGA_2_LITE1_INDEX];
525*4882a593Smuzhiyun if (rga_info.version & IM_RGA_HW_VERSION_RGA_2_ENHANCE)
526*4882a593Smuzhiyun out << output_version[IM_RGA_HW_VERSION_RGA_2_ENHANCE_INDEX];
527*4882a593Smuzhiyun if (rga_info.version & IM_RGA_HW_VERSION_RGA_3)
528*4882a593Smuzhiyun out << output_version[IM_RGA_HW_VERSION_RGA_3_INDEX];
529*4882a593Smuzhiyun }
530*4882a593Smuzhiyun out << endl;
531*4882a593Smuzhiyun break;
532*4882a593Smuzhiyun
533*4882a593Smuzhiyun case RGA_MAX_INPUT :
534*4882a593Smuzhiyun switch (rga_info.input_resolution) {
535*4882a593Smuzhiyun case 2048 :
536*4882a593Smuzhiyun out << output_name[name] << output_resolution[1] << endl;
537*4882a593Smuzhiyun break;
538*4882a593Smuzhiyun case 4096 :
539*4882a593Smuzhiyun out << output_name[name] << output_resolution[2] << endl;
540*4882a593Smuzhiyun break;
541*4882a593Smuzhiyun case 8192 :
542*4882a593Smuzhiyun out << output_name[name] << output_resolution[3] << endl;
543*4882a593Smuzhiyun break;
544*4882a593Smuzhiyun case 8128 :
545*4882a593Smuzhiyun out << output_name[name] << output_resolution[4] << endl;
546*4882a593Smuzhiyun break;
547*4882a593Smuzhiyun default :
548*4882a593Smuzhiyun out << output_name[name] << output_resolution[IM_RGA_HW_VERSION_RGA_V_ERR_INDEX] << endl;
549*4882a593Smuzhiyun break;
550*4882a593Smuzhiyun }
551*4882a593Smuzhiyun break;
552*4882a593Smuzhiyun
553*4882a593Smuzhiyun case RGA_MAX_OUTPUT :
554*4882a593Smuzhiyun switch(rga_info.output_resolution) {
555*4882a593Smuzhiyun case 2048 :
556*4882a593Smuzhiyun out << output_name[name] << output_resolution[1] << endl;
557*4882a593Smuzhiyun break;
558*4882a593Smuzhiyun case 4096 :
559*4882a593Smuzhiyun out << output_name[name] << output_resolution[2] << endl;
560*4882a593Smuzhiyun break;
561*4882a593Smuzhiyun case 8192 :
562*4882a593Smuzhiyun out << output_name[name] << output_resolution[3] << endl;
563*4882a593Smuzhiyun break;
564*4882a593Smuzhiyun case 8128 :
565*4882a593Smuzhiyun out << output_name[name] << output_resolution[4] << endl;
566*4882a593Smuzhiyun break;
567*4882a593Smuzhiyun default :
568*4882a593Smuzhiyun out << output_name[name] << output_resolution[IM_RGA_HW_VERSION_RGA_V_ERR_INDEX] << endl;
569*4882a593Smuzhiyun break;
570*4882a593Smuzhiyun }
571*4882a593Smuzhiyun break;
572*4882a593Smuzhiyun
573*4882a593Smuzhiyun case RGA_BYTE_STRIDE :
574*4882a593Smuzhiyun if (rga_info.byte_stride > 0)
575*4882a593Smuzhiyun out << output_name[name] << rga_info.byte_stride << " byte" << endl;
576*4882a593Smuzhiyun else
577*4882a593Smuzhiyun out << output_name[name] << "unknown" << endl;
578*4882a593Smuzhiyun
579*4882a593Smuzhiyun break;
580*4882a593Smuzhiyun
581*4882a593Smuzhiyun case RGA_SCALE_LIMIT :
582*4882a593Smuzhiyun switch(rga_info.scale_limit) {
583*4882a593Smuzhiyun case 8 :
584*4882a593Smuzhiyun out << output_name[name] << output_scale_limit[1] << endl;
585*4882a593Smuzhiyun break;
586*4882a593Smuzhiyun case 16 :
587*4882a593Smuzhiyun out << output_name[name] << output_scale_limit[2] << endl;
588*4882a593Smuzhiyun break;
589*4882a593Smuzhiyun default :
590*4882a593Smuzhiyun out << output_name[name] << output_scale_limit[IM_RGA_HW_VERSION_RGA_V_ERR_INDEX] << endl;
591*4882a593Smuzhiyun break;
592*4882a593Smuzhiyun }
593*4882a593Smuzhiyun break;
594*4882a593Smuzhiyun
595*4882a593Smuzhiyun case RGA_INPUT_FORMAT :
596*4882a593Smuzhiyun out << output_name[name];
597*4882a593Smuzhiyun if(rga_info.input_format & IM_RGA_SUPPORT_FORMAT_RGB)
598*4882a593Smuzhiyun out << output_format[IM_RGA_SUPPORT_FORMAT_RGB_INDEX];
599*4882a593Smuzhiyun if(rga_info.input_format & IM_RGA_SUPPORT_FORMAT_RGB_OTHER)
600*4882a593Smuzhiyun out << output_format[IM_RGA_SUPPORT_FORMAT_RGB_OTHER_INDEX];
601*4882a593Smuzhiyun if(rga_info.input_format & IM_RGA_SUPPORT_FORMAT_BPP)
602*4882a593Smuzhiyun out << output_format[IM_RGA_SUPPORT_FORMAT_BPP_INDEX];
603*4882a593Smuzhiyun if(rga_info.input_format & IM_RGA_SUPPORT_FORMAT_YUV_420_SEMI_PLANNER_8_BIT)
604*4882a593Smuzhiyun out << output_format[IM_RGA_SUPPORT_FORMAT_YUV_420_SEMI_PLANNER_8_BIT_INDEX];
605*4882a593Smuzhiyun if(rga_info.input_format & IM_RGA_SUPPORT_FORMAT_YUV_420_SEMI_PLANNER_10_BIT)
606*4882a593Smuzhiyun out << output_format[IM_RGA_SUPPORT_FORMAT_YUV_420_SEMI_PLANNER_10_BIT_INDEX];
607*4882a593Smuzhiyun if(rga_info.input_format & IM_RGA_SUPPORT_FORMAT_YUV_420_PLANNER_8_BIT)
608*4882a593Smuzhiyun out << output_format[IM_RGA_SUPPORT_FORMAT_YUV_420_PLANNER_8_BIT_INDEX];
609*4882a593Smuzhiyun if(rga_info.input_format & IM_RGA_SUPPORT_FORMAT_YUV_420_PLANNER_10_BIT)
610*4882a593Smuzhiyun out << output_format[IM_RGA_SUPPORT_FORMAT_YUV_420_PLANNER_10_BIT_INDEX];
611*4882a593Smuzhiyun if(rga_info.input_format & IM_RGA_SUPPORT_FORMAT_YUV_422_SEMI_PLANNER_8_BIT)
612*4882a593Smuzhiyun out << output_format[IM_RGA_SUPPORT_FORMAT_YUV_422_SEMI_PLANNER_8_BIT_INDEX];
613*4882a593Smuzhiyun if(rga_info.input_format & IM_RGA_SUPPORT_FORMAT_YUV_422_SEMI_PLANNER_10_BIT)
614*4882a593Smuzhiyun out << output_format[IM_RGA_SUPPORT_FORMAT_YUV_422_SEMI_PLANNER_10_BIT_INDEX];
615*4882a593Smuzhiyun if(rga_info.input_format & IM_RGA_SUPPORT_FORMAT_YUV_422_PLANNER_8_BIT)
616*4882a593Smuzhiyun out << output_format[IM_RGA_SUPPORT_FORMAT_YUV_422_PLANNER_8_BIT_INDEX];
617*4882a593Smuzhiyun if(rga_info.input_format & IM_RGA_SUPPORT_FORMAT_YUV_422_PLANNER_10_BIT)
618*4882a593Smuzhiyun out << output_format[IM_RGA_SUPPORT_FORMAT_YUV_422_PLANNER_10_BIT_INDEX];
619*4882a593Smuzhiyun if(rga_info.input_format & IM_RGA_SUPPORT_FORMAT_YUYV_420)
620*4882a593Smuzhiyun out << output_format[IM_RGA_SUPPORT_FORMAT_YUYV_420_INDEX];
621*4882a593Smuzhiyun if(rga_info.input_format & IM_RGA_SUPPORT_FORMAT_YUYV_422)
622*4882a593Smuzhiyun out << output_format[IM_RGA_SUPPORT_FORMAT_YUYV_422_INDEX];
623*4882a593Smuzhiyun if(rga_info.input_format & IM_RGA_SUPPORT_FORMAT_YUV_400)
624*4882a593Smuzhiyun out << output_format[IM_RGA_SUPPORT_FORMAT_YUV_400_INDEX];
625*4882a593Smuzhiyun if(!(rga_info.input_format & IM_RGA_SUPPORT_FORMAT_MASK))
626*4882a593Smuzhiyun out << output_format[IM_RGA_SUPPORT_FORMAT_ERROR_INDEX];
627*4882a593Smuzhiyun out << endl;
628*4882a593Smuzhiyun break;
629*4882a593Smuzhiyun
630*4882a593Smuzhiyun case RGA_OUTPUT_FORMAT :
631*4882a593Smuzhiyun out << output_name[name];
632*4882a593Smuzhiyun if(rga_info.output_format & IM_RGA_SUPPORT_FORMAT_RGB)
633*4882a593Smuzhiyun out << output_format[IM_RGA_SUPPORT_FORMAT_RGB_INDEX];
634*4882a593Smuzhiyun if(rga_info.output_format & IM_RGA_SUPPORT_FORMAT_RGB_OTHER)
635*4882a593Smuzhiyun out << output_format[IM_RGA_SUPPORT_FORMAT_RGB_OTHER_INDEX];
636*4882a593Smuzhiyun if(rga_info.output_format & IM_RGA_SUPPORT_FORMAT_BPP)
637*4882a593Smuzhiyun out << output_format[IM_RGA_SUPPORT_FORMAT_BPP_INDEX];
638*4882a593Smuzhiyun if(rga_info.output_format & IM_RGA_SUPPORT_FORMAT_YUV_420_SEMI_PLANNER_8_BIT)
639*4882a593Smuzhiyun out << output_format[IM_RGA_SUPPORT_FORMAT_YUV_420_SEMI_PLANNER_8_BIT_INDEX];
640*4882a593Smuzhiyun if(rga_info.output_format & IM_RGA_SUPPORT_FORMAT_YUV_420_SEMI_PLANNER_10_BIT)
641*4882a593Smuzhiyun out << output_format[IM_RGA_SUPPORT_FORMAT_YUV_420_SEMI_PLANNER_10_BIT_INDEX];
642*4882a593Smuzhiyun if(rga_info.output_format & IM_RGA_SUPPORT_FORMAT_YUV_420_PLANNER_8_BIT)
643*4882a593Smuzhiyun out << output_format[IM_RGA_SUPPORT_FORMAT_YUV_420_PLANNER_8_BIT_INDEX];
644*4882a593Smuzhiyun if(rga_info.output_format & IM_RGA_SUPPORT_FORMAT_YUV_420_PLANNER_10_BIT)
645*4882a593Smuzhiyun out << output_format[IM_RGA_SUPPORT_FORMAT_YUV_420_PLANNER_10_BIT_INDEX];
646*4882a593Smuzhiyun if(rga_info.output_format & IM_RGA_SUPPORT_FORMAT_YUV_422_SEMI_PLANNER_8_BIT)
647*4882a593Smuzhiyun out << output_format[IM_RGA_SUPPORT_FORMAT_YUV_422_SEMI_PLANNER_8_BIT_INDEX];
648*4882a593Smuzhiyun if(rga_info.output_format & IM_RGA_SUPPORT_FORMAT_YUV_422_SEMI_PLANNER_10_BIT)
649*4882a593Smuzhiyun out << output_format[IM_RGA_SUPPORT_FORMAT_YUV_422_SEMI_PLANNER_10_BIT_INDEX];
650*4882a593Smuzhiyun if(rga_info.output_format & IM_RGA_SUPPORT_FORMAT_YUV_422_PLANNER_8_BIT)
651*4882a593Smuzhiyun out << output_format[IM_RGA_SUPPORT_FORMAT_YUV_422_PLANNER_8_BIT_INDEX];
652*4882a593Smuzhiyun if(rga_info.output_format & IM_RGA_SUPPORT_FORMAT_YUV_422_PLANNER_10_BIT)
653*4882a593Smuzhiyun out << output_format[IM_RGA_SUPPORT_FORMAT_YUV_422_PLANNER_10_BIT_INDEX];
654*4882a593Smuzhiyun if(rga_info.output_format & IM_RGA_SUPPORT_FORMAT_YUYV_420)
655*4882a593Smuzhiyun out << output_format[IM_RGA_SUPPORT_FORMAT_YUYV_420_INDEX];
656*4882a593Smuzhiyun if(rga_info.output_format & IM_RGA_SUPPORT_FORMAT_YUYV_422)
657*4882a593Smuzhiyun out << output_format[IM_RGA_SUPPORT_FORMAT_YUYV_422_INDEX];
658*4882a593Smuzhiyun if(rga_info.output_format & IM_RGA_SUPPORT_FORMAT_YUV_400)
659*4882a593Smuzhiyun out << output_format[IM_RGA_SUPPORT_FORMAT_YUV_400_INDEX];
660*4882a593Smuzhiyun if(!(rga_info.output_format & IM_RGA_SUPPORT_FORMAT_MASK))
661*4882a593Smuzhiyun out << output_format[IM_RGA_SUPPORT_FORMAT_ERROR_INDEX];
662*4882a593Smuzhiyun out << endl;
663*4882a593Smuzhiyun break;
664*4882a593Smuzhiyun
665*4882a593Smuzhiyun case RGA_FEATURE :
666*4882a593Smuzhiyun out << output_name[name];
667*4882a593Smuzhiyun if(rga_info.feature & IM_RGA_SUPPORT_FEATURE_COLOR_FILL)
668*4882a593Smuzhiyun out << feature[IM_RGA_SUPPORT_FEATURE_COLOR_FILL_INDEX];
669*4882a593Smuzhiyun if(rga_info.feature & IM_RGA_SUPPORT_FEATURE_COLOR_PALETTE)
670*4882a593Smuzhiyun out << feature[IM_RGA_SUPPORT_FEATURE_COLOR_PALETTE_INDEX];
671*4882a593Smuzhiyun if(rga_info.feature & IM_RGA_SUPPORT_FEATURE_ROP)
672*4882a593Smuzhiyun out << feature[IM_RGA_SUPPORT_FEATURE_ROP_INDEX];
673*4882a593Smuzhiyun if(rga_info.feature & IM_RGA_SUPPORT_FEATURE_QUANTIZE)
674*4882a593Smuzhiyun out << feature[IM_RGA_SUPPORT_FEATURE_QUANTIZE_INDEX];
675*4882a593Smuzhiyun if(rga_info.feature & IM_RGA_SUPPORT_FEATURE_SRC1_R2Y_CSC)
676*4882a593Smuzhiyun out << feature[IM_RGA_SUPPORT_FEATURE_SRC1_R2Y_CSC_INDEX];
677*4882a593Smuzhiyun if(rga_info.feature & IM_RGA_SUPPORT_FEATURE_DST_FULL_CSC)
678*4882a593Smuzhiyun out << feature[IM_RGA_SUPPORT_FEATURE_DST_FULL_CSC_INDEX];
679*4882a593Smuzhiyun if(rga_info.feature & IM_RGA_SUPPORT_FEATURE_FBC)
680*4882a593Smuzhiyun out << feature[IM_RGA_SUPPORT_FEATURE_FBC_INDEX];
681*4882a593Smuzhiyun if(rga_info.feature & IM_RGA_SUPPORT_FEATURE_BLEND_YUV)
682*4882a593Smuzhiyun out << feature[IM_RGA_SUPPORT_FEATURE_BLEND_YUV_INDEX];
683*4882a593Smuzhiyun if(rga_info.feature & IM_RGA_SUPPORT_FEATURE_BT2020)
684*4882a593Smuzhiyun out << feature[IM_RGA_SUPPORT_FEATURE_BT2020_INDEX];
685*4882a593Smuzhiyun if(rga_info.feature & IM_RGA_SUPPORT_FEATURE_MOSAIC)
686*4882a593Smuzhiyun out << feature[IM_RGA_SUPPORT_FEATURE_MOSAIC_INDEX];
687*4882a593Smuzhiyun if(rga_info.feature & IM_RGA_SUPPORT_FEATURE_OSD)
688*4882a593Smuzhiyun out << feature[IM_RGA_SUPPORT_FEATURE_OSD_INDEX];
689*4882a593Smuzhiyun if(rga_info.feature & IM_RGA_SUPPORT_FEATURE_PRE_INTR)
690*4882a593Smuzhiyun out << feature[IM_RGA_SUPPORT_FEATURE_PRE_INTR_INDEX];
691*4882a593Smuzhiyun out << endl;
692*4882a593Smuzhiyun break;
693*4882a593Smuzhiyun
694*4882a593Smuzhiyun case RGA_EXPECTED :
695*4882a593Smuzhiyun switch(rga_info.performance) {
696*4882a593Smuzhiyun case 1 :
697*4882a593Smuzhiyun out << output_name[name] << performance[1] << endl;
698*4882a593Smuzhiyun break;
699*4882a593Smuzhiyun case 2 :
700*4882a593Smuzhiyun out << output_name[name] << performance[2] << endl;
701*4882a593Smuzhiyun break;
702*4882a593Smuzhiyun case 4 :
703*4882a593Smuzhiyun out << output_name[name] << performance[3] << endl;
704*4882a593Smuzhiyun break;
705*4882a593Smuzhiyun default :
706*4882a593Smuzhiyun out << output_name[name] << performance[IM_RGA_HW_VERSION_RGA_V_ERR_INDEX] << endl;
707*4882a593Smuzhiyun break;
708*4882a593Smuzhiyun }
709*4882a593Smuzhiyun break;
710*4882a593Smuzhiyun
711*4882a593Smuzhiyun case RGA_ALL :
712*4882a593Smuzhiyun if (!all_output) {
713*4882a593Smuzhiyun all_output = 1;
714*4882a593Smuzhiyun name = 0;
715*4882a593Smuzhiyun } else
716*4882a593Smuzhiyun all_output_prepared = 1;
717*4882a593Smuzhiyun break;
718*4882a593Smuzhiyun
719*4882a593Smuzhiyun default:
720*4882a593Smuzhiyun return "Invalid instruction";
721*4882a593Smuzhiyun }
722*4882a593Smuzhiyun
723*4882a593Smuzhiyun info = out.str();
724*4882a593Smuzhiyun
725*4882a593Smuzhiyun if (all_output_prepared)
726*4882a593Smuzhiyun break;
727*4882a593Smuzhiyun else if (all_output && strcmp(info.c_str(),"0")>0)
728*4882a593Smuzhiyun name++;
729*4882a593Smuzhiyun
730*4882a593Smuzhiyun } while(all_output);
731*4882a593Smuzhiyun
732*4882a593Smuzhiyun temp = info.c_str();
733*4882a593Smuzhiyun
734*4882a593Smuzhiyun return temp;
735*4882a593Smuzhiyun }
736*4882a593Smuzhiyun
imcheckHeader(im_api_version_t header_version)737*4882a593Smuzhiyun IM_API IM_STATUS imcheckHeader(im_api_version_t header_version) {
738*4882a593Smuzhiyun return rga_check_header(RGA_GET_API_VERSION(header_version));
739*4882a593Smuzhiyun }
740*4882a593Smuzhiyun
rga_check_perpare(rga_buffer_t * src,rga_buffer_t * dst,rga_buffer_t * pat,im_rect * src_rect,im_rect * dst_rect,im_rect * pat_rect,int mode_usage)741*4882a593Smuzhiyun void rga_check_perpare(rga_buffer_t *src, rga_buffer_t *dst, rga_buffer_t *pat,
742*4882a593Smuzhiyun im_rect *src_rect, im_rect *dst_rect, im_rect *pat_rect, int mode_usage) {
743*4882a593Smuzhiyun (void)(src);
744*4882a593Smuzhiyun (void)(dst);
745*4882a593Smuzhiyun (void)(pat);
746*4882a593Smuzhiyun (void)(src_rect);
747*4882a593Smuzhiyun (void)(dst_rect);
748*4882a593Smuzhiyun (void)(pat_rect);
749*4882a593Smuzhiyun (void)(mode_usage);
750*4882a593Smuzhiyun }
751*4882a593Smuzhiyun
imsync(int fence_fd)752*4882a593Smuzhiyun IM_API IM_STATUS imsync(int fence_fd) {
753*4882a593Smuzhiyun int ret = 0;
754*4882a593Smuzhiyun
755*4882a593Smuzhiyun if (fence_fd <= 0) {
756*4882a593Smuzhiyun IM_LOGE("illegal fence_fd[%d]", fence_fd);
757*4882a593Smuzhiyun return IM_STATUS_ILLEGAL_PARAM;
758*4882a593Smuzhiyun }
759*4882a593Smuzhiyun
760*4882a593Smuzhiyun ret = rga_sync_wait(fence_fd, -1);
761*4882a593Smuzhiyun if (ret) {
762*4882a593Smuzhiyun IM_LOGE("Failed to wait for out fence = %d, ret = %d", fence_fd, ret);
763*4882a593Smuzhiyun return IM_STATUS_FAILED;
764*4882a593Smuzhiyun }
765*4882a593Smuzhiyun
766*4882a593Smuzhiyun close(fence_fd);
767*4882a593Smuzhiyun
768*4882a593Smuzhiyun return IM_STATUS_SUCCESS;
769*4882a593Smuzhiyun }
770*4882a593Smuzhiyun
imconfig(IM_CONFIG_NAME name,uint64_t value)771*4882a593Smuzhiyun IM_API IM_STATUS imconfig(IM_CONFIG_NAME name, uint64_t value) {
772*4882a593Smuzhiyun
773*4882a593Smuzhiyun switch (name) {
774*4882a593Smuzhiyun case IM_CONFIG_SCHEDULER_CORE :
775*4882a593Smuzhiyun if (value & IM_SCHEDULER_MASK) {
776*4882a593Smuzhiyun g_im2d_context.core = (IM_SCHEDULER_CORE)value;
777*4882a593Smuzhiyun } else {
778*4882a593Smuzhiyun IM_LOGE("IM2D: It's not legal rga_core[0x%lx], it needs to be a 'IM_SCHEDULER_CORE'.", (unsigned long)value);
779*4882a593Smuzhiyun return IM_STATUS_ILLEGAL_PARAM;
780*4882a593Smuzhiyun }
781*4882a593Smuzhiyun break;
782*4882a593Smuzhiyun case IM_CONFIG_PRIORITY :
783*4882a593Smuzhiyun if (value <= 6) {
784*4882a593Smuzhiyun g_im2d_context.priority = (int)value;
785*4882a593Smuzhiyun } else {
786*4882a593Smuzhiyun IM_LOGE("IM2D: It's not legal priority[0x%lx], it needs to be a 'int', and it should be in the range of 0~6.", (unsigned long)value);
787*4882a593Smuzhiyun return IM_STATUS_ILLEGAL_PARAM;
788*4882a593Smuzhiyun }
789*4882a593Smuzhiyun break;
790*4882a593Smuzhiyun case IM_CONFIG_CHECK :
791*4882a593Smuzhiyun if (value == false || value == true) {
792*4882a593Smuzhiyun g_im2d_context.check_mode = (bool)value;
793*4882a593Smuzhiyun } else {
794*4882a593Smuzhiyun IM_LOGE("IM2D: It's not legal check config[0x%lx], it needs to be a 'bool'.", (unsigned long)value);
795*4882a593Smuzhiyun return IM_STATUS_ILLEGAL_PARAM;
796*4882a593Smuzhiyun }
797*4882a593Smuzhiyun break;
798*4882a593Smuzhiyun default :
799*4882a593Smuzhiyun IM_LOGE("IM2D: Unsupported config name!");
800*4882a593Smuzhiyun return IM_STATUS_NOT_SUPPORTED;
801*4882a593Smuzhiyun }
802*4882a593Smuzhiyun
803*4882a593Smuzhiyun return IM_STATUS_SUCCESS;
804*4882a593Smuzhiyun }
805*4882a593Smuzhiyun
806*4882a593Smuzhiyun /* Start single task api */
imcopy(const rga_buffer_t src,rga_buffer_t dst,int sync,int * release_fence_fd)807*4882a593Smuzhiyun IM_API IM_STATUS imcopy(const rga_buffer_t src, rga_buffer_t dst, int sync, int *release_fence_fd) {
808*4882a593Smuzhiyun int usage = 0;
809*4882a593Smuzhiyun IM_STATUS ret = IM_STATUS_NOERROR;
810*4882a593Smuzhiyun
811*4882a593Smuzhiyun im_opt_t opt;
812*4882a593Smuzhiyun
813*4882a593Smuzhiyun rga_buffer_t pat;
814*4882a593Smuzhiyun
815*4882a593Smuzhiyun im_rect srect;
816*4882a593Smuzhiyun im_rect drect;
817*4882a593Smuzhiyun im_rect prect;
818*4882a593Smuzhiyun
819*4882a593Smuzhiyun empty_structure(NULL, NULL, &pat, &srect, &drect, &prect, &opt);
820*4882a593Smuzhiyun
821*4882a593Smuzhiyun if ((src.width != dst.width) || (src.height != dst.height)) {
822*4882a593Smuzhiyun IM_LOGW("imcopy cannot support scale, src[w,h] = [%d, %d], dst[w,h] = [%d, %d]",
823*4882a593Smuzhiyun src.width, src.height, dst.width, dst.height);
824*4882a593Smuzhiyun return IM_STATUS_INVALID_PARAM;
825*4882a593Smuzhiyun }
826*4882a593Smuzhiyun
827*4882a593Smuzhiyun if (sync == 0)
828*4882a593Smuzhiyun usage |= IM_ASYNC;
829*4882a593Smuzhiyun else if (sync == 1)
830*4882a593Smuzhiyun usage |= IM_SYNC;
831*4882a593Smuzhiyun
832*4882a593Smuzhiyun ret = improcess(src, dst, pat, srect, drect, prect, -1, release_fence_fd, &opt, usage);
833*4882a593Smuzhiyun
834*4882a593Smuzhiyun return ret;
835*4882a593Smuzhiyun }
836*4882a593Smuzhiyun
imresize(const rga_buffer_t src,rga_buffer_t dst,double fx,double fy,int interpolation,int sync,int * release_fence_fd)837*4882a593Smuzhiyun IM_API IM_STATUS imresize(const rga_buffer_t src, rga_buffer_t dst, double fx, double fy, int interpolation, int sync, int *release_fence_fd) {
838*4882a593Smuzhiyun int usage = 0;
839*4882a593Smuzhiyun IM_STATUS ret = IM_STATUS_NOERROR;
840*4882a593Smuzhiyun
841*4882a593Smuzhiyun im_opt_t opt;
842*4882a593Smuzhiyun
843*4882a593Smuzhiyun rga_buffer_t pat;
844*4882a593Smuzhiyun
845*4882a593Smuzhiyun im_rect srect;
846*4882a593Smuzhiyun im_rect drect;
847*4882a593Smuzhiyun im_rect prect;
848*4882a593Smuzhiyun
849*4882a593Smuzhiyun empty_structure(NULL, NULL, &pat, &srect, &drect, &prect, &opt);
850*4882a593Smuzhiyun
851*4882a593Smuzhiyun if (fx > 0 || fy > 0) {
852*4882a593Smuzhiyun if (fx == 0) fx = 1;
853*4882a593Smuzhiyun if (fy == 0) fy = 1;
854*4882a593Smuzhiyun
855*4882a593Smuzhiyun dst.width = (int)(src.width * fx);
856*4882a593Smuzhiyun dst.height = (int)(src.height * fy);
857*4882a593Smuzhiyun
858*4882a593Smuzhiyun int format = convert_to_rga_format(dst.format);
859*4882a593Smuzhiyun if (format == RK_FORMAT_UNKNOWN) {
860*4882a593Smuzhiyun IM_LOGE("Invaild dst format [0x%x]!\n", dst.format);
861*4882a593Smuzhiyun return IM_STATUS_NOT_SUPPORTED;
862*4882a593Smuzhiyun }
863*4882a593Smuzhiyun
864*4882a593Smuzhiyun if(NormalRgaIsYuvFormat(format)) {
865*4882a593Smuzhiyun int width = dst.width;
866*4882a593Smuzhiyun int height = dst.height;
867*4882a593Smuzhiyun dst.width = DOWN_ALIGN(dst.width, 2);
868*4882a593Smuzhiyun dst.height = DOWN_ALIGN(dst.height, 2);
869*4882a593Smuzhiyun
870*4882a593Smuzhiyun ret = imcheck(src, dst, srect, drect, usage);
871*4882a593Smuzhiyun if (ret != IM_STATUS_NOERROR) {
872*4882a593Smuzhiyun IM_LOGE("imresize error, factor[fx,fy]=[%lf,%lf], ALIGN[dw,dh]=[%d,%d][%d,%d]", fx, fy, width, height, dst.width, dst.height);
873*4882a593Smuzhiyun return ret;
874*4882a593Smuzhiyun }
875*4882a593Smuzhiyun }
876*4882a593Smuzhiyun }
877*4882a593Smuzhiyun UNUSED(interpolation);
878*4882a593Smuzhiyun
879*4882a593Smuzhiyun if (sync == 0)
880*4882a593Smuzhiyun usage |= IM_ASYNC;
881*4882a593Smuzhiyun else if (sync == 1)
882*4882a593Smuzhiyun usage |= IM_SYNC;
883*4882a593Smuzhiyun
884*4882a593Smuzhiyun ret = improcess(src, dst, pat, srect, drect, prect, -1, release_fence_fd, &opt, usage);
885*4882a593Smuzhiyun
886*4882a593Smuzhiyun return ret;
887*4882a593Smuzhiyun }
888*4882a593Smuzhiyun
imcvtcolor(rga_buffer_t src,rga_buffer_t dst,int sfmt,int dfmt,int mode,int sync,int * release_fence_fd)889*4882a593Smuzhiyun IM_API IM_STATUS imcvtcolor(rga_buffer_t src, rga_buffer_t dst, int sfmt, int dfmt, int mode, int sync, int *release_fence_fd) {
890*4882a593Smuzhiyun int usage = 0;
891*4882a593Smuzhiyun IM_STATUS ret = IM_STATUS_NOERROR;
892*4882a593Smuzhiyun
893*4882a593Smuzhiyun im_opt_t opt;
894*4882a593Smuzhiyun
895*4882a593Smuzhiyun rga_buffer_t pat;
896*4882a593Smuzhiyun
897*4882a593Smuzhiyun im_rect srect;
898*4882a593Smuzhiyun im_rect drect;
899*4882a593Smuzhiyun im_rect prect;
900*4882a593Smuzhiyun
901*4882a593Smuzhiyun empty_structure(NULL, NULL, &pat, &srect, &drect, &prect, &opt);
902*4882a593Smuzhiyun
903*4882a593Smuzhiyun src.format = sfmt;
904*4882a593Smuzhiyun dst.format = dfmt;
905*4882a593Smuzhiyun
906*4882a593Smuzhiyun dst.color_space_mode = mode;
907*4882a593Smuzhiyun
908*4882a593Smuzhiyun if (sync == 0)
909*4882a593Smuzhiyun usage |= IM_ASYNC;
910*4882a593Smuzhiyun else if (sync == 1)
911*4882a593Smuzhiyun usage |= IM_SYNC;
912*4882a593Smuzhiyun
913*4882a593Smuzhiyun ret = improcess(src, dst, pat, srect, drect, prect, -1, release_fence_fd, &opt, usage);
914*4882a593Smuzhiyun
915*4882a593Smuzhiyun return ret;
916*4882a593Smuzhiyun }
917*4882a593Smuzhiyun
imcrop(const rga_buffer_t src,rga_buffer_t dst,im_rect rect,int sync,int * release_fence_fd)918*4882a593Smuzhiyun IM_API IM_STATUS imcrop(const rga_buffer_t src, rga_buffer_t dst, im_rect rect, int sync, int *release_fence_fd) {
919*4882a593Smuzhiyun int usage = 0;
920*4882a593Smuzhiyun IM_STATUS ret = IM_STATUS_NOERROR;
921*4882a593Smuzhiyun
922*4882a593Smuzhiyun im_opt_t opt;
923*4882a593Smuzhiyun
924*4882a593Smuzhiyun rga_buffer_t pat;
925*4882a593Smuzhiyun
926*4882a593Smuzhiyun im_rect drect;
927*4882a593Smuzhiyun im_rect prect;
928*4882a593Smuzhiyun
929*4882a593Smuzhiyun empty_structure(NULL, NULL, &pat, NULL, &drect, &prect, &opt);
930*4882a593Smuzhiyun
931*4882a593Smuzhiyun drect.width = rect.width;
932*4882a593Smuzhiyun drect.height = rect.height;
933*4882a593Smuzhiyun
934*4882a593Smuzhiyun if (sync == 0)
935*4882a593Smuzhiyun usage |= IM_ASYNC;
936*4882a593Smuzhiyun else if (sync == 1)
937*4882a593Smuzhiyun usage |= IM_SYNC;
938*4882a593Smuzhiyun
939*4882a593Smuzhiyun ret = improcess(src, dst, pat, rect, drect, prect, -1, release_fence_fd, &opt, usage);
940*4882a593Smuzhiyun
941*4882a593Smuzhiyun return ret;
942*4882a593Smuzhiyun }
943*4882a593Smuzhiyun
imtranslate(const rga_buffer_t src,rga_buffer_t dst,int x,int y,int sync,int * release_fence_fd)944*4882a593Smuzhiyun IM_API IM_STATUS imtranslate(const rga_buffer_t src, rga_buffer_t dst, int x, int y, int sync, int *release_fence_fd) {
945*4882a593Smuzhiyun int usage = 0;
946*4882a593Smuzhiyun IM_STATUS ret = IM_STATUS_NOERROR;
947*4882a593Smuzhiyun
948*4882a593Smuzhiyun im_opt_t opt;
949*4882a593Smuzhiyun
950*4882a593Smuzhiyun rga_buffer_t pat;
951*4882a593Smuzhiyun
952*4882a593Smuzhiyun im_rect srect;
953*4882a593Smuzhiyun im_rect drect;
954*4882a593Smuzhiyun im_rect prect;
955*4882a593Smuzhiyun
956*4882a593Smuzhiyun empty_structure(NULL, NULL, &pat, &srect, &drect, &prect, &opt);
957*4882a593Smuzhiyun
958*4882a593Smuzhiyun if ((src.width != dst.width) || (src.height != dst.height)) {
959*4882a593Smuzhiyun IM_LOGW("The width and height of src and dst need to be equal, src[w,h] = [%d, %d], dst[w,h] = [%d, %d]",
960*4882a593Smuzhiyun src.width, src.height, dst.width, dst.height);
961*4882a593Smuzhiyun return IM_STATUS_INVALID_PARAM;
962*4882a593Smuzhiyun }
963*4882a593Smuzhiyun
964*4882a593Smuzhiyun if (sync == 0)
965*4882a593Smuzhiyun usage |= IM_ASYNC;
966*4882a593Smuzhiyun else if (sync == 1)
967*4882a593Smuzhiyun usage |= IM_SYNC;
968*4882a593Smuzhiyun
969*4882a593Smuzhiyun srect.width = src.width - x;
970*4882a593Smuzhiyun srect.height = src.height - y;
971*4882a593Smuzhiyun drect.x = x;
972*4882a593Smuzhiyun drect.y = y;
973*4882a593Smuzhiyun drect.width = src.width - x;
974*4882a593Smuzhiyun drect.height = src.height - y;
975*4882a593Smuzhiyun
976*4882a593Smuzhiyun ret = improcess(src, dst, pat, srect, drect, prect, -1, release_fence_fd, &opt, usage);
977*4882a593Smuzhiyun
978*4882a593Smuzhiyun return ret;
979*4882a593Smuzhiyun }
980*4882a593Smuzhiyun
imrotate(const rga_buffer_t src,rga_buffer_t dst,int rotation,int sync,int * release_fence_fd)981*4882a593Smuzhiyun IM_API IM_STATUS imrotate(const rga_buffer_t src, rga_buffer_t dst, int rotation, int sync, int *release_fence_fd) {
982*4882a593Smuzhiyun int usage = 0;
983*4882a593Smuzhiyun IM_STATUS ret = IM_STATUS_NOERROR;
984*4882a593Smuzhiyun
985*4882a593Smuzhiyun im_opt_t opt;
986*4882a593Smuzhiyun
987*4882a593Smuzhiyun rga_buffer_t pat;
988*4882a593Smuzhiyun
989*4882a593Smuzhiyun im_rect srect;
990*4882a593Smuzhiyun im_rect drect;
991*4882a593Smuzhiyun im_rect prect;
992*4882a593Smuzhiyun
993*4882a593Smuzhiyun empty_structure(NULL, NULL, &pat, &srect, &drect, &prect, &opt);
994*4882a593Smuzhiyun
995*4882a593Smuzhiyun usage |= rotation;
996*4882a593Smuzhiyun
997*4882a593Smuzhiyun if (sync == 0)
998*4882a593Smuzhiyun usage |= IM_ASYNC;
999*4882a593Smuzhiyun else if (sync == 1)
1000*4882a593Smuzhiyun usage |= IM_SYNC;
1001*4882a593Smuzhiyun
1002*4882a593Smuzhiyun ret = improcess(src, dst, pat, srect, drect, prect, -1, release_fence_fd, &opt, usage);
1003*4882a593Smuzhiyun
1004*4882a593Smuzhiyun return ret;
1005*4882a593Smuzhiyun }
1006*4882a593Smuzhiyun
imflip(const rga_buffer_t src,rga_buffer_t dst,int mode,int sync,int * release_fence_fd)1007*4882a593Smuzhiyun IM_API IM_STATUS imflip(const rga_buffer_t src, rga_buffer_t dst, int mode, int sync, int *release_fence_fd) {
1008*4882a593Smuzhiyun int usage = 0;
1009*4882a593Smuzhiyun IM_STATUS ret = IM_STATUS_NOERROR;
1010*4882a593Smuzhiyun
1011*4882a593Smuzhiyun im_opt_t opt;
1012*4882a593Smuzhiyun
1013*4882a593Smuzhiyun rga_buffer_t pat;
1014*4882a593Smuzhiyun
1015*4882a593Smuzhiyun im_rect srect;
1016*4882a593Smuzhiyun im_rect drect;
1017*4882a593Smuzhiyun im_rect prect;
1018*4882a593Smuzhiyun
1019*4882a593Smuzhiyun empty_structure(NULL, NULL, &pat, &srect, &drect, &prect, &opt);
1020*4882a593Smuzhiyun
1021*4882a593Smuzhiyun usage |= mode;
1022*4882a593Smuzhiyun
1023*4882a593Smuzhiyun if (sync == 0)
1024*4882a593Smuzhiyun usage |= IM_ASYNC;
1025*4882a593Smuzhiyun else if (sync == 1)
1026*4882a593Smuzhiyun usage |= IM_SYNC;
1027*4882a593Smuzhiyun
1028*4882a593Smuzhiyun ret = improcess(src, dst, pat, srect, drect, prect, -1, release_fence_fd, &opt, usage);
1029*4882a593Smuzhiyun
1030*4882a593Smuzhiyun return ret;
1031*4882a593Smuzhiyun }
1032*4882a593Smuzhiyun
imcomposite(const rga_buffer_t srcA,const rga_buffer_t srcB,rga_buffer_t dst,int mode,int sync,int * release_fence_fd)1033*4882a593Smuzhiyun IM_API IM_STATUS imcomposite(const rga_buffer_t srcA, const rga_buffer_t srcB, rga_buffer_t dst, int mode, int sync, int *release_fence_fd) {
1034*4882a593Smuzhiyun int usage = 0;
1035*4882a593Smuzhiyun IM_STATUS ret = IM_STATUS_NOERROR;
1036*4882a593Smuzhiyun
1037*4882a593Smuzhiyun im_opt_t opt;
1038*4882a593Smuzhiyun
1039*4882a593Smuzhiyun im_rect srect;
1040*4882a593Smuzhiyun im_rect drect;
1041*4882a593Smuzhiyun im_rect prect;
1042*4882a593Smuzhiyun
1043*4882a593Smuzhiyun empty_structure(NULL, NULL, NULL, &srect, &drect, &prect, &opt);
1044*4882a593Smuzhiyun
1045*4882a593Smuzhiyun usage |= mode;
1046*4882a593Smuzhiyun
1047*4882a593Smuzhiyun if (sync == 0)
1048*4882a593Smuzhiyun usage |= IM_ASYNC;
1049*4882a593Smuzhiyun else if (sync == 1)
1050*4882a593Smuzhiyun usage |= IM_SYNC;
1051*4882a593Smuzhiyun
1052*4882a593Smuzhiyun ret = improcess(srcA, dst, srcB, srect, drect, prect, -1, release_fence_fd, &opt, usage);
1053*4882a593Smuzhiyun
1054*4882a593Smuzhiyun return ret;
1055*4882a593Smuzhiyun }
1056*4882a593Smuzhiyun
imblend(const rga_buffer_t src,rga_buffer_t dst,int mode,int sync,int * release_fence_fd)1057*4882a593Smuzhiyun IM_API IM_STATUS imblend(const rga_buffer_t src, rga_buffer_t dst, int mode, int sync, int *release_fence_fd) {
1058*4882a593Smuzhiyun rga_buffer_t pat;
1059*4882a593Smuzhiyun
1060*4882a593Smuzhiyun memset(&pat, 0x0, sizeof(pat));
1061*4882a593Smuzhiyun
1062*4882a593Smuzhiyun return imcomposite(src, pat, dst, mode, sync, release_fence_fd);
1063*4882a593Smuzhiyun }
1064*4882a593Smuzhiyun
imosd(const rga_buffer_t osd,const rga_buffer_t dst,const im_rect osd_rect,im_osd_t * osd_info,int sync,int * release_fence_fd)1065*4882a593Smuzhiyun IM_API IM_STATUS imosd(const rga_buffer_t osd,const rga_buffer_t dst,
1066*4882a593Smuzhiyun const im_rect osd_rect, im_osd_t *osd_info,
1067*4882a593Smuzhiyun int sync, int *release_fence_fd) {
1068*4882a593Smuzhiyun int usage = 0;
1069*4882a593Smuzhiyun im_opt_t opt;
1070*4882a593Smuzhiyun im_rect tmp_rect;
1071*4882a593Smuzhiyun
1072*4882a593Smuzhiyun memset(&opt, 0x0, sizeof(opt));
1073*4882a593Smuzhiyun memset(&tmp_rect, 0x0, sizeof(tmp_rect));
1074*4882a593Smuzhiyun
1075*4882a593Smuzhiyun opt.version = RGA_CURRENT_API_VERSION;
1076*4882a593Smuzhiyun memcpy(&opt.osd_config, osd_info, sizeof(im_osd_t));
1077*4882a593Smuzhiyun
1078*4882a593Smuzhiyun usage |= IM_ALPHA_BLEND_DST_OVER | IM_OSD;
1079*4882a593Smuzhiyun
1080*4882a593Smuzhiyun if (sync == 0)
1081*4882a593Smuzhiyun usage |= IM_ASYNC;
1082*4882a593Smuzhiyun else if (sync == 1)
1083*4882a593Smuzhiyun usage |= IM_SYNC;
1084*4882a593Smuzhiyun
1085*4882a593Smuzhiyun return improcess(dst, dst, osd, osd_rect, osd_rect, tmp_rect, -1, release_fence_fd, &opt, usage);
1086*4882a593Smuzhiyun }
1087*4882a593Smuzhiyun
imcolorkey(const rga_buffer_t src,rga_buffer_t dst,im_colorkey_range range,int mode,int sync,int * release_fence_fd)1088*4882a593Smuzhiyun IM_API IM_STATUS imcolorkey(const rga_buffer_t src, rga_buffer_t dst, im_colorkey_range range, int mode, int sync, int *release_fence_fd) {
1089*4882a593Smuzhiyun int usage = 0;
1090*4882a593Smuzhiyun IM_STATUS ret = IM_STATUS_NOERROR;
1091*4882a593Smuzhiyun
1092*4882a593Smuzhiyun im_opt_t opt;
1093*4882a593Smuzhiyun
1094*4882a593Smuzhiyun rga_buffer_t pat;
1095*4882a593Smuzhiyun
1096*4882a593Smuzhiyun im_rect srect;
1097*4882a593Smuzhiyun im_rect drect;
1098*4882a593Smuzhiyun im_rect prect;
1099*4882a593Smuzhiyun
1100*4882a593Smuzhiyun empty_structure(NULL, NULL, &pat, &srect, &drect, &prect, &opt);
1101*4882a593Smuzhiyun
1102*4882a593Smuzhiyun usage |= mode;
1103*4882a593Smuzhiyun
1104*4882a593Smuzhiyun opt.colorkey_range = range;
1105*4882a593Smuzhiyun
1106*4882a593Smuzhiyun if (sync == 0)
1107*4882a593Smuzhiyun usage |= IM_ASYNC;
1108*4882a593Smuzhiyun else if (sync == 1)
1109*4882a593Smuzhiyun usage |= IM_SYNC;
1110*4882a593Smuzhiyun
1111*4882a593Smuzhiyun ret = improcess(src, dst, pat, srect, drect, prect, -1, release_fence_fd, &opt, usage);
1112*4882a593Smuzhiyun
1113*4882a593Smuzhiyun return ret;
1114*4882a593Smuzhiyun }
1115*4882a593Smuzhiyun
imquantize(const rga_buffer_t src,rga_buffer_t dst,im_nn_t nn_info,int sync,int * release_fence_fd)1116*4882a593Smuzhiyun IM_API IM_STATUS imquantize(const rga_buffer_t src, rga_buffer_t dst, im_nn_t nn_info, int sync, int *release_fence_fd) {
1117*4882a593Smuzhiyun int usage = 0;
1118*4882a593Smuzhiyun IM_STATUS ret = IM_STATUS_NOERROR;
1119*4882a593Smuzhiyun
1120*4882a593Smuzhiyun im_opt_t opt;
1121*4882a593Smuzhiyun
1122*4882a593Smuzhiyun rga_buffer_t pat;
1123*4882a593Smuzhiyun
1124*4882a593Smuzhiyun im_rect srect;
1125*4882a593Smuzhiyun im_rect drect;
1126*4882a593Smuzhiyun im_rect prect;
1127*4882a593Smuzhiyun
1128*4882a593Smuzhiyun empty_structure(NULL, NULL, &pat, &srect, &drect, &prect, &opt);
1129*4882a593Smuzhiyun
1130*4882a593Smuzhiyun usage |= IM_NN_QUANTIZE;
1131*4882a593Smuzhiyun
1132*4882a593Smuzhiyun opt.nn = nn_info;
1133*4882a593Smuzhiyun
1134*4882a593Smuzhiyun if (sync == 0)
1135*4882a593Smuzhiyun usage |= IM_ASYNC;
1136*4882a593Smuzhiyun else if (sync == 1)
1137*4882a593Smuzhiyun usage |= IM_SYNC;
1138*4882a593Smuzhiyun
1139*4882a593Smuzhiyun ret = improcess(src, dst, pat, srect, drect, prect, -1, release_fence_fd, &opt, usage);
1140*4882a593Smuzhiyun
1141*4882a593Smuzhiyun return ret;
1142*4882a593Smuzhiyun }
1143*4882a593Smuzhiyun
imrop(const rga_buffer_t src,rga_buffer_t dst,int rop_code,int sync,int * release_fence_fd)1144*4882a593Smuzhiyun IM_API IM_STATUS imrop(const rga_buffer_t src, rga_buffer_t dst, int rop_code, int sync, int *release_fence_fd) {
1145*4882a593Smuzhiyun int usage = 0;
1146*4882a593Smuzhiyun IM_STATUS ret = IM_STATUS_NOERROR;
1147*4882a593Smuzhiyun
1148*4882a593Smuzhiyun im_opt_t opt;
1149*4882a593Smuzhiyun
1150*4882a593Smuzhiyun rga_buffer_t pat;
1151*4882a593Smuzhiyun
1152*4882a593Smuzhiyun im_rect srect;
1153*4882a593Smuzhiyun im_rect drect;
1154*4882a593Smuzhiyun im_rect prect;
1155*4882a593Smuzhiyun
1156*4882a593Smuzhiyun empty_structure(NULL, NULL, &pat, &srect, &drect, &prect, &opt);
1157*4882a593Smuzhiyun
1158*4882a593Smuzhiyun usage |= IM_ROP;
1159*4882a593Smuzhiyun
1160*4882a593Smuzhiyun opt.rop_code = rop_code;
1161*4882a593Smuzhiyun
1162*4882a593Smuzhiyun if (sync == 0)
1163*4882a593Smuzhiyun usage |= IM_ASYNC;
1164*4882a593Smuzhiyun else if (sync == 1)
1165*4882a593Smuzhiyun usage |= IM_SYNC;
1166*4882a593Smuzhiyun
1167*4882a593Smuzhiyun ret = improcess(src, dst, pat, srect, drect, prect, -1, release_fence_fd, &opt, usage);
1168*4882a593Smuzhiyun
1169*4882a593Smuzhiyun return ret;
1170*4882a593Smuzhiyun }
1171*4882a593Smuzhiyun
immosaic(const rga_buffer_t image,im_rect rect,int mosaic_mode,int sync,int * release_fence_fd)1172*4882a593Smuzhiyun IM_API IM_STATUS immosaic(const rga_buffer_t image, im_rect rect, int mosaic_mode, int sync, int *release_fence_fd) {
1173*4882a593Smuzhiyun IM_STATUS ret = IM_STATUS_NOERROR;
1174*4882a593Smuzhiyun int usage = 0;
1175*4882a593Smuzhiyun im_opt_t opt;
1176*4882a593Smuzhiyun rga_buffer_t tmp_image;
1177*4882a593Smuzhiyun im_rect tmp_rect;
1178*4882a593Smuzhiyun
1179*4882a593Smuzhiyun memset(&opt, 0x0, sizeof(opt));
1180*4882a593Smuzhiyun memset(&tmp_image, 0x0, sizeof(tmp_image));
1181*4882a593Smuzhiyun memset(&tmp_rect, 0x0, sizeof(tmp_rect));
1182*4882a593Smuzhiyun
1183*4882a593Smuzhiyun usage |= IM_MOSAIC;
1184*4882a593Smuzhiyun
1185*4882a593Smuzhiyun opt.version = RGA_CURRENT_API_VERSION;
1186*4882a593Smuzhiyun opt.mosaic_mode = mosaic_mode;
1187*4882a593Smuzhiyun
1188*4882a593Smuzhiyun if (sync == 0)
1189*4882a593Smuzhiyun usage |= IM_ASYNC;
1190*4882a593Smuzhiyun else if (sync == 1)
1191*4882a593Smuzhiyun usage |= IM_SYNC;
1192*4882a593Smuzhiyun
1193*4882a593Smuzhiyun return improcess(image, image, tmp_image, rect, rect, tmp_rect, -1, release_fence_fd, &opt, usage);
1194*4882a593Smuzhiyun }
1195*4882a593Smuzhiyun
immosaicArray(rga_buffer_t dst,im_rect * rect_array,int array_size,int mosaic_mode,int sync,int * release_fence_fd)1196*4882a593Smuzhiyun IM_STATUS immosaicArray(rga_buffer_t dst, im_rect *rect_array, int array_size, int mosaic_mode, int sync, int *release_fence_fd) {
1197*4882a593Smuzhiyun IM_STATUS ret;
1198*4882a593Smuzhiyun int tmp_fence_fd = -1;
1199*4882a593Smuzhiyun
1200*4882a593Smuzhiyun for (int i = 0; i < array_size; i++) {
1201*4882a593Smuzhiyun ret = immosaic(dst, rect_array[i], mosaic_mode, sync, release_fence_fd);
1202*4882a593Smuzhiyun if (ret != IM_STATUS_SUCCESS)
1203*4882a593Smuzhiyun return ret;
1204*4882a593Smuzhiyun
1205*4882a593Smuzhiyun if (sync == 0 && release_fence_fd) {
1206*4882a593Smuzhiyun if (*release_fence_fd >= 0 && tmp_fence_fd >= 0) {
1207*4882a593Smuzhiyun tmp_fence_fd = rga_sync_merge("mosaic_array", tmp_fence_fd, *release_fence_fd);
1208*4882a593Smuzhiyun } else if (*release_fence_fd >= 0) {
1209*4882a593Smuzhiyun tmp_fence_fd = *release_fence_fd;
1210*4882a593Smuzhiyun }
1211*4882a593Smuzhiyun }
1212*4882a593Smuzhiyun }
1213*4882a593Smuzhiyun
1214*4882a593Smuzhiyun if (release_fence_fd)
1215*4882a593Smuzhiyun *release_fence_fd = tmp_fence_fd;
1216*4882a593Smuzhiyun
1217*4882a593Smuzhiyun return IM_STATUS_SUCCESS;
1218*4882a593Smuzhiyun }
1219*4882a593Smuzhiyun
impalette(rga_buffer_t src,rga_buffer_t dst,rga_buffer_t lut,int sync,int * release_fence_fd)1220*4882a593Smuzhiyun IM_API IM_STATUS impalette(rga_buffer_t src, rga_buffer_t dst, rga_buffer_t lut, int sync, int *release_fence_fd) {
1221*4882a593Smuzhiyun int usage = 0;
1222*4882a593Smuzhiyun IM_STATUS ret = IM_STATUS_NOERROR;
1223*4882a593Smuzhiyun im_rect srect;
1224*4882a593Smuzhiyun im_rect drect;
1225*4882a593Smuzhiyun im_rect prect;
1226*4882a593Smuzhiyun
1227*4882a593Smuzhiyun im_opt_t opt;
1228*4882a593Smuzhiyun
1229*4882a593Smuzhiyun empty_structure(NULL, NULL, NULL, &srect, &drect, &prect, &opt);
1230*4882a593Smuzhiyun
1231*4882a593Smuzhiyun /*Don't know if it supports zooming.*/
1232*4882a593Smuzhiyun if ((src.width != dst.width) || (src.height != dst.height)) {
1233*4882a593Smuzhiyun IM_LOGW("The width and height of src and dst need to be equal, src[w,h] = [%d, %d], dst[w,h] = [%d, %d]",
1234*4882a593Smuzhiyun src.width, src.height, dst.width, dst.height);
1235*4882a593Smuzhiyun return IM_STATUS_INVALID_PARAM;
1236*4882a593Smuzhiyun }
1237*4882a593Smuzhiyun
1238*4882a593Smuzhiyun usage |= IM_COLOR_PALETTE;
1239*4882a593Smuzhiyun
1240*4882a593Smuzhiyun if (sync == 0)
1241*4882a593Smuzhiyun usage |= IM_ASYNC;
1242*4882a593Smuzhiyun else if (sync == 1)
1243*4882a593Smuzhiyun usage |= IM_SYNC;
1244*4882a593Smuzhiyun
1245*4882a593Smuzhiyun ret = improcess(src, dst, lut, srect, drect, prect, -1, release_fence_fd, &opt, usage);
1246*4882a593Smuzhiyun
1247*4882a593Smuzhiyun return ret;
1248*4882a593Smuzhiyun }
1249*4882a593Smuzhiyun
imfill(rga_buffer_t dst,im_rect rect,int color,int sync,int * release_fence_fd)1250*4882a593Smuzhiyun IM_API IM_STATUS imfill(rga_buffer_t dst, im_rect rect, int color, int sync, int *release_fence_fd) {
1251*4882a593Smuzhiyun int usage = 0;
1252*4882a593Smuzhiyun IM_STATUS ret = IM_STATUS_NOERROR;
1253*4882a593Smuzhiyun
1254*4882a593Smuzhiyun im_opt_t opt;
1255*4882a593Smuzhiyun
1256*4882a593Smuzhiyun rga_buffer_t pat;
1257*4882a593Smuzhiyun rga_buffer_t src;
1258*4882a593Smuzhiyun
1259*4882a593Smuzhiyun im_rect srect;
1260*4882a593Smuzhiyun im_rect prect;
1261*4882a593Smuzhiyun
1262*4882a593Smuzhiyun empty_structure(&src, NULL, &pat, &srect, NULL, &prect, &opt);
1263*4882a593Smuzhiyun
1264*4882a593Smuzhiyun memset(&src, 0, sizeof(rga_buffer_t));
1265*4882a593Smuzhiyun
1266*4882a593Smuzhiyun usage |= IM_COLOR_FILL;
1267*4882a593Smuzhiyun
1268*4882a593Smuzhiyun opt.color = color;
1269*4882a593Smuzhiyun
1270*4882a593Smuzhiyun if (sync == 0)
1271*4882a593Smuzhiyun usage |= IM_ASYNC;
1272*4882a593Smuzhiyun else if (sync == 1)
1273*4882a593Smuzhiyun usage |= IM_SYNC;
1274*4882a593Smuzhiyun
1275*4882a593Smuzhiyun ret = improcess(src, dst, pat, srect, rect, prect, -1, release_fence_fd, &opt, usage);
1276*4882a593Smuzhiyun
1277*4882a593Smuzhiyun return ret;
1278*4882a593Smuzhiyun }
1279*4882a593Smuzhiyun
imfillArray(rga_buffer_t dst,im_rect * rect_array,int array_size,uint32_t color,int sync,int * release_fence_fd)1280*4882a593Smuzhiyun IM_STATUS imfillArray(rga_buffer_t dst, im_rect *rect_array, int array_size, uint32_t color, int sync, int *release_fence_fd) {
1281*4882a593Smuzhiyun IM_STATUS ret;
1282*4882a593Smuzhiyun int tmp_fence_fd = -1;
1283*4882a593Smuzhiyun
1284*4882a593Smuzhiyun for (int i = 0; i < array_size; i++) {
1285*4882a593Smuzhiyun ret = imfill(dst, rect_array[i], color, sync, release_fence_fd);
1286*4882a593Smuzhiyun if (ret != IM_STATUS_SUCCESS)
1287*4882a593Smuzhiyun return ret;
1288*4882a593Smuzhiyun
1289*4882a593Smuzhiyun if (sync == 0 && release_fence_fd) {
1290*4882a593Smuzhiyun if (*release_fence_fd >= 0 && tmp_fence_fd >= 0) {
1291*4882a593Smuzhiyun tmp_fence_fd = rga_sync_merge("fill_array", tmp_fence_fd, *release_fence_fd);
1292*4882a593Smuzhiyun } else if (*release_fence_fd >= 0) {
1293*4882a593Smuzhiyun tmp_fence_fd = *release_fence_fd;
1294*4882a593Smuzhiyun }
1295*4882a593Smuzhiyun }
1296*4882a593Smuzhiyun }
1297*4882a593Smuzhiyun
1298*4882a593Smuzhiyun if (release_fence_fd)
1299*4882a593Smuzhiyun *release_fence_fd = tmp_fence_fd;
1300*4882a593Smuzhiyun
1301*4882a593Smuzhiyun return IM_STATUS_SUCCESS;
1302*4882a593Smuzhiyun }
1303*4882a593Smuzhiyun
imrectangle(rga_buffer_t dst,im_rect rect,uint32_t color,int thickness,int sync,int * release_fence_fd)1304*4882a593Smuzhiyun IM_STATUS imrectangle(rga_buffer_t dst, im_rect rect, uint32_t color, int thickness, int sync, int *release_fence_fd) {
1305*4882a593Smuzhiyun if (thickness < 0)
1306*4882a593Smuzhiyun return imfill(dst, rect, color, sync, release_fence_fd);
1307*4882a593Smuzhiyun
1308*4882a593Smuzhiyun int h_length = rect.width;
1309*4882a593Smuzhiyun int v_length = rect.height - 2 * thickness;
1310*4882a593Smuzhiyun im_rect fill_rect[4] = {};
1311*4882a593Smuzhiyun
1312*4882a593Smuzhiyun fill_rect[0] = {rect.x, rect.y, h_length, thickness};
1313*4882a593Smuzhiyun fill_rect[1] = {rect.x, rect.y + (rect.height - thickness), h_length, thickness};
1314*4882a593Smuzhiyun fill_rect[2] = {rect.x, rect.y + thickness, thickness, v_length};
1315*4882a593Smuzhiyun fill_rect[3] = {rect.x + (rect.width - thickness), rect.y + thickness, thickness, v_length};
1316*4882a593Smuzhiyun
1317*4882a593Smuzhiyun return imfillArray(dst, fill_rect, 4, color, sync, release_fence_fd);
1318*4882a593Smuzhiyun }
1319*4882a593Smuzhiyun
imrectangleArray(rga_buffer_t dst,im_rect * rect_array,int array_size,uint32_t color,int thickness,int sync,int * release_fence_fd)1320*4882a593Smuzhiyun IM_STATUS imrectangleArray(rga_buffer_t dst, im_rect *rect_array, int array_size, uint32_t color, int thickness, int sync, int *release_fence_fd) {
1321*4882a593Smuzhiyun IM_STATUS ret;
1322*4882a593Smuzhiyun int tmp_fence_fd = -1;
1323*4882a593Smuzhiyun
1324*4882a593Smuzhiyun for (int i = 0; i < array_size; i++) {
1325*4882a593Smuzhiyun ret = imrectangle(dst, rect_array[i], color, thickness, sync, release_fence_fd);
1326*4882a593Smuzhiyun if (ret != IM_STATUS_SUCCESS)
1327*4882a593Smuzhiyun return ret;
1328*4882a593Smuzhiyun
1329*4882a593Smuzhiyun if (sync == 0 && release_fence_fd) {
1330*4882a593Smuzhiyun if (*release_fence_fd >= 0 && tmp_fence_fd >= 0) {
1331*4882a593Smuzhiyun tmp_fence_fd = rga_sync_merge("rectangle_array", tmp_fence_fd, *release_fence_fd);
1332*4882a593Smuzhiyun } else if (*release_fence_fd >= 0) {
1333*4882a593Smuzhiyun tmp_fence_fd = *release_fence_fd;
1334*4882a593Smuzhiyun }
1335*4882a593Smuzhiyun }
1336*4882a593Smuzhiyun }
1337*4882a593Smuzhiyun
1338*4882a593Smuzhiyun if (release_fence_fd)
1339*4882a593Smuzhiyun *release_fence_fd = tmp_fence_fd;
1340*4882a593Smuzhiyun
1341*4882a593Smuzhiyun return IM_STATUS_SUCCESS;
1342*4882a593Smuzhiyun }
1343*4882a593Smuzhiyun
improcess(rga_buffer_t src,rga_buffer_t dst,rga_buffer_t pat,im_rect srect,im_rect drect,im_rect prect,int usage)1344*4882a593Smuzhiyun IM_API IM_STATUS improcess(rga_buffer_t src, rga_buffer_t dst, rga_buffer_t pat,
1345*4882a593Smuzhiyun im_rect srect, im_rect drect, im_rect prect, int usage) {
1346*4882a593Smuzhiyun return rga_single_task_submit(src, dst, pat, srect, drect, prect, -1, NULL, NULL, usage);
1347*4882a593Smuzhiyun }
1348*4882a593Smuzhiyun
improcess(rga_buffer_t src,rga_buffer_t dst,rga_buffer_t pat,im_rect srect,im_rect drect,im_rect prect,int acquire_fence_fd,int * release_fence_fd,im_opt_t * opt_ptr,int usage)1349*4882a593Smuzhiyun IM_API IM_STATUS improcess(rga_buffer_t src, rga_buffer_t dst, rga_buffer_t pat,
1350*4882a593Smuzhiyun im_rect srect, im_rect drect, im_rect prect,
1351*4882a593Smuzhiyun int acquire_fence_fd, int *release_fence_fd, im_opt_t *opt_ptr, int usage) {
1352*4882a593Smuzhiyun return rga_single_task_submit(src, dst, pat, srect, drect, prect,
1353*4882a593Smuzhiyun acquire_fence_fd, release_fence_fd,
1354*4882a593Smuzhiyun opt_ptr, usage);
1355*4882a593Smuzhiyun }
1356*4882a593Smuzhiyun /* End single task api */
1357*4882a593Smuzhiyun
immakeBorder(rga_buffer_t src,rga_buffer_t dst,int top,int bottom,int left,int right,int border_type,int value,int sync,int acquir_fence_fd,int * release_fence_fd)1358*4882a593Smuzhiyun IM_STATUS immakeBorder(rga_buffer_t src, rga_buffer_t dst,
1359*4882a593Smuzhiyun int top, int bottom, int left, int right,
1360*4882a593Smuzhiyun int border_type, int value,
1361*4882a593Smuzhiyun int sync, int acquir_fence_fd, int *release_fence_fd) {
1362*4882a593Smuzhiyun IM_STATUS ret;
1363*4882a593Smuzhiyun im_job_handle_t job_handle;
1364*4882a593Smuzhiyun im_rect border_rect[4], border_src_rect[4];
1365*4882a593Smuzhiyun bool reflect;
1366*4882a593Smuzhiyun int copy_fence_fd = -1, tmp_fence_fd = -1;
1367*4882a593Smuzhiyun
1368*4882a593Smuzhiyun if (sync != 1 && release_fence_fd == NULL) {
1369*4882a593Smuzhiyun IM_LOGE("async mode, address of release_fence_fd cannot be NULL!\n");
1370*4882a593Smuzhiyun return IM_STATUS_INVALID_PARAM;
1371*4882a593Smuzhiyun }
1372*4882a593Smuzhiyun
1373*4882a593Smuzhiyun if (src.width + left + right != dst.width ||
1374*4882a593Smuzhiyun src.height + top + bottom != dst.height) {
1375*4882a593Smuzhiyun IM_LOGW("The width/height of dst must be equal to the width/height after making the border!"
1376*4882a593Smuzhiyun "src[w,h] = [%d, %d], dst[w,h] = [%d, %d], [t,b,l,r] = [%d, %d, %d, %d]\n",
1377*4882a593Smuzhiyun src.width, src.height, dst.width, dst.height, top, bottom, left, right);
1378*4882a593Smuzhiyun return IM_STATUS_ILLEGAL_PARAM;
1379*4882a593Smuzhiyun }
1380*4882a593Smuzhiyun
1381*4882a593Smuzhiyun ret = improcess(src, dst, {}, {}, {left, top, src.width, src.height}, {}, acquir_fence_fd, ©_fence_fd, NULL, IM_ASYNC);
1382*4882a593Smuzhiyun if (ret != IM_STATUS_SUCCESS || copy_fence_fd <= 0)
1383*4882a593Smuzhiyun return ret;
1384*4882a593Smuzhiyun
1385*4882a593Smuzhiyun if (top == 0 && bottom == 0 && left == 0 && right == 0) {
1386*4882a593Smuzhiyun if (sync == 1) {
1387*4882a593Smuzhiyun ret = imsync(copy_fence_fd);
1388*4882a593Smuzhiyun if (ret != IM_STATUS_SUCCESS)
1389*4882a593Smuzhiyun return ret;
1390*4882a593Smuzhiyun } else {
1391*4882a593Smuzhiyun *release_fence_fd = copy_fence_fd;
1392*4882a593Smuzhiyun return IM_STATUS_SUCCESS;
1393*4882a593Smuzhiyun }
1394*4882a593Smuzhiyun }
1395*4882a593Smuzhiyun
1396*4882a593Smuzhiyun job_handle = imbeginJob();
1397*4882a593Smuzhiyun if (job_handle <= 0)
1398*4882a593Smuzhiyun return IM_STATUS_FAILED;
1399*4882a593Smuzhiyun
1400*4882a593Smuzhiyun /* top */
1401*4882a593Smuzhiyun border_rect[0] = {left, 0, src.width, top};
1402*4882a593Smuzhiyun /* bottom */
1403*4882a593Smuzhiyun border_rect[1] = {left, src.height + top, border_rect[0].width, bottom};
1404*4882a593Smuzhiyun /* left */
1405*4882a593Smuzhiyun border_rect[2] = {0, 0, left, src.height + top + bottom};
1406*4882a593Smuzhiyun /* right */
1407*4882a593Smuzhiyun border_rect[3] = {src.width + left, 0, right, border_rect[2].height};
1408*4882a593Smuzhiyun
1409*4882a593Smuzhiyun if (border_type == IM_BORDER_CONSTANT) {
1410*4882a593Smuzhiyun if (top) {
1411*4882a593Smuzhiyun ret = imfillTask(job_handle, dst, border_rect[0], value);
1412*4882a593Smuzhiyun if (ret != IM_STATUS_SUCCESS)
1413*4882a593Smuzhiyun goto cancel_job_handle;
1414*4882a593Smuzhiyun }
1415*4882a593Smuzhiyun
1416*4882a593Smuzhiyun if (bottom) {
1417*4882a593Smuzhiyun ret = imfillTask(job_handle, dst, border_rect[1], value);
1418*4882a593Smuzhiyun if (ret != IM_STATUS_SUCCESS)
1419*4882a593Smuzhiyun goto cancel_job_handle;
1420*4882a593Smuzhiyun }
1421*4882a593Smuzhiyun
1422*4882a593Smuzhiyun if (left) {
1423*4882a593Smuzhiyun ret = imfillTask(job_handle, dst, border_rect[2], value);
1424*4882a593Smuzhiyun if (ret != IM_STATUS_SUCCESS)
1425*4882a593Smuzhiyun goto cancel_job_handle;
1426*4882a593Smuzhiyun }
1427*4882a593Smuzhiyun
1428*4882a593Smuzhiyun if (right) {
1429*4882a593Smuzhiyun ret = imfillTask(job_handle, dst, border_rect[3], value);
1430*4882a593Smuzhiyun if (ret != IM_STATUS_SUCCESS)
1431*4882a593Smuzhiyun goto cancel_job_handle;
1432*4882a593Smuzhiyun }
1433*4882a593Smuzhiyun } else {
1434*4882a593Smuzhiyun switch (border_type) {
1435*4882a593Smuzhiyun case IM_BORDER_REFLECT:
1436*4882a593Smuzhiyun /* top */
1437*4882a593Smuzhiyun border_src_rect[0] = {0, 0, src.width, top};
1438*4882a593Smuzhiyun /* bottom */
1439*4882a593Smuzhiyun border_src_rect[1] = {0, src.height - bottom, src.width, bottom};
1440*4882a593Smuzhiyun /* left */
1441*4882a593Smuzhiyun border_src_rect[2] = {left, 0, left, border_rect[2].height};
1442*4882a593Smuzhiyun /* right */
1443*4882a593Smuzhiyun border_src_rect[3] = {border_rect[3].x - right, 0, right, border_rect[3].height};
1444*4882a593Smuzhiyun
1445*4882a593Smuzhiyun reflect = true;
1446*4882a593Smuzhiyun break;
1447*4882a593Smuzhiyun case IM_BORDER_WRAP:
1448*4882a593Smuzhiyun /* top */
1449*4882a593Smuzhiyun border_src_rect[0] = {0, src.height - top, src.width, top};
1450*4882a593Smuzhiyun /* bottom */
1451*4882a593Smuzhiyun border_src_rect[1] = {0, 0, src.width, bottom};
1452*4882a593Smuzhiyun /* left */
1453*4882a593Smuzhiyun border_src_rect[2] = {border_rect[3].x - left, 0, left, border_rect[3].height};
1454*4882a593Smuzhiyun /* right */
1455*4882a593Smuzhiyun border_src_rect[3] = {left, 0, right, border_rect[2].height};
1456*4882a593Smuzhiyun reflect = false;
1457*4882a593Smuzhiyun break;
1458*4882a593Smuzhiyun default:
1459*4882a593Smuzhiyun IM_LOGW("unknown border type 0x%x\n", border_type);
1460*4882a593Smuzhiyun return imcancelJob(job_handle);
1461*4882a593Smuzhiyun }
1462*4882a593Smuzhiyun
1463*4882a593Smuzhiyun if (top || bottom) {
1464*4882a593Smuzhiyun /* top */
1465*4882a593Smuzhiyun if (top) {
1466*4882a593Smuzhiyun ret = improcessTask(job_handle, src, dst, {}, border_src_rect[0], border_rect[0], {}, NULL, reflect ? IM_HAL_TRANSFORM_FLIP_V : 0);
1467*4882a593Smuzhiyun if (ret != IM_STATUS_SUCCESS)
1468*4882a593Smuzhiyun goto cancel_job_handle;
1469*4882a593Smuzhiyun }
1470*4882a593Smuzhiyun
1471*4882a593Smuzhiyun /* bottom */
1472*4882a593Smuzhiyun if (bottom) {
1473*4882a593Smuzhiyun ret = improcessTask(job_handle, src, dst, {}, border_src_rect[1], border_rect[1], {}, NULL, reflect ? IM_HAL_TRANSFORM_FLIP_V : 0);
1474*4882a593Smuzhiyun if (ret != IM_STATUS_SUCCESS)
1475*4882a593Smuzhiyun goto cancel_job_handle;
1476*4882a593Smuzhiyun }
1477*4882a593Smuzhiyun
1478*4882a593Smuzhiyun ret = imendJob(job_handle, IM_ASYNC, copy_fence_fd, &tmp_fence_fd);
1479*4882a593Smuzhiyun if (ret != IM_STATUS_SUCCESS || tmp_fence_fd <= 0)
1480*4882a593Smuzhiyun goto cancel_job_handle;
1481*4882a593Smuzhiyun
1482*4882a593Smuzhiyun copy_fence_fd = tmp_fence_fd;
1483*4882a593Smuzhiyun
1484*4882a593Smuzhiyun job_handle = 0;
1485*4882a593Smuzhiyun job_handle = imbeginJob();
1486*4882a593Smuzhiyun if (job_handle <= 0)
1487*4882a593Smuzhiyun return IM_STATUS_FAILED;
1488*4882a593Smuzhiyun }
1489*4882a593Smuzhiyun
1490*4882a593Smuzhiyun /* left */
1491*4882a593Smuzhiyun if (left || right) {
1492*4882a593Smuzhiyun ret = improcessTask(job_handle, dst, dst, {}, border_src_rect[2], border_rect[2], {}, NULL, reflect ? IM_HAL_TRANSFORM_FLIP_H : 0);
1493*4882a593Smuzhiyun if (ret != IM_STATUS_SUCCESS)
1494*4882a593Smuzhiyun goto cancel_job_handle;
1495*4882a593Smuzhiyun
1496*4882a593Smuzhiyun /* right */
1497*4882a593Smuzhiyun ret = improcessTask(job_handle, dst, dst, {}, border_src_rect[3], border_rect[3], {}, NULL, reflect ? IM_HAL_TRANSFORM_FLIP_H : 0);
1498*4882a593Smuzhiyun if (ret != IM_STATUS_SUCCESS)
1499*4882a593Smuzhiyun goto cancel_job_handle;
1500*4882a593Smuzhiyun }
1501*4882a593Smuzhiyun }
1502*4882a593Smuzhiyun
1503*4882a593Smuzhiyun if (sync == 1) {
1504*4882a593Smuzhiyun ret = imsync(copy_fence_fd);
1505*4882a593Smuzhiyun if (ret != IM_STATUS_SUCCESS)
1506*4882a593Smuzhiyun goto cancel_job_handle;
1507*4882a593Smuzhiyun
1508*4882a593Smuzhiyun return imendJob(job_handle);
1509*4882a593Smuzhiyun } else {
1510*4882a593Smuzhiyun return imendJob(job_handle, IM_ASYNC, copy_fence_fd, release_fence_fd);
1511*4882a593Smuzhiyun }
1512*4882a593Smuzhiyun
1513*4882a593Smuzhiyun cancel_job_handle:
1514*4882a593Smuzhiyun imcancelJob(job_handle);
1515*4882a593Smuzhiyun return ret;
1516*4882a593Smuzhiyun }
1517*4882a593Smuzhiyun
1518*4882a593Smuzhiyun /* Start task api */
imbeginJob(uint64_t flags)1519*4882a593Smuzhiyun IM_API im_job_handle_t imbeginJob(uint64_t flags) {
1520*4882a593Smuzhiyun return rga_job_create(flags);
1521*4882a593Smuzhiyun }
1522*4882a593Smuzhiyun
imcancelJob(im_job_handle_t job_handle)1523*4882a593Smuzhiyun IM_API IM_STATUS imcancelJob(im_job_handle_t job_handle) {
1524*4882a593Smuzhiyun return rga_job_cancel(job_handle);
1525*4882a593Smuzhiyun }
1526*4882a593Smuzhiyun
imendJob(im_job_handle_t job_handle,int sync_mode,int acquire_fence_fd,int * release_fence_fd)1527*4882a593Smuzhiyun IM_API IM_STATUS imendJob(im_job_handle_t job_handle, int sync_mode, int acquire_fence_fd, int *release_fence_fd) {
1528*4882a593Smuzhiyun return rga_job_submit(job_handle, sync_mode, acquire_fence_fd, release_fence_fd);
1529*4882a593Smuzhiyun }
1530*4882a593Smuzhiyun
imcopyTask(im_job_handle_t job_handle,const rga_buffer_t src,rga_buffer_t dst)1531*4882a593Smuzhiyun IM_API IM_STATUS imcopyTask(im_job_handle_t job_handle, const rga_buffer_t src, rga_buffer_t dst) {
1532*4882a593Smuzhiyun int usage = 0;
1533*4882a593Smuzhiyun im_opt_t opt;
1534*4882a593Smuzhiyun rga_buffer_t pat;
1535*4882a593Smuzhiyun im_rect srect;
1536*4882a593Smuzhiyun im_rect drect;
1537*4882a593Smuzhiyun im_rect prect;
1538*4882a593Smuzhiyun
1539*4882a593Smuzhiyun empty_structure(NULL, NULL, &pat, &srect, &drect, &prect, &opt);
1540*4882a593Smuzhiyun
1541*4882a593Smuzhiyun if ((src.width != dst.width) || (src.height != dst.height)) {
1542*4882a593Smuzhiyun IM_LOGW("imcopy cannot support scale, src[w,h] = [%d, %d], dst[w,h] = [%d, %d]",
1543*4882a593Smuzhiyun src.width, src.height, dst.width, dst.height);
1544*4882a593Smuzhiyun return IM_STATUS_INVALID_PARAM;
1545*4882a593Smuzhiyun }
1546*4882a593Smuzhiyun
1547*4882a593Smuzhiyun return improcessTask(job_handle, src, dst, pat, srect, drect, prect, &opt, usage);
1548*4882a593Smuzhiyun }
1549*4882a593Smuzhiyun
imresizeTask(im_job_handle_t job_handle,const rga_buffer_t src,rga_buffer_t dst,double fx,double fy,int interpolation)1550*4882a593Smuzhiyun IM_API IM_STATUS imresizeTask(im_job_handle_t job_handle, const rga_buffer_t src, rga_buffer_t dst, double fx, double fy, int interpolation) {
1551*4882a593Smuzhiyun int usage = 0;
1552*4882a593Smuzhiyun IM_STATUS ret = IM_STATUS_NOERROR;
1553*4882a593Smuzhiyun im_opt_t opt;
1554*4882a593Smuzhiyun rga_buffer_t pat;
1555*4882a593Smuzhiyun im_rect srect;
1556*4882a593Smuzhiyun im_rect drect;
1557*4882a593Smuzhiyun im_rect prect;
1558*4882a593Smuzhiyun
1559*4882a593Smuzhiyun empty_structure(NULL, NULL, &pat, &srect, &drect, &prect, &opt);
1560*4882a593Smuzhiyun
1561*4882a593Smuzhiyun if (fx > 0 || fy > 0) {
1562*4882a593Smuzhiyun if (fx == 0) fx = 1;
1563*4882a593Smuzhiyun if (fy == 0) fy = 1;
1564*4882a593Smuzhiyun
1565*4882a593Smuzhiyun dst.width = (int)(src.width * fx);
1566*4882a593Smuzhiyun dst.height = (int)(src.height * fy);
1567*4882a593Smuzhiyun
1568*4882a593Smuzhiyun int format = convert_to_rga_format(dst.format);
1569*4882a593Smuzhiyun if (format == RK_FORMAT_UNKNOWN) {
1570*4882a593Smuzhiyun IM_LOGE("Invaild dst format [0x%x]!\n", dst.format);
1571*4882a593Smuzhiyun return IM_STATUS_NOT_SUPPORTED;
1572*4882a593Smuzhiyun }
1573*4882a593Smuzhiyun
1574*4882a593Smuzhiyun if(NormalRgaIsYuvFormat(format)) {
1575*4882a593Smuzhiyun int width = dst.width;
1576*4882a593Smuzhiyun int height = dst.height;
1577*4882a593Smuzhiyun dst.width = DOWN_ALIGN(dst.width, 2);
1578*4882a593Smuzhiyun dst.height = DOWN_ALIGN(dst.height, 2);
1579*4882a593Smuzhiyun
1580*4882a593Smuzhiyun ret = imcheck(src, dst, srect, drect, usage);
1581*4882a593Smuzhiyun if (ret != IM_STATUS_NOERROR) {
1582*4882a593Smuzhiyun IM_LOGE("imresize error, factor[fx,fy]=[%lf,%lf], ALIGN[dw,dh]=[%d,%d][%d,%d]", fx, fy, width, height, dst.width, dst.height);
1583*4882a593Smuzhiyun return ret;
1584*4882a593Smuzhiyun }
1585*4882a593Smuzhiyun }
1586*4882a593Smuzhiyun }
1587*4882a593Smuzhiyun UNUSED(interpolation);
1588*4882a593Smuzhiyun
1589*4882a593Smuzhiyun return improcessTask(job_handle, src, dst, pat, srect, drect, prect, &opt, usage);
1590*4882a593Smuzhiyun }
1591*4882a593Smuzhiyun
imcropTask(im_job_handle_t job_handle,const rga_buffer_t src,rga_buffer_t dst,im_rect rect)1592*4882a593Smuzhiyun IM_API IM_STATUS imcropTask(im_job_handle_t job_handle, const rga_buffer_t src, rga_buffer_t dst, im_rect rect) {
1593*4882a593Smuzhiyun int usage = 0;
1594*4882a593Smuzhiyun im_opt_t opt;
1595*4882a593Smuzhiyun rga_buffer_t pat;
1596*4882a593Smuzhiyun im_rect drect;
1597*4882a593Smuzhiyun im_rect prect;
1598*4882a593Smuzhiyun
1599*4882a593Smuzhiyun empty_structure(NULL, NULL, &pat, NULL, &drect, &prect, &opt);
1600*4882a593Smuzhiyun
1601*4882a593Smuzhiyun drect.width = rect.width;
1602*4882a593Smuzhiyun drect.height = rect.height;
1603*4882a593Smuzhiyun
1604*4882a593Smuzhiyun return improcessTask(job_handle, src, dst, pat, rect, drect, prect, &opt, usage);
1605*4882a593Smuzhiyun }
1606*4882a593Smuzhiyun
imcvtcolorTask(im_job_handle_t job_handle,rga_buffer_t src,rga_buffer_t dst,int sfmt,int dfmt,int mode)1607*4882a593Smuzhiyun IM_API IM_STATUS imcvtcolorTask(im_job_handle_t job_handle, rga_buffer_t src, rga_buffer_t dst, int sfmt, int dfmt, int mode) {
1608*4882a593Smuzhiyun int usage = 0;
1609*4882a593Smuzhiyun im_opt_t opt;
1610*4882a593Smuzhiyun rga_buffer_t pat;
1611*4882a593Smuzhiyun im_rect srect;
1612*4882a593Smuzhiyun im_rect drect;
1613*4882a593Smuzhiyun im_rect prect;
1614*4882a593Smuzhiyun
1615*4882a593Smuzhiyun empty_structure(NULL, NULL, &pat, &srect, &drect, &prect, &opt);
1616*4882a593Smuzhiyun
1617*4882a593Smuzhiyun src.format = sfmt;
1618*4882a593Smuzhiyun dst.format = dfmt;
1619*4882a593Smuzhiyun
1620*4882a593Smuzhiyun dst.color_space_mode = mode;
1621*4882a593Smuzhiyun
1622*4882a593Smuzhiyun return improcessTask(job_handle, src, dst, pat, srect, drect, prect, &opt, usage);
1623*4882a593Smuzhiyun }
1624*4882a593Smuzhiyun
imtranslateTask(im_job_handle_t job_handle,const rga_buffer_t src,rga_buffer_t dst,int x,int y)1625*4882a593Smuzhiyun IM_API IM_STATUS imtranslateTask(im_job_handle_t job_handle, const rga_buffer_t src, rga_buffer_t dst, int x, int y) {
1626*4882a593Smuzhiyun int usage = 0;
1627*4882a593Smuzhiyun im_opt_t opt;
1628*4882a593Smuzhiyun rga_buffer_t pat;
1629*4882a593Smuzhiyun im_rect srect;
1630*4882a593Smuzhiyun im_rect drect;
1631*4882a593Smuzhiyun im_rect prect;
1632*4882a593Smuzhiyun
1633*4882a593Smuzhiyun empty_structure(NULL, NULL, &pat, &srect, &drect, &prect, &opt);
1634*4882a593Smuzhiyun
1635*4882a593Smuzhiyun if ((src.width != dst.width) || (src.height != dst.height)) {
1636*4882a593Smuzhiyun IM_LOGW("The width and height of src and dst need to be equal, src[w,h] = [%d, %d], dst[w,h] = [%d, %d]",
1637*4882a593Smuzhiyun src.width, src.height, dst.width, dst.height);
1638*4882a593Smuzhiyun return IM_STATUS_INVALID_PARAM;
1639*4882a593Smuzhiyun }
1640*4882a593Smuzhiyun
1641*4882a593Smuzhiyun srect.width = src.width - x;
1642*4882a593Smuzhiyun srect.height = src.height - y;
1643*4882a593Smuzhiyun drect.x = x;
1644*4882a593Smuzhiyun drect.y = y;
1645*4882a593Smuzhiyun drect.width = src.width - x;
1646*4882a593Smuzhiyun drect.height = src.height - y;
1647*4882a593Smuzhiyun
1648*4882a593Smuzhiyun return improcessTask(job_handle, src, dst, pat, srect, drect, prect, &opt, usage);
1649*4882a593Smuzhiyun }
1650*4882a593Smuzhiyun
imrotateTask(im_job_handle_t job_handle,const rga_buffer_t src,rga_buffer_t dst,int rotation)1651*4882a593Smuzhiyun IM_API IM_STATUS imrotateTask(im_job_handle_t job_handle, const rga_buffer_t src, rga_buffer_t dst, int rotation) {
1652*4882a593Smuzhiyun int usage = 0;
1653*4882a593Smuzhiyun im_opt_t opt;
1654*4882a593Smuzhiyun rga_buffer_t pat;
1655*4882a593Smuzhiyun
1656*4882a593Smuzhiyun im_rect srect;
1657*4882a593Smuzhiyun im_rect drect;
1658*4882a593Smuzhiyun im_rect prect;
1659*4882a593Smuzhiyun
1660*4882a593Smuzhiyun empty_structure(NULL, NULL, &pat, &srect, &drect, &prect, &opt);
1661*4882a593Smuzhiyun
1662*4882a593Smuzhiyun usage |= rotation;
1663*4882a593Smuzhiyun
1664*4882a593Smuzhiyun return improcessTask(job_handle, src, dst, pat, srect, drect, prect, &opt, usage);
1665*4882a593Smuzhiyun }
1666*4882a593Smuzhiyun
imflipTask(im_job_handle_t job_handle,const rga_buffer_t src,rga_buffer_t dst,int mode)1667*4882a593Smuzhiyun IM_API IM_STATUS imflipTask(im_job_handle_t job_handle, const rga_buffer_t src, rga_buffer_t dst, int mode) {
1668*4882a593Smuzhiyun int usage = 0;
1669*4882a593Smuzhiyun im_opt_t opt;
1670*4882a593Smuzhiyun rga_buffer_t pat;
1671*4882a593Smuzhiyun im_rect srect;
1672*4882a593Smuzhiyun im_rect drect;
1673*4882a593Smuzhiyun im_rect prect;
1674*4882a593Smuzhiyun
1675*4882a593Smuzhiyun empty_structure(NULL, NULL, &pat, &srect, &drect, &prect, &opt);
1676*4882a593Smuzhiyun
1677*4882a593Smuzhiyun usage |= mode;
1678*4882a593Smuzhiyun
1679*4882a593Smuzhiyun return improcessTask(job_handle, src, dst, pat, srect, drect, prect, &opt, usage);
1680*4882a593Smuzhiyun }
1681*4882a593Smuzhiyun
imcompositeTask(im_job_handle_t job_handle,const rga_buffer_t srcA,const rga_buffer_t srcB,rga_buffer_t dst,int mode)1682*4882a593Smuzhiyun IM_API IM_STATUS imcompositeTask(im_job_handle_t job_handle, const rga_buffer_t srcA, const rga_buffer_t srcB, rga_buffer_t dst, int mode) {
1683*4882a593Smuzhiyun int usage = 0;
1684*4882a593Smuzhiyun im_opt_t opt;
1685*4882a593Smuzhiyun im_rect srect;
1686*4882a593Smuzhiyun im_rect drect;
1687*4882a593Smuzhiyun im_rect prect;
1688*4882a593Smuzhiyun
1689*4882a593Smuzhiyun empty_structure(NULL, NULL, NULL, &srect, &drect, &prect, &opt);
1690*4882a593Smuzhiyun
1691*4882a593Smuzhiyun usage |= mode;
1692*4882a593Smuzhiyun
1693*4882a593Smuzhiyun return improcessTask(job_handle, srcA, dst, srcB, srect, drect, prect, &opt, usage);
1694*4882a593Smuzhiyun }
1695*4882a593Smuzhiyun
imblendTask(im_job_handle_t job_handle,const rga_buffer_t src,rga_buffer_t dst,int mode)1696*4882a593Smuzhiyun IM_API IM_STATUS imblendTask(im_job_handle_t job_handle, const rga_buffer_t src, rga_buffer_t dst, int mode) {
1697*4882a593Smuzhiyun rga_buffer_t pat;
1698*4882a593Smuzhiyun
1699*4882a593Smuzhiyun memset(&pat, 0x0, sizeof(pat));
1700*4882a593Smuzhiyun
1701*4882a593Smuzhiyun return imcompositeTask(job_handle, src, pat, dst, mode);
1702*4882a593Smuzhiyun }
1703*4882a593Smuzhiyun
imcolorkeyTask(im_job_handle_t job_handle,const rga_buffer_t src,rga_buffer_t dst,im_colorkey_range range,int mode)1704*4882a593Smuzhiyun IM_API IM_STATUS imcolorkeyTask(im_job_handle_t job_handle, const rga_buffer_t src, rga_buffer_t dst, im_colorkey_range range, int mode) {
1705*4882a593Smuzhiyun int usage = 0;
1706*4882a593Smuzhiyun im_opt_t opt;
1707*4882a593Smuzhiyun rga_buffer_t pat;
1708*4882a593Smuzhiyun im_rect srect;
1709*4882a593Smuzhiyun im_rect drect;
1710*4882a593Smuzhiyun im_rect prect;
1711*4882a593Smuzhiyun
1712*4882a593Smuzhiyun empty_structure(NULL, NULL, &pat, &srect, &drect, &prect, &opt);
1713*4882a593Smuzhiyun
1714*4882a593Smuzhiyun usage |= mode;
1715*4882a593Smuzhiyun
1716*4882a593Smuzhiyun opt.colorkey_range = range;
1717*4882a593Smuzhiyun
1718*4882a593Smuzhiyun return improcessTask(job_handle, src, dst, pat, srect, drect, prect, &opt, usage);
1719*4882a593Smuzhiyun }
1720*4882a593Smuzhiyun
imosdTask(im_job_handle_t job_handle,const rga_buffer_t osd,const rga_buffer_t bg_image,const im_rect osd_rect,im_osd_t * osd_config)1721*4882a593Smuzhiyun IM_API IM_STATUS imosdTask(im_job_handle_t job_handle,
1722*4882a593Smuzhiyun const rga_buffer_t osd,const rga_buffer_t bg_image,
1723*4882a593Smuzhiyun const im_rect osd_rect, im_osd_t *osd_config) {
1724*4882a593Smuzhiyun int usage = 0;
1725*4882a593Smuzhiyun im_opt_t opt;
1726*4882a593Smuzhiyun im_rect tmp_rect;
1727*4882a593Smuzhiyun
1728*4882a593Smuzhiyun memset(&opt, 0x0, sizeof(opt));
1729*4882a593Smuzhiyun memset(&tmp_rect, 0x0, sizeof(tmp_rect));
1730*4882a593Smuzhiyun
1731*4882a593Smuzhiyun opt.version = RGA_CURRENT_API_VERSION;
1732*4882a593Smuzhiyun memcpy(&opt.osd_config, osd_config, sizeof(im_osd_t));
1733*4882a593Smuzhiyun
1734*4882a593Smuzhiyun usage |= IM_ALPHA_BLEND_DST_OVER | IM_OSD;
1735*4882a593Smuzhiyun
1736*4882a593Smuzhiyun return improcessTask(job_handle, bg_image, bg_image, osd, osd_rect, osd_rect, tmp_rect, &opt, usage);
1737*4882a593Smuzhiyun }
1738*4882a593Smuzhiyun
imquantizeTask(im_job_handle_t job_handle,const rga_buffer_t src,rga_buffer_t dst,im_nn_t nn_info)1739*4882a593Smuzhiyun IM_API IM_STATUS imquantizeTask(im_job_handle_t job_handle, const rga_buffer_t src, rga_buffer_t dst, im_nn_t nn_info) {
1740*4882a593Smuzhiyun int usage = 0;
1741*4882a593Smuzhiyun im_opt_t opt;
1742*4882a593Smuzhiyun rga_buffer_t pat;
1743*4882a593Smuzhiyun im_rect srect;
1744*4882a593Smuzhiyun im_rect drect;
1745*4882a593Smuzhiyun im_rect prect;
1746*4882a593Smuzhiyun
1747*4882a593Smuzhiyun empty_structure(NULL, NULL, &pat, &srect, &drect, &prect, &opt);
1748*4882a593Smuzhiyun
1749*4882a593Smuzhiyun usage |= IM_NN_QUANTIZE;
1750*4882a593Smuzhiyun
1751*4882a593Smuzhiyun opt.nn = nn_info;
1752*4882a593Smuzhiyun
1753*4882a593Smuzhiyun return improcessTask(job_handle, src, dst, pat, srect, drect, prect, &opt, usage);
1754*4882a593Smuzhiyun }
1755*4882a593Smuzhiyun
imropTask(im_job_handle_t job_handle,const rga_buffer_t src,rga_buffer_t dst,int rop_code)1756*4882a593Smuzhiyun IM_API IM_STATUS imropTask(im_job_handle_t job_handle, const rga_buffer_t src, rga_buffer_t dst, int rop_code) {
1757*4882a593Smuzhiyun int usage = 0;
1758*4882a593Smuzhiyun im_opt_t opt;
1759*4882a593Smuzhiyun rga_buffer_t pat;
1760*4882a593Smuzhiyun im_rect srect;
1761*4882a593Smuzhiyun im_rect drect;
1762*4882a593Smuzhiyun im_rect prect;
1763*4882a593Smuzhiyun
1764*4882a593Smuzhiyun empty_structure(NULL, NULL, &pat, &srect, &drect, &prect, &opt);
1765*4882a593Smuzhiyun
1766*4882a593Smuzhiyun usage |= IM_ROP;
1767*4882a593Smuzhiyun
1768*4882a593Smuzhiyun opt.rop_code = rop_code;
1769*4882a593Smuzhiyun
1770*4882a593Smuzhiyun return improcessTask(job_handle, src, dst, pat, srect, drect, prect, &opt, usage);
1771*4882a593Smuzhiyun }
1772*4882a593Smuzhiyun
immosaicTask(im_job_handle_t job_handle,const rga_buffer_t image,im_rect rect,int mosaic_mode)1773*4882a593Smuzhiyun IM_API IM_STATUS immosaicTask(im_job_handle_t job_handle, const rga_buffer_t image, im_rect rect, int mosaic_mode) {
1774*4882a593Smuzhiyun int usage = 0;
1775*4882a593Smuzhiyun im_opt_t opt;
1776*4882a593Smuzhiyun rga_buffer_t tmp_image;
1777*4882a593Smuzhiyun im_rect tmp_rect;
1778*4882a593Smuzhiyun
1779*4882a593Smuzhiyun memset(&opt, 0x0, sizeof(opt));
1780*4882a593Smuzhiyun memset(&tmp_image, 0x0, sizeof(tmp_image));
1781*4882a593Smuzhiyun memset(&tmp_rect, 0x0, sizeof(tmp_rect));
1782*4882a593Smuzhiyun
1783*4882a593Smuzhiyun usage |= IM_MOSAIC;
1784*4882a593Smuzhiyun
1785*4882a593Smuzhiyun opt.version = RGA_CURRENT_API_VERSION;
1786*4882a593Smuzhiyun opt.mosaic_mode = mosaic_mode;
1787*4882a593Smuzhiyun
1788*4882a593Smuzhiyun return improcessTask(job_handle, image, image, tmp_image, rect, rect, tmp_rect, &opt, usage);
1789*4882a593Smuzhiyun }
1790*4882a593Smuzhiyun
immosaicTaskArray(im_job_handle_t job_handle,rga_buffer_t dst,im_rect * rect_array,int array_size,int color)1791*4882a593Smuzhiyun IM_API IM_STATUS immosaicTaskArray(im_job_handle_t job_handle, rga_buffer_t dst, im_rect *rect_array, int array_size, int color) {
1792*4882a593Smuzhiyun IM_STATUS ret;
1793*4882a593Smuzhiyun
1794*4882a593Smuzhiyun for (int i = 0; i < array_size; i++) {
1795*4882a593Smuzhiyun ret = immosaicTask(job_handle, dst, rect_array[i], color);
1796*4882a593Smuzhiyun if (ret != IM_STATUS_SUCCESS)
1797*4882a593Smuzhiyun return ret;
1798*4882a593Smuzhiyun }
1799*4882a593Smuzhiyun
1800*4882a593Smuzhiyun return IM_STATUS_SUCCESS;
1801*4882a593Smuzhiyun }
1802*4882a593Smuzhiyun
imfillTask(im_job_handle_t job_handle,rga_buffer_t dst,im_rect rect,uint32_t color)1803*4882a593Smuzhiyun IM_API IM_STATUS imfillTask(im_job_handle_t job_handle, rga_buffer_t dst, im_rect rect, uint32_t color) {
1804*4882a593Smuzhiyun int usage = 0;
1805*4882a593Smuzhiyun im_opt_t opt;
1806*4882a593Smuzhiyun rga_buffer_t pat;
1807*4882a593Smuzhiyun rga_buffer_t src;
1808*4882a593Smuzhiyun im_rect srect;
1809*4882a593Smuzhiyun im_rect prect;
1810*4882a593Smuzhiyun
1811*4882a593Smuzhiyun empty_structure(&src, NULL, &pat, &srect, NULL, &prect, &opt);
1812*4882a593Smuzhiyun
1813*4882a593Smuzhiyun memset(&src, 0, sizeof(rga_buffer_t));
1814*4882a593Smuzhiyun
1815*4882a593Smuzhiyun usage |= IM_COLOR_FILL;
1816*4882a593Smuzhiyun
1817*4882a593Smuzhiyun opt.color = color;
1818*4882a593Smuzhiyun
1819*4882a593Smuzhiyun return improcessTask(job_handle, src, dst, pat, srect, rect, prect, &opt, usage);
1820*4882a593Smuzhiyun }
1821*4882a593Smuzhiyun
imfillTaskArray(im_job_handle_t job_handle,rga_buffer_t dst,im_rect * rect_array,int array_size,uint32_t color)1822*4882a593Smuzhiyun IM_API IM_STATUS imfillTaskArray(im_job_handle_t job_handle, rga_buffer_t dst, im_rect *rect_array, int array_size, uint32_t color) {
1823*4882a593Smuzhiyun IM_STATUS ret;
1824*4882a593Smuzhiyun
1825*4882a593Smuzhiyun for (int i = 0; i < array_size; i++) {
1826*4882a593Smuzhiyun ret = imfillTask(job_handle, dst, rect_array[i], color);
1827*4882a593Smuzhiyun if (ret != IM_STATUS_SUCCESS)
1828*4882a593Smuzhiyun return ret;
1829*4882a593Smuzhiyun }
1830*4882a593Smuzhiyun
1831*4882a593Smuzhiyun return IM_STATUS_SUCCESS;
1832*4882a593Smuzhiyun }
1833*4882a593Smuzhiyun
imrectangleTask(im_job_handle_t job_handle,rga_buffer_t dst,im_rect rect,uint32_t color,int thickness)1834*4882a593Smuzhiyun IM_STATUS imrectangleTask(im_job_handle_t job_handle, rga_buffer_t dst, im_rect rect, uint32_t color, int thickness) {
1835*4882a593Smuzhiyun if (thickness < 0)
1836*4882a593Smuzhiyun return imfillTask(job_handle, dst, rect, color);
1837*4882a593Smuzhiyun
1838*4882a593Smuzhiyun int h_length = rect.width;
1839*4882a593Smuzhiyun int v_length = rect.height - 2 * thickness;
1840*4882a593Smuzhiyun im_rect fill_rect[4] = {};
1841*4882a593Smuzhiyun
1842*4882a593Smuzhiyun fill_rect[0] = {rect.x, rect.y, h_length, thickness};
1843*4882a593Smuzhiyun fill_rect[1] = {rect.x, rect.y + (rect.height - thickness), h_length, thickness};
1844*4882a593Smuzhiyun fill_rect[2] = {rect.x, rect.y + thickness, thickness, v_length};
1845*4882a593Smuzhiyun fill_rect[3] = {rect.x + (rect.width - thickness), rect.y + thickness, thickness, v_length};
1846*4882a593Smuzhiyun
1847*4882a593Smuzhiyun return imfillTaskArray(job_handle, dst, fill_rect, 4, color);
1848*4882a593Smuzhiyun }
1849*4882a593Smuzhiyun
imrectangleTaskArray(im_job_handle_t job_handle,rga_buffer_t dst,im_rect * rect_array,int array_size,uint32_t color,int thickness)1850*4882a593Smuzhiyun IM_STATUS imrectangleTaskArray(im_job_handle_t job_handle, rga_buffer_t dst, im_rect *rect_array, int array_size, uint32_t color, int thickness) {
1851*4882a593Smuzhiyun IM_STATUS ret;
1852*4882a593Smuzhiyun
1853*4882a593Smuzhiyun for (int i = 0; i < array_size; i++) {
1854*4882a593Smuzhiyun ret = imrectangleTask(job_handle, dst, rect_array[i], color, thickness);
1855*4882a593Smuzhiyun if (ret != IM_STATUS_SUCCESS)
1856*4882a593Smuzhiyun return ret;
1857*4882a593Smuzhiyun }
1858*4882a593Smuzhiyun
1859*4882a593Smuzhiyun return IM_STATUS_SUCCESS;
1860*4882a593Smuzhiyun }
1861*4882a593Smuzhiyun
impaletteTask(im_job_handle_t job_handle,rga_buffer_t src,rga_buffer_t dst,rga_buffer_t lut)1862*4882a593Smuzhiyun IM_API IM_STATUS impaletteTask(im_job_handle_t job_handle, rga_buffer_t src, rga_buffer_t dst, rga_buffer_t lut) {
1863*4882a593Smuzhiyun int usage = 0;
1864*4882a593Smuzhiyun im_rect srect;
1865*4882a593Smuzhiyun im_rect drect;
1866*4882a593Smuzhiyun im_rect prect;
1867*4882a593Smuzhiyun
1868*4882a593Smuzhiyun im_opt_t opt;
1869*4882a593Smuzhiyun
1870*4882a593Smuzhiyun empty_structure(NULL, NULL, NULL, &srect, &drect, &prect, &opt);
1871*4882a593Smuzhiyun
1872*4882a593Smuzhiyun /*Don't know if it supports zooming.*/
1873*4882a593Smuzhiyun if ((src.width != dst.width) || (src.height != dst.height)) {
1874*4882a593Smuzhiyun IM_LOGW("The width and height of src and dst need to be equal, src[w,h] = [%d, %d], dst[w,h] = [%d, %d]",
1875*4882a593Smuzhiyun src.width, src.height, dst.width, dst.height);
1876*4882a593Smuzhiyun return IM_STATUS_INVALID_PARAM;
1877*4882a593Smuzhiyun }
1878*4882a593Smuzhiyun
1879*4882a593Smuzhiyun usage |= IM_COLOR_PALETTE;
1880*4882a593Smuzhiyun
1881*4882a593Smuzhiyun return improcessTask(job_handle, src, dst, lut, srect, drect, prect, &opt, usage);
1882*4882a593Smuzhiyun }
1883*4882a593Smuzhiyun
improcessTask(im_job_handle_t job_handle,rga_buffer_t src,rga_buffer_t dst,rga_buffer_t pat,im_rect srect,im_rect drect,im_rect prect,im_opt_t * opt_ptr,int usage)1884*4882a593Smuzhiyun IM_API IM_STATUS improcessTask(im_job_handle_t job_handle,
1885*4882a593Smuzhiyun rga_buffer_t src, rga_buffer_t dst, rga_buffer_t pat,
1886*4882a593Smuzhiyun im_rect srect, im_rect drect, im_rect prect,
1887*4882a593Smuzhiyun im_opt_t *opt_ptr, int usage) {
1888*4882a593Smuzhiyun return rga_task_submit(job_handle, src, dst, pat, srect, drect, prect, opt_ptr, usage);
1889*4882a593Smuzhiyun }
1890*4882a593Smuzhiyun /* End task api */
1891*4882a593Smuzhiyun
1892*4882a593Smuzhiyun /* for rockit-ko */
imbegin(uint32_t flags)1893*4882a593Smuzhiyun im_ctx_id_t imbegin(uint32_t flags) {
1894*4882a593Smuzhiyun return rga_job_create(flags);
1895*4882a593Smuzhiyun }
1896*4882a593Smuzhiyun
imcancel(im_ctx_id_t id)1897*4882a593Smuzhiyun IM_STATUS imcancel(im_ctx_id_t id) {
1898*4882a593Smuzhiyun return rga_job_cancel((im_job_handle_t)id);
1899*4882a593Smuzhiyun }
1900*4882a593Smuzhiyun
improcess(rga_buffer_t src,rga_buffer_t dst,rga_buffer_t pat,im_rect srect,im_rect drect,im_rect prect,int acquire_fence_fd,int * release_fence_fd,im_opt_t * opt_ptr,int usage,im_ctx_id_t ctx_id)1901*4882a593Smuzhiyun IM_STATUS improcess(rga_buffer_t src, rga_buffer_t dst, rga_buffer_t pat,
1902*4882a593Smuzhiyun im_rect srect, im_rect drect, im_rect prect,
1903*4882a593Smuzhiyun int acquire_fence_fd, int *release_fence_fd,
1904*4882a593Smuzhiyun im_opt_t *opt_ptr, int usage, im_ctx_id_t ctx_id) {
1905*4882a593Smuzhiyun int ret;
1906*4882a593Smuzhiyun int sync_mode;
1907*4882a593Smuzhiyun
1908*4882a593Smuzhiyun UNUSED(acquire_fence_fd);
1909*4882a593Smuzhiyun UNUSED(release_fence_fd);
1910*4882a593Smuzhiyun
1911*4882a593Smuzhiyun ret = rga_task_submit((im_job_handle_t)ctx_id, src, dst, pat, srect, drect, prect, opt_ptr, usage);
1912*4882a593Smuzhiyun if (ret != IM_STATUS_SUCCESS)
1913*4882a593Smuzhiyun return (IM_STATUS)ret;
1914*4882a593Smuzhiyun
1915*4882a593Smuzhiyun if (usage & IM_ASYNC)
1916*4882a593Smuzhiyun sync_mode = IM_ASYNC;
1917*4882a593Smuzhiyun else
1918*4882a593Smuzhiyun sync_mode = IM_SYNC;
1919*4882a593Smuzhiyun
1920*4882a593Smuzhiyun return rga_job_config((im_job_handle_t)ctx_id, sync_mode, acquire_fence_fd, release_fence_fd);
1921*4882a593Smuzhiyun }
1922*4882a593Smuzhiyun
improcess_ctx(rga_buffer_t src,rga_buffer_t dst,rga_buffer_t pat,im_rect srect,im_rect drect,im_rect prect,int acquire_fence_fd,int * release_fence_fd,im_opt_t * opt_ptr,int usage,im_ctx_id_t ctx_id)1923*4882a593Smuzhiyun IM_STATUS improcess_ctx(rga_buffer_t src, rga_buffer_t dst, rga_buffer_t pat,
1924*4882a593Smuzhiyun im_rect srect, im_rect drect, im_rect prect,
1925*4882a593Smuzhiyun int acquire_fence_fd, int *release_fence_fd,
1926*4882a593Smuzhiyun im_opt_t *opt_ptr, int usage, im_ctx_id_t ctx_id) {
1927*4882a593Smuzhiyun return improcess(src, dst, pat, srect, drect, prect, acquire_fence_fd, release_fence_fd, opt_ptr, usage, ctx_id);
1928*4882a593Smuzhiyun }
1929*4882a593Smuzhiyun
1930*4882a593Smuzhiyun /* For the C interface */
wrapbuffer_handle_t(rga_buffer_handle_t handle,int width,int height,int wstride,int hstride,int format)1931*4882a593Smuzhiyun IM_API rga_buffer_t wrapbuffer_handle_t(rga_buffer_handle_t handle,
1932*4882a593Smuzhiyun int width, int height,
1933*4882a593Smuzhiyun int wstride, int hstride,
1934*4882a593Smuzhiyun int format) {
1935*4882a593Smuzhiyun return wrapbuffer_handle(handle, width, height, format, wstride, hstride);
1936*4882a593Smuzhiyun }
1937*4882a593Smuzhiyun
wrapbuffer_virtualaddr_t(void * vir_addr,int width,int height,int wstride,int hstride,int format)1938*4882a593Smuzhiyun IM_API rga_buffer_t wrapbuffer_virtualaddr_t(void* vir_addr,
1939*4882a593Smuzhiyun int width, int height,
1940*4882a593Smuzhiyun int wstride, int hstride,
1941*4882a593Smuzhiyun int format) {
1942*4882a593Smuzhiyun return wrapbuffer_virtualaddr(vir_addr, width, height, format, wstride, hstride);
1943*4882a593Smuzhiyun }
1944*4882a593Smuzhiyun
wrapbuffer_physicaladdr_t(void * phy_addr,int width,int height,int wstride,int hstride,int format)1945*4882a593Smuzhiyun IM_API rga_buffer_t wrapbuffer_physicaladdr_t(void* phy_addr,
1946*4882a593Smuzhiyun int width, int height,
1947*4882a593Smuzhiyun int wstride, int hstride,
1948*4882a593Smuzhiyun int format) {
1949*4882a593Smuzhiyun return wrapbuffer_physicaladdr(phy_addr, width, height, format, wstride, hstride);
1950*4882a593Smuzhiyun }
1951*4882a593Smuzhiyun
wrapbuffer_fd_t(int fd,int width,int height,int wstride,int hstride,int format)1952*4882a593Smuzhiyun IM_API rga_buffer_t wrapbuffer_fd_t(int fd,
1953*4882a593Smuzhiyun int width, int height,
1954*4882a593Smuzhiyun int wstride, int hstride,
1955*4882a593Smuzhiyun int format) {
1956*4882a593Smuzhiyun return wrapbuffer_fd(fd, width, height, format, wstride, hstride);
1957*4882a593Smuzhiyun }
1958*4882a593Smuzhiyun
imcheck_t(rga_buffer_t src,rga_buffer_t dst,rga_buffer_t pat,im_rect src_rect,im_rect dst_rect,im_rect pat_rect,int mode_usage)1959*4882a593Smuzhiyun IM_API IM_STATUS imcheck_t(rga_buffer_t src, rga_buffer_t dst, rga_buffer_t pat,
1960*4882a593Smuzhiyun im_rect src_rect, im_rect dst_rect, im_rect pat_rect, int mode_usage) {
1961*4882a593Smuzhiyun return rga_check_external(src, dst, pat, src_rect, dst_rect, pat_rect, mode_usage);
1962*4882a593Smuzhiyun }
1963*4882a593Smuzhiyun
imresize_t(const rga_buffer_t src,rga_buffer_t dst,double fx,double fy,int interpolation,int sync)1964*4882a593Smuzhiyun IM_API IM_STATUS imresize_t(const rga_buffer_t src, rga_buffer_t dst, double fx, double fy, int interpolation, int sync) {
1965*4882a593Smuzhiyun return imresize(src, dst, fx, fy, interpolation, sync, NULL);
1966*4882a593Smuzhiyun }
1967*4882a593Smuzhiyun
imcrop_t(const rga_buffer_t src,rga_buffer_t dst,im_rect rect,int sync)1968*4882a593Smuzhiyun IM_API IM_STATUS imcrop_t(const rga_buffer_t src, rga_buffer_t dst, im_rect rect, int sync) {
1969*4882a593Smuzhiyun return imcrop(src, dst, rect, sync, NULL);
1970*4882a593Smuzhiyun }
1971*4882a593Smuzhiyun
imrotate_t(const rga_buffer_t src,rga_buffer_t dst,int rotation,int sync)1972*4882a593Smuzhiyun IM_API IM_STATUS imrotate_t(const rga_buffer_t src, rga_buffer_t dst, int rotation, int sync) {
1973*4882a593Smuzhiyun return imrotate(src, dst, rotation, sync, NULL);
1974*4882a593Smuzhiyun }
1975*4882a593Smuzhiyun
imflip_t(const rga_buffer_t src,rga_buffer_t dst,int mode,int sync)1976*4882a593Smuzhiyun IM_API IM_STATUS imflip_t (const rga_buffer_t src, rga_buffer_t dst, int mode, int sync) {
1977*4882a593Smuzhiyun return imflip(src, dst, mode, sync, NULL);
1978*4882a593Smuzhiyun }
1979*4882a593Smuzhiyun
imfill_t(rga_buffer_t dst,im_rect rect,int color,int sync)1980*4882a593Smuzhiyun IM_API IM_STATUS imfill_t(rga_buffer_t dst, im_rect rect, int color, int sync) {
1981*4882a593Smuzhiyun return imfill(dst, rect, color, sync, NULL);
1982*4882a593Smuzhiyun }
1983*4882a593Smuzhiyun
impalette_t(rga_buffer_t src,rga_buffer_t dst,rga_buffer_t lut,int sync)1984*4882a593Smuzhiyun IM_API IM_STATUS impalette_t(rga_buffer_t src, rga_buffer_t dst, rga_buffer_t lut, int sync) {
1985*4882a593Smuzhiyun return impalette(src, dst, lut, sync, NULL);
1986*4882a593Smuzhiyun }
1987*4882a593Smuzhiyun
imtranslate_t(const rga_buffer_t src,rga_buffer_t dst,int x,int y,int sync)1988*4882a593Smuzhiyun IM_API IM_STATUS imtranslate_t(const rga_buffer_t src, rga_buffer_t dst, int x, int y, int sync) {
1989*4882a593Smuzhiyun return imtranslate(src, dst, x, y, sync, NULL);
1990*4882a593Smuzhiyun }
1991*4882a593Smuzhiyun
imcopy_t(const rga_buffer_t src,rga_buffer_t dst,int sync)1992*4882a593Smuzhiyun IM_API IM_STATUS imcopy_t(const rga_buffer_t src, rga_buffer_t dst, int sync) {
1993*4882a593Smuzhiyun return imcopy(src, dst, sync, NULL);
1994*4882a593Smuzhiyun }
1995*4882a593Smuzhiyun
imcolorkey_t(const rga_buffer_t src,rga_buffer_t dst,im_colorkey_range range,int mode,int sync)1996*4882a593Smuzhiyun IM_API IM_STATUS imcolorkey_t(const rga_buffer_t src, rga_buffer_t dst, im_colorkey_range range, int mode, int sync) {
1997*4882a593Smuzhiyun return imcolorkey(src, dst, range, mode, sync, NULL);
1998*4882a593Smuzhiyun }
1999*4882a593Smuzhiyun
imblend_t(const rga_buffer_t srcA,const rga_buffer_t srcB,rga_buffer_t dst,int mode,int sync)2000*4882a593Smuzhiyun IM_API IM_STATUS imblend_t(const rga_buffer_t srcA, const rga_buffer_t srcB, rga_buffer_t dst, int mode, int sync) {
2001*4882a593Smuzhiyun return imcomposite(srcA, srcB, dst, mode, sync, NULL);
2002*4882a593Smuzhiyun }
2003*4882a593Smuzhiyun
imcvtcolor_t(rga_buffer_t src,rga_buffer_t dst,int sfmt,int dfmt,int mode,int sync)2004*4882a593Smuzhiyun IM_API IM_STATUS imcvtcolor_t(rga_buffer_t src, rga_buffer_t dst, int sfmt, int dfmt, int mode, int sync) {
2005*4882a593Smuzhiyun return imcvtcolor(src, dst, sfmt, dfmt, mode, sync, NULL);
2006*4882a593Smuzhiyun }
2007*4882a593Smuzhiyun
imquantize_t(const rga_buffer_t src,rga_buffer_t dst,im_nn_t nn_info,int sync)2008*4882a593Smuzhiyun IM_API IM_STATUS imquantize_t(const rga_buffer_t src, rga_buffer_t dst, im_nn_t nn_info, int sync) {
2009*4882a593Smuzhiyun return imquantize(src, dst, nn_info, sync, NULL);
2010*4882a593Smuzhiyun }
2011*4882a593Smuzhiyun
imrop_t(const rga_buffer_t src,rga_buffer_t dst,int rop_code,int sync)2012*4882a593Smuzhiyun IM_API IM_STATUS imrop_t(const rga_buffer_t src, rga_buffer_t dst, int rop_code, int sync) {
2013*4882a593Smuzhiyun return imrop(src, dst, rop_code, sync, NULL);
2014*4882a593Smuzhiyun }
2015*4882a593Smuzhiyun
immosaic(const rga_buffer_t image,im_rect rect,int mosaic_mode,int sync)2016*4882a593Smuzhiyun IM_API IM_STATUS immosaic(const rga_buffer_t image, im_rect rect, int mosaic_mode, int sync) {
2017*4882a593Smuzhiyun return immosaic(image, rect, mosaic_mode, sync, NULL);
2018*4882a593Smuzhiyun }
2019*4882a593Smuzhiyun
imosd(const rga_buffer_t osd,const rga_buffer_t dst,const im_rect osd_rect,im_osd_t * osd_info,int sync)2020*4882a593Smuzhiyun IM_API IM_STATUS imosd(const rga_buffer_t osd,const rga_buffer_t dst, const im_rect osd_rect,
2021*4882a593Smuzhiyun im_osd_t *osd_info, int sync) {
2022*4882a593Smuzhiyun return imosd(osd, dst, osd_rect, osd_info, sync, NULL);
2023*4882a593Smuzhiyun }
2024