19f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom/**********************************************************
29f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom * Copyright 2009-2011 VMware, Inc. All rights reserved.
39f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom *
49f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom * Permission is hereby granted, free of charge, to any person
59f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom * obtaining a copy of this software and associated documentation
69f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom * files (the "Software"), to deal in the Software without
79f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom * restriction, including without limitation the rights to use, copy,
89f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom * modify, merge, publish, distribute, sublicense, and/or sell copies
99f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom * of the Software, and to permit persons to whom the Software is
109f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom * furnished to do so, subject to the following conditions:
119f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom *
129f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom * The above copyright notice and this permission notice shall be
139f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom * included in all copies or substantial portions of the Software.
149f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom *
159f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
169f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
179f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
189f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
199f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
209f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
219f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
229f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom * SOFTWARE.
239f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom *
249f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom *********************************************************
259f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom * Authors:
269f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom * Zack Rusin <zackr-at-vmware-dot-com>
279f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom */
289f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
299f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom#include "xa_context.h"
309f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom#include "xa_priv.h"
319f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom#include <math.h>
329f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom#include "cso_cache/cso_context.h"
339f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom#include "util/u_inlines.h"
349f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom#include "util/u_sampler.h"
359f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom#include "util/u_draw_quad.h"
369f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
379f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom#define floatsEqual(x, y) (fabs(x - y) <= 0.00001f * MIN2(fabs(x), fabs(y)))
389f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom#define floatIsZero(x) (floatsEqual((x) + 1, 1))
399f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
409f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom#define NUM_COMPONENTS 4
419f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
429f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstromvoid
439f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
449f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
459f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstromrenderer_set_constants(struct xa_context *r,
469f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom		       int shader_type, const float *params, int param_bytes);
479f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
489f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstromstatic INLINE boolean
499f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstromis_affine(float *matrix)
509f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom{
519f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    return floatIsZero(matrix[2]) && floatIsZero(matrix[5])
529f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	&& floatsEqual(matrix[8], 1);
539f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom}
549f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
559f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstromstatic INLINE void
569f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrommap_point(float *mat, float x, float y, float *out_x, float *out_y)
579f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom{
589f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    if (!mat) {
599f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	*out_x = x;
609f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	*out_y = y;
619f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	return;
629f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    }
639f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
649f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    *out_x = mat[0] * x + mat[3] * y + mat[6];
659f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    *out_y = mat[1] * x + mat[4] * y + mat[7];
669f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    if (!is_affine(mat)) {
679f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	float w = 1 / (mat[2] * x + mat[5] * y + mat[8]);
689f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
699f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	*out_x *= w;
709f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	*out_y *= w;
719f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    }
729f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom}
739f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
749f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstromstatic INLINE void
759f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstromrenderer_draw(struct xa_context *r)
769f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom{
779f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    int num_verts = r->buffer_size / (r->attrs_per_vertex * NUM_COMPONENTS);
789f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
799f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    if (!r->buffer_size)
809f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	return;
819f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
82889c9a566c1b0e1d3ef269c53900e5cfbd6d7b45Marek Olšák    cso_set_vertex_elements(r->cso, r->attrs_per_vertex, r->velems);
83889c9a566c1b0e1d3ef269c53900e5cfbd6d7b45Marek Olšák    util_draw_user_vertex_buffer(r->cso, r->buffer, PIPE_PRIM_QUADS,
84889c9a566c1b0e1d3ef269c53900e5cfbd6d7b45Marek Olšák                                 num_verts,	/* verts */
85889c9a566c1b0e1d3ef269c53900e5cfbd6d7b45Marek Olšák                                 r->attrs_per_vertex);	/* attribs/vert */
86889c9a566c1b0e1d3ef269c53900e5cfbd6d7b45Marek Olšák    r->buffer_size = 0;
879f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom}
889f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
899f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstromstatic INLINE void
909f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstromrenderer_draw_conditional(struct xa_context *r, int next_batch)
919f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom{
929f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    if (r->buffer_size + next_batch >= XA_VB_SIZE ||
939f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	(next_batch == 0 && r->buffer_size)) {
949f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	renderer_draw(r);
959f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    }
969f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom}
979f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
989f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstromvoid
999f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstromrenderer_init_state(struct xa_context *r)
1009f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom{
1019f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    struct pipe_depth_stencil_alpha_state dsa;
1029f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    struct pipe_rasterizer_state raster;
1039f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    unsigned i;
1049f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
1059f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    /* set common initial clip state */
1069f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    memset(&dsa, 0, sizeof(struct pipe_depth_stencil_alpha_state));
1079f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    cso_set_depth_stencil_alpha(r->cso, &dsa);
1089f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
1099f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    /* XXX: move to renderer_init_state? */
1109f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    memset(&raster, 0, sizeof(struct pipe_rasterizer_state));
1119f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    raster.gl_rasterization_rules = 1;
112dc4c821f0817a3db716f965692fb701079f66340Marek Olšák    raster.depth_clip = 1;
1139f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    cso_set_rasterizer(r->cso, &raster);
1149f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
1159f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    /* vertex elements state */
1169f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    memset(&r->velems[0], 0, sizeof(r->velems[0]) * 3);
1179f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    for (i = 0; i < 3; i++) {
1189f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	r->velems[i].src_offset = i * 4 * sizeof(float);
1199f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	r->velems[i].instance_divisor = 0;
1209f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	r->velems[i].vertex_buffer_index = 0;
1219f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	r->velems[i].src_format = PIPE_FORMAT_R32G32B32A32_FLOAT;
1229f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    }
1239f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom}
1249f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
1259f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstromstatic INLINE void
1269f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstromadd_vertex_color(struct xa_context *r, float x, float y, float color[4])
1279f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom{
1289f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    float *vertex = r->buffer + r->buffer_size;
1299f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
1309f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    vertex[0] = x;
1319f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    vertex[1] = y;
1329f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    vertex[2] = 0.f;		/*z */
1339f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    vertex[3] = 1.f;		/*w */
1349f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
1359f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    vertex[4] = color[0];	/*r */
1369f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    vertex[5] = color[1];	/*g */
1379f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    vertex[6] = color[2];	/*b */
1389f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    vertex[7] = color[3];	/*a */
1399f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
1409f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    r->buffer_size += 8;
1419f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom}
1429f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
1439f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstromstatic INLINE void
1449f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstromadd_vertex_1tex(struct xa_context *r, float x, float y, float s, float t)
1459f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom{
1469f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    float *vertex = r->buffer + r->buffer_size;
1479f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
1489f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    vertex[0] = x;
1499f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    vertex[1] = y;
1509f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    vertex[2] = 0.f;		/*z */
1519f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    vertex[3] = 1.f;		/*w */
1529f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
1539f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    vertex[4] = s;		/*s */
1549f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    vertex[5] = t;		/*t */
1559f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    vertex[6] = 0.f;		/*r */
1569f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    vertex[7] = 1.f;		/*q */
1579f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
1589f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    r->buffer_size += 8;
1599f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom}
1609f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
1619f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstromstatic INLINE void
1629f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstromadd_vertex_2tex(struct xa_context *r,
1639f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom		float x, float y, float s0, float t0, float s1, float t1)
1649f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom{
1659f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    float *vertex = r->buffer + r->buffer_size;
1669f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
1679f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    vertex[0] = x;
1689f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    vertex[1] = y;
1699f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    vertex[2] = 0.f;		/*z */
1709f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    vertex[3] = 1.f;		/*w */
1719f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
1729f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    vertex[4] = s0;		/*s */
1739f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    vertex[5] = t0;		/*t */
1749f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    vertex[6] = 0.f;		/*r */
1759f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    vertex[7] = 1.f;		/*q */
1769f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
1779f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    vertex[8] = s1;		/*s */
1789f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    vertex[9] = t1;		/*t */
1799f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    vertex[10] = 0.f;		/*r */
1809f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    vertex[11] = 1.f;		/*q */
1819f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
1829f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    r->buffer_size += 12;
1839f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom}
1849f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
185adf166b6c4f6781fd5e751622e9488e5f834bbc2Thomas Hellstromstatic void
186adf166b6c4f6781fd5e751622e9488e5f834bbc2Thomas Hellstromadd_vertex_data1(struct xa_context *r,
187adf166b6c4f6781fd5e751622e9488e5f834bbc2Thomas Hellstrom                 float srcX, float srcY,  float dstX, float dstY,
188adf166b6c4f6781fd5e751622e9488e5f834bbc2Thomas Hellstrom                 float width, float height,
189adf166b6c4f6781fd5e751622e9488e5f834bbc2Thomas Hellstrom                 struct pipe_resource *src, const float *src_matrix)
190adf166b6c4f6781fd5e751622e9488e5f834bbc2Thomas Hellstrom{
191adf166b6c4f6781fd5e751622e9488e5f834bbc2Thomas Hellstrom    float s0, t0, s1, t1, s2, t2, s3, t3;
192adf166b6c4f6781fd5e751622e9488e5f834bbc2Thomas Hellstrom    float pt0[2], pt1[2], pt2[2], pt3[2];
193adf166b6c4f6781fd5e751622e9488e5f834bbc2Thomas Hellstrom
194adf166b6c4f6781fd5e751622e9488e5f834bbc2Thomas Hellstrom    pt0[0] = srcX;
195adf166b6c4f6781fd5e751622e9488e5f834bbc2Thomas Hellstrom    pt0[1] = srcY;
196adf166b6c4f6781fd5e751622e9488e5f834bbc2Thomas Hellstrom    pt1[0] = (srcX + width);
197adf166b6c4f6781fd5e751622e9488e5f834bbc2Thomas Hellstrom    pt1[1] = srcY;
198adf166b6c4f6781fd5e751622e9488e5f834bbc2Thomas Hellstrom    pt2[0] = (srcX + width);
199adf166b6c4f6781fd5e751622e9488e5f834bbc2Thomas Hellstrom    pt2[1] = (srcY + height);
200adf166b6c4f6781fd5e751622e9488e5f834bbc2Thomas Hellstrom    pt3[0] = srcX;
201adf166b6c4f6781fd5e751622e9488e5f834bbc2Thomas Hellstrom    pt3[1] = (srcY + height);
202adf166b6c4f6781fd5e751622e9488e5f834bbc2Thomas Hellstrom
203adf166b6c4f6781fd5e751622e9488e5f834bbc2Thomas Hellstrom    if (src_matrix) {
204adf166b6c4f6781fd5e751622e9488e5f834bbc2Thomas Hellstrom	map_point((float *)src_matrix, pt0[0], pt0[1], &pt0[0], &pt0[1]);
205adf166b6c4f6781fd5e751622e9488e5f834bbc2Thomas Hellstrom	map_point((float *)src_matrix, pt1[0], pt1[1], &pt1[0], &pt1[1]);
206adf166b6c4f6781fd5e751622e9488e5f834bbc2Thomas Hellstrom	map_point((float *)src_matrix, pt2[0], pt2[1], &pt2[0], &pt2[1]);
207adf166b6c4f6781fd5e751622e9488e5f834bbc2Thomas Hellstrom	map_point((float *)src_matrix, pt3[0], pt3[1], &pt3[0], &pt3[1]);
208adf166b6c4f6781fd5e751622e9488e5f834bbc2Thomas Hellstrom    }
209adf166b6c4f6781fd5e751622e9488e5f834bbc2Thomas Hellstrom
210adf166b6c4f6781fd5e751622e9488e5f834bbc2Thomas Hellstrom    s0 =  pt0[0] / src->width0;
211adf166b6c4f6781fd5e751622e9488e5f834bbc2Thomas Hellstrom    s1 =  pt1[0] / src->width0;
212adf166b6c4f6781fd5e751622e9488e5f834bbc2Thomas Hellstrom    s2 =  pt2[0] / src->width0;
213adf166b6c4f6781fd5e751622e9488e5f834bbc2Thomas Hellstrom    s3 =  pt3[0] / src->width0;
214adf166b6c4f6781fd5e751622e9488e5f834bbc2Thomas Hellstrom    t0 =  pt0[1] / src->height0;
215adf166b6c4f6781fd5e751622e9488e5f834bbc2Thomas Hellstrom    t1 =  pt1[1] / src->height0;
216adf166b6c4f6781fd5e751622e9488e5f834bbc2Thomas Hellstrom    t2 =  pt2[1] / src->height0;
217adf166b6c4f6781fd5e751622e9488e5f834bbc2Thomas Hellstrom    t3 =  pt3[1] / src->height0;
218adf166b6c4f6781fd5e751622e9488e5f834bbc2Thomas Hellstrom
219adf166b6c4f6781fd5e751622e9488e5f834bbc2Thomas Hellstrom    /* 1st vertex */
220adf166b6c4f6781fd5e751622e9488e5f834bbc2Thomas Hellstrom    add_vertex_1tex(r, dstX, dstY, s0, t0);
221adf166b6c4f6781fd5e751622e9488e5f834bbc2Thomas Hellstrom    /* 2nd vertex */
222adf166b6c4f6781fd5e751622e9488e5f834bbc2Thomas Hellstrom    add_vertex_1tex(r, dstX + width, dstY, s1, t1);
223adf166b6c4f6781fd5e751622e9488e5f834bbc2Thomas Hellstrom    /* 3rd vertex */
224adf166b6c4f6781fd5e751622e9488e5f834bbc2Thomas Hellstrom    add_vertex_1tex(r, dstX + width, dstY + height, s2, t2);
225adf166b6c4f6781fd5e751622e9488e5f834bbc2Thomas Hellstrom    /* 4th vertex */
226adf166b6c4f6781fd5e751622e9488e5f834bbc2Thomas Hellstrom    add_vertex_1tex(r, dstX, dstY + height, s3, t3);
227adf166b6c4f6781fd5e751622e9488e5f834bbc2Thomas Hellstrom}
228adf166b6c4f6781fd5e751622e9488e5f834bbc2Thomas Hellstrom
229adf166b6c4f6781fd5e751622e9488e5f834bbc2Thomas Hellstromstatic void
230adf166b6c4f6781fd5e751622e9488e5f834bbc2Thomas Hellstromadd_vertex_data2(struct xa_context *r,
231adf166b6c4f6781fd5e751622e9488e5f834bbc2Thomas Hellstrom                 float srcX, float srcY, float maskX, float maskY,
232adf166b6c4f6781fd5e751622e9488e5f834bbc2Thomas Hellstrom                 float dstX, float dstY, float width, float height,
233adf166b6c4f6781fd5e751622e9488e5f834bbc2Thomas Hellstrom                 struct pipe_resource *src,
234adf166b6c4f6781fd5e751622e9488e5f834bbc2Thomas Hellstrom                 struct pipe_resource *mask,
235adf166b6c4f6781fd5e751622e9488e5f834bbc2Thomas Hellstrom                 const float *src_matrix, const float *mask_matrix)
236adf166b6c4f6781fd5e751622e9488e5f834bbc2Thomas Hellstrom{
237adf166b6c4f6781fd5e751622e9488e5f834bbc2Thomas Hellstrom    float src_s0, src_t0, src_s1, src_t1;
238adf166b6c4f6781fd5e751622e9488e5f834bbc2Thomas Hellstrom    float mask_s0, mask_t0, mask_s1, mask_t1;
239adf166b6c4f6781fd5e751622e9488e5f834bbc2Thomas Hellstrom    float spt0[2], spt1[2];
240adf166b6c4f6781fd5e751622e9488e5f834bbc2Thomas Hellstrom    float mpt0[2], mpt1[2];
241adf166b6c4f6781fd5e751622e9488e5f834bbc2Thomas Hellstrom
242adf166b6c4f6781fd5e751622e9488e5f834bbc2Thomas Hellstrom    spt0[0] = srcX;
243adf166b6c4f6781fd5e751622e9488e5f834bbc2Thomas Hellstrom    spt0[1] = srcY;
244adf166b6c4f6781fd5e751622e9488e5f834bbc2Thomas Hellstrom    spt1[0] = srcX + width;
245adf166b6c4f6781fd5e751622e9488e5f834bbc2Thomas Hellstrom    spt1[1] = srcY + height;
246adf166b6c4f6781fd5e751622e9488e5f834bbc2Thomas Hellstrom
247adf166b6c4f6781fd5e751622e9488e5f834bbc2Thomas Hellstrom    mpt0[0] = maskX;
248adf166b6c4f6781fd5e751622e9488e5f834bbc2Thomas Hellstrom    mpt0[1] = maskY;
249adf166b6c4f6781fd5e751622e9488e5f834bbc2Thomas Hellstrom    mpt1[0] = maskX + width;
250adf166b6c4f6781fd5e751622e9488e5f834bbc2Thomas Hellstrom    mpt1[1] = maskY + height;
251adf166b6c4f6781fd5e751622e9488e5f834bbc2Thomas Hellstrom
252adf166b6c4f6781fd5e751622e9488e5f834bbc2Thomas Hellstrom    if (src_matrix) {
253adf166b6c4f6781fd5e751622e9488e5f834bbc2Thomas Hellstrom	map_point((float *)src_matrix, spt0[0], spt0[1], &spt0[0], &spt0[1]);
254adf166b6c4f6781fd5e751622e9488e5f834bbc2Thomas Hellstrom	map_point((float *)src_matrix, spt1[0], spt1[1], &spt1[0], &spt1[1]);
255adf166b6c4f6781fd5e751622e9488e5f834bbc2Thomas Hellstrom    }
256adf166b6c4f6781fd5e751622e9488e5f834bbc2Thomas Hellstrom
257adf166b6c4f6781fd5e751622e9488e5f834bbc2Thomas Hellstrom    if (mask_matrix) {
258adf166b6c4f6781fd5e751622e9488e5f834bbc2Thomas Hellstrom	map_point((float *)mask_matrix, mpt0[0], mpt0[1], &mpt0[0], &mpt0[1]);
259adf166b6c4f6781fd5e751622e9488e5f834bbc2Thomas Hellstrom	map_point((float *)mask_matrix, mpt1[0], mpt1[1], &mpt1[0], &mpt1[1]);
260adf166b6c4f6781fd5e751622e9488e5f834bbc2Thomas Hellstrom    }
261adf166b6c4f6781fd5e751622e9488e5f834bbc2Thomas Hellstrom
262adf166b6c4f6781fd5e751622e9488e5f834bbc2Thomas Hellstrom    src_s0 = spt0[0] / src->width0;
263adf166b6c4f6781fd5e751622e9488e5f834bbc2Thomas Hellstrom    src_t0 = spt0[1] / src->height0;
264adf166b6c4f6781fd5e751622e9488e5f834bbc2Thomas Hellstrom    src_s1 = spt1[0] / src->width0;
265adf166b6c4f6781fd5e751622e9488e5f834bbc2Thomas Hellstrom    src_t1 = spt1[1] / src->height0;
266adf166b6c4f6781fd5e751622e9488e5f834bbc2Thomas Hellstrom
267adf166b6c4f6781fd5e751622e9488e5f834bbc2Thomas Hellstrom    mask_s0 = mpt0[0] / mask->width0;
268adf166b6c4f6781fd5e751622e9488e5f834bbc2Thomas Hellstrom    mask_t0 = mpt0[1] / mask->height0;
269adf166b6c4f6781fd5e751622e9488e5f834bbc2Thomas Hellstrom    mask_s1 = mpt1[0] / mask->width0;
270adf166b6c4f6781fd5e751622e9488e5f834bbc2Thomas Hellstrom    mask_t1 = mpt1[1] / mask->height0;
271adf166b6c4f6781fd5e751622e9488e5f834bbc2Thomas Hellstrom
272adf166b6c4f6781fd5e751622e9488e5f834bbc2Thomas Hellstrom    /* 1st vertex */
273adf166b6c4f6781fd5e751622e9488e5f834bbc2Thomas Hellstrom    add_vertex_2tex(r, dstX, dstY,
274adf166b6c4f6781fd5e751622e9488e5f834bbc2Thomas Hellstrom		    src_s0, src_t0, mask_s0, mask_t0);
275adf166b6c4f6781fd5e751622e9488e5f834bbc2Thomas Hellstrom    /* 2nd vertex */
276adf166b6c4f6781fd5e751622e9488e5f834bbc2Thomas Hellstrom    add_vertex_2tex(r, dstX + width, dstY,
277adf166b6c4f6781fd5e751622e9488e5f834bbc2Thomas Hellstrom		    src_s1, src_t0, mask_s1, mask_t0);
278adf166b6c4f6781fd5e751622e9488e5f834bbc2Thomas Hellstrom    /* 3rd vertex */
279adf166b6c4f6781fd5e751622e9488e5f834bbc2Thomas Hellstrom    add_vertex_2tex(r, dstX + width, dstY + height,
280adf166b6c4f6781fd5e751622e9488e5f834bbc2Thomas Hellstrom		    src_s1, src_t1, mask_s1, mask_t1);
281adf166b6c4f6781fd5e751622e9488e5f834bbc2Thomas Hellstrom    /* 4th vertex */
282adf166b6c4f6781fd5e751622e9488e5f834bbc2Thomas Hellstrom    add_vertex_2tex(r, dstX, dstY + height,
283adf166b6c4f6781fd5e751622e9488e5f834bbc2Thomas Hellstrom		    src_s0, src_t1, mask_s0, mask_t1);
284adf166b6c4f6781fd5e751622e9488e5f834bbc2Thomas Hellstrom}
285adf166b6c4f6781fd5e751622e9488e5f834bbc2Thomas Hellstrom
286889c9a566c1b0e1d3ef269c53900e5cfbd6d7b45Marek Olšákstatic void
2879f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstromsetup_vertex_data_yuv(struct xa_context *r,
2889f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom		      float srcX,
2899f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom		      float srcY,
2909f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom		      float srcW,
2919f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom		      float srcH,
2929f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom		      float dstX,
2939f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom		      float dstY,
2949f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom		      float dstW, float dstH, struct xa_surface *srf[])
2959f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom{
2969f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    float s0, t0, s1, t1;
2979f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    float spt0[2], spt1[2];
2989f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    struct pipe_resource *tex;
2999f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
3009f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    spt0[0] = srcX;
3019f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    spt0[1] = srcY;
3029f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    spt1[0] = srcX + srcW;
3039f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    spt1[1] = srcY + srcH;
3049f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
3059f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    tex = srf[0]->tex;
3069f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    s0 = spt0[0] / tex->width0;
3079f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    t0 = spt0[1] / tex->height0;
3089f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    s1 = spt1[0] / tex->width0;
3099f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    t1 = spt1[1] / tex->height0;
3109f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
3119f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    /* 1st vertex */
3129f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    add_vertex_1tex(r, dstX, dstY, s0, t0);
3139f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    /* 2nd vertex */
3149f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    add_vertex_1tex(r, dstX + dstW, dstY, s1, t0);
3159f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    /* 3rd vertex */
3169f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    add_vertex_1tex(r, dstX + dstW, dstY + dstH, s1, t1);
3179f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    /* 4th vertex */
3189f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    add_vertex_1tex(r, dstX, dstY + dstH, s0, t1);
3199f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom}
3209f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
3219f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom/* Set up framebuffer, viewport and vertex shader constant buffer
3229f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom * state for a particular destinaton surface.  In all our rendering,
3239f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom * these concepts are linked.
3249f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom */
3259f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstromvoid
3269f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstromrenderer_bind_destination(struct xa_context *r,
3279f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom			  struct pipe_surface *surface, int width, int height)
3289f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom{
3299f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
3309f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    struct pipe_framebuffer_state fb;
3319f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    struct pipe_viewport_state viewport;
3329f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
3339f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    /* Framebuffer uses actual surface width/height
3349f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom     */
3359f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    memset(&fb, 0, sizeof fb);
3369f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    fb.width = surface->width;
3379f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    fb.height = surface->height;
3389f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    fb.nr_cbufs = 1;
3399f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    fb.cbufs[0] = surface;
3409f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    fb.zsbuf = 0;
3419f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
3429f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    /* Viewport just touches the bit we're interested in:
3439f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom     */
3449f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    viewport.scale[0] = width / 2.f;
3459f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    viewport.scale[1] = height / 2.f;
3469f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    viewport.scale[2] = 1.0;
3479f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    viewport.scale[3] = 1.0;
3489f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    viewport.translate[0] = width / 2.f;
3499f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    viewport.translate[1] = height / 2.f;
3509f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    viewport.translate[2] = 0.0;
3519f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    viewport.translate[3] = 0.0;
3529f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
3539f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    /* Constant buffer set up to match viewport dimensions:
3549f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom     */
3559f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    if (r->fb_width != width || r->fb_height != height) {
3569f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	float vs_consts[8] = {
3579f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	    2.f / width, 2.f / height, 1, 1,
3589f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	    -1, -1, 0, 0
3599f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	};
3609f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
3619f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	r->fb_width = width;
3629f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	r->fb_height = height;
3639f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
3649f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	renderer_set_constants(r, PIPE_SHADER_VERTEX,
3659f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom			       vs_consts, sizeof vs_consts);
3669f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    }
3679f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
3689f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    cso_set_framebuffer(r->cso, &fb);
3699f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    cso_set_viewport(r->cso, &viewport);
3709f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom}
3719f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
3729f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstromvoid
3739f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstromrenderer_set_constants(struct xa_context *r,
3749f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom		       int shader_type, const float *params, int param_bytes)
3759f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom{
3769f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    struct pipe_resource **cbuf =
3779f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	(shader_type == PIPE_SHADER_VERTEX) ? &r->vs_const_buffer :
3789f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	&r->fs_const_buffer;
3799f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
3809f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    pipe_resource_reference(cbuf, NULL);
3819f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    *cbuf = pipe_buffer_create(r->pipe->screen,
3829f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom			       PIPE_BIND_CONSTANT_BUFFER, PIPE_USAGE_STATIC,
3839f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom			       param_bytes);
3849f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
3859f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    if (*cbuf) {
3869f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	pipe_buffer_write(r->pipe, *cbuf, 0, param_bytes, params);
3879f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    }
388507337864fa80caf9f26602324d2c28dd0a75d61Marek Olšák    pipe_set_constant_buffer(r->pipe, shader_type, 0, *cbuf);
3899f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom}
3909f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
3919f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstromvoid
3929f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstromrenderer_copy_prepare(struct xa_context *r,
3939f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom		      struct pipe_surface *dst_surface,
394aa7d7656f50f5c49734e3b0fad0f20a89cd5eb5bThomas Hellstrom		      struct pipe_resource *src_texture,
395aa7d7656f50f5c49734e3b0fad0f20a89cd5eb5bThomas Hellstrom		      const enum xa_formats src_xa_format,
396aa7d7656f50f5c49734e3b0fad0f20a89cd5eb5bThomas Hellstrom		      const enum xa_formats dst_xa_format)
3979f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom{
3989f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    struct pipe_context *pipe = r->pipe;
3999f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    struct pipe_screen *screen = pipe->screen;
4009f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    struct xa_shader shader;
401568d99cc6c8eea75ce50fe29e1ea8a94fe7ff7a7Thomas Hellstrom    uint32_t fs_traits = FS_COMPOSITE;
4029f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
4039f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    assert(screen->is_format_supported(screen, dst_surface->format,
4049f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom				       PIPE_TEXTURE_2D, 0,
4059f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom				       PIPE_BIND_RENDER_TARGET));
4069f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    (void)screen;
4079f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
4089f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    /* set misc state we care about */
4099f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    {
4109f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	struct pipe_blend_state blend;
4119f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
4129f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	memset(&blend, 0, sizeof(blend));
4139f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	blend.rt[0].rgb_src_factor = PIPE_BLENDFACTOR_ONE;
4149f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	blend.rt[0].alpha_src_factor = PIPE_BLENDFACTOR_ONE;
4159f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	blend.rt[0].rgb_dst_factor = PIPE_BLENDFACTOR_ZERO;
4169f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	blend.rt[0].alpha_dst_factor = PIPE_BLENDFACTOR_ZERO;
4179f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	blend.rt[0].colormask = PIPE_MASK_RGBA;
4189f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	cso_set_blend(r->cso, &blend);
4199f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    }
4209f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
4219f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    /* sampler */
4229f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    {
4239f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	struct pipe_sampler_state sampler;
4249f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
4259f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	memset(&sampler, 0, sizeof(sampler));
4269f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	sampler.wrap_s = PIPE_TEX_WRAP_CLAMP_TO_EDGE;
4279f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	sampler.wrap_t = PIPE_TEX_WRAP_CLAMP_TO_EDGE;
4289f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	sampler.wrap_r = PIPE_TEX_WRAP_CLAMP_TO_EDGE;
4299f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	sampler.min_mip_filter = PIPE_TEX_MIPFILTER_NONE;
4309f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	sampler.min_img_filter = PIPE_TEX_FILTER_NEAREST;
4319f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	sampler.mag_img_filter = PIPE_TEX_FILTER_NEAREST;
4329f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	sampler.normalized_coords = 1;
433459dd568979a5745d84f8fd2bdff38242ee3c16fBrian Paul	cso_single_sampler(r->cso, PIPE_SHADER_FRAGMENT, 0, &sampler);
434459dd568979a5745d84f8fd2bdff38242ee3c16fBrian Paul	cso_single_sampler_done(r->cso, PIPE_SHADER_FRAGMENT);
4359f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    }
4369f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
4379f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    renderer_bind_destination(r, dst_surface,
4389f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom			      dst_surface->width, dst_surface->height);
4399f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
4409f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    /* texture/sampler view */
4419f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    {
4429f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	struct pipe_sampler_view templ;
4439f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	struct pipe_sampler_view *src_view;
4449f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
4459f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	u_sampler_view_default_template(&templ,
4469f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom					src_texture, src_texture->format);
4479f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	src_view = pipe->create_sampler_view(pipe, src_texture, &templ);
448459dd568979a5745d84f8fd2bdff38242ee3c16fBrian Paul	cso_set_sampler_views(r->cso, PIPE_SHADER_FRAGMENT, 1, &src_view);
4499f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	pipe_sampler_view_reference(&src_view, NULL);
4509f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    }
4519f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
4529f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    /* shaders */
453568d99cc6c8eea75ce50fe29e1ea8a94fe7ff7a7Thomas Hellstrom    if (src_texture->format == PIPE_FORMAT_L8_UNORM)
454568d99cc6c8eea75ce50fe29e1ea8a94fe7ff7a7Thomas Hellstrom	fs_traits |= FS_SRC_LUMINANCE;
455568d99cc6c8eea75ce50fe29e1ea8a94fe7ff7a7Thomas Hellstrom    if (dst_surface->format == PIPE_FORMAT_L8_UNORM)
456568d99cc6c8eea75ce50fe29e1ea8a94fe7ff7a7Thomas Hellstrom	fs_traits |= FS_DST_LUMINANCE;
457aa7d7656f50f5c49734e3b0fad0f20a89cd5eb5bThomas Hellstrom    if (xa_format_a(dst_xa_format) != 0 &&
458aa7d7656f50f5c49734e3b0fad0f20a89cd5eb5bThomas Hellstrom	xa_format_a(src_xa_format) == 0)
459aa7d7656f50f5c49734e3b0fad0f20a89cd5eb5bThomas Hellstrom	fs_traits |= FS_SRC_SET_ALPHA;
460568d99cc6c8eea75ce50fe29e1ea8a94fe7ff7a7Thomas Hellstrom
461568d99cc6c8eea75ce50fe29e1ea8a94fe7ff7a7Thomas Hellstrom    shader = xa_shaders_get(r->shaders, VS_COMPOSITE, fs_traits);
4629f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    cso_set_vertex_shader_handle(r->cso, shader.vs);
4639f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    cso_set_fragment_shader_handle(r->cso, shader.fs);
4649f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
4659f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    r->buffer_size = 0;
4669f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    r->attrs_per_vertex = 2;
4679f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom}
4689f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
4699f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstromvoid
470642951fbcaa56a975422f7caddf6620f20d47721Thomas Hellstromrenderer_copy(struct xa_context *r,
471642951fbcaa56a975422f7caddf6620f20d47721Thomas Hellstrom	      int dx,
472642951fbcaa56a975422f7caddf6620f20d47721Thomas Hellstrom	      int dy,
473642951fbcaa56a975422f7caddf6620f20d47721Thomas Hellstrom	      int sx,
474642951fbcaa56a975422f7caddf6620f20d47721Thomas Hellstrom	      int sy,
475642951fbcaa56a975422f7caddf6620f20d47721Thomas Hellstrom	      int width, int height, float src_width, float src_height)
4769f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom{
4779f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    float s0, t0, s1, t1;
4789f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    float x0, y0, x1, y1;
4799f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
4809f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    /* XXX: could put the texcoord scaling calculation into the vertex
4819f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom     * shader.
4829f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom     */
4839f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    s0 = sx / src_width;
4849f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    s1 = (sx + width) / src_width;
4859f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    t0 = sy / src_height;
4869f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    t1 = (sy + height) / src_height;
4879f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
4889f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    x0 = dx;
4899f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    x1 = dx + width;
4909f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    y0 = dy;
4919f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    y1 = dy + height;
4929f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
4939f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    /* draw quad */
4949f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    renderer_draw_conditional(r, 4 * 8);
4959f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    add_vertex_1tex(r, x0, y0, s0, t0);
4969f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    add_vertex_1tex(r, x1, y0, s1, t0);
4979f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    add_vertex_1tex(r, x1, y1, s1, t1);
4989f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    add_vertex_1tex(r, x0, y1, s0, t1);
4999f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom}
5009f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
5019f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstromvoid
5029f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstromrenderer_draw_yuv(struct xa_context *r,
5039f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom		  float src_x,
5049f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom		  float src_y,
5059f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom		  float src_w,
5069f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom		  float src_h,
5079f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom		  int dst_x,
5089f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom		  int dst_y, int dst_w, int dst_h, struct xa_surface *srf[])
5099f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom{
510889c9a566c1b0e1d3ef269c53900e5cfbd6d7b45Marek Olšák   const int num_attribs = 2;	/*pos + tex coord */
5119f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
512889c9a566c1b0e1d3ef269c53900e5cfbd6d7b45Marek Olšák   setup_vertex_data_yuv(r,
513889c9a566c1b0e1d3ef269c53900e5cfbd6d7b45Marek Olšák                         src_x, src_y, src_w, src_h,
514889c9a566c1b0e1d3ef269c53900e5cfbd6d7b45Marek Olšák                         dst_x, dst_y, dst_w, dst_h, srf);
5159f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
516889c9a566c1b0e1d3ef269c53900e5cfbd6d7b45Marek Olšák   cso_set_vertex_elements(r->cso, num_attribs, r->velems);
517889c9a566c1b0e1d3ef269c53900e5cfbd6d7b45Marek Olšák   util_draw_user_vertex_buffer(r->cso, r->buffer, PIPE_PRIM_QUADS,
518889c9a566c1b0e1d3ef269c53900e5cfbd6d7b45Marek Olšák                                4,	/* verts */
519889c9a566c1b0e1d3ef269c53900e5cfbd6d7b45Marek Olšák                                num_attribs);	/* attribs/vert */
520889c9a566c1b0e1d3ef269c53900e5cfbd6d7b45Marek Olšák   r->buffer_size = 0;
5219f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom}
5229f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
5239f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstromvoid
5249f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstromrenderer_begin_solid(struct xa_context *r)
5259f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom{
5269f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    r->buffer_size = 0;
5279f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    r->attrs_per_vertex = 2;
5289f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom}
5299f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
5309f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstromvoid
5319f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstromrenderer_solid(struct xa_context *r,
5329f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	       int x0, int y0, int x1, int y1, float *color)
5339f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom{
5349f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    /*
5359f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom     * debug_printf("solid rect[(%d, %d), (%d, %d)], rgba[%f, %f, %f, %f]\n",
5369f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom     * x0, y0, x1, y1, color[0], color[1], color[2], color[3]); */
5379f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
5389f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    renderer_draw_conditional(r, 4 * 8);
5399f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
5409f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    /* 1st vertex */
5419f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    add_vertex_color(r, x0, y0, color);
5429f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    /* 2nd vertex */
5439f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    add_vertex_color(r, x1, y0, color);
5449f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    /* 3rd vertex */
5459f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    add_vertex_color(r, x1, y1, color);
5469f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    /* 4th vertex */
5479f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    add_vertex_color(r, x0, y1, color);
5489f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom}
5499f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
5509f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstromvoid
5519f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstromrenderer_draw_flush(struct xa_context *r)
5529f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom{
5539f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    renderer_draw_conditional(r, 0);
5549f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom}
555adf166b6c4f6781fd5e751622e9488e5f834bbc2Thomas Hellstrom
556adf166b6c4f6781fd5e751622e9488e5f834bbc2Thomas Hellstromvoid
557adf166b6c4f6781fd5e751622e9488e5f834bbc2Thomas Hellstromrenderer_begin_textures(struct xa_context *r)
558adf166b6c4f6781fd5e751622e9488e5f834bbc2Thomas Hellstrom{
559adf166b6c4f6781fd5e751622e9488e5f834bbc2Thomas Hellstrom    r->attrs_per_vertex = 1 + r->num_bound_samplers;
560adf166b6c4f6781fd5e751622e9488e5f834bbc2Thomas Hellstrom    r->buffer_size = 0;
561adf166b6c4f6781fd5e751622e9488e5f834bbc2Thomas Hellstrom}
562adf166b6c4f6781fd5e751622e9488e5f834bbc2Thomas Hellstrom
563adf166b6c4f6781fd5e751622e9488e5f834bbc2Thomas Hellstromvoid
564adf166b6c4f6781fd5e751622e9488e5f834bbc2Thomas Hellstromrenderer_texture(struct xa_context *r,
565adf166b6c4f6781fd5e751622e9488e5f834bbc2Thomas Hellstrom		 int *pos,
566adf166b6c4f6781fd5e751622e9488e5f834bbc2Thomas Hellstrom		 int width, int height,
567adf166b6c4f6781fd5e751622e9488e5f834bbc2Thomas Hellstrom		 const float *src_matrix,
568adf166b6c4f6781fd5e751622e9488e5f834bbc2Thomas Hellstrom		 const float *mask_matrix)
569adf166b6c4f6781fd5e751622e9488e5f834bbc2Thomas Hellstrom{
570adf166b6c4f6781fd5e751622e9488e5f834bbc2Thomas Hellstrom    struct pipe_sampler_view **sampler_view = r->bound_sampler_views;
571adf166b6c4f6781fd5e751622e9488e5f834bbc2Thomas Hellstrom
572adf166b6c4f6781fd5e751622e9488e5f834bbc2Thomas Hellstrom#if 0
573adf166b6c4f6781fd5e751622e9488e5f834bbc2Thomas Hellstrom    if (src_matrix) {
574adf166b6c4f6781fd5e751622e9488e5f834bbc2Thomas Hellstrom	debug_printf("src_matrix = \n");
575adf166b6c4f6781fd5e751622e9488e5f834bbc2Thomas Hellstrom	debug_printf("%f, %f, %f\n", src_matrix[0], src_matrix[1], src_matrix[2]);
576adf166b6c4f6781fd5e751622e9488e5f834bbc2Thomas Hellstrom	debug_printf("%f, %f, %f\n", src_matrix[3], src_matrix[4], src_matrix[5]);
577adf166b6c4f6781fd5e751622e9488e5f834bbc2Thomas Hellstrom	debug_printf("%f, %f, %f\n", src_matrix[6], src_matrix[7], src_matrix[8]);
578adf166b6c4f6781fd5e751622e9488e5f834bbc2Thomas Hellstrom    }
579adf166b6c4f6781fd5e751622e9488e5f834bbc2Thomas Hellstrom    if (mask_matrix) {
580adf166b6c4f6781fd5e751622e9488e5f834bbc2Thomas Hellstrom	debug_printf("mask_matrix = \n");
581adf166b6c4f6781fd5e751622e9488e5f834bbc2Thomas Hellstrom	debug_printf("%f, %f, %f\n", mask_matrix[0], mask_matrix[1], mask_matrix[2]);
582adf166b6c4f6781fd5e751622e9488e5f834bbc2Thomas Hellstrom	debug_printf("%f, %f, %f\n", mask_matrix[3], mask_matrix[4], mask_matrix[5]);
583adf166b6c4f6781fd5e751622e9488e5f834bbc2Thomas Hellstrom	debug_printf("%f, %f, %f\n", mask_matrix[6], mask_matrix[7], mask_matrix[8]);
584adf166b6c4f6781fd5e751622e9488e5f834bbc2Thomas Hellstrom    }
585adf166b6c4f6781fd5e751622e9488e5f834bbc2Thomas Hellstrom#endif
586adf166b6c4f6781fd5e751622e9488e5f834bbc2Thomas Hellstrom
587adf166b6c4f6781fd5e751622e9488e5f834bbc2Thomas Hellstrom    switch(r->attrs_per_vertex) {
588adf166b6c4f6781fd5e751622e9488e5f834bbc2Thomas Hellstrom    case 2:
589adf166b6c4f6781fd5e751622e9488e5f834bbc2Thomas Hellstrom	renderer_draw_conditional(r, 4 * 8);
590adf166b6c4f6781fd5e751622e9488e5f834bbc2Thomas Hellstrom	add_vertex_data1(r,
591adf166b6c4f6781fd5e751622e9488e5f834bbc2Thomas Hellstrom			 pos[0], pos[1], /* src */
592adf166b6c4f6781fd5e751622e9488e5f834bbc2Thomas Hellstrom			 pos[4], pos[5], /* dst */
593adf166b6c4f6781fd5e751622e9488e5f834bbc2Thomas Hellstrom			 width, height,
594adf166b6c4f6781fd5e751622e9488e5f834bbc2Thomas Hellstrom			 sampler_view[0]->texture, src_matrix);
595adf166b6c4f6781fd5e751622e9488e5f834bbc2Thomas Hellstrom	break;
596adf166b6c4f6781fd5e751622e9488e5f834bbc2Thomas Hellstrom    case 3:
597adf166b6c4f6781fd5e751622e9488e5f834bbc2Thomas Hellstrom	renderer_draw_conditional(r, 4 * 12);
598adf166b6c4f6781fd5e751622e9488e5f834bbc2Thomas Hellstrom	add_vertex_data2(r,
599adf166b6c4f6781fd5e751622e9488e5f834bbc2Thomas Hellstrom			 pos[0], pos[1], /* src */
600adf166b6c4f6781fd5e751622e9488e5f834bbc2Thomas Hellstrom			 pos[2], pos[3], /* mask */
601adf166b6c4f6781fd5e751622e9488e5f834bbc2Thomas Hellstrom			 pos[4], pos[5], /* dst */
602adf166b6c4f6781fd5e751622e9488e5f834bbc2Thomas Hellstrom			 width, height,
603adf166b6c4f6781fd5e751622e9488e5f834bbc2Thomas Hellstrom			 sampler_view[0]->texture, sampler_view[1]->texture,
604adf166b6c4f6781fd5e751622e9488e5f834bbc2Thomas Hellstrom			 src_matrix, mask_matrix);
605adf166b6c4f6781fd5e751622e9488e5f834bbc2Thomas Hellstrom	break;
606adf166b6c4f6781fd5e751622e9488e5f834bbc2Thomas Hellstrom    default:
607adf166b6c4f6781fd5e751622e9488e5f834bbc2Thomas Hellstrom	break;
608adf166b6c4f6781fd5e751622e9488e5f834bbc2Thomas Hellstrom    }
609adf166b6c4f6781fd5e751622e9488e5f834bbc2Thomas Hellstrom}
610