1fcb595c04f9ee275eae49b7bb7c61246671f5ce2Younes Manton/**************************************************************************
25f730690f8166c94ee010605b6437a6fb2a7771dYounes Manton *
3fcb595c04f9ee275eae49b7bb7c61246671f5ce2Younes Manton * Copyright 2009 Younes Manton.
4fcb595c04f9ee275eae49b7bb7c61246671f5ce2Younes Manton * All Rights Reserved.
55f730690f8166c94ee010605b6437a6fb2a7771dYounes Manton *
6fcb595c04f9ee275eae49b7bb7c61246671f5ce2Younes Manton * Permission is hereby granted, free of charge, to any person obtaining a
7fcb595c04f9ee275eae49b7bb7c61246671f5ce2Younes Manton * copy of this software and associated documentation files (the
8fcb595c04f9ee275eae49b7bb7c61246671f5ce2Younes Manton * "Software"), to deal in the Software without restriction, including
9fcb595c04f9ee275eae49b7bb7c61246671f5ce2Younes Manton * without limitation the rights to use, copy, modify, merge, publish,
10fcb595c04f9ee275eae49b7bb7c61246671f5ce2Younes Manton * distribute, sub license, and/or sell copies of the Software, and to
11fcb595c04f9ee275eae49b7bb7c61246671f5ce2Younes Manton * permit persons to whom the Software is furnished to do so, subject to
12fcb595c04f9ee275eae49b7bb7c61246671f5ce2Younes Manton * the following conditions:
135f730690f8166c94ee010605b6437a6fb2a7771dYounes Manton *
14fcb595c04f9ee275eae49b7bb7c61246671f5ce2Younes Manton * The above copyright notice and this permission notice (including the
15fcb595c04f9ee275eae49b7bb7c61246671f5ce2Younes Manton * next paragraph) shall be included in all copies or substantial portions
16fcb595c04f9ee275eae49b7bb7c61246671f5ce2Younes Manton * of the Software.
175f730690f8166c94ee010605b6437a6fb2a7771dYounes Manton *
18fcb595c04f9ee275eae49b7bb7c61246671f5ce2Younes Manton * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19fcb595c04f9ee275eae49b7bb7c61246671f5ce2Younes Manton * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20fcb595c04f9ee275eae49b7bb7c61246671f5ce2Younes Manton * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
21877128505431adaf817dc8069172ebe4a1cdf5d8José Fonseca * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
22fcb595c04f9ee275eae49b7bb7c61246671f5ce2Younes Manton * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
23fcb595c04f9ee275eae49b7bb7c61246671f5ce2Younes Manton * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
24fcb595c04f9ee275eae49b7bb7c61246671f5ce2Younes Manton * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
255f730690f8166c94ee010605b6437a6fb2a7771dYounes Manton *
26fcb595c04f9ee275eae49b7bb7c61246671f5ce2Younes Manton **************************************************************************/
27fcb595c04f9ee275eae49b7bb7c61246671f5ce2Younes Manton
28f547472bfa0a797adacc2a7688b4c1ba65381a80Younes Manton#include <assert.h>
295ed848129cb57269e80caf2c1ca522ae41f4500bChristian König
3019bcd21ed151cf1716f2f87dff0f712231aa2ce7Kai Wasserbäch#include "pipe/p_compiler.h"
3119bcd21ed151cf1716f2f87dff0f712231aa2ce7Kai Wasserbäch#include "pipe/p_context.h"
325ed848129cb57269e80caf2c1ca522ae41f4500bChristian König
3319bcd21ed151cf1716f2f87dff0f712231aa2ce7Kai Wasserbäch#include "util/u_memory.h"
3419bcd21ed151cf1716f2f87dff0f712231aa2ce7Kai Wasserbäch#include "util/u_draw.h"
3519bcd21ed151cf1716f2f87dff0f712231aa2ce7Kai Wasserbäch#include "util/u_surface.h"
362b033f3aab8267eb6499954fe4a582472f91ef28Marek Olšák#include "util/u_upload_mgr.h"
375ed848129cb57269e80caf2c1ca522ae41f4500bChristian König
3819bcd21ed151cf1716f2f87dff0f712231aa2ce7Kai Wasserbäch#include "tgsi/tgsi_ureg.h"
395ed848129cb57269e80caf2c1ca522ae41f4500bChristian König
40e00da1476fcdf8e5877fc1e62118080f5c4193f0Younes Manton#include "vl_csc.h"
41e5f78a74f8294ee02015552db664dae1e7da9f47Christian König#include "vl_types.h"
425ed848129cb57269e80caf2c1ca522ae41f4500bChristian König#include "vl_compositor.h"
43f547472bfa0a797adacc2a7688b4c1ba65381a80Younes Manton
44167b1b32c5ff30d514253072ce54513112c03d4dChristian König#define MIN_DIRTY (0)
45167b1b32c5ff30d514253072ce54513112c03d4dChristian König#define MAX_DIRTY (1 << 15)
46167b1b32c5ff30d514253072ce54513112c03d4dChristian König
473841d3fd1358cd3ecbe71d173e52551420a07f4eChristian Königenum VS_OUTPUT
483841d3fd1358cd3ecbe71d173e52551420a07f4eChristian König{
49a9073e34863977f24ade27c0f332fe044495a09bChristian König   VS_O_VPOS = 0,
50a9073e34863977f24ade27c0f332fe044495a09bChristian König   VS_O_COLOR = 0,
51a9073e34863977f24ade27c0f332fe044495a09bChristian König   VS_O_VTEX = 0,
523841d3fd1358cd3ecbe71d173e52551420a07f4eChristian König   VS_O_VTOP,
533841d3fd1358cd3ecbe71d173e52551420a07f4eChristian König   VS_O_VBOTTOM,
543841d3fd1358cd3ecbe71d173e52551420a07f4eChristian König};
553841d3fd1358cd3ecbe71d173e52551420a07f4eChristian König
56e5f78a74f8294ee02015552db664dae1e7da9f47Christian Königstatic void *
57f547472bfa0a797adacc2a7688b4c1ba65381a80Younes Mantoncreate_vert_shader(struct vl_compositor *c)
58f547472bfa0a797adacc2a7688b4c1ba65381a80Younes Manton{
59e57f7b7b107c610fa2d7f149f3441c2b4a9600cbYounes Manton   struct ureg_program *shader;
60b90727bb241e4a04158d34aad078cb18e478fea7Christian König   struct ureg_src vpos, vtex, color;
613841d3fd1358cd3ecbe71d173e52551420a07f4eChristian König   struct ureg_dst tmp;
62b90727bb241e4a04158d34aad078cb18e478fea7Christian König   struct ureg_dst o_vpos, o_vtex, o_color;
633841d3fd1358cd3ecbe71d173e52551420a07f4eChristian König   struct ureg_dst o_vtop, o_vbottom;
645f730690f8166c94ee010605b6437a6fb2a7771dYounes Manton
65af249a7da9bf2621ab836d5074ef692677b11bbfMarek Olšák   shader = ureg_create(PIPE_SHADER_VERTEX);
66e57f7b7b107c610fa2d7f149f3441c2b4a9600cbYounes Manton   if (!shader)
67e57f7b7b107c610fa2d7f149f3441c2b4a9600cbYounes Manton      return false;
68e57f7b7b107c610fa2d7f149f3441c2b4a9600cbYounes Manton
69e57f7b7b107c610fa2d7f149f3441c2b4a9600cbYounes Manton   vpos = ureg_DECL_vs_input(shader, 0);
70e57f7b7b107c610fa2d7f149f3441c2b4a9600cbYounes Manton   vtex = ureg_DECL_vs_input(shader, 1);
71b90727bb241e4a04158d34aad078cb18e478fea7Christian König   color = ureg_DECL_vs_input(shader, 2);
723841d3fd1358cd3ecbe71d173e52551420a07f4eChristian König   tmp = ureg_DECL_temporary(shader);
733841d3fd1358cd3ecbe71d173e52551420a07f4eChristian König   o_vpos = ureg_DECL_output(shader, TGSI_SEMANTIC_POSITION, VS_O_VPOS);
74b90727bb241e4a04158d34aad078cb18e478fea7Christian König   o_color = ureg_DECL_output(shader, TGSI_SEMANTIC_COLOR, VS_O_COLOR);
75a9073e34863977f24ade27c0f332fe044495a09bChristian König   o_vtex = ureg_DECL_output(shader, TGSI_SEMANTIC_GENERIC, VS_O_VTEX);
763841d3fd1358cd3ecbe71d173e52551420a07f4eChristian König   o_vtop = ureg_DECL_output(shader, TGSI_SEMANTIC_GENERIC, VS_O_VTOP);
773841d3fd1358cd3ecbe71d173e52551420a07f4eChristian König   o_vbottom = ureg_DECL_output(shader, TGSI_SEMANTIC_GENERIC, VS_O_VBOTTOM);
78f547472bfa0a797adacc2a7688b4c1ba65381a80Younes Manton
79f547472bfa0a797adacc2a7688b4c1ba65381a80Younes Manton   /*
805f730690f8166c94ee010605b6437a6fb2a7771dYounes Manton    * o_vpos = vpos
815f730690f8166c94ee010605b6437a6fb2a7771dYounes Manton    * o_vtex = vtex
82b90727bb241e4a04158d34aad078cb18e478fea7Christian König    * o_color = color
83f547472bfa0a797adacc2a7688b4c1ba65381a80Younes Manton    */
845f730690f8166c94ee010605b6437a6fb2a7771dYounes Manton   ureg_MOV(shader, o_vpos, vpos);
855f730690f8166c94ee010605b6437a6fb2a7771dYounes Manton   ureg_MOV(shader, o_vtex, vtex);
86b90727bb241e4a04158d34aad078cb18e478fea7Christian König   ureg_MOV(shader, o_color, color);
87f547472bfa0a797adacc2a7688b4c1ba65381a80Younes Manton
88b90727bb241e4a04158d34aad078cb18e478fea7Christian König   /*
89b90727bb241e4a04158d34aad078cb18e478fea7Christian König    * tmp.x = vtex.w / 2
90b90727bb241e4a04158d34aad078cb18e478fea7Christian König    * tmp.y = vtex.w / 4
91b90727bb241e4a04158d34aad078cb18e478fea7Christian König    *
92b90727bb241e4a04158d34aad078cb18e478fea7Christian König    * o_vtop.x = vtex.x
93b90727bb241e4a04158d34aad078cb18e478fea7Christian König    * o_vtop.y = vtex.y * tmp.x + 0.25f
94b90727bb241e4a04158d34aad078cb18e478fea7Christian König    * o_vtop.z = vtex.y * tmp.y + 0.25f
95b90727bb241e4a04158d34aad078cb18e478fea7Christian König    * o_vtop.w = 1 / tmp.x
96b90727bb241e4a04158d34aad078cb18e478fea7Christian König    *
97b90727bb241e4a04158d34aad078cb18e478fea7Christian König    * o_vbottom.x = vtex.x
98b90727bb241e4a04158d34aad078cb18e478fea7Christian König    * o_vbottom.y = vtex.y * tmp.x - 0.25f
99b90727bb241e4a04158d34aad078cb18e478fea7Christian König    * o_vbottom.z = vtex.y * tmp.y - 0.25f
100b90727bb241e4a04158d34aad078cb18e478fea7Christian König    * o_vbottom.w = 1 / tmp.y
101b90727bb241e4a04158d34aad078cb18e478fea7Christian König    */
1023841d3fd1358cd3ecbe71d173e52551420a07f4eChristian König   ureg_MUL(shader, ureg_writemask(tmp, TGSI_WRITEMASK_X),
1033841d3fd1358cd3ecbe71d173e52551420a07f4eChristian König            ureg_scalar(vtex, TGSI_SWIZZLE_W), ureg_imm1f(shader, 0.5f));
1043841d3fd1358cd3ecbe71d173e52551420a07f4eChristian König   ureg_MUL(shader, ureg_writemask(tmp, TGSI_WRITEMASK_Y),
1053841d3fd1358cd3ecbe71d173e52551420a07f4eChristian König            ureg_scalar(vtex, TGSI_SWIZZLE_W), ureg_imm1f(shader, 0.25f));
1063841d3fd1358cd3ecbe71d173e52551420a07f4eChristian König
1073841d3fd1358cd3ecbe71d173e52551420a07f4eChristian König   ureg_MOV(shader, ureg_writemask(o_vtop, TGSI_WRITEMASK_X), vtex);
1083841d3fd1358cd3ecbe71d173e52551420a07f4eChristian König   ureg_MAD(shader, ureg_writemask(o_vtop, TGSI_WRITEMASK_Y), ureg_scalar(vtex, TGSI_SWIZZLE_Y),
1093841d3fd1358cd3ecbe71d173e52551420a07f4eChristian König            ureg_scalar(ureg_src(tmp), TGSI_SWIZZLE_X), ureg_imm1f(shader, 0.25f));
1103841d3fd1358cd3ecbe71d173e52551420a07f4eChristian König   ureg_MAD(shader, ureg_writemask(o_vtop, TGSI_WRITEMASK_Z), ureg_scalar(vtex, TGSI_SWIZZLE_Y),
1113841d3fd1358cd3ecbe71d173e52551420a07f4eChristian König            ureg_scalar(ureg_src(tmp), TGSI_SWIZZLE_Y), ureg_imm1f(shader, 0.25f));
1123841d3fd1358cd3ecbe71d173e52551420a07f4eChristian König   ureg_RCP(shader, ureg_writemask(o_vtop, TGSI_WRITEMASK_W),
1133841d3fd1358cd3ecbe71d173e52551420a07f4eChristian König            ureg_scalar(ureg_src(tmp), TGSI_SWIZZLE_X));
1143841d3fd1358cd3ecbe71d173e52551420a07f4eChristian König
1153841d3fd1358cd3ecbe71d173e52551420a07f4eChristian König   ureg_MOV(shader, ureg_writemask(o_vbottom, TGSI_WRITEMASK_X), vtex);
1163841d3fd1358cd3ecbe71d173e52551420a07f4eChristian König   ureg_MAD(shader, ureg_writemask(o_vbottom, TGSI_WRITEMASK_Y), ureg_scalar(vtex, TGSI_SWIZZLE_Y),
1173841d3fd1358cd3ecbe71d173e52551420a07f4eChristian König            ureg_scalar(ureg_src(tmp), TGSI_SWIZZLE_X), ureg_imm1f(shader, -0.25f));
1183841d3fd1358cd3ecbe71d173e52551420a07f4eChristian König   ureg_MAD(shader, ureg_writemask(o_vbottom, TGSI_WRITEMASK_Z), ureg_scalar(vtex, TGSI_SWIZZLE_Y),
1193841d3fd1358cd3ecbe71d173e52551420a07f4eChristian König            ureg_scalar(ureg_src(tmp), TGSI_SWIZZLE_Y), ureg_imm1f(shader, -0.25f));
1203841d3fd1358cd3ecbe71d173e52551420a07f4eChristian König   ureg_RCP(shader, ureg_writemask(o_vbottom, TGSI_WRITEMASK_W),
1213841d3fd1358cd3ecbe71d173e52551420a07f4eChristian König            ureg_scalar(ureg_src(tmp), TGSI_SWIZZLE_Y));
1223841d3fd1358cd3ecbe71d173e52551420a07f4eChristian König
123e57f7b7b107c610fa2d7f149f3441c2b4a9600cbYounes Manton   ureg_END(shader);
124f547472bfa0a797adacc2a7688b4c1ba65381a80Younes Manton
125e5f78a74f8294ee02015552db664dae1e7da9f47Christian König   return ureg_create_shader_and_destroy(shader, c->pipe);
126f547472bfa0a797adacc2a7688b4c1ba65381a80Younes Manton}
127f547472bfa0a797adacc2a7688b4c1ba65381a80Younes Manton
128bf89e672cff432a5e2ace72c0fb73eb8f120ff7aChristian Königstatic void
1292e18c2c6f86342e7ea77b0f1a1f731f879db0ed3Leo Liucreate_frag_shader_weave(struct ureg_program *shader, struct ureg_dst fragment)
1302e18c2c6f86342e7ea77b0f1a1f731f879db0ed3Leo Liu{
1312e18c2c6f86342e7ea77b0f1a1f731f879db0ed3Leo Liu   struct ureg_src i_tc[2];
1322e18c2c6f86342e7ea77b0f1a1f731f879db0ed3Leo Liu   struct ureg_src sampler[3];
1332e18c2c6f86342e7ea77b0f1a1f731f879db0ed3Leo Liu   struct ureg_dst t_tc[2];
1342e18c2c6f86342e7ea77b0f1a1f731f879db0ed3Leo Liu   struct ureg_dst t_texel[2];
1352e18c2c6f86342e7ea77b0f1a1f731f879db0ed3Leo Liu   unsigned i, j;
1362e18c2c6f86342e7ea77b0f1a1f731f879db0ed3Leo Liu
1372e18c2c6f86342e7ea77b0f1a1f731f879db0ed3Leo Liu   i_tc[0] = ureg_DECL_fs_input(shader, TGSI_SEMANTIC_GENERIC, VS_O_VTOP, TGSI_INTERPOLATE_LINEAR);
1382e18c2c6f86342e7ea77b0f1a1f731f879db0ed3Leo Liu   i_tc[1] = ureg_DECL_fs_input(shader, TGSI_SEMANTIC_GENERIC, VS_O_VBOTTOM, TGSI_INTERPOLATE_LINEAR);
1392e18c2c6f86342e7ea77b0f1a1f731f879db0ed3Leo Liu
1402e18c2c6f86342e7ea77b0f1a1f731f879db0ed3Leo Liu   for (i = 0; i < 3; ++i)
1412e18c2c6f86342e7ea77b0f1a1f731f879db0ed3Leo Liu      sampler[i] = ureg_DECL_sampler(shader, i);
1422e18c2c6f86342e7ea77b0f1a1f731f879db0ed3Leo Liu
1432e18c2c6f86342e7ea77b0f1a1f731f879db0ed3Leo Liu   for (i = 0; i < 2; ++i) {
1442e18c2c6f86342e7ea77b0f1a1f731f879db0ed3Leo Liu      t_tc[i] = ureg_DECL_temporary(shader);
1452e18c2c6f86342e7ea77b0f1a1f731f879db0ed3Leo Liu      t_texel[i] = ureg_DECL_temporary(shader);
1462e18c2c6f86342e7ea77b0f1a1f731f879db0ed3Leo Liu   }
1472e18c2c6f86342e7ea77b0f1a1f731f879db0ed3Leo Liu
1482e18c2c6f86342e7ea77b0f1a1f731f879db0ed3Leo Liu   /* calculate the texture offsets
1492e18c2c6f86342e7ea77b0f1a1f731f879db0ed3Leo Liu    * t_tc.x = i_tc.x
1502e18c2c6f86342e7ea77b0f1a1f731f879db0ed3Leo Liu    * t_tc.y = (round(i_tc.y - 0.5) + 0.5) / height * 2
1512e18c2c6f86342e7ea77b0f1a1f731f879db0ed3Leo Liu    */
1522e18c2c6f86342e7ea77b0f1a1f731f879db0ed3Leo Liu   for (i = 0; i < 2; ++i) {
1532e18c2c6f86342e7ea77b0f1a1f731f879db0ed3Leo Liu      ureg_MOV(shader, ureg_writemask(t_tc[i], TGSI_WRITEMASK_X), i_tc[i]);
154d995115b1733ec14182e6bb4653b8f8389b87518Marek Olšák      ureg_ADD(shader, ureg_writemask(t_tc[i], TGSI_WRITEMASK_YZ),
155d995115b1733ec14182e6bb4653b8f8389b87518Marek Olšák               i_tc[i], ureg_imm1f(shader, -0.5f));
1562e18c2c6f86342e7ea77b0f1a1f731f879db0ed3Leo Liu      ureg_ROUND(shader, ureg_writemask(t_tc[i], TGSI_WRITEMASK_YZ), ureg_src(t_tc[i]));
1572e18c2c6f86342e7ea77b0f1a1f731f879db0ed3Leo Liu      ureg_MOV(shader, ureg_writemask(t_tc[i], TGSI_WRITEMASK_W),
1582e18c2c6f86342e7ea77b0f1a1f731f879db0ed3Leo Liu               ureg_imm1f(shader, i ? 1.0f : 0.0f));
1592e18c2c6f86342e7ea77b0f1a1f731f879db0ed3Leo Liu      ureg_ADD(shader, ureg_writemask(t_tc[i], TGSI_WRITEMASK_YZ),
1602e18c2c6f86342e7ea77b0f1a1f731f879db0ed3Leo Liu               ureg_src(t_tc[i]), ureg_imm1f(shader, 0.5f));
1612e18c2c6f86342e7ea77b0f1a1f731f879db0ed3Leo Liu      ureg_MUL(shader, ureg_writemask(t_tc[i], TGSI_WRITEMASK_Y),
1622e18c2c6f86342e7ea77b0f1a1f731f879db0ed3Leo Liu               ureg_src(t_tc[i]), ureg_scalar(i_tc[0], TGSI_SWIZZLE_W));
1632e18c2c6f86342e7ea77b0f1a1f731f879db0ed3Leo Liu      ureg_MUL(shader, ureg_writemask(t_tc[i], TGSI_WRITEMASK_Z),
1642e18c2c6f86342e7ea77b0f1a1f731f879db0ed3Leo Liu               ureg_src(t_tc[i]), ureg_scalar(i_tc[1], TGSI_SWIZZLE_W));
1652e18c2c6f86342e7ea77b0f1a1f731f879db0ed3Leo Liu   }
1662e18c2c6f86342e7ea77b0f1a1f731f879db0ed3Leo Liu
1672e18c2c6f86342e7ea77b0f1a1f731f879db0ed3Leo Liu   /* fetch the texels
1682e18c2c6f86342e7ea77b0f1a1f731f879db0ed3Leo Liu    * texel[0..1].x = tex(t_tc[0..1][0])
1692e18c2c6f86342e7ea77b0f1a1f731f879db0ed3Leo Liu    * texel[0..1].y = tex(t_tc[0..1][1])
1702e18c2c6f86342e7ea77b0f1a1f731f879db0ed3Leo Liu    * texel[0..1].z = tex(t_tc[0..1][2])
1712e18c2c6f86342e7ea77b0f1a1f731f879db0ed3Leo Liu    */
1722e18c2c6f86342e7ea77b0f1a1f731f879db0ed3Leo Liu   for (i = 0; i < 2; ++i)
1732e18c2c6f86342e7ea77b0f1a1f731f879db0ed3Leo Liu      for (j = 0; j < 3; ++j) {
1742e18c2c6f86342e7ea77b0f1a1f731f879db0ed3Leo Liu         struct ureg_src src = ureg_swizzle(ureg_src(t_tc[i]),
1752e18c2c6f86342e7ea77b0f1a1f731f879db0ed3Leo Liu            TGSI_SWIZZLE_X, j ? TGSI_SWIZZLE_Z : TGSI_SWIZZLE_Y, TGSI_SWIZZLE_W, TGSI_SWIZZLE_W);
1762e18c2c6f86342e7ea77b0f1a1f731f879db0ed3Leo Liu
1772e18c2c6f86342e7ea77b0f1a1f731f879db0ed3Leo Liu         ureg_TEX(shader, ureg_writemask(t_texel[i], TGSI_WRITEMASK_X << j),
1782e18c2c6f86342e7ea77b0f1a1f731f879db0ed3Leo Liu                  TGSI_TEXTURE_2D_ARRAY, src, sampler[j]);
1792e18c2c6f86342e7ea77b0f1a1f731f879db0ed3Leo Liu      }
1802e18c2c6f86342e7ea77b0f1a1f731f879db0ed3Leo Liu
1812e18c2c6f86342e7ea77b0f1a1f731f879db0ed3Leo Liu   /* calculate linear interpolation factor
1822e18c2c6f86342e7ea77b0f1a1f731f879db0ed3Leo Liu    * factor = |round(i_tc.y) - i_tc.y| * 2
1832e18c2c6f86342e7ea77b0f1a1f731f879db0ed3Leo Liu    */
1842e18c2c6f86342e7ea77b0f1a1f731f879db0ed3Leo Liu   ureg_ROUND(shader, ureg_writemask(t_tc[0], TGSI_WRITEMASK_YZ), i_tc[0]);
1852e18c2c6f86342e7ea77b0f1a1f731f879db0ed3Leo Liu   ureg_ADD(shader, ureg_writemask(t_tc[0], TGSI_WRITEMASK_YZ),
1862e18c2c6f86342e7ea77b0f1a1f731f879db0ed3Leo Liu            ureg_src(t_tc[0]), ureg_negate(i_tc[0]));
1872e18c2c6f86342e7ea77b0f1a1f731f879db0ed3Leo Liu   ureg_MUL(shader, ureg_writemask(t_tc[0], TGSI_WRITEMASK_YZ),
1882e18c2c6f86342e7ea77b0f1a1f731f879db0ed3Leo Liu            ureg_abs(ureg_src(t_tc[0])), ureg_imm1f(shader, 2.0f));
1892e18c2c6f86342e7ea77b0f1a1f731f879db0ed3Leo Liu   ureg_LRP(shader, fragment, ureg_swizzle(ureg_src(t_tc[0]),
1902e18c2c6f86342e7ea77b0f1a1f731f879db0ed3Leo Liu            TGSI_SWIZZLE_Y, TGSI_SWIZZLE_Z, TGSI_SWIZZLE_Z, TGSI_SWIZZLE_Z),
1912e18c2c6f86342e7ea77b0f1a1f731f879db0ed3Leo Liu            ureg_src(t_texel[0]), ureg_src(t_texel[1]));
1922e18c2c6f86342e7ea77b0f1a1f731f879db0ed3Leo Liu
1932e18c2c6f86342e7ea77b0f1a1f731f879db0ed3Leo Liu   for (i = 0; i < 2; ++i) {
1942e18c2c6f86342e7ea77b0f1a1f731f879db0ed3Leo Liu      ureg_release_temporary(shader, t_texel[i]);
1952e18c2c6f86342e7ea77b0f1a1f731f879db0ed3Leo Liu      ureg_release_temporary(shader, t_tc[i]);
1962e18c2c6f86342e7ea77b0f1a1f731f879db0ed3Leo Liu   }
1972e18c2c6f86342e7ea77b0f1a1f731f879db0ed3Leo Liu}
1982e18c2c6f86342e7ea77b0f1a1f731f879db0ed3Leo Liu
1992e18c2c6f86342e7ea77b0f1a1f731f879db0ed3Leo Liustatic void
200bf89e672cff432a5e2ace72c0fb73eb8f120ff7aChristian Königcreate_frag_shader_csc(struct ureg_program *shader, struct ureg_dst texel,
201bf89e672cff432a5e2ace72c0fb73eb8f120ff7aChristian König		       struct ureg_dst fragment)
202bf89e672cff432a5e2ace72c0fb73eb8f120ff7aChristian König{
203bf89e672cff432a5e2ace72c0fb73eb8f120ff7aChristian König   struct ureg_src csc[3];
204bf89e672cff432a5e2ace72c0fb73eb8f120ff7aChristian König   struct ureg_src lumakey;
205bf89e672cff432a5e2ace72c0fb73eb8f120ff7aChristian König   struct ureg_dst temp[2];
206bf89e672cff432a5e2ace72c0fb73eb8f120ff7aChristian König   unsigned i;
207bf89e672cff432a5e2ace72c0fb73eb8f120ff7aChristian König
208bf89e672cff432a5e2ace72c0fb73eb8f120ff7aChristian König   for (i = 0; i < 3; ++i)
209bf89e672cff432a5e2ace72c0fb73eb8f120ff7aChristian König      csc[i] = ureg_DECL_constant(shader, i);
210bf89e672cff432a5e2ace72c0fb73eb8f120ff7aChristian König
211bf89e672cff432a5e2ace72c0fb73eb8f120ff7aChristian König   lumakey = ureg_DECL_constant(shader, 3);
212bf89e672cff432a5e2ace72c0fb73eb8f120ff7aChristian König
213bf89e672cff432a5e2ace72c0fb73eb8f120ff7aChristian König   for (i = 0; i < 2; ++i)
214bf89e672cff432a5e2ace72c0fb73eb8f120ff7aChristian König      temp[i] = ureg_DECL_temporary(shader);
215bf89e672cff432a5e2ace72c0fb73eb8f120ff7aChristian König
216bf89e672cff432a5e2ace72c0fb73eb8f120ff7aChristian König   ureg_MOV(shader, ureg_writemask(texel, TGSI_WRITEMASK_W),
217bf89e672cff432a5e2ace72c0fb73eb8f120ff7aChristian König	    ureg_imm1f(shader, 1.0f));
218bf89e672cff432a5e2ace72c0fb73eb8f120ff7aChristian König
219bf89e672cff432a5e2ace72c0fb73eb8f120ff7aChristian König   for (i = 0; i < 3; ++i)
220bf89e672cff432a5e2ace72c0fb73eb8f120ff7aChristian König      ureg_DP4(shader, ureg_writemask(fragment, TGSI_WRITEMASK_X << i), csc[i],
221bf89e672cff432a5e2ace72c0fb73eb8f120ff7aChristian König	       ureg_src(texel));
222bf89e672cff432a5e2ace72c0fb73eb8f120ff7aChristian König
223bf89e672cff432a5e2ace72c0fb73eb8f120ff7aChristian König   ureg_MOV(shader, ureg_writemask(temp[0], TGSI_WRITEMASK_W),
224bf89e672cff432a5e2ace72c0fb73eb8f120ff7aChristian König            ureg_scalar(ureg_src(texel), TGSI_SWIZZLE_Z));
225bf89e672cff432a5e2ace72c0fb73eb8f120ff7aChristian König   ureg_SLE(shader, ureg_writemask(temp[1],TGSI_WRITEMASK_W),
226bf89e672cff432a5e2ace72c0fb73eb8f120ff7aChristian König            ureg_src(temp[0]), ureg_scalar(lumakey, TGSI_SWIZZLE_X));
227bf89e672cff432a5e2ace72c0fb73eb8f120ff7aChristian König   ureg_SGT(shader, ureg_writemask(temp[0],TGSI_WRITEMASK_W),
228bf89e672cff432a5e2ace72c0fb73eb8f120ff7aChristian König            ureg_src(temp[0]), ureg_scalar(lumakey, TGSI_SWIZZLE_Y));
229bf89e672cff432a5e2ace72c0fb73eb8f120ff7aChristian König   ureg_MAX(shader, ureg_writemask(fragment, TGSI_WRITEMASK_W),
230bf89e672cff432a5e2ace72c0fb73eb8f120ff7aChristian König            ureg_src(temp[0]), ureg_src(temp[1]));
231bf89e672cff432a5e2ace72c0fb73eb8f120ff7aChristian König
232bf89e672cff432a5e2ace72c0fb73eb8f120ff7aChristian König   for (i = 0; i < 2; ++i)
233bf89e672cff432a5e2ace72c0fb73eb8f120ff7aChristian König       ureg_release_temporary(shader, temp[i]);
234bf89e672cff432a5e2ace72c0fb73eb8f120ff7aChristian König}
235bf89e672cff432a5e2ace72c0fb73eb8f120ff7aChristian König
236e5f78a74f8294ee02015552db664dae1e7da9f47Christian Königstatic void *
237e5f78a74f8294ee02015552db664dae1e7da9f47Christian Königcreate_frag_shader_video_buffer(struct vl_compositor *c)
238f547472bfa0a797adacc2a7688b4c1ba65381a80Younes Manton{
239e57f7b7b107c610fa2d7f149f3441c2b4a9600cbYounes Manton   struct ureg_program *shader;
240e57f7b7b107c610fa2d7f149f3441c2b4a9600cbYounes Manton   struct ureg_src tc;
2411f3a85ec7931c5d67fce0ec1e845d6c91048e599Christian König   struct ureg_src sampler[3];
242e57f7b7b107c610fa2d7f149f3441c2b4a9600cbYounes Manton   struct ureg_dst texel;
243e57f7b7b107c610fa2d7f149f3441c2b4a9600cbYounes Manton   struct ureg_dst fragment;
24422658c165077c8449d52ea9c3ab7b3bbb5e38468José Fonseca   unsigned i;
2455f730690f8166c94ee010605b6437a6fb2a7771dYounes Manton
246af249a7da9bf2621ab836d5074ef692677b11bbfMarek Olšák   shader = ureg_create(PIPE_SHADER_FRAGMENT);
247e57f7b7b107c610fa2d7f149f3441c2b4a9600cbYounes Manton   if (!shader)
248e57f7b7b107c610fa2d7f149f3441c2b4a9600cbYounes Manton      return false;
249e57f7b7b107c610fa2d7f149f3441c2b4a9600cbYounes Manton
250a9073e34863977f24ade27c0f332fe044495a09bChristian König   tc = ureg_DECL_fs_input(shader, TGSI_SEMANTIC_GENERIC, VS_O_VTEX, TGSI_INTERPOLATE_LINEAR);
251bf89e672cff432a5e2ace72c0fb73eb8f120ff7aChristian König   for (i = 0; i < 3; ++i)
2521f3a85ec7931c5d67fce0ec1e845d6c91048e599Christian König      sampler[i] = ureg_DECL_sampler(shader, i);
253f24eb5a17830b8137045a626dbd55e75ed5e708dNayan Deshmukh
254e57f7b7b107c610fa2d7f149f3441c2b4a9600cbYounes Manton   texel = ureg_DECL_temporary(shader);
255e57f7b7b107c610fa2d7f149f3441c2b4a9600cbYounes Manton   fragment = ureg_DECL_output(shader, TGSI_SEMANTIC_COLOR, 0);
256f547472bfa0a797adacc2a7688b4c1ba65381a80Younes Manton
257f547472bfa0a797adacc2a7688b4c1ba65381a80Younes Manton   /*
2581f3a85ec7931c5d67fce0ec1e845d6c91048e599Christian König    * texel.xyz = tex(tc, sampler[i])
259e57f7b7b107c610fa2d7f149f3441c2b4a9600cbYounes Manton    * fragment = csc * texel
260f547472bfa0a797adacc2a7688b4c1ba65381a80Younes Manton    */
2611f3a85ec7931c5d67fce0ec1e845d6c91048e599Christian König   for (i = 0; i < 3; ++i)
2627d2f2a0c890b1993532a45c8c392c28950ddc06eChristian König      ureg_TEX(shader, ureg_writemask(texel, TGSI_WRITEMASK_X << i), TGSI_TEXTURE_2D_ARRAY, tc, sampler[i]);
2631f3a85ec7931c5d67fce0ec1e845d6c91048e599Christian König
264bf89e672cff432a5e2ace72c0fb73eb8f120ff7aChristian König   create_frag_shader_csc(shader, texel, fragment);
265f547472bfa0a797adacc2a7688b4c1ba65381a80Younes Manton
266e57f7b7b107c610fa2d7f149f3441c2b4a9600cbYounes Manton   ureg_release_temporary(shader, texel);
267e57f7b7b107c610fa2d7f149f3441c2b4a9600cbYounes Manton   ureg_END(shader);
268f547472bfa0a797adacc2a7688b4c1ba65381a80Younes Manton
269e5f78a74f8294ee02015552db664dae1e7da9f47Christian König   return ureg_create_shader_and_destroy(shader, c->pipe);
270b9fe9665194899fc0a6336d876ab0596418c7287Younes Manton}
271b9fe9665194899fc0a6336d876ab0596418c7287Younes Manton
272e5f78a74f8294ee02015552db664dae1e7da9f47Christian Königstatic void *
2732e18c2c6f86342e7ea77b0f1a1f731f879db0ed3Leo Liucreate_frag_shader_weave_rgb(struct vl_compositor *c)
2743841d3fd1358cd3ecbe71d173e52551420a07f4eChristian König{
2753841d3fd1358cd3ecbe71d173e52551420a07f4eChristian König   struct ureg_program *shader;
2762e18c2c6f86342e7ea77b0f1a1f731f879db0ed3Leo Liu   struct ureg_dst texel, fragment;
2773841d3fd1358cd3ecbe71d173e52551420a07f4eChristian König
278af249a7da9bf2621ab836d5074ef692677b11bbfMarek Olšák   shader = ureg_create(PIPE_SHADER_FRAGMENT);
2793841d3fd1358cd3ecbe71d173e52551420a07f4eChristian König   if (!shader)
2803841d3fd1358cd3ecbe71d173e52551420a07f4eChristian König      return false;
2813841d3fd1358cd3ecbe71d173e52551420a07f4eChristian König
2822e18c2c6f86342e7ea77b0f1a1f731f879db0ed3Leo Liu   texel = ureg_DECL_temporary(shader);
2832e18c2c6f86342e7ea77b0f1a1f731f879db0ed3Leo Liu   fragment = ureg_DECL_output(shader, TGSI_SEMANTIC_COLOR, 0);
2843841d3fd1358cd3ecbe71d173e52551420a07f4eChristian König
2852e18c2c6f86342e7ea77b0f1a1f731f879db0ed3Leo Liu   create_frag_shader_weave(shader, texel);
2862e18c2c6f86342e7ea77b0f1a1f731f879db0ed3Leo Liu   create_frag_shader_csc(shader, texel, fragment);
2873841d3fd1358cd3ecbe71d173e52551420a07f4eChristian König
2882e18c2c6f86342e7ea77b0f1a1f731f879db0ed3Leo Liu   ureg_release_temporary(shader, texel);
2893841d3fd1358cd3ecbe71d173e52551420a07f4eChristian König
2903841d3fd1358cd3ecbe71d173e52551420a07f4eChristian König   ureg_END(shader);
2913841d3fd1358cd3ecbe71d173e52551420a07f4eChristian König
2923841d3fd1358cd3ecbe71d173e52551420a07f4eChristian König   return ureg_create_shader_and_destroy(shader, c->pipe);
2933841d3fd1358cd3ecbe71d173e52551420a07f4eChristian König}
2943841d3fd1358cd3ecbe71d173e52551420a07f4eChristian König
2953841d3fd1358cd3ecbe71d173e52551420a07f4eChristian Königstatic void *
29614761da9f9bc132b061d4cfa4d7dd93d1b113f6bLeo Liucreate_frag_shader_weave_yuv(struct vl_compositor *c, bool y)
29714761da9f9bc132b061d4cfa4d7dd93d1b113f6bLeo Liu{
29814761da9f9bc132b061d4cfa4d7dd93d1b113f6bLeo Liu   struct ureg_program *shader;
29914761da9f9bc132b061d4cfa4d7dd93d1b113f6bLeo Liu   struct ureg_dst texel, fragment;
30014761da9f9bc132b061d4cfa4d7dd93d1b113f6bLeo Liu
30114761da9f9bc132b061d4cfa4d7dd93d1b113f6bLeo Liu   shader = ureg_create(PIPE_SHADER_FRAGMENT);
30214761da9f9bc132b061d4cfa4d7dd93d1b113f6bLeo Liu   if (!shader)
30314761da9f9bc132b061d4cfa4d7dd93d1b113f6bLeo Liu      return false;
30414761da9f9bc132b061d4cfa4d7dd93d1b113f6bLeo Liu
30514761da9f9bc132b061d4cfa4d7dd93d1b113f6bLeo Liu   texel = ureg_DECL_temporary(shader);
30614761da9f9bc132b061d4cfa4d7dd93d1b113f6bLeo Liu   fragment = ureg_DECL_output(shader, TGSI_SEMANTIC_COLOR, 0);
30714761da9f9bc132b061d4cfa4d7dd93d1b113f6bLeo Liu
30814761da9f9bc132b061d4cfa4d7dd93d1b113f6bLeo Liu   create_frag_shader_weave(shader, texel);
30914761da9f9bc132b061d4cfa4d7dd93d1b113f6bLeo Liu
31014761da9f9bc132b061d4cfa4d7dd93d1b113f6bLeo Liu   if (y)
31114761da9f9bc132b061d4cfa4d7dd93d1b113f6bLeo Liu      ureg_MOV(shader, ureg_writemask(fragment, TGSI_WRITEMASK_X), ureg_src(texel));
31214761da9f9bc132b061d4cfa4d7dd93d1b113f6bLeo Liu   else
31314761da9f9bc132b061d4cfa4d7dd93d1b113f6bLeo Liu      ureg_MOV(shader, ureg_writemask(fragment, TGSI_WRITEMASK_XY),
31414761da9f9bc132b061d4cfa4d7dd93d1b113f6bLeo Liu                       ureg_swizzle(ureg_src(texel), TGSI_SWIZZLE_Y,
31514761da9f9bc132b061d4cfa4d7dd93d1b113f6bLeo Liu                               TGSI_SWIZZLE_Z, TGSI_SWIZZLE_W, TGSI_SWIZZLE_W));
31614761da9f9bc132b061d4cfa4d7dd93d1b113f6bLeo Liu
31714761da9f9bc132b061d4cfa4d7dd93d1b113f6bLeo Liu   ureg_release_temporary(shader, texel);
31814761da9f9bc132b061d4cfa4d7dd93d1b113f6bLeo Liu
31914761da9f9bc132b061d4cfa4d7dd93d1b113f6bLeo Liu   ureg_END(shader);
32014761da9f9bc132b061d4cfa4d7dd93d1b113f6bLeo Liu
32114761da9f9bc132b061d4cfa4d7dd93d1b113f6bLeo Liu   return ureg_create_shader_and_destroy(shader, c->pipe);
32214761da9f9bc132b061d4cfa4d7dd93d1b113f6bLeo Liu}
32314761da9f9bc132b061d4cfa4d7dd93d1b113f6bLeo Liu
32414761da9f9bc132b061d4cfa4d7dd93d1b113f6bLeo Liustatic void *
3254f37636afb5adc299ecbe497209702a47039580cChristian Königcreate_frag_shader_palette(struct vl_compositor *c, bool include_cc)
3267f426615ab308de508f672567094b8b21d836a9bChristian König{
3277f426615ab308de508f672567094b8b21d836a9bChristian König   struct ureg_program *shader;
32876d881b8b086495081c0a3c8fea2278f1480f107Christian König   struct ureg_src csc[3];
3297f426615ab308de508f672567094b8b21d836a9bChristian König   struct ureg_src tc;
3307f426615ab308de508f672567094b8b21d836a9bChristian König   struct ureg_src sampler;
3317f426615ab308de508f672567094b8b21d836a9bChristian König   struct ureg_src palette;
3327f426615ab308de508f672567094b8b21d836a9bChristian König   struct ureg_dst texel;
3337f426615ab308de508f672567094b8b21d836a9bChristian König   struct ureg_dst fragment;
33476d881b8b086495081c0a3c8fea2278f1480f107Christian König   unsigned i;
3357f426615ab308de508f672567094b8b21d836a9bChristian König
336af249a7da9bf2621ab836d5074ef692677b11bbfMarek Olšák   shader = ureg_create(PIPE_SHADER_FRAGMENT);
3377f426615ab308de508f672567094b8b21d836a9bChristian König   if (!shader)
3387f426615ab308de508f672567094b8b21d836a9bChristian König      return false;
3397f426615ab308de508f672567094b8b21d836a9bChristian König
34068651c3243f5539caaa0f8b81bc2ad025610606dMaarten Lankhorst   for (i = 0; include_cc && i < 3; ++i)
34176d881b8b086495081c0a3c8fea2278f1480f107Christian König      csc[i] = ureg_DECL_constant(shader, i);
34276d881b8b086495081c0a3c8fea2278f1480f107Christian König
3433841d3fd1358cd3ecbe71d173e52551420a07f4eChristian König   tc = ureg_DECL_fs_input(shader, TGSI_SEMANTIC_GENERIC, VS_O_VTEX, TGSI_INTERPOLATE_LINEAR);
3447f426615ab308de508f672567094b8b21d836a9bChristian König   sampler = ureg_DECL_sampler(shader, 0);
3457f426615ab308de508f672567094b8b21d836a9bChristian König   palette = ureg_DECL_sampler(shader, 1);
3464f37636afb5adc299ecbe497209702a47039580cChristian König
3477f426615ab308de508f672567094b8b21d836a9bChristian König   texel = ureg_DECL_temporary(shader);
34876d881b8b086495081c0a3c8fea2278f1480f107Christian König   fragment = ureg_DECL_output(shader, TGSI_SEMANTIC_COLOR, 0);
3497f426615ab308de508f672567094b8b21d836a9bChristian König
3507f426615ab308de508f672567094b8b21d836a9bChristian König   /*
351e5f78a74f8294ee02015552db664dae1e7da9f47Christian König    * texel = tex(tc, sampler)
35276d881b8b086495081c0a3c8fea2278f1480f107Christian König    * fragment.xyz = tex(texel, palette) * csc
353e5f78a74f8294ee02015552db664dae1e7da9f47Christian König    * fragment.a = texel.a
3547f426615ab308de508f672567094b8b21d836a9bChristian König    */
3557f426615ab308de508f672567094b8b21d836a9bChristian König   ureg_TEX(shader, texel, TGSI_TEXTURE_2D, tc, sampler);
3567f426615ab308de508f672567094b8b21d836a9bChristian König   ureg_MOV(shader, ureg_writemask(fragment, TGSI_WRITEMASK_W), ureg_src(texel));
3577f426615ab308de508f672567094b8b21d836a9bChristian König
3584f37636afb5adc299ecbe497209702a47039580cChristian König   if (include_cc) {
3594f37636afb5adc299ecbe497209702a47039580cChristian König      ureg_TEX(shader, texel, TGSI_TEXTURE_1D, ureg_src(texel), palette);
3604f37636afb5adc299ecbe497209702a47039580cChristian König      for (i = 0; i < 3; ++i)
3614f37636afb5adc299ecbe497209702a47039580cChristian König         ureg_DP4(shader, ureg_writemask(fragment, TGSI_WRITEMASK_X << i), csc[i], ureg_src(texel));
3624f37636afb5adc299ecbe497209702a47039580cChristian König   } else {
3634f37636afb5adc299ecbe497209702a47039580cChristian König      ureg_TEX(shader, ureg_writemask(fragment, TGSI_WRITEMASK_XYZ),
3644f37636afb5adc299ecbe497209702a47039580cChristian König               TGSI_TEXTURE_1D, ureg_src(texel), palette);
3654f37636afb5adc299ecbe497209702a47039580cChristian König   }
36676d881b8b086495081c0a3c8fea2278f1480f107Christian König
3677f426615ab308de508f672567094b8b21d836a9bChristian König   ureg_release_temporary(shader, texel);
3687f426615ab308de508f672567094b8b21d836a9bChristian König   ureg_END(shader);
3697f426615ab308de508f672567094b8b21d836a9bChristian König
370e5f78a74f8294ee02015552db664dae1e7da9f47Christian König   return ureg_create_shader_and_destroy(shader, c->pipe);
3717f426615ab308de508f672567094b8b21d836a9bChristian König}
3727f426615ab308de508f672567094b8b21d836a9bChristian König
373e5f78a74f8294ee02015552db664dae1e7da9f47Christian Königstatic void *
374e5f78a74f8294ee02015552db664dae1e7da9f47Christian Königcreate_frag_shader_rgba(struct vl_compositor *c)
375b9fe9665194899fc0a6336d876ab0596418c7287Younes Manton{
376b9fe9665194899fc0a6336d876ab0596418c7287Younes Manton   struct ureg_program *shader;
377b90727bb241e4a04158d34aad078cb18e478fea7Christian König   struct ureg_src tc, color, sampler;
378b90727bb241e4a04158d34aad078cb18e478fea7Christian König   struct ureg_dst texel, fragment;
379b9fe9665194899fc0a6336d876ab0596418c7287Younes Manton
380af249a7da9bf2621ab836d5074ef692677b11bbfMarek Olšák   shader = ureg_create(PIPE_SHADER_FRAGMENT);
381b9fe9665194899fc0a6336d876ab0596418c7287Younes Manton   if (!shader)
382b9fe9665194899fc0a6336d876ab0596418c7287Younes Manton      return false;
383b9fe9665194899fc0a6336d876ab0596418c7287Younes Manton
3843841d3fd1358cd3ecbe71d173e52551420a07f4eChristian König   tc = ureg_DECL_fs_input(shader, TGSI_SEMANTIC_GENERIC, VS_O_VTEX, TGSI_INTERPOLATE_LINEAR);
385b90727bb241e4a04158d34aad078cb18e478fea7Christian König   color = ureg_DECL_fs_input(shader, TGSI_SEMANTIC_COLOR, VS_O_COLOR, TGSI_INTERPOLATE_LINEAR);
386b9fe9665194899fc0a6336d876ab0596418c7287Younes Manton   sampler = ureg_DECL_sampler(shader, 0);
387b90727bb241e4a04158d34aad078cb18e478fea7Christian König   texel = ureg_DECL_temporary(shader);
388b9fe9665194899fc0a6336d876ab0596418c7287Younes Manton   fragment = ureg_DECL_output(shader, TGSI_SEMANTIC_COLOR, 0);
389b9fe9665194899fc0a6336d876ab0596418c7287Younes Manton
390b9fe9665194899fc0a6336d876ab0596418c7287Younes Manton   /*
391b9fe9665194899fc0a6336d876ab0596418c7287Younes Manton    * fragment = tex(tc, sampler)
392b9fe9665194899fc0a6336d876ab0596418c7287Younes Manton    */
393b90727bb241e4a04158d34aad078cb18e478fea7Christian König   ureg_TEX(shader, texel, TGSI_TEXTURE_2D, tc, sampler);
394b90727bb241e4a04158d34aad078cb18e478fea7Christian König   ureg_MUL(shader, fragment, ureg_src(texel), color);
395b9fe9665194899fc0a6336d876ab0596418c7287Younes Manton   ureg_END(shader);
396b9fe9665194899fc0a6336d876ab0596418c7287Younes Manton
397e5f78a74f8294ee02015552db664dae1e7da9f47Christian König   return ureg_create_shader_and_destroy(shader, c->pipe);
398e5f78a74f8294ee02015552db664dae1e7da9f47Christian König}
399e5f78a74f8294ee02015552db664dae1e7da9f47Christian König
400e5f78a74f8294ee02015552db664dae1e7da9f47Christian Königstatic bool
401e5f78a74f8294ee02015552db664dae1e7da9f47Christian Königinit_shaders(struct vl_compositor *c)
402e5f78a74f8294ee02015552db664dae1e7da9f47Christian König{
403e5f78a74f8294ee02015552db664dae1e7da9f47Christian König   assert(c);
404e5f78a74f8294ee02015552db664dae1e7da9f47Christian König
405e5f78a74f8294ee02015552db664dae1e7da9f47Christian König   c->vs = create_vert_shader(c);
406e5f78a74f8294ee02015552db664dae1e7da9f47Christian König   if (!c->vs) {
407e5f78a74f8294ee02015552db664dae1e7da9f47Christian König      debug_printf("Unable to create vertex shader.\n");
408e57f7b7b107c610fa2d7f149f3441c2b4a9600cbYounes Manton      return false;
409e5f78a74f8294ee02015552db664dae1e7da9f47Christian König   }
410e5f78a74f8294ee02015552db664dae1e7da9f47Christian König
411e5f78a74f8294ee02015552db664dae1e7da9f47Christian König   c->fs_video_buffer = create_frag_shader_video_buffer(c);
412e5f78a74f8294ee02015552db664dae1e7da9f47Christian König   if (!c->fs_video_buffer) {
413e5f78a74f8294ee02015552db664dae1e7da9f47Christian König      debug_printf("Unable to create YCbCr-to-RGB fragment shader.\n");
414e5f78a74f8294ee02015552db664dae1e7da9f47Christian König      return false;
415e5f78a74f8294ee02015552db664dae1e7da9f47Christian König   }
416e5f78a74f8294ee02015552db664dae1e7da9f47Christian König
4172e18c2c6f86342e7ea77b0f1a1f731f879db0ed3Leo Liu   c->fs_weave_rgb = create_frag_shader_weave_rgb(c);
4182e18c2c6f86342e7ea77b0f1a1f731f879db0ed3Leo Liu   if (!c->fs_weave_rgb) {
4193841d3fd1358cd3ecbe71d173e52551420a07f4eChristian König      debug_printf("Unable to create YCbCr-to-RGB weave fragment shader.\n");
4203841d3fd1358cd3ecbe71d173e52551420a07f4eChristian König      return false;
4213841d3fd1358cd3ecbe71d173e52551420a07f4eChristian König   }
4223841d3fd1358cd3ecbe71d173e52551420a07f4eChristian König
42314761da9f9bc132b061d4cfa4d7dd93d1b113f6bLeo Liu   c->fs_weave_yuv.y = create_frag_shader_weave_yuv(c, true);
42414761da9f9bc132b061d4cfa4d7dd93d1b113f6bLeo Liu   c->fs_weave_yuv.uv = create_frag_shader_weave_yuv(c, false);
42514761da9f9bc132b061d4cfa4d7dd93d1b113f6bLeo Liu   if (!c->fs_weave_yuv.y || !c->fs_weave_yuv.uv) {
42614761da9f9bc132b061d4cfa4d7dd93d1b113f6bLeo Liu      debug_printf("Unable to create YCbCr i-to-YCbCr p weave fragment shader.\n");
42714761da9f9bc132b061d4cfa4d7dd93d1b113f6bLeo Liu      return false;
42814761da9f9bc132b061d4cfa4d7dd93d1b113f6bLeo Liu   }
42914761da9f9bc132b061d4cfa4d7dd93d1b113f6bLeo Liu
4304f37636afb5adc299ecbe497209702a47039580cChristian König   c->fs_palette.yuv = create_frag_shader_palette(c, true);
4314f37636afb5adc299ecbe497209702a47039580cChristian König   if (!c->fs_palette.yuv) {
4324f37636afb5adc299ecbe497209702a47039580cChristian König      debug_printf("Unable to create YUV-Palette-to-RGB fragment shader.\n");
4334f37636afb5adc299ecbe497209702a47039580cChristian König      return false;
4344f37636afb5adc299ecbe497209702a47039580cChristian König   }
4354f37636afb5adc299ecbe497209702a47039580cChristian König
4364f37636afb5adc299ecbe497209702a47039580cChristian König   c->fs_palette.rgb = create_frag_shader_palette(c, false);
4374f37636afb5adc299ecbe497209702a47039580cChristian König   if (!c->fs_palette.rgb) {
4384f37636afb5adc299ecbe497209702a47039580cChristian König      debug_printf("Unable to create RGB-Palette-to-RGB fragment shader.\n");
439e5f78a74f8294ee02015552db664dae1e7da9f47Christian König      return false;
440e5f78a74f8294ee02015552db664dae1e7da9f47Christian König   }
441e5f78a74f8294ee02015552db664dae1e7da9f47Christian König
442e5f78a74f8294ee02015552db664dae1e7da9f47Christian König   c->fs_rgba = create_frag_shader_rgba(c);
443e5f78a74f8294ee02015552db664dae1e7da9f47Christian König   if (!c->fs_rgba) {
444e5f78a74f8294ee02015552db664dae1e7da9f47Christian König      debug_printf("Unable to create RGB-to-RGB fragment shader.\n");
445e5f78a74f8294ee02015552db664dae1e7da9f47Christian König      return false;
446e5f78a74f8294ee02015552db664dae1e7da9f47Christian König   }
447f547472bfa0a797adacc2a7688b4c1ba65381a80Younes Manton
448e57f7b7b107c610fa2d7f149f3441c2b4a9600cbYounes Manton   return true;
449f547472bfa0a797adacc2a7688b4c1ba65381a80Younes Manton}
450f547472bfa0a797adacc2a7688b4c1ba65381a80Younes Manton
451e5f78a74f8294ee02015552db664dae1e7da9f47Christian Königstatic void cleanup_shaders(struct vl_compositor *c)
452e5f78a74f8294ee02015552db664dae1e7da9f47Christian König{
453e5f78a74f8294ee02015552db664dae1e7da9f47Christian König   assert(c);
454e5f78a74f8294ee02015552db664dae1e7da9f47Christian König
455e5f78a74f8294ee02015552db664dae1e7da9f47Christian König   c->pipe->delete_vs_state(c->pipe, c->vs);
456e5f78a74f8294ee02015552db664dae1e7da9f47Christian König   c->pipe->delete_fs_state(c->pipe, c->fs_video_buffer);
4572e18c2c6f86342e7ea77b0f1a1f731f879db0ed3Leo Liu   c->pipe->delete_fs_state(c->pipe, c->fs_weave_rgb);
45814761da9f9bc132b061d4cfa4d7dd93d1b113f6bLeo Liu   c->pipe->delete_fs_state(c->pipe, c->fs_weave_yuv.y);
45914761da9f9bc132b061d4cfa4d7dd93d1b113f6bLeo Liu   c->pipe->delete_fs_state(c->pipe, c->fs_weave_yuv.uv);
4604f37636afb5adc299ecbe497209702a47039580cChristian König   c->pipe->delete_fs_state(c->pipe, c->fs_palette.yuv);
4614f37636afb5adc299ecbe497209702a47039580cChristian König   c->pipe->delete_fs_state(c->pipe, c->fs_palette.rgb);
462e5f78a74f8294ee02015552db664dae1e7da9f47Christian König   c->pipe->delete_fs_state(c->pipe, c->fs_rgba);
463e5f78a74f8294ee02015552db664dae1e7da9f47Christian König}
464e5f78a74f8294ee02015552db664dae1e7da9f47Christian König
465f547472bfa0a797adacc2a7688b4c1ba65381a80Younes Mantonstatic bool
466f547472bfa0a797adacc2a7688b4c1ba65381a80Younes Mantoninit_pipe_state(struct vl_compositor *c)
467f547472bfa0a797adacc2a7688b4c1ba65381a80Younes Manton{
468255033e4819b096491dd987c3ca4d8ee32a7cdb6Christian König   struct pipe_rasterizer_state rast;
469f547472bfa0a797adacc2a7688b4c1ba65381a80Younes Manton   struct pipe_sampler_state sampler;
470c001c393713f36144701f3a61b6c7de7811898eeChristian König   struct pipe_blend_state blend;
4718082816e27a0ee376e679c4d81ff8a3f0611ea9eYounes Manton   struct pipe_depth_stencil_alpha_state dsa;
4728082816e27a0ee376e679c4d81ff8a3f0611ea9eYounes Manton   unsigned i;
473f547472bfa0a797adacc2a7688b4c1ba65381a80Younes Manton
474f547472bfa0a797adacc2a7688b4c1ba65381a80Younes Manton   assert(c);
475f547472bfa0a797adacc2a7688b4c1ba65381a80Younes Manton
476f547472bfa0a797adacc2a7688b4c1ba65381a80Younes Manton   c->fb_state.nr_cbufs = 1;
477f547472bfa0a797adacc2a7688b4c1ba65381a80Younes Manton   c->fb_state.zsbuf = NULL;
478f547472bfa0a797adacc2a7688b4c1ba65381a80Younes Manton
479de4c2b91f4dd2408422bcbdbf3e9cf3897533e6dChristian König   memset(&sampler, 0, sizeof(sampler));
480f547472bfa0a797adacc2a7688b4c1ba65381a80Younes Manton   sampler.wrap_s = PIPE_TEX_WRAP_CLAMP_TO_EDGE;
481f547472bfa0a797adacc2a7688b4c1ba65381a80Younes Manton   sampler.wrap_t = PIPE_TEX_WRAP_CLAMP_TO_EDGE;
4823841d3fd1358cd3ecbe71d173e52551420a07f4eChristian König   sampler.wrap_r = PIPE_TEX_WRAP_REPEAT;
483f547472bfa0a797adacc2a7688b4c1ba65381a80Younes Manton   sampler.min_img_filter = PIPE_TEX_FILTER_LINEAR;
484f547472bfa0a797adacc2a7688b4c1ba65381a80Younes Manton   sampler.min_mip_filter = PIPE_TEX_MIPFILTER_NONE;
485f547472bfa0a797adacc2a7688b4c1ba65381a80Younes Manton   sampler.mag_img_filter = PIPE_TEX_FILTER_LINEAR;
486f547472bfa0a797adacc2a7688b4c1ba65381a80Younes Manton   sampler.compare_mode = PIPE_TEX_COMPARE_NONE;
487f547472bfa0a797adacc2a7688b4c1ba65381a80Younes Manton   sampler.compare_func = PIPE_FUNC_ALWAYS;
488f547472bfa0a797adacc2a7688b4c1ba65381a80Younes Manton   sampler.normalized_coords = 1;
48976d881b8b086495081c0a3c8fea2278f1480f107Christian König
49076d881b8b086495081c0a3c8fea2278f1480f107Christian König   c->sampler_linear = c->pipe->create_sampler_state(c->pipe, &sampler);
49176d881b8b086495081c0a3c8fea2278f1480f107Christian König
49276d881b8b086495081c0a3c8fea2278f1480f107Christian König   sampler.min_img_filter = PIPE_TEX_FILTER_NEAREST;
49376d881b8b086495081c0a3c8fea2278f1480f107Christian König   sampler.mag_img_filter = PIPE_TEX_FILTER_NEAREST;
49476d881b8b086495081c0a3c8fea2278f1480f107Christian König   c->sampler_nearest = c->pipe->create_sampler_state(c->pipe, &sampler);
4955f730690f8166c94ee010605b6437a6fb2a7771dYounes Manton
496c001c393713f36144701f3a61b6c7de7811898eeChristian König   memset(&blend, 0, sizeof blend);
497c001c393713f36144701f3a61b6c7de7811898eeChristian König   blend.independent_blend_enable = 0;
4984f37636afb5adc299ecbe497209702a47039580cChristian König   blend.rt[0].blend_enable = 0;
4994f37636afb5adc299ecbe497209702a47039580cChristian König   blend.logicop_enable = 0;
5004f37636afb5adc299ecbe497209702a47039580cChristian König   blend.logicop_func = PIPE_LOGICOP_CLEAR;
5014f37636afb5adc299ecbe497209702a47039580cChristian König   blend.rt[0].colormask = PIPE_MASK_RGBA;
5024f37636afb5adc299ecbe497209702a47039580cChristian König   blend.dither = 0;
5034f37636afb5adc299ecbe497209702a47039580cChristian König   c->blend_clear = c->pipe->create_blend_state(c->pipe, &blend);
5044f37636afb5adc299ecbe497209702a47039580cChristian König
505c001c393713f36144701f3a61b6c7de7811898eeChristian König   blend.rt[0].blend_enable = 1;
506c001c393713f36144701f3a61b6c7de7811898eeChristian König   blend.rt[0].rgb_func = PIPE_BLEND_ADD;
507c001c393713f36144701f3a61b6c7de7811898eeChristian König   blend.rt[0].rgb_src_factor = PIPE_BLENDFACTOR_SRC_ALPHA;
508c001c393713f36144701f3a61b6c7de7811898eeChristian König   blend.rt[0].rgb_dst_factor = PIPE_BLENDFACTOR_INV_SRC_ALPHA;
509c001c393713f36144701f3a61b6c7de7811898eeChristian König   blend.rt[0].alpha_func = PIPE_BLEND_ADD;
510c001c393713f36144701f3a61b6c7de7811898eeChristian König   blend.rt[0].alpha_src_factor = PIPE_BLENDFACTOR_ONE;
511c001c393713f36144701f3a61b6c7de7811898eeChristian König   blend.rt[0].alpha_dst_factor = PIPE_BLENDFACTOR_ONE;
5124f37636afb5adc299ecbe497209702a47039580cChristian König   c->blend_add = c->pipe->create_blend_state(c->pipe, &blend);
513c001c393713f36144701f3a61b6c7de7811898eeChristian König
514255033e4819b096491dd987c3ca4d8ee32a7cdb6Christian König   memset(&rast, 0, sizeof rast);
515b90727bb241e4a04158d34aad078cb18e478fea7Christian König   rast.flatshade = 0;
516255033e4819b096491dd987c3ca4d8ee32a7cdb6Christian König   rast.front_ccw = 1;
517255033e4819b096491dd987c3ca4d8ee32a7cdb6Christian König   rast.cull_face = PIPE_FACE_NONE;
518255033e4819b096491dd987c3ca4d8ee32a7cdb6Christian König   rast.fill_back = PIPE_POLYGON_MODE_FILL;
519255033e4819b096491dd987c3ca4d8ee32a7cdb6Christian König   rast.fill_front = PIPE_POLYGON_MODE_FILL;
520255033e4819b096491dd987c3ca4d8ee32a7cdb6Christian König   rast.scissor = 1;
521255033e4819b096491dd987c3ca4d8ee32a7cdb6Christian König   rast.line_width = 1;
522255033e4819b096491dd987c3ca4d8ee32a7cdb6Christian König   rast.point_size_per_vertex = 1;
523255033e4819b096491dd987c3ca4d8ee32a7cdb6Christian König   rast.offset_units = 1;
524255033e4819b096491dd987c3ca4d8ee32a7cdb6Christian König   rast.offset_scale = 1;
5252737abb44efebfa10ac84b183c20fc5818d1514eJosé Fonseca   rast.half_pixel_center = 1;
5262737abb44efebfa10ac84b183c20fc5818d1514eJosé Fonseca   rast.bottom_edge_rule = 1;
527dc4c821f0817a3db716f965692fb701079f66340Marek Olšák   rast.depth_clip = 1;
528255033e4819b096491dd987c3ca4d8ee32a7cdb6Christian König
529255033e4819b096491dd987c3ca4d8ee32a7cdb6Christian König   c->rast = c->pipe->create_rasterizer_state(c->pipe, &rast);
530255033e4819b096491dd987c3ca4d8ee32a7cdb6Christian König
5318082816e27a0ee376e679c4d81ff8a3f0611ea9eYounes Manton   memset(&dsa, 0, sizeof dsa);
5328082816e27a0ee376e679c4d81ff8a3f0611ea9eYounes Manton   dsa.depth.enabled = 0;
5338082816e27a0ee376e679c4d81ff8a3f0611ea9eYounes Manton   dsa.depth.writemask = 0;
5348082816e27a0ee376e679c4d81ff8a3f0611ea9eYounes Manton   dsa.depth.func = PIPE_FUNC_ALWAYS;
5358082816e27a0ee376e679c4d81ff8a3f0611ea9eYounes Manton   for (i = 0; i < 2; ++i) {
5368082816e27a0ee376e679c4d81ff8a3f0611ea9eYounes Manton      dsa.stencil[i].enabled = 0;
5378082816e27a0ee376e679c4d81ff8a3f0611ea9eYounes Manton      dsa.stencil[i].func = PIPE_FUNC_ALWAYS;
5388082816e27a0ee376e679c4d81ff8a3f0611ea9eYounes Manton      dsa.stencil[i].fail_op = PIPE_STENCIL_OP_KEEP;
5398082816e27a0ee376e679c4d81ff8a3f0611ea9eYounes Manton      dsa.stencil[i].zpass_op = PIPE_STENCIL_OP_KEEP;
5408082816e27a0ee376e679c4d81ff8a3f0611ea9eYounes Manton      dsa.stencil[i].zfail_op = PIPE_STENCIL_OP_KEEP;
5418082816e27a0ee376e679c4d81ff8a3f0611ea9eYounes Manton      dsa.stencil[i].valuemask = 0;
5428082816e27a0ee376e679c4d81ff8a3f0611ea9eYounes Manton      dsa.stencil[i].writemask = 0;
5438082816e27a0ee376e679c4d81ff8a3f0611ea9eYounes Manton   }
5448082816e27a0ee376e679c4d81ff8a3f0611ea9eYounes Manton   dsa.alpha.enabled = 0;
5458082816e27a0ee376e679c4d81ff8a3f0611ea9eYounes Manton   dsa.alpha.func = PIPE_FUNC_ALWAYS;
5468082816e27a0ee376e679c4d81ff8a3f0611ea9eYounes Manton   dsa.alpha.ref_value = 0;
5478082816e27a0ee376e679c4d81ff8a3f0611ea9eYounes Manton   c->dsa = c->pipe->create_depth_stencil_alpha_state(c->pipe, &dsa);
5488082816e27a0ee376e679c4d81ff8a3f0611ea9eYounes Manton   c->pipe->bind_depth_stencil_alpha_state(c->pipe, c->dsa);
54902e191cb6aa13286fff956a7929959d7cee7241dEmeric Grange
550f547472bfa0a797adacc2a7688b4c1ba65381a80Younes Manton   return true;
551f547472bfa0a797adacc2a7688b4c1ba65381a80Younes Manton}
552f547472bfa0a797adacc2a7688b4c1ba65381a80Younes Manton
553f547472bfa0a797adacc2a7688b4c1ba65381a80Younes Mantonstatic void cleanup_pipe_state(struct vl_compositor *c)
554f547472bfa0a797adacc2a7688b4c1ba65381a80Younes Manton{
555f547472bfa0a797adacc2a7688b4c1ba65381a80Younes Manton   assert(c);
5565f730690f8166c94ee010605b6437a6fb2a7771dYounes Manton
5578082816e27a0ee376e679c4d81ff8a3f0611ea9eYounes Manton   /* Asserted in softpipe_delete_fs_state() for some reason */
5588082816e27a0ee376e679c4d81ff8a3f0611ea9eYounes Manton   c->pipe->bind_vs_state(c->pipe, NULL);
5598082816e27a0ee376e679c4d81ff8a3f0611ea9eYounes Manton   c->pipe->bind_fs_state(c->pipe, NULL);
5608082816e27a0ee376e679c4d81ff8a3f0611ea9eYounes Manton
5618082816e27a0ee376e679c4d81ff8a3f0611ea9eYounes Manton   c->pipe->delete_depth_stencil_alpha_state(c->pipe, c->dsa);
56276d881b8b086495081c0a3c8fea2278f1480f107Christian König   c->pipe->delete_sampler_state(c->pipe, c->sampler_linear);
56376d881b8b086495081c0a3c8fea2278f1480f107Christian König   c->pipe->delete_sampler_state(c->pipe, c->sampler_nearest);
5644f37636afb5adc299ecbe497209702a47039580cChristian König   c->pipe->delete_blend_state(c->pipe, c->blend_clear);
5654f37636afb5adc299ecbe497209702a47039580cChristian König   c->pipe->delete_blend_state(c->pipe, c->blend_add);
566255033e4819b096491dd987c3ca4d8ee32a7cdb6Christian König   c->pipe->delete_rasterizer_state(c->pipe, c->rast);
567f547472bfa0a797adacc2a7688b4c1ba65381a80Younes Manton}
568f547472bfa0a797adacc2a7688b4c1ba65381a80Younes Manton
569f547472bfa0a797adacc2a7688b4c1ba65381a80Younes Mantonstatic bool
570f547472bfa0a797adacc2a7688b4c1ba65381a80Younes Mantoninit_buffers(struct vl_compositor *c)
571f547472bfa0a797adacc2a7688b4c1ba65381a80Younes Manton{
572b90727bb241e4a04158d34aad078cb18e478fea7Christian König   struct pipe_vertex_element vertex_elems[3];
573e00da1476fcdf8e5877fc1e62118080f5c4193f0Younes Manton
574f547472bfa0a797adacc2a7688b4c1ba65381a80Younes Manton   assert(c);
5755f730690f8166c94ee010605b6437a6fb2a7771dYounes Manton
576f547472bfa0a797adacc2a7688b4c1ba65381a80Younes Manton   /*
5775f730690f8166c94ee010605b6437a6fb2a7771dYounes Manton    * Create our vertex buffer and vertex buffer elements
578f547472bfa0a797adacc2a7688b4c1ba65381a80Younes Manton    */
579b90727bb241e4a04158d34aad078cb18e478fea7Christian König   c->vertex_buf.stride = sizeof(struct vertex2f) + sizeof(struct vertex4f) * 2;
5805f730690f8166c94ee010605b6437a6fb2a7771dYounes Manton   c->vertex_buf.buffer_offset = 0;
5812b033f3aab8267eb6499954fe4a582472f91ef28Marek Olšák   c->vertex_buf.buffer = NULL;
582f547472bfa0a797adacc2a7688b4c1ba65381a80Younes Manton
583a8ea1dacc63ac567498049e5756c247b9fec6cd9Younes Manton   vertex_elems[0].src_offset = 0;
584a8ea1dacc63ac567498049e5756c247b9fec6cd9Younes Manton   vertex_elems[0].instance_divisor = 0;
585a8ea1dacc63ac567498049e5756c247b9fec6cd9Younes Manton   vertex_elems[0].vertex_buffer_index = 0;
586a8ea1dacc63ac567498049e5756c247b9fec6cd9Younes Manton   vertex_elems[0].src_format = PIPE_FORMAT_R32G32_FLOAT;
587a8ea1dacc63ac567498049e5756c247b9fec6cd9Younes Manton   vertex_elems[1].src_offset = sizeof(struct vertex2f);
588a8ea1dacc63ac567498049e5756c247b9fec6cd9Younes Manton   vertex_elems[1].instance_divisor = 0;
589a8ea1dacc63ac567498049e5756c247b9fec6cd9Younes Manton   vertex_elems[1].vertex_buffer_index = 0;
5903841d3fd1358cd3ecbe71d173e52551420a07f4eChristian König   vertex_elems[1].src_format = PIPE_FORMAT_R32G32B32A32_FLOAT;
591b90727bb241e4a04158d34aad078cb18e478fea7Christian König   vertex_elems[2].src_offset = sizeof(struct vertex2f) + sizeof(struct vertex4f);
592b90727bb241e4a04158d34aad078cb18e478fea7Christian König   vertex_elems[2].instance_divisor = 0;
593b90727bb241e4a04158d34aad078cb18e478fea7Christian König   vertex_elems[2].vertex_buffer_index = 0;
594b90727bb241e4a04158d34aad078cb18e478fea7Christian König   vertex_elems[2].src_format = PIPE_FORMAT_R32G32B32A32_FLOAT;
595b90727bb241e4a04158d34aad078cb18e478fea7Christian König   c->vertex_elems_state = c->pipe->create_vertex_elements_state(c->pipe, 3, vertex_elems);
596f547472bfa0a797adacc2a7688b4c1ba65381a80Younes Manton
597f547472bfa0a797adacc2a7688b4c1ba65381a80Younes Manton   return true;
598f547472bfa0a797adacc2a7688b4c1ba65381a80Younes Manton}
599f547472bfa0a797adacc2a7688b4c1ba65381a80Younes Manton
600f547472bfa0a797adacc2a7688b4c1ba65381a80Younes Mantonstatic void
601f547472bfa0a797adacc2a7688b4c1ba65381a80Younes Mantoncleanup_buffers(struct vl_compositor *c)
602f547472bfa0a797adacc2a7688b4c1ba65381a80Younes Manton{
603f547472bfa0a797adacc2a7688b4c1ba65381a80Younes Manton   assert(c);
604f547472bfa0a797adacc2a7688b4c1ba65381a80Younes Manton
605a8ea1dacc63ac567498049e5756c247b9fec6cd9Younes Manton   c->pipe->delete_vertex_elements_state(c->pipe, c->vertex_elems_state);
606a8ea1dacc63ac567498049e5756c247b9fec6cd9Younes Manton   pipe_resource_reference(&c->vertex_buf.buffer, NULL);
607f547472bfa0a797adacc2a7688b4c1ba65381a80Younes Manton}
608f547472bfa0a797adacc2a7688b4c1ba65381a80Younes Manton
609a2a1a5805fd617e7f3cc8be44dd79b50da07ebb9Ilia Mirkinstatic inline struct u_rect
610e5f78a74f8294ee02015552db664dae1e7da9f47Christian Königdefault_rect(struct vl_compositor_layer *layer)
611f547472bfa0a797adacc2a7688b4c1ba65381a80Younes Manton{
612e5f78a74f8294ee02015552db664dae1e7da9f47Christian König   struct pipe_resource *res = layer->sampler_views[0]->texture;
6137d2f2a0c890b1993532a45c8c392c28950ddc06eChristian König   struct u_rect rect = { 0, res->width0, 0, res->height0 * res->array_size };
614e5f78a74f8294ee02015552db664dae1e7da9f47Christian König   return rect;
615f547472bfa0a797adacc2a7688b4c1ba65381a80Younes Manton}
616f547472bfa0a797adacc2a7688b4c1ba65381a80Younes Manton
617a2a1a5805fd617e7f3cc8be44dd79b50da07ebb9Ilia Mirkinstatic inline struct vertex2f
618d645dc65b6c5e7d46538e98208a703f0f7a5d20bChristian Königcalc_topleft(struct vertex2f size, struct u_rect rect)
6196092fbed46302e2bdf6c6f2e229f4e393652e228Christian König{
620d645dc65b6c5e7d46538e98208a703f0f7a5d20bChristian König   struct vertex2f res = { rect.x0 / size.x, rect.y0 / size.y };
6216092fbed46302e2bdf6c6f2e229f4e393652e228Christian König   return res;
6226092fbed46302e2bdf6c6f2e229f4e393652e228Christian König}
6236092fbed46302e2bdf6c6f2e229f4e393652e228Christian König
624a2a1a5805fd617e7f3cc8be44dd79b50da07ebb9Ilia Mirkinstatic inline struct vertex2f
625d645dc65b6c5e7d46538e98208a703f0f7a5d20bChristian Königcalc_bottomright(struct vertex2f size, struct u_rect rect)
6266092fbed46302e2bdf6c6f2e229f4e393652e228Christian König{
627d645dc65b6c5e7d46538e98208a703f0f7a5d20bChristian König   struct vertex2f res = { rect.x1 / size.x, rect.y1 / size.y };
6286092fbed46302e2bdf6c6f2e229f4e393652e228Christian König   return res;
6296092fbed46302e2bdf6c6f2e229f4e393652e228Christian König}
6306092fbed46302e2bdf6c6f2e229f4e393652e228Christian König
631a2a1a5805fd617e7f3cc8be44dd79b50da07ebb9Ilia Mirkinstatic inline void
6326092fbed46302e2bdf6c6f2e229f4e393652e228Christian Königcalc_src_and_dst(struct vl_compositor_layer *layer, unsigned width, unsigned height,
633d645dc65b6c5e7d46538e98208a703f0f7a5d20bChristian König                 struct u_rect src, struct u_rect dst)
6346092fbed46302e2bdf6c6f2e229f4e393652e228Christian König{
635a67a0bb60c9f17608fe78467263ef7dbc5b49b0aChristian König   struct vertex2f size =  { width, height };
6366092fbed46302e2bdf6c6f2e229f4e393652e228Christian König
637a67a0bb60c9f17608fe78467263ef7dbc5b49b0aChristian König   layer->src.tl = calc_topleft(size, src);
638a67a0bb60c9f17608fe78467263ef7dbc5b49b0aChristian König   layer->src.br = calc_bottomright(size, src);
639a67a0bb60c9f17608fe78467263ef7dbc5b49b0aChristian König   layer->dst.tl = calc_topleft(size, dst);
640a67a0bb60c9f17608fe78467263ef7dbc5b49b0aChristian König   layer->dst.br = calc_bottomright(size, dst);
64137f97e1753af20a7161f61e99cb203b214e00641Christian König   layer->zw.x = 0.0f;
64237f97e1753af20a7161f61e99cb203b214e00641Christian König   layer->zw.y = size.y;
6436092fbed46302e2bdf6c6f2e229f4e393652e228Christian König}
6446092fbed46302e2bdf6c6f2e229f4e393652e228Christian König
645e5f78a74f8294ee02015552db664dae1e7da9f47Christian Königstatic void
6463841d3fd1358cd3ecbe71d173e52551420a07f4eChristian Königgen_rect_verts(struct vertex2f *vb, struct vl_compositor_layer *layer)
6475f730690f8166c94ee010605b6437a6fb2a7771dYounes Manton{
648e7e207658c6adb3dfd98038c248efde70fd43056Kusanagi Kouichi   struct vertex2f tl, tr, br, bl;
649e7e207658c6adb3dfd98038c248efde70fd43056Kusanagi Kouichi
6506092fbed46302e2bdf6c6f2e229f4e393652e228Christian König   assert(vb && layer);
6516092fbed46302e2bdf6c6f2e229f4e393652e228Christian König
652e7e207658c6adb3dfd98038c248efde70fd43056Kusanagi Kouichi   switch (layer->rotate) {
653e7e207658c6adb3dfd98038c248efde70fd43056Kusanagi Kouichi   default:
654e7e207658c6adb3dfd98038c248efde70fd43056Kusanagi Kouichi   case VL_COMPOSITOR_ROTATE_0:
655e7e207658c6adb3dfd98038c248efde70fd43056Kusanagi Kouichi      tl = layer->dst.tl;
656e7e207658c6adb3dfd98038c248efde70fd43056Kusanagi Kouichi      tr.x = layer->dst.br.x;
657e7e207658c6adb3dfd98038c248efde70fd43056Kusanagi Kouichi      tr.y = layer->dst.tl.y;
658e7e207658c6adb3dfd98038c248efde70fd43056Kusanagi Kouichi      br = layer->dst.br;
659e7e207658c6adb3dfd98038c248efde70fd43056Kusanagi Kouichi      bl.x = layer->dst.tl.x;
660e7e207658c6adb3dfd98038c248efde70fd43056Kusanagi Kouichi      bl.y = layer->dst.br.y;
661e7e207658c6adb3dfd98038c248efde70fd43056Kusanagi Kouichi      break;
662e7e207658c6adb3dfd98038c248efde70fd43056Kusanagi Kouichi   case VL_COMPOSITOR_ROTATE_90:
663e7e207658c6adb3dfd98038c248efde70fd43056Kusanagi Kouichi      tl.x = layer->dst.br.x;
664e7e207658c6adb3dfd98038c248efde70fd43056Kusanagi Kouichi      tl.y = layer->dst.tl.y;
665e7e207658c6adb3dfd98038c248efde70fd43056Kusanagi Kouichi      tr = layer->dst.br;
666e7e207658c6adb3dfd98038c248efde70fd43056Kusanagi Kouichi      br.x = layer->dst.tl.x;
667e7e207658c6adb3dfd98038c248efde70fd43056Kusanagi Kouichi      br.y = layer->dst.br.y;
668e7e207658c6adb3dfd98038c248efde70fd43056Kusanagi Kouichi      bl = layer->dst.tl;
669e7e207658c6adb3dfd98038c248efde70fd43056Kusanagi Kouichi      break;
670e7e207658c6adb3dfd98038c248efde70fd43056Kusanagi Kouichi   case VL_COMPOSITOR_ROTATE_180:
671e7e207658c6adb3dfd98038c248efde70fd43056Kusanagi Kouichi      tl = layer->dst.br;
672e7e207658c6adb3dfd98038c248efde70fd43056Kusanagi Kouichi      tr.x = layer->dst.tl.x;
673e7e207658c6adb3dfd98038c248efde70fd43056Kusanagi Kouichi      tr.y = layer->dst.br.y;
674e7e207658c6adb3dfd98038c248efde70fd43056Kusanagi Kouichi      br = layer->dst.tl;
675e7e207658c6adb3dfd98038c248efde70fd43056Kusanagi Kouichi      bl.x = layer->dst.br.x;
676e7e207658c6adb3dfd98038c248efde70fd43056Kusanagi Kouichi      bl.y = layer->dst.tl.y;
677e7e207658c6adb3dfd98038c248efde70fd43056Kusanagi Kouichi      break;
678e7e207658c6adb3dfd98038c248efde70fd43056Kusanagi Kouichi   case VL_COMPOSITOR_ROTATE_270:
679e7e207658c6adb3dfd98038c248efde70fd43056Kusanagi Kouichi      tl.x = layer->dst.tl.x;
680e7e207658c6adb3dfd98038c248efde70fd43056Kusanagi Kouichi      tl.y = layer->dst.br.y;
681e7e207658c6adb3dfd98038c248efde70fd43056Kusanagi Kouichi      tr = layer->dst.tl;
682e7e207658c6adb3dfd98038c248efde70fd43056Kusanagi Kouichi      br.x = layer->dst.br.x;
683e7e207658c6adb3dfd98038c248efde70fd43056Kusanagi Kouichi      br.y = layer->dst.tl.y;
684e7e207658c6adb3dfd98038c248efde70fd43056Kusanagi Kouichi      bl = layer->dst.br;
685e7e207658c6adb3dfd98038c248efde70fd43056Kusanagi Kouichi      break;
686e7e207658c6adb3dfd98038c248efde70fd43056Kusanagi Kouichi   }
687e7e207658c6adb3dfd98038c248efde70fd43056Kusanagi Kouichi
688e7e207658c6adb3dfd98038c248efde70fd43056Kusanagi Kouichi   vb[ 0].x = tl.x;
689e7e207658c6adb3dfd98038c248efde70fd43056Kusanagi Kouichi   vb[ 0].y = tl.y;
6903841d3fd1358cd3ecbe71d173e52551420a07f4eChristian König   vb[ 1].x = layer->src.tl.x;
6913841d3fd1358cd3ecbe71d173e52551420a07f4eChristian König   vb[ 1].y = layer->src.tl.y;
69237f97e1753af20a7161f61e99cb203b214e00641Christian König   vb[ 2] = layer->zw;
693b90727bb241e4a04158d34aad078cb18e478fea7Christian König   vb[ 3].x = layer->colors[0].x;
694b90727bb241e4a04158d34aad078cb18e478fea7Christian König   vb[ 3].y = layer->colors[0].y;
695b90727bb241e4a04158d34aad078cb18e478fea7Christian König   vb[ 4].x = layer->colors[0].z;
696b90727bb241e4a04158d34aad078cb18e478fea7Christian König   vb[ 4].y = layer->colors[0].w;
697b90727bb241e4a04158d34aad078cb18e478fea7Christian König
698e7e207658c6adb3dfd98038c248efde70fd43056Kusanagi Kouichi   vb[ 5].x = tr.x;
699e7e207658c6adb3dfd98038c248efde70fd43056Kusanagi Kouichi   vb[ 5].y = tr.y;
700b90727bb241e4a04158d34aad078cb18e478fea7Christian König   vb[ 6].x = layer->src.br.x;
701b90727bb241e4a04158d34aad078cb18e478fea7Christian König   vb[ 6].y = layer->src.tl.y;
702b90727bb241e4a04158d34aad078cb18e478fea7Christian König   vb[ 7] = layer->zw;
703b90727bb241e4a04158d34aad078cb18e478fea7Christian König   vb[ 8].x = layer->colors[1].x;
704b90727bb241e4a04158d34aad078cb18e478fea7Christian König   vb[ 8].y = layer->colors[1].y;
705b90727bb241e4a04158d34aad078cb18e478fea7Christian König   vb[ 9].x = layer->colors[1].z;
706b90727bb241e4a04158d34aad078cb18e478fea7Christian König   vb[ 9].y = layer->colors[1].w;
707b90727bb241e4a04158d34aad078cb18e478fea7Christian König
708e7e207658c6adb3dfd98038c248efde70fd43056Kusanagi Kouichi   vb[10].x = br.x;
709e7e207658c6adb3dfd98038c248efde70fd43056Kusanagi Kouichi   vb[10].y = br.y;
710b90727bb241e4a04158d34aad078cb18e478fea7Christian König   vb[11].x = layer->src.br.x;
711b90727bb241e4a04158d34aad078cb18e478fea7Christian König   vb[11].y = layer->src.br.y;
712b90727bb241e4a04158d34aad078cb18e478fea7Christian König   vb[12] = layer->zw;
713b90727bb241e4a04158d34aad078cb18e478fea7Christian König   vb[13].x = layer->colors[2].x;
714b90727bb241e4a04158d34aad078cb18e478fea7Christian König   vb[13].y = layer->colors[2].y;
715b90727bb241e4a04158d34aad078cb18e478fea7Christian König   vb[14].x = layer->colors[2].z;
716b90727bb241e4a04158d34aad078cb18e478fea7Christian König   vb[14].y = layer->colors[2].w;
717b90727bb241e4a04158d34aad078cb18e478fea7Christian König
718e7e207658c6adb3dfd98038c248efde70fd43056Kusanagi Kouichi   vb[15].x = bl.x;
719e7e207658c6adb3dfd98038c248efde70fd43056Kusanagi Kouichi   vb[15].y = bl.y;
720b90727bb241e4a04158d34aad078cb18e478fea7Christian König   vb[16].x = layer->src.tl.x;
721b90727bb241e4a04158d34aad078cb18e478fea7Christian König   vb[16].y = layer->src.br.y;
722b90727bb241e4a04158d34aad078cb18e478fea7Christian König   vb[17] = layer->zw;
723b90727bb241e4a04158d34aad078cb18e478fea7Christian König   vb[18].x = layer->colors[3].x;
724b90727bb241e4a04158d34aad078cb18e478fea7Christian König   vb[18].y = layer->colors[3].y;
725b90727bb241e4a04158d34aad078cb18e478fea7Christian König   vb[19].x = layer->colors[3].z;
726b90727bb241e4a04158d34aad078cb18e478fea7Christian König   vb[19].y = layer->colors[3].w;
7275f730690f8166c94ee010605b6437a6fb2a7771dYounes Manton}
7285f730690f8166c94ee010605b6437a6fb2a7771dYounes Manton
729a2a1a5805fd617e7f3cc8be44dd79b50da07ebb9Ilia Mirkinstatic inline struct u_rect
73032c4381d4a0479b3d9bfe305ce701be6b5ac8e18Christian Königcalc_drawn_area(struct vl_compositor_state *s, struct vl_compositor_layer *layer)
731167b1b32c5ff30d514253072ce54513112c03d4dChristian König{
732e7e207658c6adb3dfd98038c248efde70fd43056Kusanagi Kouichi   struct vertex2f tl, br;
733167b1b32c5ff30d514253072ce54513112c03d4dChristian König   struct u_rect result;
734167b1b32c5ff30d514253072ce54513112c03d4dChristian König
735e7e207658c6adb3dfd98038c248efde70fd43056Kusanagi Kouichi   assert(s && layer);
736e7e207658c6adb3dfd98038c248efde70fd43056Kusanagi Kouichi
737e7e207658c6adb3dfd98038c248efde70fd43056Kusanagi Kouichi   // rotate
738e7e207658c6adb3dfd98038c248efde70fd43056Kusanagi Kouichi   switch (layer->rotate) {
739e7e207658c6adb3dfd98038c248efde70fd43056Kusanagi Kouichi   default:
740e7e207658c6adb3dfd98038c248efde70fd43056Kusanagi Kouichi   case VL_COMPOSITOR_ROTATE_0:
741e7e207658c6adb3dfd98038c248efde70fd43056Kusanagi Kouichi      tl = layer->dst.tl;
742e7e207658c6adb3dfd98038c248efde70fd43056Kusanagi Kouichi      br = layer->dst.br;
743e7e207658c6adb3dfd98038c248efde70fd43056Kusanagi Kouichi      break;
744e7e207658c6adb3dfd98038c248efde70fd43056Kusanagi Kouichi   case VL_COMPOSITOR_ROTATE_90:
745e7e207658c6adb3dfd98038c248efde70fd43056Kusanagi Kouichi      tl.x = layer->dst.br.x;
746e7e207658c6adb3dfd98038c248efde70fd43056Kusanagi Kouichi      tl.y = layer->dst.tl.y;
747e7e207658c6adb3dfd98038c248efde70fd43056Kusanagi Kouichi      br.x = layer->dst.tl.x;
748e7e207658c6adb3dfd98038c248efde70fd43056Kusanagi Kouichi      br.y = layer->dst.br.y;
749e7e207658c6adb3dfd98038c248efde70fd43056Kusanagi Kouichi      break;
750e7e207658c6adb3dfd98038c248efde70fd43056Kusanagi Kouichi   case VL_COMPOSITOR_ROTATE_180:
751e7e207658c6adb3dfd98038c248efde70fd43056Kusanagi Kouichi      tl = layer->dst.br;
752e7e207658c6adb3dfd98038c248efde70fd43056Kusanagi Kouichi      br = layer->dst.tl;
753e7e207658c6adb3dfd98038c248efde70fd43056Kusanagi Kouichi      break;
754e7e207658c6adb3dfd98038c248efde70fd43056Kusanagi Kouichi   case VL_COMPOSITOR_ROTATE_270:
755e7e207658c6adb3dfd98038c248efde70fd43056Kusanagi Kouichi      tl.x = layer->dst.tl.x;
756e7e207658c6adb3dfd98038c248efde70fd43056Kusanagi Kouichi      tl.y = layer->dst.br.y;
757e7e207658c6adb3dfd98038c248efde70fd43056Kusanagi Kouichi      br.x = layer->dst.br.x;
758e7e207658c6adb3dfd98038c248efde70fd43056Kusanagi Kouichi      br.y = layer->dst.tl.y;
759e7e207658c6adb3dfd98038c248efde70fd43056Kusanagi Kouichi      break;
760e7e207658c6adb3dfd98038c248efde70fd43056Kusanagi Kouichi   }
761e7e207658c6adb3dfd98038c248efde70fd43056Kusanagi Kouichi
762167b1b32c5ff30d514253072ce54513112c03d4dChristian König   // scale
763e7e207658c6adb3dfd98038c248efde70fd43056Kusanagi Kouichi   result.x0 = tl.x * layer->viewport.scale[0] + layer->viewport.translate[0];
764e7e207658c6adb3dfd98038c248efde70fd43056Kusanagi Kouichi   result.y0 = tl.y * layer->viewport.scale[1] + layer->viewport.translate[1];
765e7e207658c6adb3dfd98038c248efde70fd43056Kusanagi Kouichi   result.x1 = br.x * layer->viewport.scale[0] + layer->viewport.translate[0];
766e7e207658c6adb3dfd98038c248efde70fd43056Kusanagi Kouichi   result.y1 = br.y * layer->viewport.scale[1] + layer->viewport.translate[1];
767167b1b32c5ff30d514253072ce54513112c03d4dChristian König
768167b1b32c5ff30d514253072ce54513112c03d4dChristian König   // and clip
76932c4381d4a0479b3d9bfe305ce701be6b5ac8e18Christian König   result.x0 = MAX2(result.x0, s->scissor.minx);
77032c4381d4a0479b3d9bfe305ce701be6b5ac8e18Christian König   result.y0 = MAX2(result.y0, s->scissor.miny);
77132c4381d4a0479b3d9bfe305ce701be6b5ac8e18Christian König   result.x1 = MIN2(result.x1, s->scissor.maxx);
77232c4381d4a0479b3d9bfe305ce701be6b5ac8e18Christian König   result.y1 = MIN2(result.y1, s->scissor.maxy);
773167b1b32c5ff30d514253072ce54513112c03d4dChristian König   return result;
774167b1b32c5ff30d514253072ce54513112c03d4dChristian König}
775167b1b32c5ff30d514253072ce54513112c03d4dChristian König
776e5f78a74f8294ee02015552db664dae1e7da9f47Christian Königstatic void
77732c4381d4a0479b3d9bfe305ce701be6b5ac8e18Christian Königgen_vertex_data(struct vl_compositor *c, struct vl_compositor_state *s, struct u_rect *dirty)
7785f730690f8166c94ee010605b6437a6fb2a7771dYounes Manton{
7793841d3fd1358cd3ecbe71d173e52551420a07f4eChristian König   struct vertex2f *vb;
7805f730690f8166c94ee010605b6437a6fb2a7771dYounes Manton   unsigned i;
7815f730690f8166c94ee010605b6437a6fb2a7771dYounes Manton
7825f730690f8166c94ee010605b6437a6fb2a7771dYounes Manton   assert(c);
7835f730690f8166c94ee010605b6437a6fb2a7771dYounes Manton
7842b033f3aab8267eb6499954fe4a582472f91ef28Marek Olšák   /* Allocate new memory for vertices. */
7852b033f3aab8267eb6499954fe4a582472f91ef28Marek Olšák   u_upload_alloc(c->upload, 0,
7862b033f3aab8267eb6499954fe4a582472f91ef28Marek Olšák                  c->vertex_buf.stride * VL_COMPOSITOR_MAX_LAYERS * 4, /* size */
787020009f7ccdffa84c6e1649c4e915954f5fd7cc0Marek Olšák                  4, /* alignment */
7882b033f3aab8267eb6499954fe4a582472f91ef28Marek Olšák                  &c->vertex_buf.buffer_offset, &c->vertex_buf.buffer,
7892b033f3aab8267eb6499954fe4a582472f91ef28Marek Olšák                  (void**)&vb);
79080468464897682b8e10aeab310f20fdd7ddc6cb4Younes Manton
791e5f78a74f8294ee02015552db664dae1e7da9f47Christian König   for (i = 0; i < VL_COMPOSITOR_MAX_LAYERS; i++) {
79232c4381d4a0479b3d9bfe305ce701be6b5ac8e18Christian König      if (s->used_layers & (1 << i)) {
79332c4381d4a0479b3d9bfe305ce701be6b5ac8e18Christian König         struct vl_compositor_layer *layer = &s->layers[i];
7940d53cb2e83cafb7007068192674a8b5b57a27ca4Christian König         gen_rect_verts(vb, layer);
795b90727bb241e4a04158d34aad078cb18e478fea7Christian König         vb += 20;
7960d53cb2e83cafb7007068192674a8b5b57a27ca4Christian König
79774a4e9089488e7f341d21053bbf2d4aa52b99b70Christian König         if (!layer->viewport_valid) {
79874a4e9089488e7f341d21053bbf2d4aa52b99b70Christian König            layer->viewport.scale[0] = c->fb_state.width;
79974a4e9089488e7f341d21053bbf2d4aa52b99b70Christian König            layer->viewport.scale[1] = c->fb_state.height;
80074a4e9089488e7f341d21053bbf2d4aa52b99b70Christian König            layer->viewport.translate[0] = 0;
80174a4e9089488e7f341d21053bbf2d4aa52b99b70Christian König            layer->viewport.translate[1] = 0;
80274a4e9089488e7f341d21053bbf2d4aa52b99b70Christian König         }
80374a4e9089488e7f341d21053bbf2d4aa52b99b70Christian König
804167b1b32c5ff30d514253072ce54513112c03d4dChristian König         if (dirty && layer->clearing) {
80532c4381d4a0479b3d9bfe305ce701be6b5ac8e18Christian König            struct u_rect drawn = calc_drawn_area(s, layer);
806167b1b32c5ff30d514253072ce54513112c03d4dChristian König            if (
807167b1b32c5ff30d514253072ce54513112c03d4dChristian König             dirty->x0 >= drawn.x0 &&
808167b1b32c5ff30d514253072ce54513112c03d4dChristian König             dirty->y0 >= drawn.y0 &&
809167b1b32c5ff30d514253072ce54513112c03d4dChristian König             dirty->x1 <= drawn.x1 &&
810167b1b32c5ff30d514253072ce54513112c03d4dChristian König             dirty->y1 <= drawn.y1) {
811167b1b32c5ff30d514253072ce54513112c03d4dChristian König
812167b1b32c5ff30d514253072ce54513112c03d4dChristian König               // We clear the dirty area anyway, no need for clear_render_target
813167b1b32c5ff30d514253072ce54513112c03d4dChristian König               dirty->x0 = dirty->y0 = MAX_DIRTY;
814167b1b32c5ff30d514253072ce54513112c03d4dChristian König               dirty->x1 = dirty->y1 = MIN_DIRTY;
815167b1b32c5ff30d514253072ce54513112c03d4dChristian König            }
8160d53cb2e83cafb7007068192674a8b5b57a27ca4Christian König         }
8175f730690f8166c94ee010605b6437a6fb2a7771dYounes Manton      }
8185f730690f8166c94ee010605b6437a6fb2a7771dYounes Manton   }
8195f730690f8166c94ee010605b6437a6fb2a7771dYounes Manton
8202b033f3aab8267eb6499954fe4a582472f91ef28Marek Olšák   u_upload_unmap(c->upload);
8215f730690f8166c94ee010605b6437a6fb2a7771dYounes Manton}
8225f730690f8166c94ee010605b6437a6fb2a7771dYounes Manton
823e5f78a74f8294ee02015552db664dae1e7da9f47Christian Königstatic void
82432c4381d4a0479b3d9bfe305ce701be6b5ac8e18Christian Königdraw_layers(struct vl_compositor *c, struct vl_compositor_state *s, struct u_rect *dirty)
82580468464897682b8e10aeab310f20fdd7ddc6cb4Younes Manton{
826e5f78a74f8294ee02015552db664dae1e7da9f47Christian König   unsigned vb_index, i;
82780468464897682b8e10aeab310f20fdd7ddc6cb4Younes Manton
82880468464897682b8e10aeab310f20fdd7ddc6cb4Younes Manton   assert(c);
82980468464897682b8e10aeab310f20fdd7ddc6cb4Younes Manton
830e5f78a74f8294ee02015552db664dae1e7da9f47Christian König   for (i = 0, vb_index = 0; i < VL_COMPOSITOR_MAX_LAYERS; ++i) {
83132c4381d4a0479b3d9bfe305ce701be6b5ac8e18Christian König      if (s->used_layers & (1 << i)) {
83232c4381d4a0479b3d9bfe305ce701be6b5ac8e18Christian König         struct vl_compositor_layer *layer = &s->layers[i];
8330d53cb2e83cafb7007068192674a8b5b57a27ca4Christian König         struct pipe_sampler_view **samplers = &layer->sampler_views[0];
834e5f78a74f8294ee02015552db664dae1e7da9f47Christian König         unsigned num_sampler_views = !samplers[1] ? 1 : !samplers[2] ? 2 : 3;
83532c4381d4a0479b3d9bfe305ce701be6b5ac8e18Christian König         void *blend = layer->blend ? layer->blend : i ? c->blend_add : c->blend_clear;
83680468464897682b8e10aeab310f20fdd7ddc6cb4Younes Manton
83732c4381d4a0479b3d9bfe305ce701be6b5ac8e18Christian König         c->pipe->bind_blend_state(c->pipe, blend);
838eaabb4ead07ae043ecc789024028e225ebd0f318Zack Rusin         c->pipe->set_viewport_states(c->pipe, 0, 1, &layer->viewport);
8390d53cb2e83cafb7007068192674a8b5b57a27ca4Christian König         c->pipe->bind_fs_state(c->pipe, layer->fs);
840d0520d5bf6fb8dec8434d6b68dd014227a1bdaa3Brian Paul         c->pipe->bind_sampler_states(c->pipe, PIPE_SHADER_FRAGMENT, 0,
841d0520d5bf6fb8dec8434d6b68dd014227a1bdaa3Brian Paul                                      num_sampler_views, layer->samplers);
842a3ed98f7aa85636579a5696bf036ec13e5c9104aBrian Paul         c->pipe->set_sampler_views(c->pipe, PIPE_SHADER_FRAGMENT, 0,
843a3ed98f7aa85636579a5696bf036ec13e5c9104aBrian Paul                                    num_sampler_views, samplers);
844a3ed98f7aa85636579a5696bf036ec13e5c9104aBrian Paul
845e5f78a74f8294ee02015552db664dae1e7da9f47Christian König         util_draw_arrays(c->pipe, PIPE_PRIM_QUADS, vb_index * 4, 4);
846e5f78a74f8294ee02015552db664dae1e7da9f47Christian König         vb_index++;
8470d53cb2e83cafb7007068192674a8b5b57a27ca4Christian König
848167b1b32c5ff30d514253072ce54513112c03d4dChristian König         if (dirty) {
849167b1b32c5ff30d514253072ce54513112c03d4dChristian König            // Remember the currently drawn area as dirty for the next draw command
85032c4381d4a0479b3d9bfe305ce701be6b5ac8e18Christian König            struct u_rect drawn = calc_drawn_area(s, layer);
851167b1b32c5ff30d514253072ce54513112c03d4dChristian König            dirty->x0 = MIN2(drawn.x0, dirty->x0);
852167b1b32c5ff30d514253072ce54513112c03d4dChristian König            dirty->y0 = MIN2(drawn.y0, dirty->y0);
853167b1b32c5ff30d514253072ce54513112c03d4dChristian König            dirty->x1 = MAX2(drawn.x1, dirty->x1);
854167b1b32c5ff30d514253072ce54513112c03d4dChristian König            dirty->y1 = MAX2(drawn.y1, dirty->y1);
855167b1b32c5ff30d514253072ce54513112c03d4dChristian König         }
8561f3a85ec7931c5d67fce0ec1e845d6c91048e599Christian König      }
85780468464897682b8e10aeab310f20fdd7ddc6cb4Younes Manton   }
85880468464897682b8e10aeab310f20fdd7ddc6cb4Younes Manton}
85980468464897682b8e10aeab310f20fdd7ddc6cb4Younes Manton
860bd5fd67a3e3cda4b7676dd4745fc5d5524709210Christian Königvoid
861167b1b32c5ff30d514253072ce54513112c03d4dChristian Königvl_compositor_reset_dirty_area(struct u_rect *dirty)
8620d53cb2e83cafb7007068192674a8b5b57a27ca4Christian König{
863167b1b32c5ff30d514253072ce54513112c03d4dChristian König   assert(dirty);
8640d53cb2e83cafb7007068192674a8b5b57a27ca4Christian König
865167b1b32c5ff30d514253072ce54513112c03d4dChristian König   dirty->x0 = dirty->y0 = MIN_DIRTY;
866167b1b32c5ff30d514253072ce54513112c03d4dChristian König   dirty->x1 = dirty->y1 = MAX_DIRTY;
8670d53cb2e83cafb7007068192674a8b5b57a27ca4Christian König}
8680d53cb2e83cafb7007068192674a8b5b57a27ca4Christian König
869bd5fd67a3e3cda4b7676dd4745fc5d5524709210Christian Königvoid
87032c4381d4a0479b3d9bfe305ce701be6b5ac8e18Christian Königvl_compositor_set_clear_color(struct vl_compositor_state *s, union pipe_color_union *color)
871563f6c225c75b2344e0f4cd5011540a21fac9abfChristian König{
87232c4381d4a0479b3d9bfe305ce701be6b5ac8e18Christian König   assert(s);
87332c4381d4a0479b3d9bfe305ce701be6b5ac8e18Christian König   assert(color);
874563f6c225c75b2344e0f4cd5011540a21fac9abfChristian König
87532c4381d4a0479b3d9bfe305ce701be6b5ac8e18Christian König   s->clear_color = *color;
876563f6c225c75b2344e0f4cd5011540a21fac9abfChristian König}
877563f6c225c75b2344e0f4cd5011540a21fac9abfChristian König
878bd5fd67a3e3cda4b7676dd4745fc5d5524709210Christian Königvoid
87932c4381d4a0479b3d9bfe305ce701be6b5ac8e18Christian Königvl_compositor_get_clear_color(struct vl_compositor_state *s, union pipe_color_union *color)
88042fddacabafebd4c9f1ba2f8f94192f8f4f76fceEmeric Grange{
88132c4381d4a0479b3d9bfe305ce701be6b5ac8e18Christian König   assert(s);
88242fddacabafebd4c9f1ba2f8f94192f8f4f76fceEmeric Grange   assert(color);
88342fddacabafebd4c9f1ba2f8f94192f8f4f76fceEmeric Grange
88432c4381d4a0479b3d9bfe305ce701be6b5ac8e18Christian König   *color = s->clear_color;
88542fddacabafebd4c9f1ba2f8f94192f8f4f76fceEmeric Grange}
88642fddacabafebd4c9f1ba2f8f94192f8f4f76fceEmeric Grange
88742fddacabafebd4c9f1ba2f8f94192f8f4f76fceEmeric Grangevoid
88832c4381d4a0479b3d9bfe305ce701be6b5ac8e18Christian Königvl_compositor_clear_layers(struct vl_compositor_state *s)
889f547472bfa0a797adacc2a7688b4c1ba65381a80Younes Manton{
890e5f78a74f8294ee02015552db664dae1e7da9f47Christian König   unsigned i, j;
8917f426615ab308de508f672567094b8b21d836a9bChristian König
89232c4381d4a0479b3d9bfe305ce701be6b5ac8e18Christian König   assert(s);
893f547472bfa0a797adacc2a7688b4c1ba65381a80Younes Manton
89432c4381d4a0479b3d9bfe305ce701be6b5ac8e18Christian König   s->used_layers = 0;
895e5f78a74f8294ee02015552db664dae1e7da9f47Christian König   for ( i = 0; i < VL_COMPOSITOR_MAX_LAYERS; ++i) {
896b90727bb241e4a04158d34aad078cb18e478fea7Christian König      struct vertex4f v_one = { 1.0f, 1.0f, 1.0f, 1.0f };
89732c4381d4a0479b3d9bfe305ce701be6b5ac8e18Christian König      s->layers[i].clearing = i ? false : true;
89832c4381d4a0479b3d9bfe305ce701be6b5ac8e18Christian König      s->layers[i].blend = NULL;
89932c4381d4a0479b3d9bfe305ce701be6b5ac8e18Christian König      s->layers[i].fs = NULL;
90074a4e9089488e7f341d21053bbf2d4aa52b99b70Christian König      s->layers[i].viewport.scale[2] = 1;
90174a4e9089488e7f341d21053bbf2d4aa52b99b70Christian König      s->layers[i].viewport.translate[2] = 0;
902e7e207658c6adb3dfd98038c248efde70fd43056Kusanagi Kouichi      s->layers[i].rotate = VL_COMPOSITOR_ROTATE_0;
90374a4e9089488e7f341d21053bbf2d4aa52b99b70Christian König
904e5f78a74f8294ee02015552db664dae1e7da9f47Christian König      for ( j = 0; j < 3; j++)
90532c4381d4a0479b3d9bfe305ce701be6b5ac8e18Christian König         pipe_sampler_view_reference(&s->layers[i].sampler_views[j], NULL);
906b90727bb241e4a04158d34aad078cb18e478fea7Christian König      for ( j = 0; j < 4; ++j)
907b90727bb241e4a04158d34aad078cb18e478fea7Christian König         s->layers[i].colors[j] = v_one;
9085f730690f8166c94ee010605b6437a6fb2a7771dYounes Manton   }
909e5f78a74f8294ee02015552db664dae1e7da9f47Christian König}
9105f730690f8166c94ee010605b6437a6fb2a7771dYounes Manton
911bd5fd67a3e3cda4b7676dd4745fc5d5524709210Christian Königvoid
912bd5fd67a3e3cda4b7676dd4745fc5d5524709210Christian Königvl_compositor_cleanup(struct vl_compositor *c)
913e5f78a74f8294ee02015552db664dae1e7da9f47Christian König{
914bd5fd67a3e3cda4b7676dd4745fc5d5524709210Christian König   assert(c);
9157f426615ab308de508f672567094b8b21d836a9bChristian König
9162b033f3aab8267eb6499954fe4a582472f91ef28Marek Olšák   u_upload_destroy(c->upload);
917e5f78a74f8294ee02015552db664dae1e7da9f47Christian König   cleanup_buffers(c);
918e5f78a74f8294ee02015552db664dae1e7da9f47Christian König   cleanup_shaders(c);
919e5f78a74f8294ee02015552db664dae1e7da9f47Christian König   cleanup_pipe_state(c);
920f547472bfa0a797adacc2a7688b4c1ba65381a80Younes Manton}
921e00da1476fcdf8e5877fc1e62118080f5c4193f0Younes Manton
922cee5af93ee5ea9e3c4dd19047952fec6bcfed2b6Nayan Deshmukhbool
923f24eb5a17830b8137045a626dbd55e75ed5e708dNayan Deshmukhvl_compositor_set_csc_matrix(struct vl_compositor_state *s,
924f24eb5a17830b8137045a626dbd55e75ed5e708dNayan Deshmukh                             vl_csc_matrix const *matrix,
925f24eb5a17830b8137045a626dbd55e75ed5e708dNayan Deshmukh                             float luma_min, float luma_max)
926e00da1476fcdf8e5877fc1e62118080f5c4193f0Younes Manton{
927a8ea1dacc63ac567498049e5756c247b9fec6cd9Younes Manton   struct pipe_transfer *buf_transfer;
928a8ea1dacc63ac567498049e5756c247b9fec6cd9Younes Manton
92932c4381d4a0479b3d9bfe305ce701be6b5ac8e18Christian König   assert(s);
930e00da1476fcdf8e5877fc1e62118080f5c4193f0Younes Manton
931f24eb5a17830b8137045a626dbd55e75ed5e708dNayan Deshmukh   float *ptr = pipe_buffer_map(s->pipe, s->csc_matrix,
932f24eb5a17830b8137045a626dbd55e75ed5e708dNayan Deshmukh                               PIPE_TRANSFER_WRITE | PIPE_TRANSFER_DISCARD_RANGE,
933f24eb5a17830b8137045a626dbd55e75ed5e708dNayan Deshmukh                               &buf_transfer);
934f24eb5a17830b8137045a626dbd55e75ed5e708dNayan Deshmukh
935cee5af93ee5ea9e3c4dd19047952fec6bcfed2b6Nayan Deshmukh   if (!ptr)
936cee5af93ee5ea9e3c4dd19047952fec6bcfed2b6Nayan Deshmukh      return false;
937cee5af93ee5ea9e3c4dd19047952fec6bcfed2b6Nayan Deshmukh
938f24eb5a17830b8137045a626dbd55e75ed5e708dNayan Deshmukh   memcpy(ptr, matrix, sizeof(vl_csc_matrix));
939f24eb5a17830b8137045a626dbd55e75ed5e708dNayan Deshmukh
940f24eb5a17830b8137045a626dbd55e75ed5e708dNayan Deshmukh   ptr += sizeof(vl_csc_matrix)/sizeof(float);
941f24eb5a17830b8137045a626dbd55e75ed5e708dNayan Deshmukh   ptr[0] = luma_min;
942f24eb5a17830b8137045a626dbd55e75ed5e708dNayan Deshmukh   ptr[1] = luma_max;
943e00da1476fcdf8e5877fc1e62118080f5c4193f0Younes Manton
94432c4381d4a0479b3d9bfe305ce701be6b5ac8e18Christian König   pipe_buffer_unmap(s->pipe, buf_transfer);
945cee5af93ee5ea9e3c4dd19047952fec6bcfed2b6Nayan Deshmukh
946cee5af93ee5ea9e3c4dd19047952fec6bcfed2b6Nayan Deshmukh   return true;
94732c4381d4a0479b3d9bfe305ce701be6b5ac8e18Christian König}
94832c4381d4a0479b3d9bfe305ce701be6b5ac8e18Christian König
94932c4381d4a0479b3d9bfe305ce701be6b5ac8e18Christian Königvoid
950d645dc65b6c5e7d46538e98208a703f0f7a5d20bChristian Königvl_compositor_set_dst_clip(struct vl_compositor_state *s, struct u_rect *dst_clip)
95132c4381d4a0479b3d9bfe305ce701be6b5ac8e18Christian König{
95232c4381d4a0479b3d9bfe305ce701be6b5ac8e18Christian König   assert(s);
95332c4381d4a0479b3d9bfe305ce701be6b5ac8e18Christian König
95432c4381d4a0479b3d9bfe305ce701be6b5ac8e18Christian König   s->scissor_valid = dst_clip != NULL;
95532c4381d4a0479b3d9bfe305ce701be6b5ac8e18Christian König   if (dst_clip) {
956d645dc65b6c5e7d46538e98208a703f0f7a5d20bChristian König      s->scissor.minx = dst_clip->x0;
957d645dc65b6c5e7d46538e98208a703f0f7a5d20bChristian König      s->scissor.miny = dst_clip->y0;
958d645dc65b6c5e7d46538e98208a703f0f7a5d20bChristian König      s->scissor.maxx = dst_clip->x1;
959d645dc65b6c5e7d46538e98208a703f0f7a5d20bChristian König      s->scissor.maxy = dst_clip->y1;
96032c4381d4a0479b3d9bfe305ce701be6b5ac8e18Christian König   }
96132c4381d4a0479b3d9bfe305ce701be6b5ac8e18Christian König}
96232c4381d4a0479b3d9bfe305ce701be6b5ac8e18Christian König
96332c4381d4a0479b3d9bfe305ce701be6b5ac8e18Christian Königvoid
96432c4381d4a0479b3d9bfe305ce701be6b5ac8e18Christian Königvl_compositor_set_layer_blend(struct vl_compositor_state *s,
9654f37636afb5adc299ecbe497209702a47039580cChristian König                              unsigned layer, void *blend,
9664f37636afb5adc299ecbe497209702a47039580cChristian König                              bool is_clearing)
9674f37636afb5adc299ecbe497209702a47039580cChristian König{
96832c4381d4a0479b3d9bfe305ce701be6b5ac8e18Christian König   assert(s && blend);
9694f37636afb5adc299ecbe497209702a47039580cChristian König
9704f37636afb5adc299ecbe497209702a47039580cChristian König   assert(layer < VL_COMPOSITOR_MAX_LAYERS);
9714f37636afb5adc299ecbe497209702a47039580cChristian König
97232c4381d4a0479b3d9bfe305ce701be6b5ac8e18Christian König   s->layers[layer].clearing = is_clearing;
97332c4381d4a0479b3d9bfe305ce701be6b5ac8e18Christian König   s->layers[layer].blend = blend;
9744f37636afb5adc299ecbe497209702a47039580cChristian König}
9754f37636afb5adc299ecbe497209702a47039580cChristian König
9764f37636afb5adc299ecbe497209702a47039580cChristian Königvoid
97774a4e9089488e7f341d21053bbf2d4aa52b99b70Christian Königvl_compositor_set_layer_dst_area(struct vl_compositor_state *s,
97874a4e9089488e7f341d21053bbf2d4aa52b99b70Christian König                                 unsigned layer, struct u_rect *dst_area)
97974a4e9089488e7f341d21053bbf2d4aa52b99b70Christian König{
98074a4e9089488e7f341d21053bbf2d4aa52b99b70Christian König   assert(s);
98174a4e9089488e7f341d21053bbf2d4aa52b99b70Christian König
98274a4e9089488e7f341d21053bbf2d4aa52b99b70Christian König   assert(layer < VL_COMPOSITOR_MAX_LAYERS);
98374a4e9089488e7f341d21053bbf2d4aa52b99b70Christian König
98474a4e9089488e7f341d21053bbf2d4aa52b99b70Christian König   s->layers[layer].viewport_valid = dst_area != NULL;
98574a4e9089488e7f341d21053bbf2d4aa52b99b70Christian König   if (dst_area) {
98674a4e9089488e7f341d21053bbf2d4aa52b99b70Christian König      s->layers[layer].viewport.scale[0] = dst_area->x1 - dst_area->x0;
98774a4e9089488e7f341d21053bbf2d4aa52b99b70Christian König      s->layers[layer].viewport.scale[1] = dst_area->y1 - dst_area->y0;
98874a4e9089488e7f341d21053bbf2d4aa52b99b70Christian König      s->layers[layer].viewport.translate[0] = dst_area->x0;
98974a4e9089488e7f341d21053bbf2d4aa52b99b70Christian König      s->layers[layer].viewport.translate[1] = dst_area->y0;
99074a4e9089488e7f341d21053bbf2d4aa52b99b70Christian König   }
99174a4e9089488e7f341d21053bbf2d4aa52b99b70Christian König}
99274a4e9089488e7f341d21053bbf2d4aa52b99b70Christian König
99374a4e9089488e7f341d21053bbf2d4aa52b99b70Christian Königvoid
99432c4381d4a0479b3d9bfe305ce701be6b5ac8e18Christian Königvl_compositor_set_buffer_layer(struct vl_compositor_state *s,
99532c4381d4a0479b3d9bfe305ce701be6b5ac8e18Christian König                               struct vl_compositor *c,
996e5f78a74f8294ee02015552db664dae1e7da9f47Christian König                               unsigned layer,
997e5f78a74f8294ee02015552db664dae1e7da9f47Christian König                               struct pipe_video_buffer *buffer,
998d645dc65b6c5e7d46538e98208a703f0f7a5d20bChristian König                               struct u_rect *src_rect,
999d645dc65b6c5e7d46538e98208a703f0f7a5d20bChristian König                               struct u_rect *dst_rect,
100037f97e1753af20a7161f61e99cb203b214e00641Christian König                               enum vl_compositor_deinterlace deinterlace)
1001e5f78a74f8294ee02015552db664dae1e7da9f47Christian König{
1002d9ad3aa3b9647f1ede2568600978af956ff32fffChristian König   struct pipe_sampler_view **sampler_views;
1003d9ad3aa3b9647f1ede2568600978af956ff32fffChristian König   unsigned i;
1004d9ad3aa3b9647f1ede2568600978af956ff32fffChristian König
100532c4381d4a0479b3d9bfe305ce701be6b5ac8e18Christian König   assert(s && c && buffer);
1006e5f78a74f8294ee02015552db664dae1e7da9f47Christian König
1007e5f78a74f8294ee02015552db664dae1e7da9f47Christian König   assert(layer < VL_COMPOSITOR_MAX_LAYERS);
1008e5f78a74f8294ee02015552db664dae1e7da9f47Christian König
100932c4381d4a0479b3d9bfe305ce701be6b5ac8e18Christian König   s->used_layers |= 1 << layer;
10103ea7e2713c836f23d59c4034385609e371a94c8dChristian König   sampler_views = buffer->get_sampler_view_components(buffer);
101176d881b8b086495081c0a3c8fea2278f1480f107Christian König   for (i = 0; i < 3; ++i) {
101232c4381d4a0479b3d9bfe305ce701be6b5ac8e18Christian König      s->layers[layer].samplers[i] = c->sampler_linear;
101332c4381d4a0479b3d9bfe305ce701be6b5ac8e18Christian König      pipe_sampler_view_reference(&s->layers[layer].sampler_views[i], sampler_views[i]);
101476d881b8b086495081c0a3c8fea2278f1480f107Christian König   }
1015d9ad3aa3b9647f1ede2568600978af956ff32fffChristian König
101632c4381d4a0479b3d9bfe305ce701be6b5ac8e18Christian König   calc_src_and_dst(&s->layers[layer], buffer->width, buffer->height,
101732c4381d4a0479b3d9bfe305ce701be6b5ac8e18Christian König                    src_rect ? *src_rect : default_rect(&s->layers[layer]),
101832c4381d4a0479b3d9bfe305ce701be6b5ac8e18Christian König                    dst_rect ? *dst_rect : default_rect(&s->layers[layer]));
101937f97e1753af20a7161f61e99cb203b214e00641Christian König
102037f97e1753af20a7161f61e99cb203b214e00641Christian König   if (buffer->interlaced) {
102132c4381d4a0479b3d9bfe305ce701be6b5ac8e18Christian König      float half_a_line = 0.5f / s->layers[layer].zw.y;
102237f97e1753af20a7161f61e99cb203b214e00641Christian König      switch(deinterlace) {
102337f97e1753af20a7161f61e99cb203b214e00641Christian König      case VL_COMPOSITOR_WEAVE:
10242e18c2c6f86342e7ea77b0f1a1f731f879db0ed3Leo Liu         s->layers[layer].fs = c->fs_weave_rgb;
102537f97e1753af20a7161f61e99cb203b214e00641Christian König         break;
102637f97e1753af20a7161f61e99cb203b214e00641Christian König
102737f97e1753af20a7161f61e99cb203b214e00641Christian König      case VL_COMPOSITOR_BOB_TOP:
10287d2f2a0c890b1993532a45c8c392c28950ddc06eChristian König         s->layers[layer].zw.x = 0.0f;
102932c4381d4a0479b3d9bfe305ce701be6b5ac8e18Christian König         s->layers[layer].src.tl.y += half_a_line;
103032c4381d4a0479b3d9bfe305ce701be6b5ac8e18Christian König         s->layers[layer].src.br.y += half_a_line;
103132c4381d4a0479b3d9bfe305ce701be6b5ac8e18Christian König         s->layers[layer].fs = c->fs_video_buffer;
103237f97e1753af20a7161f61e99cb203b214e00641Christian König         break;
103337f97e1753af20a7161f61e99cb203b214e00641Christian König
103437f97e1753af20a7161f61e99cb203b214e00641Christian König      case VL_COMPOSITOR_BOB_BOTTOM:
10357d2f2a0c890b1993532a45c8c392c28950ddc06eChristian König         s->layers[layer].zw.x = 1.0f;
103632c4381d4a0479b3d9bfe305ce701be6b5ac8e18Christian König         s->layers[layer].src.tl.y -= half_a_line;
103732c4381d4a0479b3d9bfe305ce701be6b5ac8e18Christian König         s->layers[layer].src.br.y -= half_a_line;
103832c4381d4a0479b3d9bfe305ce701be6b5ac8e18Christian König         s->layers[layer].fs = c->fs_video_buffer;
103937f97e1753af20a7161f61e99cb203b214e00641Christian König         break;
104037f97e1753af20a7161f61e99cb203b214e00641Christian König      }
104137f97e1753af20a7161f61e99cb203b214e00641Christian König
104237f97e1753af20a7161f61e99cb203b214e00641Christian König   } else
104332c4381d4a0479b3d9bfe305ce701be6b5ac8e18Christian König      s->layers[layer].fs = c->fs_video_buffer;
1044e5f78a74f8294ee02015552db664dae1e7da9f47Christian König}
1045e5f78a74f8294ee02015552db664dae1e7da9f47Christian König
1046bd5fd67a3e3cda4b7676dd4745fc5d5524709210Christian Königvoid
104732c4381d4a0479b3d9bfe305ce701be6b5ac8e18Christian Königvl_compositor_set_palette_layer(struct vl_compositor_state *s,
104832c4381d4a0479b3d9bfe305ce701be6b5ac8e18Christian König                                struct vl_compositor *c,
1049e5f78a74f8294ee02015552db664dae1e7da9f47Christian König                                unsigned layer,
1050e5f78a74f8294ee02015552db664dae1e7da9f47Christian König                                struct pipe_sampler_view *indexes,
1051e5f78a74f8294ee02015552db664dae1e7da9f47Christian König                                struct pipe_sampler_view *palette,
1052d645dc65b6c5e7d46538e98208a703f0f7a5d20bChristian König                                struct u_rect *src_rect,
1053d645dc65b6c5e7d46538e98208a703f0f7a5d20bChristian König                                struct u_rect *dst_rect,
10544f37636afb5adc299ecbe497209702a47039580cChristian König                                bool include_color_conversion)
1055e5f78a74f8294ee02015552db664dae1e7da9f47Christian König{
105632c4381d4a0479b3d9bfe305ce701be6b5ac8e18Christian König   assert(s && c && indexes && palette);
1057e5f78a74f8294ee02015552db664dae1e7da9f47Christian König
1058e5f78a74f8294ee02015552db664dae1e7da9f47Christian König   assert(layer < VL_COMPOSITOR_MAX_LAYERS);
1059e5f78a74f8294ee02015552db664dae1e7da9f47Christian König
106032c4381d4a0479b3d9bfe305ce701be6b5ac8e18Christian König   s->used_layers |= 1 << layer;
10614f37636afb5adc299ecbe497209702a47039580cChristian König
106232c4381d4a0479b3d9bfe305ce701be6b5ac8e18Christian König   s->layers[layer].fs = include_color_conversion ?
10634f37636afb5adc299ecbe497209702a47039580cChristian König      c->fs_palette.yuv : c->fs_palette.rgb;
10644f37636afb5adc299ecbe497209702a47039580cChristian König
106532c4381d4a0479b3d9bfe305ce701be6b5ac8e18Christian König   s->layers[layer].samplers[0] = c->sampler_linear;
106632c4381d4a0479b3d9bfe305ce701be6b5ac8e18Christian König   s->layers[layer].samplers[1] = c->sampler_nearest;
106732c4381d4a0479b3d9bfe305ce701be6b5ac8e18Christian König   s->layers[layer].samplers[2] = NULL;
106832c4381d4a0479b3d9bfe305ce701be6b5ac8e18Christian König   pipe_sampler_view_reference(&s->layers[layer].sampler_views[0], indexes);
106932c4381d4a0479b3d9bfe305ce701be6b5ac8e18Christian König   pipe_sampler_view_reference(&s->layers[layer].sampler_views[1], palette);
107032c4381d4a0479b3d9bfe305ce701be6b5ac8e18Christian König   pipe_sampler_view_reference(&s->layers[layer].sampler_views[2], NULL);
107132c4381d4a0479b3d9bfe305ce701be6b5ac8e18Christian König   calc_src_and_dst(&s->layers[layer], indexes->texture->width0, indexes->texture->height0,
107232c4381d4a0479b3d9bfe305ce701be6b5ac8e18Christian König                    src_rect ? *src_rect : default_rect(&s->layers[layer]),
107332c4381d4a0479b3d9bfe305ce701be6b5ac8e18Christian König                    dst_rect ? *dst_rect : default_rect(&s->layers[layer]));
1074e5f78a74f8294ee02015552db664dae1e7da9f47Christian König}
1075e5f78a74f8294ee02015552db664dae1e7da9f47Christian König
1076bd5fd67a3e3cda4b7676dd4745fc5d5524709210Christian Königvoid
107732c4381d4a0479b3d9bfe305ce701be6b5ac8e18Christian Königvl_compositor_set_rgba_layer(struct vl_compositor_state *s,
107832c4381d4a0479b3d9bfe305ce701be6b5ac8e18Christian König                             struct vl_compositor *c,
1079e5f78a74f8294ee02015552db664dae1e7da9f47Christian König                             unsigned layer,
1080e5f78a74f8294ee02015552db664dae1e7da9f47Christian König                             struct pipe_sampler_view *rgba,
1081d645dc65b6c5e7d46538e98208a703f0f7a5d20bChristian König                             struct u_rect *src_rect,
1082b90727bb241e4a04158d34aad078cb18e478fea7Christian König                             struct u_rect *dst_rect,
1083b90727bb241e4a04158d34aad078cb18e478fea7Christian König                             struct vertex4f *colors)
1084e5f78a74f8294ee02015552db664dae1e7da9f47Christian König{
1085b90727bb241e4a04158d34aad078cb18e478fea7Christian König   unsigned i;
1086b90727bb241e4a04158d34aad078cb18e478fea7Christian König
108732c4381d4a0479b3d9bfe305ce701be6b5ac8e18Christian König   assert(s && c && rgba);
1088e5f78a74f8294ee02015552db664dae1e7da9f47Christian König
1089e5f78a74f8294ee02015552db664dae1e7da9f47Christian König   assert(layer < VL_COMPOSITOR_MAX_LAYERS);
1090e5f78a74f8294ee02015552db664dae1e7da9f47Christian König
109132c4381d4a0479b3d9bfe305ce701be6b5ac8e18Christian König   s->used_layers |= 1 << layer;
109232c4381d4a0479b3d9bfe305ce701be6b5ac8e18Christian König   s->layers[layer].fs = c->fs_rgba;
109332c4381d4a0479b3d9bfe305ce701be6b5ac8e18Christian König   s->layers[layer].samplers[0] = c->sampler_linear;
109432c4381d4a0479b3d9bfe305ce701be6b5ac8e18Christian König   s->layers[layer].samplers[1] = NULL;
109532c4381d4a0479b3d9bfe305ce701be6b5ac8e18Christian König   s->layers[layer].samplers[2] = NULL;
109632c4381d4a0479b3d9bfe305ce701be6b5ac8e18Christian König   pipe_sampler_view_reference(&s->layers[layer].sampler_views[0], rgba);
109732c4381d4a0479b3d9bfe305ce701be6b5ac8e18Christian König   pipe_sampler_view_reference(&s->layers[layer].sampler_views[1], NULL);
109832c4381d4a0479b3d9bfe305ce701be6b5ac8e18Christian König   pipe_sampler_view_reference(&s->layers[layer].sampler_views[2], NULL);
109932c4381d4a0479b3d9bfe305ce701be6b5ac8e18Christian König   calc_src_and_dst(&s->layers[layer], rgba->texture->width0, rgba->texture->height0,
110032c4381d4a0479b3d9bfe305ce701be6b5ac8e18Christian König                    src_rect ? *src_rect : default_rect(&s->layers[layer]),
110132c4381d4a0479b3d9bfe305ce701be6b5ac8e18Christian König                    dst_rect ? *dst_rect : default_rect(&s->layers[layer]));
1102b90727bb241e4a04158d34aad078cb18e478fea7Christian König
1103b90727bb241e4a04158d34aad078cb18e478fea7Christian König   if (colors)
1104b90727bb241e4a04158d34aad078cb18e478fea7Christian König      for (i = 0; i < 4; ++i)
1105b90727bb241e4a04158d34aad078cb18e478fea7Christian König         s->layers[layer].colors[i] = colors[i];
1106e5f78a74f8294ee02015552db664dae1e7da9f47Christian König}
1107e5f78a74f8294ee02015552db664dae1e7da9f47Christian König
1108bd5fd67a3e3cda4b7676dd4745fc5d5524709210Christian Königvoid
1109e7e207658c6adb3dfd98038c248efde70fd43056Kusanagi Kouichivl_compositor_set_layer_rotation(struct vl_compositor_state *s,
1110e7e207658c6adb3dfd98038c248efde70fd43056Kusanagi Kouichi                                 unsigned layer,
1111e7e207658c6adb3dfd98038c248efde70fd43056Kusanagi Kouichi                                 enum vl_compositor_rotation rotate)
1112e7e207658c6adb3dfd98038c248efde70fd43056Kusanagi Kouichi{
1113e7e207658c6adb3dfd98038c248efde70fd43056Kusanagi Kouichi   assert(s);
1114e7e207658c6adb3dfd98038c248efde70fd43056Kusanagi Kouichi   assert(layer < VL_COMPOSITOR_MAX_LAYERS);
1115e7e207658c6adb3dfd98038c248efde70fd43056Kusanagi Kouichi   s->layers[layer].rotate = rotate;
1116e7e207658c6adb3dfd98038c248efde70fd43056Kusanagi Kouichi}
1117e7e207658c6adb3dfd98038c248efde70fd43056Kusanagi Kouichi
1118e7e207658c6adb3dfd98038c248efde70fd43056Kusanagi Kouichivoid
111982f875f4d800d05b04a8174e8863b2b70276bbb0Leo Liuvl_compositor_set_yuv_layer(struct vl_compositor_state *s,
112082f875f4d800d05b04a8174e8863b2b70276bbb0Leo Liu                            struct vl_compositor *c,
112182f875f4d800d05b04a8174e8863b2b70276bbb0Leo Liu                            unsigned layer,
112282f875f4d800d05b04a8174e8863b2b70276bbb0Leo Liu                            struct pipe_video_buffer *buffer,
112382f875f4d800d05b04a8174e8863b2b70276bbb0Leo Liu                            struct u_rect *src_rect,
112482f875f4d800d05b04a8174e8863b2b70276bbb0Leo Liu                            struct u_rect *dst_rect,
112582f875f4d800d05b04a8174e8863b2b70276bbb0Leo Liu                            bool y)
112682f875f4d800d05b04a8174e8863b2b70276bbb0Leo Liu{
112782f875f4d800d05b04a8174e8863b2b70276bbb0Leo Liu   struct pipe_sampler_view **sampler_views;
112882f875f4d800d05b04a8174e8863b2b70276bbb0Leo Liu   unsigned i;
112982f875f4d800d05b04a8174e8863b2b70276bbb0Leo Liu
113082f875f4d800d05b04a8174e8863b2b70276bbb0Leo Liu   assert(s && c && buffer);
113182f875f4d800d05b04a8174e8863b2b70276bbb0Leo Liu
113282f875f4d800d05b04a8174e8863b2b70276bbb0Leo Liu   assert(layer < VL_COMPOSITOR_MAX_LAYERS);
113382f875f4d800d05b04a8174e8863b2b70276bbb0Leo Liu
113482f875f4d800d05b04a8174e8863b2b70276bbb0Leo Liu   s->used_layers |= 1 << layer;
113582f875f4d800d05b04a8174e8863b2b70276bbb0Leo Liu   sampler_views = buffer->get_sampler_view_components(buffer);
113682f875f4d800d05b04a8174e8863b2b70276bbb0Leo Liu   for (i = 0; i < 3; ++i) {
113782f875f4d800d05b04a8174e8863b2b70276bbb0Leo Liu      s->layers[layer].samplers[i] = c->sampler_linear;
113882f875f4d800d05b04a8174e8863b2b70276bbb0Leo Liu      pipe_sampler_view_reference(&s->layers[layer].sampler_views[i], sampler_views[i]);
113982f875f4d800d05b04a8174e8863b2b70276bbb0Leo Liu   }
114082f875f4d800d05b04a8174e8863b2b70276bbb0Leo Liu
114182f875f4d800d05b04a8174e8863b2b70276bbb0Leo Liu   calc_src_and_dst(&s->layers[layer], buffer->width, buffer->height,
114282f875f4d800d05b04a8174e8863b2b70276bbb0Leo Liu                    src_rect ? *src_rect : default_rect(&s->layers[layer]),
114382f875f4d800d05b04a8174e8863b2b70276bbb0Leo Liu                    dst_rect ? *dst_rect : default_rect(&s->layers[layer]));
114482f875f4d800d05b04a8174e8863b2b70276bbb0Leo Liu
114582f875f4d800d05b04a8174e8863b2b70276bbb0Leo Liu   s->layers[layer].fs = (y) ? c->fs_weave_yuv.y : c->fs_weave_yuv.uv;
114682f875f4d800d05b04a8174e8863b2b70276bbb0Leo Liu}
114782f875f4d800d05b04a8174e8863b2b70276bbb0Leo Liu
114882f875f4d800d05b04a8174e8863b2b70276bbb0Leo Liuvoid
114932c4381d4a0479b3d9bfe305ce701be6b5ac8e18Christian Königvl_compositor_render(struct vl_compositor_state *s,
115032c4381d4a0479b3d9bfe305ce701be6b5ac8e18Christian König                     struct vl_compositor       *c,
115132c4381d4a0479b3d9bfe305ce701be6b5ac8e18Christian König                     struct pipe_surface        *dst_surface,
1152e27f87b549cf2d4cfef97958ff175862fdf494b0Christian König                     struct u_rect              *dirty_area,
1153e27f87b549cf2d4cfef97958ff175862fdf494b0Christian König                     bool                        clear_dirty)
1154e5f78a74f8294ee02015552db664dae1e7da9f47Christian König{
1155bd5fd67a3e3cda4b7676dd4745fc5d5524709210Christian König   assert(c);
1156e5f78a74f8294ee02015552db664dae1e7da9f47Christian König   assert(dst_surface);
1157e5f78a74f8294ee02015552db664dae1e7da9f47Christian König
1158e5f78a74f8294ee02015552db664dae1e7da9f47Christian König   c->fb_state.width = dst_surface->width;
1159e5f78a74f8294ee02015552db664dae1e7da9f47Christian König   c->fb_state.height = dst_surface->height;
1160e5f78a74f8294ee02015552db664dae1e7da9f47Christian König   c->fb_state.cbufs[0] = dst_surface;
11612cbf532ae13513c3cbc7dad8ae41beeff931529eChristian König
116232c4381d4a0479b3d9bfe305ce701be6b5ac8e18Christian König   if (!s->scissor_valid) {
116332c4381d4a0479b3d9bfe305ce701be6b5ac8e18Christian König      s->scissor.minx = 0;
116432c4381d4a0479b3d9bfe305ce701be6b5ac8e18Christian König      s->scissor.miny = 0;
116532c4381d4a0479b3d9bfe305ce701be6b5ac8e18Christian König      s->scissor.maxx = dst_surface->width;
116632c4381d4a0479b3d9bfe305ce701be6b5ac8e18Christian König      s->scissor.maxy = dst_surface->height;
1167255033e4819b096491dd987c3ca4d8ee32a7cdb6Christian König   }
116803a99ba9e41ea86355a4febbe0b1a114d5455b9fChristian König   c->pipe->set_scissor_states(c->pipe, 0, 1, &s->scissor);
1169e5f78a74f8294ee02015552db664dae1e7da9f47Christian König
117032c4381d4a0479b3d9bfe305ce701be6b5ac8e18Christian König   gen_vertex_data(c, s, dirty_area);
1171167b1b32c5ff30d514253072ce54513112c03d4dChristian König
1172e27f87b549cf2d4cfef97958ff175862fdf494b0Christian König   if (clear_dirty && dirty_area &&
1173e27f87b549cf2d4cfef97958ff175862fdf494b0Christian König       (dirty_area->x0 < dirty_area->x1 || dirty_area->y0 < dirty_area->y1)) {
1174e5f78a74f8294ee02015552db664dae1e7da9f47Christian König
117532c4381d4a0479b3d9bfe305ce701be6b5ac8e18Christian König      c->pipe->clear_render_target(c->pipe, dst_surface, &s->clear_color,
1176a909210131494a6a131855d7d344b61b81fbf40eMarek Olšák                                   0, 0, dst_surface->width, dst_surface->height, false);
1177167b1b32c5ff30d514253072ce54513112c03d4dChristian König      dirty_area->x0 = dirty_area->y0 = MAX_DIRTY;
11782a97a00e28db330b8061c73ea6f1a7b7ad9d245fChristian König      dirty_area->x1 = dirty_area->y1 = MIN_DIRTY;
11790d53cb2e83cafb7007068192674a8b5b57a27ca4Christian König   }
11800d53cb2e83cafb7007068192674a8b5b57a27ca4Christian König
1181e5f78a74f8294ee02015552db664dae1e7da9f47Christian König   c->pipe->set_framebuffer_state(c->pipe, &c->fb_state);
1182e5f78a74f8294ee02015552db664dae1e7da9f47Christian König   c->pipe->bind_vs_state(c->pipe, c->vs);
1183e73bf3b805de78299f1a652668ba4e6eab9bac94Marek Olšák   c->pipe->set_vertex_buffers(c->pipe, 0, 1, &c->vertex_buf);
1184e5f78a74f8294ee02015552db664dae1e7da9f47Christian König   c->pipe->bind_vertex_elements_state(c->pipe, c->vertex_elems_state);
1185507337864fa80caf9f26602324d2c28dd0a75d61Marek Olšák   pipe_set_constant_buffer(c->pipe, PIPE_SHADER_FRAGMENT, 0, s->csc_matrix);
1186255033e4819b096491dd987c3ca4d8ee32a7cdb6Christian König   c->pipe->bind_rasterizer_state(c->pipe, c->rast);
1187e5f78a74f8294ee02015552db664dae1e7da9f47Christian König
118832c4381d4a0479b3d9bfe305ce701be6b5ac8e18Christian König   draw_layers(c, s, dirty_area);
1189e5f78a74f8294ee02015552db664dae1e7da9f47Christian König}
1190e5f78a74f8294ee02015552db664dae1e7da9f47Christian König
1191bd5fd67a3e3cda4b7676dd4745fc5d5524709210Christian Königbool
1192bd5fd67a3e3cda4b7676dd4745fc5d5524709210Christian Königvl_compositor_init(struct vl_compositor *c, struct pipe_context *pipe)
1193e5f78a74f8294ee02015552db664dae1e7da9f47Christian König{
119432c4381d4a0479b3d9bfe305ce701be6b5ac8e18Christian König   assert(c);
119532c4381d4a0479b3d9bfe305ce701be6b5ac8e18Christian König
119632c4381d4a0479b3d9bfe305ce701be6b5ac8e18Christian König   memset(c, 0, sizeof(*c));
1197e5f78a74f8294ee02015552db664dae1e7da9f47Christian König
1198bd5fd67a3e3cda4b7676dd4745fc5d5524709210Christian König   c->pipe = pipe;
1199e5f78a74f8294ee02015552db664dae1e7da9f47Christian König
1200ecb2da1559bcb9a9eec7ac224c8ff47b026c95ffMarek Olšák   c->upload = u_upload_create(pipe, 128 * 1024, PIPE_BIND_VERTEX_BUFFER,
1201ecb2da1559bcb9a9eec7ac224c8ff47b026c95ffMarek Olšák                               PIPE_USAGE_STREAM);
12022b033f3aab8267eb6499954fe4a582472f91ef28Marek Olšák
12032b033f3aab8267eb6499954fe4a582472f91ef28Marek Olšák   if (!c->upload)
12042b033f3aab8267eb6499954fe4a582472f91ef28Marek Olšák      return false;
12052b033f3aab8267eb6499954fe4a582472f91ef28Marek Olšák
12062b033f3aab8267eb6499954fe4a582472f91ef28Marek Olšák   if (!init_pipe_state(c)) {
12072b033f3aab8267eb6499954fe4a582472f91ef28Marek Olšák      u_upload_destroy(c->upload);
1208e5f78a74f8294ee02015552db664dae1e7da9f47Christian König      return false;
12092b033f3aab8267eb6499954fe4a582472f91ef28Marek Olšák   }
1210e5f78a74f8294ee02015552db664dae1e7da9f47Christian König
1211bd5fd67a3e3cda4b7676dd4745fc5d5524709210Christian König   if (!init_shaders(c)) {
12122b033f3aab8267eb6499954fe4a582472f91ef28Marek Olšák      u_upload_destroy(c->upload);
1213bd5fd67a3e3cda4b7676dd4745fc5d5524709210Christian König      cleanup_pipe_state(c);
1214e5f78a74f8294ee02015552db664dae1e7da9f47Christian König      return false;
1215e5f78a74f8294ee02015552db664dae1e7da9f47Christian König   }
121602e191cb6aa13286fff956a7929959d7cee7241dEmeric Grange
1217bd5fd67a3e3cda4b7676dd4745fc5d5524709210Christian König   if (!init_buffers(c)) {
12182b033f3aab8267eb6499954fe4a582472f91ef28Marek Olšák      u_upload_destroy(c->upload);
1219bd5fd67a3e3cda4b7676dd4745fc5d5524709210Christian König      cleanup_shaders(c);
1220bd5fd67a3e3cda4b7676dd4745fc5d5524709210Christian König      cleanup_pipe_state(c);
1221e5f78a74f8294ee02015552db664dae1e7da9f47Christian König      return false;
1222e5f78a74f8294ee02015552db664dae1e7da9f47Christian König   }
1223e5f78a74f8294ee02015552db664dae1e7da9f47Christian König
122432c4381d4a0479b3d9bfe305ce701be6b5ac8e18Christian König   return true;
122532c4381d4a0479b3d9bfe305ce701be6b5ac8e18Christian König}
1226e5f78a74f8294ee02015552db664dae1e7da9f47Christian König
122732c4381d4a0479b3d9bfe305ce701be6b5ac8e18Christian Königbool
122832c4381d4a0479b3d9bfe305ce701be6b5ac8e18Christian Königvl_compositor_init_state(struct vl_compositor_state *s, struct pipe_context *pipe)
122932c4381d4a0479b3d9bfe305ce701be6b5ac8e18Christian König{
123014766f820069ca987543918bce96410c481e5d20Christian König   vl_csc_matrix csc_matrix;
123132c4381d4a0479b3d9bfe305ce701be6b5ac8e18Christian König
123232c4381d4a0479b3d9bfe305ce701be6b5ac8e18Christian König   assert(s);
123332c4381d4a0479b3d9bfe305ce701be6b5ac8e18Christian König
123432c4381d4a0479b3d9bfe305ce701be6b5ac8e18Christian König   memset(s, 0, sizeof(*s));
1235563f6c225c75b2344e0f4cd5011540a21fac9abfChristian König
123632c4381d4a0479b3d9bfe305ce701be6b5ac8e18Christian König   s->pipe = pipe;
123732c4381d4a0479b3d9bfe305ce701be6b5ac8e18Christian König
123832c4381d4a0479b3d9bfe305ce701be6b5ac8e18Christian König   s->clear_color.f[0] = s->clear_color.f[1] = 0.0f;
123932c4381d4a0479b3d9bfe305ce701be6b5ac8e18Christian König   s->clear_color.f[2] = s->clear_color.f[3] = 0.0f;
124032c4381d4a0479b3d9bfe305ce701be6b5ac8e18Christian König
124132c4381d4a0479b3d9bfe305ce701be6b5ac8e18Christian König   /*
124232c4381d4a0479b3d9bfe305ce701be6b5ac8e18Christian König    * Create our fragment shader's constant buffer
124332c4381d4a0479b3d9bfe305ce701be6b5ac8e18Christian König    * Const buffer contains the color conversion matrix and bias vectors
124432c4381d4a0479b3d9bfe305ce701be6b5ac8e18Christian König    */
124532c4381d4a0479b3d9bfe305ce701be6b5ac8e18Christian König   /* XXX: Create with IMMUTABLE/STATIC... although it does change every once in a long while... */
124632c4381d4a0479b3d9bfe305ce701be6b5ac8e18Christian König   s->csc_matrix = pipe_buffer_create
124732c4381d4a0479b3d9bfe305ce701be6b5ac8e18Christian König   (
124832c4381d4a0479b3d9bfe305ce701be6b5ac8e18Christian König      pipe->screen,
124932c4381d4a0479b3d9bfe305ce701be6b5ac8e18Christian König      PIPE_BIND_CONSTANT_BUFFER,
1250c32114460dbb7f33885c181a0d7dee07b15b8751Marek Olšák      PIPE_USAGE_DEFAULT,
1251f24eb5a17830b8137045a626dbd55e75ed5e708dNayan Deshmukh      sizeof(csc_matrix) + 2*sizeof(float)
125232c4381d4a0479b3d9bfe305ce701be6b5ac8e18Christian König   );
125332c4381d4a0479b3d9bfe305ce701be6b5ac8e18Christian König
1254cee5af93ee5ea9e3c4dd19047952fec6bcfed2b6Nayan Deshmukh   if (!s->csc_matrix)
1255cee5af93ee5ea9e3c4dd19047952fec6bcfed2b6Nayan Deshmukh      return false;
1256cee5af93ee5ea9e3c4dd19047952fec6bcfed2b6Nayan Deshmukh
125732c4381d4a0479b3d9bfe305ce701be6b5ac8e18Christian König   vl_compositor_clear_layers(s);
125832c4381d4a0479b3d9bfe305ce701be6b5ac8e18Christian König
125914766f820069ca987543918bce96410c481e5d20Christian König   vl_csc_get_matrix(VL_CSC_COLOR_STANDARD_IDENTITY, NULL, true, &csc_matrix);
1260cee5af93ee5ea9e3c4dd19047952fec6bcfed2b6Nayan Deshmukh   if (!vl_compositor_set_csc_matrix(s, (const vl_csc_matrix *)&csc_matrix, 1.0f, 0.0f))
1261cee5af93ee5ea9e3c4dd19047952fec6bcfed2b6Nayan Deshmukh      return false;
1262e5f78a74f8294ee02015552db664dae1e7da9f47Christian König
1263bd5fd67a3e3cda4b7676dd4745fc5d5524709210Christian König   return true;
1264e00da1476fcdf8e5877fc1e62118080f5c4193f0Younes Manton}
126532c4381d4a0479b3d9bfe305ce701be6b5ac8e18Christian König
126632c4381d4a0479b3d9bfe305ce701be6b5ac8e18Christian Königvoid
126732c4381d4a0479b3d9bfe305ce701be6b5ac8e18Christian Königvl_compositor_cleanup_state(struct vl_compositor_state *s)
126832c4381d4a0479b3d9bfe305ce701be6b5ac8e18Christian König{
126932c4381d4a0479b3d9bfe305ce701be6b5ac8e18Christian König   assert(s);
127032c4381d4a0479b3d9bfe305ce701be6b5ac8e18Christian König
127132c4381d4a0479b3d9bfe305ce701be6b5ac8e18Christian König   vl_compositor_clear_layers(s);
127232c4381d4a0479b3d9bfe305ce701be6b5ac8e18Christian König   pipe_resource_reference(&s->csc_matrix, NULL);
127332c4381d4a0479b3d9bfe305ce701be6b5ac8e18Christian König}
1274