1319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin#include "xorg_exa.h"
2319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin#include "xorg_renderer.h"
3319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin
4319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin#include "xorg_exa_tgsi.h"
5319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin
6319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin#include "cso_cache/cso_context.h"
7319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin#include "util/u_draw_quad.h"
8319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin#include "util/u_math.h"
9319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin#include "util/u_memory.h"
10ac8662c29dbf96b456d23308c1bc459eea63e36cRoland Scheidegger#include "util/u_sampler.h"
11319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin
1228486880ca3ec39419ccee0cb1a3bedc9ef7117cJosé Fonseca#include "util/u_inlines.h"
134c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger#include "util/u_box.h"
14319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin
15a39a3cc14e816cc91a81028a27c4dbd4816cdc9dZack Rusin#include <math.h>
16a39a3cc14e816cc91a81028a27c4dbd4816cdc9dZack Rusin
17a39a3cc14e816cc91a81028a27c4dbd4816cdc9dZack Rusin#define floatsEqual(x, y) (fabs(x - y) <= 0.00001f * MIN2(fabs(x), fabs(y)))
18a39a3cc14e816cc91a81028a27c4dbd4816cdc9dZack Rusin#define floatIsZero(x) (floatsEqual((x) + 1, 1))
19a39a3cc14e816cc91a81028a27c4dbd4816cdc9dZack Rusin
20a6d527d7b82579feae9db20657d47a3f86115bb4Zack Rusin#define NUM_COMPONENTS 4
21a6d527d7b82579feae9db20657d47a3f86115bb4Zack Rusin
22a39a3cc14e816cc91a81028a27c4dbd4816cdc9dZack Rusinstatic INLINE boolean is_affine(float *matrix)
23a39a3cc14e816cc91a81028a27c4dbd4816cdc9dZack Rusin{
24a39a3cc14e816cc91a81028a27c4dbd4816cdc9dZack Rusin   return floatIsZero(matrix[2]) && floatIsZero(matrix[5])
25a39a3cc14e816cc91a81028a27c4dbd4816cdc9dZack Rusin      && floatsEqual(matrix[8], 1);
26a39a3cc14e816cc91a81028a27c4dbd4816cdc9dZack Rusin}
27a39a3cc14e816cc91a81028a27c4dbd4816cdc9dZack Rusinstatic INLINE void map_point(float *mat, float x, float y,
28a39a3cc14e816cc91a81028a27c4dbd4816cdc9dZack Rusin                             float *out_x, float *out_y)
29a39a3cc14e816cc91a81028a27c4dbd4816cdc9dZack Rusin{
30a39a3cc14e816cc91a81028a27c4dbd4816cdc9dZack Rusin   if (!mat) {
31a39a3cc14e816cc91a81028a27c4dbd4816cdc9dZack Rusin      *out_x = x;
32a39a3cc14e816cc91a81028a27c4dbd4816cdc9dZack Rusin      *out_y = y;
33a39a3cc14e816cc91a81028a27c4dbd4816cdc9dZack Rusin      return;
34a39a3cc14e816cc91a81028a27c4dbd4816cdc9dZack Rusin   }
35a39a3cc14e816cc91a81028a27c4dbd4816cdc9dZack Rusin
36a39a3cc14e816cc91a81028a27c4dbd4816cdc9dZack Rusin   *out_x = mat[0]*x + mat[3]*y + mat[6];
37a39a3cc14e816cc91a81028a27c4dbd4816cdc9dZack Rusin   *out_y = mat[1]*x + mat[4]*y + mat[7];
38a39a3cc14e816cc91a81028a27c4dbd4816cdc9dZack Rusin   if (!is_affine(mat)) {
39a39a3cc14e816cc91a81028a27c4dbd4816cdc9dZack Rusin      float w = 1/(mat[2]*x + mat[5]*y + mat[8]);
40a39a3cc14e816cc91a81028a27c4dbd4816cdc9dZack Rusin      *out_x *= w;
41a39a3cc14e816cc91a81028a27c4dbd4816cdc9dZack Rusin      *out_y *= w;
42a39a3cc14e816cc91a81028a27c4dbd4816cdc9dZack Rusin   }
43a39a3cc14e816cc91a81028a27c4dbd4816cdc9dZack Rusin}
44a39a3cc14e816cc91a81028a27c4dbd4816cdc9dZack Rusin
454322346f3fd03788a79d056ca7bce2db25bc9d88Zack Rusinstatic INLINE void
464322346f3fd03788a79d056ca7bce2db25bc9d88Zack Rusinrenderer_draw(struct xorg_renderer *r)
474322346f3fd03788a79d056ca7bce2db25bc9d88Zack Rusin{
48d2c886c8caf52c1e3581af350fd23ecf839a2491Zack Rusin   int num_verts = r->buffer_size/(r->attrs_per_vertex * NUM_COMPONENTS);
494322346f3fd03788a79d056ca7bce2db25bc9d88Zack Rusin
50d2c886c8caf52c1e3581af350fd23ecf839a2491Zack Rusin   if (!r->buffer_size)
514322346f3fd03788a79d056ca7bce2db25bc9d88Zack Rusin      return;
524322346f3fd03788a79d056ca7bce2db25bc9d88Zack Rusin
533ed72dd31d45b66e54724dcd20bbbbb6875313c3Marek Olšák   cso_set_vertex_elements(r->cso, r->attrs_per_vertex, r->velems);
543ed72dd31d45b66e54724dcd20bbbbb6875313c3Marek Olšák   util_draw_user_vertex_buffer(r->cso, r->buffer, PIPE_PRIM_QUADS,
553ed72dd31d45b66e54724dcd20bbbbb6875313c3Marek Olšák                                num_verts, r->attrs_per_vertex);
56711476be2904bd16d45b424236d6aefa9a9e6bc9Roland Scheidegger
573ed72dd31d45b66e54724dcd20bbbbb6875313c3Marek Olšák   r->buffer_size = 0;
584322346f3fd03788a79d056ca7bce2db25bc9d88Zack Rusin}
594322346f3fd03788a79d056ca7bce2db25bc9d88Zack Rusin
604322346f3fd03788a79d056ca7bce2db25bc9d88Zack Rusinstatic INLINE void
614322346f3fd03788a79d056ca7bce2db25bc9d88Zack Rusinrenderer_draw_conditional(struct xorg_renderer *r,
624322346f3fd03788a79d056ca7bce2db25bc9d88Zack Rusin                          int next_batch)
634322346f3fd03788a79d056ca7bce2db25bc9d88Zack Rusin{
64d2c886c8caf52c1e3581af350fd23ecf839a2491Zack Rusin   if (r->buffer_size + next_batch >= BUF_SIZE ||
65d2c886c8caf52c1e3581af350fd23ecf839a2491Zack Rusin       (next_batch == 0 && r->buffer_size)) {
664322346f3fd03788a79d056ca7bce2db25bc9d88Zack Rusin      renderer_draw(r);
67a6d527d7b82579feae9db20657d47a3f86115bb4Zack Rusin   }
684322346f3fd03788a79d056ca7bce2db25bc9d88Zack Rusin}
694322346f3fd03788a79d056ca7bce2db25bc9d88Zack Rusin
70319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusinstatic void
71319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusinrenderer_init_state(struct xorg_renderer *r)
72319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin{
73319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   struct pipe_depth_stencil_alpha_state dsa;
74b4ea1eb871ec0e5fffd70bf4da6cdec5d25b5c50Keith Whitwell   struct pipe_rasterizer_state raster;
75711476be2904bd16d45b424236d6aefa9a9e6bc9Roland Scheidegger   unsigned i;
76319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin
77319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   /* set common initial clip state */
78319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   memset(&dsa, 0, sizeof(struct pipe_depth_stencil_alpha_state));
79319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   cso_set_depth_stencil_alpha(r->cso, &dsa);
80b4ea1eb871ec0e5fffd70bf4da6cdec5d25b5c50Keith Whitwell
81b4ea1eb871ec0e5fffd70bf4da6cdec5d25b5c50Keith Whitwell
82b4ea1eb871ec0e5fffd70bf4da6cdec5d25b5c50Keith Whitwell   /* XXX: move to renderer_init_state? */
83b4ea1eb871ec0e5fffd70bf4da6cdec5d25b5c50Keith Whitwell   memset(&raster, 0, sizeof(struct pipe_rasterizer_state));
84b4ea1eb871ec0e5fffd70bf4da6cdec5d25b5c50Keith Whitwell   raster.gl_rasterization_rules = 1;
85dc4c821f0817a3db716f965692fb701079f66340Marek Olšák   raster.depth_clip = 1;
86b4ea1eb871ec0e5fffd70bf4da6cdec5d25b5c50Keith Whitwell   cso_set_rasterizer(r->cso, &raster);
87b4ea1eb871ec0e5fffd70bf4da6cdec5d25b5c50Keith Whitwell
88711476be2904bd16d45b424236d6aefa9a9e6bc9Roland Scheidegger   /* vertex elements state */
89711476be2904bd16d45b424236d6aefa9a9e6bc9Roland Scheidegger   memset(&r->velems[0], 0, sizeof(r->velems[0]) * 3);
90711476be2904bd16d45b424236d6aefa9a9e6bc9Roland Scheidegger   for (i = 0; i < 3; i++) {
91711476be2904bd16d45b424236d6aefa9a9e6bc9Roland Scheidegger      r->velems[i].src_offset = i * 4 * sizeof(float);
92711476be2904bd16d45b424236d6aefa9a9e6bc9Roland Scheidegger      r->velems[i].instance_divisor = 0;
93711476be2904bd16d45b424236d6aefa9a9e6bc9Roland Scheidegger      r->velems[i].vertex_buffer_index = 0;
94711476be2904bd16d45b424236d6aefa9a9e6bc9Roland Scheidegger      r->velems[i].src_format = PIPE_FORMAT_R32G32B32A32_FLOAT;
95711476be2904bd16d45b424236d6aefa9a9e6bc9Roland Scheidegger   }
96319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin}
97319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin
98319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin
99319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusinstatic INLINE void
100e1730632aa5ca1dbb0edd484e2357246ec537abbZack Rusinadd_vertex_color(struct xorg_renderer *r,
101e1730632aa5ca1dbb0edd484e2357246ec537abbZack Rusin                 float x, float y,
102e1730632aa5ca1dbb0edd484e2357246ec537abbZack Rusin                 float color[4])
103319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin{
104d2c886c8caf52c1e3581af350fd23ecf839a2491Zack Rusin   float *vertex = r->buffer + r->buffer_size;
105e1730632aa5ca1dbb0edd484e2357246ec537abbZack Rusin
10625728860fcb65b53cf7212d54d39a01a3dc90a49Zack Rusin   vertex[0] = x;
10725728860fcb65b53cf7212d54d39a01a3dc90a49Zack Rusin   vertex[1] = y;
10825728860fcb65b53cf7212d54d39a01a3dc90a49Zack Rusin   vertex[2] = 0.f; /*z*/
10925728860fcb65b53cf7212d54d39a01a3dc90a49Zack Rusin   vertex[3] = 1.f; /*w*/
11025728860fcb65b53cf7212d54d39a01a3dc90a49Zack Rusin
11125728860fcb65b53cf7212d54d39a01a3dc90a49Zack Rusin   vertex[4] = color[0]; /*r*/
11225728860fcb65b53cf7212d54d39a01a3dc90a49Zack Rusin   vertex[5] = color[1]; /*g*/
11325728860fcb65b53cf7212d54d39a01a3dc90a49Zack Rusin   vertex[6] = color[2]; /*b*/
11425728860fcb65b53cf7212d54d39a01a3dc90a49Zack Rusin   vertex[7] = color[3]; /*a*/
115e1730632aa5ca1dbb0edd484e2357246ec537abbZack Rusin
116d2c886c8caf52c1e3581af350fd23ecf839a2491Zack Rusin   r->buffer_size += 8;
117319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin}
118319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin
119319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusinstatic INLINE void
120e1730632aa5ca1dbb0edd484e2357246ec537abbZack Rusinadd_vertex_1tex(struct xorg_renderer *r,
121e1730632aa5ca1dbb0edd484e2357246ec537abbZack Rusin                float x, float y, float s, float t)
122319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin{
123d2c886c8caf52c1e3581af350fd23ecf839a2491Zack Rusin   float *vertex = r->buffer + r->buffer_size;
124e1730632aa5ca1dbb0edd484e2357246ec537abbZack Rusin
12525728860fcb65b53cf7212d54d39a01a3dc90a49Zack Rusin   vertex[0] = x;
12625728860fcb65b53cf7212d54d39a01a3dc90a49Zack Rusin   vertex[1] = y;
12725728860fcb65b53cf7212d54d39a01a3dc90a49Zack Rusin   vertex[2] = 0.f; /*z*/
12825728860fcb65b53cf7212d54d39a01a3dc90a49Zack Rusin   vertex[3] = 1.f; /*w*/
12925728860fcb65b53cf7212d54d39a01a3dc90a49Zack Rusin
13025728860fcb65b53cf7212d54d39a01a3dc90a49Zack Rusin   vertex[4] = s;   /*s*/
13125728860fcb65b53cf7212d54d39a01a3dc90a49Zack Rusin   vertex[5] = t;   /*t*/
13225728860fcb65b53cf7212d54d39a01a3dc90a49Zack Rusin   vertex[6] = 0.f; /*r*/
13325728860fcb65b53cf7212d54d39a01a3dc90a49Zack Rusin   vertex[7] = 1.f; /*q*/
134e1730632aa5ca1dbb0edd484e2357246ec537abbZack Rusin
135d2c886c8caf52c1e3581af350fd23ecf839a2491Zack Rusin   r->buffer_size += 8;
136319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin}
137319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin
138e521bf7706a5527ad5750baef78feaa961f73eccZack Rusinstatic void
139e521bf7706a5527ad5750baef78feaa961f73eccZack Rusinadd_vertex_data1(struct xorg_renderer *r,
140e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin                 float srcX, float srcY,  float dstX, float dstY,
141e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin                 float width, float height,
142287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell                 struct pipe_resource *src, float *src_matrix)
143319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin{
144654122ba7b813683a893d60d10ca201258defaceZack Rusin   float s0, t0, s1, t1, s2, t2, s3, t3;
145654122ba7b813683a893d60d10ca201258defaceZack Rusin   float pt0[2], pt1[2], pt2[2], pt3[2];
146319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin
147bec5230a1ff3998d0f184fc2b7437b51082c329fZack Rusin   pt0[0] = srcX;
148bec5230a1ff3998d0f184fc2b7437b51082c329fZack Rusin   pt0[1] = srcY;
149bec5230a1ff3998d0f184fc2b7437b51082c329fZack Rusin   pt1[0] = (srcX + width);
150654122ba7b813683a893d60d10ca201258defaceZack Rusin   pt1[1] = srcY;
151654122ba7b813683a893d60d10ca201258defaceZack Rusin   pt2[0] = (srcX + width);
152654122ba7b813683a893d60d10ca201258defaceZack Rusin   pt2[1] = (srcY + height);
153654122ba7b813683a893d60d10ca201258defaceZack Rusin   pt3[0] = srcX;
154654122ba7b813683a893d60d10ca201258defaceZack Rusin   pt3[1] = (srcY + height);
155319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin
156a39a3cc14e816cc91a81028a27c4dbd4816cdc9dZack Rusin   if (src_matrix) {
157bec5230a1ff3998d0f184fc2b7437b51082c329fZack Rusin      map_point(src_matrix, pt0[0], pt0[1], &pt0[0], &pt0[1]);
158bec5230a1ff3998d0f184fc2b7437b51082c329fZack Rusin      map_point(src_matrix, pt1[0], pt1[1], &pt1[0], &pt1[1]);
159654122ba7b813683a893d60d10ca201258defaceZack Rusin      map_point(src_matrix, pt2[0], pt2[1], &pt2[0], &pt2[1]);
160654122ba7b813683a893d60d10ca201258defaceZack Rusin      map_point(src_matrix, pt3[0], pt3[1], &pt3[0], &pt3[1]);
161a39a3cc14e816cc91a81028a27c4dbd4816cdc9dZack Rusin   }
162319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin
163d509f84543d0979e9bb53c20c195f378dd61e728Roland Scheidegger   s0 =  pt0[0] / src->width0;
164d509f84543d0979e9bb53c20c195f378dd61e728Roland Scheidegger   s1 =  pt1[0] / src->width0;
165d509f84543d0979e9bb53c20c195f378dd61e728Roland Scheidegger   s2 =  pt2[0] / src->width0;
166d509f84543d0979e9bb53c20c195f378dd61e728Roland Scheidegger   s3 =  pt3[0] / src->width0;
167d509f84543d0979e9bb53c20c195f378dd61e728Roland Scheidegger   t0 =  pt0[1] / src->height0;
168d509f84543d0979e9bb53c20c195f378dd61e728Roland Scheidegger   t1 =  pt1[1] / src->height0;
169d509f84543d0979e9bb53c20c195f378dd61e728Roland Scheidegger   t2 =  pt2[1] / src->height0;
170d509f84543d0979e9bb53c20c195f378dd61e728Roland Scheidegger   t3 =  pt3[1] / src->height0;
171bec5230a1ff3998d0f184fc2b7437b51082c329fZack Rusin
172bec5230a1ff3998d0f184fc2b7437b51082c329fZack Rusin   /* 1st vertex */
173e1730632aa5ca1dbb0edd484e2357246ec537abbZack Rusin   add_vertex_1tex(r, dstX, dstY, s0, t0);
174bec5230a1ff3998d0f184fc2b7437b51082c329fZack Rusin   /* 2nd vertex */
175654122ba7b813683a893d60d10ca201258defaceZack Rusin   add_vertex_1tex(r, dstX + width, dstY, s1, t1);
176bec5230a1ff3998d0f184fc2b7437b51082c329fZack Rusin   /* 3rd vertex */
177654122ba7b813683a893d60d10ca201258defaceZack Rusin   add_vertex_1tex(r, dstX + width, dstY + height, s2, t2);
178bec5230a1ff3998d0f184fc2b7437b51082c329fZack Rusin   /* 4th vertex */
179654122ba7b813683a893d60d10ca201258defaceZack Rusin   add_vertex_1tex(r, dstX, dstY + height, s3, t3);
180319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin}
181319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin
182319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin
183319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusinstatic INLINE void
184e1730632aa5ca1dbb0edd484e2357246ec537abbZack Rusinadd_vertex_2tex(struct xorg_renderer *r,
185e1730632aa5ca1dbb0edd484e2357246ec537abbZack Rusin                float x, float y,
186e1730632aa5ca1dbb0edd484e2357246ec537abbZack Rusin                float s0, float t0, float s1, float t1)
187319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin{
188d2c886c8caf52c1e3581af350fd23ecf839a2491Zack Rusin   float *vertex = r->buffer + r->buffer_size;
189e1730632aa5ca1dbb0edd484e2357246ec537abbZack Rusin
19025728860fcb65b53cf7212d54d39a01a3dc90a49Zack Rusin   vertex[0] = x;
19125728860fcb65b53cf7212d54d39a01a3dc90a49Zack Rusin   vertex[1] = y;
19225728860fcb65b53cf7212d54d39a01a3dc90a49Zack Rusin   vertex[2] = 0.f; /*z*/
19325728860fcb65b53cf7212d54d39a01a3dc90a49Zack Rusin   vertex[3] = 1.f; /*w*/
19425728860fcb65b53cf7212d54d39a01a3dc90a49Zack Rusin
19525728860fcb65b53cf7212d54d39a01a3dc90a49Zack Rusin   vertex[4] = s0;  /*s*/
19625728860fcb65b53cf7212d54d39a01a3dc90a49Zack Rusin   vertex[5] = t0;  /*t*/
19725728860fcb65b53cf7212d54d39a01a3dc90a49Zack Rusin   vertex[6] = 0.f; /*r*/
19825728860fcb65b53cf7212d54d39a01a3dc90a49Zack Rusin   vertex[7] = 1.f; /*q*/
19925728860fcb65b53cf7212d54d39a01a3dc90a49Zack Rusin
20025728860fcb65b53cf7212d54d39a01a3dc90a49Zack Rusin   vertex[8] = s1;  /*s*/
20125728860fcb65b53cf7212d54d39a01a3dc90a49Zack Rusin   vertex[9] = t1;  /*t*/
20225728860fcb65b53cf7212d54d39a01a3dc90a49Zack Rusin   vertex[10] = 0.f; /*r*/
20325728860fcb65b53cf7212d54d39a01a3dc90a49Zack Rusin   vertex[11] = 1.f; /*q*/
204e1730632aa5ca1dbb0edd484e2357246ec537abbZack Rusin
205d2c886c8caf52c1e3581af350fd23ecf839a2491Zack Rusin   r->buffer_size += 12;
206319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin}
207319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin
208e521bf7706a5527ad5750baef78feaa961f73eccZack Rusinstatic void
209e521bf7706a5527ad5750baef78feaa961f73eccZack Rusinadd_vertex_data2(struct xorg_renderer *r,
210e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin                 float srcX, float srcY, float maskX, float maskY,
211e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin                 float dstX, float dstY, float width, float height,
212287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell                 struct pipe_resource *src,
213287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell                 struct pipe_resource *mask,
214e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin                 float *src_matrix, float *mask_matrix)
215319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin{
216cdad337fec39d788a4b04de080a51d0ea1325e10Lucas Stach   float src_s0, src_t0, src_s1, src_t1, src_s2, src_t2, src_s3, src_t3;
217cdad337fec39d788a4b04de080a51d0ea1325e10Lucas Stach   float mask_s0, mask_t0, mask_s1, mask_t1, mask_s2, mask_t2, mask_s3, mask_t3;
218cdad337fec39d788a4b04de080a51d0ea1325e10Lucas Stach   float spt0[2], spt1[2], spt2[2], spt3[2];
219cdad337fec39d788a4b04de080a51d0ea1325e10Lucas Stach   float mpt0[2], mpt1[2], mpt2[2], mpt3[2];
220bec5230a1ff3998d0f184fc2b7437b51082c329fZack Rusin
221bec5230a1ff3998d0f184fc2b7437b51082c329fZack Rusin   spt0[0] = srcX;
222bec5230a1ff3998d0f184fc2b7437b51082c329fZack Rusin   spt0[1] = srcY;
223cdad337fec39d788a4b04de080a51d0ea1325e10Lucas Stach   spt1[0] = (srcX + width);
224cdad337fec39d788a4b04de080a51d0ea1325e10Lucas Stach   spt1[1] = srcY;
225cdad337fec39d788a4b04de080a51d0ea1325e10Lucas Stach   spt2[0] = (srcX + width);
226cdad337fec39d788a4b04de080a51d0ea1325e10Lucas Stach   spt2[1] = (srcY + height);
227cdad337fec39d788a4b04de080a51d0ea1325e10Lucas Stach   spt3[0] = srcX;
228cdad337fec39d788a4b04de080a51d0ea1325e10Lucas Stach   spt3[1] = (srcY + height);
229bec5230a1ff3998d0f184fc2b7437b51082c329fZack Rusin
230bec5230a1ff3998d0f184fc2b7437b51082c329fZack Rusin   mpt0[0] = maskX;
231bec5230a1ff3998d0f184fc2b7437b51082c329fZack Rusin   mpt0[1] = maskY;
232cdad337fec39d788a4b04de080a51d0ea1325e10Lucas Stach   mpt1[0] = (maskX + width);
233cdad337fec39d788a4b04de080a51d0ea1325e10Lucas Stach   mpt1[1] = maskY;
234cdad337fec39d788a4b04de080a51d0ea1325e10Lucas Stach   mpt2[0] = (maskX + width);
235cdad337fec39d788a4b04de080a51d0ea1325e10Lucas Stach   mpt2[1] = (maskY + height);
236cdad337fec39d788a4b04de080a51d0ea1325e10Lucas Stach   mpt3[0] = maskX;
237cdad337fec39d788a4b04de080a51d0ea1325e10Lucas Stach   mpt3[1] = (maskY + height);
238bec5230a1ff3998d0f184fc2b7437b51082c329fZack Rusin
239bec5230a1ff3998d0f184fc2b7437b51082c329fZack Rusin   if (src_matrix) {
240bec5230a1ff3998d0f184fc2b7437b51082c329fZack Rusin      map_point(src_matrix, spt0[0], spt0[1], &spt0[0], &spt0[1]);
241bec5230a1ff3998d0f184fc2b7437b51082c329fZack Rusin      map_point(src_matrix, spt1[0], spt1[1], &spt1[0], &spt1[1]);
242cdad337fec39d788a4b04de080a51d0ea1325e10Lucas Stach      map_point(src_matrix, spt2[0], spt2[1], &spt2[0], &spt2[1]);
243cdad337fec39d788a4b04de080a51d0ea1325e10Lucas Stach      map_point(src_matrix, spt3[0], spt3[1], &spt3[0], &spt3[1]);
244bec5230a1ff3998d0f184fc2b7437b51082c329fZack Rusin   }
245319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin
246bec5230a1ff3998d0f184fc2b7437b51082c329fZack Rusin   if (mask_matrix) {
247bec5230a1ff3998d0f184fc2b7437b51082c329fZack Rusin      map_point(mask_matrix, mpt0[0], mpt0[1], &mpt0[0], &mpt0[1]);
248bec5230a1ff3998d0f184fc2b7437b51082c329fZack Rusin      map_point(mask_matrix, mpt1[0], mpt1[1], &mpt1[0], &mpt1[1]);
249cdad337fec39d788a4b04de080a51d0ea1325e10Lucas Stach      map_point(mask_matrix, mpt2[0], mpt2[1], &mpt2[0], &mpt2[1]);
250cdad337fec39d788a4b04de080a51d0ea1325e10Lucas Stach      map_point(mask_matrix, mpt3[0], mpt3[1], &mpt3[0], &mpt3[1]);
251a39a3cc14e816cc91a81028a27c4dbd4816cdc9dZack Rusin   }
252319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin
253cdad337fec39d788a4b04de080a51d0ea1325e10Lucas Stach   src_s0 =  spt0[0] / src->width0;
254cdad337fec39d788a4b04de080a51d0ea1325e10Lucas Stach   src_s1 =  spt1[0] / src->width0;
255cdad337fec39d788a4b04de080a51d0ea1325e10Lucas Stach   src_s2 =  spt2[0] / src->width0;
256cdad337fec39d788a4b04de080a51d0ea1325e10Lucas Stach   src_s3 =  spt3[0] / src->width0;
257cdad337fec39d788a4b04de080a51d0ea1325e10Lucas Stach   src_t0 =  spt0[1] / src->height0;
258cdad337fec39d788a4b04de080a51d0ea1325e10Lucas Stach   src_t1 =  spt1[1] / src->height0;
259cdad337fec39d788a4b04de080a51d0ea1325e10Lucas Stach   src_t2 =  spt2[1] / src->height0;
260cdad337fec39d788a4b04de080a51d0ea1325e10Lucas Stach   src_t3 =  spt3[1] / src->height0;
261cdad337fec39d788a4b04de080a51d0ea1325e10Lucas Stach
262cdad337fec39d788a4b04de080a51d0ea1325e10Lucas Stach   mask_s0 =  mpt0[0] / mask->width0;
263cdad337fec39d788a4b04de080a51d0ea1325e10Lucas Stach   mask_s1 =  mpt1[0] / mask->width0;
264cdad337fec39d788a4b04de080a51d0ea1325e10Lucas Stach   mask_s2 =  mpt2[0] / mask->width0;
265cdad337fec39d788a4b04de080a51d0ea1325e10Lucas Stach   mask_s3 =  mpt3[0] / mask->width0;
266cdad337fec39d788a4b04de080a51d0ea1325e10Lucas Stach   mask_t0 =  mpt0[1] / mask->height0;
267cdad337fec39d788a4b04de080a51d0ea1325e10Lucas Stach   mask_t1 =  mpt1[1] / mask->height0;
268cdad337fec39d788a4b04de080a51d0ea1325e10Lucas Stach   mask_t2 =  mpt2[1] / mask->height0;
269cdad337fec39d788a4b04de080a51d0ea1325e10Lucas Stach   mask_t3 =  mpt3[1] / mask->height0;
270bec5230a1ff3998d0f184fc2b7437b51082c329fZack Rusin
271bec5230a1ff3998d0f184fc2b7437b51082c329fZack Rusin   /* 1st vertex */
272e1730632aa5ca1dbb0edd484e2357246ec537abbZack Rusin   add_vertex_2tex(r, dstX, dstY,
273e1730632aa5ca1dbb0edd484e2357246ec537abbZack Rusin                   src_s0, src_t0, mask_s0, mask_t0);
274bec5230a1ff3998d0f184fc2b7437b51082c329fZack Rusin   /* 2nd vertex */
275e1730632aa5ca1dbb0edd484e2357246ec537abbZack Rusin   add_vertex_2tex(r, dstX + width, dstY,
276cdad337fec39d788a4b04de080a51d0ea1325e10Lucas Stach                   src_s1, src_t1, mask_s1, mask_t1);
277bec5230a1ff3998d0f184fc2b7437b51082c329fZack Rusin   /* 3rd vertex */
278e1730632aa5ca1dbb0edd484e2357246ec537abbZack Rusin   add_vertex_2tex(r, dstX + width, dstY + height,
279cdad337fec39d788a4b04de080a51d0ea1325e10Lucas Stach                   src_s2, src_t2, mask_s2, mask_t2);
280bec5230a1ff3998d0f184fc2b7437b51082c329fZack Rusin   /* 4th vertex */
281e1730632aa5ca1dbb0edd484e2357246ec537abbZack Rusin   add_vertex_2tex(r, dstX, dstY + height,
282cdad337fec39d788a4b04de080a51d0ea1325e10Lucas Stach                   src_s3, src_t3, mask_s3, mask_t3);
283319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin}
284319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin
2853ed72dd31d45b66e54724dcd20bbbbb6875313c3Marek Olšákstatic void
286a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusinsetup_vertex_data_yuv(struct xorg_renderer *r,
287a7fa56a64b8963e74e93f3bac8ac80813f4a9778Zack Rusin                      float srcX, float srcY, float srcW, float srcH,
288a7fa56a64b8963e74e93f3bac8ac80813f4a9778Zack Rusin                      float dstX, float dstY, float dstW, float dstH,
289287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell                      struct pipe_resource **tex)
290a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin{
291a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin   float s0, t0, s1, t1;
292a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin   float spt0[2], spt1[2];
293a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin
294a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin   spt0[0] = srcX;
295a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin   spt0[1] = srcY;
296a7fa56a64b8963e74e93f3bac8ac80813f4a9778Zack Rusin   spt1[0] = srcX + srcW;
297a7fa56a64b8963e74e93f3bac8ac80813f4a9778Zack Rusin   spt1[1] = srcY + srcH;
298a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin
299d509f84543d0979e9bb53c20c195f378dd61e728Roland Scheidegger   s0 = spt0[0] / tex[0]->width0;
300d509f84543d0979e9bb53c20c195f378dd61e728Roland Scheidegger   t0 = spt0[1] / tex[0]->height0;
301d509f84543d0979e9bb53c20c195f378dd61e728Roland Scheidegger   s1 = spt1[0] / tex[0]->width0;
302d509f84543d0979e9bb53c20c195f378dd61e728Roland Scheidegger   t1 = spt1[1] / tex[0]->height0;
303a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin
304a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin   /* 1st vertex */
305e1730632aa5ca1dbb0edd484e2357246ec537abbZack Rusin   add_vertex_1tex(r, dstX, dstY, s0, t0);
306a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin   /* 2nd vertex */
307e1730632aa5ca1dbb0edd484e2357246ec537abbZack Rusin   add_vertex_1tex(r, dstX + dstW, dstY,
308e1730632aa5ca1dbb0edd484e2357246ec537abbZack Rusin                   s1, t0);
309a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin   /* 3rd vertex */
310e1730632aa5ca1dbb0edd484e2357246ec537abbZack Rusin   add_vertex_1tex(r, dstX + dstW, dstY + dstH,
311e1730632aa5ca1dbb0edd484e2357246ec537abbZack Rusin                   s1, t1);
312a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin   /* 4th vertex */
313e1730632aa5ca1dbb0edd484e2357246ec537abbZack Rusin   add_vertex_1tex(r, dstX, dstY + dstH,
314e1730632aa5ca1dbb0edd484e2357246ec537abbZack Rusin                   s0, t1);
315a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin}
316a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin
317319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin
318319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin
3197fbdbad5c02e3d5bfbf0e641e2aec224e39fa974Keith Whitwell/* Set up framebuffer, viewport and vertex shader constant buffer
3207fbdbad5c02e3d5bfbf0e641e2aec224e39fa974Keith Whitwell * state for a particular destinaton surface.  In all our rendering,
3217fbdbad5c02e3d5bfbf0e641e2aec224e39fa974Keith Whitwell * these concepts are linked.
3227fbdbad5c02e3d5bfbf0e641e2aec224e39fa974Keith Whitwell */
3237fbdbad5c02e3d5bfbf0e641e2aec224e39fa974Keith Whitwellvoid renderer_bind_destination(struct xorg_renderer *r,
3244236493899b9ccfcc8df3dcf81697776621fa1f8Keith Whitwell                               struct pipe_surface *surface,
3254236493899b9ccfcc8df3dcf81697776621fa1f8Keith Whitwell                               int width,
3264236493899b9ccfcc8df3dcf81697776621fa1f8Keith Whitwell                               int height )
327319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin{
3287fbdbad5c02e3d5bfbf0e641e2aec224e39fa974Keith Whitwell
3297fbdbad5c02e3d5bfbf0e641e2aec224e39fa974Keith Whitwell   struct pipe_framebuffer_state fb;
330319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   struct pipe_viewport_state viewport;
331319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin
3324236493899b9ccfcc8df3dcf81697776621fa1f8Keith Whitwell   /* Framebuffer uses actual surface width/height
3334236493899b9ccfcc8df3dcf81697776621fa1f8Keith Whitwell    */
3347fbdbad5c02e3d5bfbf0e641e2aec224e39fa974Keith Whitwell   memset(&fb, 0, sizeof fb);
3354236493899b9ccfcc8df3dcf81697776621fa1f8Keith Whitwell   fb.width  = surface->width;
3364236493899b9ccfcc8df3dcf81697776621fa1f8Keith Whitwell   fb.height = surface->height;
3377fbdbad5c02e3d5bfbf0e641e2aec224e39fa974Keith Whitwell   fb.nr_cbufs = 1;
3387fbdbad5c02e3d5bfbf0e641e2aec224e39fa974Keith Whitwell   fb.cbufs[0] = surface;
3397fbdbad5c02e3d5bfbf0e641e2aec224e39fa974Keith Whitwell   fb.zsbuf = 0;
340319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin
3414236493899b9ccfcc8df3dcf81697776621fa1f8Keith Whitwell   /* Viewport just touches the bit we're interested in:
3424236493899b9ccfcc8df3dcf81697776621fa1f8Keith Whitwell    */
343319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   viewport.scale[0] =  width / 2.f;
3447fbdbad5c02e3d5bfbf0e641e2aec224e39fa974Keith Whitwell   viewport.scale[1] =  height / 2.f;
345319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   viewport.scale[2] =  1.0;
346319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   viewport.scale[3] =  1.0;
347319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   viewport.translate[0] = width / 2.f;
348319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   viewport.translate[1] = height / 2.f;
349319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   viewport.translate[2] = 0.0;
350319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   viewport.translate[3] = 0.0;
351319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin
3524236493899b9ccfcc8df3dcf81697776621fa1f8Keith Whitwell   /* Constant buffer set up to match viewport dimensions:
3534236493899b9ccfcc8df3dcf81697776621fa1f8Keith Whitwell    */
3547fbdbad5c02e3d5bfbf0e641e2aec224e39fa974Keith Whitwell   if (r->fb_width != width ||
3557fbdbad5c02e3d5bfbf0e641e2aec224e39fa974Keith Whitwell       r->fb_height != height)
3567fbdbad5c02e3d5bfbf0e641e2aec224e39fa974Keith Whitwell   {
3577fbdbad5c02e3d5bfbf0e641e2aec224e39fa974Keith Whitwell      float vs_consts[8] = {
3587fbdbad5c02e3d5bfbf0e641e2aec224e39fa974Keith Whitwell         2.f/width, 2.f/height, 1, 1,
3597fbdbad5c02e3d5bfbf0e641e2aec224e39fa974Keith Whitwell         -1, -1, 0, 0
3607fbdbad5c02e3d5bfbf0e641e2aec224e39fa974Keith Whitwell      };
3617fbdbad5c02e3d5bfbf0e641e2aec224e39fa974Keith Whitwell
3627fbdbad5c02e3d5bfbf0e641e2aec224e39fa974Keith Whitwell      r->fb_width = width;
3637fbdbad5c02e3d5bfbf0e641e2aec224e39fa974Keith Whitwell      r->fb_height = height;
3647fbdbad5c02e3d5bfbf0e641e2aec224e39fa974Keith Whitwell
3657fbdbad5c02e3d5bfbf0e641e2aec224e39fa974Keith Whitwell      renderer_set_constants(r, PIPE_SHADER_VERTEX,
3667fbdbad5c02e3d5bfbf0e641e2aec224e39fa974Keith Whitwell                             vs_consts, sizeof vs_consts);
3677fbdbad5c02e3d5bfbf0e641e2aec224e39fa974Keith Whitwell   }
3687fbdbad5c02e3d5bfbf0e641e2aec224e39fa974Keith Whitwell
3697fbdbad5c02e3d5bfbf0e641e2aec224e39fa974Keith Whitwell   cso_set_framebuffer(r->cso, &fb);
370319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   cso_set_viewport(r->cso, &viewport);
371319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin}
372319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin
373319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin
374319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusinstruct xorg_renderer * renderer_create(struct pipe_context *pipe)
375319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin{
376319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   struct xorg_renderer *renderer = CALLOC_STRUCT(xorg_renderer);
377319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin
378150d4968e31e4600f9479c53f83d810b92b59cf7Zack Rusin   renderer->pipe = pipe;
379319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   renderer->cso = cso_create_context(pipe);
380319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   renderer->shaders = xorg_shaders_create(renderer);
381319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin
382319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   renderer_init_state(renderer);
383319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin
384319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   return renderer;
385319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin}
386319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin
387319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusinvoid renderer_destroy(struct xorg_renderer *r)
388319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin{
389287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell   struct pipe_resource **vsbuf = &r->vs_const_buffer;
390287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell   struct pipe_resource **fsbuf = &r->fs_const_buffer;
391319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin
392f44b0ff84338c2184ef4f2cbb752bf62f4fff1fcRoland Scheidegger   if (*vsbuf)
393287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell      pipe_resource_reference(vsbuf, NULL);
394319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin
395f44b0ff84338c2184ef4f2cbb752bf62f4fff1fcRoland Scheidegger   if (*fsbuf)
396287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell      pipe_resource_reference(fsbuf, NULL);
397319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin
398a9f71b3bba86771be56ff1def716beb370decd22Jakob Bornecrantz   if (r->shaders) {
399a9f71b3bba86771be56ff1def716beb370decd22Jakob Bornecrantz      xorg_shaders_destroy(r->shaders);
400a9f71b3bba86771be56ff1def716beb370decd22Jakob Bornecrantz      r->shaders = NULL;
401a9f71b3bba86771be56ff1def716beb370decd22Jakob Bornecrantz   }
402a9f71b3bba86771be56ff1def716beb370decd22Jakob Bornecrantz
403319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   if (r->cso) {
404319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin      cso_release_all(r->cso);
405319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin      cso_destroy_context(r->cso);
406a9f71b3bba86771be56ff1def716beb370decd22Jakob Bornecrantz      r->cso = NULL;
407319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   }
408319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin}
409319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin
410319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin
411319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin
412319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin
413319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin
414319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusinvoid renderer_set_constants(struct xorg_renderer *r,
415319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin                            int shader_type,
416319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin                            const float *params,
417319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin                            int param_bytes)
418319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin{
419287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell   struct pipe_resource **cbuf =
420319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin      (shader_type == PIPE_SHADER_VERTEX) ? &r->vs_const_buffer :
421319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin      &r->fs_const_buffer;
422319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin
423287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell   pipe_resource_reference(cbuf, NULL);
424287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell   *cbuf = pipe_buffer_create(r->pipe->screen,
425287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell                              PIPE_BIND_CONSTANT_BUFFER,
426eafb7f234d11a290b00dcaf5492b9bdad1cf5148Marek Olšák                              PIPE_USAGE_STATIC,
427f44b0ff84338c2184ef4f2cbb752bf62f4fff1fcRoland Scheidegger                              param_bytes);
428319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin
429f44b0ff84338c2184ef4f2cbb752bf62f4fff1fcRoland Scheidegger   if (*cbuf) {
430287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell      pipe_buffer_write(r->pipe, *cbuf,
431319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin                        0, param_bytes, params);
432319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   }
433507337864fa80caf9f26602324d2c28dd0a75d61Marek Olšák   pipe_set_constant_buffer(r->pipe, shader_type, 0, *cbuf);
434319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin}
435319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin
436319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin
437319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin
438a7fa56a64b8963e74e93f3bac8ac80813f4a9778Zack Rusinvoid renderer_draw_yuv(struct xorg_renderer *r,
4397356d1c140f2989df9e8645cf4b85962f27d0fcaThomas Hellstrom                       float src_x, float src_y, float src_w, float src_h,
440a7fa56a64b8963e74e93f3bac8ac80813f4a9778Zack Rusin                       int dst_x, int dst_y, int dst_w, int dst_h,
441287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell                       struct pipe_resource **textures)
442a7fa56a64b8963e74e93f3bac8ac80813f4a9778Zack Rusin{
4433ed72dd31d45b66e54724dcd20bbbbb6875313c3Marek Olšák   const int num_attribs = 2; /*pos + tex coord*/
444a7fa56a64b8963e74e93f3bac8ac80813f4a9778Zack Rusin
4453ed72dd31d45b66e54724dcd20bbbbb6875313c3Marek Olšák   setup_vertex_data_yuv(r,
4463ed72dd31d45b66e54724dcd20bbbbb6875313c3Marek Olšák                         src_x, src_y, src_w, src_h,
4473ed72dd31d45b66e54724dcd20bbbbb6875313c3Marek Olšák                         dst_x, dst_y, dst_w, dst_h,
4483ed72dd31d45b66e54724dcd20bbbbb6875313c3Marek Olšák                         textures);
449a7fa56a64b8963e74e93f3bac8ac80813f4a9778Zack Rusin
4503ed72dd31d45b66e54724dcd20bbbbb6875313c3Marek Olšák   cso_set_vertex_elements(r->cso, num_attribs, r->velems);
451711476be2904bd16d45b424236d6aefa9a9e6bc9Roland Scheidegger
4523ed72dd31d45b66e54724dcd20bbbbb6875313c3Marek Olšák   util_draw_user_vertex_buffer(r->cso, r->buffer,
4533ed72dd31d45b66e54724dcd20bbbbb6875313c3Marek Olšák                                PIPE_PRIM_QUADS,
4543ed72dd31d45b66e54724dcd20bbbbb6875313c3Marek Olšák                                4,  /* verts */
4553ed72dd31d45b66e54724dcd20bbbbb6875313c3Marek Olšák                                num_attribs); /* attribs/vert */
456a7fa56a64b8963e74e93f3bac8ac80813f4a9778Zack Rusin
4573ed72dd31d45b66e54724dcd20bbbbb6875313c3Marek Olšák   r->buffer_size = 0;
458a7fa56a64b8963e74e93f3bac8ac80813f4a9778Zack Rusin}
459e1730632aa5ca1dbb0edd484e2357246ec537abbZack Rusin
4604322346f3fd03788a79d056ca7bce2db25bc9d88Zack Rusinvoid renderer_begin_solid(struct xorg_renderer *r)
461e1730632aa5ca1dbb0edd484e2357246ec537abbZack Rusin{
462d2c886c8caf52c1e3581af350fd23ecf839a2491Zack Rusin   r->buffer_size = 0;
463d2c886c8caf52c1e3581af350fd23ecf839a2491Zack Rusin   r->attrs_per_vertex = 2;
464e1730632aa5ca1dbb0edd484e2357246ec537abbZack Rusin}
465e1730632aa5ca1dbb0edd484e2357246ec537abbZack Rusin
466e1730632aa5ca1dbb0edd484e2357246ec537abbZack Rusinvoid renderer_solid(struct xorg_renderer *r,
467e1730632aa5ca1dbb0edd484e2357246ec537abbZack Rusin                    int x0, int y0,
4684322346f3fd03788a79d056ca7bce2db25bc9d88Zack Rusin                    int x1, int y1,
4694322346f3fd03788a79d056ca7bce2db25bc9d88Zack Rusin                    float *color)
470e1730632aa5ca1dbb0edd484e2357246ec537abbZack Rusin{
4714322346f3fd03788a79d056ca7bce2db25bc9d88Zack Rusin   /*
4724322346f3fd03788a79d056ca7bce2db25bc9d88Zack Rusin   debug_printf("solid rect[(%d, %d), (%d, %d)], rgba[%f, %f, %f, %f]\n",
4734322346f3fd03788a79d056ca7bce2db25bc9d88Zack Rusin   x0, y0, x1, y1, color[0], color[1], color[2], color[3]);*/
4744322346f3fd03788a79d056ca7bce2db25bc9d88Zack Rusin
4754322346f3fd03788a79d056ca7bce2db25bc9d88Zack Rusin   renderer_draw_conditional(r, 4 * 8);
4764322346f3fd03788a79d056ca7bce2db25bc9d88Zack Rusin
4774322346f3fd03788a79d056ca7bce2db25bc9d88Zack Rusin   /* 1st vertex */
4784322346f3fd03788a79d056ca7bce2db25bc9d88Zack Rusin   add_vertex_color(r, x0, y0, color);
4794322346f3fd03788a79d056ca7bce2db25bc9d88Zack Rusin   /* 2nd vertex */
4804322346f3fd03788a79d056ca7bce2db25bc9d88Zack Rusin   add_vertex_color(r, x1, y0, color);
4814322346f3fd03788a79d056ca7bce2db25bc9d88Zack Rusin   /* 3rd vertex */
4824322346f3fd03788a79d056ca7bce2db25bc9d88Zack Rusin   add_vertex_color(r, x1, y1, color);
4834322346f3fd03788a79d056ca7bce2db25bc9d88Zack Rusin   /* 4th vertex */
4844322346f3fd03788a79d056ca7bce2db25bc9d88Zack Rusin   add_vertex_color(r, x0, y1, color);
485e1730632aa5ca1dbb0edd484e2357246ec537abbZack Rusin}
486e1730632aa5ca1dbb0edd484e2357246ec537abbZack Rusin
4874322346f3fd03788a79d056ca7bce2db25bc9d88Zack Rusinvoid renderer_draw_flush(struct xorg_renderer *r)
488e1730632aa5ca1dbb0edd484e2357246ec537abbZack Rusin{
4894322346f3fd03788a79d056ca7bce2db25bc9d88Zack Rusin   renderer_draw_conditional(r, 0);
490e1730632aa5ca1dbb0edd484e2357246ec537abbZack Rusin}
491e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin
492e521bf7706a5527ad5750baef78feaa961f73eccZack Rusinvoid renderer_begin_textures(struct xorg_renderer *r,
493e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin                             int num_textures)
494e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin{
495d2c886c8caf52c1e3581af350fd23ecf839a2491Zack Rusin   r->attrs_per_vertex = 1 + num_textures;
496d2c886c8caf52c1e3581af350fd23ecf839a2491Zack Rusin   r->buffer_size = 0;
497e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin}
498e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin
499e521bf7706a5527ad5750baef78feaa961f73eccZack Rusinvoid renderer_texture(struct xorg_renderer *r,
500e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin                      int *pos,
501e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin                      int width, int height,
502ac8662c29dbf96b456d23308c1bc459eea63e36cRoland Scheidegger                      struct pipe_sampler_view **sampler_view,
503e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin                      int num_textures,
504e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin                      float *src_matrix,
505e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin                      float *mask_matrix)
506e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin{
507e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin
508e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin#if 0
509e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin   if (src_matrix) {
510e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin      debug_printf("src_matrix = \n");
511e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin      debug_printf("%f, %f, %f\n", src_matrix[0], src_matrix[1], src_matrix[2]);
512e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin      debug_printf("%f, %f, %f\n", src_matrix[3], src_matrix[4], src_matrix[5]);
513e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin      debug_printf("%f, %f, %f\n", src_matrix[6], src_matrix[7], src_matrix[8]);
514e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin   }
515e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin   if (mask_matrix) {
516e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin      debug_printf("mask_matrix = \n");
517e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin      debug_printf("%f, %f, %f\n", mask_matrix[0], mask_matrix[1], mask_matrix[2]);
518e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin      debug_printf("%f, %f, %f\n", mask_matrix[3], mask_matrix[4], mask_matrix[5]);
519e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin      debug_printf("%f, %f, %f\n", mask_matrix[6], mask_matrix[7], mask_matrix[8]);
520e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin   }
521e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin#endif
522e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin
523d2c886c8caf52c1e3581af350fd23ecf839a2491Zack Rusin   switch(r->attrs_per_vertex) {
524e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin   case 2:
525e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin      renderer_draw_conditional(r, 4 * 8);
526e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin      add_vertex_data1(r,
527e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin                       pos[0], pos[1], /* src */
528e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin                       pos[4], pos[5], /* dst */
529e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin                       width, height,
530ac8662c29dbf96b456d23308c1bc459eea63e36cRoland Scheidegger                       sampler_view[0]->texture, src_matrix);
531e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin      break;
532e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin   case 3:
533e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin      renderer_draw_conditional(r, 4 * 12);
534e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin      add_vertex_data2(r,
535e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin                       pos[0], pos[1], /* src */
536e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin                       pos[2], pos[3], /* mask */
537e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin                       pos[4], pos[5], /* dst */
538e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin                       width, height,
539ac8662c29dbf96b456d23308c1bc459eea63e36cRoland Scheidegger                       sampler_view[0]->texture, sampler_view[1]->texture,
540e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin                       src_matrix, mask_matrix);
541e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin      break;
542e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin   default:
543e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin      debug_assert(!"Unsupported number of textures");
544e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin      break;
545e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin   }
546e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin}
547