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