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