xorg_renderer.c revision e521bf7706a5527ad5750baef78feaa961f73ecc
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"
10bb567357bc1366df7115e0daa68c2470e3bf6ba6Corbin Simpson#include "util/u_rect.h"
11319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin
12319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin#include "pipe/p_inlines.h"
13319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin
14a39a3cc14e816cc91a81028a27c4dbd4816cdc9dZack Rusin#include <math.h>
15a39a3cc14e816cc91a81028a27c4dbd4816cdc9dZack Rusin
16319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusinenum AxisOrientation {
17319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   Y0_BOTTOM,
18319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   Y0_TOP
19319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin};
20319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin
21a39a3cc14e816cc91a81028a27c4dbd4816cdc9dZack Rusin#define floatsEqual(x, y) (fabs(x - y) <= 0.00001f * MIN2(fabs(x), fabs(y)))
22a39a3cc14e816cc91a81028a27c4dbd4816cdc9dZack Rusin#define floatIsZero(x) (floatsEqual((x) + 1, 1))
23a39a3cc14e816cc91a81028a27c4dbd4816cdc9dZack Rusin
24a39a3cc14e816cc91a81028a27c4dbd4816cdc9dZack Rusinstatic INLINE boolean is_affine(float *matrix)
25a39a3cc14e816cc91a81028a27c4dbd4816cdc9dZack Rusin{
26a39a3cc14e816cc91a81028a27c4dbd4816cdc9dZack Rusin   return floatIsZero(matrix[2]) && floatIsZero(matrix[5])
27a39a3cc14e816cc91a81028a27c4dbd4816cdc9dZack Rusin      && floatsEqual(matrix[8], 1);
28a39a3cc14e816cc91a81028a27c4dbd4816cdc9dZack Rusin}
29a39a3cc14e816cc91a81028a27c4dbd4816cdc9dZack Rusinstatic INLINE void map_point(float *mat, float x, float y,
30a39a3cc14e816cc91a81028a27c4dbd4816cdc9dZack Rusin                             float *out_x, float *out_y)
31a39a3cc14e816cc91a81028a27c4dbd4816cdc9dZack Rusin{
32a39a3cc14e816cc91a81028a27c4dbd4816cdc9dZack Rusin   if (!mat) {
33a39a3cc14e816cc91a81028a27c4dbd4816cdc9dZack Rusin      *out_x = x;
34a39a3cc14e816cc91a81028a27c4dbd4816cdc9dZack Rusin      *out_y = y;
35a39a3cc14e816cc91a81028a27c4dbd4816cdc9dZack Rusin      return;
36a39a3cc14e816cc91a81028a27c4dbd4816cdc9dZack Rusin   }
37a39a3cc14e816cc91a81028a27c4dbd4816cdc9dZack Rusin
38a39a3cc14e816cc91a81028a27c4dbd4816cdc9dZack Rusin   *out_x = mat[0]*x + mat[3]*y + mat[6];
39a39a3cc14e816cc91a81028a27c4dbd4816cdc9dZack Rusin   *out_y = mat[1]*x + mat[4]*y + mat[7];
40a39a3cc14e816cc91a81028a27c4dbd4816cdc9dZack Rusin   if (!is_affine(mat)) {
41a39a3cc14e816cc91a81028a27c4dbd4816cdc9dZack Rusin      float w = 1/(mat[2]*x + mat[5]*y + mat[8]);
42a39a3cc14e816cc91a81028a27c4dbd4816cdc9dZack Rusin      *out_x *= w;
43a39a3cc14e816cc91a81028a27c4dbd4816cdc9dZack Rusin      *out_y *= w;
44a39a3cc14e816cc91a81028a27c4dbd4816cdc9dZack Rusin   }
45a39a3cc14e816cc91a81028a27c4dbd4816cdc9dZack Rusin}
46a39a3cc14e816cc91a81028a27c4dbd4816cdc9dZack Rusin
47e1730632aa5ca1dbb0edd484e2357246ec537abbZack Rusinstatic INLINE struct pipe_buffer *
48e1730632aa5ca1dbb0edd484e2357246ec537abbZack Rusinrenderer_buffer_create(struct xorg_renderer *r)
49e1730632aa5ca1dbb0edd484e2357246ec537abbZack Rusin{
50e1730632aa5ca1dbb0edd484e2357246ec537abbZack Rusin   struct pipe_buffer *buf =
51e1730632aa5ca1dbb0edd484e2357246ec537abbZack Rusin      pipe_user_buffer_create(r->pipe->screen,
52e1730632aa5ca1dbb0edd484e2357246ec537abbZack Rusin                              r->vertices,
53e1730632aa5ca1dbb0edd484e2357246ec537abbZack Rusin                              sizeof(float)*
54e1730632aa5ca1dbb0edd484e2357246ec537abbZack Rusin                              r->num_vertices);
55e1730632aa5ca1dbb0edd484e2357246ec537abbZack Rusin   r->num_vertices = 0;
56e1730632aa5ca1dbb0edd484e2357246ec537abbZack Rusin
57e1730632aa5ca1dbb0edd484e2357246ec537abbZack Rusin   return buf;
58e1730632aa5ca1dbb0edd484e2357246ec537abbZack Rusin}
59e1730632aa5ca1dbb0edd484e2357246ec537abbZack Rusin
604322346f3fd03788a79d056ca7bce2db25bc9d88Zack Rusinstatic INLINE void
614322346f3fd03788a79d056ca7bce2db25bc9d88Zack Rusinrenderer_draw(struct xorg_renderer *r)
624322346f3fd03788a79d056ca7bce2db25bc9d88Zack Rusin{
634322346f3fd03788a79d056ca7bce2db25bc9d88Zack Rusin   struct pipe_context *pipe = r->pipe;
644322346f3fd03788a79d056ca7bce2db25bc9d88Zack Rusin   struct pipe_buffer *buf = 0;
654322346f3fd03788a79d056ca7bce2db25bc9d88Zack Rusin
664322346f3fd03788a79d056ca7bce2db25bc9d88Zack Rusin   if (!r->num_vertices)
674322346f3fd03788a79d056ca7bce2db25bc9d88Zack Rusin      return;
684322346f3fd03788a79d056ca7bce2db25bc9d88Zack Rusin
694322346f3fd03788a79d056ca7bce2db25bc9d88Zack Rusin   buf = renderer_buffer_create(r);
704322346f3fd03788a79d056ca7bce2db25bc9d88Zack Rusin
714322346f3fd03788a79d056ca7bce2db25bc9d88Zack Rusin
724322346f3fd03788a79d056ca7bce2db25bc9d88Zack Rusin   if (buf) {
734322346f3fd03788a79d056ca7bce2db25bc9d88Zack Rusin      util_draw_vertex_buffer(pipe, buf, 0,
744322346f3fd03788a79d056ca7bce2db25bc9d88Zack Rusin                              PIPE_PRIM_QUADS,
754322346f3fd03788a79d056ca7bce2db25bc9d88Zack Rusin                              4,  /* verts */
76e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin                              r->num_attributes); /* attribs/vert */
774322346f3fd03788a79d056ca7bce2db25bc9d88Zack Rusin
784322346f3fd03788a79d056ca7bce2db25bc9d88Zack Rusin      pipe_buffer_reference(&buf, NULL);
794322346f3fd03788a79d056ca7bce2db25bc9d88Zack Rusin   }
804322346f3fd03788a79d056ca7bce2db25bc9d88Zack Rusin}
814322346f3fd03788a79d056ca7bce2db25bc9d88Zack Rusin
824322346f3fd03788a79d056ca7bce2db25bc9d88Zack Rusinstatic INLINE void
834322346f3fd03788a79d056ca7bce2db25bc9d88Zack Rusinrenderer_draw_conditional(struct xorg_renderer *r,
844322346f3fd03788a79d056ca7bce2db25bc9d88Zack Rusin                          int next_batch)
854322346f3fd03788a79d056ca7bce2db25bc9d88Zack Rusin{
864322346f3fd03788a79d056ca7bce2db25bc9d88Zack Rusin   if (r->num_vertices + next_batch >= BUF_SIZE ||
874322346f3fd03788a79d056ca7bce2db25bc9d88Zack Rusin       (next_batch == 0 && r->num_vertices))
884322346f3fd03788a79d056ca7bce2db25bc9d88Zack Rusin      renderer_draw(r);
894322346f3fd03788a79d056ca7bce2db25bc9d88Zack Rusin}
904322346f3fd03788a79d056ca7bce2db25bc9d88Zack Rusin
91319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusinstatic void
92319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusinrenderer_init_state(struct xorg_renderer *r)
93319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin{
94319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   struct pipe_depth_stencil_alpha_state dsa;
95319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin
96319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   /* set common initial clip state */
97319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   memset(&dsa, 0, sizeof(struct pipe_depth_stencil_alpha_state));
98319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   cso_set_depth_stencil_alpha(r->cso, &dsa);
99319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin}
100319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin
101319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin
102319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusinstatic INLINE void
103e1730632aa5ca1dbb0edd484e2357246ec537abbZack Rusinadd_vertex_color(struct xorg_renderer *r,
104e1730632aa5ca1dbb0edd484e2357246ec537abbZack Rusin                 float x, float y,
105e1730632aa5ca1dbb0edd484e2357246ec537abbZack Rusin                 float color[4])
106319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin{
107e1730632aa5ca1dbb0edd484e2357246ec537abbZack Rusin   float *vertex = r->vertices + r->num_vertices;
108e1730632aa5ca1dbb0edd484e2357246ec537abbZack Rusin
10925728860fcb65b53cf7212d54d39a01a3dc90a49Zack Rusin   vertex[0] = x;
11025728860fcb65b53cf7212d54d39a01a3dc90a49Zack Rusin   vertex[1] = y;
11125728860fcb65b53cf7212d54d39a01a3dc90a49Zack Rusin   vertex[2] = 0.f; /*z*/
11225728860fcb65b53cf7212d54d39a01a3dc90a49Zack Rusin   vertex[3] = 1.f; /*w*/
11325728860fcb65b53cf7212d54d39a01a3dc90a49Zack Rusin
11425728860fcb65b53cf7212d54d39a01a3dc90a49Zack Rusin   vertex[4] = color[0]; /*r*/
11525728860fcb65b53cf7212d54d39a01a3dc90a49Zack Rusin   vertex[5] = color[1]; /*g*/
11625728860fcb65b53cf7212d54d39a01a3dc90a49Zack Rusin   vertex[6] = color[2]; /*b*/
11725728860fcb65b53cf7212d54d39a01a3dc90a49Zack Rusin   vertex[7] = color[3]; /*a*/
118e1730632aa5ca1dbb0edd484e2357246ec537abbZack Rusin
119e1730632aa5ca1dbb0edd484e2357246ec537abbZack Rusin   r->num_vertices += 8;
120319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin}
121319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin
122319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusinstatic INLINE void
123e1730632aa5ca1dbb0edd484e2357246ec537abbZack Rusinadd_vertex_1tex(struct xorg_renderer *r,
124e1730632aa5ca1dbb0edd484e2357246ec537abbZack Rusin                float x, float y, float s, float t)
125319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin{
126e1730632aa5ca1dbb0edd484e2357246ec537abbZack Rusin   float *vertex = r->vertices + r->num_vertices;
127e1730632aa5ca1dbb0edd484e2357246ec537abbZack Rusin
12825728860fcb65b53cf7212d54d39a01a3dc90a49Zack Rusin   vertex[0] = x;
12925728860fcb65b53cf7212d54d39a01a3dc90a49Zack Rusin   vertex[1] = y;
13025728860fcb65b53cf7212d54d39a01a3dc90a49Zack Rusin   vertex[2] = 0.f; /*z*/
13125728860fcb65b53cf7212d54d39a01a3dc90a49Zack Rusin   vertex[3] = 1.f; /*w*/
13225728860fcb65b53cf7212d54d39a01a3dc90a49Zack Rusin
13325728860fcb65b53cf7212d54d39a01a3dc90a49Zack Rusin   vertex[4] = s;   /*s*/
13425728860fcb65b53cf7212d54d39a01a3dc90a49Zack Rusin   vertex[5] = t;   /*t*/
13525728860fcb65b53cf7212d54d39a01a3dc90a49Zack Rusin   vertex[6] = 0.f; /*r*/
13625728860fcb65b53cf7212d54d39a01a3dc90a49Zack Rusin   vertex[7] = 1.f; /*q*/
137e1730632aa5ca1dbb0edd484e2357246ec537abbZack Rusin
138e1730632aa5ca1dbb0edd484e2357246ec537abbZack Rusin   r->num_vertices += 8;
139319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin}
140319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin
141e521bf7706a5527ad5750baef78feaa961f73eccZack Rusinstatic void
142e521bf7706a5527ad5750baef78feaa961f73eccZack Rusinadd_vertex_data1(struct xorg_renderer *r,
143e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin                 float srcX, float srcY,  float dstX, float dstY,
144e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin                 float width, float height,
145e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin                 struct pipe_texture *src, float *src_matrix)
146319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin{
147bec5230a1ff3998d0f184fc2b7437b51082c329fZack Rusin   float s0, t0, s1, t1;
148bec5230a1ff3998d0f184fc2b7437b51082c329fZack Rusin   float pt0[2], pt1[2];
149319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin
150bec5230a1ff3998d0f184fc2b7437b51082c329fZack Rusin   pt0[0] = srcX;
151bec5230a1ff3998d0f184fc2b7437b51082c329fZack Rusin   pt0[1] = srcY;
152bec5230a1ff3998d0f184fc2b7437b51082c329fZack Rusin   pt1[0] = (srcX + width);
153bec5230a1ff3998d0f184fc2b7437b51082c329fZack Rusin   pt1[1] = (srcY + height);
154319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin
155a39a3cc14e816cc91a81028a27c4dbd4816cdc9dZack Rusin   if (src_matrix) {
156bec5230a1ff3998d0f184fc2b7437b51082c329fZack Rusin      map_point(src_matrix, pt0[0], pt0[1], &pt0[0], &pt0[1]);
157bec5230a1ff3998d0f184fc2b7437b51082c329fZack Rusin      map_point(src_matrix, pt1[0], pt1[1], &pt1[0], &pt1[1]);
158a39a3cc14e816cc91a81028a27c4dbd4816cdc9dZack Rusin   }
159319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin
160bec5230a1ff3998d0f184fc2b7437b51082c329fZack Rusin   s0 =  pt0[0] / src->width[0];
161bec5230a1ff3998d0f184fc2b7437b51082c329fZack Rusin   s1 =  pt1[0] / src->width[0];
162bec5230a1ff3998d0f184fc2b7437b51082c329fZack Rusin   t0 =  pt0[1] / src->height[0];
163bec5230a1ff3998d0f184fc2b7437b51082c329fZack Rusin   t1 =  pt1[1] / src->height[0];
164bec5230a1ff3998d0f184fc2b7437b51082c329fZack Rusin
165bec5230a1ff3998d0f184fc2b7437b51082c329fZack Rusin   /* 1st vertex */
166e1730632aa5ca1dbb0edd484e2357246ec537abbZack Rusin   add_vertex_1tex(r, dstX, dstY, s0, t0);
167bec5230a1ff3998d0f184fc2b7437b51082c329fZack Rusin   /* 2nd vertex */
168e1730632aa5ca1dbb0edd484e2357246ec537abbZack Rusin   add_vertex_1tex(r, dstX + width, dstY, s1, t0);
169bec5230a1ff3998d0f184fc2b7437b51082c329fZack Rusin   /* 3rd vertex */
170e1730632aa5ca1dbb0edd484e2357246ec537abbZack Rusin   add_vertex_1tex(r, dstX + width, dstY + height, s1, t1);
171bec5230a1ff3998d0f184fc2b7437b51082c329fZack Rusin   /* 4th vertex */
172e1730632aa5ca1dbb0edd484e2357246ec537abbZack Rusin   add_vertex_1tex(r, dstX, dstY + height, s0, t1);
173319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin}
174319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin
175319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusinstatic struct pipe_buffer *
176319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusinsetup_vertex_data_tex(struct xorg_renderer *r,
177319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin                      float x0, float y0, float x1, float y1,
178319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin                      float s0, float t0, float s1, float t1,
179319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin                      float z)
180319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin{
181319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   /* 1st vertex */
182e1730632aa5ca1dbb0edd484e2357246ec537abbZack Rusin   add_vertex_1tex(r, x0, y0, s0, t0);
183319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   /* 2nd vertex */
184e1730632aa5ca1dbb0edd484e2357246ec537abbZack Rusin   add_vertex_1tex(r, x1, y0, s1, t0);
185319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   /* 3rd vertex */
186e1730632aa5ca1dbb0edd484e2357246ec537abbZack Rusin   add_vertex_1tex(r, x1, y1, s1, t1);
187319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   /* 4th vertex */
188e1730632aa5ca1dbb0edd484e2357246ec537abbZack Rusin   add_vertex_1tex(r, x0, y1, s0, t1);
189319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin
190e1730632aa5ca1dbb0edd484e2357246ec537abbZack Rusin   return renderer_buffer_create(r);
191319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin}
192319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin
193319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusinstatic INLINE void
194e1730632aa5ca1dbb0edd484e2357246ec537abbZack Rusinadd_vertex_2tex(struct xorg_renderer *r,
195e1730632aa5ca1dbb0edd484e2357246ec537abbZack Rusin                float x, float y,
196e1730632aa5ca1dbb0edd484e2357246ec537abbZack Rusin                float s0, float t0, float s1, float t1)
197319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin{
198e1730632aa5ca1dbb0edd484e2357246ec537abbZack Rusin   float *vertex = r->vertices + r->num_vertices;
199e1730632aa5ca1dbb0edd484e2357246ec537abbZack Rusin
20025728860fcb65b53cf7212d54d39a01a3dc90a49Zack Rusin   vertex[0] = x;
20125728860fcb65b53cf7212d54d39a01a3dc90a49Zack Rusin   vertex[1] = y;
20225728860fcb65b53cf7212d54d39a01a3dc90a49Zack Rusin   vertex[2] = 0.f; /*z*/
20325728860fcb65b53cf7212d54d39a01a3dc90a49Zack Rusin   vertex[3] = 1.f; /*w*/
20425728860fcb65b53cf7212d54d39a01a3dc90a49Zack Rusin
20525728860fcb65b53cf7212d54d39a01a3dc90a49Zack Rusin   vertex[4] = s0;  /*s*/
20625728860fcb65b53cf7212d54d39a01a3dc90a49Zack Rusin   vertex[5] = t0;  /*t*/
20725728860fcb65b53cf7212d54d39a01a3dc90a49Zack Rusin   vertex[6] = 0.f; /*r*/
20825728860fcb65b53cf7212d54d39a01a3dc90a49Zack Rusin   vertex[7] = 1.f; /*q*/
20925728860fcb65b53cf7212d54d39a01a3dc90a49Zack Rusin
21025728860fcb65b53cf7212d54d39a01a3dc90a49Zack Rusin   vertex[8] = s1;  /*s*/
21125728860fcb65b53cf7212d54d39a01a3dc90a49Zack Rusin   vertex[9] = t1;  /*t*/
21225728860fcb65b53cf7212d54d39a01a3dc90a49Zack Rusin   vertex[10] = 0.f; /*r*/
21325728860fcb65b53cf7212d54d39a01a3dc90a49Zack Rusin   vertex[11] = 1.f; /*q*/
214e1730632aa5ca1dbb0edd484e2357246ec537abbZack Rusin
215e1730632aa5ca1dbb0edd484e2357246ec537abbZack Rusin   r->num_vertices += 12;
216319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin}
217319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin
218e521bf7706a5527ad5750baef78feaa961f73eccZack Rusinstatic void
219e521bf7706a5527ad5750baef78feaa961f73eccZack Rusinadd_vertex_data2(struct xorg_renderer *r,
220e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin                 float srcX, float srcY, float maskX, float maskY,
221e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin                 float dstX, float dstY, float width, float height,
222e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin                 struct pipe_texture *src,
223e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin                 struct pipe_texture *mask,
224e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin                 float *src_matrix, float *mask_matrix)
225319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin{
226bec5230a1ff3998d0f184fc2b7437b51082c329fZack Rusin   float src_s0, src_t0, src_s1, src_t1;
227bec5230a1ff3998d0f184fc2b7437b51082c329fZack Rusin   float mask_s0, mask_t0, mask_s1, mask_t1;
228bec5230a1ff3998d0f184fc2b7437b51082c329fZack Rusin   float spt0[2], spt1[2];
229bec5230a1ff3998d0f184fc2b7437b51082c329fZack Rusin   float mpt0[2], mpt1[2];
230bec5230a1ff3998d0f184fc2b7437b51082c329fZack Rusin
231bec5230a1ff3998d0f184fc2b7437b51082c329fZack Rusin   spt0[0] = srcX;
232bec5230a1ff3998d0f184fc2b7437b51082c329fZack Rusin   spt0[1] = srcY;
233bec5230a1ff3998d0f184fc2b7437b51082c329fZack Rusin   spt1[0] = srcX + width;
234bec5230a1ff3998d0f184fc2b7437b51082c329fZack Rusin   spt1[1] = srcY + height;
235bec5230a1ff3998d0f184fc2b7437b51082c329fZack Rusin
236bec5230a1ff3998d0f184fc2b7437b51082c329fZack Rusin   mpt0[0] = maskX;
237bec5230a1ff3998d0f184fc2b7437b51082c329fZack Rusin   mpt0[1] = maskY;
238bec5230a1ff3998d0f184fc2b7437b51082c329fZack Rusin   mpt1[0] = maskX + width;
239bec5230a1ff3998d0f184fc2b7437b51082c329fZack Rusin   mpt1[1] = maskY + height;
240bec5230a1ff3998d0f184fc2b7437b51082c329fZack Rusin
241bec5230a1ff3998d0f184fc2b7437b51082c329fZack Rusin   if (src_matrix) {
242bec5230a1ff3998d0f184fc2b7437b51082c329fZack Rusin      map_point(src_matrix, spt0[0], spt0[1], &spt0[0], &spt0[1]);
243bec5230a1ff3998d0f184fc2b7437b51082c329fZack Rusin      map_point(src_matrix, spt1[0], spt1[1], &spt1[0], &spt1[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]);
249a39a3cc14e816cc91a81028a27c4dbd4816cdc9dZack Rusin   }
250319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin
251bec5230a1ff3998d0f184fc2b7437b51082c329fZack Rusin   src_s0 = spt0[0] / src->width[0];
252bec5230a1ff3998d0f184fc2b7437b51082c329fZack Rusin   src_t0 = spt0[1] / src->height[0];
253bec5230a1ff3998d0f184fc2b7437b51082c329fZack Rusin   src_s1 = spt1[0] / src->width[0];
254bec5230a1ff3998d0f184fc2b7437b51082c329fZack Rusin   src_t1 = spt1[1] / src->height[0];
255bec5230a1ff3998d0f184fc2b7437b51082c329fZack Rusin
256bec5230a1ff3998d0f184fc2b7437b51082c329fZack Rusin   mask_s0 = mpt0[0] / mask->width[0];
257bec5230a1ff3998d0f184fc2b7437b51082c329fZack Rusin   mask_t0 = mpt0[1] / mask->height[0];
258bec5230a1ff3998d0f184fc2b7437b51082c329fZack Rusin   mask_s1 = mpt1[0] / mask->width[0];
259bec5230a1ff3998d0f184fc2b7437b51082c329fZack Rusin   mask_t1 = mpt1[1] / mask->height[0];
260bec5230a1ff3998d0f184fc2b7437b51082c329fZack Rusin
261bec5230a1ff3998d0f184fc2b7437b51082c329fZack Rusin   /* 1st vertex */
262e1730632aa5ca1dbb0edd484e2357246ec537abbZack Rusin   add_vertex_2tex(r, dstX, dstY,
263e1730632aa5ca1dbb0edd484e2357246ec537abbZack Rusin                   src_s0, src_t0, mask_s0, mask_t0);
264bec5230a1ff3998d0f184fc2b7437b51082c329fZack Rusin   /* 2nd vertex */
265e1730632aa5ca1dbb0edd484e2357246ec537abbZack Rusin   add_vertex_2tex(r, dstX + width, dstY,
266e1730632aa5ca1dbb0edd484e2357246ec537abbZack Rusin                   src_s1, src_t0, mask_s1, mask_t0);
267bec5230a1ff3998d0f184fc2b7437b51082c329fZack Rusin   /* 3rd vertex */
268e1730632aa5ca1dbb0edd484e2357246ec537abbZack Rusin   add_vertex_2tex(r, dstX + width, dstY + height,
269e1730632aa5ca1dbb0edd484e2357246ec537abbZack Rusin                   src_s1, src_t1, mask_s1, mask_t1);
270bec5230a1ff3998d0f184fc2b7437b51082c329fZack Rusin   /* 4th vertex */
271e1730632aa5ca1dbb0edd484e2357246ec537abbZack Rusin   add_vertex_2tex(r, dstX, dstY + height,
272e1730632aa5ca1dbb0edd484e2357246ec537abbZack Rusin                   src_s0, src_t1, mask_s0, mask_t1);
273319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin}
274319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin
275a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusinstatic struct pipe_buffer *
276a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusinsetup_vertex_data_yuv(struct xorg_renderer *r,
277a7fa56a64b8963e74e93f3bac8ac80813f4a9778Zack Rusin                      float srcX, float srcY, float srcW, float srcH,
278a7fa56a64b8963e74e93f3bac8ac80813f4a9778Zack Rusin                      float dstX, float dstY, float dstW, float dstH,
279a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin                      struct pipe_texture **tex)
280a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin{
281a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin   float s0, t0, s1, t1;
282a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin   float spt0[2], spt1[2];
283a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin
284a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin   spt0[0] = srcX;
285a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin   spt0[1] = srcY;
286a7fa56a64b8963e74e93f3bac8ac80813f4a9778Zack Rusin   spt1[0] = srcX + srcW;
287a7fa56a64b8963e74e93f3bac8ac80813f4a9778Zack Rusin   spt1[1] = srcY + srcH;
288a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin
289a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin   s0 = spt0[0] / tex[0]->width[0];
290a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin   t0 = spt0[1] / tex[0]->height[0];
291a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin   s1 = spt1[0] / tex[0]->width[0];
292a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin   t1 = spt1[1] / tex[0]->height[0];
293a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin
294a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin   /* 1st vertex */
295e1730632aa5ca1dbb0edd484e2357246ec537abbZack Rusin   add_vertex_1tex(r, dstX, dstY, s0, t0);
296a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin   /* 2nd vertex */
297e1730632aa5ca1dbb0edd484e2357246ec537abbZack Rusin   add_vertex_1tex(r, dstX + dstW, dstY,
298e1730632aa5ca1dbb0edd484e2357246ec537abbZack Rusin                   s1, t0);
299a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin   /* 3rd vertex */
300e1730632aa5ca1dbb0edd484e2357246ec537abbZack Rusin   add_vertex_1tex(r, dstX + dstW, dstY + dstH,
301e1730632aa5ca1dbb0edd484e2357246ec537abbZack Rusin                   s1, t1);
302a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin   /* 4th vertex */
303e1730632aa5ca1dbb0edd484e2357246ec537abbZack Rusin   add_vertex_1tex(r, dstX, dstY + dstH,
304e1730632aa5ca1dbb0edd484e2357246ec537abbZack Rusin                   s0, t1);
305a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin
306e1730632aa5ca1dbb0edd484e2357246ec537abbZack Rusin   return renderer_buffer_create(r);
307a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin}
308a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin
309319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin
310319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin
311319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusinstatic void
312319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusinset_viewport(struct xorg_renderer *r, int width, int height,
313319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin             enum AxisOrientation orientation)
314319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin{
315319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   struct pipe_viewport_state viewport;
316319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   float y_scale = (orientation == Y0_BOTTOM) ? -2.f : 2.f;
317319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin
318319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   viewport.scale[0] =  width / 2.f;
319319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   viewport.scale[1] =  height / y_scale;
320319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   viewport.scale[2] =  1.0;
321319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   viewport.scale[3] =  1.0;
322319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   viewport.translate[0] = width / 2.f;
323319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   viewport.translate[1] = height / 2.f;
324319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   viewport.translate[2] = 0.0;
325319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   viewport.translate[3] = 0.0;
326319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin
327319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   cso_set_viewport(r->cso, &viewport);
328319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin}
329319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin
330319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin
331319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin
332319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusinstruct xorg_renderer * renderer_create(struct pipe_context *pipe)
333319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin{
334319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   struct xorg_renderer *renderer = CALLOC_STRUCT(xorg_renderer);
335319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin
336150d4968e31e4600f9479c53f83d810b92b59cf7Zack Rusin   renderer->pipe = pipe;
337319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   renderer->cso = cso_create_context(pipe);
338319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   renderer->shaders = xorg_shaders_create(renderer);
339319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin
340319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   renderer_init_state(renderer);
341319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin
342319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   return renderer;
343319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin}
344319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin
345319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusinvoid renderer_destroy(struct xorg_renderer *r)
346319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin{
347319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   struct pipe_constant_buffer *vsbuf = &r->vs_const_buffer;
348319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   struct pipe_constant_buffer *fsbuf = &r->fs_const_buffer;
349319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin
350319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   if (vsbuf && vsbuf->buffer)
351319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin      pipe_buffer_reference(&vsbuf->buffer, NULL);
352319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin
353319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   if (fsbuf && fsbuf->buffer)
354319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin      pipe_buffer_reference(&fsbuf->buffer, NULL);
355319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin
356a9f71b3bba86771be56ff1def716beb370decd22Jakob Bornecrantz   if (r->shaders) {
357a9f71b3bba86771be56ff1def716beb370decd22Jakob Bornecrantz      xorg_shaders_destroy(r->shaders);
358a9f71b3bba86771be56ff1def716beb370decd22Jakob Bornecrantz      r->shaders = NULL;
359a9f71b3bba86771be56ff1def716beb370decd22Jakob Bornecrantz   }
360a9f71b3bba86771be56ff1def716beb370decd22Jakob Bornecrantz
361319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   if (r->cso) {
362319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin      cso_release_all(r->cso);
363319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin      cso_destroy_context(r->cso);
364a9f71b3bba86771be56ff1def716beb370decd22Jakob Bornecrantz      r->cso = NULL;
365319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   }
366319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin}
367319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin
368319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusinvoid renderer_bind_framebuffer(struct xorg_renderer *r,
369319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin                               struct exa_pixmap_priv *priv)
370319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin{
371319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   unsigned i;
372319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   struct pipe_framebuffer_state state;
373319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   struct pipe_surface *surface = xorg_gpu_surface(r->pipe->screen, priv);
374319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   memset(&state, 0, sizeof(struct pipe_framebuffer_state));
375319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin
376319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   state.width  = priv->tex->width[0];
377319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   state.height = priv->tex->height[0];
378319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin
379319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   state.nr_cbufs = 1;
380319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   state.cbufs[0] = surface;
381319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   for (i = 1; i < PIPE_MAX_COLOR_BUFS; ++i)
382319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin      state.cbufs[i] = 0;
383319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin
384319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   /* currently we don't use depth/stencil */
385319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   state.zsbuf = 0;
386319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin
387319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   cso_set_framebuffer(r->cso, &state);
388319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin
389319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   /* we do fire and forget for the framebuffer, this is the forget part */
390319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   pipe_surface_reference(&surface, NULL);
391319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin}
392319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin
393319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusinvoid renderer_bind_viewport(struct xorg_renderer *r,
394319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin                            struct exa_pixmap_priv *dst)
395319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin{
396319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   int width = dst->tex->width[0];
397319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   int height = dst->tex->height[0];
398319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin
399319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   /*debug_printf("Bind viewport (%d, %d)\n", width, height);*/
400319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin
401319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   set_viewport(r, width, height, Y0_TOP);
402319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin}
403319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin
404319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusinvoid renderer_bind_rasterizer(struct xorg_renderer *r)
405319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin{
406319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   struct pipe_rasterizer_state raster;
407319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin
408319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   /* XXX: move to renderer_init_state? */
409319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   memset(&raster, 0, sizeof(struct pipe_rasterizer_state));
410319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   raster.gl_rasterization_rules = 1;
411319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   cso_set_rasterizer(r->cso, &raster);
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{
419319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   struct pipe_constant_buffer *cbuf =
420319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin      (shader_type == PIPE_SHADER_VERTEX) ? &r->vs_const_buffer :
421319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin      &r->fs_const_buffer;
422319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin
423319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   pipe_buffer_reference(&cbuf->buffer, NULL);
424319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   cbuf->buffer = pipe_buffer_create(r->pipe->screen, 16,
425319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin                                     PIPE_BUFFER_USAGE_CONSTANT,
426319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin                                     param_bytes);
427319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin
428319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   if (cbuf->buffer) {
429319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin      pipe_buffer_write(r->pipe->screen, cbuf->buffer,
430319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin                        0, param_bytes, params);
431319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   }
432319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   r->pipe->set_constant_buffer(r->pipe, shader_type, 0, cbuf);
433319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin}
434319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin
435319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusinstatic void
436319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusinsetup_vs_constant_buffer(struct xorg_renderer *r,
437319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin                         int width, int height)
438319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin{
439319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   const int param_bytes = 8 * sizeof(float);
440319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   float vs_consts[8] = {
441319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin      2.f/width, 2.f/height, 1, 1,
442319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin      -1, -1, 0, 0
443319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   };
444319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   renderer_set_constants(r, PIPE_SHADER_VERTEX,
445319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin                          vs_consts, param_bytes);
446319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin}
447319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin
448319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusinstatic void
449319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusinsetup_fs_constant_buffer(struct xorg_renderer *r)
450319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin{
451319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   const int param_bytes = 4 * sizeof(float);
452319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   const float fs_consts[8] = {
453319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin      0, 0, 0, 1,
454319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   };
455319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   renderer_set_constants(r, PIPE_SHADER_FRAGMENT,
456319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin                          fs_consts, param_bytes);
457319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin}
458319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin
459319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusinstatic INLINE void shift_rectx(float coords[4],
460319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin                               const float *bounds,
461319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin                               const float shift)
462319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin{
463319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   coords[0] += shift;
464319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   coords[2] -= shift;
465319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   if (bounds) {
466319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin      coords[2] = MIN2(coords[2], bounds[2]);
467319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin      /* bound x/y + width/height */
468319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin      if ((coords[0] + coords[2]) > (bounds[0] + bounds[2])) {
469319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin         coords[2] = (bounds[0] + bounds[2]) - coords[0];
470319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin      }
471319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   }
472319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin}
473319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin
474319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusinstatic INLINE void shift_recty(float coords[4],
475319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin                               const float *bounds,
476319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin                               const float shift)
477319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin{
478319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   coords[1] += shift;
479319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   coords[3] -= shift;
480319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   if (bounds) {
481319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin      coords[3] = MIN2(coords[3], bounds[3]);
482319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin      if ((coords[1] + coords[3]) > (bounds[1] + bounds[3])) {
483319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin         coords[3] = (bounds[1] + bounds[3]) - coords[1];
484319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin      }
485319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   }
486319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin}
487319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin
488319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusinstatic INLINE void bound_rect(float coords[4],
489319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin                              const float bounds[4],
490319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin                              float shift[4])
491319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin{
492319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   /* if outside the bounds */
493319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   if (coords[0] > (bounds[0] + bounds[2]) ||
494319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin       coords[1] > (bounds[1] + bounds[3]) ||
495319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin       (coords[0] + coords[2]) < bounds[0] ||
496319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin       (coords[1] + coords[3]) < bounds[1]) {
497319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin      coords[0] = 0.f;
498319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin      coords[1] = 0.f;
499319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin      coords[2] = 0.f;
500319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin      coords[3] = 0.f;
501319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin      shift[0] = 0.f;
502319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin      shift[1] = 0.f;
503319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin      return;
504319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   }
505319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin
506319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   /* bound x */
507319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   if (coords[0] < bounds[0]) {
508319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin      shift[0] = bounds[0] - coords[0];
509319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin      coords[2] -= shift[0];
510319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin      coords[0] = bounds[0];
511319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   } else
512319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin      shift[0] = 0.f;
513319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin
514319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   /* bound y */
515319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   if (coords[1] < bounds[1]) {
516319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin      shift[1] = bounds[1] - coords[1];
517319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin      coords[3] -= shift[1];
518319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin      coords[1] = bounds[1];
519319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   } else
520319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin      shift[1] = 0.f;
521319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin
522319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   shift[2] = bounds[2] - coords[2];
523319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   shift[3] = bounds[3] - coords[3];
524319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   /* bound width/height */
525319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   coords[2] = MIN2(coords[2], bounds[2]);
526319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   coords[3] = MIN2(coords[3], bounds[3]);
527319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin
528319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   /* bound x/y + width/height */
529319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   if ((coords[0] + coords[2]) > (bounds[0] + bounds[2])) {
530319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin      coords[2] = (bounds[0] + bounds[2]) - coords[0];
531319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   }
532319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   if ((coords[1] + coords[3]) > (bounds[1] + bounds[3])) {
533319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin      coords[3] = (bounds[1] + bounds[3]) - coords[1];
534319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   }
535319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin
536319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   /* if outside the bounds */
537319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   if ((coords[0] + coords[2]) < bounds[0] ||
538319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin       (coords[1] + coords[3]) < bounds[1]) {
539319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin      coords[0] = 0.f;
540319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin      coords[1] = 0.f;
541319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin      coords[2] = 0.f;
542319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin      coords[3] = 0.f;
543319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin      return;
544319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   }
545319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin}
546319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin
547319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusinstatic INLINE void sync_size(float *src_loc, float *dst_loc)
548319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin{
549319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   src_loc[2] = MIN2(src_loc[2], dst_loc[2]);
550319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   src_loc[3] = MIN2(src_loc[3], dst_loc[3]);
551319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   dst_loc[2] = src_loc[2];
552319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   dst_loc[3] = src_loc[3];
553319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin}
554319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin
555319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusinstatic void renderer_copy_texture(struct xorg_renderer *r,
556319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin                                  struct pipe_texture *src,
557319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin                                  float sx1, float sy1,
558319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin                                  float sx2, float sy2,
559319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin                                  struct pipe_texture *dst,
560319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin                                  float dx1, float dy1,
561319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin                                  float dx2, float dy2)
562319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin{
563319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   struct pipe_context *pipe = r->pipe;
564319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   struct pipe_screen *screen = pipe->screen;
565319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   struct pipe_buffer *buf;
566319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   struct pipe_surface *dst_surf = screen->get_tex_surface(
567319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin      screen, dst, 0, 0, 0,
568319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin      PIPE_BUFFER_USAGE_GPU_WRITE);
569319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   struct pipe_framebuffer_state fb;
570319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   float s0, t0, s1, t1;
571319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   struct xorg_shader shader;
572319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin
573319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   assert(src->width[0] != 0);
574319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   assert(src->height[0] != 0);
575319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   assert(dst->width[0] != 0);
576319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   assert(dst->height[0] != 0);
577319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin
578319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin#if 1
579319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   s0 = sx1 / src->width[0];
580319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   s1 = sx2 / src->width[0];
581319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   t0 = sy1 / src->height[0];
582319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   t1 = sy2 / src->height[0];
583319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin#else
584319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   s0 = 0;
585319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   s1 = 1;
586319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   t0 = 0;
587319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   t1 = 1;
588319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin#endif
589319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin
590319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin#if 0
591319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   debug_printf("copy texture src=[%f, %f, %f, %f], dst=[%f, %f, %f, %f], tex=[%f, %f, %f, %f]\n",
592319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin                sx1, sy1, sx2, sy2, dx1, dy1, dx2, dy2,
593319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin                s0, t0, s1, t1);
594319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin#endif
595319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin
596319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   assert(screen->is_format_supported(screen, dst_surf->format,
597319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin                                      PIPE_TEXTURE_2D,
598319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin                                      PIPE_TEXTURE_USAGE_RENDER_TARGET,
599319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin                                      0));
600319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin
601319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   /* save state (restored below) */
602319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   cso_save_blend(r->cso);
603319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   cso_save_samplers(r->cso);
604319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   cso_save_sampler_textures(r->cso);
605319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   cso_save_framebuffer(r->cso);
606319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   cso_save_fragment_shader(r->cso);
607319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   cso_save_vertex_shader(r->cso);
608319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin
609319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   cso_save_viewport(r->cso);
610319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin
611319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin
612319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   /* set misc state we care about */
613319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   {
614319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin      struct pipe_blend_state blend;
615319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin      memset(&blend, 0, sizeof(blend));
616319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin      blend.rgb_src_factor = PIPE_BLENDFACTOR_ONE;
617319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin      blend.alpha_src_factor = PIPE_BLENDFACTOR_ONE;
618319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin      blend.rgb_dst_factor = PIPE_BLENDFACTOR_ZERO;
619319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin      blend.alpha_dst_factor = PIPE_BLENDFACTOR_ZERO;
620319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin      blend.colormask = PIPE_MASK_RGBA;
621319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin      cso_set_blend(r->cso, &blend);
622319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   }
623319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin
624319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   /* sampler */
625319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   {
626319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin      struct pipe_sampler_state sampler;
627319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin      memset(&sampler, 0, sizeof(sampler));
628319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin      sampler.wrap_s = PIPE_TEX_WRAP_CLAMP_TO_EDGE;
629319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin      sampler.wrap_t = PIPE_TEX_WRAP_CLAMP_TO_EDGE;
630319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin      sampler.wrap_r = PIPE_TEX_WRAP_CLAMP_TO_EDGE;
631319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin      sampler.min_mip_filter = PIPE_TEX_MIPFILTER_NONE;
632319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin      sampler.min_img_filter = PIPE_TEX_FILTER_NEAREST;
633319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin      sampler.mag_img_filter = PIPE_TEX_FILTER_NEAREST;
634319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin      sampler.normalized_coords = 1;
635319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin      cso_single_sampler(r->cso, 0, &sampler);
636319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin      cso_single_sampler_done(r->cso);
637319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   }
638319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin
639319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   set_viewport(r, dst_surf->width, dst_surf->height, Y0_TOP);
640319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin
641319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   /* texture */
642319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   cso_set_sampler_textures(r->cso, 1, &src);
643319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin
644319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   renderer_bind_rasterizer(r);
645319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin
646319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   /* shaders */
647319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   shader = xorg_shaders_get(r->shaders,
648319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin                             VS_COMPOSITE,
649319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin                             FS_COMPOSITE);
650319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   cso_set_vertex_shader_handle(r->cso, shader.vs);
651319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   cso_set_fragment_shader_handle(r->cso, shader.fs);
652319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin
653319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   /* drawing dest */
654319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   memset(&fb, 0, sizeof(fb));
655319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   fb.width = dst_surf->width;
656319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   fb.height = dst_surf->height;
657319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   fb.nr_cbufs = 1;
658319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   fb.cbufs[0] = dst_surf;
659319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   {
660319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin      int i;
661319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin      for (i = 1; i < PIPE_MAX_COLOR_BUFS; ++i)
662319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin         fb.cbufs[i] = 0;
663319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   }
664319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   cso_set_framebuffer(r->cso, &fb);
665319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   setup_vs_constant_buffer(r, fb.width, fb.height);
666319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   setup_fs_constant_buffer(r);
667319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin
668319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   /* draw quad */
669319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   buf = setup_vertex_data_tex(r,
670319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin                               dx1, dy1,
671319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin                               dx2, dy2,
672319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin                               s0, t0, s1, t1,
673319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin                               0.0f);
674319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin
675319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   if (buf) {
676319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin      util_draw_vertex_buffer(r->pipe, buf, 0,
6773f7df23ff50fc7cd86db9a27c11cca9c10bd63ebZack Rusin                              PIPE_PRIM_QUADS,
678319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin                              4,  /* verts */
679319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin                              2); /* attribs/vert */
680319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin
681319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin      pipe_buffer_reference(&buf, NULL);
682319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   }
683319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin
684319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   /* restore state we changed */
685319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   cso_restore_blend(r->cso);
686319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   cso_restore_samplers(r->cso);
687319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   cso_restore_sampler_textures(r->cso);
688319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   cso_restore_framebuffer(r->cso);
689319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   cso_restore_vertex_shader(r->cso);
690319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   cso_restore_fragment_shader(r->cso);
691319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   cso_restore_viewport(r->cso);
692319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin
693319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   pipe_surface_reference(&dst_surf, NULL);
694319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin}
695319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin
696319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusinstatic struct pipe_texture *
697319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusincreate_sampler_texture(struct xorg_renderer *r,
698319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin                       struct pipe_texture *src)
699319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin{
700319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   enum pipe_format format;
701319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   struct pipe_context *pipe = r->pipe;
702319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   struct pipe_screen *screen = pipe->screen;
703319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   struct pipe_texture *pt;
704319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   struct pipe_texture templ;
705319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin
706319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   pipe->flush(pipe, PIPE_FLUSH_RENDER_CACHE, NULL);
707319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin
708319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   /* the coming in texture should already have that invariance */
709319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   debug_assert(screen->is_format_supported(screen, src->format,
710319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin                                            PIPE_TEXTURE_2D,
711319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin                                            PIPE_TEXTURE_USAGE_SAMPLER, 0));
712319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin
713319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   format = src->format;
714319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin
715319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   memset(&templ, 0, sizeof(templ));
716319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   templ.target = PIPE_TEXTURE_2D;
717319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   templ.format = format;
718319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   templ.last_level = 0;
719319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   templ.width[0] = src->width[0];
720319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   templ.height[0] = src->height[0];
721319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   templ.depth[0] = 1;
722319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   pf_get_block(format, &templ.block);
723319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   templ.tex_usage = PIPE_TEXTURE_USAGE_SAMPLER;
724319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin
725319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   pt = screen->texture_create(screen, &templ);
726319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin
727319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   debug_assert(!pt || pipe_is_referenced(&pt->reference));
728319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin
729319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   if (!pt)
730319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin      return NULL;
731319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin
732319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   {
733319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin      /* copy source framebuffer surface into texture */
734319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin      struct pipe_surface *ps_read = screen->get_tex_surface(
735319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin         screen, src, 0, 0, 0, PIPE_BUFFER_USAGE_GPU_READ);
736319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin      struct pipe_surface *ps_tex = screen->get_tex_surface(
737319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin         screen, pt, 0, 0, 0, PIPE_BUFFER_USAGE_GPU_WRITE );
738bb567357bc1366df7115e0daa68c2470e3bf6ba6Corbin Simpson      if (pipe->surface_copy) {
739bb567357bc1366df7115e0daa68c2470e3bf6ba6Corbin Simpson         pipe->surface_copy(pipe,
740bb567357bc1366df7115e0daa68c2470e3bf6ba6Corbin Simpson                ps_tex, /* dest */
741bb567357bc1366df7115e0daa68c2470e3bf6ba6Corbin Simpson                0, 0, /* destx/y */
742bb567357bc1366df7115e0daa68c2470e3bf6ba6Corbin Simpson                ps_read,
743bb567357bc1366df7115e0daa68c2470e3bf6ba6Corbin Simpson                0, 0, src->width[0], src->height[0]);
744bb567357bc1366df7115e0daa68c2470e3bf6ba6Corbin Simpson      } else {
745bb567357bc1366df7115e0daa68c2470e3bf6ba6Corbin Simpson          util_surface_copy(pipe, FALSE,
746bb567357bc1366df7115e0daa68c2470e3bf6ba6Corbin Simpson                ps_tex, /* dest */
747bb567357bc1366df7115e0daa68c2470e3bf6ba6Corbin Simpson                0, 0, /* destx/y */
748bb567357bc1366df7115e0daa68c2470e3bf6ba6Corbin Simpson                ps_read,
749bb567357bc1366df7115e0daa68c2470e3bf6ba6Corbin Simpson                0, 0, src->width[0], src->height[0]);
750bb567357bc1366df7115e0daa68c2470e3bf6ba6Corbin Simpson      }
751319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin      pipe_surface_reference(&ps_read, NULL);
752319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin      pipe_surface_reference(&ps_tex, NULL);
753319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   }
754319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin
755319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   return pt;
756319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin}
757319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin
758319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin
759319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusinvoid renderer_copy_pixmap(struct xorg_renderer *r,
760319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin                          struct exa_pixmap_priv *dst_priv, int dx, int dy,
761319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin                          struct exa_pixmap_priv *src_priv, int sx, int sy,
762319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin                          int width, int height)
763319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin{
764319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   float dst_loc[4], src_loc[4];
765319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   float dst_bounds[4], src_bounds[4];
766319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   float src_shift[4], dst_shift[4], shift[4];
767319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   struct pipe_texture *dst = dst_priv->tex;
768319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   struct pipe_texture *src = src_priv->tex;
769319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin
770319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   if (r->pipe->is_texture_referenced(r->pipe, src, 0, 0) &
771319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin       PIPE_REFERENCED_FOR_WRITE)
772319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin      r->pipe->flush(r->pipe, PIPE_FLUSH_RENDER_CACHE, NULL);
773319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin
774319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   dst_loc[0] = dx;
775319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   dst_loc[1] = dy;
776319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   dst_loc[2] = width;
777319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   dst_loc[3] = height;
778319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   dst_bounds[0] = 0.f;
779319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   dst_bounds[1] = 0.f;
780319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   dst_bounds[2] = dst->width[0];
781319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   dst_bounds[3] = dst->height[0];
782319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin
783319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   src_loc[0] = sx;
784319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   src_loc[1] = sy;
785319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   src_loc[2] = width;
786319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   src_loc[3] = height;
787319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   src_bounds[0] = 0.f;
788319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   src_bounds[1] = 0.f;
789319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   src_bounds[2] = src->width[0];
790319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   src_bounds[3] = src->height[0];
791319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin
792319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   bound_rect(src_loc, src_bounds, src_shift);
793319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   bound_rect(dst_loc, dst_bounds, dst_shift);
794319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   shift[0] = src_shift[0] - dst_shift[0];
795319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   shift[1] = src_shift[1] - dst_shift[1];
796319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin
797319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   if (shift[0] < 0)
798319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin      shift_rectx(src_loc, src_bounds, -shift[0]);
799319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   else
800319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin      shift_rectx(dst_loc, dst_bounds, shift[0]);
801319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin
802319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   if (shift[1] < 0)
803319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin      shift_recty(src_loc, src_bounds, -shift[1]);
804319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   else
805319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin      shift_recty(dst_loc, dst_bounds, shift[1]);
806319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin
807319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   sync_size(src_loc, dst_loc);
808319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin
809319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   if (src_loc[2] >= 0 && src_loc[3] >= 0 &&
810319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin       dst_loc[2] >= 0 && dst_loc[3] >= 0) {
811319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin      struct pipe_texture *temp_src = src;
812319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin
813319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin      if (src == dst)
814319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin         temp_src = create_sampler_texture(r, src);
815319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin
816319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin      renderer_copy_texture(r,
817319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin                            temp_src,
818319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin                            src_loc[0],
819319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin                            src_loc[1],
820319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin                            src_loc[0] + src_loc[2],
821319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin                            src_loc[1] + src_loc[3],
822319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin                            dst,
823319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin                            dst_loc[0],
824319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin                            dst_loc[1],
825319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin                            dst_loc[0] + dst_loc[2],
826319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin                            dst_loc[1] + dst_loc[3]);
827319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin
828319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin      if (src == dst)
829319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin         pipe_texture_reference(&temp_src, NULL);
830319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   }
831319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin}
832319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin
833a7fa56a64b8963e74e93f3bac8ac80813f4a9778Zack Rusinvoid renderer_draw_yuv(struct xorg_renderer *r,
834a7fa56a64b8963e74e93f3bac8ac80813f4a9778Zack Rusin                       int src_x, int src_y, int src_w, int src_h,
835a7fa56a64b8963e74e93f3bac8ac80813f4a9778Zack Rusin                       int dst_x, int dst_y, int dst_w, int dst_h,
836a7fa56a64b8963e74e93f3bac8ac80813f4a9778Zack Rusin                       struct pipe_texture **textures)
837a7fa56a64b8963e74e93f3bac8ac80813f4a9778Zack Rusin{
838a7fa56a64b8963e74e93f3bac8ac80813f4a9778Zack Rusin   struct pipe_context *pipe = r->pipe;
839a7fa56a64b8963e74e93f3bac8ac80813f4a9778Zack Rusin   struct pipe_buffer *buf = 0;
840a7fa56a64b8963e74e93f3bac8ac80813f4a9778Zack Rusin
841a7fa56a64b8963e74e93f3bac8ac80813f4a9778Zack Rusin   buf = setup_vertex_data_yuv(r,
842a7fa56a64b8963e74e93f3bac8ac80813f4a9778Zack Rusin                               src_x, src_y, src_w, src_h,
843a7fa56a64b8963e74e93f3bac8ac80813f4a9778Zack Rusin                               dst_x, dst_y, dst_w, dst_h,
844a7fa56a64b8963e74e93f3bac8ac80813f4a9778Zack Rusin                               textures);
845a7fa56a64b8963e74e93f3bac8ac80813f4a9778Zack Rusin
846a7fa56a64b8963e74e93f3bac8ac80813f4a9778Zack Rusin   if (buf) {
847a7fa56a64b8963e74e93f3bac8ac80813f4a9778Zack Rusin      const int num_attribs = 2; /*pos + tex coord*/
848a7fa56a64b8963e74e93f3bac8ac80813f4a9778Zack Rusin
849a7fa56a64b8963e74e93f3bac8ac80813f4a9778Zack Rusin      util_draw_vertex_buffer(pipe, buf, 0,
8503f7df23ff50fc7cd86db9a27c11cca9c10bd63ebZack Rusin                              PIPE_PRIM_QUADS,
851a7fa56a64b8963e74e93f3bac8ac80813f4a9778Zack Rusin                              4,  /* verts */
852a7fa56a64b8963e74e93f3bac8ac80813f4a9778Zack Rusin                              num_attribs); /* attribs/vert */
853a7fa56a64b8963e74e93f3bac8ac80813f4a9778Zack Rusin
854a7fa56a64b8963e74e93f3bac8ac80813f4a9778Zack Rusin      pipe_buffer_reference(&buf, NULL);
855a7fa56a64b8963e74e93f3bac8ac80813f4a9778Zack Rusin   }
856a7fa56a64b8963e74e93f3bac8ac80813f4a9778Zack Rusin}
857e1730632aa5ca1dbb0edd484e2357246ec537abbZack Rusin
8584322346f3fd03788a79d056ca7bce2db25bc9d88Zack Rusinvoid renderer_begin_solid(struct xorg_renderer *r)
859e1730632aa5ca1dbb0edd484e2357246ec537abbZack Rusin{
8604322346f3fd03788a79d056ca7bce2db25bc9d88Zack Rusin   r->num_vertices = 0;
861e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin   r->num_attributes = 2;
862e1730632aa5ca1dbb0edd484e2357246ec537abbZack Rusin}
863e1730632aa5ca1dbb0edd484e2357246ec537abbZack Rusin
864e1730632aa5ca1dbb0edd484e2357246ec537abbZack Rusinvoid renderer_solid(struct xorg_renderer *r,
865e1730632aa5ca1dbb0edd484e2357246ec537abbZack Rusin                    int x0, int y0,
8664322346f3fd03788a79d056ca7bce2db25bc9d88Zack Rusin                    int x1, int y1,
8674322346f3fd03788a79d056ca7bce2db25bc9d88Zack Rusin                    float *color)
868e1730632aa5ca1dbb0edd484e2357246ec537abbZack Rusin{
8694322346f3fd03788a79d056ca7bce2db25bc9d88Zack Rusin   /*
8704322346f3fd03788a79d056ca7bce2db25bc9d88Zack Rusin   debug_printf("solid rect[(%d, %d), (%d, %d)], rgba[%f, %f, %f, %f]\n",
8714322346f3fd03788a79d056ca7bce2db25bc9d88Zack Rusin   x0, y0, x1, y1, color[0], color[1], color[2], color[3]);*/
8724322346f3fd03788a79d056ca7bce2db25bc9d88Zack Rusin
8734322346f3fd03788a79d056ca7bce2db25bc9d88Zack Rusin   renderer_draw_conditional(r, 4 * 8);
8744322346f3fd03788a79d056ca7bce2db25bc9d88Zack Rusin
8754322346f3fd03788a79d056ca7bce2db25bc9d88Zack Rusin   /* 1st vertex */
8764322346f3fd03788a79d056ca7bce2db25bc9d88Zack Rusin   add_vertex_color(r, x0, y0, color);
8774322346f3fd03788a79d056ca7bce2db25bc9d88Zack Rusin   /* 2nd vertex */
8784322346f3fd03788a79d056ca7bce2db25bc9d88Zack Rusin   add_vertex_color(r, x1, y0, color);
8794322346f3fd03788a79d056ca7bce2db25bc9d88Zack Rusin   /* 3rd vertex */
8804322346f3fd03788a79d056ca7bce2db25bc9d88Zack Rusin   add_vertex_color(r, x1, y1, color);
8814322346f3fd03788a79d056ca7bce2db25bc9d88Zack Rusin   /* 4th vertex */
8824322346f3fd03788a79d056ca7bce2db25bc9d88Zack Rusin   add_vertex_color(r, x0, y1, color);
883e1730632aa5ca1dbb0edd484e2357246ec537abbZack Rusin}
884e1730632aa5ca1dbb0edd484e2357246ec537abbZack Rusin
8854322346f3fd03788a79d056ca7bce2db25bc9d88Zack Rusinvoid renderer_draw_flush(struct xorg_renderer *r)
886e1730632aa5ca1dbb0edd484e2357246ec537abbZack Rusin{
8874322346f3fd03788a79d056ca7bce2db25bc9d88Zack Rusin   renderer_draw_conditional(r, 0);
888e1730632aa5ca1dbb0edd484e2357246ec537abbZack Rusin}
889e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin
890e521bf7706a5527ad5750baef78feaa961f73eccZack Rusinvoid renderer_begin_textures(struct xorg_renderer *r,
891e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin                             struct pipe_texture **textures,
892e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin                             int num_textures)
893e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin{
894e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin   r->num_attributes = 1 + num_textures;
895e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin}
896e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin
897e521bf7706a5527ad5750baef78feaa961f73eccZack Rusinvoid renderer_texture(struct xorg_renderer *r,
898e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin                      int *pos,
899e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin                      int width, int height,
900e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin                      struct pipe_texture **textures,
901e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin                      int num_textures,
902e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin                      float *src_matrix,
903e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin                      float *mask_matrix)
904e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin{
905e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin
906e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin#if 0
907e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin   if (src_matrix) {
908e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin      debug_printf("src_matrix = \n");
909e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin      debug_printf("%f, %f, %f\n", src_matrix[0], src_matrix[1], src_matrix[2]);
910e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin      debug_printf("%f, %f, %f\n", src_matrix[3], src_matrix[4], src_matrix[5]);
911e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin      debug_printf("%f, %f, %f\n", src_matrix[6], src_matrix[7], src_matrix[8]);
912e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin   }
913e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin   if (mask_matrix) {
914e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin      debug_printf("mask_matrix = \n");
915e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin      debug_printf("%f, %f, %f\n", mask_matrix[0], mask_matrix[1], mask_matrix[2]);
916e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin      debug_printf("%f, %f, %f\n", mask_matrix[3], mask_matrix[4], mask_matrix[5]);
917e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin      debug_printf("%f, %f, %f\n", mask_matrix[6], mask_matrix[7], mask_matrix[8]);
918e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin   }
919e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin#endif
920e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin
921e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin   switch(r->num_attributes) {
922e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin   case 2:
923e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin      renderer_draw_conditional(r, 4 * 8);
924e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin      add_vertex_data1(r,
925e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin                       pos[0], pos[1], /* src */
926e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin                       pos[4], pos[5], /* dst */
927e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin                       width, height,
928e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin                       textures[0], src_matrix);
929e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin      break;
930e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin   case 3:
931e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin      renderer_draw_conditional(r, 4 * 12);
932e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin      add_vertex_data2(r,
933e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin                       pos[0], pos[1], /* src */
934e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin                       pos[2], pos[3], /* mask */
935e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin                       pos[4], pos[5], /* dst */
936e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin                       width, height,
937e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin                       textures[0], textures[1],
938e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin                       src_matrix, mask_matrix);
939e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin      break;
940e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin   default:
941e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin      debug_assert(!"Unsupported number of textures");
942e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin      break;
943e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin   }
944e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin}
945e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin
946e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin
947e521bf7706a5527ad5750baef78feaa961f73eccZack Rusinvoid renderer_draw_textures(struct xorg_renderer *r,
948e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin                            int *pos,
949e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin                            int width, int height,
950e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin                            struct pipe_texture **textures,
951e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin                            int num_textures,
952e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin                            float *src_matrix, float *mask_matrix)
953e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin{
954e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin#if 0
955e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin   if (src_matrix) {
956e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin      debug_printf("src_matrix = \n");
957e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin      debug_printf("%f, %f, %f\n", src_matrix[0], src_matrix[1], src_matrix[2]);
958e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin      debug_printf("%f, %f, %f\n", src_matrix[3], src_matrix[4], src_matrix[5]);
959e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin      debug_printf("%f, %f, %f\n", src_matrix[6], src_matrix[7], src_matrix[8]);
960e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin   }
961e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin   if (mask_matrix) {
962e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin      debug_printf("mask_matrix = \n");
963e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin      debug_printf("%f, %f, %f\n", mask_matrix[0], mask_matrix[1], mask_matrix[2]);
964e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin      debug_printf("%f, %f, %f\n", mask_matrix[3], mask_matrix[4], mask_matrix[5]);
965e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin      debug_printf("%f, %f, %f\n", mask_matrix[6], mask_matrix[7], mask_matrix[8]);
966e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin   }
967e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin#endif
968e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin
969e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin   r->num_attributes = 1 + num_textures;
970e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin   switch(num_textures) {
971e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin   case 1:
972e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin      add_vertex_data1(r,
973e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin                       pos[0], pos[1], /* src */
974e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin                       pos[4], pos[5], /* dst */
975e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin                       width, height,
976e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin                       textures[0], src_matrix);
977e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin      break;
978e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin   case 2:
979e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin      add_vertex_data2(r,
980e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin                       pos[0], pos[1], /* src */
981e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin                       pos[2], pos[3], /* mask */
982e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin                       pos[4], pos[5], /* dst */
983e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin                       width, height,
984e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin                       textures[0], textures[1],
985e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin                       src_matrix, mask_matrix);
986e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin      break;
987e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin   case 3:
988e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin   default:
989e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin      debug_assert(!"Unsupported number of textures");
990e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin      break;
991e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin   }
992e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin
993e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin   renderer_draw(r);
994e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin}
995e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin
996