From be8e1315e0c7e2cca6607bc62bab55136b0e60e1 Mon Sep 17 00:00:00 2001 From: Thomas White Date: Mon, 3 Aug 2009 19:11:29 +0100 Subject: gdrm-kms-addfb: restore original FB on exit --- gdrm-kms-addfb.c | 88 +++++++++++++++++++++++++++----------------------------- 1 file changed, 42 insertions(+), 46 deletions(-) diff --git a/gdrm-kms-addfb.c b/gdrm-kms-addfb.c index 6f9acc2..4395230 100644 --- a/gdrm-kms-addfb.c +++ b/gdrm-kms-addfb.c @@ -68,47 +68,6 @@ #define OBJECT_SIZE (640*480*2) -static int addfb(int fd, int handle) -{ - int ret = 0; - drmModeResPtr r; - drmModeCrtcPtr crtc; - int crtc_id; - int conn_id; - int fb_id; - - r = drmModeGetResources(fd); - printf("There are %i CRTCs, %i connectors, %i encoders" - " and %i framebuffers\n", - r->count_crtcs, r->count_connectors, r->count_encoders, - r->count_fbs); - - crtc_id = r->crtcs[0]; - conn_id = r->connectors[0]; - printf("The first CRTC ID is %i\n", crtc_id); - printf("The first connector ID is %i\n", conn_id); - - drmModeAddFB(fd, 480, 640, 16, 16, 480*2, handle, &fb_id); - printf("My new FB handle is %i\n", fb_id); - if (!fb_id) { - printf("Could not add FB\n"); - return 1; - } - - printf("Getting CRTC info\n"); - crtc = drmModeGetCrtc(fd, crtc_id); - - printf("crtc=%p\n", crtc); - ret = drmModeSetCrtc(fd, crtc_id, fb_id, 0, 0, r->connectors, 1, - &(crtc->mode)); - if ( ret ) { - printf("drmModeSetCrtc returned %i\n", ret); - } - - return fb_id; -} - - int main(int argc, char **argv) { int fd; @@ -123,7 +82,12 @@ int main(int argc, char **argv) int handle; char tmp[4]; int i; + drmModeResPtr r; + drmModeCrtcPtr crtc; + int crtc_id; + int conn_id; int fb_id; + uint32_t old_buffer_id; fd = drm_open_any(); @@ -146,22 +110,48 @@ int main(int argc, char **argv) addr16 = (uint16_t *)addr; printf("Virtual address is 0x%p\n", addr); - printf("Adding FB\n"); - fb_id = addfb(fd, handle); + r = drmModeGetResources(fd); + printf("There are %i CRTCs, %i connectors, %i encoders" + " and %i framebuffers\n", + r->count_crtcs, r->count_connectors, r->count_encoders, + r->count_fbs); + + crtc_id = r->crtcs[0]; + conn_id = r->connectors[0]; + printf("The first CRTC ID is %i\n", crtc_id); + printf("The first connector ID is %i\n", conn_id); + + drmModeAddFB(fd, 480, 640, 16, 16, 480*2, handle, &fb_id); + printf("My new FB handle is %i\n", fb_id); + if (!fb_id) { + printf("Could not add FB\n"); + return 1; + } + + printf("Getting CRTC info\n"); + crtc = drmModeGetCrtc(fd, crtc_id); + old_buffer_id = crtc->buffer_id; + printf("Old FB handle is %i\n", old_buffer_id); + + printf("crtc=%p\n", crtc); + if ( drmModeSetCrtc(fd, crtc_id, fb_id, 0, 0, r->connectors, 1, + &(crtc->mode)) ) { + printf("drmModeSetCrtc returned %i\n", ret); + } do { uint16_t val; - printf("Press to continue, q to finish..."); - fgets(tmp, 3, stdin); - val = random() & 0xff; val += (random() & 0xff)<<8; for ( i=0; i to continue, q to finish..."); + fgets(tmp, 3, stdin); + } while ( tmp[0] != 'q' ); printf("Unmapping\n"); @@ -170,6 +160,12 @@ int main(int argc, char **argv) printf("Removing FB\n"); drmModeRmFB(fd, fb_id); + printf("Restoring original FB\n"); + if ( drmModeSetCrtc(fd, crtc_id, old_buffer_id, 0, 0, r->connectors, 1, + &(crtc->mode)) ) { + printf("drmModeSetCrtc returned %i\n", ret); + } + close(fd); return 0; -- cgit v1.2.3