xorg_renderer.c revision 287c94ea4987033f9c99a2f91c5750c9083504ca
1cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson#include "xorg_exa.h" 2dc8058c3370588bfcad49fadace1691da47d58cdAdam Jackson#include "xorg_renderer.h" 3dc8058c3370588bfcad49fadace1691da47d58cdAdam Jackson 4dc8058c3370588bfcad49fadace1691da47d58cdAdam Jackson#include "xorg_exa_tgsi.h" 59bba1cfc39d35b847c479dcc1afef3d5d8fb0bfcIan Romanick 69bba1cfc39d35b847c479dcc1afef3d5d8fb0bfcIan Romanick#include "cso_cache/cso_context.h" 79bba1cfc39d35b847c479dcc1afef3d5d8fb0bfcIan Romanick#include "util/u_draw_quad.h" 8dc8058c3370588bfcad49fadace1691da47d58cdAdam Jackson#include "util/u_math.h" 9dc8058c3370588bfcad49fadace1691da47d58cdAdam Jackson#include "util/u_memory.h" 10dc8058c3370588bfcad49fadace1691da47d58cdAdam Jackson#include "util/u_rect.h" 11dc8058c3370588bfcad49fadace1691da47d58cdAdam Jackson#include "util/u_sampler.h" 12dc8058c3370588bfcad49fadace1691da47d58cdAdam Jackson 13dc8058c3370588bfcad49fadace1691da47d58cdAdam Jackson#include "util/u_inlines.h" 14dc8058c3370588bfcad49fadace1691da47d58cdAdam Jackson 15dc8058c3370588bfcad49fadace1691da47d58cdAdam Jackson#include <math.h> 16dc8058c3370588bfcad49fadace1691da47d58cdAdam Jackson 17dc8058c3370588bfcad49fadace1691da47d58cdAdam Jackson#define floatsEqual(x, y) (fabs(x - y) <= 0.00001f * MIN2(fabs(x), fabs(y))) 18dc8058c3370588bfcad49fadace1691da47d58cdAdam Jackson#define floatIsZero(x) (floatsEqual((x) + 1, 1)) 19dc8058c3370588bfcad49fadace1691da47d58cdAdam Jackson 20dc8058c3370588bfcad49fadace1691da47d58cdAdam Jackson#define NUM_COMPONENTS 4 219bba1cfc39d35b847c479dcc1afef3d5d8fb0bfcIan Romanick 229bba1cfc39d35b847c479dcc1afef3d5d8fb0bfcIan Romanickstatic INLINE boolean is_affine(float *matrix) 239bba1cfc39d35b847c479dcc1afef3d5d8fb0bfcIan Romanick{ 24dc8058c3370588bfcad49fadace1691da47d58cdAdam Jackson return floatIsZero(matrix[2]) && floatIsZero(matrix[5]) 25dc8058c3370588bfcad49fadace1691da47d58cdAdam Jackson && floatsEqual(matrix[8], 1); 26dc8058c3370588bfcad49fadace1691da47d58cdAdam Jackson} 27dc8058c3370588bfcad49fadace1691da47d58cdAdam Jacksonstatic INLINE void map_point(float *mat, float x, float y, 28dc8058c3370588bfcad49fadace1691da47d58cdAdam Jackson float *out_x, float *out_y) 29dc8058c3370588bfcad49fadace1691da47d58cdAdam Jackson{ 30cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson if (!mat) { 31cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson *out_x = x; 32cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson *out_y = y; 33cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson return; 34cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson } 35cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 36cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson *out_x = mat[0]*x + mat[3]*y + mat[6]; 37cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson *out_y = mat[1]*x + mat[4]*y + mat[7]; 38cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson if (!is_affine(mat)) { 39cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson float w = 1/(mat[2]*x + mat[5]*y + mat[8]); 40cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson *out_x *= w; 41cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson *out_y *= w; 4238c51a76533a90cf2c9381c99247cfac45fe70ebKristian Høgsberg } 437a9329ba99fe1242c07fbf4fd04e7a4dbeba2e72Robert Bragg} 44cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 45cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jacksonstatic INLINE struct pipe_resource * 46cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jacksonrenderer_buffer_create(struct xorg_renderer *r) 47cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{ 48cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson struct pipe_resource *buf = 49cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson pipe_user_buffer_create(r->pipe->screen, 50ad919c30df71bc191be6f107385638b456da6a0fAdam Jackson r->buffer, 51ad919c30df71bc191be6f107385638b456da6a0fAdam Jackson sizeof(float)* 52ad919c30df71bc191be6f107385638b456da6a0fAdam Jackson r->buffer_size, 53cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson/* XXX was: PIPE_BUFFER_USAGE_PIXEL/PIPE_BUFFER_USAGE_GPU_WRITE even though this is a vertex buffer??? */ 5465d98e25770487456eb3d7eb8ec3ec8272f170b1Kristian Høgsberg PIPE_BIND_VERTEX_BUFFER); 554a22ae8d446855d839cc199df8eb1b057045cb88Kristian Høgsberg r->buffer_size = 0; 56a2f28ceea22254f09ee37039eec873ccdf689e6cMatt Turner 5702986cb2cc1b1d47b26a653e9ae0fa508365f616Ian Romanick return buf; 58cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson} 59cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 60ec770150edff9a5955f52e538adc4bac94c92cadJeremy Huddlestonstatic INLINE void 61ec770150edff9a5955f52e538adc4bac94c92cadJeremy Huddlestonrenderer_draw(struct xorg_renderer *r) 626ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg{ 63a25e1aa0aab6bd278eefa7c0748b491c9c6ae62cBrian Paul struct pipe_context *pipe = r->pipe; 640896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf struct pipe_resource *buf = 0; 650896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf int num_verts = r->buffer_size/(r->attrs_per_vertex * NUM_COMPONENTS); 66cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 67cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson if (!r->buffer_size) 68cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson return; 69c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg 70c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg buf = renderer_buffer_create(r); 71cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 72cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 73cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson if (buf) { 74cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson cso_set_vertex_elements(r->cso, r->attrs_per_vertex, r->velems); 75cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 76c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg util_draw_vertex_buffer(pipe, buf, 0, 777b7845a076c933e096ac511b4184141ba194449aKristian Høgsberg PIPE_PRIM_QUADS, 7880b280db883edc9550484dba03bd5c124b6a9bf9Jeremy Huddleston num_verts, /* verts */ 7980b280db883edc9550484dba03bd5c124b6a9bf9Jeremy Huddleston r->attrs_per_vertex); /* attribs/vert */ 80cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 8180b280db883edc9550484dba03bd5c124b6a9bf9Jeremy Huddleston pipe_resource_reference(&buf, NULL); 82cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson } 83cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson} 84cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 85cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jacksonstatic INLINE void 86cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jacksonrenderer_draw_conditional(struct xorg_renderer *r, 87425f9ed44e576aef27f7ab98968043f7f180d0fdKristian Høgsberg int next_batch) 8892d2a78f8d2d56cfadb4cb5323adec32fe73e353Kristian Høgsberg{ 8920b9230ce1b96ca246850a8088caeffc3f391a0cKristian Høgsberg if (r->buffer_size + next_batch >= BUF_SIZE || 9092d2a78f8d2d56cfadb4cb5323adec32fe73e353Kristian Høgsberg (next_batch == 0 && r->buffer_size)) { 910896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf renderer_draw(r); 920896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf } 93cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson} 94cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 95cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jacksonstatic void 960896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófrenderer_init_state(struct xorg_renderer *r) 97a1ea6f6198d80f716936a308cfab235f18a014e1Kristian Høgsberg{ 98c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg struct pipe_depth_stencil_alpha_state dsa; 9992d2a78f8d2d56cfadb4cb5323adec32fe73e353Kristian Høgsberg struct pipe_rasterizer_state raster; 10092d2a78f8d2d56cfadb4cb5323adec32fe73e353Kristian Høgsberg unsigned i; 101daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes 102daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes /* set common initial clip state */ 10366fc35cde9ed68a09920ad6a28de794dd1d3aa8cKristian Høgsberg memset(&dsa, 0, sizeof(struct pipe_depth_stencil_alpha_state)); 104daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes cso_set_depth_stencil_alpha(r->cso, &dsa); 105c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg 106c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg 107c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg /* XXX: move to renderer_init_state? */ 108c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg memset(&raster, 0, sizeof(struct pipe_rasterizer_state)); 109daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes raster.gl_rasterization_rules = 1; 11066fc35cde9ed68a09920ad6a28de794dd1d3aa8cKristian Høgsberg cso_set_rasterizer(r->cso, &raster); 111daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes 112daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes /* vertex elements state */ 1136ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg memset(&r->velems[0], 0, sizeof(r->velems[0]) * 3); 114daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes for (i = 0; i < 3; i++) { 115daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes r->velems[i].src_offset = i * 4 * sizeof(float); 116daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes r->velems[i].instance_divisor = 0; 117daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes r->velems[i].vertex_buffer_index = 0; 118daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes r->velems[i].src_format = PIPE_FORMAT_R32G32B32A32_FLOAT; 11966fc35cde9ed68a09920ad6a28de794dd1d3aa8cKristian Høgsberg } 120daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes} 121daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes 122daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes 123daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnesstatic INLINE void 124daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnesadd_vertex_color(struct xorg_renderer *r, 125daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes float x, float y, 126089fc37c6fa158824279e08e3b378ced94d6f803Kristian Høgsberg float color[4]) 127efc82e7c703f9160cfdbe6d97e166ca6f5e75d86Jesse Barnes{ 12820b9230ce1b96ca246850a8088caeffc3f391a0cKristian Høgsberg float *vertex = r->buffer + r->buffer_size; 12920b9230ce1b96ca246850a8088caeffc3f391a0cKristian Høgsberg 1300896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf vertex[0] = x; 1310896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf vertex[1] = y; 1320896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf vertex[2] = 0.f; /*z*/ 1339110425c72e45f618131b559eba883fd6c5536b4Kristian Høgsberg vertex[3] = 1.f; /*w*/ 1340896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 1350896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf vertex[4] = color[0]; /*r*/ 13666fc35cde9ed68a09920ad6a28de794dd1d3aa8cKristian Høgsberg vertex[5] = color[1]; /*g*/ 1370896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf vertex[6] = color[2]; /*b*/ 1380896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf vertex[7] = color[3]; /*a*/ 139f8d81c31cee30821da3aab331a57f484f6a07a5dNick Bowler 140bf69ce37f0dcbb479078ee676d5100ac63e20750Stéphane Marchesin r->buffer_size += 8; 141cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson} 142cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 143cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jacksonstatic INLINE void 144cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jacksonadd_vertex_1tex(struct xorg_renderer *r, 145cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson float x, float y, float s, float t) 146cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{ 1470896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf float *vertex = r->buffer + r->buffer_size; 1480896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 1490896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf vertex[0] = x; 15061d26bc82e7c4100acfb551cbb0ba9d84bbc4ba5Francisco Jerez vertex[1] = y; 151a0e510320009766faa5ff8c0ed744e87f8095df7Luca Barbieri vertex[2] = 0.f; /*z*/ 15261d26bc82e7c4100acfb551cbb0ba9d84bbc4ba5Francisco Jerez vertex[3] = 1.f; /*w*/ 153cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 154cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson vertex[4] = s; /*s*/ 155cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson vertex[5] = t; /*t*/ 156cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson vertex[6] = 0.f; /*r*/ 157cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson vertex[7] = 1.f; /*q*/ 1580896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 159cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson r->buffer_size += 8; 1600896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf} 161cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 162cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jacksonstatic void 163cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jacksonadd_vertex_data1(struct xorg_renderer *r, 164cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson float srcX, float srcY, float dstX, float dstY, 165cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson float width, float height, 166cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson struct pipe_resource *src, float *src_matrix) 167cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{ 1680896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf float s0, t0, s1, t1, s2, t2, s3, t3; 1690896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf float pt0[2], pt1[2], pt2[2], pt3[2]; 1700896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 1710896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pt0[0] = srcX; 1720896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pt0[1] = srcY; 1730896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pt1[0] = (srcX + width); 1740896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pt1[1] = srcY; 1750896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pt2[0] = (srcX + width); 1760896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pt2[1] = (srcY + height); 1770896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pt3[0] = srcX; 1780896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pt3[1] = (srcY + height); 179cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 180cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson if (src_matrix) { 181cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson map_point(src_matrix, pt0[0], pt0[1], &pt0[0], &pt0[1]); 1820896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf map_point(src_matrix, pt1[0], pt1[1], &pt1[0], &pt1[1]); 1830896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf map_point(src_matrix, pt2[0], pt2[1], &pt2[0], &pt2[1]); 1840896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf map_point(src_matrix, pt3[0], pt3[1], &pt3[0], &pt3[1]); 185cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson } 186cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 187fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick s0 = pt0[0] / src->width0; 188fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick s1 = pt1[0] / src->width0; 189fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick s2 = pt2[0] / src->width0; 190cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson s3 = pt3[0] / src->width0; 1910896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf t0 = pt0[1] / src->height0; 192cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson t1 = pt1[1] / src->height0; 193cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson t2 = pt2[1] / src->height0; 194fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick t3 = pt3[1] / src->height0; 195fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick 196cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson /* 1st vertex */ 1970896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf add_vertex_1tex(r, dstX, dstY, s0, t0); 1980896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf /* 2nd vertex */ 199cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson add_vertex_1tex(r, dstX + width, dstY, s1, t1); 200fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick /* 3rd vertex */ 201fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick add_vertex_1tex(r, dstX + width, dstY + height, s2, t2); 202fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick /* 4th vertex */ 203cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson add_vertex_1tex(r, dstX, dstY + height, s3, t3); 2040896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf} 205cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 206cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 2070896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófstatic INLINE void 2080896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófadd_vertex_2tex(struct xorg_renderer *r, 2090896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf float x, float y, 2100896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf float s0, float t0, float s1, float t1) 211cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{ 212cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson float *vertex = r->buffer + r->buffer_size; 213643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg 214c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg vertex[0] = x; 215c491e585e43d48a2aeec96ccc4008da6c443fb42Kristian Høgsberg vertex[1] = y; 216c491e585e43d48a2aeec96ccc4008da6c443fb42Kristian Høgsberg vertex[2] = 0.f; /*z*/ 2178a4b36de05a133c1c9527836ca58bf8ebdf229bdIan Romanick vertex[3] = 1.f; /*w*/ 218c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg 219c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg vertex[4] = s0; /*s*/ 220c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg vertex[5] = t0; /*t*/ 2217b7845a076c933e096ac511b4184141ba194449aKristian Høgsberg vertex[6] = 0.f; /*r*/ 222643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg vertex[7] = 1.f; /*q*/ 223643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg 224643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg vertex[8] = s1; /*s*/ 225643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg vertex[9] = t1; /*t*/ 226559e4f8ebcb186b491d7d687ac43f22a62448fc1Jeremy Huddleston vertex[10] = 0.f; /*r*/ 227643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg vertex[11] = 1.f; /*q*/ 228643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg 229cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson r->buffer_size += 12; 230cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson} 231cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 232cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jacksonstatic void 233c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsbergadd_vertex_data2(struct xorg_renderer *r, 2340896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf float srcX, float srcY, float maskX, float maskY, 235cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson float dstX, float dstY, float width, float height, 236cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson struct pipe_resource *src, 237cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson struct pipe_resource *mask, 238cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson float *src_matrix, float *mask_matrix) 239cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{ 240cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson float src_s0, src_t0, src_s1, src_t1; 241cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson float mask_s0, mask_t0, mask_s1, mask_t1; 242cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson float spt0[2], spt1[2]; 243cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson float mpt0[2], mpt1[2]; 244cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 245cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson spt0[0] = srcX; 246cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson spt0[1] = srcY; 247cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson spt1[0] = srcX + width; 248cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson spt1[1] = srcY + height; 249cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 250cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson mpt0[0] = maskX; 2510896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf mpt0[1] = maskY; 2520896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf mpt1[0] = maskX + width; 2530896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf mpt1[1] = maskY + height; 2540896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 2550896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (src_matrix) { 2560896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf map_point(src_matrix, spt0[0], spt0[1], &spt0[0], &spt0[1]); 2570896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf map_point(src_matrix, spt1[0], spt1[1], &spt1[0], &spt1[1]); 258cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson } 2593ea3f5e0a542cfd9f9a3433515fd27e0a5d1b1acKristian Høgsberg 2603ea3f5e0a542cfd9f9a3433515fd27e0a5d1b1acKristian Høgsberg if (mask_matrix) { 261cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson map_point(mask_matrix, mpt0[0], mpt0[1], &mpt0[0], &mpt0[1]); 262cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson map_point(mask_matrix, mpt1[0], mpt1[1], &mpt1[0], &mpt1[1]); 263cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson } 264cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 265cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson src_s0 = spt0[0] / src->width0; 266cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson src_t0 = spt0[1] / src->height0; 2670896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf src_s1 = spt1[0] / src->width0; 268cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson src_t1 = spt1[1] / src->height0; 269cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 270cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson mask_s0 = mpt0[0] / mask->width0; 271cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson mask_t0 = mpt0[1] / mask->height0; 2720896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf mask_s1 = mpt1[0] / mask->width0; 273cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson mask_t1 = mpt1[1] / mask->height0; 274cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 275cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson /* 1st vertex */ 276cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson add_vertex_2tex(r, dstX, dstY, 2770896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf src_s0, src_t0, mask_s0, mask_t0); 27866fc35cde9ed68a09920ad6a28de794dd1d3aa8cKristian Høgsberg /* 2nd vertex */ 279cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson add_vertex_2tex(r, dstX + width, dstY, 280cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson src_s1, src_t0, mask_s1, mask_t0); 281cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson /* 3rd vertex */ 282cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson add_vertex_2tex(r, dstX + width, dstY + height, 283cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson src_s1, src_t1, mask_s1, mask_t1); 2840896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf /* 4th vertex */ 285cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson add_vertex_2tex(r, dstX, dstY + height, 286cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson src_s0, src_t1, mask_s0, mask_t1); 287cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson} 288cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 289cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jacksonstatic struct pipe_resource * 290cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jacksonsetup_vertex_data_yuv(struct xorg_renderer *r, 291cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson float srcX, float srcY, float srcW, float srcH, 292cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson float dstX, float dstY, float dstW, float dstH, 293cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson struct pipe_resource **tex) 2940896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf{ 295cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson float s0, t0, s1, t1; 296cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson float spt0[2], spt1[2]; 297cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 298cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson spt0[0] = srcX; 299cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson spt0[1] = srcY; 300cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson spt1[0] = srcX + srcW; 301cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson spt1[1] = srcY + srcH; 302cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 3030896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf s0 = spt0[0] / tex[0]->width0; 3040896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf t0 = spt0[1] / tex[0]->height0; 3050896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf s1 = spt1[0] / tex[0]->width0; 3060896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf t1 = spt1[1] / tex[0]->height0; 3070896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 308cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson /* 1st vertex */ 309cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson add_vertex_1tex(r, dstX, dstY, s0, t0); 310cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson /* 2nd vertex */ 311cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson add_vertex_1tex(r, dstX + dstW, dstY, 312cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson s1, t0); 313c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg /* 3rd vertex */ 3140896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf add_vertex_1tex(r, dstX + dstW, dstY + dstH, 315cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson s1, t1); 316cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson /* 4th vertex */ 31729206ae569c4c784ec6884084b4bd8631f66b866Ian Romanick add_vertex_1tex(r, dstX, dstY + dstH, 318cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson s0, t1); 3190896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 320cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson return renderer_buffer_create(r); 321cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson} 322cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 323cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 324cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 325cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson/* Set up framebuffer, viewport and vertex shader constant buffer 3260896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf * state for a particular destinaton surface. In all our rendering, 327cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * these concepts are linked. 328cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson */ 329ae2c31ed669abab66a8c4b68d8d746e94b9ebf28Xiang, Haihaovoid renderer_bind_destination(struct xorg_renderer *r, 330ae2c31ed669abab66a8c4b68d8d746e94b9ebf28Xiang, Haihao struct pipe_surface *surface, 3310896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf int width, 332ae2c31ed669abab66a8c4b68d8d746e94b9ebf28Xiang, Haihao int height ) 333488d6c739f5b6cdfa2c670322057c699644d4e52Jeremy Huddleston{ 334488d6c739f5b6cdfa2c670322057c699644d4e52Jeremy Huddleston 335488d6c739f5b6cdfa2c670322057c699644d4e52Jeremy Huddleston struct pipe_framebuffer_state fb; 336488d6c739f5b6cdfa2c670322057c699644d4e52Jeremy Huddleston struct pipe_viewport_state viewport; 337ae2c31ed669abab66a8c4b68d8d746e94b9ebf28Xiang, Haihao 338cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson /* Framebuffer uses actual surface width/height 339cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson */ 340cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson memset(&fb, 0, sizeof fb); 3410896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf fb.width = surface->width; 342cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson fb.height = surface->height; 343cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson fb.nr_cbufs = 1; 344cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson fb.cbufs[0] = surface; 345cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson fb.zsbuf = 0; 346cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 3470896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf /* Viewport just touches the bit we're interested in: 348cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson */ 349cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson viewport.scale[0] = width / 2.f; 350cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson viewport.scale[1] = height / 2.f; 351cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson viewport.scale[2] = 1.0; 352cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson viewport.scale[3] = 1.0; 353cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson viewport.translate[0] = width / 2.f; 354cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson viewport.translate[1] = height / 2.f; 355cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson viewport.translate[2] = 0.0; 3560896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf viewport.translate[3] = 0.0; 3570896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 3580896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf /* Constant buffer set up to match viewport dimensions: 3590896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf */ 3600896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (r->fb_width != width || 3610896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf r->fb_height != height) 362cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson { 363cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson float vs_consts[8] = { 364cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 2.f/width, 2.f/height, 1, 1, 365cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson -1, -1, 0, 0 366cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson }; 3670896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 368cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson r->fb_width = width; 369cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson r->fb_height = height; 370cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 371cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson renderer_set_constants(r, PIPE_SHADER_VERTEX, 372cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson vs_consts, sizeof vs_consts); 3730896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf } 374cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 375cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson cso_set_framebuffer(r->cso, &fb); 3766ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg cso_set_viewport(r->cso, &viewport); 377cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson} 3786ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg 3794a22ae8d446855d839cc199df8eb1b057045cb88Kristian Høgsberg 380cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jacksonstruct xorg_renderer * renderer_create(struct pipe_context *pipe) 381cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{ 382cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson struct xorg_renderer *renderer = CALLOC_STRUCT(xorg_renderer); 383cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 384cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson renderer->pipe = pipe; 385cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson renderer->cso = cso_create_context(pipe); 3860896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf renderer->shaders = xorg_shaders_create(renderer); 387cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 3880896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf renderer_init_state(renderer); 389cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 390cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson return renderer; 391cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson} 392cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 393cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jacksonvoid renderer_destroy(struct xorg_renderer *r) 394cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{ 3950896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf struct pipe_resource **vsbuf = &r->vs_const_buffer; 396fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick struct pipe_resource **fsbuf = &r->fs_const_buffer; 397cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 398cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson if (*vsbuf) 399cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson pipe_resource_reference(vsbuf, NULL); 400cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 4010896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (*fsbuf) 402cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson pipe_resource_reference(fsbuf, NULL); 403cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 404cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson if (r->shaders) { 405cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson xorg_shaders_destroy(r->shaders); 406cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson r->shaders = NULL; 407cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson } 408cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 4090896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (r->cso) { 410cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson cso_release_all(r->cso); 411cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson cso_destroy_context(r->cso); 4120896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf r->cso = NULL; 413fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick } 41496fd3df59a161957876bfd7a49992e5a2130370cThomas Hellstrom} 41549d7e48b33264d94e30af6129c281b6acafa9427Eric Anholt 41696fd3df59a161957876bfd7a49992e5a2130370cThomas Hellstrom 41749d7e48b33264d94e30af6129c281b6acafa9427Eric Anholt 41896fd3df59a161957876bfd7a49992e5a2130370cThomas Hellstrom 4190896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 420cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jacksonvoid renderer_set_constants(struct xorg_renderer *r, 421cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson int shader_type, 42231819830b66a49f1b62e09090cc65aefc657aeb8Kristian Høgsberg const float *params, 423c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg int param_bytes) 42466fc35cde9ed68a09920ad6a28de794dd1d3aa8cKristian Høgsberg{ 42531819830b66a49f1b62e09090cc65aefc657aeb8Kristian Høgsberg struct pipe_resource **cbuf = 4260896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf (shader_type == PIPE_SHADER_VERTEX) ? &r->vs_const_buffer : 4270896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf &r->fs_const_buffer; 4280896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 4290896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pipe_resource_reference(cbuf, NULL); 430cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson *cbuf = pipe_buffer_create(r->pipe->screen, 431c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg PIPE_BIND_CONSTANT_BUFFER, 432cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson param_bytes); 433cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 434cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson if (*cbuf) { 435cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson pipe_buffer_write(r->pipe, *cbuf, 436cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 0, param_bytes, params); 437cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson } 438cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson r->pipe->set_constant_buffer(r->pipe, shader_type, 0, *cbuf); 439cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson} 4400896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 441cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 442cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jacksonvoid renderer_copy_prepare(struct xorg_renderer *r, 443cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson struct pipe_surface *dst_surface, 444cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson struct pipe_resource *src_texture) 445cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{ 446cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson struct pipe_context *pipe = r->pipe; 447cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson struct pipe_screen *screen = pipe->screen; 448cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson struct xorg_shader shader; 449cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 450cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson assert(screen->is_format_supported(screen, dst_surface->format, 451cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson PIPE_TEXTURE_2D, 4520896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf PIPE_BIND_RENDER_TARGET, 453cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 0)); 454cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson (void) screen; 455cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 456cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 457cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson /* set misc state we care about */ 458cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson { 4590896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf struct pipe_blend_state blend; 460cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson memset(&blend, 0, sizeof(blend)); 461cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson blend.rt[0].rgb_src_factor = PIPE_BLENDFACTOR_ONE; 462cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson blend.rt[0].alpha_src_factor = PIPE_BLENDFACTOR_ONE; 463cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson blend.rt[0].rgb_dst_factor = PIPE_BLENDFACTOR_ZERO; 464cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson blend.rt[0].alpha_dst_factor = PIPE_BLENDFACTOR_ZERO; 4656ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg blend.rt[0].colormask = PIPE_MASK_RGBA; 466c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg cso_set_blend(r->cso, &blend); 467c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg } 468c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg 469c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg /* sampler */ 47043409fa7b0e64f6d73c3d33bc9a39ba26dd4caebIan Romanick { 47143409fa7b0e64f6d73c3d33bc9a39ba26dd4caebIan Romanick struct pipe_sampler_state sampler; 47243409fa7b0e64f6d73c3d33bc9a39ba26dd4caebIan Romanick memset(&sampler, 0, sizeof(sampler)); 47343409fa7b0e64f6d73c3d33bc9a39ba26dd4caebIan Romanick sampler.wrap_s = PIPE_TEX_WRAP_CLAMP_TO_EDGE; 47443409fa7b0e64f6d73c3d33bc9a39ba26dd4caebIan Romanick sampler.wrap_t = PIPE_TEX_WRAP_CLAMP_TO_EDGE; 47543409fa7b0e64f6d73c3d33bc9a39ba26dd4caebIan Romanick sampler.wrap_r = PIPE_TEX_WRAP_CLAMP_TO_EDGE; 47643409fa7b0e64f6d73c3d33bc9a39ba26dd4caebIan Romanick sampler.min_mip_filter = PIPE_TEX_MIPFILTER_NONE; 47743409fa7b0e64f6d73c3d33bc9a39ba26dd4caebIan Romanick sampler.min_img_filter = PIPE_TEX_FILTER_NEAREST; 4786ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg sampler.mag_img_filter = PIPE_TEX_FILTER_NEAREST; 4796ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg sampler.normalized_coords = 1; 48066fc35cde9ed68a09920ad6a28de794dd1d3aa8cKristian Høgsberg cso_single_sampler(r->cso, 0, &sampler); 4810896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf cso_single_sampler_done(r->cso); 4826ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg } 4836ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg 484cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson renderer_bind_destination(r, dst_surface, 485cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson dst_surface->width, 486cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson dst_surface->height); 4870896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 488cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson /* texture/sampler view */ 489cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson { 490cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson struct pipe_sampler_view templ; 491cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson struct pipe_sampler_view *src_view; 492cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson u_sampler_view_default_template(&templ, 4930896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf src_texture, 494cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson src_texture->format); 495c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg src_view = pipe->create_sampler_view(pipe, src_texture, &templ); 496037755122e9011c768e5caa4d4cb83aba783d3e9Kristian Høgsberg cso_set_fragment_sampler_views(r->cso, 1, &src_view); 49760fce15447da7d4135ace6f1433896b0a02bcfeeKristian Høgsberg pipe_sampler_view_reference(&src_view, NULL); 49860fce15447da7d4135ace6f1433896b0a02bcfeeKristian Høgsberg } 49960fce15447da7d4135ace6f1433896b0a02bcfeeKristian Høgsberg 50080b280db883edc9550484dba03bd5c124b6a9bf9Jeremy Huddleston /* shaders */ 501cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson shader = xorg_shaders_get(r->shaders, 502cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson VS_COMPOSITE, 503cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson FS_COMPOSITE); 5040896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf cso_set_vertex_shader_handle(r->cso, shader.vs); 505cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson cso_set_fragment_shader_handle(r->cso, shader.fs); 506cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 507cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson r->buffer_size = 0; 5086c533ea2d1953152f7d95d6c984e0d287edb46c2Kristian Høgsberg r->attrs_per_vertex = 2; 509cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson} 5106ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg 511c39bf5e273a4995a279ae2af59fc29e06ab47e29Ian Romanickstruct pipe_resource * 512cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jacksonrenderer_clone_texture(struct xorg_renderer *r, 513cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson struct pipe_resource *src) 514cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{ 515cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson enum pipe_format format; 51666fc35cde9ed68a09920ad6a28de794dd1d3aa8cKristian Høgsberg struct pipe_context *pipe = r->pipe; 517cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson struct pipe_screen *screen = pipe->screen; 518cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson struct pipe_resource *pt; 5190896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf struct pipe_resource templ; 5200896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 5210896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (pipe->is_resource_referenced(pipe, src, 0, 0) & 5220896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf PIPE_REFERENCED_FOR_WRITE) 523cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson pipe->flush(pipe, PIPE_FLUSH_RENDER_CACHE, NULL); 524aceccda56b08338e217991e54607f1c9f18fc3e6Kristian Høgsberg 525cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson /* the coming in texture should already have that invariance */ 526cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson debug_assert(screen->is_format_supported(screen, src->format, 527cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson PIPE_TEXTURE_2D, 528cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson PIPE_BIND_SAMPLER_VIEW, 0)); 529cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 530c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg format = src->format; 5310896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 532ab434f6b7641a64d30725a9ac24929240362d466Kristian Høgsberg memset(&templ, 0, sizeof(templ)); 533ab434f6b7641a64d30725a9ac24929240362d466Kristian Høgsberg templ.target = PIPE_TEXTURE_2D; 534c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg templ.format = format; 535ab434f6b7641a64d30725a9ac24929240362d466Kristian Høgsberg templ.last_level = 0; 536cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson templ.width0 = src->width0; 537cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson templ.height0 = src->height0; 538cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson templ.depth0 = 1; 5390896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf templ.bind = PIPE_BIND_SAMPLER_VIEW; 540cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 541cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson pt = screen->resource_create(screen, &templ); 542cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 543cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson debug_assert(!pt || pipe_is_referenced(&pt->reference)); 544cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 5450896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (!pt) 546cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson return NULL; 547cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 548cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson { 549cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson /* copy source framebuffer surface into texture */ 550cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson struct pipe_surface *ps_read = screen->get_tex_surface( 551cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson screen, src, 0, 0, 0, PIPE_BIND_BLIT_SOURCE); 5520896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf struct pipe_surface *ps_tex = screen->get_tex_surface( 5530896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf screen, pt, 0, 0, 0, PIPE_BIND_BLIT_DESTINATION ); 5540896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (pipe->surface_copy) { 555cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson pipe->surface_copy(pipe, 556cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson ps_tex, /* dest */ 557cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 0, 0, /* destx/y */ 5580896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf ps_read, 559cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 0, 0, src->width0, src->height0); 560cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson } else { 561cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson util_surface_copy(pipe, FALSE, 5620896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf ps_tex, /* dest */ 5630896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 0, 0, /* destx/y */ 5640896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf ps_read, 5650896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 0, 0, src->width0, src->height0); 566cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson } 567cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson pipe_surface_reference(&ps_read, NULL); 568cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson pipe_surface_reference(&ps_tex, NULL); 569cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson } 570cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 571cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson return pt; 57266fc35cde9ed68a09920ad6a28de794dd1d3aa8cKristian Høgsberg} 573cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 5744df137691ee29bb812347fa2c5f19095243ede22Jesse Barnes 5754df137691ee29bb812347fa2c5f19095243ede22Jesse Barnesvoid renderer_copy_pixmap(struct xorg_renderer *r, 57680b280db883edc9550484dba03bd5c124b6a9bf9Jeremy Huddleston int dx, int dy, 577e3e8196c025bd344a59b4671e473c395a6ea426bKristian Høgsberg int sx, int sy, 578e3e8196c025bd344a59b4671e473c395a6ea426bKristian Høgsberg int width, int height, 579cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson float src_width, 580cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson float src_height) 581cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{ 5820896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf float s0, t0, s1, t1; 5830896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf float x0, y0, x1, y1; 5840896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 585cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 586cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson /* XXX: could put the texcoord scaling calculation into the vertex 587cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * shader. 5884df137691ee29bb812347fa2c5f19095243ede22Jesse Barnes */ 5894df137691ee29bb812347fa2c5f19095243ede22Jesse Barnes s0 = sx / src_width; 5904df137691ee29bb812347fa2c5f19095243ede22Jesse Barnes s1 = (sx + width) / src_width; 5914df137691ee29bb812347fa2c5f19095243ede22Jesse Barnes t0 = sy / src_height; 5924df137691ee29bb812347fa2c5f19095243ede22Jesse Barnes t1 = (sy + height) / src_height; 5934df137691ee29bb812347fa2c5f19095243ede22Jesse Barnes 5944df137691ee29bb812347fa2c5f19095243ede22Jesse Barnes x0 = dx; 5954df137691ee29bb812347fa2c5f19095243ede22Jesse Barnes x1 = dx + width; 596f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg y0 = dy; 59766fc35cde9ed68a09920ad6a28de794dd1d3aa8cKristian Høgsberg y1 = dy + height; 598c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg 599bfc889517ad0d490cce1817eecac146d66bcd923Henri Verbeet /* draw quad */ 600bfc889517ad0d490cce1817eecac146d66bcd923Henri Verbeet renderer_draw_conditional(r, 4*8); 601f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg add_vertex_1tex(r, x0, y0, s0, t0); 602c1cbdbfde0a1f016f9d3f23a39cb7bc0b9825e12Kristian Høgsberg add_vertex_1tex(r, x1, y0, s1, t0); 6033750ebd540510324ef5ada769537ae05309adadbKristian Høgsberg add_vertex_1tex(r, x1, y1, s1, t1); 6043750ebd540510324ef5ada769537ae05309adadbKristian Høgsberg add_vertex_1tex(r, x0, y1, s0, t1); 605c1cbdbfde0a1f016f9d3f23a39cb7bc0b9825e12Kristian Høgsberg} 606aceccda56b08338e217991e54607f1c9f18fc3e6Kristian Høgsberg 607c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg 608cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 609c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg 6100896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófvoid renderer_draw_yuv(struct xorg_renderer *r, 6110896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf int src_x, int src_y, int src_w, int src_h, 612cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson int dst_x, int dst_y, int dst_w, int dst_h, 613c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg struct pipe_resource **textures) 6140896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf{ 615cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson struct pipe_context *pipe = r->pipe; 616cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson struct pipe_resource *buf = 0; 617c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg 618cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson buf = setup_vertex_data_yuv(r, 619df2c9424d3b625d6e97528c74051257bc5630a67Brian Paul src_x, src_y, src_w, src_h, 620df2c9424d3b625d6e97528c74051257bc5630a67Brian Paul dst_x, dst_y, dst_w, dst_h, 621cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson textures); 622cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 623cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson if (buf) { 624cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson const int num_attribs = 2; /*pos + tex coord*/ 625cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 626a2f28ceea22254f09ee37039eec873ccdf689e6cMatt Turner cso_set_vertex_elements(r->cso, num_attribs, r->velems); 62702986cb2cc1b1d47b26a653e9ae0fa508365f616Ian Romanick 628c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg util_draw_vertex_buffer(pipe, buf, 0, 62902986cb2cc1b1d47b26a653e9ae0fa508365f616Ian Romanick PIPE_PRIM_QUADS, 63002986cb2cc1b1d47b26a653e9ae0fa508365f616Ian Romanick 4, /* verts */ 63102986cb2cc1b1d47b26a653e9ae0fa508365f616Ian Romanick num_attribs); /* attribs/vert */ 6320896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 6330896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pipe_resource_reference(&buf, NULL); 63402986cb2cc1b1d47b26a653e9ae0fa508365f616Ian Romanick } 6350896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf} 63602986cb2cc1b1d47b26a653e9ae0fa508365f616Ian Romanick 63702986cb2cc1b1d47b26a653e9ae0fa508365f616Ian Romanickvoid renderer_begin_solid(struct xorg_renderer *r) 63802986cb2cc1b1d47b26a653e9ae0fa508365f616Ian Romanick{ 639c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg r->buffer_size = 0; 64002986cb2cc1b1d47b26a653e9ae0fa508365f616Ian Romanick r->attrs_per_vertex = 2; 64102986cb2cc1b1d47b26a653e9ae0fa508365f616Ian Romanick} 64202986cb2cc1b1d47b26a653e9ae0fa508365f616Ian Romanick 643cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jacksonvoid renderer_solid(struct xorg_renderer *r, 64402986cb2cc1b1d47b26a653e9ae0fa508365f616Ian Romanick int x0, int y0, 645c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg int x1, int y1, 6460896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf float *color) 6470896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf{ 64802986cb2cc1b1d47b26a653e9ae0fa508365f616Ian Romanick /* 649a2f28ceea22254f09ee37039eec873ccdf689e6cMatt Turner debug_printf("solid rect[(%d, %d), (%d, %d)], rgba[%f, %f, %f, %f]\n", 650cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson x0, y0, x1, y1, color[0], color[1], color[2], color[3]);*/ 651df04ffbf025994abd59e26c8439e77bb340ef20bGeorge Sapountzis 652df04ffbf025994abd59e26c8439e77bb340ef20bGeorge Sapountzis renderer_draw_conditional(r, 4 * 8); 653cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 654cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson /* 1st vertex */ 655cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson add_vertex_color(r, x0, y0, color); 656cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson /* 2nd vertex */ 657cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson add_vertex_color(r, x1, y0, color); 658a2f28ceea22254f09ee37039eec873ccdf689e6cMatt Turner /* 3rd vertex */ 65902986cb2cc1b1d47b26a653e9ae0fa508365f616Ian Romanick add_vertex_color(r, x1, y1, color); 66002986cb2cc1b1d47b26a653e9ae0fa508365f616Ian Romanick /* 4th vertex */ 66102986cb2cc1b1d47b26a653e9ae0fa508365f616Ian Romanick add_vertex_color(r, x0, y1, color); 662cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson} 663cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 664cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jacksonvoid renderer_draw_flush(struct xorg_renderer *r) 665cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{ 666cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson renderer_draw_conditional(r, 0); 667cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson} 668cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 669cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jacksonvoid renderer_begin_textures(struct xorg_renderer *r, 6700896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf int num_textures) 671cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{ 672cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson r->attrs_per_vertex = 1 + num_textures; 673cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson r->buffer_size = 0; 674cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson} 675cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 676cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jacksonvoid renderer_texture(struct xorg_renderer *r, 677cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson int *pos, 6785f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick int width, int height, 6795f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick struct pipe_sampler_view **sampler_view, 6805f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick int num_textures, 681c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg float *src_matrix, 6820896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf float *mask_matrix) 6830896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf{ 6840896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 6850896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf#if 0 6865f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick if (src_matrix) { 687cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson debug_printf("src_matrix = \n"); 6885f1f229f8da255ca9b390da1757ad781978cf619Ian Romanick debug_printf("%f, %f, %f\n", src_matrix[0], src_matrix[1], src_matrix[2]); 689cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson debug_printf("%f, %f, %f\n", src_matrix[3], src_matrix[4], src_matrix[5]); 690cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson debug_printf("%f, %f, %f\n", src_matrix[6], src_matrix[7], src_matrix[8]); 691cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson } 692cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson if (mask_matrix) { 693cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson debug_printf("mask_matrix = \n"); 694cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson debug_printf("%f, %f, %f\n", mask_matrix[0], mask_matrix[1], mask_matrix[2]); 695cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson debug_printf("%f, %f, %f\n", mask_matrix[3], mask_matrix[4], mask_matrix[5]); 696cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson debug_printf("%f, %f, %f\n", mask_matrix[6], mask_matrix[7], mask_matrix[8]); 697cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson } 698cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson#endif 699cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 700cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson switch(r->attrs_per_vertex) { 701cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson case 2: 702cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson renderer_draw_conditional(r, 4 * 8); 703cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson add_vertex_data1(r, 704cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson pos[0], pos[1], /* src */ 705c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg pos[4], pos[5], /* dst */ 7060896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf width, height, 707cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson sampler_view[0]->texture, src_matrix); 708cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson break; 709cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson case 3: 710cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson renderer_draw_conditional(r, 4 * 12); 711cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson add_vertex_data2(r, 7120896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pos[0], pos[1], /* src */ 713cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson pos[2], pos[3], /* mask */ 7140896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pos[4], pos[5], /* dst */ 715cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson width, height, 716cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson sampler_view[0]->texture, sampler_view[1]->texture, 717cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson src_matrix, mask_matrix); 718cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson break; 719cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson default: 720c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg debug_assert(!"Unsupported number of textures"); 7210896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf break; 722cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson } 723cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson} 724cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson