mdp_test.c revision 9a8ffbeff88c7b09cc9a86191c7a7fd665ddd980
19a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin/* 29a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin * Copyright (C) 2007 Google Inc. 39a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin * 49a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin * Licensed under the Apache License, Version 2.0 (the "License"); 59a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin * you may not use this file except in compliance with the License. 69a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin * You may obtain a copy of the License at 79a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin * 89a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin * http://www.apache.org/licenses/LICENSE-2.0 99a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin * 109a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin * Unless required by applicable law or agreed to in writing, software 119a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin * distributed under the License is distributed on an "AS IS" BASIS, 129a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin * See the License for the specific language governing permissions and 149a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin * limitations under the License. 159a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin */ 169a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin 179a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin#include <stdlib.h> 189a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin#include <unistd.h> 199a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin 209a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin#include <fcntl.h> 219a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin#include <stdio.h> 229a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin 239a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin#include <sys/ioctl.h> 249a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin#include <sys/mman.h> 259a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin#include <sys/types.h> 269a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin 279a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin#include <linux/fb.h> 289a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin#include <linux/msm_mdp.h> 299a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin 309a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavinstatic struct fb_var_screeninfo vi; 319a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin 329a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavinstatic int get_framebuffer(int *fd, char **fb, int *width, int *height) 339a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin{ 349a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin struct fb_fix_screeninfo fi; 359a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin void *bits; 369a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin 379a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin *fd = open("/dev/graphics/fb0", O_RDWR); 389a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin if(*fd < 0) { 399a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin perror("cannot open fb0"); 409a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin return -1; 419a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin } 429a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin 439a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin if(ioctl(*fd, FBIOGET_FSCREENINFO, &fi) < 0) { 449a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin perror("failed to get fb0 info"); 459a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin return -1; 469a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin } 479a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin 489a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin if(ioctl(*fd, FBIOGET_VSCREENINFO, &vi) < 0) { 499a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin perror("failed to get fb0 info"); 509a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin return -1; 519a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin } 529a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin 539a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin bits = mmap(0, fi.smem_len, PROT_READ | PROT_WRITE, MAP_SHARED, *fd, 0); 549a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin if(bits == MAP_FAILED) { 559a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin perror("failed to mmap framebuffer"); 569a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin return -1; 579a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin } 589a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin 599a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin *width = vi.xres; 609a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin *height = vi.yres; 619a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin *fb = bits; 629a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin return 0; 639a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin} 649a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin 659a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavinstatic void set_active_framebuffer(int fd, unsigned n) 669a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin{ 679a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin 689a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin if(n > 1) return; 699a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin vi.yres_virtual = vi.yres * 2; 709a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin vi.yoffset = n * vi.yres; 719a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin if(ioctl(fd, FBIOPUT_VSCREENINFO, &vi) < 0) { 729a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin fprintf(stderr,"active fb swap failed!\n"); 739a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin } 749a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin} 759a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin 769a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavinint main(int argc, const char *argv[]) { 779a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin int fd, width, height; 789a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin char* fb; 799a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin struct mdp_blit_req_list *req_list; 809a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin struct mdp_blit_req *req; 819a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin int srw, srh, drw, drh; 829a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin int srcx = 0; int srcy = 0; 839a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin int dstx = 10; int dsty = 10; 849a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin 859a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin req_list = malloc(sizeof(struct mdp_blit_req_list) + 869a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin sizeof(struct mdp_blit_req)); 879a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin req_list->count = 1; 889a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin req = req_list->req; 899a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin 909a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin if (argc < 5) 919a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin printf("not enough args\n"); 929a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin srw = atoi(argv[1]); 939a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin srh = atoi(argv[2]); 949a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin drw = atoi(argv[3]); 959a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin drh = atoi(argv[4]); 969a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin 979a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin if (argc >= 7) { 989a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin srcx = atoi(argv[5]); 999a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin srcy = atoi(argv[6]); 1009a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin } 1019a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin 1029a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin if (argc == 9) { 1039a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin dstx = atoi(argv[7]); 1049a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin dsty = atoi(argv[8]); 1059a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin } 1069a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin 1079a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin 1089a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin if (get_framebuffer(&fd, &fb, &width, &height)) { 1099a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin printf("couldnt' get fb\n"); 1109a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin return -1; 1119a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin } 1129a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin /* 1139a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin req->src.width = 448; 1149a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin req->src.height = 320; 1159a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin */ 1169a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin req->src.width = vi.xres; 1179a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin req->src.height = vi.yres; 1189a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin req->src.format = MDP_RGB_565/*MDP_Y_CBCR_H2V2*/; 1199a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin req->src.offset = 0; 1209a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin req->src.memory_id = fd; 1219a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin req->src_rect.x = srcx; 1229a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin req->src_rect.y = srcy; 1239a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin req->src_rect.w = srw; 1249a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin req->src_rect.h = srh; 1259a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin 1269a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin req->dst.width = vi.xres; 1279a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin req->dst.height = vi.yres; 1289a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin req->dst.format = MDP_RGB_565; 1299a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin req->dst.offset = 0; 1309a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin req->dst.memory_id = fd; 1319a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin req->dst_rect.x = dstx; 1329a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin req->dst_rect.y = dsty; 1339a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin req->dst_rect.w = drw; 1349a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin req->dst_rect.h = drh; 1359a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin req->alpha = MDP_ALPHA_NOP; 1369a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin req->transp_mask = MDP_TRANSP_NOP; 1379a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin// req->flags = MDP_ROT_90; 1389a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin req->flags = MDP_ROT_NOP; 1399a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin 1409a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin if(ioctl(fd, MSMFB_BLIT, req_list)) 1419a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin fprintf(stderr, "crap, failed blit\n"); 1429a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin return 0; 1439a8ffbeff88c7b09cc9a86191c7a7fd665ddd980Rebecca Zavin} 144