diff options
-rw-r--r-- | src/tdm_fbdev.c | 46 | ||||
-rw-r--r-- | src/tdm_fbdev.h | 5 | ||||
-rw-r--r-- | src/tdm_fbdev_display.c | 115 |
3 files changed, 83 insertions, 83 deletions
diff --git a/src/tdm_fbdev.c b/src/tdm_fbdev.c index 6938c08..ed329e8 100644 --- a/src/tdm_fbdev.c +++ b/src/tdm_fbdev.c @@ -66,52 +66,6 @@ _tdm_fbdev_init_internal(void) vinfo->transp.offset = 0; vinfo->transp.length = 0; - /* - * Almost all framebuffers support off screen rendering. - * The code bellow requests Framebuffer to allocate memory equals to three - * buffers each of which width*height size. While the first drawn - * framebuffer's area is displaying the second or the third is redrawing - * or compositing by some application. When timer was expired or vblank - * was received Framebufer's areas swap, thus the second or the third is - * displaying and first is redrawing or compositing. Simple representation - * of what was said bellow - * - * SWAP Event SWAP Event - * | | - * +-------------+ | +-------------+ | +-------------+ - * | | | | | | | Redrawing | - * | Displaying | | | queued | | | or | - * | | | | | | | Compositing | - * +-------------+ | +-------------+ | +-------------+ - * | Redrawing | | | | | | | - * | or | +-------> | Displaying | +--------> | queued | - * | Compositing | | | | | | | - * +-------------+ | +-------------+ | +-------------+ - * | | | | Redrawing | | | | - * | queued | | | or | | | Displaying | - * | | | | Compositing | | | | - * +-------------+ | +-------------+ | +-------------+ - * | | - */ - /* - * TODO: Implement off screen rendering - */ - vinfo->yres_virtual = vinfo->yres * MAX_BUF; - - ret = ioctl(fbdev_data->fbdev_fd, FBIOPAN_DISPLAY, vinfo); - if(ret < 0) - { - TDM_INFO("page flip not supported, errno=%d", errno); - vinfo->yres_virtual = vinfo->yres; - } - - ret = ioctl(fbdev_data->fbdev_fd, FBIOPAN_DISPLAY, vinfo); - if(ret < 0) - { - TDM_ERR("FBIOPAN_DISPLAY ioctl failed, errno=%d", errno); - goto close_1; - } - ret = ioctl(fbdev_data->fbdev_fd, FBIOGET_FSCREENINFO, finfo); if (ret < 0) { diff --git a/src/tdm_fbdev.h b/src/tdm_fbdev.h index a2c7d13..49b7e64 100644 --- a/src/tdm_fbdev.h +++ b/src/tdm_fbdev.h @@ -22,7 +22,7 @@ #include <tdm_log.h> #include <tdm_list.h> -#define MAX_BUF 3 +#define MAX_BUF 1 /* fbdev backend functions (display) */ tdm_error fbdev_display_get_capabilitiy(tdm_backend_data *bdata, tdm_caps_display *caps); @@ -126,6 +126,9 @@ struct _tdm_fbdev_output_data */ int is_vblank; int is_commit; + + int sequence; + }; struct _tdm_fbdev_layer_data diff --git a/src/tdm_fbdev_display.c b/src/tdm_fbdev_display.c index 32d8348..ba59464 100644 --- a/src/tdm_fbdev_display.c +++ b/src/tdm_fbdev_display.c @@ -9,6 +9,8 @@ #include <xf86drm.h> #include <libudev.h> +#define DRM_MASTER_NODE "/dev/dri/card0" + /* * Framebuffer device supported formats */ @@ -91,6 +93,71 @@ _tdm_fbdev_layer_is_supproted_format() } */ +tdm_error fbdev_display_get_fd(tdm_backend_data *bdata, int *fd) +{ + tdm_fbdev_data *fbdev_data = (tdm_fbdev_data *)bdata; + int file_fd; + + RETURN_VAL_IF_FAIL(fbdev_data, TDM_ERROR_INVALID_PARAMETER); + RETURN_VAL_IF_FAIL(fd, TDM_ERROR_INVALID_PARAMETER); + + file_fd = open(DRM_MASTER_NODE, O_RDWR, ACCESSPERMS); + if (file_fd < 0) { + TDM_ERR("Can't open drm master device\n"); + return TDM_ERROR_OPERATION_FAILED; + + } + TDM_INFO("Open not os fake file %s: %d", DRM_MASTER_NODE, file_fd); + + tdm_helper_set_fd("TDM_DRM_MASTER_FD", file_fd); + + *fd = file_fd; + + return TDM_ERROR_NONE; +} + +static inline uint32_t +_get_refresh (struct fb_var_screeninfo *timing) +{ + uint32_t pixclock, hfreq, htotal, vtotal; + + pixclock = PICOS2KHZ(timing->pixclock) * 1000; + + htotal = timing->xres + timing->right_margin + timing->hsync_len + timing->left_margin; + vtotal = timing->yres + timing->lower_margin + timing->vsync_len + timing->upper_margin; + + if (timing->vmode & FB_VMODE_INTERLACED) vtotal /= 2; + if (timing->vmode & FB_VMODE_DOUBLE) vtotal *= 2; + + hfreq = pixclock / htotal; + return hfreq / vtotal; +} + +/* + * Convert fb_var_screeninfo to tdm_output_mode + */ +static inline void +_tdm_fbdev_display_to_tdm_mode(struct fb_var_screeninfo *timing, tdm_output_mode *mode) +{ + + if (!timing->pixclock) return; + + mode->clock = timing->pixclock / 1000; + mode->vrefresh = _get_refresh (timing); + mode->hdisplay = timing->xres; + mode->hsync_start = mode->hdisplay + timing->right_margin; + mode->hsync_end = mode->hsync_start + timing->hsync_len; + mode->htotal = mode->hsync_end + timing->left_margin; + + mode->vdisplay = timing->yres; + mode->vsync_start = mode->vdisplay + timing->lower_margin; + mode->vsync_end = mode->vsync_start + timing->vsync_len; + mode->vtotal = mode->vsync_end + timing->upper_margin; + + int interlaced = !!(timing->vmode & FB_VMODE_INTERLACED); + snprintf (mode->name, TDM_NAME_LEN, "%dx%d%s", mode->hdisplay, mode->vdisplay, interlaced ? "i" : ""); +} + tdm_error tdm_fbdev_creat_output(tdm_fbdev_data *fbdev_data) { @@ -138,6 +205,7 @@ tdm_fbdev_creat_output(tdm_fbdev_data *fbdev_data) output->is_vblank = DOWN; output->is_commit = DOWN; + output->sequence = 1; /* * TODO: connector_type_id field relates to libdrm connector which framebuffer @@ -156,11 +224,7 @@ tdm_fbdev_creat_output(tdm_fbdev_data *fbdev_data) for(i = 0; i < output->count_modes ; i++) { - output->output_modes[i].hdisplay = fbdev_data->vinfo->xres; - output->output_modes[i].vdisplay = fbdev_data->vinfo->yres; - output->output_modes[i].vrefresh = 60; - output->output_modes[i].flags = -1; - output->output_modes[i].type = -1; + _tdm_fbdev_display_to_tdm_mode(fbdev_data->vinfo, &output->output_modes[i]); sprintf(output->output_modes[i].name, "%dx%d", fbdev_data->vinfo->xres, @@ -233,7 +297,10 @@ void tdm_fbdev_destroy_layer(tdm_fbdev_data *fbdev_data) { tdm_fbdev_output_data *fbdev_output = fbdev_data->fbdev_output; - tdm_fbdev_layer_data *layer = fbdev_output->fbdev_layer; + tdm_fbdev_layer_data *layer; + if (!fbdev_output) + return; + layer = fbdev_output->fbdev_layer; if(layer != NULL) free(layer); @@ -299,29 +366,6 @@ failed_get: } tdm_error -fbdev_display_get_fd(tdm_backend_data *bdata, int *fd) -{ - tdm_fbdev_data *fbdev_data = (tdm_fbdev_data *)bdata; - int file_fd; - - RETURN_VAL_IF_FAIL(fbdev_data, TDM_ERROR_INVALID_PARAMETER); - RETURN_VAL_IF_FAIL(fd, TDM_ERROR_INVALID_PARAMETER); - - /* - * Event-based applications use poll/select for pageflip or vsync events, - * since farmebuffer does not produce such events we create common file. - * Without this file application will be locked on poll/select or return - * an error after timer expiring. - */ - file_fd = open("/tmp/tdm_fbdev_select", O_RDWR | O_CREAT | O_TRUNC, ACCESSPERMS); - TDM_INFO("Open fake file: /tmp/tdm_fbdev_select %d", file_fd); - - *fd = file_fd; - - return TDM_ERROR_NONE; -} - -tdm_error fbdev_display_handle_events(tdm_backend_data *bdata) { tdm_fbdev_data *fbdev_data = (tdm_fbdev_data *) bdata; @@ -564,12 +608,11 @@ fbdev_output_commit(tdm_output *output, int sync, void *user_data) */ memcpy(fbdev_output->mem, display_buffer->mem, display_buffer->size * sizeof(char) ); - - /* - * Up fake flag to simulate page flip event - */ - fbdev_output->is_commit = UP; - fbdev_output->user_data = user_data; + if (fbdev_output->commit_func) + { + TDM_ERR("trace"); + fbdev_output->commit_func((tdm_output *)output, fbdev_output->sequence++, 0, 0, user_data); + } return TDM_ERROR_NONE; } @@ -686,7 +729,7 @@ fbdev_output_get_mode(tdm_output *output, const tdm_output_mode **mode) tdm_fbdev_output_data *fbdev_output = (tdm_fbdev_output_data *)output; RETURN_VAL_IF_FAIL(fbdev_output, TDM_ERROR_INVALID_PARAMETER); - RETURN_VAL_IF_FAIL(*mode, TDM_ERROR_INVALID_PARAMETER); + RETURN_VAL_IF_FAIL(mode, TDM_ERROR_INVALID_PARAMETER); *mode = fbdev_output->current_mode; |