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