diff options
Diffstat (limited to 'src/libtdm-exynos/tdm_exynos_layer.c')
-rw-r--r-- | src/libtdm-exynos/tdm_exynos_layer.c | 474 |
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; -} |