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