libge2d: global variables clean up [1/1]
PD#SWPL-12815
Problem:
clean up global variables
for libgdc/libge2d/libion multi-threaded
Solution:
clean up global variables
Verify:
verified on c1-ae400
Change-Id: I0f6d4c585c73d9013eba8fbc32d177315cbf30dc
Signed-off-by: Cao Jian <jian.cao@amlogic.com>
diff --git a/ge2d_feature_test.c b/ge2d_feature_test.c
index 4559d6d..e9a151a 100644
--- a/ge2d_feature_test.c
+++ b/ge2d_feature_test.c
@@ -14,6 +14,7 @@
#include <malloc.h>
#include <string.h>
#include <sys/time.h> /* for gettimeofday() */
+#include <pthread.h>
#include "ge2d_port.h"
#include "aml_ge2d.h"
@@ -56,8 +57,11 @@
static int src2_layer_mode = 0;
static int gb1_alpha = 0xff;
static int gb2_alpha = 0xff;
-aml_ge2d_t amlge2d;
static int num_process = 1;
+static int num_thread = 1;
+static int num_process_per_thread = 1;
+
+#define THREADS_MAX_NUM (64)
static inline unsigned long myclock()
{
@@ -148,6 +152,8 @@
printf (" --strechblit <x0_y0_w_h-x1_y1_w1_h1> define strechblit info.\n");
printf (" --fillrect <color_x_y_w_h> define fillrect info, color in rgba format.\n");
printf (" --n <num> process num times.\n");
+ printf (" --p <num> multi-thread process, num of threads");
+ printf (" --p_n <num> num of process for every thread.\n");
printf (" --help Print usage information.\n");
printf ("\n");
}
@@ -275,18 +281,26 @@
sscanf (argv[i], "%d", &num_process) == 1) {
continue;
}
+ else if (strcmp (argv[i] + 2, "p") == 0 && ++i < argc &&
+ sscanf (argv[i], "%d", &num_thread) == 1) {
+ continue;
+ }
+ else if (strcmp (argv[i] + 2, "p_n") == 0 && ++i < argc &&
+ sscanf (argv[i], "%d", &num_process_per_thread) == 1) {
+ continue;
+ }
}
}
return ge2d_success;
}
-int aml_read_file_src1(const char* url , aml_ge2d_info_t *pge2dinfo)
+static int aml_read_file_src1(aml_ge2d_t *amlge2d, const char* url)
{
int fd = -1;
int length = 0;
int read_num = 0;
- if (amlge2d.src_size == 0)
+ if (amlge2d->src_size == 0)
return 0;
fd = open(url,O_RDONLY );
@@ -295,29 +309,29 @@
return ge2d_fail;
}
- amlge2d.src_data = (char*)malloc(amlge2d.src_size);
- if (!amlge2d.src_data) {
+ amlge2d->src_data = (char*)malloc(amlge2d->src_size);
+ if (!amlge2d->src_data) {
E_GE2D("malloc for src_data failed\n");
return ge2d_fail;
}
- read_num = read(fd,amlge2d.src_data,amlge2d.src_size);
+ read_num = read(fd,amlge2d->src_data,amlge2d->src_size);
if (read_num <= 0) {
E_GE2D("read file read_num=%d error\n",read_num);
return ge2d_fail;
}
- memcpy(pge2dinfo->src_info[0].vaddr, amlge2d.src_data, amlge2d.src_size);
+ memcpy(amlge2d->ge2dinfo.src_info[0].vaddr, amlge2d->src_data, amlge2d->src_size);
close(fd);
return ge2d_success;
}
-int aml_read_file_src2(const char* url , aml_ge2d_info_t *pge2dinfo)
+static int aml_read_file_src2(aml_ge2d_t *amlge2d, const char* url)
{
int fd = -1;
int length = 0;
int read_num = 0;
- if (amlge2d.src2_size == 0)
+ if (amlge2d->src2_size == 0)
return 0;
fd = open(url,O_RDONLY );
@@ -326,33 +340,33 @@
return ge2d_fail;
}
- amlge2d.src2_data = (char*)malloc(amlge2d.src2_size);
- if (!amlge2d.src2_data) {
+ amlge2d->src2_data = (char*)malloc(amlge2d->src2_size);
+ if (!amlge2d->src2_data) {
E_GE2D("malloc for src_data failed\n");
return ge2d_fail;
}
- read_num = read(fd,amlge2d.src2_data,amlge2d.src2_size);
+ read_num = read(fd,amlge2d->src2_data,amlge2d->src2_size);
if (read_num <= 0) {
E_GE2D("read file read_num=%d error\n",read_num);
return ge2d_fail;
}
- memcpy(pge2dinfo->src_info[1].vaddr, amlge2d.src2_data, amlge2d.src2_size);
+ memcpy(amlge2d->ge2dinfo.src_info[1].vaddr, amlge2d->src2_data, amlge2d->src2_size);
close(fd);
return ge2d_success;
}
-int aml_write_file(const char* url , aml_ge2d_info_t *pge2dinfo)
+static int aml_write_file(aml_ge2d_t *amlge2d, const char* url)
{
int fd = -1;
int length = 0;
int write_num = 0;
unsigned int *value;
- if (amlge2d.dst_size == 0)
+ if (amlge2d->dst_size == 0)
return 0;
- if ((GE2D_CANVAS_OSD0 == pge2dinfo->dst_info.memtype)
- || (GE2D_CANVAS_OSD1 == pge2dinfo->dst_info.memtype))
+ if ((GE2D_CANVAS_OSD0 == amlge2d->ge2dinfo.dst_info.memtype)
+ || (GE2D_CANVAS_OSD1 == amlge2d->ge2dinfo.dst_info.memtype))
return 0;
fd = open(url,O_RDWR | O_CREAT,0660);
@@ -361,23 +375,23 @@
return ge2d_fail;
}
- amlge2d.dst_data = (char*)malloc(amlge2d.dst_size);
- if (!amlge2d.dst_data) {
+ amlge2d->dst_data = (char*)malloc(amlge2d->dst_size);
+ if (!amlge2d->dst_data) {
E_GE2D("malloc for dst_data failed\n");
return ge2d_fail;
}
- memcpy(amlge2d.dst_data,pge2dinfo->dst_info.vaddr,amlge2d.dst_size);
+ memcpy(amlge2d->dst_data,amlge2d->ge2dinfo.dst_info.vaddr,amlge2d->dst_size);
printf("pixel: 0x%2x, 0x%2x,0x%2x,0x%2x, 0x%2x,0x%2x,0x%2x,0x%2x\n",
- amlge2d.dst_data[0],
- amlge2d.dst_data[1],
- amlge2d.dst_data[2],
- amlge2d.dst_data[3],
- amlge2d.dst_data[4],
- amlge2d.dst_data[5],
- amlge2d.dst_data[6],
- amlge2d.dst_data[7]);
- write_num = write(fd,amlge2d.dst_data,amlge2d.dst_size);
+ amlge2d->dst_data[0],
+ amlge2d->dst_data[1],
+ amlge2d->dst_data[2],
+ amlge2d->dst_data[3],
+ amlge2d->dst_data[4],
+ amlge2d->dst_data[5],
+ amlge2d->dst_data[6],
+ amlge2d->dst_data[7]);
+ write_num = write(fd,amlge2d->dst_data,amlge2d->dst_size);
if (write_num <= 0) {
E_GE2D("write file write_num=%d error\n",write_num);
}
@@ -386,12 +400,13 @@
}
-static int do_fill_rectangle(aml_ge2d_info_t *pge2dinfo)
+static int do_fill_rectangle(aml_ge2d_t *amlge2d)
{
int ret = -1;
char code;
int i;
unsigned long stime;
+ aml_ge2d_info_t *pge2dinfo = &amlge2d->ge2dinfo;
printf("do_fill_rectangle test case:\n");
@@ -412,13 +427,13 @@
pge2dinfo->dst_info.rotation = GE2D_ROTATION_180;
ret = aml_ge2d_process(pge2dinfo);
#endif
- if (ret < 0)
- printf("%s failed\n", __func__);
+ if (ret < 0)
+ printf("%s failed\n", __func__);
return ret;
}
-static int do_blend(aml_ge2d_info_t *pge2dinfo)
+static int do_blend(aml_ge2d_t *amlge2d)
{
int ret = -1;
char code = 0;
@@ -426,16 +441,17 @@
unsigned long offset_bakup = 0;
int i;
unsigned long stime;
+ aml_ge2d_info_t *pge2dinfo = &amlge2d->ge2dinfo;
printf("do_blend test case:\n");
if (pge2dinfo->cap_attr == 0x1) {
/* do blend src1 blend src2(dst) to dst */
printf("one step blend\n");
- ret = aml_read_file_src1(SRC1_FILE_NAME,pge2dinfo);
+ ret = aml_read_file_src1(amlge2d, SRC1_FILE_NAME);
if (ret < 0)
return ge2d_fail;
- ret = aml_read_file_src2(SRC2_FILE_NAME,pge2dinfo);
+ ret = aml_read_file_src2(amlge2d, SRC2_FILE_NAME);
if (ret < 0)
return ge2d_fail;
@@ -474,7 +490,7 @@
if (src2_layer_mode == LAYER_MODE_COVERAGE) {
printf("two steps blend,src2 LAYER_MODE_COVERAGE\n");
- ret = aml_read_file_src1(SRC2_FILE_NAME,pge2dinfo);
+ ret = aml_read_file_src1(amlge2d, SRC2_FILE_NAME);
if (ret < 0)
return ge2d_fail;
@@ -515,7 +531,7 @@
pge2dinfo->src_info[0].plane_alpha = gb2_alpha;
pge2dinfo->src_info[1].plane_alpha = 0xff;
ret = aml_ge2d_process(pge2dinfo);
- ret = aml_read_file_src1(SRC1_FILE_NAME,pge2dinfo);
+ ret = aml_read_file_src1(amlge2d, SRC1_FILE_NAME);
if (ret < 0)
return ge2d_fail;
@@ -557,10 +573,10 @@
pge2dinfo->src_info[1].plane_alpha = gb2_alpha;
ret = aml_ge2d_process(pge2dinfo);
} else {
- ret = aml_read_file_src1(SRC1_FILE_NAME,pge2dinfo);
+ ret = aml_read_file_src1(amlge2d, SRC1_FILE_NAME);
if (ret < 0)
return ge2d_fail;
- ret = aml_read_file_src2(SRC2_FILE_NAME,pge2dinfo);
+ ret = aml_read_file_src2(amlge2d, SRC2_FILE_NAME);
if (ret < 0)
return ge2d_fail;
printf("two step: strechbilt+blend\n");
@@ -635,7 +651,7 @@
}
} else if (src2_layer_mode == LAYER_MODE_COVERAGE){
printf("two steps blend,src2 LAYER_MODE_COVERAGE: two blend\n");
- ret = aml_read_file_src1(SRC2_FILE_NAME,pge2dinfo);
+ ret = aml_read_file_src1(amlge2d, SRC2_FILE_NAME);
if (ret < 0)
return ge2d_fail;
/* both plane alpha, do 2 steps */
@@ -675,7 +691,7 @@
pge2dinfo->src_info[0].plane_alpha = gb2_alpha;
pge2dinfo->src_info[1].plane_alpha = 0xff;
ret = aml_ge2d_process(pge2dinfo);
- ret = aml_read_file_src1(SRC1_FILE_NAME,pge2dinfo);
+ ret = aml_read_file_src1(amlge2d, SRC1_FILE_NAME);
if (ret < 0)
return ge2d_fail;
/* step2: blend src1 blend src2(dst) to dst */
@@ -718,10 +734,10 @@
} else if ((src2_layer_mode == LAYER_MODE_NON)
&& (src1_layer_mode != LAYER_MODE_PREMULTIPLIED)){
printf("two steps blend,src2 LAYER_MODE_NON:strechbilt+blend\n");
- ret = aml_read_file_src1(SRC1_FILE_NAME,pge2dinfo);
+ ret = aml_read_file_src1(amlge2d, SRC1_FILE_NAME);
if (ret < 0)
return ge2d_fail;
- ret = aml_read_file_src2(SRC2_FILE_NAME,pge2dinfo);
+ ret = aml_read_file_src2(amlge2d, SRC2_FILE_NAME);
if (ret < 0)
return ge2d_fail;
/* both plane alpha, do 2 steps */
@@ -797,10 +813,10 @@
} else {
/* do blend src1 blend src2(dst) to dst */
printf("one step blend\n");
- ret = aml_read_file_src1(SRC1_FILE_NAME,pge2dinfo);
+ ret = aml_read_file_src1(amlge2d, SRC1_FILE_NAME);
if (ret < 0)
return ge2d_fail;
- ret = aml_read_file_src2(SRC2_FILE_NAME,pge2dinfo);
+ ret = aml_read_file_src2(amlge2d, SRC2_FILE_NAME);
if (ret < 0)
return ge2d_fail;
pge2dinfo->src_info[0].canvas_w = SX_SRC1;
@@ -838,20 +854,22 @@
ret = aml_ge2d_process(pge2dinfo);
}
}
- if (ret < 0)
- printf("%s failed\n", __func__);
+ if (ret < 0)
+ printf("%s failed\n", __func__);
return ret;
}
-static int do_strechblit(aml_ge2d_info_t *pge2dinfo)
+static int do_strechblit(aml_ge2d_t *amlge2d)
{
int ret = -1;
char code = 0;
int i;
unsigned long stime;
+ aml_ge2d_info_t *pge2dinfo = &amlge2d->ge2dinfo;
+
printf("do_strechblit test case:\n");
- ret = aml_read_file_src1(SRC1_FILE_NAME,pge2dinfo);
+ ret = aml_read_file_src1(amlge2d, SRC1_FILE_NAME);
if (ret < 0)
return ge2d_fail;
@@ -879,20 +897,22 @@
pge2dinfo->dst_info.rotation = GE2D_ROTATION_90;
ret = aml_ge2d_process(pge2dinfo);
#endif
- if (ret < 0)
- printf("%s failed\n", __func__);
+ if (ret < 0)
+ printf("%s failed\n", __func__);
return ret;
}
-static int do_blit(aml_ge2d_info_t *pge2dinfo)
+static int do_blit(aml_ge2d_t *amlge2d)
{
int ret = -1;
char code = 0;
int i;
unsigned long stime;
+ aml_ge2d_info_t *pge2dinfo = &amlge2d->ge2dinfo;
+
printf("do_blit test case:\n");
- ret = aml_read_file_src1(SRC1_FILE_NAME,pge2dinfo);
+ ret = aml_read_file_src1(amlge2d, SRC1_FILE_NAME);
if (ret < 0)
return ge2d_fail;
@@ -926,79 +946,115 @@
ret = aml_ge2d_process(pge2dinfo);
#endif
- if (ret < 0)
- printf("%s failed\n", __func__);
+ if (ret < 0)
+ printf("%s failed\n", __func__);
return ret;
}
-int main(int argc, char **argv)
+void *main_run(void *arg)
{
int ret = -1;
int i = 0;
unsigned long stime;
- memset(&amlge2d,0x0,sizeof(aml_ge2d_t));
- memset(&(amlge2d.ge2dinfo.src_info[0]), 0, sizeof(buffer_info_t));
- memset(&(amlge2d.ge2dinfo.src_info[1]), 0, sizeof(buffer_info_t));
- memset(&(amlge2d.ge2dinfo.dst_info), 0, sizeof(buffer_info_t));
+ aml_ge2d_t amlge2d;
- ret = parse_command_line(argc,argv);
+ for (i = 0; i < num_process_per_thread; i++) {
+ printf("ThreadIdx -- %d, run time -- %d\n", *(int *)arg, i);
+ memset(&amlge2d,0x0,sizeof(aml_ge2d_t));
+ memset(&(amlge2d.ge2dinfo.src_info[0]), 0, sizeof(buffer_info_t));
+ memset(&(amlge2d.ge2dinfo.src_info[1]), 0, sizeof(buffer_info_t));
+ memset(&(amlge2d.ge2dinfo.dst_info), 0, sizeof(buffer_info_t));
+
+ set_ge2dinfo(&amlge2d.ge2dinfo);
+
+ ret = aml_ge2d_init(&amlge2d);
+ if (ret < 0)
+ return NULL;
+
+ ret = aml_ge2d_mem_alloc(&amlge2d);
+ if (ret < 0)
+ goto exit;
+ #if 0
+ /* if dma_buf and used fd alloc other driver */
+ /* set dma buf fd */
+ amlge2d.ge2dinfo.src_info[0].shared_fd = dma_fd;
+ amlge2d.ge2dinfo.src_info[0].memtype = GE2D_CANVAS_ALLOC;
+ #endif
+
+ switch (amlge2d.ge2dinfo.ge2d_op)
+ {
+ case AML_GE2D_FILLRECTANGLE:
+ ret = do_fill_rectangle(&amlge2d);
+ break;
+ case AML_GE2D_BLEND:
+ ret = do_blend(&amlge2d);
+ break;
+ case AML_GE2D_STRETCHBLIT:
+ ret = do_strechblit(&amlge2d);
+ break;
+ case AML_GE2D_BLIT:
+ ret = do_blit(&amlge2d);
+ break;
+ default:
+ E_GE2D("not support ge2d op,exit test!\n");
+ break;
+ }
+ if (ret < 0)
+ goto exit;
+
+ if (amlge2d.ge2dinfo.dst_info.mem_alloc_type == AML_GE2D_MEM_ION)
+ aml_ge2d_invalid_cache(&amlge2d.ge2dinfo);
+ ret = aml_write_file(&amlge2d, DST_FILE_NAME);
+ if (ret < 0)
+ goto exit;
+ exit:
+ if (amlge2d.src_data) {
+ free(amlge2d.src_data);
+ amlge2d.src_data = NULL;
+ }
+ if (amlge2d.src2_data) {
+ free(amlge2d.src2_data);
+ amlge2d.src2_data = NULL;
+ }
+ if (amlge2d.dst_data) {
+ free(amlge2d.dst_data);
+ amlge2d.dst_data = NULL;
+ }
+
+ aml_ge2d_mem_free(&amlge2d);
+ aml_ge2d_exit(&amlge2d);
+ }
+ printf("ge2d feature_test exit!!!\n");
+
+ return NULL;
+}
+
+int main(int argc, char **argv)
+{
+ int ret = -1, i;
+ pthread_t thread[THREADS_MAX_NUM];
+ int threadindex[THREADS_MAX_NUM];
+
+ if (num_thread > THREADS_MAX_NUM) {
+ E_GE2D("num of thread greater than THREADS_MAX_NUM\n");
+ return -1;
+ }
+ memset(&thread, 0, sizeof(thread));
+
+ ret = parse_command_line(argc, argv);
if (ret == ge2d_fail)
return ge2d_success;
- set_ge2dinfo(&amlge2d.ge2dinfo);
+ for (int i = 0; i < num_thread; i++) {
+ threadindex[i] = i;
+ int res = pthread_create(&(thread[i]), NULL, main_run, (void *)&threadindex[i]);
+ if (res != 0) {
+ E_GE2D("integral thread %d creation failed!", i);
+ return -1;
+ }
+ }
+ for (int i = 0; i < num_thread; i++)
+ pthread_join(thread[i], NULL);
- ret = aml_ge2d_init(&amlge2d);
- if (ret < 0)
- return ge2d_fail;
-
- ret = aml_ge2d_mem_alloc(&amlge2d);
- if (ret < 0)
- goto exit;
-#if 0
- /* if dma_buf and used fd alloc other driver */
- /* set dma buf fd */
- amlge2d.ge2dinfo.src_info[0].shared_fd = dma_fd;
- amlge2d.ge2dinfo.src_info[0].memtype = GE2D_CANVAS_ALLOC;
-#endif
-
- switch (amlge2d.ge2dinfo.ge2d_op)
- {
- case AML_GE2D_FILLRECTANGLE:
- ret = do_fill_rectangle(&amlge2d.ge2dinfo);
- break;
- case AML_GE2D_BLEND:
- ret = do_blend(&amlge2d.ge2dinfo);
- break;
- case AML_GE2D_STRETCHBLIT:
- ret = do_strechblit(&amlge2d.ge2dinfo);
- break;
- case AML_GE2D_BLIT:
- ret = do_blit(&amlge2d.ge2dinfo);
- break;
- default:
- E_GE2D("not support ge2d op,exit test!\n");
- break;
- }
- if (ret < 0)
- goto exit;
- ret = aml_write_file(DST_FILE_NAME,&amlge2d.ge2dinfo);
- if (ret < 0)
- goto exit;
-exit:
- if (amlge2d.src_data) {
- free(amlge2d.src_data);
- amlge2d.src_data = NULL;
- }
- if (amlge2d.src2_data) {
- free(amlge2d.src2_data);
- amlge2d.src2_data = NULL;
- }
- if (amlge2d.dst_data) {
- free(amlge2d.dst_data);
- amlge2d.dst_data = NULL;
- }
- aml_ge2d_mem_free(&amlge2d);
- aml_ge2d_exit(&amlge2d);
- printf("ge2d feature_test exit!!!\n");
- return ge2d_success;
+ return 0;
}