mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-24 08:50:13 +01:00
st/xorg: implement batching for the composite op
something is broken so disabled for now
This commit is contained in:
parent
4322346f3f
commit
e521bf7706
4 changed files with 161 additions and 90 deletions
|
|
@ -431,6 +431,14 @@ boolean xorg_composite_bind_state(struct exa_context *exa,
|
|||
|
||||
setup_transforms(exa, pSrcPicture, pMaskPicture);
|
||||
|
||||
if (exa->num_bound_samplers == 0 ) { /* solid fill */
|
||||
renderer_begin_solid(exa->renderer);
|
||||
} else {
|
||||
renderer_begin_textures(exa->renderer,
|
||||
exa->bound_textures,
|
||||
exa->num_bound_samplers);
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
|
@ -440,11 +448,9 @@ void xorg_composite(struct exa_context *exa,
|
|||
int dstX, int dstY, int width, int height)
|
||||
{
|
||||
if (exa->num_bound_samplers == 0 ) { /* solid fill */
|
||||
renderer_begin_solid(exa->renderer);
|
||||
renderer_solid(exa->renderer,
|
||||
dstX, dstY, dstX + width, dstY + height,
|
||||
exa->solid_color);
|
||||
renderer_draw_flush(exa->renderer);
|
||||
} else {
|
||||
int pos[6] = {srcX, srcY, maskX, maskY, dstX, dstY};
|
||||
float *src_matrix = NULL;
|
||||
|
|
@ -455,11 +461,19 @@ void xorg_composite(struct exa_context *exa,
|
|||
if (exa->transform.has_mask)
|
||||
mask_matrix = exa->transform.mask;
|
||||
|
||||
#if 1
|
||||
renderer_draw_textures(exa->renderer,
|
||||
pos, width, height,
|
||||
exa->bound_textures,
|
||||
exa->num_bound_samplers,
|
||||
src_matrix, mask_matrix);
|
||||
#else
|
||||
renderer_texture(exa->renderer,
|
||||
pos, width, height,
|
||||
exa->bound_textures,
|
||||
exa->num_bound_samplers,
|
||||
src_matrix, mask_matrix);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -89,6 +89,8 @@ exa_get_pipe_format(int depth, enum pipe_format *format, int *bbp)
|
|||
static void
|
||||
xorg_exa_common_done(struct exa_context *exa)
|
||||
{
|
||||
renderer_draw_flush(exa->renderer);
|
||||
|
||||
exa->copy.src = NULL;
|
||||
exa->copy.dst = NULL;
|
||||
exa->transform.has_src = FALSE;
|
||||
|
|
@ -276,8 +278,6 @@ ExaDone(PixmapPtr pPixmap)
|
|||
if (!priv)
|
||||
return;
|
||||
|
||||
renderer_draw_flush(exa->renderer);
|
||||
|
||||
xorg_exa_common_done(exa);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -73,7 +73,7 @@ renderer_draw(struct xorg_renderer *r)
|
|||
util_draw_vertex_buffer(pipe, buf, 0,
|
||||
PIPE_PRIM_QUADS,
|
||||
4, /* verts */
|
||||
2); /* attribs/vert */
|
||||
r->num_attributes); /* attribs/vert */
|
||||
|
||||
pipe_buffer_reference(&buf, NULL);
|
||||
}
|
||||
|
|
@ -138,11 +138,11 @@ add_vertex_1tex(struct xorg_renderer *r,
|
|||
r->num_vertices += 8;
|
||||
}
|
||||
|
||||
static struct pipe_buffer *
|
||||
setup_vertex_data1(struct xorg_renderer *r,
|
||||
float srcX, float srcY, float dstX, float dstY,
|
||||
float width, float height,
|
||||
struct pipe_texture *src, float *src_matrix)
|
||||
static void
|
||||
add_vertex_data1(struct xorg_renderer *r,
|
||||
float srcX, float srcY, float dstX, float dstY,
|
||||
float width, float height,
|
||||
struct pipe_texture *src, float *src_matrix)
|
||||
{
|
||||
float s0, t0, s1, t1;
|
||||
float pt0[2], pt1[2];
|
||||
|
|
@ -170,8 +170,6 @@ setup_vertex_data1(struct xorg_renderer *r,
|
|||
add_vertex_1tex(r, dstX + width, dstY + height, s1, t1);
|
||||
/* 4th vertex */
|
||||
add_vertex_1tex(r, dstX, dstY + height, s0, t1);
|
||||
|
||||
return renderer_buffer_create(r);
|
||||
}
|
||||
|
||||
static struct pipe_buffer *
|
||||
|
|
@ -217,13 +215,13 @@ add_vertex_2tex(struct xorg_renderer *r,
|
|||
r->num_vertices += 12;
|
||||
}
|
||||
|
||||
static struct pipe_buffer *
|
||||
setup_vertex_data2(struct xorg_renderer *r,
|
||||
float srcX, float srcY, float maskX, float maskY,
|
||||
float dstX, float dstY, float width, float height,
|
||||
struct pipe_texture *src,
|
||||
struct pipe_texture *mask,
|
||||
float *src_matrix, float *mask_matrix)
|
||||
static void
|
||||
add_vertex_data2(struct xorg_renderer *r,
|
||||
float srcX, float srcY, float maskX, float maskY,
|
||||
float dstX, float dstY, float width, float height,
|
||||
struct pipe_texture *src,
|
||||
struct pipe_texture *mask,
|
||||
float *src_matrix, float *mask_matrix)
|
||||
{
|
||||
float src_s0, src_t0, src_s1, src_t1;
|
||||
float mask_s0, mask_t0, mask_s1, mask_t1;
|
||||
|
|
@ -272,9 +270,6 @@ setup_vertex_data2(struct xorg_renderer *r,
|
|||
/* 4th vertex */
|
||||
add_vertex_2tex(r, dstX, dstY + height,
|
||||
src_s0, src_t1, mask_s0, mask_t1);
|
||||
|
||||
|
||||
return renderer_buffer_create(r);
|
||||
}
|
||||
|
||||
static struct pipe_buffer *
|
||||
|
|
@ -835,67 +830,6 @@ void renderer_copy_pixmap(struct xorg_renderer *r,
|
|||
}
|
||||
}
|
||||
|
||||
void renderer_draw_textures(struct xorg_renderer *r,
|
||||
int *pos,
|
||||
int width, int height,
|
||||
struct pipe_texture **textures,
|
||||
int num_textures,
|
||||
float *src_matrix, float *mask_matrix)
|
||||
{
|
||||
struct pipe_context *pipe = r->pipe;
|
||||
struct pipe_buffer *buf = 0;
|
||||
|
||||
#if 0
|
||||
if (src_matrix) {
|
||||
debug_printf("src_matrix = \n");
|
||||
debug_printf("%f, %f, %f\n", src_matrix[0], src_matrix[1], src_matrix[2]);
|
||||
debug_printf("%f, %f, %f\n", src_matrix[3], src_matrix[4], src_matrix[5]);
|
||||
debug_printf("%f, %f, %f\n", src_matrix[6], src_matrix[7], src_matrix[8]);
|
||||
}
|
||||
if (mask_matrix) {
|
||||
debug_printf("mask_matrix = \n");
|
||||
debug_printf("%f, %f, %f\n", mask_matrix[0], mask_matrix[1], mask_matrix[2]);
|
||||
debug_printf("%f, %f, %f\n", mask_matrix[3], mask_matrix[4], mask_matrix[5]);
|
||||
debug_printf("%f, %f, %f\n", mask_matrix[6], mask_matrix[7], mask_matrix[8]);
|
||||
}
|
||||
#endif
|
||||
|
||||
switch(num_textures) {
|
||||
case 1:
|
||||
buf = setup_vertex_data1(r,
|
||||
pos[0], pos[1], /* src */
|
||||
pos[4], pos[5], /* dst */
|
||||
width, height,
|
||||
textures[0], src_matrix);
|
||||
break;
|
||||
case 2:
|
||||
buf = setup_vertex_data2(r,
|
||||
pos[0], pos[1], /* src */
|
||||
pos[2], pos[3], /* mask */
|
||||
pos[4], pos[5], /* dst */
|
||||
width, height,
|
||||
textures[0], textures[1],
|
||||
src_matrix, mask_matrix);
|
||||
break;
|
||||
case 3:
|
||||
default:
|
||||
debug_assert(!"Unsupported number of textures");
|
||||
break;
|
||||
}
|
||||
|
||||
if (buf) {
|
||||
int num_attribs = 1; /*pos*/
|
||||
num_attribs += num_textures;
|
||||
|
||||
util_draw_vertex_buffer(pipe, buf, 0,
|
||||
PIPE_PRIM_QUADS,
|
||||
4, /* verts */
|
||||
num_attribs); /* attribs/vert */
|
||||
|
||||
pipe_buffer_reference(&buf, NULL);
|
||||
}
|
||||
}
|
||||
|
||||
void renderer_draw_yuv(struct xorg_renderer *r,
|
||||
int src_x, int src_y, int src_w, int src_h,
|
||||
int dst_x, int dst_y, int dst_w, int dst_h,
|
||||
|
|
@ -924,6 +858,7 @@ void renderer_draw_yuv(struct xorg_renderer *r,
|
|||
void renderer_begin_solid(struct xorg_renderer *r)
|
||||
{
|
||||
r->num_vertices = 0;
|
||||
r->num_attributes = 2;
|
||||
}
|
||||
|
||||
void renderer_solid(struct xorg_renderer *r,
|
||||
|
|
@ -951,3 +886,110 @@ void renderer_draw_flush(struct xorg_renderer *r)
|
|||
{
|
||||
renderer_draw_conditional(r, 0);
|
||||
}
|
||||
|
||||
void renderer_begin_textures(struct xorg_renderer *r,
|
||||
struct pipe_texture **textures,
|
||||
int num_textures)
|
||||
{
|
||||
r->num_attributes = 1 + num_textures;
|
||||
}
|
||||
|
||||
void renderer_texture(struct xorg_renderer *r,
|
||||
int *pos,
|
||||
int width, int height,
|
||||
struct pipe_texture **textures,
|
||||
int num_textures,
|
||||
float *src_matrix,
|
||||
float *mask_matrix)
|
||||
{
|
||||
|
||||
#if 0
|
||||
if (src_matrix) {
|
||||
debug_printf("src_matrix = \n");
|
||||
debug_printf("%f, %f, %f\n", src_matrix[0], src_matrix[1], src_matrix[2]);
|
||||
debug_printf("%f, %f, %f\n", src_matrix[3], src_matrix[4], src_matrix[5]);
|
||||
debug_printf("%f, %f, %f\n", src_matrix[6], src_matrix[7], src_matrix[8]);
|
||||
}
|
||||
if (mask_matrix) {
|
||||
debug_printf("mask_matrix = \n");
|
||||
debug_printf("%f, %f, %f\n", mask_matrix[0], mask_matrix[1], mask_matrix[2]);
|
||||
debug_printf("%f, %f, %f\n", mask_matrix[3], mask_matrix[4], mask_matrix[5]);
|
||||
debug_printf("%f, %f, %f\n", mask_matrix[6], mask_matrix[7], mask_matrix[8]);
|
||||
}
|
||||
#endif
|
||||
|
||||
switch(r->num_attributes) {
|
||||
case 2:
|
||||
renderer_draw_conditional(r, 4 * 8);
|
||||
add_vertex_data1(r,
|
||||
pos[0], pos[1], /* src */
|
||||
pos[4], pos[5], /* dst */
|
||||
width, height,
|
||||
textures[0], src_matrix);
|
||||
break;
|
||||
case 3:
|
||||
renderer_draw_conditional(r, 4 * 12);
|
||||
add_vertex_data2(r,
|
||||
pos[0], pos[1], /* src */
|
||||
pos[2], pos[3], /* mask */
|
||||
pos[4], pos[5], /* dst */
|
||||
width, height,
|
||||
textures[0], textures[1],
|
||||
src_matrix, mask_matrix);
|
||||
break;
|
||||
default:
|
||||
debug_assert(!"Unsupported number of textures");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void renderer_draw_textures(struct xorg_renderer *r,
|
||||
int *pos,
|
||||
int width, int height,
|
||||
struct pipe_texture **textures,
|
||||
int num_textures,
|
||||
float *src_matrix, float *mask_matrix)
|
||||
{
|
||||
#if 0
|
||||
if (src_matrix) {
|
||||
debug_printf("src_matrix = \n");
|
||||
debug_printf("%f, %f, %f\n", src_matrix[0], src_matrix[1], src_matrix[2]);
|
||||
debug_printf("%f, %f, %f\n", src_matrix[3], src_matrix[4], src_matrix[5]);
|
||||
debug_printf("%f, %f, %f\n", src_matrix[6], src_matrix[7], src_matrix[8]);
|
||||
}
|
||||
if (mask_matrix) {
|
||||
debug_printf("mask_matrix = \n");
|
||||
debug_printf("%f, %f, %f\n", mask_matrix[0], mask_matrix[1], mask_matrix[2]);
|
||||
debug_printf("%f, %f, %f\n", mask_matrix[3], mask_matrix[4], mask_matrix[5]);
|
||||
debug_printf("%f, %f, %f\n", mask_matrix[6], mask_matrix[7], mask_matrix[8]);
|
||||
}
|
||||
#endif
|
||||
|
||||
r->num_attributes = 1 + num_textures;
|
||||
switch(num_textures) {
|
||||
case 1:
|
||||
add_vertex_data1(r,
|
||||
pos[0], pos[1], /* src */
|
||||
pos[4], pos[5], /* dst */
|
||||
width, height,
|
||||
textures[0], src_matrix);
|
||||
break;
|
||||
case 2:
|
||||
add_vertex_data2(r,
|
||||
pos[0], pos[1], /* src */
|
||||
pos[2], pos[3], /* mask */
|
||||
pos[4], pos[5], /* dst */
|
||||
width, height,
|
||||
textures[0], textures[1],
|
||||
src_matrix, mask_matrix);
|
||||
break;
|
||||
case 3:
|
||||
default:
|
||||
debug_assert(!"Unsupported number of textures");
|
||||
break;
|
||||
}
|
||||
|
||||
renderer_draw(r);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -26,6 +26,8 @@ struct xorg_renderer {
|
|||
|
||||
float vertices[BUF_SIZE];
|
||||
int num_vertices;
|
||||
|
||||
int num_attributes;
|
||||
};
|
||||
|
||||
struct xorg_renderer *renderer_create(struct pipe_context *pipe);
|
||||
|
|
@ -45,13 +47,6 @@ void renderer_copy_pixmap(struct xorg_renderer *r,
|
|||
struct exa_pixmap_priv *src_priv, int sx, int sy,
|
||||
int width, int height);
|
||||
|
||||
void renderer_draw_textures(struct xorg_renderer *r,
|
||||
int *pos,
|
||||
int width, int height,
|
||||
struct pipe_texture **textures,
|
||||
int num_textures,
|
||||
float *src_matrix,
|
||||
float *mask_matrix);
|
||||
|
||||
void renderer_draw_yuv(struct xorg_renderer *r,
|
||||
int src_x, int src_y, int src_w, int src_h,
|
||||
|
|
@ -64,6 +59,26 @@ void renderer_solid(struct xorg_renderer *r,
|
|||
int x1, int y1,
|
||||
float *color);
|
||||
|
||||
void renderer_begin_textures(struct xorg_renderer *r,
|
||||
struct pipe_texture **textures,
|
||||
int num_textures);
|
||||
void renderer_texture(struct xorg_renderer *r,
|
||||
int *pos,
|
||||
int width, int height,
|
||||
struct pipe_texture **textures,
|
||||
int num_textures,
|
||||
float *src_matrix,
|
||||
float *mask_matrix);
|
||||
|
||||
void renderer_draw_flush(struct xorg_renderer *r);
|
||||
|
||||
|
||||
void renderer_draw_textures(struct xorg_renderer *r,
|
||||
int *pos,
|
||||
int width, int height,
|
||||
struct pipe_texture **textures,
|
||||
int num_textures,
|
||||
float *src_matrix, float *mask_matrix);
|
||||
|
||||
|
||||
#endif
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue