tdm_virtual_data *virtual_data;
uint32_t pipe;
- tdm_output_mode *output_mode;
+ tdm_output_mode *output_modes;
int mode_count;
tdm_output_type connector_type;
struct list_head layer_list;
unsigned int ms;
RETURN_VAL_IF_FAIL(output_data->timer != NULL, TDM_ERROR_OPERATION_FAILED);
- RETURN_VAL_IF_FAIL(output_data->output_mode->vrefresh > 0, TDM_ERROR_OPERATION_FAILED);
+ RETURN_VAL_IF_FAIL(output_data->current_mode->vrefresh > 0, TDM_ERROR_OPERATION_FAILED);
if (output_data->timer_waiting) {
LIST_ADDTAIL(&event_data->link, &output_data->timer_event_list);
return TDM_ERROR_NONE;
}
- ms = ((double)1000.0 / output_data->output_mode->vrefresh) * interval;
+ ms = ((double)1000.0 / output_data->current_mode->vrefresh) * interval;
ret = tdm_event_loop_source_timer_update(output_data->timer, ms);
if (ret != TDM_ERROR_NONE)
if (o->timer)
tdm_event_loop_source_remove(o->timer);
- free(o->output_mode);
+ free(o->output_modes);
free(o);
}
}
output_data->connector_type = TDM_OUTPUT_TYPE_Unknown;
output_data->status = TDM_OUTPUT_CONN_STATUS_DISCONNECTED;
- output_data->output_mode = calloc(1, sizeof(tdm_output_mode));
- if (!output_data->output_mode) {
+ output_data->output_modes = calloc(1, sizeof(tdm_output_mode));
+ if (!output_data->output_modes) {
TDM_ERR("alloc failed");
free(output_data);
ret = TDM_ERROR_OUT_OF_MEMORY;
goto failed_create;
}
- snprintf(output_data->output_mode->name, TDM_NAME_LEN, "640x480");
- output_data->output_mode->vrefresh = 30;
- output_data->output_mode->clock = 25200;
- output_data->output_mode->hdisplay = 640;
- output_data->output_mode->hsync_start = 656;
- output_data->output_mode->hsync_end = 752;
- output_data->output_mode->htotal = 800;
- output_data->output_mode->hskew = 0;
- output_data->output_mode->vdisplay = 480;
- output_data->output_mode->vsync_start = 490;
- output_data->output_mode->vsync_end = 492;
- output_data->output_mode->vtotal = 525;
- output_data->output_mode->vscan = 0;
- output_data->output_mode->flags = 0;
- output_data->output_mode->type = 0;
+ snprintf(output_data->output_modes->name, TDM_NAME_LEN, "640x480");
+ output_data->output_modes->vrefresh = 30;
+ output_data->output_modes->clock = 25200;
+ output_data->output_modes->hdisplay = 640;
+ output_data->output_modes->hsync_start = 656;
+ output_data->output_modes->hsync_end = 752;
+ output_data->output_modes->htotal = 800;
+ output_data->output_modes->hskew = 0;
+ output_data->output_modes->vdisplay = 480;
+ output_data->output_modes->vsync_start = 490;
+ output_data->output_modes->vsync_end = 492;
+ output_data->output_modes->vtotal = 525;
+ output_data->output_modes->vscan = 0;
+ output_data->output_modes->flags = 0;
+ output_data->output_modes->type = 0;
output_data->timer = tdm_event_loop_add_timer_handler(virtual_data->dpy,
_tdm_virtual_display_cb_timeout,
else
snprintf(output_data->name, TDM_NAME_LEN, "unknown");
#if 0
- output_data->output_mode = calloc(1, sizeof(tdm_output_mode));
- if (!output_data->output_mode) {
+ output_data->output_modes = calloc(1, sizeof(tdm_output_mode));
+ if (!output_data->output_modes) {
TDM_ERR("alloc failed");
ret = TDM_ERROR_OUT_OF_MEMORY;
goto create_fail;
}
- snprintf(output_data->output_mode->name, TDM_NAME_LEN, "640x480");
- output_data->output_mode->vrefresh = 30;
- output_data->output_mode->clock = 25200;
- output_data->output_mode->hdisplay = 640;
- output_data->output_mode->hsync_start = 656;
- output_data->output_mode->hsync_end = 752;
- output_data->output_mode->htotal = 800;
- output_data->output_mode->hskew = 0;
- output_data->output_mode->vdisplay = 480;
- output_data->output_mode->vsync_start = 490;
- output_data->output_mode->vsync_end = 492;
- output_data->output_mode->vtotal = 525;
- output_data->output_mode->vscan = 0;
- output_data->output_mode->flags = 0;
- output_data->output_mode->type = 0;
+ snprintf(output_data->output_modes->name, TDM_NAME_LEN, "640x480");
+ output_data->output_modes->vrefresh = 30;
+ output_data->output_modes->clock = 25200;
+ output_data->output_modes->hdisplay = 640;
+ output_data->output_modes->hsync_start = 656;
+ output_data->output_modes->hsync_end = 752;
+ output_data->output_modes->htotal = 800;
+ output_data->output_modes->hskew = 0;
+ output_data->output_modes->vdisplay = 480;
+ output_data->output_modes->vsync_start = 490;
+ output_data->output_modes->vsync_end = 492;
+ output_data->output_modes->vtotal = 525;
+ output_data->output_modes->vscan = 0;
+ output_data->output_modes->flags = 0;
+ output_data->output_modes->type = 0;
output_data->mode_count = 1;
#endif
create_fail:
if (layer_data) free(layer_data);
- if (output_data->output_mode) free(output_data->output_mode);
+ if (output_data->output_modes) free(output_data->output_modes);
free(output_data);
*error = ret;
}
}
- if (find)
+ if (find) {
+ if (output_data->output_modes)
+ free(output_data->output_modes);
tdm_backend_unregister_output(virtual_data->dpy, output);
+ }
else
return TDM_ERROR_INVALID_PARAMETER;
goto failed_get;
}
- *caps->modes = *output_data->output_mode;
+ *caps->modes = *output_data->output_modes;
}
caps->mmWidth = output_data->mmwidth;
}
tdm_error
+virtual_output_set_available_mode(tdm_output *output, const tdm_output_mode *modes, int count)
+{
+ tdm_virtual_output_data *output_data = output;
+
+ RETURN_VAL_IF_FAIL(output_data, TDM_ERROR_INVALID_PARAMETER);
+ RETURN_VAL_IF_FAIL(modes, TDM_ERROR_INVALID_PARAMETER);
+ RETURN_VAL_IF_FAIL(count > 0, TDM_ERROR_INVALID_PARAMETER);
+
+ /* set available mode only permittied disconnect status */
+ RETURN_VAL_IF_FAIL(output_data->status == TDM_OUTPUT_CONN_STATUS_DISCONNECTED, TDM_ERROR_BUSY);
+
+ if (output_data->output_modes)
+ free(output_data->output_modes);
+ output_data->output_modes = NULL;
+
+ output_data->output_modes = calloc(1, count * sizeof(tdm_output_mode));
+ RETURN_VAL_IF_FAIL(output_data->output_modes != NULL, TDM_ERROR_OUT_OF_MEMORY);
+
+ memcpy(output_data->output_modes, modes, count * sizeof(tdm_output_mode));
+ output_data->mode_count = count;
+
+ return TDM_ERROR_NONE;
+}
+
+tdm_error
+virtual_output_set_physical_size(tdm_output *output, unsigned int mmwidth, unsigned int mmheight)
+{
+ tdm_virtual_output_data *output_data = output;
+
+ RETURN_VAL_IF_FAIL(output_data, TDM_ERROR_INVALID_PARAMETER);
+ RETURN_VAL_IF_FAIL(mmwidth != 0, TDM_ERROR_INVALID_PARAMETER);
+ RETURN_VAL_IF_FAIL(mmheight != 0, TDM_ERROR_INVALID_PARAMETER);
+
+ output_data->mmwidth = mmwidth;
+ output_data->mmheight = mmheight;
+
+ return TDM_ERROR_NONE;
+}
+
+tdm_error
virtual_layer_get_capability(tdm_layer *layer, tdm_caps_layer *caps)
{
tdm_virtual_layer_data *layer_data = layer;
{
tdm_private_module *private_module = NULL;
tdm_private_module *current_module = NULL;
+ tdm_private_output *private_output = NULL;
tdm_func_display *func_display = NULL;
tdm_output *output = NULL;
+ int output_find = 0;
DISPLAY_FUNC_ENTRY_ERROR();
current_module = private_display->current_module;
private_display->current_module = private_module;
output = func_display->display_output_create(private_module->bdata, name, &ret);
+ LIST_FOR_EACH_ENTRY(private_output, &private_module->output_list, link) {
+ if (private_output->output_backend == output) {
+ output_find = 1;
+ break;
+ }
+ }
private_display->current_module = current_module;
_pthread_mutex_unlock(&private_display->lock);
TDM_RETURN_VAL_IF_FAIL_WITH_ERROR(output != NULL, ret, NULL);
+ if (output_find != 1)
+ private_output = NULL;
- return output;
+ return private_output;
}
INTERN tdm_error
{
tdm_private_module *private_module = NULL;
tdm_private_module *current_module = NULL;
+ tdm_private_output *private_output = NULL;
tdm_func_display *func_display = NULL;
DISPLAY_FUNC_ENTRY();
private_module = private_display->virtual_module;
TDM_RETURN_VAL_IF_FAIL(private_module != NULL, TDM_ERROR_BAD_MODULE);
+ private_output = (tdm_private_output*)output;
+
_pthread_mutex_lock(&private_display->lock);
func_display = &private_module->func_display;
current_module = private_display->current_module;
private_display->current_module = private_module;
- ret = func_display->display_output_destroy(private_module->bdata, output);
+ ret = func_display->display_output_destroy(private_module->bdata, private_output->output_backend);
private_display->current_module = current_module;
_pthread_mutex_unlock(&private_display->lock);
return TDM_ERROR_NONE;
}
+
+INTERN tdm_error
+tdm_output_set_available_mode(tdm_output *output, const tdm_output_mode *modes, int count)
+{
+ tdm_private_module *private_module = NULL;
+ tdm_func_output *func_output = NULL;
+
+ OUTPUT_FUNC_ENTRY();
+
+ TDM_RETURN_VAL_IF_FAIL(modes != NULL, TDM_ERROR_INVALID_PARAMETER);
+ TDM_RETURN_VAL_IF_FAIL(count != 0, TDM_ERROR_INVALID_PARAMETER);
+
+ private_module = private_output->private_module;
+ TDM_RETURN_VAL_IF_FAIL(private_module == private_display->virtual_module, TDM_ERROR_BAD_MODULE);
+
+ _pthread_mutex_lock(&private_display->lock);
+
+ func_output = &private_module->func_output;
+ ret = func_output->output_set_available_mode(private_output->output_backend, modes, count);
+
+ _pthread_mutex_unlock(&private_display->lock);
+
+ return ret;
+}
+
+INTERN tdm_error
+tdm_output_set_physical_size(tdm_output *output, unsigned int mmwidth, unsigned int mmheight)
+{
+ tdm_private_module *private_module = NULL;
+ tdm_func_output *func_output = NULL;
+
+ OUTPUT_FUNC_ENTRY();
+
+ TDM_RETURN_VAL_IF_FAIL(mmwidth != 0, TDM_ERROR_INVALID_PARAMETER);
+ TDM_RETURN_VAL_IF_FAIL(mmheight != 0, TDM_ERROR_INVALID_PARAMETER);
+
+ private_module = private_output->private_module;
+ TDM_RETURN_VAL_IF_FAIL(private_module == private_display->virtual_module, TDM_ERROR_BAD_MODULE);
+
+ _pthread_mutex_lock(&private_display->lock);
+
+ func_output = &private_module->func_output;
+ ret = func_output->output_set_physical_size(private_output->output_backend, mmwidth, mmheight);
+
+ _pthread_mutex_unlock(&private_display->lock);
+
+ return ret;
+}
/* LCOV_EXCL_STOP */