add implemenation of fbedv's display callbacks 61/61361/1
authorRoman Peresipkyn <r.peresipkyn@samsung.com>
Mon, 1 Feb 2016 15:54:44 +0000 (17:54 +0200)
committerSooChan Lim <sc1.lim@samsung.com>
Mon, 7 Mar 2016 10:52:05 +0000 (19:52 +0900)
Change-Id: I1e103ffc5591f6ca22d3f1938722b5536138e4ac
Signed-off-by: Roman Peresipkyn <r.peresipkyn@samsung.com>
src/tdm_fbdev.c
src/tdm_fbdev.h
src/tdm_fbdev_display.c

index 2cdc1e0786f49f39a9ea58f2069b18044eb131db..1e2b0ad69079c6dbf3829d3640f0c62c3e51d1d0 100644 (file)
@@ -163,22 +163,6 @@ _tdm_fbdev_init_internal(void)
         goto close_1;
     }
 
-    /*
-     * TODO: Size of framebuffer must be aligned to system page size before
-     *  it is mapped
-     */
-    fbdev_data->size = finfo.line_length * vinfo.yres * MAX_BUF;
-
-    fbdev_data->vaddr = mmap(0, fbdev_data->size, PROT_READ|PROT_WRITE,
-            MAP_SHARED, fbdev_data->fbdev_fd, 0);
-    if (fbdev_data->vaddr == MAP_FAILED)
-    {
-        TDM_ERR("MMap framebuffer failed, errno=%d", errno);
-        goto close_1;
-    }
-
-    memset(fbdev_data->vaddr, 0, fbdev_data->size);
-
     /*
      * Output framebuffer's related information
      */
@@ -292,6 +276,13 @@ tdm_fbdev_init(tdm_display *dpy, tdm_error *error)
         goto failed;
     }
 
+    ret = tdm_fbdev_creat_output(fbdev_data);
+    if (ret != TDM_ERROR_NONE)
+    {
+        TDM_INFO("init of output failed");
+        goto failed_2;
+    }
+
 
     TDM_INFO("init success!");
 
@@ -300,6 +291,9 @@ tdm_fbdev_init(tdm_display *dpy, tdm_error *error)
 
     return (tdm_backend_data*)fbdev_data;
 
+failed_2:
+    tdm_fbdev_destroy_output(fbdev_data);
+
 failed:
     if(error)
         *error = ret;
index c57a513f2a75cab6d82e529766ed732ce662f834..857930c290d3b580aa825d71a42e13166cec7c0e 100644 (file)
@@ -50,6 +50,16 @@ tdm_error    fbdev_layer_get_info(tdm_layer *layer, tdm_info_layer *info);
 tdm_error    fbdev_layer_set_buffer(tdm_layer *layer, tbm_surface_h buffer);
 tdm_error    fbdev_layer_unset_buffer(tdm_layer *layer);
 
+/* Framebuffer moudel's internal macros, functions, structures */
+#define RETURN_VAL_IF_FAIL(cond, val) {\
+    if (!(cond)) {\
+        TDM_ERR("'%s' failed", #cond);\
+        return val;\
+    }\
+}
+
+typedef struct _tdm_fbdev_output_data tdm_fbdev_output_data;
+
 typedef struct _tdm_fbdev_data
 {
     int fbdev_fd;
@@ -59,9 +69,30 @@ typedef struct _tdm_fbdev_data
     struct fb_fix_screeninfo finfo;
     struct fb_var_screeninfo vinfo;
 
+    tdm_fbdev_output_data *fbdev_output;
+} tdm_fbdev_data;
+
+struct _tdm_fbdev_output_data
+{
+    tdm_fbdev_data *fbdev_data;
+
+    uint32_t width;
+    uint32_t height;
+    uint32_t pitch;
+    uint32_t bpp;
+    size_t   size;
+
+    /*
+     * Poinetr to Framebuffers's mapped memory
+     */
     void *vaddr;
-    size_t size;
-}tdm_fbdev_data;
 
+    tdm_output_mode *output_modes;
+};
+
+
+
+tdm_error    tdm_fbdev_creat_output(tdm_fbdev_data *fbdev_data);
+void         tdm_fbdev_destroy_output(tdm_fbdev_data *fbdev_data);
 
 #endif /* _TDM_fbdev_H_ */
index acc9dd5164daa2d05b44ed58d9e19922b5d61831..d370d1728ea876c5751877403ad6c48e005a30f9 100644 (file)
 #endif
 
 #include <tdm_helper.h>
+#include <stdint.h>
 #include "tdm_fbdev.h"
 
+tdm_error tdm_fbdev_creat_output(tdm_fbdev_data *fbdev_data)
+{
+    tdm_fbdev_output_data *output = NULL;
+    size_t size;
+
+    output = calloc(1, sizeof(tdm_fbdev_output_data));
+    if (output == NULL)
+    {
+        TDM_ERR("alloc output failed");
+        return TDM_ERROR_OUT_OF_MEMORY;
+    }
+
+    /*
+     * TODO: Size of framebuffer must be aligned to system page size before
+     *  it is mapped
+     */
+    size = fbdev_data->finfo.line_length * fbdev_data->vinfo.yres * MAX_BUF;
+
+    output->vaddr = mmap(0, size, PROT_READ|PROT_WRITE,
+            MAP_SHARED, fbdev_data->fbdev_fd, 0);
+    if (output->vaddr == MAP_FAILED)
+    {
+        TDM_ERR("MMap framebuffer failed, errno=%d", errno);
+        return TDM_ERROR_OPERATION_FAILED;
+    }
+
+    memset(output->vaddr, 0, size);
+
+    output->width = fbdev_data->vinfo.width;
+    output->height = fbdev_data->vinfo.height;
+    output->pitch = fbdev_data->finfo.line_length;
+    output->bpp = fbdev_data->vinfo.bits_per_pixel;
+    output->size = size;
+
+    output->fbdev_data = fbdev_data;
+
+    fbdev_data->fbdev_output = output;
+
+    return TDM_ERROR_NONE;
+}
+
+void tdm_fbdev_destroy_output(tdm_fbdev_data *fbdev_data)
+{
+    tdm_fbdev_output_data *fbdev_output = fbdev_data->fbdev_output;
+
+    if (fbdev_output == NULL)
+        goto close;
+
+    if (fbdev_output->vaddr == NULL)
+        goto close_2;
+
+    munmap(fbdev_output->vaddr, fbdev_output->size);
+
+close_2:
+    free(fbdev_output);
+close:
+    return;
+}
+
+
+
 tdm_error
 fbdev_display_get_capabilitiy(tdm_backend_data *bdata, tdm_caps_display *caps)
 {
+    RETURN_VAL_IF_FAIL(caps, TDM_ERROR_INVALID_PARAMETER);
+
+    /*
+     * Framebuffer device does not support layers
+     */
+    caps->max_layer_count = 1;
+
     return TDM_ERROR_NONE;
 }
 
 tdm_output**
 fbdev_display_get_outputs(tdm_backend_data *bdata, int *count, tdm_error *error)
 {
+    tdm_fbdev_data *fbdev_data = bdata;
+    tdm_fbdev_output_data *fbdev_output = fbdev_data->fbdev_output;
+    tdm_output **outputs;
+    tdm_error ret;
+
+    RETURN_VAL_IF_FAIL(fbdev_data, NULL);
+    RETURN_VAL_IF_FAIL(count, NULL);
+
+    if (fbdev_output == NULL)
+    {
+        ret = TDM_ERROR_NONE;
+        goto failed_get;
+    }
+
+    /*
+     * Since it is Framebuffer device there is only one output
+     */
+    *count = 1;
+
+    /* will be freed in frontend */
+    outputs = calloc(*count, sizeof(tdm_fbdev_output_data*));
+    if (!outputs)
+    {
+        TDM_ERR("failed: alloc memory");
+        *count = 0;
+        ret = TDM_ERROR_OUT_OF_MEMORY;
+        goto failed_get;
+    }
+
+    outputs[0] = fbdev_output;
+
+    if (error)
+        *error = TDM_ERROR_NONE;
+
+    return outputs;
+
+failed_get:
+    if (error)
+        *error = ret;
     return NULL;
 }
 
 tdm_error
 fbdev_display_get_fd(tdm_backend_data *bdata, int *fd)
 {
+    RETURN_VAL_IF_FAIL(bdata, TDM_ERROR_INVALID_PARAMETER);
+    RETURN_VAL_IF_FAIL(fd, TDM_ERROR_INVALID_PARAMETER);
+
+    /*
+     * TODO: It is tricky place since we don't know how drm
+     *  file descriptor is used by software above in drm backend;
+     */
+    *fd = -1;
+
     return TDM_ERROR_NONE;
 }
 
 tdm_error
 fbdev_display_handle_events(tdm_backend_data *bdata)
 {
+    /*
+     * Framebuffer does not produce events
+     */
     return TDM_ERROR_NONE;
 }