summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoman Peresipkyn <r.peresipkyn@samsung.com>2016-02-02 18:31:27 +0200
committerSooChan Lim <sc1.lim@samsung.com>2016-03-07 19:52:48 +0900
commitd80098510362c1ff3759b5c779d86f034ad6c760 (patch)
tree59da6e8b627654ea05bae0076290d66a08725293
parent249b4695214bfd70759af8ae243b03704b04ea2b (diff)
downloadlibtdm-fbdev-d80098510362c1ff3759b5c779d86f034ad6c760.tar.gz
libtdm-fbdev-d80098510362c1ff3759b5c779d86f034ad6c760.tar.bz2
libtdm-fbdev-d80098510362c1ff3759b5c779d86f034ad6c760.zip
add basic implemenation of layers and add get_outputs and output_get_capability callbacks
Change-Id: Id462e5204865c8c2515c8210724c3f6d52d54e9b Signed-off-by: Roman Peresipkyn <r.peresipkyn@samsung.com>
-rw-r--r--src/tdm_fbdev.h18
-rw-r--r--src/tdm_fbdev_display.c189
2 files changed, 186 insertions, 21 deletions
diff --git a/src/tdm_fbdev.h b/src/tdm_fbdev.h
index 857930c..430d152 100644
--- a/src/tdm_fbdev.h
+++ b/src/tdm_fbdev.h
@@ -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_ */
diff --git a/src/tdm_fbdev_display.c b/src/tdm_fbdev_display.c
index fa05e8a..69749c7 100644
--- a/src/tdm_fbdev_display.c
+++ b/src/tdm_fbdev_display.c
@@ -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)
{