summaryrefslogtreecommitdiff
path: root/src/libtdm-exynos/tdm_exynos_layer.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/libtdm-exynos/tdm_exynos_layer.c')
-rw-r--r--src/libtdm-exynos/tdm_exynos_layer.c474
1 files changed, 0 insertions, 474 deletions
diff --git a/src/libtdm-exynos/tdm_exynos_layer.c b/src/libtdm-exynos/tdm_exynos_layer.c
deleted file mode 100644
index cb326e4..0000000
--- a/src/libtdm-exynos/tdm_exynos_layer.c
+++ /dev/null
@@ -1,474 +0,0 @@
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include <drm_fourcc.h>
-#include <tdm_helper.h>
-#include "tdm_exynos.h"
-
-static int tdm_exynos_buffer_key;
-#define TDM_EXYNOS_BUFFER_KEY ((unsigned long)&tdm_exynos_buffer_key)
-
-static void
-_tdm_exynos_display_buffer_destroy(void *user_data)
-{
- tdm_exynos_display_buffer *display_buffer = (tdm_exynos_display_buffer *)user_data;
-
- if (display_buffer->fb_id > 0) {
- int ret = drmModeRmFB(display_buffer->exynos_data->drm_fd, display_buffer->fb_id);
- if (ret < 0) {
- TDM_ERR("rm fb failed");
- return;
- }
- TDM_DBG("drmModeRmFB success!!! fb_id:%d", display_buffer->fb_id);
- } else
- TDM_DBG("drmModeRmFB not called fb_id:%d", display_buffer->fb_id);
-
- free(display_buffer);
-}
-
-static tdm_exynos_display_buffer *
-_tdm_exynos_display_get_buffer(tdm_exynos_data *exynos_data, tbm_surface_h buffer)
-{
- tdm_exynos_display_buffer *display_buffer = NULL;
-
- if (!tbm_surface_internal_get_user_data(buffer, TDM_EXYNOS_BUFFER_KEY, (void **)&display_buffer)) {
- unsigned int width;
- unsigned int height;
- unsigned int format;
- unsigned int handles[4] = {0,};
- unsigned int pitches[4] = {0,};
- unsigned int offsets[4] = {0,};
- unsigned int size;
- tbm_bo bo;
- int i, count, ret;
-
- display_buffer = calloc(1, sizeof(tdm_exynos_display_buffer));
- RETURN_VAL_IF_FAIL(display_buffer != NULL, NULL);
-
- if (!tbm_surface_internal_add_user_data(buffer, TDM_EXYNOS_BUFFER_KEY, _tdm_exynos_display_buffer_destroy)) {
- TDM_ERR("FAIL to create user_data for surface %p", buffer);
- free(display_buffer);
- return NULL;
- }
- if (!tbm_surface_internal_set_user_data(buffer, TDM_EXYNOS_BUFFER_KEY, display_buffer)) {
- TDM_ERR("FAIL to set user_data for surface %p", buffer);
- tbm_surface_internal_delete_user_data(buffer, TDM_EXYNOS_BUFFER_KEY);
- free(display_buffer);
- return NULL;
- }
-
- display_buffer->exynos_data = exynos_data;
- display_buffer->buffer = buffer;
-
- width = tbm_surface_get_width(buffer);
- height = tbm_surface_get_height(buffer);
- format = tbm_surface_get_format(buffer);
- count = tbm_surface_internal_get_num_planes(format);
- bo = tbm_surface_internal_get_bo(buffer, 0);
- handles[0] = tbm_bo_get_handle(bo, TBM_DEVICE_DEFAULT).u32;
- for (i = 1; i < count; i++)
- handles[i] = handles[0];
-
- for (i = 0; i < count; i++)
- tbm_surface_internal_get_plane_data(buffer, i, &size, &offsets[i], &pitches[i]);
-
- ret = drmModeAddFB2(exynos_data->drm_fd, width, height, format,
- handles, pitches, offsets, &display_buffer->fb_id, 0);
- if (ret < 0) {
- TDM_ERR("add fb failed: %m");
- free(display_buffer);
- return NULL;
- }
- TDM_DBG("exynos_data->drm_fd : %d, display_buffer->fb_id:%u", exynos_data->drm_fd,
- display_buffer->fb_id);
-
- if (IS_RGB(format))
- display_buffer->width = pitches[0] >> 2;
- else
- display_buffer->width = pitches[0];
- }
-
- return display_buffer;
-}
-
-tdm_error
-exynos_layer_get_capability(tdm_layer *layer, tdm_caps_layer *caps)
-{
- tdm_exynos_layer_data *layer_data = layer;
- tdm_exynos_data *exynos_data;
- drmModePlanePtr plane = NULL;
- drmModeObjectPropertiesPtr props = NULL;
- int i, fmt_count;
- tdm_error ret;
-
- RETURN_VAL_IF_FAIL(layer_data, TDM_ERROR_INVALID_PARAMETER);
- RETURN_VAL_IF_FAIL(caps, TDM_ERROR_INVALID_PARAMETER);
-
- memset(caps, 0, sizeof(tdm_caps_layer));
-
- exynos_data = layer_data->exynos_data;
- plane = drmModeGetPlane(exynos_data->drm_fd, layer_data->plane_id);
- if (!plane) {
- TDM_ERR("get plane failed: %m");
- ret = TDM_ERROR_OPERATION_FAILED;
- goto failed_get;
- }
-
- caps->capabilities = layer_data->capabilities;
- caps->zpos = layer_data->zpos; /* if VIDEO layer, zpos is -1 */
-
- caps->formats = calloc(1, sizeof(tbm_format) * plane->count_formats);
- if (!caps->formats) {
- ret = TDM_ERROR_OUT_OF_MEMORY;
- TDM_ERR("alloc failed\n");
- goto failed_get;
- }
-
- fmt_count = 0;
- for (i = 0; i < plane->count_formats; i++) {
- /* TODO: kernel reports wrong formats */
- if (plane->formats[i] != DRM_FORMAT_XRGB8888 &&
- plane->formats[i] != DRM_FORMAT_ARGB8888)
- continue;
- caps->formats[fmt_count] = tdm_exynos_format_to_tbm_format(plane->formats[i]);
- fmt_count++;
- }
- caps->format_count = fmt_count;
-
- props = drmModeObjectGetProperties(exynos_data->drm_fd, layer_data->plane_id,
- DRM_MODE_OBJECT_PLANE);
- if (!props) {
- ret = TDM_ERROR_OPERATION_FAILED;
- TDM_ERR("get plane properties failed: %m\n");
- goto failed_get;
- }
-
- caps->props = calloc(1, sizeof(tdm_prop) * props->count_props);
- if (!caps->props) {
- ret = TDM_ERROR_OUT_OF_MEMORY;
- TDM_ERR("alloc failed\n");
- goto failed_get;
- }
-
- caps->prop_count = 0;
- for (i = 0; i < props->count_props; i++) {
- drmModePropertyPtr prop = drmModeGetProperty(exynos_data->drm_fd,
- props->props[i]);
- if (!prop)
- continue;
- if (!strncmp(prop->name, "type", TDM_NAME_LEN)) {
- drmModeFreeProperty(prop);
- continue;
- }
- if (!strncmp(prop->name, "zpos", TDM_NAME_LEN)) {
- drmModeFreeProperty(prop);
- continue;
- }
- snprintf(caps->props[caps->prop_count].name, TDM_NAME_LEN, "%s", prop->name);
- caps->props[caps->prop_count].id = props->props[i];
- caps->prop_count++;
- drmModeFreeProperty(prop);
- }
-
- drmModeFreeObjectProperties(props);
- drmModeFreePlane(plane);
-
- return TDM_ERROR_NONE;
-failed_get:
- drmModeFreeObjectProperties(props);
- drmModeFreePlane(plane);
- free(caps->formats);
- free(caps->props);
- memset(caps, 0, sizeof(tdm_caps_layer));
- return ret;
-}
-
-tdm_error
-exynos_layer_set_property(tdm_layer *layer, unsigned int id, tdm_value value)
-{
- tdm_exynos_layer_data *layer_data = layer;
- tdm_exynos_data *exynos_data;
- int ret;
-
- RETURN_VAL_IF_FAIL(layer_data, TDM_ERROR_INVALID_PARAMETER);
- RETURN_VAL_IF_FAIL(layer_data->plane_id > 0, TDM_ERROR_INVALID_PARAMETER);
-
- exynos_data = layer_data->exynos_data;
- ret = drmModeObjectSetProperty(exynos_data->drm_fd,
- layer_data->plane_id, DRM_MODE_OBJECT_PLANE,
- id, value.u32);
- if (ret < 0) {
- TDM_ERR("set property failed: %m");
- return TDM_ERROR_OPERATION_FAILED;
- }
-
- return TDM_ERROR_NONE;
-}
-
-tdm_error
-exynos_layer_get_property(tdm_layer *layer, unsigned int id, tdm_value *value)
-{
- tdm_exynos_layer_data *layer_data = layer;
- tdm_exynos_data *exynos_data;
- drmModeObjectPropertiesPtr props;
- tdm_error ret = TDM_ERROR_INVALID_PARAMETER;
- int i;
-
- RETURN_VAL_IF_FAIL(layer_data, TDM_ERROR_INVALID_PARAMETER);
- RETURN_VAL_IF_FAIL(layer_data->plane_id > 0, TDM_ERROR_INVALID_PARAMETER);
- RETURN_VAL_IF_FAIL(value, TDM_ERROR_INVALID_PARAMETER);
-
- exynos_data = layer_data->exynos_data;
- props = drmModeObjectGetProperties(exynos_data->drm_fd, layer_data->plane_id,
- DRM_MODE_OBJECT_PLANE);
- if (props == NULL) {
- TDM_ERR("get property failed: %m");
- return TDM_ERROR_OPERATION_FAILED;
- }
-
- for (i = 0; i < props->count_props; i++)
- if (props->props[i] == id) {
- (*value).u32 = (uint)props->prop_values[i];
- ret = TDM_ERROR_NONE;
- break;
- }
-
- drmModeFreeObjectProperties(props);
-
- if (ret != TDM_ERROR_NONE)
- TDM_ERR("unknown property id: %ud", id);
-
- return ret;
-}
-
-tdm_error
-exynos_layer_set_info(tdm_layer *layer, tdm_info_layer *info)
-{
- tdm_exynos_layer_data *layer_data = layer;
-
- RETURN_VAL_IF_FAIL(layer_data, TDM_ERROR_INVALID_PARAMETER);
- RETURN_VAL_IF_FAIL(info, TDM_ERROR_INVALID_PARAMETER);
-
- layer_data->info = *info;
- layer_data->info_changed = 1;
-
- return TDM_ERROR_NONE;
-}
-
-tdm_error
-exynos_layer_get_info(tdm_layer *layer, tdm_info_layer *info)
-{
- tdm_exynos_layer_data *layer_data = layer;
-
- RETURN_VAL_IF_FAIL(layer_data, TDM_ERROR_INVALID_PARAMETER);
- RETURN_VAL_IF_FAIL(info, TDM_ERROR_INVALID_PARAMETER);
-
- *info = layer_data->info;
-
- return TDM_ERROR_NONE;
-}
-
-tdm_error
-exynos_layer_set_buffer(tdm_layer *layer, tbm_surface_h buffer)
-{
- tdm_exynos_layer_data *layer_data = layer;
- tdm_exynos_data *exynos_data;
- tdm_exynos_display_buffer *display_buffer;
-
- RETURN_VAL_IF_FAIL(layer_data, TDM_ERROR_INVALID_PARAMETER);
- RETURN_VAL_IF_FAIL(buffer, TDM_ERROR_INVALID_PARAMETER);
-
- exynos_data = layer_data->exynos_data;
-
- display_buffer = _tdm_exynos_display_get_buffer(exynos_data, buffer);
- if (!display_buffer) {
- TDM_ERR("alloc failed");
- return TDM_ERROR_OUT_OF_MEMORY;
- }
-
- if (layer_data->display_buffer)
- tbm_surface_internal_unref(layer_data->display_buffer->buffer);
-
- layer_data->display_buffer = display_buffer;
- tbm_surface_internal_ref(layer_data->display_buffer->buffer);
-
- layer_data->display_buffer_changed = 1;
-
- return TDM_ERROR_NONE;
-}
-
-tdm_error
-exynos_layer_unset_buffer(tdm_layer *layer)
-{
- tdm_exynos_layer_data *layer_data = layer;
-
- RETURN_VAL_IF_FAIL(layer_data, TDM_ERROR_INVALID_PARAMETER);
-
- if (layer_data->display_buffer &&
- (!(layer_data->capabilities & TDM_LAYER_CAPABILITY_PRIMARY) || layer_data->display_buffer_force_unset)) {
- layer_data->display_buffer_force_unset = 0;
- tbm_surface_internal_unref(layer_data->display_buffer->buffer);
- layer_data->display_buffer = NULL;
- }
- layer_data->display_buffer_changed = 1;
-
- return TDM_ERROR_NONE;
-}
-
-tdm_error
-tdm_exynos_layer_get_supported_format(tdm_layer *layer, const tbm_format **out_formats,
- int *out_format_count)
-{
- tdm_exynos_layer_data *layer_data = layer;
- tdm_exynos_data *exynos_data;
- drmModePlanePtr plane = NULL;
- int i, j;
- tdm_error ret;
- tbm_format *formats = NULL;
- int format_count = 0;
-
- RETURN_VAL_IF_FAIL(layer_data, TDM_ERROR_INVALID_PARAMETER);
- RETURN_VAL_IF_FAIL(out_formats, TDM_ERROR_INVALID_PARAMETER);
- RETURN_VAL_IF_FAIL(out_format_count, TDM_ERROR_INVALID_PARAMETER);
-
- if (layer_data->formats) {
- *out_formats = layer_data->formats;
- *out_format_count = layer_data->format_count;
-
- return TDM_ERROR_NONE;
- }
-
- exynos_data = layer_data->exynos_data;
- plane = drmModeGetPlane(exynos_data->drm_fd, layer_data->plane_id);
- if (!plane) {
- TDM_ERR("get plane failed: %m");
- ret = TDM_ERROR_OPERATION_FAILED;
- goto failed_get;
- }
-
- for (i = 0; i < plane->count_formats; i++) {
- /* TODO: kernel reports wrong formats */
- if (plane->formats[i] != DRM_FORMAT_XRGB8888 &&
- plane->formats[i] != DRM_FORMAT_ARGB8888)
- continue;
- format_count++;
- }
-
- formats = calloc(1, sizeof(tbm_format) * format_count);
- if (!formats) {
- ret = TDM_ERROR_OUT_OF_MEMORY;
- TDM_ERR("alloc failed\n");
- goto failed_get;
- }
-
- for (i = 0, j = 0; j < plane->count_formats; j++) {
- /* TODO: kernel reports wrong formats */
- if (plane->formats[j] != DRM_FORMAT_XRGB8888 &&
- plane->formats[j] != DRM_FORMAT_ARGB8888)
- continue;
- formats[i++] = tdm_exynos_format_to_tbm_format(plane->formats[j]);
- }
-
- drmModeFreePlane(plane);
-
- layer_data->formats = formats;
- layer_data->format_count = format_count;
-
- *out_formats = layer_data->formats;
- *out_format_count = layer_data->format_count;
-
- return TDM_ERROR_NONE;
-failed_get:
- drmModeFreePlane(plane);
- free(formats);
- *out_formats = NULL;
- *out_format_count = 0;
- return ret;
-}
-
-tdm_error
-exynos_layer_get_available_properties(tdm_layer *layer, const tdm_prop **out_props,
- int *out_prop_count)
-{
- tdm_exynos_layer_data *layer_data = layer;
- tdm_exynos_data *exynos_data;
- drmModePlanePtr plane = NULL;
- drmModeObjectPropertiesPtr props = NULL;
- int i;
- tdm_error ret;
- tdm_prop *tdm_props = NULL;
- int prop_count;
-
- RETURN_VAL_IF_FAIL(layer_data, TDM_ERROR_INVALID_PARAMETER);
- RETURN_VAL_IF_FAIL(out_props, TDM_ERROR_INVALID_PARAMETER);
- RETURN_VAL_IF_FAIL(out_prop_count, TDM_ERROR_INVALID_PARAMETER);
-
- if (layer_data->props) {
- *out_props = layer_data->props;
- *out_prop_count = layer_data->prop_count;
-
- return TDM_ERROR_NONE;
- }
-
- exynos_data = layer_data->exynos_data;
- plane = drmModeGetPlane(exynos_data->drm_fd, layer_data->plane_id);
- if (!plane) {
- TDM_ERR("get plane failed: %m");
- ret = TDM_ERROR_OPERATION_FAILED;
- goto failed_get;
- }
-
- props = drmModeObjectGetProperties(exynos_data->drm_fd, layer_data->plane_id,
- DRM_MODE_OBJECT_PLANE);
- if (!props) {
- ret = TDM_ERROR_OPERATION_FAILED;
- TDM_ERR("get plane properties failed: %m\n");
- goto failed_get;
- }
-
- tdm_props = calloc(1, sizeof(tdm_prop) * props->count_props);
- if (!tdm_props) {
- ret = TDM_ERROR_OUT_OF_MEMORY;
- TDM_ERR("alloc failed\n");
- goto failed_get;
- }
-
- prop_count = 0;
- for (i = 0; i < props->count_props; i++) {
- drmModePropertyPtr prop = drmModeGetProperty(exynos_data->drm_fd,
- props->props[i]);
- if (!prop)
- continue;
- if (!strncmp(prop->name, "type", TDM_NAME_LEN)) {
- drmModeFreeProperty(prop);
- continue;
- }
- if (!strncmp(prop->name, "zpos", TDM_NAME_LEN)) {
- drmModeFreeProperty(prop);
- continue;
- }
- snprintf(tdm_props[prop_count].name, TDM_NAME_LEN, "%s", prop->name);
- tdm_props[prop_count].id = props->props[i];
- prop_count++;
- drmModeFreeProperty(prop);
- }
-
- drmModeFreeObjectProperties(props);
- drmModeFreePlane(plane);
-
- layer_data->props = tdm_props;
- layer_data->prop_count = prop_count;
-
- *out_props = layer_data->props;
- *out_prop_count = layer_data->prop_count;
-
- return TDM_ERROR_NONE;
-failed_get:
- drmModeFreeObjectProperties(props);
- drmModeFreePlane(plane);
- *out_props = NULL;
- *out_prop_count = 0;
-
- return ret;
-}