ply_renderer_head_t *head);
static bool open_input_source (ply_renderer_backend_t *backend,
ply_renderer_input_source_t *input_source);
+static bool reset_scan_out_buffer_if_needed (ply_renderer_backend_t *backend,
+ ply_renderer_head_t *head);
static bool
ply_renderer_head_add_connector (ply_renderer_head_t *head,
mode = &head->connector0->modes[head->connector0_mode_index];
+ ply_trace ("Setting scan out buffer of %ldx%ld head to our buffer",
+ head->area.width, head->area.height);
+
/* Tell the controller to use the allocated scan out buffer on each connectors
*/
if (drmModeSetCrtc (backend->device_fd, head->controller_id, buffer_id,
ply_renderer_head_map (ply_renderer_backend_t *backend,
ply_renderer_head_t *head)
{
+ bool scan_out_set;
+
assert (backend != NULL);
assert (backend->device_fd >= 0);
assert (backend->driver_interface != NULL);
*/
ply_renderer_head_redraw (backend, head);
- ply_trace ("Setting scan out buffer of %ldx%ld head to our buffer",
- head->area.width, head->area.height);
- if (!ply_renderer_head_set_scan_out_buffer (backend, head,
- head->scan_out_buffer_id))
+ scan_out_set = reset_scan_out_buffer_if_needed (backend, head);
+ if (!scan_out_set && backend->is_active)
{
backend->driver_interface->destroy_buffer (backend->driver,
head->scan_out_buffer_id);
}
}
-static void
+static bool
reset_scan_out_buffer_if_needed (ply_renderer_backend_t *backend,
ply_renderer_head_t *head)
{
drmModeCrtc *controller;
+ bool did_reset = false;
if (!ply_terminal_is_active (backend->terminal))
- return;
+ return false;
controller = drmModeGetCrtc (backend->device_fd, head->controller_id);
if (controller == NULL)
- return;
+ return false;
if (controller->buffer_id != head->scan_out_buffer_id)
{
- ply_trace ("Something stole the monitor");
ply_renderer_head_set_scan_out_buffer (backend, head,
head->scan_out_buffer_id);
+ did_reset = true;
}
drmModeFreeCrtc (controller);
+
+ return did_reset;
}
static void
next_node = ply_list_get_next_node (areas_to_flush, node);
- reset_scan_out_buffer_if_needed (backend, head);
+ if (reset_scan_out_buffer_if_needed (backend, head))
+ ply_trace ("Needed to reset scan out buffer on %ldx%ld renderer head",
+ head->area.width, head->area.height);
+
ply_renderer_head_flush_area (head, area_to_flush, map_address);
node = next_node;