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