diff options
author | Roman Peresipkyn <r.peresipkyn@samsung.com> | 2016-02-02 18:31:27 +0200 |
---|---|---|
committer | SooChan Lim <sc1.lim@samsung.com> | 2016-03-07 19:52:48 +0900 |
commit | d80098510362c1ff3759b5c779d86f034ad6c760 (patch) | |
tree | 59da6e8b627654ea05bae0076290d66a08725293 | |
parent | 249b4695214bfd70759af8ae243b03704b04ea2b (diff) | |
download | libtdm-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.h | 18 | ||||
-rw-r--r-- | src/tdm_fbdev_display.c | 189 |
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) { |