1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/************************************************************************** 2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright 2009 Younes Manton. 4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * All Rights Reserved. 5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Permission is hereby granted, free of charge, to any person obtaining a 7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * copy of this software and associated documentation files (the 8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * "Software"), to deal in the Software without restriction, including 9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * without limitation the rights to use, copy, modify, merge, publish, 10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * distribute, sub license, and/or sell copies of the Software, and to 11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * permit persons to whom the Software is furnished to do so, subject to 12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the following conditions: 13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The above copyright notice and this permission notice (including the 15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * next paragraph) shall be included in all copies or substantial portions 16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * of the Software. 17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR 22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org **************************************************************************/ 27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <assert.h> 29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "pipe/p_compiler.h" 31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "pipe/p_context.h" 32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_memory.h" 34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_draw.h" 35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_surface.h" 36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "tgsi/tgsi_ureg.h" 38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "vl_csc.h" 40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "vl_types.h" 41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "vl_compositor.h" 42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define MIN_DIRTY (0) 44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define MAX_DIRTY (1 << 15) 45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgenum VS_OUTPUT 47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VS_O_VPOS = 0, 49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VS_O_COLOR = 0, 50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VS_O_VTEX = 0, 51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VS_O_VTOP, 52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VS_O_VBOTTOM, 53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void * 56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgcreate_vert_shader(struct vl_compositor *c) 57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_program *shader; 59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_src vpos, vtex, color; 60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_dst tmp; 61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_dst o_vpos, o_vtex, o_color; 62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_dst o_vtop, o_vbottom; 63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org shader = ureg_create(TGSI_PROCESSOR_VERTEX); 65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!shader) 66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return false; 67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vpos = ureg_DECL_vs_input(shader, 0); 69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vtex = ureg_DECL_vs_input(shader, 1); 70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org color = ureg_DECL_vs_input(shader, 2); 71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tmp = ureg_DECL_temporary(shader); 72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org o_vpos = ureg_DECL_output(shader, TGSI_SEMANTIC_POSITION, VS_O_VPOS); 73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org o_color = ureg_DECL_output(shader, TGSI_SEMANTIC_COLOR, VS_O_COLOR); 74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org o_vtex = ureg_DECL_output(shader, TGSI_SEMANTIC_GENERIC, VS_O_VTEX); 75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org o_vtop = ureg_DECL_output(shader, TGSI_SEMANTIC_GENERIC, VS_O_VTOP); 76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org o_vbottom = ureg_DECL_output(shader, TGSI_SEMANTIC_GENERIC, VS_O_VBOTTOM); 77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * o_vpos = vpos 80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * o_vtex = vtex 81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * o_color = color 82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_MOV(shader, o_vpos, vpos); 84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_MOV(shader, o_vtex, vtex); 85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_MOV(shader, o_color, color); 86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * tmp.x = vtex.w / 2 89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * tmp.y = vtex.w / 4 90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * o_vtop.x = vtex.x 92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * o_vtop.y = vtex.y * tmp.x + 0.25f 93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * o_vtop.z = vtex.y * tmp.y + 0.25f 94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * o_vtop.w = 1 / tmp.x 95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * o_vbottom.x = vtex.x 97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * o_vbottom.y = vtex.y * tmp.x - 0.25f 98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * o_vbottom.z = vtex.y * tmp.y - 0.25f 99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * o_vbottom.w = 1 / tmp.y 100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_MUL(shader, ureg_writemask(tmp, TGSI_WRITEMASK_X), 102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_scalar(vtex, TGSI_SWIZZLE_W), ureg_imm1f(shader, 0.5f)); 103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_MUL(shader, ureg_writemask(tmp, TGSI_WRITEMASK_Y), 104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_scalar(vtex, TGSI_SWIZZLE_W), ureg_imm1f(shader, 0.25f)); 105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_MOV(shader, ureg_writemask(o_vtop, TGSI_WRITEMASK_X), vtex); 107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_MAD(shader, ureg_writemask(o_vtop, TGSI_WRITEMASK_Y), ureg_scalar(vtex, TGSI_SWIZZLE_Y), 108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_scalar(ureg_src(tmp), TGSI_SWIZZLE_X), ureg_imm1f(shader, 0.25f)); 109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_MAD(shader, ureg_writemask(o_vtop, TGSI_WRITEMASK_Z), ureg_scalar(vtex, TGSI_SWIZZLE_Y), 110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_scalar(ureg_src(tmp), TGSI_SWIZZLE_Y), ureg_imm1f(shader, 0.25f)); 111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_RCP(shader, ureg_writemask(o_vtop, TGSI_WRITEMASK_W), 112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_scalar(ureg_src(tmp), TGSI_SWIZZLE_X)); 113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_MOV(shader, ureg_writemask(o_vbottom, TGSI_WRITEMASK_X), vtex); 115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_MAD(shader, ureg_writemask(o_vbottom, TGSI_WRITEMASK_Y), ureg_scalar(vtex, TGSI_SWIZZLE_Y), 116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_scalar(ureg_src(tmp), TGSI_SWIZZLE_X), ureg_imm1f(shader, -0.25f)); 117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_MAD(shader, ureg_writemask(o_vbottom, TGSI_WRITEMASK_Z), ureg_scalar(vtex, TGSI_SWIZZLE_Y), 118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_scalar(ureg_src(tmp), TGSI_SWIZZLE_Y), ureg_imm1f(shader, -0.25f)); 119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_RCP(shader, ureg_writemask(o_vbottom, TGSI_WRITEMASK_W), 120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_scalar(ureg_src(tmp), TGSI_SWIZZLE_Y)); 121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_END(shader); 123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return ureg_create_shader_and_destroy(shader, c->pipe); 125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void * 128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgcreate_frag_shader_video_buffer(struct vl_compositor *c) 129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_program *shader; 131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_src tc; 132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_src csc[3]; 133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_src sampler[3]; 134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_dst texel; 135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_dst fragment; 136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned i; 137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org shader = ureg_create(TGSI_PROCESSOR_FRAGMENT); 139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!shader) 140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return false; 141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tc = ureg_DECL_fs_input(shader, TGSI_SEMANTIC_GENERIC, VS_O_VTEX, TGSI_INTERPOLATE_LINEAR); 143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < 3; ++i) { 144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org csc[i] = ureg_DECL_constant(shader, i); 145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sampler[i] = ureg_DECL_sampler(shader, i); 146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texel = ureg_DECL_temporary(shader); 148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fragment = ureg_DECL_output(shader, TGSI_SEMANTIC_COLOR, 0); 149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * texel.xyz = tex(tc, sampler[i]) 152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * fragment = csc * texel 153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < 3; ++i) 155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_TEX(shader, ureg_writemask(texel, TGSI_WRITEMASK_X << i), TGSI_TEXTURE_3D, tc, sampler[i]); 156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_MOV(shader, ureg_writemask(texel, TGSI_WRITEMASK_W), ureg_imm1f(shader, 1.0f)); 158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < 3; ++i) 160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_DP4(shader, ureg_writemask(fragment, TGSI_WRITEMASK_X << i), csc[i], ureg_src(texel)); 161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_MOV(shader, ureg_writemask(fragment, TGSI_WRITEMASK_W), ureg_imm1f(shader, 1.0f)); 163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_release_temporary(shader, texel); 165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_END(shader); 166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return ureg_create_shader_and_destroy(shader, c->pipe); 168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void * 171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgcreate_frag_shader_weave(struct vl_compositor *c) 172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_program *shader; 174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_src i_tc[2]; 175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_src csc[3]; 176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_src sampler[3]; 177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_dst t_tc[2]; 178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_dst t_texel[2]; 179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_dst o_fragment; 180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned i, j; 181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org shader = ureg_create(TGSI_PROCESSOR_FRAGMENT); 183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!shader) 184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return false; 185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org i_tc[0] = ureg_DECL_fs_input(shader, TGSI_SEMANTIC_GENERIC, VS_O_VTOP, TGSI_INTERPOLATE_LINEAR); 187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org i_tc[1] = ureg_DECL_fs_input(shader, TGSI_SEMANTIC_GENERIC, VS_O_VBOTTOM, TGSI_INTERPOLATE_LINEAR); 188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < 3; ++i) { 190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org csc[i] = ureg_DECL_constant(shader, i); 191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sampler[i] = ureg_DECL_sampler(shader, i); 192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < 2; ++i) { 195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org t_tc[i] = ureg_DECL_temporary(shader); 196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org t_texel[i] = ureg_DECL_temporary(shader); 197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org o_fragment = ureg_DECL_output(shader, TGSI_SEMANTIC_COLOR, 0); 199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* calculate the texture offsets 201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * t_tc.x = i_tc.x 202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * t_tc.y = (round(i_tc.y) + 0.5) / height * 2 203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < 2; ++i) { 205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_MOV(shader, ureg_writemask(t_tc[i], TGSI_WRITEMASK_X), i_tc[i]); 206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_ROUND(shader, ureg_writemask(t_tc[i], TGSI_WRITEMASK_YZ), i_tc[i]); 207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_MOV(shader, ureg_writemask(t_tc[i], TGSI_WRITEMASK_W), 208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_imm1f(shader, i ? 0.75f : 0.25f)); 209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_ADD(shader, ureg_writemask(t_tc[i], TGSI_WRITEMASK_YZ), 210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_src(t_tc[i]), ureg_imm1f(shader, 0.5f)); 211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_MUL(shader, ureg_writemask(t_tc[i], TGSI_WRITEMASK_Y), 212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_src(t_tc[i]), ureg_scalar(i_tc[0], TGSI_SWIZZLE_W)); 213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_MUL(shader, ureg_writemask(t_tc[i], TGSI_WRITEMASK_Z), 214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_src(t_tc[i]), ureg_scalar(i_tc[1], TGSI_SWIZZLE_W)); 215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* fetch the texels 218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * texel[0..1].x = tex(t_tc[0..1][0]) 219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * texel[0..1].y = tex(t_tc[0..1][1]) 220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * texel[0..1].z = tex(t_tc[0..1][2]) 221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < 2; ++i) 223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (j = 0; j < 3; ++j) { 224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_src src = ureg_swizzle(ureg_src(t_tc[i]), 225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org TGSI_SWIZZLE_X, j ? TGSI_SWIZZLE_Z : TGSI_SWIZZLE_Y, TGSI_SWIZZLE_W, TGSI_SWIZZLE_W); 226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_TEX(shader, ureg_writemask(t_texel[i], TGSI_WRITEMASK_X << j), 228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org TGSI_TEXTURE_3D, src, sampler[j]); 229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* calculate linear interpolation factor 232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * factor = |round(i_tc.y) - i_tc.y| * 2 233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_ROUND(shader, ureg_writemask(t_tc[0], TGSI_WRITEMASK_YZ), i_tc[0]); 235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_ADD(shader, ureg_writemask(t_tc[0], TGSI_WRITEMASK_YZ), 236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_src(t_tc[0]), ureg_negate(i_tc[0])); 237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_MUL(shader, ureg_writemask(t_tc[0], TGSI_WRITEMASK_XY), 238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_abs(ureg_src(t_tc[0])), ureg_imm1f(shader, 2.0f)); 239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_LRP(shader, t_texel[0], ureg_swizzle(ureg_src(t_tc[0]), 240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org TGSI_SWIZZLE_Y, TGSI_SWIZZLE_Z, TGSI_SWIZZLE_Z, TGSI_SWIZZLE_Z), 241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_src(t_texel[1]), ureg_src(t_texel[0])); 242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* and finally do colour space transformation 244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * fragment = csc * texel 245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_MOV(shader, ureg_writemask(t_texel[0], TGSI_WRITEMASK_W), ureg_imm1f(shader, 1.0f)); 247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < 3; ++i) 248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_DP4(shader, ureg_writemask(o_fragment, TGSI_WRITEMASK_X << i), csc[i], ureg_src(t_texel[0])); 249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_MOV(shader, ureg_writemask(o_fragment, TGSI_WRITEMASK_W), ureg_imm1f(shader, 1.0f)); 251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < 2; ++i) { 253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_release_temporary(shader, t_texel[i]); 254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_release_temporary(shader, t_tc[i]); 255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_END(shader); 258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return ureg_create_shader_and_destroy(shader, c->pipe); 260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void * 263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgcreate_frag_shader_palette(struct vl_compositor *c, bool include_cc) 264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_program *shader; 266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_src csc[3]; 267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_src tc; 268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_src sampler; 269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_src palette; 270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_dst texel; 271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_dst fragment; 272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned i; 273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org shader = ureg_create(TGSI_PROCESSOR_FRAGMENT); 275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!shader) 276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return false; 277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; include_cc && i < 3; ++i) 279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org csc[i] = ureg_DECL_constant(shader, i); 280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tc = ureg_DECL_fs_input(shader, TGSI_SEMANTIC_GENERIC, VS_O_VTEX, TGSI_INTERPOLATE_LINEAR); 282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sampler = ureg_DECL_sampler(shader, 0); 283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org palette = ureg_DECL_sampler(shader, 1); 284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texel = ureg_DECL_temporary(shader); 286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fragment = ureg_DECL_output(shader, TGSI_SEMANTIC_COLOR, 0); 287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * texel = tex(tc, sampler) 290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * fragment.xyz = tex(texel, palette) * csc 291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * fragment.a = texel.a 292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_TEX(shader, texel, TGSI_TEXTURE_2D, tc, sampler); 294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_MOV(shader, ureg_writemask(fragment, TGSI_WRITEMASK_W), ureg_src(texel)); 295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (include_cc) { 297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_TEX(shader, texel, TGSI_TEXTURE_1D, ureg_src(texel), palette); 298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < 3; ++i) 299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_DP4(shader, ureg_writemask(fragment, TGSI_WRITEMASK_X << i), csc[i], ureg_src(texel)); 300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_TEX(shader, ureg_writemask(fragment, TGSI_WRITEMASK_XYZ), 302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org TGSI_TEXTURE_1D, ureg_src(texel), palette); 303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_release_temporary(shader, texel); 306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_END(shader); 307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return ureg_create_shader_and_destroy(shader, c->pipe); 309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void * 312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgcreate_frag_shader_rgba(struct vl_compositor *c) 313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_program *shader; 315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_src tc, color, sampler; 316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ureg_dst texel, fragment; 317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org shader = ureg_create(TGSI_PROCESSOR_FRAGMENT); 319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!shader) 320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return false; 321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tc = ureg_DECL_fs_input(shader, TGSI_SEMANTIC_GENERIC, VS_O_VTEX, TGSI_INTERPOLATE_LINEAR); 323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org color = ureg_DECL_fs_input(shader, TGSI_SEMANTIC_COLOR, VS_O_COLOR, TGSI_INTERPOLATE_LINEAR); 324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sampler = ureg_DECL_sampler(shader, 0); 325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texel = ureg_DECL_temporary(shader); 326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fragment = ureg_DECL_output(shader, TGSI_SEMANTIC_COLOR, 0); 327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * fragment = tex(tc, sampler) 330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_TEX(shader, texel, TGSI_TEXTURE_2D, tc, sampler); 332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_MUL(shader, fragment, ureg_src(texel), color); 333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ureg_END(shader); 334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return ureg_create_shader_and_destroy(shader, c->pipe); 336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic bool 339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orginit_shaders(struct vl_compositor *c) 340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(c); 342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org c->vs = create_vert_shader(c); 344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!c->vs) { 345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org debug_printf("Unable to create vertex shader.\n"); 346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return false; 347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org c->fs_video_buffer = create_frag_shader_video_buffer(c); 350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!c->fs_video_buffer) { 351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org debug_printf("Unable to create YCbCr-to-RGB fragment shader.\n"); 352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return false; 353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org c->fs_weave = create_frag_shader_weave(c); 356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!c->fs_weave) { 357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org debug_printf("Unable to create YCbCr-to-RGB weave fragment shader.\n"); 358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return false; 359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org c->fs_palette.yuv = create_frag_shader_palette(c, true); 362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!c->fs_palette.yuv) { 363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org debug_printf("Unable to create YUV-Palette-to-RGB fragment shader.\n"); 364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return false; 365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org c->fs_palette.rgb = create_frag_shader_palette(c, false); 368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!c->fs_palette.rgb) { 369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org debug_printf("Unable to create RGB-Palette-to-RGB fragment shader.\n"); 370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return false; 371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org c->fs_rgba = create_frag_shader_rgba(c); 374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!c->fs_rgba) { 375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org debug_printf("Unable to create RGB-to-RGB fragment shader.\n"); 376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return false; 377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return true; 380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void cleanup_shaders(struct vl_compositor *c) 383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(c); 385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org c->pipe->delete_vs_state(c->pipe, c->vs); 387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org c->pipe->delete_fs_state(c->pipe, c->fs_video_buffer); 388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org c->pipe->delete_fs_state(c->pipe, c->fs_weave); 389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org c->pipe->delete_fs_state(c->pipe, c->fs_palette.yuv); 390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org c->pipe->delete_fs_state(c->pipe, c->fs_palette.rgb); 391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org c->pipe->delete_fs_state(c->pipe, c->fs_rgba); 392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic bool 395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orginit_pipe_state(struct vl_compositor *c) 396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_rasterizer_state rast; 398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_sampler_state sampler; 399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_blend_state blend; 400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_depth_stencil_alpha_state dsa; 401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned i; 402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(c); 404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org c->fb_state.nr_cbufs = 1; 406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org c->fb_state.zsbuf = NULL; 407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&sampler, 0, sizeof(sampler)); 409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sampler.wrap_s = PIPE_TEX_WRAP_CLAMP_TO_EDGE; 410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sampler.wrap_t = PIPE_TEX_WRAP_CLAMP_TO_EDGE; 411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sampler.wrap_r = PIPE_TEX_WRAP_REPEAT; 412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sampler.min_img_filter = PIPE_TEX_FILTER_LINEAR; 413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sampler.min_mip_filter = PIPE_TEX_MIPFILTER_NONE; 414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sampler.mag_img_filter = PIPE_TEX_FILTER_LINEAR; 415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sampler.compare_mode = PIPE_TEX_COMPARE_NONE; 416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sampler.compare_func = PIPE_FUNC_ALWAYS; 417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sampler.normalized_coords = 1; 418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org c->sampler_linear = c->pipe->create_sampler_state(c->pipe, &sampler); 420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sampler.min_img_filter = PIPE_TEX_FILTER_NEAREST; 422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sampler.mag_img_filter = PIPE_TEX_FILTER_NEAREST; 423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org c->sampler_nearest = c->pipe->create_sampler_state(c->pipe, &sampler); 424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&blend, 0, sizeof blend); 426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blend.independent_blend_enable = 0; 427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blend.rt[0].blend_enable = 0; 428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blend.logicop_enable = 0; 429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blend.logicop_func = PIPE_LOGICOP_CLEAR; 430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blend.rt[0].colormask = PIPE_MASK_RGBA; 431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blend.dither = 0; 432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org c->blend_clear = c->pipe->create_blend_state(c->pipe, &blend); 433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blend.rt[0].blend_enable = 1; 435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blend.rt[0].rgb_func = PIPE_BLEND_ADD; 436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blend.rt[0].rgb_src_factor = PIPE_BLENDFACTOR_SRC_ALPHA; 437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blend.rt[0].rgb_dst_factor = PIPE_BLENDFACTOR_INV_SRC_ALPHA; 438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blend.rt[0].alpha_func = PIPE_BLEND_ADD; 439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blend.rt[0].alpha_src_factor = PIPE_BLENDFACTOR_ONE; 440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blend.rt[0].alpha_dst_factor = PIPE_BLENDFACTOR_ONE; 441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org c->blend_add = c->pipe->create_blend_state(c->pipe, &blend); 442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&rast, 0, sizeof rast); 444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rast.flatshade = 0; 445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rast.front_ccw = 1; 446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rast.cull_face = PIPE_FACE_NONE; 447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rast.fill_back = PIPE_POLYGON_MODE_FILL; 448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rast.fill_front = PIPE_POLYGON_MODE_FILL; 449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rast.scissor = 1; 450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rast.line_width = 1; 451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rast.point_size_per_vertex = 1; 452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rast.offset_units = 1; 453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rast.offset_scale = 1; 454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rast.gl_rasterization_rules = 1; 455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rast.depth_clip = 1; 456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org c->rast = c->pipe->create_rasterizer_state(c->pipe, &rast); 458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&dsa, 0, sizeof dsa); 460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dsa.depth.enabled = 0; 461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dsa.depth.writemask = 0; 462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dsa.depth.func = PIPE_FUNC_ALWAYS; 463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < 2; ++i) { 464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dsa.stencil[i].enabled = 0; 465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dsa.stencil[i].func = PIPE_FUNC_ALWAYS; 466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dsa.stencil[i].fail_op = PIPE_STENCIL_OP_KEEP; 467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dsa.stencil[i].zpass_op = PIPE_STENCIL_OP_KEEP; 468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dsa.stencil[i].zfail_op = PIPE_STENCIL_OP_KEEP; 469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dsa.stencil[i].valuemask = 0; 470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dsa.stencil[i].writemask = 0; 471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dsa.alpha.enabled = 0; 473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dsa.alpha.func = PIPE_FUNC_ALWAYS; 474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dsa.alpha.ref_value = 0; 475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org c->dsa = c->pipe->create_depth_stencil_alpha_state(c->pipe, &dsa); 476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org c->pipe->bind_depth_stencil_alpha_state(c->pipe, c->dsa); 477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return true; 479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void cleanup_pipe_state(struct vl_compositor *c) 482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(c); 484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Asserted in softpipe_delete_fs_state() for some reason */ 486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org c->pipe->bind_vs_state(c->pipe, NULL); 487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org c->pipe->bind_fs_state(c->pipe, NULL); 488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org c->pipe->delete_depth_stencil_alpha_state(c->pipe, c->dsa); 490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org c->pipe->delete_sampler_state(c->pipe, c->sampler_linear); 491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org c->pipe->delete_sampler_state(c->pipe, c->sampler_nearest); 492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org c->pipe->delete_blend_state(c->pipe, c->blend_clear); 493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org c->pipe->delete_blend_state(c->pipe, c->blend_add); 494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org c->pipe->delete_rasterizer_state(c->pipe, c->rast); 495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic bool 498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgcreate_vertex_buffer(struct vl_compositor *c) 499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(c); 501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_resource_reference(&c->vertex_buf.buffer, NULL); 503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org c->vertex_buf.buffer = pipe_buffer_create 504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ( 505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org c->pipe->screen, 506f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PIPE_BIND_VERTEX_BUFFER, 507f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PIPE_USAGE_STREAM, 508f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org c->vertex_buf.stride * VL_COMPOSITOR_MAX_LAYERS * 4 509f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ); 510f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 511f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return c->vertex_buf.buffer != NULL; 512f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 513f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 514f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic bool 515f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orginit_buffers(struct vl_compositor *c) 516f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 517f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_vertex_element vertex_elems[3]; 518f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 519f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(c); 520f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 521f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 522f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Create our vertex buffer and vertex buffer elements 523f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 524f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org c->vertex_buf.stride = sizeof(struct vertex2f) + sizeof(struct vertex4f) * 2; 525f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org c->vertex_buf.buffer_offset = 0; 526f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org create_vertex_buffer(c); 527f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 528f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vertex_elems[0].src_offset = 0; 529f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vertex_elems[0].instance_divisor = 0; 530f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vertex_elems[0].vertex_buffer_index = 0; 531f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vertex_elems[0].src_format = PIPE_FORMAT_R32G32_FLOAT; 532f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vertex_elems[1].src_offset = sizeof(struct vertex2f); 533f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vertex_elems[1].instance_divisor = 0; 534f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vertex_elems[1].vertex_buffer_index = 0; 535f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vertex_elems[1].src_format = PIPE_FORMAT_R32G32B32A32_FLOAT; 536f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vertex_elems[2].src_offset = sizeof(struct vertex2f) + sizeof(struct vertex4f); 537f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vertex_elems[2].instance_divisor = 0; 538f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vertex_elems[2].vertex_buffer_index = 0; 539f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vertex_elems[2].src_format = PIPE_FORMAT_R32G32B32A32_FLOAT; 540f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org c->vertex_elems_state = c->pipe->create_vertex_elements_state(c->pipe, 3, vertex_elems); 541f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 542f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return true; 543f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 544f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 545f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 546f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgcleanup_buffers(struct vl_compositor *c) 547f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 548f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(c); 549f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 550f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org c->pipe->delete_vertex_elements_state(c->pipe, c->vertex_elems_state); 551f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_resource_reference(&c->vertex_buf.buffer, NULL); 552f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 553f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 554f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE struct u_rect 555f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdefault_rect(struct vl_compositor_layer *layer) 556f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 557f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_resource *res = layer->sampler_views[0]->texture; 558f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct u_rect rect = { 0, res->width0, 0, res->height0 * res->depth0 }; 559f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return rect; 560f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 561f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 562f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE struct vertex2f 563f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgcalc_topleft(struct vertex2f size, struct u_rect rect) 564f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 565f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct vertex2f res = { rect.x0 / size.x, rect.y0 / size.y }; 566f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return res; 567f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 568f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 569f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE struct vertex2f 570f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgcalc_bottomright(struct vertex2f size, struct u_rect rect) 571f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 572f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct vertex2f res = { rect.x1 / size.x, rect.y1 / size.y }; 573f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return res; 574f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 575f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 576f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE void 577f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgcalc_src_and_dst(struct vl_compositor_layer *layer, unsigned width, unsigned height, 578f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct u_rect src, struct u_rect dst) 579f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 580f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct vertex2f size = { width, height }; 581f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 582f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org layer->src.tl = calc_topleft(size, src); 583f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org layer->src.br = calc_bottomright(size, src); 584f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org layer->dst.tl = calc_topleft(size, dst); 585f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org layer->dst.br = calc_bottomright(size, dst); 586f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org layer->zw.x = 0.0f; 587f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org layer->zw.y = size.y; 588f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 589f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 590f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 591f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orggen_rect_verts(struct vertex2f *vb, struct vl_compositor_layer *layer) 592f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 593f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(vb && layer); 594f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 595f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vb[ 0].x = layer->dst.tl.x; 596f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vb[ 0].y = layer->dst.tl.y; 597f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vb[ 1].x = layer->src.tl.x; 598f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vb[ 1].y = layer->src.tl.y; 599f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vb[ 2] = layer->zw; 600f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vb[ 3].x = layer->colors[0].x; 601f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vb[ 3].y = layer->colors[0].y; 602f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vb[ 4].x = layer->colors[0].z; 603f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vb[ 4].y = layer->colors[0].w; 604f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 605f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vb[ 5].x = layer->dst.br.x; 606f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vb[ 5].y = layer->dst.tl.y; 607f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vb[ 6].x = layer->src.br.x; 608f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vb[ 6].y = layer->src.tl.y; 609f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vb[ 7] = layer->zw; 610f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vb[ 8].x = layer->colors[1].x; 611f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vb[ 8].y = layer->colors[1].y; 612f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vb[ 9].x = layer->colors[1].z; 613f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vb[ 9].y = layer->colors[1].w; 614f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 615f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vb[10].x = layer->dst.br.x; 616f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vb[10].y = layer->dst.br.y; 617f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vb[11].x = layer->src.br.x; 618f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vb[11].y = layer->src.br.y; 619f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vb[12] = layer->zw; 620f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vb[13].x = layer->colors[2].x; 621f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vb[13].y = layer->colors[2].y; 622f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vb[14].x = layer->colors[2].z; 623f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vb[14].y = layer->colors[2].w; 624f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 625f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vb[15].x = layer->dst.tl.x; 626f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vb[15].y = layer->dst.br.y; 627f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vb[16].x = layer->src.tl.x; 628f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vb[16].y = layer->src.br.y; 629f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vb[17] = layer->zw; 630f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vb[18].x = layer->colors[3].x; 631f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vb[18].y = layer->colors[3].y; 632f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vb[19].x = layer->colors[3].z; 633f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vb[19].y = layer->colors[3].w; 634f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 635f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 636f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE struct u_rect 637f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgcalc_drawn_area(struct vl_compositor_state *s, struct vl_compositor_layer *layer) 638f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 639f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct u_rect result; 640f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 641f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org // scale 642f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org result.x0 = layer->dst.tl.x * layer->viewport.scale[0] + layer->viewport.translate[0]; 643f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org result.y0 = layer->dst.tl.y * layer->viewport.scale[1] + layer->viewport.translate[1]; 644f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org result.x1 = layer->dst.br.x * layer->viewport.scale[0] + layer->viewport.translate[0]; 645f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org result.y1 = layer->dst.br.y * layer->viewport.scale[1] + layer->viewport.translate[1]; 646f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 647f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org // and clip 648f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org result.x0 = MAX2(result.x0, s->scissor.minx); 649f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org result.y0 = MAX2(result.y0, s->scissor.miny); 650f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org result.x1 = MIN2(result.x1, s->scissor.maxx); 651f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org result.y1 = MIN2(result.y1, s->scissor.maxy); 652f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return result; 653f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 654f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 655f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 656f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orggen_vertex_data(struct vl_compositor *c, struct vl_compositor_state *s, struct u_rect *dirty) 657f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 658f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct vertex2f *vb; 659f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_transfer *buf_transfer; 660f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned i; 661f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 662f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(c); 663f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 664f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vb = pipe_buffer_map(c->pipe, c->vertex_buf.buffer, 665f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PIPE_TRANSFER_WRITE | PIPE_TRANSFER_DISCARD_RANGE | PIPE_TRANSFER_DONTBLOCK, 666f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &buf_transfer); 667f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 668f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!vb) { 669f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org // If buffer is still locked from last draw create a new one 670f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org create_vertex_buffer(c); 671f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vb = pipe_buffer_map(c->pipe, c->vertex_buf.buffer, 672f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PIPE_TRANSFER_WRITE | PIPE_TRANSFER_DISCARD_RANGE, 673f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &buf_transfer); 674f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 675f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 676f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < VL_COMPOSITOR_MAX_LAYERS; i++) { 677f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (s->used_layers & (1 << i)) { 678f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct vl_compositor_layer *layer = &s->layers[i]; 679f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org gen_rect_verts(vb, layer); 680f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vb += 20; 681f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 682f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!layer->viewport_valid) { 683f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org layer->viewport.scale[0] = c->fb_state.width; 684f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org layer->viewport.scale[1] = c->fb_state.height; 685f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org layer->viewport.translate[0] = 0; 686f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org layer->viewport.translate[1] = 0; 687f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 688f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 689f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dirty && layer->clearing) { 690f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct u_rect drawn = calc_drawn_area(s, layer); 691f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ( 692f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dirty->x0 >= drawn.x0 && 693f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dirty->y0 >= drawn.y0 && 694f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dirty->x1 <= drawn.x1 && 695f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dirty->y1 <= drawn.y1) { 696f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 697f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org // We clear the dirty area anyway, no need for clear_render_target 698f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dirty->x0 = dirty->y0 = MAX_DIRTY; 699f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dirty->x1 = dirty->y1 = MIN_DIRTY; 700f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 701f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 702f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 703f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 704f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 705f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_buffer_unmap(c->pipe, buf_transfer); 706f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 707f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 708f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 709f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdraw_layers(struct vl_compositor *c, struct vl_compositor_state *s, struct u_rect *dirty) 710f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 711f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned vb_index, i; 712f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 713f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(c); 714f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 715f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0, vb_index = 0; i < VL_COMPOSITOR_MAX_LAYERS; ++i) { 716f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (s->used_layers & (1 << i)) { 717f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct vl_compositor_layer *layer = &s->layers[i]; 718f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_sampler_view **samplers = &layer->sampler_views[0]; 719f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned num_sampler_views = !samplers[1] ? 1 : !samplers[2] ? 2 : 3; 720f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void *blend = layer->blend ? layer->blend : i ? c->blend_add : c->blend_clear; 721f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 722f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org c->pipe->bind_blend_state(c->pipe, blend); 723f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org c->pipe->set_viewport_state(c->pipe, &layer->viewport); 724f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org c->pipe->bind_fs_state(c->pipe, layer->fs); 725f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org c->pipe->bind_fragment_sampler_states(c->pipe, num_sampler_views, layer->samplers); 726f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org c->pipe->set_fragment_sampler_views(c->pipe, num_sampler_views, samplers); 727f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org util_draw_arrays(c->pipe, PIPE_PRIM_QUADS, vb_index * 4, 4); 728f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vb_index++; 729f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 730f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dirty) { 731f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org // Remember the currently drawn area as dirty for the next draw command 732f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct u_rect drawn = calc_drawn_area(s, layer); 733f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dirty->x0 = MIN2(drawn.x0, dirty->x0); 734f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dirty->y0 = MIN2(drawn.y0, dirty->y0); 735f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dirty->x1 = MAX2(drawn.x1, dirty->x1); 736f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dirty->y1 = MAX2(drawn.y1, dirty->y1); 737f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 738f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 739f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 740f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 741f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 742f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 743f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvl_compositor_reset_dirty_area(struct u_rect *dirty) 744f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 745f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(dirty); 746f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 747f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dirty->x0 = dirty->y0 = MIN_DIRTY; 748f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dirty->x1 = dirty->y1 = MAX_DIRTY; 749f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 750f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 751f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 752f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvl_compositor_set_clear_color(struct vl_compositor_state *s, union pipe_color_union *color) 753f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 754f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(s); 755f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(color); 756f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 757f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org s->clear_color = *color; 758f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 759f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 760f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 761f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvl_compositor_get_clear_color(struct vl_compositor_state *s, union pipe_color_union *color) 762f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 763f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(s); 764f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(color); 765f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 766f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *color = s->clear_color; 767f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 768f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 769f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 770f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvl_compositor_clear_layers(struct vl_compositor_state *s) 771f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 772f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned i, j; 773f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 774f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(s); 775f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 776f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org s->used_layers = 0; 777f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for ( i = 0; i < VL_COMPOSITOR_MAX_LAYERS; ++i) { 778f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct vertex4f v_one = { 1.0f, 1.0f, 1.0f, 1.0f }; 779f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org s->layers[i].clearing = i ? false : true; 780f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org s->layers[i].blend = NULL; 781f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org s->layers[i].fs = NULL; 782f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org s->layers[i].viewport.scale[2] = 1; 783f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org s->layers[i].viewport.scale[3] = 1; 784f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org s->layers[i].viewport.translate[2] = 0; 785f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org s->layers[i].viewport.translate[3] = 0; 786f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 787f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for ( j = 0; j < 3; j++) 788f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_sampler_view_reference(&s->layers[i].sampler_views[j], NULL); 789f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for ( j = 0; j < 4; ++j) 790f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org s->layers[i].colors[j] = v_one; 791f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 792f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 793f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 794f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 795f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvl_compositor_cleanup(struct vl_compositor *c) 796f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 797f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(c); 798f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 799f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cleanup_buffers(c); 800f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cleanup_shaders(c); 801f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cleanup_pipe_state(c); 802f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 803f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 804f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 805f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvl_compositor_set_csc_matrix(struct vl_compositor_state *s, vl_csc_matrix const *matrix) 806f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 807f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_transfer *buf_transfer; 808f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 809f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(s); 810f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 811f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memcpy 812f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ( 813f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_buffer_map(s->pipe, s->csc_matrix, 814f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PIPE_TRANSFER_WRITE | PIPE_TRANSFER_DISCARD_RANGE, 815f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &buf_transfer), 816f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org matrix, 817f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sizeof(vl_csc_matrix) 818f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ); 819f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 820f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_buffer_unmap(s->pipe, buf_transfer); 821f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 822f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 823f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 824f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvl_compositor_set_dst_clip(struct vl_compositor_state *s, struct u_rect *dst_clip) 825f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 826f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(s); 827f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 828f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org s->scissor_valid = dst_clip != NULL; 829f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dst_clip) { 830f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org s->scissor.minx = dst_clip->x0; 831f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org s->scissor.miny = dst_clip->y0; 832f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org s->scissor.maxx = dst_clip->x1; 833f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org s->scissor.maxy = dst_clip->y1; 834f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 835f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 836f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 837f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 838f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvl_compositor_set_layer_blend(struct vl_compositor_state *s, 839f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned layer, void *blend, 840f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bool is_clearing) 841f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 842f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(s && blend); 843f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 844f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(layer < VL_COMPOSITOR_MAX_LAYERS); 845f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 846f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org s->layers[layer].clearing = is_clearing; 847f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org s->layers[layer].blend = blend; 848f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 849f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 850f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 851f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvl_compositor_set_layer_dst_area(struct vl_compositor_state *s, 852f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned layer, struct u_rect *dst_area) 853f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 854f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(s); 855f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 856f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(layer < VL_COMPOSITOR_MAX_LAYERS); 857f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 858f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org s->layers[layer].viewport_valid = dst_area != NULL; 859f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dst_area) { 860f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org s->layers[layer].viewport.scale[0] = dst_area->x1 - dst_area->x0; 861f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org s->layers[layer].viewport.scale[1] = dst_area->y1 - dst_area->y0; 862f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org s->layers[layer].viewport.translate[0] = dst_area->x0; 863f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org s->layers[layer].viewport.translate[1] = dst_area->y0; 864f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 865f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 866f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 867f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 868f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvl_compositor_set_buffer_layer(struct vl_compositor_state *s, 869f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct vl_compositor *c, 870f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned layer, 871f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_video_buffer *buffer, 872f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct u_rect *src_rect, 873f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct u_rect *dst_rect, 874f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org enum vl_compositor_deinterlace deinterlace) 875f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 876f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_sampler_view **sampler_views; 877f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned i; 878f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 879f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(s && c && buffer); 880f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 881f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(layer < VL_COMPOSITOR_MAX_LAYERS); 882f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 883f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org s->used_layers |= 1 << layer; 884f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sampler_views = buffer->get_sampler_view_components(buffer); 885f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < 3; ++i) { 886f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org s->layers[layer].samplers[i] = c->sampler_linear; 887f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_sampler_view_reference(&s->layers[layer].sampler_views[i], sampler_views[i]); 888f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 889f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 890f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org calc_src_and_dst(&s->layers[layer], buffer->width, buffer->height, 891f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src_rect ? *src_rect : default_rect(&s->layers[layer]), 892f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst_rect ? *dst_rect : default_rect(&s->layers[layer])); 893f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 894f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (buffer->interlaced) { 895f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org float half_a_line = 0.5f / s->layers[layer].zw.y; 896f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch(deinterlace) { 897f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case VL_COMPOSITOR_WEAVE: 898f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org s->layers[layer].fs = c->fs_weave; 899f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 900f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 901f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case VL_COMPOSITOR_BOB_TOP: 902f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org s->layers[layer].zw.x = 0.25f; 903f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org s->layers[layer].src.tl.y += half_a_line; 904f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org s->layers[layer].src.br.y += half_a_line; 905f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org s->layers[layer].fs = c->fs_video_buffer; 906f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 907f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 908f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case VL_COMPOSITOR_BOB_BOTTOM: 909f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org s->layers[layer].zw.x = 0.75f; 910f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org s->layers[layer].src.tl.y -= half_a_line; 911f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org s->layers[layer].src.br.y -= half_a_line; 912f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org s->layers[layer].fs = c->fs_video_buffer; 913f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 914f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 915f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 916f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else 917f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org s->layers[layer].fs = c->fs_video_buffer; 918f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 919f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 920f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 921f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvl_compositor_set_palette_layer(struct vl_compositor_state *s, 922f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct vl_compositor *c, 923f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned layer, 924f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_sampler_view *indexes, 925f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_sampler_view *palette, 926f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct u_rect *src_rect, 927f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct u_rect *dst_rect, 928f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bool include_color_conversion) 929f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 930f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(s && c && indexes && palette); 931f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 932f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(layer < VL_COMPOSITOR_MAX_LAYERS); 933f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 934f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org s->used_layers |= 1 << layer; 935f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 936f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org s->layers[layer].fs = include_color_conversion ? 937f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org c->fs_palette.yuv : c->fs_palette.rgb; 938f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 939f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org s->layers[layer].samplers[0] = c->sampler_linear; 940f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org s->layers[layer].samplers[1] = c->sampler_nearest; 941f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org s->layers[layer].samplers[2] = NULL; 942f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_sampler_view_reference(&s->layers[layer].sampler_views[0], indexes); 943f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_sampler_view_reference(&s->layers[layer].sampler_views[1], palette); 944f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_sampler_view_reference(&s->layers[layer].sampler_views[2], NULL); 945f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org calc_src_and_dst(&s->layers[layer], indexes->texture->width0, indexes->texture->height0, 946f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src_rect ? *src_rect : default_rect(&s->layers[layer]), 947f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst_rect ? *dst_rect : default_rect(&s->layers[layer])); 948f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 949f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 950f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 951f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvl_compositor_set_rgba_layer(struct vl_compositor_state *s, 952f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct vl_compositor *c, 953f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned layer, 954f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_sampler_view *rgba, 955f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct u_rect *src_rect, 956f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct u_rect *dst_rect, 957f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct vertex4f *colors) 958f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 959f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned i; 960f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 961f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(s && c && rgba); 962f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 963f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(layer < VL_COMPOSITOR_MAX_LAYERS); 964f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 965f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org s->used_layers |= 1 << layer; 966f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org s->layers[layer].fs = c->fs_rgba; 967f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org s->layers[layer].samplers[0] = c->sampler_linear; 968f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org s->layers[layer].samplers[1] = NULL; 969f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org s->layers[layer].samplers[2] = NULL; 970f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_sampler_view_reference(&s->layers[layer].sampler_views[0], rgba); 971f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_sampler_view_reference(&s->layers[layer].sampler_views[1], NULL); 972f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_sampler_view_reference(&s->layers[layer].sampler_views[2], NULL); 973f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org calc_src_and_dst(&s->layers[layer], rgba->texture->width0, rgba->texture->height0, 974f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src_rect ? *src_rect : default_rect(&s->layers[layer]), 975f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst_rect ? *dst_rect : default_rect(&s->layers[layer])); 976f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 977f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (colors) 978f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < 4; ++i) 979f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org s->layers[layer].colors[i] = colors[i]; 980f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 981f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 982f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 983f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvl_compositor_render(struct vl_compositor_state *s, 984f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct vl_compositor *c, 985f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_surface *dst_surface, 986f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct u_rect *dirty_area) 987f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 988f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(c); 989f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(dst_surface); 990f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 991f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org c->fb_state.width = dst_surface->width; 992f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org c->fb_state.height = dst_surface->height; 993f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org c->fb_state.cbufs[0] = dst_surface; 994f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 995f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!s->scissor_valid) { 996f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org s->scissor.minx = 0; 997f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org s->scissor.miny = 0; 998f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org s->scissor.maxx = dst_surface->width; 999f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org s->scissor.maxy = dst_surface->height; 1000f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1001f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1002f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org gen_vertex_data(c, s, dirty_area); 1003f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1004f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dirty_area && (dirty_area->x0 < dirty_area->x1 || 1005f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dirty_area->y0 < dirty_area->y1)) { 1006f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1007f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org c->pipe->clear_render_target(c->pipe, dst_surface, &s->clear_color, 1008f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 0, 0, dst_surface->width, dst_surface->height); 1009f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dirty_area->x0 = dirty_area->y0 = MAX_DIRTY; 1010f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dirty_area->x1 = dirty_area->y1 = MIN_DIRTY; 1011f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1012f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1013f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org c->pipe->set_scissor_state(c->pipe, &s->scissor); 1014f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org c->pipe->set_framebuffer_state(c->pipe, &c->fb_state); 1015f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org c->pipe->bind_vs_state(c->pipe, c->vs); 1016f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org c->pipe->set_vertex_buffers(c->pipe, 1, &c->vertex_buf); 1017f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org c->pipe->bind_vertex_elements_state(c->pipe, c->vertex_elems_state); 1018f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_set_constant_buffer(c->pipe, PIPE_SHADER_FRAGMENT, 0, s->csc_matrix); 1019f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org c->pipe->bind_rasterizer_state(c->pipe, c->rast); 1020f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1021f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org draw_layers(c, s, dirty_area); 1022f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1023f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1024f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgbool 1025f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvl_compositor_init(struct vl_compositor *c, struct pipe_context *pipe) 1026f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1027f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(c); 1028f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1029f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(c, 0, sizeof(*c)); 1030f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1031f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org c->pipe = pipe; 1032f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1033f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!init_pipe_state(c)) 1034f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return false; 1035f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1036f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!init_shaders(c)) { 1037f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cleanup_pipe_state(c); 1038f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return false; 1039f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1040f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1041f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!init_buffers(c)) { 1042f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cleanup_shaders(c); 1043f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cleanup_pipe_state(c); 1044f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return false; 1045f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1046f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1047f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return true; 1048f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1049f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1050f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgbool 1051f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvl_compositor_init_state(struct vl_compositor_state *s, struct pipe_context *pipe) 1052f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1053f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vl_csc_matrix csc_matrix; 1054f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1055f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(s); 1056f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1057f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(s, 0, sizeof(*s)); 1058f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1059f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org s->pipe = pipe; 1060f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1061f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org s->clear_color.f[0] = s->clear_color.f[1] = 0.0f; 1062f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org s->clear_color.f[2] = s->clear_color.f[3] = 0.0f; 1063f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1064f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 1065f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Create our fragment shader's constant buffer 1066f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Const buffer contains the color conversion matrix and bias vectors 1067f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1068f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* XXX: Create with IMMUTABLE/STATIC... although it does change every once in a long while... */ 1069f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org s->csc_matrix = pipe_buffer_create 1070f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ( 1071f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->screen, 1072f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PIPE_BIND_CONSTANT_BUFFER, 1073f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PIPE_USAGE_STATIC, 1074f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sizeof(csc_matrix) 1075f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ); 1076f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1077f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vl_compositor_clear_layers(s); 1078f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1079f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vl_csc_get_matrix(VL_CSC_COLOR_STANDARD_IDENTITY, NULL, true, &csc_matrix); 1080f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vl_compositor_set_csc_matrix(s, (const vl_csc_matrix *)&csc_matrix); 1081f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1082f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return true; 1083f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1084f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1085f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 1086f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvl_compositor_cleanup_state(struct vl_compositor_state *s) 1087f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1088f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(s); 1089f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1090f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vl_compositor_clear_layers(s); 1091f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_resource_reference(&s->csc_matrix, NULL); 1092f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1093