rpi-renderer: use weston_output matrix instead of a private matrix
We already do this math in compositor.c so let's not duplicate it here. Additionally, the copy here has broken zoom, so this also fixes zooming. Signed-off-by: Derek Foreman <derekf@osg.samsung.com> Acked-by: Daniel Stone <daniels@collabora.com>
This commit is contained in:
committed by
Daniel Stone
parent
f9318d1452
commit
75ead05dd2
+3
-65
@@ -153,7 +153,6 @@ struct rpir_output {
|
|||||||
DISPMANX_DISPLAY_HANDLE_T display;
|
DISPMANX_DISPLAY_HANDLE_T display;
|
||||||
|
|
||||||
DISPMANX_UPDATE_HANDLE_T update;
|
DISPMANX_UPDATE_HANDLE_T update;
|
||||||
struct weston_matrix matrix;
|
|
||||||
|
|
||||||
/* all Elements currently on screen */
|
/* all Elements currently on screen */
|
||||||
struct wl_list view_list; /* struct rpir_surface::link */
|
struct wl_list view_list; /* struct rpir_surface::link */
|
||||||
@@ -678,7 +677,6 @@ rpir_view_compute_rects(struct rpir_view *view,
|
|||||||
VC_IMAGE_TRANSFORM_T *flipmask)
|
VC_IMAGE_TRANSFORM_T *flipmask)
|
||||||
{
|
{
|
||||||
struct weston_output *output_base = view->view->surface->output;
|
struct weston_output *output_base = view->view->surface->output;
|
||||||
struct rpir_output *output = to_rpir_output(output_base);
|
|
||||||
struct weston_matrix matrix = view->view->transform.matrix;
|
struct weston_matrix matrix = view->view->transform.matrix;
|
||||||
VC_IMAGE_TRANSFORM_T flipt = 0;
|
VC_IMAGE_TRANSFORM_T flipt = 0;
|
||||||
int src_x, src_y;
|
int src_x, src_y;
|
||||||
@@ -712,14 +710,14 @@ rpir_view_compute_rects(struct rpir_view *view,
|
|||||||
src_height = view->surface->front->height << 16;
|
src_height = view->surface->front->height << 16;
|
||||||
}
|
}
|
||||||
|
|
||||||
weston_matrix_multiply(&matrix, &output->matrix);
|
weston_matrix_multiply(&matrix, &output_base->matrix);
|
||||||
|
|
||||||
#ifdef SURFACE_TRANSFORM
|
#ifdef SURFACE_TRANSFORM
|
||||||
if (matrix.type >= WESTON_MATRIX_TRANSFORM_OTHER) {
|
if (matrix.type >= WESTON_MATRIX_TRANSFORM_OTHER) {
|
||||||
#else
|
#else
|
||||||
if (matrix.type >= WESTON_MATRIX_TRANSFORM_ROTATE) {
|
if (matrix.type >= WESTON_MATRIX_TRANSFORM_ROTATE) {
|
||||||
#endif
|
#endif
|
||||||
warn_bad_matrix(&matrix, &output->matrix,
|
warn_bad_matrix(&matrix, &output_base->matrix,
|
||||||
&view->view->transform.matrix);
|
&view->view->transform.matrix);
|
||||||
} else {
|
} else {
|
||||||
if (matrix.type & WESTON_MATRIX_TRANSFORM_ROTATE) {
|
if (matrix.type & WESTON_MATRIX_TRANSFORM_ROTATE) {
|
||||||
@@ -730,7 +728,7 @@ rpir_view_compute_rects(struct rpir_view *view,
|
|||||||
fabsf(matrix.d[4]) < 1e-4) {
|
fabsf(matrix.d[4]) < 1e-4) {
|
||||||
/* no transpose */
|
/* no transpose */
|
||||||
} else {
|
} else {
|
||||||
warn_bad_matrix(&matrix, &output->matrix,
|
warn_bad_matrix(&matrix, &output_base->matrix,
|
||||||
&view->view->transform.matrix);
|
&view->view->transform.matrix);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1324,64 +1322,6 @@ rpir_output_dmx_remove_all(struct rpir_output *output,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
|
||||||
output_compute_matrix(struct weston_output *base)
|
|
||||||
{
|
|
||||||
struct rpir_output *output = to_rpir_output(base);
|
|
||||||
struct weston_matrix *matrix = &output->matrix;
|
|
||||||
#ifdef SURFACE_TRANSFORM
|
|
||||||
const float half_w = 0.5f * base->width;
|
|
||||||
const float half_h = 0.5f * base->height;
|
|
||||||
#endif
|
|
||||||
float mag;
|
|
||||||
|
|
||||||
weston_matrix_init(matrix);
|
|
||||||
weston_matrix_translate(matrix, -base->x, -base->y, 0.0f);
|
|
||||||
|
|
||||||
#ifdef SURFACE_TRANSFORM
|
|
||||||
weston_matrix_translate(matrix, -half_w, -half_h, 0.0f);
|
|
||||||
switch (base->transform) {
|
|
||||||
case WL_OUTPUT_TRANSFORM_FLIPPED:
|
|
||||||
weston_matrix_scale(matrix, -1.0f, 1.0f, 1.0f);
|
|
||||||
case WL_OUTPUT_TRANSFORM_NORMAL:
|
|
||||||
/* weston_matrix_rotate_xy(matrix, 1.0f, 0.0f); no-op */
|
|
||||||
weston_matrix_translate(matrix, half_w, half_h, 0.0f);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case WL_OUTPUT_TRANSFORM_FLIPPED_90:
|
|
||||||
weston_matrix_scale(matrix, -1.0f, 1.0f, 1.0f);
|
|
||||||
case WL_OUTPUT_TRANSFORM_90:
|
|
||||||
weston_matrix_rotate_xy(matrix, 0.0f, 1.0f);
|
|
||||||
weston_matrix_translate(matrix, half_h, half_w, 0.0f);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case WL_OUTPUT_TRANSFORM_FLIPPED_180:
|
|
||||||
weston_matrix_scale(matrix, -1.0f, 1.0f, 1.0f);
|
|
||||||
case WL_OUTPUT_TRANSFORM_180:
|
|
||||||
weston_matrix_rotate_xy(matrix, -1.0f, 0.0f);
|
|
||||||
weston_matrix_translate(matrix, half_w, half_h, 0.0f);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case WL_OUTPUT_TRANSFORM_FLIPPED_270:
|
|
||||||
weston_matrix_scale(matrix, -1.0f, 1.0f, 1.0f);
|
|
||||||
case WL_OUTPUT_TRANSFORM_270:
|
|
||||||
weston_matrix_rotate_xy(matrix, 0.0f, -1.0f);
|
|
||||||
weston_matrix_translate(matrix, half_h, half_w, 0.0f);
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (base->zoom.active) {
|
|
||||||
mag = 1.0f / (1.0f - base->zoom.spring_z.current);
|
|
||||||
weston_matrix_translate(matrix, base->zoom.trans_x,
|
|
||||||
base->zoom.trans_y, 0.0f);
|
|
||||||
weston_matrix_scale(matrix, mag, mag, 1.0f);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Note: this won't work right for multiple outputs. A DispmanX Element
|
/* Note: this won't work right for multiple outputs. A DispmanX Element
|
||||||
* is tied to one DispmanX Display, i.e. output.
|
* is tied to one DispmanX Display, i.e. output.
|
||||||
*/
|
*/
|
||||||
@@ -1398,8 +1338,6 @@ rpi_renderer_repaint_output(struct weston_output *base,
|
|||||||
|
|
||||||
assert(output->update != DISPMANX_NO_HANDLE);
|
assert(output->update != DISPMANX_NO_HANDLE);
|
||||||
|
|
||||||
output_compute_matrix(base);
|
|
||||||
|
|
||||||
rpi_resource_release(&output->capture_buffer);
|
rpi_resource_release(&output->capture_buffer);
|
||||||
free(output->capture_data);
|
free(output->capture_data);
|
||||||
output->capture_data = NULL;
|
output->capture_data = NULL;
|
||||||
|
|||||||
Reference in New Issue
Block a user