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