1fcb595c04f9ee275eae49b7bb7c61246671f5ce2Younes Manton/************************************************************************** 28cdfa77b18b62687870824d998b7d5d21204d2ceYounes Manton * 3fcb595c04f9ee275eae49b7bb7c61246671f5ce2Younes Manton * Copyright 2009 Younes Manton. 4fcb595c04f9ee275eae49b7bb7c61246671f5ce2Younes Manton * All Rights Reserved. 58cdfa77b18b62687870824d998b7d5d21204d2ceYounes Manton * 6fcb595c04f9ee275eae49b7bb7c61246671f5ce2Younes Manton * Permission is hereby granted, free of charge, to any person obtaining a 7fcb595c04f9ee275eae49b7bb7c61246671f5ce2Younes Manton * copy of this software and associated documentation files (the 8fcb595c04f9ee275eae49b7bb7c61246671f5ce2Younes Manton * "Software"), to deal in the Software without restriction, including 9fcb595c04f9ee275eae49b7bb7c61246671f5ce2Younes Manton * without limitation the rights to use, copy, modify, merge, publish, 10fcb595c04f9ee275eae49b7bb7c61246671f5ce2Younes Manton * distribute, sub license, and/or sell copies of the Software, and to 11fcb595c04f9ee275eae49b7bb7c61246671f5ce2Younes Manton * permit persons to whom the Software is furnished to do so, subject to 12fcb595c04f9ee275eae49b7bb7c61246671f5ce2Younes Manton * the following conditions: 138cdfa77b18b62687870824d998b7d5d21204d2ceYounes Manton * 14fcb595c04f9ee275eae49b7bb7c61246671f5ce2Younes Manton * The above copyright notice and this permission notice (including the 15fcb595c04f9ee275eae49b7bb7c61246671f5ce2Younes Manton * next paragraph) shall be included in all copies or substantial portions 16fcb595c04f9ee275eae49b7bb7c61246671f5ce2Younes Manton * of the Software. 178cdfa77b18b62687870824d998b7d5d21204d2ceYounes Manton * 18fcb595c04f9ee275eae49b7bb7c61246671f5ce2Younes Manton * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 19fcb595c04f9ee275eae49b7bb7c61246671f5ce2Younes Manton * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 20fcb595c04f9ee275eae49b7bb7c61246671f5ce2Younes Manton * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 21fcb595c04f9ee275eae49b7bb7c61246671f5ce2Younes Manton * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR 22fcb595c04f9ee275eae49b7bb7c61246671f5ce2Younes Manton * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 23fcb595c04f9ee275eae49b7bb7c61246671f5ce2Younes Manton * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 24fcb595c04f9ee275eae49b7bb7c61246671f5ce2Younes Manton * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 258cdfa77b18b62687870824d998b7d5d21204d2ceYounes Manton * 26fcb595c04f9ee275eae49b7bb7c61246671f5ce2Younes Manton **************************************************************************/ 27fcb595c04f9ee275eae49b7bb7c61246671f5ce2Younes Manton 28f547472bfa0a797adacc2a7688b4c1ba65381a80Younes Manton#include <assert.h> 295ed848129cb57269e80caf2c1ca522ae41f4500bChristian König 3019bcd21ed151cf1716f2f87dff0f712231aa2ce7Kai Wasserbäch#include "pipe/p_context.h" 315ed848129cb57269e80caf2c1ca522ae41f4500bChristian König 3219bcd21ed151cf1716f2f87dff0f712231aa2ce7Kai Wasserbäch#include "util/u_sampler.h" 3319bcd21ed151cf1716f2f87dff0f712231aa2ce7Kai Wasserbäch#include "util/u_draw.h" 345ed848129cb57269e80caf2c1ca522ae41f4500bChristian König 3519bcd21ed151cf1716f2f87dff0f712231aa2ce7Kai Wasserbäch#include "tgsi/tgsi_ureg.h" 36f547472bfa0a797adacc2a7688b4c1ba65381a80Younes Manton 375ed848129cb57269e80caf2c1ca522ae41f4500bChristian König#include "vl_defines.h" 385ed848129cb57269e80caf2c1ca522ae41f4500bChristian König#include "vl_vertex_buffers.h" 39ca79aeb91e914ac1a4774d51ca49911406377407Christian König#include "vl_mc.h" 407f04fe5338d0846ec9a6003033da5357d2785c8bChristian König#include "vl_idct.h" 415ed848129cb57269e80caf2c1ca522ae41f4500bChristian König 42d8192f18218a364bc497d6348d8ad934b92a1696Christian Königenum VS_OUTPUT 43d8192f18218a364bc497d6348d8ad934b92a1696Christian König{ 4495594bae47d8b3302be188e6f0be2d69c5507bb3Christian König VS_O_VPOS = 0, 4595594bae47d8b3302be188e6f0be2d69c5507bb3Christian König VS_O_VTOP = 0, 467f04fe5338d0846ec9a6003033da5357d2785c8bChristian König VS_O_VBOTTOM, 477f04fe5338d0846ec9a6003033da5357d2785c8bChristian König 487f04fe5338d0846ec9a6003033da5357d2785c8bChristian König VS_O_FLAGS = VS_O_VTOP, 497f04fe5338d0846ec9a6003033da5357d2785c8bChristian König VS_O_VTEX = VS_O_VBOTTOM 50d8192f18218a364bc497d6348d8ad934b92a1696Christian König}; 51d8192f18218a364bc497d6348d8ad934b92a1696Christian König 52b1c44b0ea6b3e891086ce554edf3c26dbd3708cdChristian Königstatic struct ureg_dst 533511780a43077d1359bd491eadb4ab9b3b86795aChristian Königcalc_position(struct vl_mc *r, struct ureg_program *shader, struct ureg_src block_scale) 54b1c44b0ea6b3e891086ce554edf3c26dbd3708cdChristian König{ 55b1c44b0ea6b3e891086ce554edf3c26dbd3708cdChristian König struct ureg_src vrect, vpos; 56b1c44b0ea6b3e891086ce554edf3c26dbd3708cdChristian König struct ureg_dst t_vpos; 57b1c44b0ea6b3e891086ce554edf3c26dbd3708cdChristian König struct ureg_dst o_vpos; 58b1c44b0ea6b3e891086ce554edf3c26dbd3708cdChristian König 59b1c44b0ea6b3e891086ce554edf3c26dbd3708cdChristian König vrect = ureg_DECL_vs_input(shader, VS_I_RECT); 60b1c44b0ea6b3e891086ce554edf3c26dbd3708cdChristian König vpos = ureg_DECL_vs_input(shader, VS_I_VPOS); 61b1c44b0ea6b3e891086ce554edf3c26dbd3708cdChristian König 62b1c44b0ea6b3e891086ce554edf3c26dbd3708cdChristian König t_vpos = ureg_DECL_temporary(shader); 63b1c44b0ea6b3e891086ce554edf3c26dbd3708cdChristian König 64b1c44b0ea6b3e891086ce554edf3c26dbd3708cdChristian König o_vpos = ureg_DECL_output(shader, TGSI_SEMANTIC_POSITION, VS_O_VPOS); 65b1c44b0ea6b3e891086ce554edf3c26dbd3708cdChristian König 66b1c44b0ea6b3e891086ce554edf3c26dbd3708cdChristian König /* 6770a7695b4d1bd3f609eb9f98dd6872f1a5b89762Christian König * block_scale = (VL_MACROBLOCK_WIDTH, VL_MACROBLOCK_HEIGHT) / (dst.width, dst.height) 68b1c44b0ea6b3e891086ce554edf3c26dbd3708cdChristian König * 69b1c44b0ea6b3e891086ce554edf3c26dbd3708cdChristian König * t_vpos = (vpos + vrect) * block_scale 70b1c44b0ea6b3e891086ce554edf3c26dbd3708cdChristian König * o_vpos.xy = t_vpos 71b1c44b0ea6b3e891086ce554edf3c26dbd3708cdChristian König * o_vpos.zw = vpos 72b1c44b0ea6b3e891086ce554edf3c26dbd3708cdChristian König */ 73b1c44b0ea6b3e891086ce554edf3c26dbd3708cdChristian König ureg_ADD(shader, ureg_writemask(t_vpos, TGSI_WRITEMASK_XY), vpos, vrect); 74b1c44b0ea6b3e891086ce554edf3c26dbd3708cdChristian König ureg_MUL(shader, ureg_writemask(t_vpos, TGSI_WRITEMASK_XY), ureg_src(t_vpos), block_scale); 75b1c44b0ea6b3e891086ce554edf3c26dbd3708cdChristian König ureg_MOV(shader, ureg_writemask(o_vpos, TGSI_WRITEMASK_XY), ureg_src(t_vpos)); 763511780a43077d1359bd491eadb4ab9b3b86795aChristian König ureg_MOV(shader, ureg_writemask(o_vpos, TGSI_WRITEMASK_ZW), ureg_imm1f(shader, 1.0f)); 77b1c44b0ea6b3e891086ce554edf3c26dbd3708cdChristian König 78b1c44b0ea6b3e891086ce554edf3c26dbd3708cdChristian König return t_vpos; 79b1c44b0ea6b3e891086ce554edf3c26dbd3708cdChristian König} 80b1c44b0ea6b3e891086ce554edf3c26dbd3708cdChristian König 813511780a43077d1359bd491eadb4ab9b3b86795aChristian Königstatic struct ureg_dst 823511780a43077d1359bd491eadb4ab9b3b86795aChristian Königcalc_line(struct ureg_program *shader) 83f547472bfa0a797adacc2a7688b4c1ba65381a80Younes Manton{ 843511780a43077d1359bd491eadb4ab9b3b86795aChristian König struct ureg_dst tmp; 853511780a43077d1359bd491eadb4ab9b3b86795aChristian König struct ureg_src pos; 86b4c5c6f51ae5398c1be190233f7539f78885fa45Christian König 873511780a43077d1359bd491eadb4ab9b3b86795aChristian König tmp = ureg_DECL_temporary(shader); 88b1c44b0ea6b3e891086ce554edf3c26dbd3708cdChristian König 893511780a43077d1359bd491eadb4ab9b3b86795aChristian König pos = ureg_DECL_fs_input(shader, TGSI_SEMANTIC_POSITION, VS_O_VPOS, TGSI_INTERPOLATE_LINEAR); 90f547472bfa0a797adacc2a7688b4c1ba65381a80Younes Manton 91f547472bfa0a797adacc2a7688b4c1ba65381a80Younes Manton /* 923511780a43077d1359bd491eadb4ab9b3b86795aChristian König * tmp.y = fraction(pos.y / 2) >= 0.5 ? 1 : 0 93f547472bfa0a797adacc2a7688b4c1ba65381a80Younes Manton */ 943511780a43077d1359bd491eadb4ab9b3b86795aChristian König ureg_MUL(shader, ureg_writemask(tmp, TGSI_WRITEMASK_Y), pos, ureg_imm1f(shader, 0.5f)); 953511780a43077d1359bd491eadb4ab9b3b86795aChristian König ureg_FRC(shader, ureg_writemask(tmp, TGSI_WRITEMASK_Y), ureg_src(tmp)); 963511780a43077d1359bd491eadb4ab9b3b86795aChristian König ureg_SGE(shader, ureg_writemask(tmp, TGSI_WRITEMASK_Y), ureg_src(tmp), ureg_imm1f(shader, 0.5f)); 97b1c44b0ea6b3e891086ce554edf3c26dbd3708cdChristian König 983511780a43077d1359bd491eadb4ab9b3b86795aChristian König return tmp; 99b1c44b0ea6b3e891086ce554edf3c26dbd3708cdChristian König} 100b1c44b0ea6b3e891086ce554edf3c26dbd3708cdChristian König 101b1c44b0ea6b3e891086ce554edf3c26dbd3708cdChristian Königstatic void * 102ca79aeb91e914ac1a4774d51ca49911406377407Christian Königcreate_ref_vert_shader(struct vl_mc *r) 103b1c44b0ea6b3e891086ce554edf3c26dbd3708cdChristian König{ 104b1c44b0ea6b3e891086ce554edf3c26dbd3708cdChristian König struct ureg_program *shader; 105b1c44b0ea6b3e891086ce554edf3c26dbd3708cdChristian König struct ureg_src mv_scale; 1062d960d3f4e8fcf7819bb94ba4913ec0a2a723daaMarek Olšák struct ureg_src vmv[2]; 107b1c44b0ea6b3e891086ce554edf3c26dbd3708cdChristian König struct ureg_dst t_vpos; 1084c84acc86fce5eda0aabcb8aa362fd6b5e6a28f6Christian König struct ureg_dst o_vmv[2]; 109b1c44b0ea6b3e891086ce554edf3c26dbd3708cdChristian König unsigned i; 110b1c44b0ea6b3e891086ce554edf3c26dbd3708cdChristian König 111b1c44b0ea6b3e891086ce554edf3c26dbd3708cdChristian König shader = ureg_create(TGSI_PROCESSOR_VERTEX); 112b1c44b0ea6b3e891086ce554edf3c26dbd3708cdChristian König if (!shader) 113b1c44b0ea6b3e891086ce554edf3c26dbd3708cdChristian König return NULL; 114b1c44b0ea6b3e891086ce554edf3c26dbd3708cdChristian König 115b1c44b0ea6b3e891086ce554edf3c26dbd3708cdChristian König vmv[0] = ureg_DECL_vs_input(shader, VS_I_MV_TOP); 116b1c44b0ea6b3e891086ce554edf3c26dbd3708cdChristian König vmv[1] = ureg_DECL_vs_input(shader, VS_I_MV_BOTTOM); 117b1c44b0ea6b3e891086ce554edf3c26dbd3708cdChristian König 1183511780a43077d1359bd491eadb4ab9b3b86795aChristian König t_vpos = calc_position(r, shader, ureg_imm2f(shader, 11970a7695b4d1bd3f609eb9f98dd6872f1a5b89762Christian König (float)VL_MACROBLOCK_WIDTH / r->buffer_width, 12070a7695b4d1bd3f609eb9f98dd6872f1a5b89762Christian König (float)VL_MACROBLOCK_HEIGHT / r->buffer_height) 1213511780a43077d1359bd491eadb4ab9b3b86795aChristian König ); 122b1c44b0ea6b3e891086ce554edf3c26dbd3708cdChristian König 123b1c44b0ea6b3e891086ce554edf3c26dbd3708cdChristian König o_vmv[0] = ureg_DECL_output(shader, TGSI_SEMANTIC_GENERIC, VS_O_VTOP); 124b1c44b0ea6b3e891086ce554edf3c26dbd3708cdChristian König o_vmv[1] = ureg_DECL_output(shader, TGSI_SEMANTIC_GENERIC, VS_O_VBOTTOM); 125b1c44b0ea6b3e891086ce554edf3c26dbd3708cdChristian König 126b1c44b0ea6b3e891086ce554edf3c26dbd3708cdChristian König /* 1273511780a43077d1359bd491eadb4ab9b3b86795aChristian König * mv_scale.xy = 0.5 / (dst.width, dst.height); 1283511780a43077d1359bd491eadb4ab9b3b86795aChristian König * mv_scale.z = 1.0f / 4.0f 1293511780a43077d1359bd491eadb4ab9b3b86795aChristian König * mv_scale.w = 1.0f / 255.0f 130b1c44b0ea6b3e891086ce554edf3c26dbd3708cdChristian König * 131b1c44b0ea6b3e891086ce554edf3c26dbd3708cdChristian König * // Apply motion vectors 1323511780a43077d1359bd491eadb4ab9b3b86795aChristian König * o_vmv[0..1].xy = vmv[0..1] * mv_scale + t_vpos 1333511780a43077d1359bd491eadb4ab9b3b86795aChristian König * o_vmv[0..1].zw = vmv[0..1] * mv_scale 134b1c44b0ea6b3e891086ce554edf3c26dbd3708cdChristian König * 135b1c44b0ea6b3e891086ce554edf3c26dbd3708cdChristian König */ 136b1c44b0ea6b3e891086ce554edf3c26dbd3708cdChristian König 137b1c44b0ea6b3e891086ce554edf3c26dbd3708cdChristian König mv_scale = ureg_imm4f(shader, 138b1c44b0ea6b3e891086ce554edf3c26dbd3708cdChristian König 0.5f / r->buffer_width, 139b1c44b0ea6b3e891086ce554edf3c26dbd3708cdChristian König 0.5f / r->buffer_height, 1409c8bb28ca128dca9f279c78857da1b39223e30f7Christian König 1.0f / 4.0f, 141b7acf83d523563cde613fe805bd8edaa02f64b53Christian König 1.0f / PIPE_VIDEO_MV_WEIGHT_MAX); 142b1c44b0ea6b3e891086ce554edf3c26dbd3708cdChristian König 143b1c44b0ea6b3e891086ce554edf3c26dbd3708cdChristian König for (i = 0; i < 2; ++i) { 144b1c44b0ea6b3e891086ce554edf3c26dbd3708cdChristian König ureg_MAD(shader, ureg_writemask(o_vmv[i], TGSI_WRITEMASK_XY), mv_scale, vmv[i], ureg_src(t_vpos)); 1459c8bb28ca128dca9f279c78857da1b39223e30f7Christian König ureg_MUL(shader, ureg_writemask(o_vmv[i], TGSI_WRITEMASK_ZW), mv_scale, vmv[i]); 146b1c44b0ea6b3e891086ce554edf3c26dbd3708cdChristian König } 147b1c44b0ea6b3e891086ce554edf3c26dbd3708cdChristian König 148b1c44b0ea6b3e891086ce554edf3c26dbd3708cdChristian König ureg_release_temporary(shader, t_vpos); 149c2ec28be3a659ae68b7c0956cd91c5de60d413aaChristian König 150e57f7b7b107c610fa2d7f149f3441c2b4a9600cbYounes Manton ureg_END(shader); 151f547472bfa0a797adacc2a7688b4c1ba65381a80Younes Manton 152b4c5c6f51ae5398c1be190233f7539f78885fa45Christian König return ureg_create_shader_and_destroy(shader, r->pipe); 153f547472bfa0a797adacc2a7688b4c1ba65381a80Younes Manton} 154f547472bfa0a797adacc2a7688b4c1ba65381a80Younes Manton 155b88fa924009b5cc572187d3ca6a395d5226aa1c3Christian Königstatic void * 156ca79aeb91e914ac1a4774d51ca49911406377407Christian Königcreate_ref_frag_shader(struct vl_mc *r) 157d073fec718bbc8f0f520b12d568b9828dd164042Christian König{ 1589c8bb28ca128dca9f279c78857da1b39223e30f7Christian König const float y_scale = 1599c8bb28ca128dca9f279c78857da1b39223e30f7Christian König r->buffer_height / 2 * 16070a7695b4d1bd3f609eb9f98dd6872f1a5b89762Christian König r->macroblock_size / VL_MACROBLOCK_HEIGHT; 1619c8bb28ca128dca9f279c78857da1b39223e30f7Christian König 162b88fa924009b5cc572187d3ca6a395d5226aa1c3Christian König struct ureg_program *shader; 16310c49b28752f5f2d822dfb1e2e6a1ec213cc44daChristian König struct ureg_src tc[2], sampler; 16410c49b28752f5f2d822dfb1e2e6a1ec213cc44daChristian König struct ureg_dst ref, field; 165b88fa924009b5cc572187d3ca6a395d5226aa1c3Christian König struct ureg_dst fragment; 1669c8bb28ca128dca9f279c78857da1b39223e30f7Christian König unsigned label; 1678cdfa77b18b62687870824d998b7d5d21204d2ceYounes Manton 168b88fa924009b5cc572187d3ca6a395d5226aa1c3Christian König shader = ureg_create(TGSI_PROCESSOR_FRAGMENT); 169b88fa924009b5cc572187d3ca6a395d5226aa1c3Christian König if (!shader) 170b88fa924009b5cc572187d3ca6a395d5226aa1c3Christian König return NULL; 171b88fa924009b5cc572187d3ca6a395d5226aa1c3Christian König 172b1c44b0ea6b3e891086ce554edf3c26dbd3708cdChristian König tc[0] = ureg_DECL_fs_input(shader, TGSI_SEMANTIC_GENERIC, VS_O_VTOP, TGSI_INTERPOLATE_LINEAR); 173b1c44b0ea6b3e891086ce554edf3c26dbd3708cdChristian König tc[1] = ureg_DECL_fs_input(shader, TGSI_SEMANTIC_GENERIC, VS_O_VBOTTOM, TGSI_INTERPOLATE_LINEAR); 174d073fec718bbc8f0f520b12d568b9828dd164042Christian König 17510c49b28752f5f2d822dfb1e2e6a1ec213cc44daChristian König sampler = ureg_DECL_sampler(shader, 0); 17610c49b28752f5f2d822dfb1e2e6a1ec213cc44daChristian König ref = ureg_DECL_temporary(shader); 1770b75203c5962475a9cbe27e31373750465f9d949Christian König 178b88fa924009b5cc572187d3ca6a395d5226aa1c3Christian König fragment = ureg_DECL_output(shader, TGSI_SEMANTIC_COLOR, 0); 179b88fa924009b5cc572187d3ca6a395d5226aa1c3Christian König 1803511780a43077d1359bd491eadb4ab9b3b86795aChristian König field = calc_line(shader); 1813bbbb3c54f633ab10e7e2302e8edf3cf1f801858Christian König 182751eb75310f62bd9b7ef18df1730958a467c99adChristian König /* 1839c8bb28ca128dca9f279c78857da1b39223e30f7Christian König * ref = field.z ? tc[1] : tc[0] 1849c8bb28ca128dca9f279c78857da1b39223e30f7Christian König * 1859c8bb28ca128dca9f279c78857da1b39223e30f7Christian König * // Adjust tc acording to top/bottom field selection 1869c8bb28ca128dca9f279c78857da1b39223e30f7Christian König * if (|ref.z|) { 1879c8bb28ca128dca9f279c78857da1b39223e30f7Christian König * ref.y *= y_scale 1889c8bb28ca128dca9f279c78857da1b39223e30f7Christian König * ref.y = floor(ref.y) 1899c8bb28ca128dca9f279c78857da1b39223e30f7Christian König * ref.y += ref.z 1909c8bb28ca128dca9f279c78857da1b39223e30f7Christian König * ref.y /= y_scale 1919c8bb28ca128dca9f279c78857da1b39223e30f7Christian König * } 1929c8bb28ca128dca9f279c78857da1b39223e30f7Christian König * fragment.xyz = tex(ref, sampler[0]) 193751eb75310f62bd9b7ef18df1730958a467c99adChristian König */ 1949c8bb28ca128dca9f279c78857da1b39223e30f7Christian König ureg_CMP(shader, ureg_writemask(ref, TGSI_WRITEMASK_XYZ), 1959c8bb28ca128dca9f279c78857da1b39223e30f7Christian König ureg_negate(ureg_scalar(ureg_src(field), TGSI_SWIZZLE_Y)), 1969c8bb28ca128dca9f279c78857da1b39223e30f7Christian König tc[1], tc[0]); 1979c8bb28ca128dca9f279c78857da1b39223e30f7Christian König ureg_CMP(shader, ureg_writemask(fragment, TGSI_WRITEMASK_W), 1989c8bb28ca128dca9f279c78857da1b39223e30f7Christian König ureg_negate(ureg_scalar(ureg_src(field), TGSI_SWIZZLE_Y)), 1999c8bb28ca128dca9f279c78857da1b39223e30f7Christian König tc[1], tc[0]); 2009c8bb28ca128dca9f279c78857da1b39223e30f7Christian König 2019c8bb28ca128dca9f279c78857da1b39223e30f7Christian König ureg_IF(shader, ureg_scalar(ureg_src(ref), TGSI_SWIZZLE_Z), &label); 2029c8bb28ca128dca9f279c78857da1b39223e30f7Christian König 2039c8bb28ca128dca9f279c78857da1b39223e30f7Christian König ureg_MUL(shader, ureg_writemask(ref, TGSI_WRITEMASK_Y), 2049c8bb28ca128dca9f279c78857da1b39223e30f7Christian König ureg_src(ref), ureg_imm1f(shader, y_scale)); 2059c8bb28ca128dca9f279c78857da1b39223e30f7Christian König ureg_FLR(shader, ureg_writemask(ref, TGSI_WRITEMASK_Y), ureg_src(ref)); 2069c8bb28ca128dca9f279c78857da1b39223e30f7Christian König ureg_ADD(shader, ureg_writemask(ref, TGSI_WRITEMASK_Y), 2079c8bb28ca128dca9f279c78857da1b39223e30f7Christian König ureg_src(ref), ureg_scalar(ureg_src(ref), TGSI_SWIZZLE_Z)); 2089c8bb28ca128dca9f279c78857da1b39223e30f7Christian König ureg_MUL(shader, ureg_writemask(ref, TGSI_WRITEMASK_Y), 2099c8bb28ca128dca9f279c78857da1b39223e30f7Christian König ureg_src(ref), ureg_imm1f(shader, 1.0f / y_scale)); 2109c8bb28ca128dca9f279c78857da1b39223e30f7Christian König 2119c8bb28ca128dca9f279c78857da1b39223e30f7Christian König ureg_fixup_label(shader, label, ureg_get_instruction_number(shader)); 2129c8bb28ca128dca9f279c78857da1b39223e30f7Christian König ureg_ENDIF(shader); 213751eb75310f62bd9b7ef18df1730958a467c99adChristian König 21410c49b28752f5f2d822dfb1e2e6a1ec213cc44daChristian König ureg_TEX(shader, ureg_writemask(fragment, TGSI_WRITEMASK_XYZ), TGSI_TEXTURE_2D, ureg_src(ref), sampler); 215751eb75310f62bd9b7ef18df1730958a467c99adChristian König 21610c49b28752f5f2d822dfb1e2e6a1ec213cc44daChristian König ureg_release_temporary(shader, ref); 217f547472bfa0a797adacc2a7688b4c1ba65381a80Younes Manton 2181eaf4806cd6a3c2cbfdf5b0f8377424dfe191902Christian König ureg_release_temporary(shader, field); 219e57f7b7b107c610fa2d7f149f3441c2b4a9600cbYounes Manton ureg_END(shader); 220f547472bfa0a797adacc2a7688b4c1ba65381a80Younes Manton 221b4c5c6f51ae5398c1be190233f7539f78885fa45Christian König return ureg_create_shader_and_destroy(shader, r->pipe); 222f547472bfa0a797adacc2a7688b4c1ba65381a80Younes Manton} 223f547472bfa0a797adacc2a7688b4c1ba65381a80Younes Manton 2243511780a43077d1359bd491eadb4ab9b3b86795aChristian Königstatic void * 2257f04fe5338d0846ec9a6003033da5357d2785c8bChristian Königcreate_ycbcr_vert_shader(struct vl_mc *r, vl_mc_ycbcr_vert_shader vs_callback, void *callback_priv) 2263511780a43077d1359bd491eadb4ab9b3b86795aChristian König{ 2273511780a43077d1359bd491eadb4ab9b3b86795aChristian König struct ureg_program *shader; 2283511780a43077d1359bd491eadb4ab9b3b86795aChristian König 2293511780a43077d1359bd491eadb4ab9b3b86795aChristian König struct ureg_src vrect, vpos; 2303511780a43077d1359bd491eadb4ab9b3b86795aChristian König struct ureg_dst t_vpos, t_vtex; 2317f04fe5338d0846ec9a6003033da5357d2785c8bChristian König struct ureg_dst o_vpos, o_flags; 2323511780a43077d1359bd491eadb4ab9b3b86795aChristian König 2333511780a43077d1359bd491eadb4ab9b3b86795aChristian König struct vertex2f scale = { 23470a7695b4d1bd3f609eb9f98dd6872f1a5b89762Christian König (float)VL_BLOCK_WIDTH / r->buffer_width * VL_MACROBLOCK_WIDTH / r->macroblock_size, 23570a7695b4d1bd3f609eb9f98dd6872f1a5b89762Christian König (float)VL_BLOCK_HEIGHT / r->buffer_height * VL_MACROBLOCK_HEIGHT / r->macroblock_size 2363511780a43077d1359bd491eadb4ab9b3b86795aChristian König }; 2373511780a43077d1359bd491eadb4ab9b3b86795aChristian König 2383511780a43077d1359bd491eadb4ab9b3b86795aChristian König unsigned label; 2393511780a43077d1359bd491eadb4ab9b3b86795aChristian König 2403511780a43077d1359bd491eadb4ab9b3b86795aChristian König shader = ureg_create(TGSI_PROCESSOR_VERTEX); 2413511780a43077d1359bd491eadb4ab9b3b86795aChristian König if (!shader) 2423511780a43077d1359bd491eadb4ab9b3b86795aChristian König return NULL; 2433511780a43077d1359bd491eadb4ab9b3b86795aChristian König 2443511780a43077d1359bd491eadb4ab9b3b86795aChristian König vrect = ureg_DECL_vs_input(shader, VS_I_RECT); 2453511780a43077d1359bd491eadb4ab9b3b86795aChristian König vpos = ureg_DECL_vs_input(shader, VS_I_VPOS); 2463511780a43077d1359bd491eadb4ab9b3b86795aChristian König 2473511780a43077d1359bd491eadb4ab9b3b86795aChristian König t_vpos = calc_position(r, shader, ureg_imm2f(shader, scale.x, scale.y)); 2483511780a43077d1359bd491eadb4ab9b3b86795aChristian König t_vtex = ureg_DECL_temporary(shader); 2493511780a43077d1359bd491eadb4ab9b3b86795aChristian König 2503511780a43077d1359bd491eadb4ab9b3b86795aChristian König o_vpos = ureg_DECL_output(shader, TGSI_SEMANTIC_POSITION, VS_O_VPOS); 2517f04fe5338d0846ec9a6003033da5357d2785c8bChristian König o_flags = ureg_DECL_output(shader, TGSI_SEMANTIC_GENERIC, VS_O_FLAGS); 2523511780a43077d1359bd491eadb4ab9b3b86795aChristian König 2533511780a43077d1359bd491eadb4ab9b3b86795aChristian König /* 2543511780a43077d1359bd491eadb4ab9b3b86795aChristian König * o_vtex.xy = t_vpos 2557f04fe5338d0846ec9a6003033da5357d2785c8bChristian König * o_flags.z = intra * 0.5 2563511780a43077d1359bd491eadb4ab9b3b86795aChristian König * 2573511780a43077d1359bd491eadb4ab9b3b86795aChristian König * if(interlaced) { 2583511780a43077d1359bd491eadb4ab9b3b86795aChristian König * t_vtex.xy = vrect.y ? { 0, scale.y } : { -scale.y : 0 } 2593511780a43077d1359bd491eadb4ab9b3b86795aChristian König * t_vtex.z = vpos.y % 2 2603511780a43077d1359bd491eadb4ab9b3b86795aChristian König * t_vtex.y = t_vtex.z ? t_vtex.x : t_vtex.y 2613511780a43077d1359bd491eadb4ab9b3b86795aChristian König * o_vpos.y = t_vtex.y + t_vpos.y 2623511780a43077d1359bd491eadb4ab9b3b86795aChristian König * 2637f04fe5338d0846ec9a6003033da5357d2785c8bChristian König * o_flags.w = t_vtex.z ? 0 : 1 2643511780a43077d1359bd491eadb4ab9b3b86795aChristian König * } 2653511780a43077d1359bd491eadb4ab9b3b86795aChristian König * 2663511780a43077d1359bd491eadb4ab9b3b86795aChristian König */ 2677f04fe5338d0846ec9a6003033da5357d2785c8bChristian König 2687f04fe5338d0846ec9a6003033da5357d2785c8bChristian König vs_callback(callback_priv, r, shader, VS_O_VTEX, t_vpos); 2697f04fe5338d0846ec9a6003033da5357d2785c8bChristian König 2707f04fe5338d0846ec9a6003033da5357d2785c8bChristian König ureg_MUL(shader, ureg_writemask(o_flags, TGSI_WRITEMASK_Z), 2713511780a43077d1359bd491eadb4ab9b3b86795aChristian König ureg_scalar(vpos, TGSI_SWIZZLE_Z), ureg_imm1f(shader, 0.5f)); 2727f04fe5338d0846ec9a6003033da5357d2785c8bChristian König ureg_MOV(shader, ureg_writemask(o_flags, TGSI_WRITEMASK_W), ureg_imm1f(shader, -1.0f)); 2733511780a43077d1359bd491eadb4ab9b3b86795aChristian König 27470a7695b4d1bd3f609eb9f98dd6872f1a5b89762Christian König if (r->macroblock_size == VL_MACROBLOCK_HEIGHT) { //TODO 2753511780a43077d1359bd491eadb4ab9b3b86795aChristian König ureg_IF(shader, ureg_scalar(vpos, TGSI_SWIZZLE_W), &label); 2763511780a43077d1359bd491eadb4ab9b3b86795aChristian König 2773511780a43077d1359bd491eadb4ab9b3b86795aChristian König ureg_CMP(shader, ureg_writemask(t_vtex, TGSI_WRITEMASK_XY), 2783511780a43077d1359bd491eadb4ab9b3b86795aChristian König ureg_negate(ureg_scalar(vrect, TGSI_SWIZZLE_Y)), 2793511780a43077d1359bd491eadb4ab9b3b86795aChristian König ureg_imm2f(shader, 0.0f, scale.y), 2803511780a43077d1359bd491eadb4ab9b3b86795aChristian König ureg_imm2f(shader, -scale.y, 0.0f)); 2813511780a43077d1359bd491eadb4ab9b3b86795aChristian König ureg_MUL(shader, ureg_writemask(t_vtex, TGSI_WRITEMASK_Z), 2823511780a43077d1359bd491eadb4ab9b3b86795aChristian König ureg_scalar(vpos, TGSI_SWIZZLE_Y), ureg_imm1f(shader, 0.5f)); 2833511780a43077d1359bd491eadb4ab9b3b86795aChristian König 2843511780a43077d1359bd491eadb4ab9b3b86795aChristian König ureg_FRC(shader, ureg_writemask(t_vtex, TGSI_WRITEMASK_Z), ureg_src(t_vtex)); 2853511780a43077d1359bd491eadb4ab9b3b86795aChristian König 2863511780a43077d1359bd491eadb4ab9b3b86795aChristian König ureg_CMP(shader, ureg_writemask(t_vtex, TGSI_WRITEMASK_Y), 2873511780a43077d1359bd491eadb4ab9b3b86795aChristian König ureg_negate(ureg_scalar(ureg_src(t_vtex), TGSI_SWIZZLE_Z)), 2883511780a43077d1359bd491eadb4ab9b3b86795aChristian König ureg_scalar(ureg_src(t_vtex), TGSI_SWIZZLE_X), 2893511780a43077d1359bd491eadb4ab9b3b86795aChristian König ureg_scalar(ureg_src(t_vtex), TGSI_SWIZZLE_Y)); 2903511780a43077d1359bd491eadb4ab9b3b86795aChristian König ureg_ADD(shader, ureg_writemask(o_vpos, TGSI_WRITEMASK_Y), 2913511780a43077d1359bd491eadb4ab9b3b86795aChristian König ureg_src(t_vpos), ureg_src(t_vtex)); 2923511780a43077d1359bd491eadb4ab9b3b86795aChristian König 2937f04fe5338d0846ec9a6003033da5357d2785c8bChristian König ureg_CMP(shader, ureg_writemask(o_flags, TGSI_WRITEMASK_W), 2943511780a43077d1359bd491eadb4ab9b3b86795aChristian König ureg_negate(ureg_scalar(ureg_src(t_vtex), TGSI_SWIZZLE_Z)), 2953511780a43077d1359bd491eadb4ab9b3b86795aChristian König ureg_imm1f(shader, 0.0f), ureg_imm1f(shader, 1.0f)); 2963511780a43077d1359bd491eadb4ab9b3b86795aChristian König 2973511780a43077d1359bd491eadb4ab9b3b86795aChristian König ureg_fixup_label(shader, label, ureg_get_instruction_number(shader)); 2983511780a43077d1359bd491eadb4ab9b3b86795aChristian König ureg_ENDIF(shader); 2993511780a43077d1359bd491eadb4ab9b3b86795aChristian König } 3003511780a43077d1359bd491eadb4ab9b3b86795aChristian König 3013511780a43077d1359bd491eadb4ab9b3b86795aChristian König ureg_release_temporary(shader, t_vtex); 3023511780a43077d1359bd491eadb4ab9b3b86795aChristian König ureg_release_temporary(shader, t_vpos); 3033511780a43077d1359bd491eadb4ab9b3b86795aChristian König 3043511780a43077d1359bd491eadb4ab9b3b86795aChristian König ureg_END(shader); 3053511780a43077d1359bd491eadb4ab9b3b86795aChristian König 3063511780a43077d1359bd491eadb4ab9b3b86795aChristian König return ureg_create_shader_and_destroy(shader, r->pipe); 3073511780a43077d1359bd491eadb4ab9b3b86795aChristian König} 3083511780a43077d1359bd491eadb4ab9b3b86795aChristian König 3093511780a43077d1359bd491eadb4ab9b3b86795aChristian Königstatic void * 310c5110a1bfab8e97b8b958d42dd294a426310d1e2Christian Königcreate_ycbcr_frag_shader(struct vl_mc *r, float scale, bool invert, 311c5110a1bfab8e97b8b958d42dd294a426310d1e2Christian König vl_mc_ycbcr_frag_shader fs_callback, void *callback_priv) 3123511780a43077d1359bd491eadb4ab9b3b86795aChristian König{ 3133511780a43077d1359bd491eadb4ab9b3b86795aChristian König struct ureg_program *shader; 3147f04fe5338d0846ec9a6003033da5357d2785c8bChristian König struct ureg_src flags; 3153511780a43077d1359bd491eadb4ab9b3b86795aChristian König struct ureg_dst tmp; 3163511780a43077d1359bd491eadb4ab9b3b86795aChristian König struct ureg_dst fragment; 3173511780a43077d1359bd491eadb4ab9b3b86795aChristian König unsigned label; 3183511780a43077d1359bd491eadb4ab9b3b86795aChristian König 3193511780a43077d1359bd491eadb4ab9b3b86795aChristian König shader = ureg_create(TGSI_PROCESSOR_FRAGMENT); 3203511780a43077d1359bd491eadb4ab9b3b86795aChristian König if (!shader) 3213511780a43077d1359bd491eadb4ab9b3b86795aChristian König return NULL; 3223511780a43077d1359bd491eadb4ab9b3b86795aChristian König 3237f04fe5338d0846ec9a6003033da5357d2785c8bChristian König flags = ureg_DECL_fs_input(shader, TGSI_SEMANTIC_GENERIC, VS_O_FLAGS, TGSI_INTERPOLATE_LINEAR); 3243511780a43077d1359bd491eadb4ab9b3b86795aChristian König 3253511780a43077d1359bd491eadb4ab9b3b86795aChristian König fragment = ureg_DECL_output(shader, TGSI_SEMANTIC_COLOR, 0); 3263511780a43077d1359bd491eadb4ab9b3b86795aChristian König 3273511780a43077d1359bd491eadb4ab9b3b86795aChristian König tmp = calc_line(shader); 3283511780a43077d1359bd491eadb4ab9b3b86795aChristian König 3293511780a43077d1359bd491eadb4ab9b3b86795aChristian König /* 3303511780a43077d1359bd491eadb4ab9b3b86795aChristian König * if (field == tc.w) 3313511780a43077d1359bd491eadb4ab9b3b86795aChristian König * kill(); 3323511780a43077d1359bd491eadb4ab9b3b86795aChristian König * else { 3333511780a43077d1359bd491eadb4ab9b3b86795aChristian König * fragment.xyz = tex(tc, sampler) * scale + tc.z 3343511780a43077d1359bd491eadb4ab9b3b86795aChristian König * fragment.w = 1.0f 3353511780a43077d1359bd491eadb4ab9b3b86795aChristian König * } 3363511780a43077d1359bd491eadb4ab9b3b86795aChristian König */ 3373511780a43077d1359bd491eadb4ab9b3b86795aChristian König 3383511780a43077d1359bd491eadb4ab9b3b86795aChristian König ureg_SEQ(shader, ureg_writemask(tmp, TGSI_WRITEMASK_Y), 3397f04fe5338d0846ec9a6003033da5357d2785c8bChristian König ureg_scalar(flags, TGSI_SWIZZLE_W), ureg_src(tmp)); 3403511780a43077d1359bd491eadb4ab9b3b86795aChristian König 3413511780a43077d1359bd491eadb4ab9b3b86795aChristian König ureg_IF(shader, ureg_scalar(ureg_src(tmp), TGSI_SWIZZLE_Y), &label); 3423511780a43077d1359bd491eadb4ab9b3b86795aChristian König 3433511780a43077d1359bd491eadb4ab9b3b86795aChristian König ureg_KILP(shader); 3443511780a43077d1359bd491eadb4ab9b3b86795aChristian König 3453511780a43077d1359bd491eadb4ab9b3b86795aChristian König ureg_fixup_label(shader, label, ureg_get_instruction_number(shader)); 3463511780a43077d1359bd491eadb4ab9b3b86795aChristian König ureg_ELSE(shader, &label); 3473511780a43077d1359bd491eadb4ab9b3b86795aChristian König 3487f04fe5338d0846ec9a6003033da5357d2785c8bChristian König fs_callback(callback_priv, r, shader, VS_O_VTEX, tmp); 3493511780a43077d1359bd491eadb4ab9b3b86795aChristian König 3503511780a43077d1359bd491eadb4ab9b3b86795aChristian König if (scale != 1.0f) 351c5110a1bfab8e97b8b958d42dd294a426310d1e2Christian König ureg_MAD(shader, ureg_writemask(tmp, TGSI_WRITEMASK_XYZ), 3523511780a43077d1359bd491eadb4ab9b3b86795aChristian König ureg_src(tmp), ureg_imm1f(shader, scale), 3537f04fe5338d0846ec9a6003033da5357d2785c8bChristian König ureg_scalar(flags, TGSI_SWIZZLE_Z)); 3543511780a43077d1359bd491eadb4ab9b3b86795aChristian König else 355c5110a1bfab8e97b8b958d42dd294a426310d1e2Christian König ureg_ADD(shader, ureg_writemask(tmp, TGSI_WRITEMASK_XYZ), 3567f04fe5338d0846ec9a6003033da5357d2785c8bChristian König ureg_src(tmp), ureg_scalar(flags, TGSI_SWIZZLE_Z)); 357c5110a1bfab8e97b8b958d42dd294a426310d1e2Christian König 358c5110a1bfab8e97b8b958d42dd294a426310d1e2Christian König ureg_MUL(shader, ureg_writemask(fragment, TGSI_WRITEMASK_XYZ), ureg_src(tmp), ureg_imm1f(shader, invert ? -1.0f : 1.0f)); 3593511780a43077d1359bd491eadb4ab9b3b86795aChristian König ureg_MOV(shader, ureg_writemask(fragment, TGSI_WRITEMASK_W), ureg_imm1f(shader, 1.0f)); 3603511780a43077d1359bd491eadb4ab9b3b86795aChristian König 3613511780a43077d1359bd491eadb4ab9b3b86795aChristian König ureg_fixup_label(shader, label, ureg_get_instruction_number(shader)); 3623511780a43077d1359bd491eadb4ab9b3b86795aChristian König ureg_ENDIF(shader); 3633511780a43077d1359bd491eadb4ab9b3b86795aChristian König 3643511780a43077d1359bd491eadb4ab9b3b86795aChristian König ureg_release_temporary(shader, tmp); 3653511780a43077d1359bd491eadb4ab9b3b86795aChristian König 3669937e85bccbf2f6bd77d061ab0488d45e9366f10Christian König ureg_END(shader); 3679937e85bccbf2f6bd77d061ab0488d45e9366f10Christian König 3683511780a43077d1359bd491eadb4ab9b3b86795aChristian König return ureg_create_shader_and_destroy(shader, r->pipe); 3693511780a43077d1359bd491eadb4ab9b3b86795aChristian König} 3703511780a43077d1359bd491eadb4ab9b3b86795aChristian König 3713bbbb3c54f633ab10e7e2302e8edf3cf1f801858Christian Königstatic bool 372ca79aeb91e914ac1a4774d51ca49911406377407Christian Königinit_pipe_state(struct vl_mc *r) 373f547472bfa0a797adacc2a7688b4c1ba65381a80Younes Manton{ 374f547472bfa0a797adacc2a7688b4c1ba65381a80Younes Manton struct pipe_sampler_state sampler; 375b88fa924009b5cc572187d3ca6a395d5226aa1c3Christian König struct pipe_blend_state blend; 37629840040af128fe3f3542defd9448e1f66c23f03Christian König struct pipe_rasterizer_state rs_state; 3773ea7e2713c836f23d59c4034385609e371a94c8dChristian König unsigned i; 378f547472bfa0a797adacc2a7688b4c1ba65381a80Younes Manton 379f547472bfa0a797adacc2a7688b4c1ba65381a80Younes Manton assert(r); 380f547472bfa0a797adacc2a7688b4c1ba65381a80Younes Manton 381e61a63a65198fe136ff9f1b6b8897c5b3c95b093Christian König memset(&sampler, 0, sizeof(sampler)); 382e61a63a65198fe136ff9f1b6b8897c5b3c95b093Christian König sampler.wrap_s = PIPE_TEX_WRAP_CLAMP_TO_EDGE; 383e61a63a65198fe136ff9f1b6b8897c5b3c95b093Christian König sampler.wrap_t = PIPE_TEX_WRAP_CLAMP_TO_EDGE; 384e61a63a65198fe136ff9f1b6b8897c5b3c95b093Christian König sampler.wrap_r = PIPE_TEX_WRAP_CLAMP_TO_BORDER; 3854fc4f7b9ea83f02a81e9a3f57db7ae655490379aChristian König sampler.min_img_filter = PIPE_TEX_FILTER_LINEAR; 386e61a63a65198fe136ff9f1b6b8897c5b3c95b093Christian König sampler.min_mip_filter = PIPE_TEX_MIPFILTER_NONE; 3874fc4f7b9ea83f02a81e9a3f57db7ae655490379aChristian König sampler.mag_img_filter = PIPE_TEX_FILTER_LINEAR; 388e61a63a65198fe136ff9f1b6b8897c5b3c95b093Christian König sampler.compare_mode = PIPE_TEX_COMPARE_NONE; 389e61a63a65198fe136ff9f1b6b8897c5b3c95b093Christian König sampler.compare_func = PIPE_FUNC_ALWAYS; 390e61a63a65198fe136ff9f1b6b8897c5b3c95b093Christian König sampler.normalized_coords = 1; 391e61a63a65198fe136ff9f1b6b8897c5b3c95b093Christian König r->sampler_ref = r->pipe->create_sampler_state(r->pipe, &sampler); 392e61a63a65198fe136ff9f1b6b8897c5b3c95b093Christian König if (!r->sampler_ref) 393e61a63a65198fe136ff9f1b6b8897c5b3c95b093Christian König goto error_sampler_ref; 394e61a63a65198fe136ff9f1b6b8897c5b3c95b093Christian König 3953ea7e2713c836f23d59c4034385609e371a94c8dChristian König for (i = 0; i < VL_MC_NUM_BLENDERS; ++i) { 3963ea7e2713c836f23d59c4034385609e371a94c8dChristian König memset(&blend, 0, sizeof blend); 3973ea7e2713c836f23d59c4034385609e371a94c8dChristian König blend.independent_blend_enable = 0; 3983ea7e2713c836f23d59c4034385609e371a94c8dChristian König blend.rt[0].blend_enable = 1; 3993ea7e2713c836f23d59c4034385609e371a94c8dChristian König blend.rt[0].rgb_func = PIPE_BLEND_ADD; 4003ea7e2713c836f23d59c4034385609e371a94c8dChristian König blend.rt[0].rgb_src_factor = PIPE_BLENDFACTOR_SRC_ALPHA; 4013ea7e2713c836f23d59c4034385609e371a94c8dChristian König blend.rt[0].rgb_dst_factor = PIPE_BLENDFACTOR_ZERO; 4023ea7e2713c836f23d59c4034385609e371a94c8dChristian König blend.rt[0].alpha_func = PIPE_BLEND_ADD; 4033ea7e2713c836f23d59c4034385609e371a94c8dChristian König blend.rt[0].alpha_src_factor = PIPE_BLENDFACTOR_SRC_ALPHA; 4043ea7e2713c836f23d59c4034385609e371a94c8dChristian König blend.rt[0].alpha_dst_factor = PIPE_BLENDFACTOR_ZERO; 4053ea7e2713c836f23d59c4034385609e371a94c8dChristian König blend.logicop_enable = 0; 4063ea7e2713c836f23d59c4034385609e371a94c8dChristian König blend.logicop_func = PIPE_LOGICOP_CLEAR; 4073ea7e2713c836f23d59c4034385609e371a94c8dChristian König blend.rt[0].colormask = i; 4083ea7e2713c836f23d59c4034385609e371a94c8dChristian König blend.dither = 0; 4093ea7e2713c836f23d59c4034385609e371a94c8dChristian König r->blend_clear[i] = r->pipe->create_blend_state(r->pipe, &blend); 4103ea7e2713c836f23d59c4034385609e371a94c8dChristian König if (!r->blend_clear[i]) 4113ea7e2713c836f23d59c4034385609e371a94c8dChristian König goto error_blend; 4123ea7e2713c836f23d59c4034385609e371a94c8dChristian König 4133ea7e2713c836f23d59c4034385609e371a94c8dChristian König blend.rt[0].rgb_dst_factor = PIPE_BLENDFACTOR_ONE; 4143ea7e2713c836f23d59c4034385609e371a94c8dChristian König blend.rt[0].alpha_dst_factor = PIPE_BLENDFACTOR_ONE; 4153ea7e2713c836f23d59c4034385609e371a94c8dChristian König r->blend_add[i] = r->pipe->create_blend_state(r->pipe, &blend); 4163ea7e2713c836f23d59c4034385609e371a94c8dChristian König if (!r->blend_add[i]) 4173ea7e2713c836f23d59c4034385609e371a94c8dChristian König goto error_blend; 418c5110a1bfab8e97b8b958d42dd294a426310d1e2Christian König 419c5110a1bfab8e97b8b958d42dd294a426310d1e2Christian König blend.rt[0].rgb_func = PIPE_BLEND_REVERSE_SUBTRACT; 420c5110a1bfab8e97b8b958d42dd294a426310d1e2Christian König blend.rt[0].alpha_dst_factor = PIPE_BLEND_REVERSE_SUBTRACT; 421c5110a1bfab8e97b8b958d42dd294a426310d1e2Christian König r->blend_sub[i] = r->pipe->create_blend_state(r->pipe, &blend); 422c5110a1bfab8e97b8b958d42dd294a426310d1e2Christian König if (!r->blend_sub[i]) 423c5110a1bfab8e97b8b958d42dd294a426310d1e2Christian König goto error_blend; 4243ea7e2713c836f23d59c4034385609e371a94c8dChristian König } 425b88fa924009b5cc572187d3ca6a395d5226aa1c3Christian König 42629840040af128fe3f3542defd9448e1f66c23f03Christian König memset(&rs_state, 0, sizeof(rs_state)); 42729840040af128fe3f3542defd9448e1f66c23f03Christian König /*rs_state.sprite_coord_enable */ 42829840040af128fe3f3542defd9448e1f66c23f03Christian König rs_state.sprite_coord_mode = PIPE_SPRITE_COORD_UPPER_LEFT; 42929840040af128fe3f3542defd9448e1f66c23f03Christian König rs_state.point_quad_rasterization = true; 43070a7695b4d1bd3f609eb9f98dd6872f1a5b89762Christian König rs_state.point_size = VL_BLOCK_WIDTH; 43129840040af128fe3f3542defd9448e1f66c23f03Christian König rs_state.gl_rasterization_rules = true; 432dc4c821f0817a3db716f965692fb701079f66340Marek Olšák rs_state.depth_clip = 1; 43329840040af128fe3f3542defd9448e1f66c23f03Christian König r->rs_state = r->pipe->create_rasterizer_state(r->pipe, &rs_state); 434c6182cc6d48a7c076cfbdba241e29e5f5901ba52Christian König if (!r->rs_state) 435b88fa924009b5cc572187d3ca6a395d5226aa1c3Christian König goto error_rs_state; 43629840040af128fe3f3542defd9448e1f66c23f03Christian König 437f547472bfa0a797adacc2a7688b4c1ba65381a80Younes Manton return true; 438c6182cc6d48a7c076cfbdba241e29e5f5901ba52Christian König 439b88fa924009b5cc572187d3ca6a395d5226aa1c3Christian Königerror_rs_state: 4403ea7e2713c836f23d59c4034385609e371a94c8dChristian Königerror_blend: 4413ea7e2713c836f23d59c4034385609e371a94c8dChristian König for (i = 0; i < VL_MC_NUM_BLENDERS; ++i) { 442c5110a1bfab8e97b8b958d42dd294a426310d1e2Christian König if (r->blend_sub[i]) 443c5110a1bfab8e97b8b958d42dd294a426310d1e2Christian König r->pipe->delete_blend_state(r->pipe, r->blend_sub[i]); 444c5110a1bfab8e97b8b958d42dd294a426310d1e2Christian König 4453ea7e2713c836f23d59c4034385609e371a94c8dChristian König if (r->blend_add[i]) 4463ea7e2713c836f23d59c4034385609e371a94c8dChristian König r->pipe->delete_blend_state(r->pipe, r->blend_add[i]); 447b88fa924009b5cc572187d3ca6a395d5226aa1c3Christian König 4483ea7e2713c836f23d59c4034385609e371a94c8dChristian König if (r->blend_clear[i]) 4493ea7e2713c836f23d59c4034385609e371a94c8dChristian König r->pipe->delete_blend_state(r->pipe, r->blend_clear[i]); 4503ea7e2713c836f23d59c4034385609e371a94c8dChristian König } 451b88fa924009b5cc572187d3ca6a395d5226aa1c3Christian König 452e61a63a65198fe136ff9f1b6b8897c5b3c95b093Christian König r->pipe->delete_sampler_state(r->pipe, r->sampler_ref); 453c6182cc6d48a7c076cfbdba241e29e5f5901ba52Christian König 454e61a63a65198fe136ff9f1b6b8897c5b3c95b093Christian Königerror_sampler_ref: 455c6182cc6d48a7c076cfbdba241e29e5f5901ba52Christian König return false; 456f547472bfa0a797adacc2a7688b4c1ba65381a80Younes Manton} 457f547472bfa0a797adacc2a7688b4c1ba65381a80Younes Manton 458f547472bfa0a797adacc2a7688b4c1ba65381a80Younes Mantonstatic void 459ca79aeb91e914ac1a4774d51ca49911406377407Christian Königcleanup_pipe_state(struct vl_mc *r) 460f547472bfa0a797adacc2a7688b4c1ba65381a80Younes Manton{ 4613ea7e2713c836f23d59c4034385609e371a94c8dChristian König unsigned i; 4623ea7e2713c836f23d59c4034385609e371a94c8dChristian König 463f547472bfa0a797adacc2a7688b4c1ba65381a80Younes Manton assert(r); 464f547472bfa0a797adacc2a7688b4c1ba65381a80Younes Manton 465e61a63a65198fe136ff9f1b6b8897c5b3c95b093Christian König r->pipe->delete_sampler_state(r->pipe, r->sampler_ref); 4663ea7e2713c836f23d59c4034385609e371a94c8dChristian König for (i = 0; i < VL_MC_NUM_BLENDERS; ++i) { 4673ea7e2713c836f23d59c4034385609e371a94c8dChristian König r->pipe->delete_blend_state(r->pipe, r->blend_clear[i]); 4683ea7e2713c836f23d59c4034385609e371a94c8dChristian König r->pipe->delete_blend_state(r->pipe, r->blend_add[i]); 469c5110a1bfab8e97b8b958d42dd294a426310d1e2Christian König r->pipe->delete_blend_state(r->pipe, r->blend_sub[i]); 4703ea7e2713c836f23d59c4034385609e371a94c8dChristian König } 47129840040af128fe3f3542defd9448e1f66c23f03Christian König r->pipe->delete_rasterizer_state(r->pipe, r->rs_state); 472f547472bfa0a797adacc2a7688b4c1ba65381a80Younes Manton} 473f547472bfa0a797adacc2a7688b4c1ba65381a80Younes Manton 474f547472bfa0a797adacc2a7688b4c1ba65381a80Younes Mantonbool 475ca79aeb91e914ac1a4774d51ca49911406377407Christian Königvl_mc_init(struct vl_mc *renderer, struct pipe_context *pipe, 476f1485e155a985df3100708f4bfb1a9d7c72217f4Christian König unsigned buffer_width, unsigned buffer_height, 4777f04fe5338d0846ec9a6003033da5357d2785c8bChristian König unsigned macroblock_size, float scale, 4787f04fe5338d0846ec9a6003033da5357d2785c8bChristian König vl_mc_ycbcr_vert_shader vs_callback, 4797f04fe5338d0846ec9a6003033da5357d2785c8bChristian König vl_mc_ycbcr_frag_shader fs_callback, 4807f04fe5338d0846ec9a6003033da5357d2785c8bChristian König void *callback_priv) 481f547472bfa0a797adacc2a7688b4c1ba65381a80Younes Manton{ 482f547472bfa0a797adacc2a7688b4c1ba65381a80Younes Manton assert(renderer); 483f547472bfa0a797adacc2a7688b4c1ba65381a80Younes Manton assert(pipe); 4843dd7bf7d39781f3ef4c0b53732945674c9924cdfChristian König 485ca79aeb91e914ac1a4774d51ca49911406377407Christian König memset(renderer, 0, sizeof(struct vl_mc)); 486f547472bfa0a797adacc2a7688b4c1ba65381a80Younes Manton 487f547472bfa0a797adacc2a7688b4c1ba65381a80Younes Manton renderer->pipe = pipe; 488eb7452e267974f9ff971b752046c512963f59f81Christian König renderer->buffer_width = buffer_width; 489eb7452e267974f9ff971b752046c512963f59f81Christian König renderer->buffer_height = buffer_height; 490f1485e155a985df3100708f4bfb1a9d7c72217f4Christian König renderer->macroblock_size = macroblock_size; 491f547472bfa0a797adacc2a7688b4c1ba65381a80Younes Manton 49221efda86875096333dc0412c0edab1e188f551d8Christian König if (!init_pipe_state(renderer)) 49321efda86875096333dc0412c0edab1e188f551d8Christian König goto error_pipe_state; 494f547472bfa0a797adacc2a7688b4c1ba65381a80Younes Manton 495b1c44b0ea6b3e891086ce554edf3c26dbd3708cdChristian König renderer->vs_ref = create_ref_vert_shader(renderer); 496b1c44b0ea6b3e891086ce554edf3c26dbd3708cdChristian König if (!renderer->vs_ref) 497b1c44b0ea6b3e891086ce554edf3c26dbd3708cdChristian König goto error_vs_ref; 498b1c44b0ea6b3e891086ce554edf3c26dbd3708cdChristian König 4997f04fe5338d0846ec9a6003033da5357d2785c8bChristian König renderer->vs_ycbcr = create_ycbcr_vert_shader(renderer, vs_callback, callback_priv); 500b1c44b0ea6b3e891086ce554edf3c26dbd3708cdChristian König if (!renderer->vs_ycbcr) 501b1c44b0ea6b3e891086ce554edf3c26dbd3708cdChristian König goto error_vs_ycbcr; 5020f07da0a1c87e1c7b53700c33d6b1f8f03c1fe11Christian König 503b88fa924009b5cc572187d3ca6a395d5226aa1c3Christian König renderer->fs_ref = create_ref_frag_shader(renderer); 504b88fa924009b5cc572187d3ca6a395d5226aa1c3Christian König if (!renderer->fs_ref) 505b1c44b0ea6b3e891086ce554edf3c26dbd3708cdChristian König goto error_fs_ref; 506b88fa924009b5cc572187d3ca6a395d5226aa1c3Christian König 507c5110a1bfab8e97b8b958d42dd294a426310d1e2Christian König renderer->fs_ycbcr = create_ycbcr_frag_shader(renderer, scale, false, fs_callback, callback_priv); 508b88fa924009b5cc572187d3ca6a395d5226aa1c3Christian König if (!renderer->fs_ycbcr) 509b1c44b0ea6b3e891086ce554edf3c26dbd3708cdChristian König goto error_fs_ycbcr; 51021efda86875096333dc0412c0edab1e188f551d8Christian König 511c5110a1bfab8e97b8b958d42dd294a426310d1e2Christian König renderer->fs_ycbcr_sub = create_ycbcr_frag_shader(renderer, scale, true, fs_callback, callback_priv); 512c5110a1bfab8e97b8b958d42dd294a426310d1e2Christian König if (!renderer->fs_ycbcr_sub) 513c5110a1bfab8e97b8b958d42dd294a426310d1e2Christian König goto error_fs_ycbcr_sub; 514c5110a1bfab8e97b8b958d42dd294a426310d1e2Christian König 515f547472bfa0a797adacc2a7688b4c1ba65381a80Younes Manton return true; 516c5110a1bfab8e97b8b958d42dd294a426310d1e2Christian König 517c5110a1bfab8e97b8b958d42dd294a426310d1e2Christian Königerror_fs_ycbcr_sub: 518c5110a1bfab8e97b8b958d42dd294a426310d1e2Christian König renderer->pipe->delete_fs_state(renderer->pipe, renderer->fs_ycbcr); 51921efda86875096333dc0412c0edab1e188f551d8Christian König 520b1c44b0ea6b3e891086ce554edf3c26dbd3708cdChristian Königerror_fs_ycbcr: 521b88fa924009b5cc572187d3ca6a395d5226aa1c3Christian König renderer->pipe->delete_fs_state(renderer->pipe, renderer->fs_ref); 522c6182cc6d48a7c076cfbdba241e29e5f5901ba52Christian König 523b1c44b0ea6b3e891086ce554edf3c26dbd3708cdChristian Königerror_fs_ref: 524b1c44b0ea6b3e891086ce554edf3c26dbd3708cdChristian König renderer->pipe->delete_vs_state(renderer->pipe, renderer->vs_ycbcr); 525b1c44b0ea6b3e891086ce554edf3c26dbd3708cdChristian König 526b1c44b0ea6b3e891086ce554edf3c26dbd3708cdChristian Königerror_vs_ycbcr: 527b1c44b0ea6b3e891086ce554edf3c26dbd3708cdChristian König renderer->pipe->delete_vs_state(renderer->pipe, renderer->vs_ref); 528c6182cc6d48a7c076cfbdba241e29e5f5901ba52Christian König 529b1c44b0ea6b3e891086ce554edf3c26dbd3708cdChristian Königerror_vs_ref: 53021efda86875096333dc0412c0edab1e188f551d8Christian König cleanup_pipe_state(renderer); 53121efda86875096333dc0412c0edab1e188f551d8Christian König 53221efda86875096333dc0412c0edab1e188f551d8Christian Königerror_pipe_state: 53321efda86875096333dc0412c0edab1e188f551d8Christian König return false; 534f547472bfa0a797adacc2a7688b4c1ba65381a80Younes Manton} 535f547472bfa0a797adacc2a7688b4c1ba65381a80Younes Manton 536f547472bfa0a797adacc2a7688b4c1ba65381a80Younes Mantonvoid 537ca79aeb91e914ac1a4774d51ca49911406377407Christian Königvl_mc_cleanup(struct vl_mc *renderer) 538f547472bfa0a797adacc2a7688b4c1ba65381a80Younes Manton{ 539f547472bfa0a797adacc2a7688b4c1ba65381a80Younes Manton assert(renderer); 540f547472bfa0a797adacc2a7688b4c1ba65381a80Younes Manton 541f547472bfa0a797adacc2a7688b4c1ba65381a80Younes Manton cleanup_pipe_state(renderer); 5420f07da0a1c87e1c7b53700c33d6b1f8f03c1fe11Christian König 543b1c44b0ea6b3e891086ce554edf3c26dbd3708cdChristian König renderer->pipe->delete_vs_state(renderer->pipe, renderer->vs_ref); 544b1c44b0ea6b3e891086ce554edf3c26dbd3708cdChristian König renderer->pipe->delete_vs_state(renderer->pipe, renderer->vs_ycbcr); 545b88fa924009b5cc572187d3ca6a395d5226aa1c3Christian König renderer->pipe->delete_fs_state(renderer->pipe, renderer->fs_ref); 546b88fa924009b5cc572187d3ca6a395d5226aa1c3Christian König renderer->pipe->delete_fs_state(renderer->pipe, renderer->fs_ycbcr); 547c5110a1bfab8e97b8b958d42dd294a426310d1e2Christian König renderer->pipe->delete_fs_state(renderer->pipe, renderer->fs_ycbcr_sub); 5481e3f5e9520940592dae1c37bb4c8d3fc156aa5d5Christian König} 5491e3f5e9520940592dae1c37bb4c8d3fc156aa5d5Christian König 5501e3f5e9520940592dae1c37bb4c8d3fc156aa5d5Christian Königbool 5513ea7e2713c836f23d59c4034385609e371a94c8dChristian Königvl_mc_init_buffer(struct vl_mc *renderer, struct vl_mc_buffer *buffer) 5521e3f5e9520940592dae1c37bb4c8d3fc156aa5d5Christian König{ 5531e3f5e9520940592dae1c37bb4c8d3fc156aa5d5Christian König assert(renderer && buffer); 554f1bbd41e326ce7a90e9b5956195203eee537cbc7Younes Manton 5555294ac62236bf05e1eaaca3399e539c28c0ccc4cChristian König buffer->viewport.scale[2] = 1; 5565294ac62236bf05e1eaaca3399e539c28c0ccc4cChristian König buffer->viewport.scale[3] = 1; 5575294ac62236bf05e1eaaca3399e539c28c0ccc4cChristian König buffer->viewport.translate[0] = 0; 5585294ac62236bf05e1eaaca3399e539c28c0ccc4cChristian König buffer->viewport.translate[1] = 0; 5595294ac62236bf05e1eaaca3399e539c28c0ccc4cChristian König buffer->viewport.translate[2] = 0; 5605294ac62236bf05e1eaaca3399e539c28c0ccc4cChristian König buffer->viewport.translate[3] = 0; 5615294ac62236bf05e1eaaca3399e539c28c0ccc4cChristian König 5625294ac62236bf05e1eaaca3399e539c28c0ccc4cChristian König buffer->fb_state.nr_cbufs = 1; 5635294ac62236bf05e1eaaca3399e539c28c0ccc4cChristian König buffer->fb_state.zsbuf = NULL; 5645294ac62236bf05e1eaaca3399e539c28c0ccc4cChristian König 5651e3f5e9520940592dae1c37bb4c8d3fc156aa5d5Christian König return true; 566f547472bfa0a797adacc2a7688b4c1ba65381a80Younes Manton} 567f547472bfa0a797adacc2a7688b4c1ba65381a80Younes Manton 568f547472bfa0a797adacc2a7688b4c1ba65381a80Younes Mantonvoid 569ca79aeb91e914ac1a4774d51ca49911406377407Christian Königvl_mc_cleanup_buffer(struct vl_mc_buffer *buffer) 5703b2ef2d007193f8a5f6979b378ee3c952ff39f7fChristian König{ 571884cb79edfefb1133229a002f41b4d370d717a7eChristian König assert(buffer); 5723b2ef2d007193f8a5f6979b378ee3c952ff39f7fChristian König} 5733b2ef2d007193f8a5f6979b378ee3c952ff39f7fChristian König 5743b2ef2d007193f8a5f6979b378ee3c952ff39f7fChristian Königvoid 575ca79aeb91e914ac1a4774d51ca49911406377407Christian Königvl_mc_set_surface(struct vl_mc_buffer *buffer, struct pipe_surface *surface) 5765294ac62236bf05e1eaaca3399e539c28c0ccc4cChristian König{ 5775294ac62236bf05e1eaaca3399e539c28c0ccc4cChristian König assert(buffer && surface); 5785294ac62236bf05e1eaaca3399e539c28c0ccc4cChristian König 5795294ac62236bf05e1eaaca3399e539c28c0ccc4cChristian König buffer->surface_cleared = false; 5805294ac62236bf05e1eaaca3399e539c28c0ccc4cChristian König 5815294ac62236bf05e1eaaca3399e539c28c0ccc4cChristian König buffer->viewport.scale[0] = surface->width; 5825294ac62236bf05e1eaaca3399e539c28c0ccc4cChristian König buffer->viewport.scale[1] = surface->height; 5835294ac62236bf05e1eaaca3399e539c28c0ccc4cChristian König 5845294ac62236bf05e1eaaca3399e539c28c0ccc4cChristian König buffer->fb_state.width = surface->width; 5855294ac62236bf05e1eaaca3399e539c28c0ccc4cChristian König buffer->fb_state.height = surface->height; 5865294ac62236bf05e1eaaca3399e539c28c0ccc4cChristian König buffer->fb_state.cbufs[0] = surface; 5875294ac62236bf05e1eaaca3399e539c28c0ccc4cChristian König} 5885294ac62236bf05e1eaaca3399e539c28c0ccc4cChristian König 5895294ac62236bf05e1eaaca3399e539c28c0ccc4cChristian Königstatic void 590bce506ffc09c44552c3d1053c6a0450b8f010292Christian Königprepare_pipe_4_rendering(struct vl_mc *renderer, struct vl_mc_buffer *buffer, unsigned mask) 591eb7452e267974f9ff971b752046c512963f59f81Christian König{ 5925294ac62236bf05e1eaaca3399e539c28c0ccc4cChristian König assert(buffer); 593eb7452e267974f9ff971b752046c512963f59f81Christian König 5945294ac62236bf05e1eaaca3399e539c28c0ccc4cChristian König renderer->pipe->bind_rasterizer_state(renderer->pipe, renderer->rs_state); 5951f3a85ec7931c5d67fce0ec1e845d6c91048e599Christian König 596a87afba50529c6ae6762a3da68d4f31bc431e064Younes Manton if (buffer->surface_cleared) 5973ea7e2713c836f23d59c4034385609e371a94c8dChristian König renderer->pipe->bind_blend_state(renderer->pipe, renderer->blend_add[mask]); 5983ea7e2713c836f23d59c4034385609e371a94c8dChristian König else 5993ea7e2713c836f23d59c4034385609e371a94c8dChristian König renderer->pipe->bind_blend_state(renderer->pipe, renderer->blend_clear[mask]); 6005294ac62236bf05e1eaaca3399e539c28c0ccc4cChristian König 6015294ac62236bf05e1eaaca3399e539c28c0ccc4cChristian König renderer->pipe->set_framebuffer_state(renderer->pipe, &buffer->fb_state); 6025294ac62236bf05e1eaaca3399e539c28c0ccc4cChristian König renderer->pipe->set_viewport_state(renderer->pipe, &buffer->viewport); 60310c49b28752f5f2d822dfb1e2e6a1ec213cc44daChristian König} 60410c49b28752f5f2d822dfb1e2e6a1ec213cc44daChristian König 60510c49b28752f5f2d822dfb1e2e6a1ec213cc44daChristian Königvoid 606bce506ffc09c44552c3d1053c6a0450b8f010292Christian Königvl_mc_render_ref(struct vl_mc *renderer, struct vl_mc_buffer *buffer, struct pipe_sampler_view *ref) 60710c49b28752f5f2d822dfb1e2e6a1ec213cc44daChristian König{ 60810c49b28752f5f2d822dfb1e2e6a1ec213cc44daChristian König assert(buffer && ref); 60910c49b28752f5f2d822dfb1e2e6a1ec213cc44daChristian König 610bce506ffc09c44552c3d1053c6a0450b8f010292Christian König prepare_pipe_4_rendering(renderer, buffer, PIPE_MASK_R | PIPE_MASK_G | PIPE_MASK_B); 611eb7452e267974f9ff971b752046c512963f59f81Christian König 612b1c44b0ea6b3e891086ce554edf3c26dbd3708cdChristian König renderer->pipe->bind_vs_state(renderer->pipe, renderer->vs_ref); 61310c49b28752f5f2d822dfb1e2e6a1ec213cc44daChristian König renderer->pipe->bind_fs_state(renderer->pipe, renderer->fs_ref); 614b88fa924009b5cc572187d3ca6a395d5226aa1c3Christian König 61510c49b28752f5f2d822dfb1e2e6a1ec213cc44daChristian König renderer->pipe->set_fragment_sampler_views(renderer->pipe, 1, &ref); 61610c49b28752f5f2d822dfb1e2e6a1ec213cc44daChristian König renderer->pipe->bind_fragment_sampler_states(renderer->pipe, 1, &renderer->sampler_ref); 617e61a63a65198fe136ff9f1b6b8897c5b3c95b093Christian König 618b8a6e0e6fc451096d684a1e18529ab4879cdba0aChristian König util_draw_arrays_instanced(renderer->pipe, PIPE_PRIM_QUADS, 0, 4, 0, 61970a7695b4d1bd3f609eb9f98dd6872f1a5b89762Christian König renderer->buffer_width / VL_MACROBLOCK_WIDTH * 62070a7695b4d1bd3f609eb9f98dd6872f1a5b89762Christian König renderer->buffer_height / VL_MACROBLOCK_HEIGHT); 6213ea7e2713c836f23d59c4034385609e371a94c8dChristian König 6223ea7e2713c836f23d59c4034385609e371a94c8dChristian König buffer->surface_cleared = true; 62310c49b28752f5f2d822dfb1e2e6a1ec213cc44daChristian König} 624e61a63a65198fe136ff9f1b6b8897c5b3c95b093Christian König 62510c49b28752f5f2d822dfb1e2e6a1ec213cc44daChristian Königvoid 626bce506ffc09c44552c3d1053c6a0450b8f010292Christian Königvl_mc_render_ycbcr(struct vl_mc *renderer, struct vl_mc_buffer *buffer, unsigned component, unsigned num_instances) 62710c49b28752f5f2d822dfb1e2e6a1ec213cc44daChristian König{ 628c5110a1bfab8e97b8b958d42dd294a426310d1e2Christian König unsigned mask = 1 << component; 629e61a63a65198fe136ff9f1b6b8897c5b3c95b093Christian König 63010c49b28752f5f2d822dfb1e2e6a1ec213cc44daChristian König assert(buffer); 631e61a63a65198fe136ff9f1b6b8897c5b3c95b093Christian König 632b8a6e0e6fc451096d684a1e18529ab4879cdba0aChristian König if (num_instances == 0) 63310c49b28752f5f2d822dfb1e2e6a1ec213cc44daChristian König return; 634b88fa924009b5cc572187d3ca6a395d5226aa1c3Christian König 635bce506ffc09c44552c3d1053c6a0450b8f010292Christian König prepare_pipe_4_rendering(renderer, buffer, mask); 636b88fa924009b5cc572187d3ca6a395d5226aa1c3Christian König 637b1c44b0ea6b3e891086ce554edf3c26dbd3708cdChristian König renderer->pipe->bind_vs_state(renderer->pipe, renderer->vs_ycbcr); 63810c49b28752f5f2d822dfb1e2e6a1ec213cc44daChristian König renderer->pipe->bind_fs_state(renderer->pipe, renderer->fs_ycbcr); 639b88fa924009b5cc572187d3ca6a395d5226aa1c3Christian König 640b8a6e0e6fc451096d684a1e18529ab4879cdba0aChristian König util_draw_arrays_instanced(renderer->pipe, PIPE_PRIM_QUADS, 0, 4, 0, num_instances); 641c5110a1bfab8e97b8b958d42dd294a426310d1e2Christian König 642c5110a1bfab8e97b8b958d42dd294a426310d1e2Christian König if (buffer->surface_cleared) { 643c5110a1bfab8e97b8b958d42dd294a426310d1e2Christian König renderer->pipe->bind_blend_state(renderer->pipe, renderer->blend_sub[mask]); 644c5110a1bfab8e97b8b958d42dd294a426310d1e2Christian König renderer->pipe->bind_fs_state(renderer->pipe, renderer->fs_ycbcr_sub); 645c5110a1bfab8e97b8b958d42dd294a426310d1e2Christian König util_draw_arrays_instanced(renderer->pipe, PIPE_PRIM_QUADS, 0, 4, 0, num_instances); 646c5110a1bfab8e97b8b958d42dd294a426310d1e2Christian König } 647eb7452e267974f9ff971b752046c512963f59f81Christian König} 648