#include "tdm_virtual.h"
-#define TDM_HWC 1
-
static tdm_virtual_data *virtual_data;
void
tdm_func_voutput virtual_func_voutput;
tdm_func_hwc virtual_func_hwc;
tdm_func_hwc_window virtual_func_hwc_window;
- tdm_func_layer virtual_func_layer;
tdm_error ret;
if (!dpy) {
return NULL;
}
-#if TDM_HWC
- virtual_data->hwc_mode = 1;
-#endif
-
LIST_INITHEAD(&virtual_data->voutput_list);
LIST_INITHEAD(&virtual_data->output_list);
LIST_INITHEAD(&virtual_data->buffer_list);
memset(&virtual_func_output, 0, sizeof(virtual_func_output));
virtual_func_output.output_get_capability = virtual_output_get_capability;
- virtual_func_output.output_get_layers = virtual_output_get_layers;
virtual_func_output.output_wait_vblank = virtual_output_wait_vblank;
virtual_func_output.output_set_vblank_handler = virtual_output_set_vblank_handler;
- virtual_func_output.output_commit = virtual_output_commit;
- virtual_func_output.output_set_commit_handler = virtual_output_set_commit_handler;
virtual_func_output.output_set_dpms = virtual_output_set_dpms;
virtual_func_output.output_get_dpms = virtual_output_get_dpms;
virtual_func_output.output_set_mode = virtual_output_set_mode;
virtual_func_output.output_get_mode = virtual_output_get_mode;
virtual_func_output.output_set_status_handler = virtual_output_set_status_handler;
- if (virtual_data->hwc_mode) {
- virtual_func_output.output_get_hwc = virtual_output_get_hwc;
-
- memset(&virtual_func_hwc, 0, sizeof(virtual_func_hwc));
- virtual_func_hwc.hwc_create_window = virtual_hwc_create_window;
- virtual_func_hwc.hwc_get_video_supported_formats = virtual_hwc_get_video_supported_formats;
- virtual_func_hwc.hwc_get_video_available_properties = NULL;
- virtual_func_hwc.hwc_get_capabilities = virtual_hwc_get_capabilities;
- virtual_func_hwc.hwc_get_available_properties = virtual_hwc_get_available_properties;
- virtual_func_hwc.hwc_get_client_target_buffer_queue = virtual_hwc_get_client_target_buffer_queue;
- virtual_func_hwc.hwc_set_client_target_buffer = virtual_hwc_set_client_target_buffer;
- virtual_func_hwc.hwc_validate = virtual_hwc_validate;
- virtual_func_hwc.hwc_get_changed_composition_types = virtual_hwc_get_changed_composition_types;
- virtual_func_hwc.hwc_accept_validation = virtual_hwc_accept_validation;
- virtual_func_hwc.hwc_commit = virtual_hwc_commit;
- virtual_func_hwc.hwc_set_commit_handler = virtual_hwc_set_commit_handler;
-
- memset(&virtual_func_hwc_window, 0, sizeof(virtual_func_hwc_window));
- virtual_func_hwc_window.hwc_window_destroy = virtual_hwc_window_destroy;
- virtual_func_hwc_window.hwc_window_acquire_buffer_queue = NULL; // no need
- virtual_func_hwc_window.hwc_window_release_buffer_queue = NULL; // no need
- virtual_func_hwc_window.hwc_window_set_composition_type = virtual_hwc_window_set_composition_type;
- virtual_func_hwc_window.hwc_window_set_buffer_damage = virtual_hwc_window_set_buffer_damage;
- virtual_func_hwc_window.hwc_window_set_info = virtual_hwc_window_set_info;
- virtual_func_hwc_window.hwc_window_set_buffer = virtual_hwc_window_set_buffer;
- virtual_func_hwc_window.hwc_window_set_property = virtual_hwc_window_set_property;
- virtual_func_hwc_window.hwc_window_get_property = virtual_hwc_window_get_property;
- virtual_func_hwc_window.hwc_window_get_constraints = virtual_hwc_window_get_constraints;
- virtual_func_hwc_window.hwc_window_set_name = virtual_hwc_window_set_name;
- virtual_func_hwc_window.hwc_window_set_cursor_image = NULL; // no need
- }
+ virtual_func_output.output_get_hwc = virtual_output_get_hwc;
+
+ memset(&virtual_func_hwc, 0, sizeof(virtual_func_hwc));
+ virtual_func_hwc.hwc_create_window = virtual_hwc_create_window;
+ virtual_func_hwc.hwc_get_video_supported_formats = virtual_hwc_get_video_supported_formats;
+ virtual_func_hwc.hwc_get_video_available_properties = NULL;
+ virtual_func_hwc.hwc_get_capabilities = virtual_hwc_get_capabilities;
+ virtual_func_hwc.hwc_get_available_properties = virtual_hwc_get_available_properties;
+ virtual_func_hwc.hwc_get_client_target_buffer_queue = virtual_hwc_get_client_target_buffer_queue;
+ virtual_func_hwc.hwc_set_client_target_buffer = virtual_hwc_set_client_target_buffer;
+ virtual_func_hwc.hwc_validate = virtual_hwc_validate;
+ virtual_func_hwc.hwc_get_changed_composition_types = virtual_hwc_get_changed_composition_types;
+ virtual_func_hwc.hwc_accept_validation = virtual_hwc_accept_validation;
+ virtual_func_hwc.hwc_commit = virtual_hwc_commit;
+ virtual_func_hwc.hwc_set_commit_handler = virtual_hwc_set_commit_handler;
+
+ memset(&virtual_func_hwc_window, 0, sizeof(virtual_func_hwc_window));
+ virtual_func_hwc_window.hwc_window_destroy = virtual_hwc_window_destroy;
+ virtual_func_hwc_window.hwc_window_acquire_buffer_queue = NULL; // no need
+ virtual_func_hwc_window.hwc_window_release_buffer_queue = NULL; // no need
+ virtual_func_hwc_window.hwc_window_set_composition_type = virtual_hwc_window_set_composition_type;
+ virtual_func_hwc_window.hwc_window_set_buffer_damage = virtual_hwc_window_set_buffer_damage;
+ virtual_func_hwc_window.hwc_window_set_info = virtual_hwc_window_set_info;
+ virtual_func_hwc_window.hwc_window_set_buffer = virtual_hwc_window_set_buffer;
+ virtual_func_hwc_window.hwc_window_set_property = virtual_hwc_window_set_property;
+ virtual_func_hwc_window.hwc_window_get_property = virtual_hwc_window_get_property;
+ virtual_func_hwc_window.hwc_window_get_constraints = virtual_hwc_window_get_constraints;
+ virtual_func_hwc_window.hwc_window_set_name = virtual_hwc_window_set_name;
+ virtual_func_hwc_window.hwc_window_set_cursor_image = NULL; // no need
memset(&virtual_func_voutput, 0, sizeof(virtual_func_voutput));
virtual_func_voutput.voutput_destroy = virtual_voutput_destroy;
virtual_func_voutput.voutput_commit_done = virtual_voutput_commit_done;
virtual_func_voutput.voutput_set_target_buffer_queue_flag = virtual_voutput_set_target_buffer_queue_flag;
- memset(&virtual_func_layer, 0, sizeof(virtual_func_layer));
- virtual_func_layer.layer_get_capability = virtual_layer_get_capability;
- virtual_func_layer.layer_set_info = virtual_layer_set_info;
- virtual_func_layer.layer_get_info = virtual_layer_get_info;
- virtual_func_layer.layer_set_buffer = virtual_layer_set_buffer;
- virtual_func_layer.layer_unset_buffer = virtual_layer_unset_buffer;
-
ret = tdm_backend_register_func_display(dpy, &virtual_func_display);
if (ret != TDM_ERROR_NONE)
goto failed;
if (ret != TDM_ERROR_NONE)
goto failed;
- if (virtual_data->hwc_mode) {
- ret = tdm_backend_register_func_hwc(dpy, &virtual_func_hwc);
- if (ret != TDM_ERROR_NONE)
- goto failed;
-
- ret = tdm_backend_register_func_hwc_window(dpy, &virtual_func_hwc_window);
- if (ret != TDM_ERROR_NONE)
- goto failed;
- }
+ ret = tdm_backend_register_func_hwc(dpy, &virtual_func_hwc);
+ if (ret != TDM_ERROR_NONE)
+ goto failed;
- ret = tdm_backend_register_func_voutput(dpy, &virtual_func_voutput);
+ ret = tdm_backend_register_func_hwc_window(dpy, &virtual_func_hwc_window);
if (ret != TDM_ERROR_NONE)
goto failed;
- ret = tdm_backend_register_func_layer(dpy, &virtual_func_layer);
+ ret = tdm_backend_register_func_voutput(dpy, &virtual_func_voutput);
if (ret != TDM_ERROR_NONE)
goto failed;
tdm_voutput *virtual_display_voutput_create(tdm_backend_data *bdata, const char *name, tdm_error *error);
tdm_error virtual_output_get_capability(tdm_output *output, tdm_caps_output *caps);
-tdm_layer **virtual_output_get_layers(tdm_output *output, int *count, tdm_error *error);
tdm_error virtual_output_wait_vblank(tdm_output *output, int interval, int sync, void *user_data);
tdm_error virtual_output_set_vblank_handler(tdm_output *output, tdm_output_vblank_handler func);
tdm_error virtual_output_commit(tdm_output *output, int sync, void *user_data);
-tdm_error virtual_output_set_commit_handler(tdm_output *output, tdm_output_commit_handler func);
tdm_error virtual_output_set_dpms(tdm_output *output, tdm_output_dpms dpms_value);
tdm_error virtual_output_get_dpms(tdm_output *output, tdm_output_dpms *dpms_value);
tdm_error virtual_output_set_mode(tdm_output *output, const tdm_output_mode *mode);
tdm_error virtual_hwc_window_get_constraints(tdm_hwc_window *hwc_window, int *constraints);
tdm_error virtual_hwc_window_set_name(tdm_hwc_window *hwc_window, const char *name);
-tdm_error virtual_layer_get_capability(tdm_layer *layer, tdm_caps_layer *caps);
tdm_error virtual_layer_set_info(tdm_layer *layer, tdm_info_layer *info);
tdm_error virtual_layer_get_info(tdm_layer *layer, tdm_info_layer *info);
tdm_error virtual_layer_set_buffer(tdm_layer *layer, tbm_surface_h buffer);
/* not fixed data below */
tdm_output_vblank_handler vblank_func;
- tdm_output_commit_handler commit_func;
void *commit_user_data;
tdm_output_conn_status status;
unsigned int timer_waiting;
struct list_head timer_event_list;
- /* hwc data */
- int hwc_enable;
tdm_virtual_hwc_data *hwc_data;
};
unsigned int sequence, unsigned int tv_sec, unsigned int tv_usec)
{
tdm_virtual_voutput_data *voutput_data = NULL;
- tdm_virtual_hwc_data *hwc_data;
switch (event_data->type) {
case TDM_VIRTUAL_EVENT_TYPE_WAIT:
output_data->vblank_func(output_data, sequence, tv_sec, tv_usec, event_data->user_data);
break;
case TDM_VIRTUAL_EVENT_TYPE_COMMIT:
- if (output_data->hwc_enable) {
- hwc_data = output_data->hwc_data;
- if (!hwc_data) {
- TDM_ERR("no hwc_data");
- break;
- }
-
- if (hwc_data->commit_func)
- hwc_data->commit_func(hwc_data, sequence,
- tv_sec, tv_usec,
- event_data->user_data);
- } else
- if (output_data->commit_func)
- output_data->commit_func(output_data, sequence, tv_sec, tv_usec, event_data->user_data);
+ if (output_data->hwc_data->commit_func)
+ output_data->hwc_data->commit_func(output_data->hwc_data, sequence,
+ tv_sec, tv_usec,
+ event_data->user_data);
break;
case TDM_VIRTUAL_EVENT_TYPE_VCOMMIT:
voutput_data = output_data->voutput_data;
return ret;
}
-tdm_layer **
-virtual_output_get_layers(tdm_output *output, int *count, tdm_error *error)
-{
- tdm_virtual_output_data *output_data = output;
- tdm_virtual_layer_data *layer_data = NULL;
- tdm_layer **layers;
- tdm_error ret;
- int i;
-
- RETURN_VAL_IF_FAIL(output_data, NULL);
- RETURN_VAL_IF_FAIL(count, NULL);
-
- if (output_data->virtual_data->hwc_mode) {
- TDM_INFO("layers aren't supported in HWC mode");
- *count = 0;
- ret = TDM_ERROR_NONE;
- goto failed_get;
- }
-
- *count = 0;
- LIST_FOR_EACH_ENTRY(layer_data, &output_data->layer_list, link)
- (*count)++;
-
- if (*count == 0) {
- ret = TDM_ERROR_NONE;
- goto failed_get;
- }
-
- /* will be freed in frontend */
- layers = calloc(*count, sizeof(tdm_virtual_layer_data *));
- if (!layers) {
- TDM_ERR("failed: alloc memory");
- *count = 0;
- ret = TDM_ERROR_OUT_OF_MEMORY;
- goto failed_get;
- }
-
- i = 0;
- LIST_FOR_EACH_ENTRY(layer_data, &output_data->layer_list, link)
- layers[i++] = layer_data;
-
- if (error)
- *error = TDM_ERROR_NONE;
-
- return layers;
-failed_get:
- if (error)
- *error = ret;
- return NULL;
-}
-
tdm_error
virtual_output_wait_vblank(tdm_output *output, int interval, int sync, void *user_data)
{
return TDM_ERROR_NONE;
}
-tdm_error
-virtual_output_set_commit_handler(tdm_output *output, tdm_output_commit_handler func)
-{
- tdm_virtual_output_data *output_data = output;
-
- RETURN_VAL_IF_FAIL(output_data, TDM_ERROR_INVALID_PARAMETER);
- RETURN_VAL_IF_FAIL(func, TDM_ERROR_INVALID_PARAMETER);
-
- output_data->commit_func = func;
-
- return TDM_ERROR_NONE;
-}
-
tdm_error
virtual_output_set_dpms(tdm_output *output, tdm_output_dpms dpms_value)
{
return TDM_ERROR_NONE;
}
-tdm_error
-virtual_layer_get_capability(tdm_layer *layer, tdm_caps_layer *caps)
-{
- tdm_virtual_layer_data *layer_data = layer;
-
- 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));
-
- caps->capabilities = layer_data->capabilities;
- caps->zpos = layer_data->zpos;
-
- caps->format_count = 2;
- caps->formats = calloc(caps->format_count, sizeof(tbm_format));
- if (!caps->formats) {
- TDM_ERR("alloc failed\n");
- free(caps->formats);
- memset(caps, 0, sizeof(tdm_caps_layer));
- return TDM_ERROR_OUT_OF_MEMORY;
- }
-
- caps->formats[0] = TBM_FORMAT_ARGB8888;
- caps->formats[1] = TBM_FORMAT_XRGB8888;
-
- caps->prop_count = 0;
-
- return TDM_ERROR_NONE;
-}
-
tdm_error
virtual_layer_set_info(tdm_layer *layer, tdm_info_layer *info)
{
TDM_DBG("virtual output create(%s)(%p)(%p)", output_data->name, voutput_data, output_data);
- if (output_data->virtual_data->hwc_mode)
- output_data->hwc_enable = 1;
-
return voutput_data;
create_fail: