add basic implemenation of layers and add get_outputs and output_get_capability callbacks 63/61363/1
authorRoman Peresipkyn <r.peresipkyn@samsung.com>
Tue, 2 Feb 2016 16:31:27 +0000 (18:31 +0200)
committerSooChan Lim <sc1.lim@samsung.com>
Mon, 7 Mar 2016 10:52:48 +0000 (19:52 +0900)
Change-Id: Id462e5204865c8c2515c8210724c3f6d52d54e9b
Signed-off-by: Roman Peresipkyn <r.peresipkyn@samsung.com>
src/tdm_fbdev.h
src/tdm_fbdev_display.c

index 857930c290d3b580aa825d71a42e13166cec7c0e..430d1529969c1635fd8964fb606190cb6824dd00 100644 (file)
@@ -59,6 +59,7 @@ tdm_error    fbdev_layer_unset_buffer(tdm_layer *layer);
 }
 
 typedef struct _tdm_fbdev_output_data tdm_fbdev_output_data;
+typedef struct _tdm_fbdev_layer_data tdm_fbdev_layer_data;
 
 typedef struct _tdm_fbdev_data
 {
@@ -75,24 +76,39 @@ typedef struct _tdm_fbdev_data
 struct _tdm_fbdev_output_data
 {
     tdm_fbdev_data *fbdev_data;
+    tdm_fbdev_layer_data *fbdev_layer;
 
     uint32_t width;
     uint32_t height;
     uint32_t pitch;
     uint32_t bpp;
     size_t   size;
+    uint32_t max_width;
+    uint32_t max_height;
 
     /*
      * Poinetr to Framebuffers's mapped memory
      */
     void *vaddr;
 
+    int count_modes;
     tdm_output_mode *output_modes;
-};
 
+    tdm_output_type connector_type;
+    tdm_output_conn_status status;
+    unsigned int connector_type_id;
+};
 
+struct _tdm_fbdev_layer_data
+{
+       tdm_fbdev_data *fbdev_data;
+       tdm_fbdev_output_data *fbdev_output;
+};
 
 tdm_error    tdm_fbdev_creat_output(tdm_fbdev_data *fbdev_data);
 void         tdm_fbdev_destroy_output(tdm_fbdev_data *fbdev_data);
 
+tdm_error    tdm_fbdev_creat_layer(tdm_fbdev_data *fbdev_data);
+void         tdm_fbdev_destroy_layer(tdm_fbdev_data *fbdev_data);
+
 #endif /* _TDM_fbdev_H_ */
index fa05e8aa153501c94b2d1835b16a3d896fa2ab2c..69749c7a53203324dac14616c7093c371a4b7a72 100644 (file)
@@ -6,10 +6,12 @@
 #include <stdint.h>
 #include "tdm_fbdev.h"
 
-tdm_error tdm_fbdev_creat_output(tdm_fbdev_data *fbdev_data)
+tdm_error
+tdm_fbdev_creat_output(tdm_fbdev_data *fbdev_data)
 {
     tdm_fbdev_output_data *output = NULL;
     size_t size;
+    int i = 0;
 
     output = calloc(1, sizeof(tdm_fbdev_output_data));
     if (output == NULL)
@@ -34,20 +36,57 @@ tdm_error tdm_fbdev_creat_output(tdm_fbdev_data *fbdev_data)
 
     memset(output->vaddr, 0, size);
 
-    output->width = fbdev_data->vinfo.width;
-    output->height = fbdev_data->vinfo.height;
+    output->width = fbdev_data->vinfo.xres;
+    output->height = fbdev_data->vinfo.yres;
     output->pitch = fbdev_data->vinfo.width;
     output->bpp = fbdev_data->vinfo.bits_per_pixel;
     output->size = size;
+    output->max_width  = fbdev_data->vinfo.xres_virtual;
+    output->max_height = fbdev_data->vinfo.yres_virtual;
 
-    output->fbdev_data = fbdev_data;
+    output->status = TDM_OUTPUT_CONN_STATUS_CONNECTED;
+    output->connector_type = TDM_OUTPUT_TYPE_LVDS;
 
+    /*
+     * TODO: connector_type_id field relates to libdrm connector which framebuffer
+     *  does not know. It have to be checked whether softaware above us use this
+     *  field for its purposes.
+     */
+    output->connector_type_id = 1;
+
+    /*
+     * TODO: Check does Framebuffer support multiple modes and
+     *  switching between them?
+     */
+    output->count_modes = 1;
+    output->output_modes = calloc(output->count_modes, sizeof(tdm_output_mode));
+    if (!output->output_modes)
+    {
+        TDM_ERR("failed: alloc memory");
+        return TDM_ERROR_OUT_OF_MEMORY;
+    }
+
+    for(i = 0; i < output->count_modes ; i++)
+    {
+        output->output_modes[i].width = fbdev_data->vinfo.xres;
+        output->output_modes[i].height = fbdev_data->vinfo.yres;
+        output->output_modes[i].refresh = 60;
+        output->output_modes[i].flags = -1;
+        output->output_modes[i].type = -1;
+
+        sprintf(output->output_modes[i].name, "%dx%d",
+                fbdev_data->vinfo.width,
+                fbdev_data->vinfo.height);
+    }
+
+    output->fbdev_data = fbdev_data;
     fbdev_data->fbdev_output = output;
 
     return TDM_ERROR_NONE;
 }
 
-void tdm_fbdev_destroy_output(tdm_fbdev_data *fbdev_data)
+void
+tdm_fbdev_destroy_output(tdm_fbdev_data *fbdev_data)
 {
     tdm_fbdev_output_data *fbdev_output = fbdev_data->fbdev_output;
 
@@ -59,13 +98,44 @@ void tdm_fbdev_destroy_output(tdm_fbdev_data *fbdev_data)
 
     munmap(fbdev_output->vaddr, fbdev_output->size);
 
+    if (fbdev_output->output_modes == NULL)
+        goto close_2;
+
+    free(fbdev_output->output_modes);
+
 close_2:
     free(fbdev_output);
 close:
     return;
 }
 
+tdm_error
+tdm_fbdev_creat_layer(tdm_fbdev_data *fbdev_data)
+{
+    tdm_fbdev_layer_data *layer = NULL;
 
+    /*
+     * Framebuffer does not support layer, therefore create only
+     *  one layer by libtdm's demand;
+     */
+    layer = calloc(1, sizeof(tdm_fbdev_layer_data));
+    if (layer == NULL)
+    {
+        TDM_ERR("alloc output failed");
+        return TDM_ERROR_OUT_OF_MEMORY;
+    }
+
+    layer->fbdev_data = fbdev_data;
+    layer->fbdev_output = fbdev_data->fbdev_output;
+
+    return TDM_ERROR_NONE;
+}
+
+void
+tdm_fbdev_destroy_layer(tdm_fbdev_data *fbdev_data)
+{
+
+}
 
 tdm_error
 fbdev_display_get_capabilitiy(tdm_backend_data *bdata, tdm_caps_display *caps)
@@ -73,7 +143,8 @@ 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
+     * Framebuffer does not support layer, therefore create only
+     *  one layer by libtdm's demand;
      */
     caps->max_layer_count = 1;
 
@@ -132,8 +203,9 @@ fbdev_display_get_fd(tdm_backend_data *bdata, int *fd)
     RETURN_VAL_IF_FAIL(fd, TDM_ERROR_INVALID_PARAMETER);
 
     /*
-     * TODO: It is tricky place since we don't know how drm
+     * TODO: Shloud we implement this call, because it is tricky place since we don't know how drm
      *  file descriptor is used by software above in drm backend;
+     *
      */
     *fd = -1;
 
@@ -152,24 +224,114 @@ fbdev_display_handle_events(tdm_backend_data *bdata)
 tdm_error
 fbdev_output_get_capability(tdm_output *output, tdm_caps_output *caps)
 {
+    tdm_fbdev_output_data *fbdev_output = (tdm_fbdev_output_data *)output;
+    tdm_fbdev_data *fbdev_data = NULL;
+    tdm_error ret;
+    int i = 0;
+
+    RETURN_VAL_IF_FAIL(fbdev_output, TDM_ERROR_INVALID_PARAMETER);
+    RETURN_VAL_IF_FAIL(caps, TDM_ERROR_INVALID_PARAMETER);
+
+    memset(caps, 0, sizeof(tdm_caps_output));
+
+    fbdev_data = fbdev_output->fbdev_data;
+
+    caps->status = fbdev_output->status;
+    caps->type = fbdev_output->connector_type;
+    caps->type_id = fbdev_output->connector_type_id;
+
+    caps->mode_count = fbdev_output->count_modes;
+    caps->modes = calloc(caps->mode_count, sizeof(tdm_output_mode));
+    if (!caps->modes)
+    {
+        ret = TDM_ERROR_OUT_OF_MEMORY;
+        TDM_ERR("alloc failed\n");
+        goto failed_get;
+    }
+
+    for (i = 0; i < caps->mode_count; i++)
+        caps->modes[i] = fbdev_output->output_modes[i];
+
+    caps->mmWidth = fbdev_data->vinfo.width;;
+    caps->mmHeight = fbdev_data->vinfo.height;
+    caps->subpixel = -1;
+
+    caps->min_w = fbdev_output->width;
+    caps->min_h = fbdev_output->height;
+    caps->max_w = fbdev_output->max_width;
+    caps->max_h = fbdev_output->max_height;
+    caps->preferred_align = -1;
+
+    /*
+     * Framebuffer does not have properties
+     */
+    caps->prop_count = 0;
+    caps->props = NULL;
+
     return TDM_ERROR_NONE;
+
+failed_get:
+    memset(caps, 0, sizeof(tdm_caps_output));
+    return ret;
 }
 
 tdm_layer**
 fbdev_output_get_layers(tdm_output *output,  int *count, tdm_error *error)
 {
+    tdm_fbdev_output_data *fbdev_output= (tdm_fbdev_output_data *)output;
+    tdm_fbdev_layer_data *fbdev_layer = NULL;
+    tdm_layer **layers;
+    tdm_error ret;
+
+    RETURN_VAL_IF_FAIL(fbdev_output, NULL);
+    RETURN_VAL_IF_FAIL(count, NULL);
+
+    /*
+     * Framebuffer does not support layer, therefore create only
+     *  one layer by libtdm's demand;
+     */
+    *count = 1;
+
+    layers = calloc(*count, sizeof(tdm_layer));
+    if (layers == NULL)
+    {
+        TDM_ERR("failed: alloc memory");
+        *count = 0;
+        ret = TDM_ERROR_OUT_OF_MEMORY;
+        goto failed_get;
+    }
+
+    fbdev_layer = fbdev_output->fbdev_layer;
+
+    layers[0] = fbdev_layer;
+
+    if (error)
+        *error = TDM_ERROR_NONE;
+
+    return layers;
+
+failed_get:
+    if (error)
+        *error = ret;
+
     return NULL;
 }
 
 tdm_error
 fbdev_output_set_property(tdm_output *output, unsigned int id, tdm_value value)
 {
+    /*
+     * Framebuffer does not have properties
+     */
     return TDM_ERROR_NONE;
 }
 
 tdm_error
 fbdev_output_get_property(tdm_output *output, unsigned int id, tdm_value *value)
 {
+    /*
+     * Framebuffer does not have properties
+     */
     return TDM_ERROR_NONE;
 }
 
@@ -185,91 +347,78 @@ fbdev_output_set_vblank_handler(tdm_output *output, tdm_output_vblank_handler fu
     return TDM_ERROR_NONE;
 }
 
-
 tdm_error
 fbdev_output_commit(tdm_output *output, int sync, void *user_data)
 {
     return TDM_ERROR_NONE;
 }
 
-
 tdm_error
 fbdev_output_set_commit_handler(tdm_output *output, tdm_output_commit_handler func)
 {
     return TDM_ERROR_NONE;
 }
 
-
 tdm_error
 fbdev_output_set_dpms(tdm_output *output, tdm_output_dpms dpms_value)
 {
     return TDM_ERROR_NONE;
 }
 
-
 tdm_error
 fbdev_output_get_dpms(tdm_output *output, tdm_output_dpms *dpms_value)
 {
     return TDM_ERROR_NONE;
 }
 
-
 tdm_error
 fbdev_output_set_mode(tdm_output *output, const tdm_output_mode *mode)
 {
     return TDM_ERROR_NONE;
 }
 
-
 tdm_error
 fbdev_output_get_mode(tdm_output *output, const tdm_output_mode **mode)
 {
     return TDM_ERROR_NONE;
 }
 
-
 tdm_error
 fbdev_layer_get_capability(tdm_layer *layer, tdm_caps_layer *caps)
 {
     return TDM_ERROR_NONE;
 }
 
-
 tdm_error
 fbdev_layer_set_property(tdm_layer *layer, unsigned int id, tdm_value value)
 {
     return TDM_ERROR_NONE;
 }
 
-
 tdm_error
 fbdev_layer_get_property(tdm_layer *layer, unsigned int id, tdm_value *value)
 {
     return TDM_ERROR_NONE;
 }
 
-
 tdm_error
 fbdev_layer_set_info(tdm_layer *layer, tdm_info_layer *info)
 {
     return TDM_ERROR_NONE;
 }
 
-
 tdm_error
 fbdev_layer_get_info(tdm_layer *layer, tdm_info_layer *info)
 {
     return TDM_ERROR_NONE;
 }
 
-
 tdm_error
 fbdev_layer_set_buffer(tdm_layer *layer, tbm_surface_h buffer)
 {
     return TDM_ERROR_NONE;
 }
 
-
 tdm_error
 fbdev_layer_unset_buffer(tdm_layer *layer)
 {