From e7e207658c6adb3dfd98038c248efde70fd43056 Mon Sep 17 00:00:00 2001 From: Kusanagi Kouichi Date: Fri, 7 Mar 2014 11:07:48 +0900 Subject: vl: Add rotation v3 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit v2: rotate in gen_rect_verts instead v3: clear rotate in vl_compositor_clear_layers, update calc_drawn_area as well Signed-off-by: Kusanagi Kouichi Signed-off-by: Christian König --- src/gallium/auxiliary/vl/vl_compositor.c | 101 +++++++++++++++++++++++++++---- src/gallium/auxiliary/vl/vl_compositor.h | 18 ++++++ 2 files changed, 107 insertions(+), 12 deletions(-) (limited to 'src/gallium/auxiliary') diff --git a/src/gallium/auxiliary/vl/vl_compositor.c b/src/gallium/auxiliary/vl/vl_compositor.c index 3cea0447f10..839fd27ae9c 100644 --- a/src/gallium/auxiliary/vl/vl_compositor.c +++ b/src/gallium/auxiliary/vl/vl_compositor.c @@ -577,10 +577,48 @@ calc_src_and_dst(struct vl_compositor_layer *layer, unsigned width, unsigned hei static void gen_rect_verts(struct vertex2f *vb, struct vl_compositor_layer *layer) { + struct vertex2f tl, tr, br, bl; + assert(vb && layer); - vb[ 0].x = layer->dst.tl.x; - vb[ 0].y = layer->dst.tl.y; + switch (layer->rotate) { + default: + case VL_COMPOSITOR_ROTATE_0: + tl = layer->dst.tl; + tr.x = layer->dst.br.x; + tr.y = layer->dst.tl.y; + br = layer->dst.br; + bl.x = layer->dst.tl.x; + bl.y = layer->dst.br.y; + break; + case VL_COMPOSITOR_ROTATE_90: + tl.x = layer->dst.br.x; + tl.y = layer->dst.tl.y; + tr = layer->dst.br; + br.x = layer->dst.tl.x; + br.y = layer->dst.br.y; + bl = layer->dst.tl; + break; + case VL_COMPOSITOR_ROTATE_180: + tl = layer->dst.br; + tr.x = layer->dst.tl.x; + tr.y = layer->dst.br.y; + br = layer->dst.tl; + bl.x = layer->dst.br.x; + bl.y = layer->dst.tl.y; + break; + case VL_COMPOSITOR_ROTATE_270: + tl.x = layer->dst.tl.x; + tl.y = layer->dst.br.y; + tr = layer->dst.tl; + br.x = layer->dst.br.x; + br.y = layer->dst.tl.y; + bl = layer->dst.br; + break; + } + + vb[ 0].x = tl.x; + vb[ 0].y = tl.y; vb[ 1].x = layer->src.tl.x; vb[ 1].y = layer->src.tl.y; vb[ 2] = layer->zw; @@ -589,8 +627,8 @@ gen_rect_verts(struct vertex2f *vb, struct vl_compositor_layer *layer) vb[ 4].x = layer->colors[0].z; vb[ 4].y = layer->colors[0].w; - vb[ 5].x = layer->dst.br.x; - vb[ 5].y = layer->dst.tl.y; + vb[ 5].x = tr.x; + vb[ 5].y = tr.y; vb[ 6].x = layer->src.br.x; vb[ 6].y = layer->src.tl.y; vb[ 7] = layer->zw; @@ -599,8 +637,8 @@ gen_rect_verts(struct vertex2f *vb, struct vl_compositor_layer *layer) vb[ 9].x = layer->colors[1].z; vb[ 9].y = layer->colors[1].w; - vb[10].x = layer->dst.br.x; - vb[10].y = layer->dst.br.y; + vb[10].x = br.x; + vb[10].y = br.y; vb[11].x = layer->src.br.x; vb[11].y = layer->src.br.y; vb[12] = layer->zw; @@ -609,8 +647,8 @@ gen_rect_verts(struct vertex2f *vb, struct vl_compositor_layer *layer) vb[14].x = layer->colors[2].z; vb[14].y = layer->colors[2].w; - vb[15].x = layer->dst.tl.x; - vb[15].y = layer->dst.br.y; + vb[15].x = bl.x; + vb[15].y = bl.y; vb[16].x = layer->src.tl.x; vb[16].y = layer->src.br.y; vb[17] = layer->zw; @@ -623,13 +661,41 @@ gen_rect_verts(struct vertex2f *vb, struct vl_compositor_layer *layer) static INLINE struct u_rect calc_drawn_area(struct vl_compositor_state *s, struct vl_compositor_layer *layer) { + struct vertex2f tl, br; struct u_rect result; + assert(s && layer); + + // rotate + switch (layer->rotate) { + default: + case VL_COMPOSITOR_ROTATE_0: + tl = layer->dst.tl; + br = layer->dst.br; + break; + case VL_COMPOSITOR_ROTATE_90: + tl.x = layer->dst.br.x; + tl.y = layer->dst.tl.y; + br.x = layer->dst.tl.x; + br.y = layer->dst.br.y; + break; + case VL_COMPOSITOR_ROTATE_180: + tl = layer->dst.br; + br = layer->dst.tl; + break; + case VL_COMPOSITOR_ROTATE_270: + tl.x = layer->dst.tl.x; + tl.y = layer->dst.br.y; + br.x = layer->dst.br.x; + br.y = layer->dst.tl.y; + break; + } + // scale - result.x0 = layer->dst.tl.x * layer->viewport.scale[0] + layer->viewport.translate[0]; - result.y0 = layer->dst.tl.y * layer->viewport.scale[1] + layer->viewport.translate[1]; - result.x1 = layer->dst.br.x * layer->viewport.scale[0] + layer->viewport.translate[0]; - result.y1 = layer->dst.br.y * layer->viewport.scale[1] + layer->viewport.translate[1]; + result.x0 = tl.x * layer->viewport.scale[0] + layer->viewport.translate[0]; + result.y0 = tl.y * layer->viewport.scale[1] + layer->viewport.translate[1]; + result.x1 = br.x * layer->viewport.scale[0] + layer->viewport.translate[0]; + result.y1 = br.y * layer->viewport.scale[1] + layer->viewport.translate[1]; // and clip result.x0 = MAX2(result.x0, s->scissor.minx); @@ -766,6 +832,7 @@ vl_compositor_clear_layers(struct vl_compositor_state *s) s->layers[i].viewport.scale[3] = 1; s->layers[i].viewport.translate[2] = 0; s->layers[i].viewport.translate[3] = 0; + s->layers[i].rotate = VL_COMPOSITOR_ROTATE_0; for ( j = 0; j < 3; j++) pipe_sampler_view_reference(&s->layers[i].sampler_views[j], NULL); @@ -963,6 +1030,16 @@ vl_compositor_set_rgba_layer(struct vl_compositor_state *s, s->layers[layer].colors[i] = colors[i]; } +void +vl_compositor_set_layer_rotation(struct vl_compositor_state *s, + unsigned layer, + enum vl_compositor_rotation rotate) +{ + assert(s); + assert(layer < VL_COMPOSITOR_MAX_LAYERS); + s->layers[layer].rotate = rotate; +} + void vl_compositor_render(struct vl_compositor_state *s, struct vl_compositor *c, diff --git a/src/gallium/auxiliary/vl/vl_compositor.h b/src/gallium/auxiliary/vl/vl_compositor.h index 97cbef03fa0..934b634b390 100644 --- a/src/gallium/auxiliary/vl/vl_compositor.h +++ b/src/gallium/auxiliary/vl/vl_compositor.h @@ -53,6 +53,15 @@ enum vl_compositor_deinterlace VL_COMPOSITOR_BOB_BOTTOM }; +/* clockwise degree */ +enum vl_compositor_rotation +{ + VL_COMPOSITOR_ROTATE_0, + VL_COMPOSITOR_ROTATE_90, + VL_COMPOSITOR_ROTATE_180, + VL_COMPOSITOR_ROTATE_270 +}; + struct vl_compositor_layer { bool clearing; @@ -70,6 +79,7 @@ struct vl_compositor_layer } src, dst; struct vertex2f zw; struct vertex4f colors[4]; + enum vl_compositor_rotation rotate; }; struct vl_compositor_state @@ -216,6 +226,14 @@ vl_compositor_set_rgba_layer(struct vl_compositor_state *state, struct u_rect *dst_rect, struct vertex4f *colors); +/** + * set the layer rotation + */ +void +vl_compositor_set_layer_rotation(struct vl_compositor_state *state, + unsigned layer, + enum vl_compositor_rotation rotate); + /*@}*/ /** -- cgit v1.2.3