make new pipes have an env var for tuning, remove old comment code,

fix up yuv and maps to use pipes too. yes lines just flush it all - so
be it. :) who uses lines anyway?



SVN revision: 50918
This commit is contained in:
Carsten Haitzler 2010-08-09 04:42:15 +00:00
parent 66cace4f44
commit 6320a8db84
2 changed files with 273 additions and 115 deletions

View File

@ -57,8 +57,8 @@
#define SHAD_TEXUV2 3 #define SHAD_TEXUV2 3
#define SHAD_TEXUV3 4 #define SHAD_TEXUV3 4
//#define MAX_PIPES 1 #define MAX_CUTOUT 512
#define MAX_PIPES 32 #define MAX_PIPES 128
typedef struct _Evas_GL_Program Evas_GL_Program; typedef struct _Evas_GL_Program Evas_GL_Program;
typedef struct _Evas_GL_Program_Source Evas_GL_Program_Source; typedef struct _Evas_GL_Program_Source Evas_GL_Program_Source;
@ -100,6 +100,7 @@ struct _Evas_GL_Shared
Eina_Bool tex_rect : 1; Eina_Bool tex_rect : 1;
// tuning params - per gpu/cpu combo? // tuning params - per gpu/cpu combo?
int cutout_max; int cutout_max;
int pipes_max;
} info; } info;
struct { struct {

View File

@ -412,9 +412,19 @@ evas_gl_common_context_new(void)
glGetIntegerv(GL_MAX_TEXTURE_SIZE, glGetIntegerv(GL_MAX_TEXTURE_SIZE,
&(shared->info.max_texture_size)); &(shared->info.max_texture_size));
shared->info.cutout_max = 512; // hmmm is this good? shared->info.cutout_max = MAX_CUTOUT;
shared->info.pipes_max = MAX_PIPES;
if (getenv("EVAS_GL_CUTOUT_MAX")) if (getenv("EVAS_GL_CUTOUT_MAX"))
shared->info.cutout_max = atoi(getenv("EVAS_GL_CUTOUT_MAX")); shared->info.cutout_max = atoi(getenv("EVAS_GL_CUTOUT_MAX"));
if (getenv("EVAS_GL_PIPES_MAX"))
{
shared->info.pipes_max = atoi(getenv("EVAS_GL_PIPES_MAX"));
if (shared->info.pipes_max > MAX_PIPES)
shared->info.pipes_max = MAX_PIPES;
else if (shared->info.pipes_max < 1)
shared->info.pipes_max = 1;
}
fprintf(stderr, "max tex size %ix%i\n" fprintf(stderr, "max tex size %ix%i\n"
"max units %i\n" "max units %i\n"
@ -424,6 +434,7 @@ evas_gl_common_context_new(void)
"max ansiotropic filtering: %3.3f\n" "max ansiotropic filtering: %3.3f\n"
"\n" "\n"
"cutout max: %i\n" "cutout max: %i\n"
"pipes max: %i\n"
, ,
shared->info.max_texture_size, shared->info.max_texture_size, shared->info.max_texture_size, shared->info.max_texture_size,
shared->info.max_texture_units, shared->info.max_texture_units,
@ -432,7 +443,8 @@ evas_gl_common_context_new(void)
(int)shared->info.bgra, (int)shared->info.bgra,
(double)shared->info.anisotropic, (double)shared->info.anisotropic,
shared->info.cutout_max shared->info.cutout_max,
shared->info.pipes_max
); );
glDisable(GL_DEPTH_TEST); glDisable(GL_DEPTH_TEST);
@ -603,7 +615,7 @@ evas_gl_common_context_free(Evas_GL_Context *gc)
} }
for (i = 0; i < MAX_PIPES; i++) for (i = 0; i < gc->shared->info.pipes_max; i++)
{ {
if (gc->pipe[i].array.vertex) free(gc->pipe[i].array.vertex); if (gc->pipe[i].array.vertex) free(gc->pipe[i].array.vertex);
if (gc->pipe[i].array.color) free(gc->pipe[i].array.color); if (gc->pipe[i].array.color) free(gc->pipe[i].array.color);
@ -631,9 +643,6 @@ evas_gl_common_context_newframe(Evas_GL_Context *gc)
// printf("prev frame flushnum = %i\n", gc->flushnum); // printf("prev frame flushnum = %i\n", gc->flushnum);
gc->flushnum = 0; gc->flushnum = 0;
/// printf("\n\n\n\n\n\n\n\n"
/// "=========================NEW FRAME!========================="
/// "\n\n");
gc->state.current.cur_prog = 0; gc->state.current.cur_prog = 0;
gc->state.current.cur_tex = 0; gc->state.current.cur_tex = 0;
gc->state.current.cur_texu = 0; gc->state.current.cur_texu = 0;
@ -646,19 +655,23 @@ evas_gl_common_context_newframe(Evas_GL_Context *gc)
gc->state.current.smooth = 0; gc->state.current.smooth = 0;
gc->state.current.blend = 0; gc->state.current.blend = 0;
gc->state.current.clip = 0; gc->state.current.clip = 0;
gc->state.current.cx = 0;
gc->state.current.cy = 0;
gc->state.current.cw = 0;
gc->state.current.ch = 0;
for (i = 0; i < MAX_PIPES; i++) for (i = 0; i < gc->shared->info.pipes_max; i++)
{ {
gc->pipe[i].region.x = 0; gc->pipe[i].region.x = 0;
gc->pipe[i].region.y = 0; gc->pipe[i].region.y = 0;
gc->pipe[i].region.w = 0; gc->pipe[i].region.w = 0;
gc->pipe[i].region.h = 0; gc->pipe[i].region.h = 0;
gc->pipe[i].region.type = 0; gc->pipe[i].region.type = 0;
gc->pipe[i].clip.active = 0;
gc->pipe[i].clip.x = 0; gc->pipe[i].clip.x = 0;
gc->pipe[i].clip.y = 0; gc->pipe[i].clip.y = 0;
gc->pipe[i].clip.w = 0; gc->pipe[i].clip.w = 0;
gc->pipe[i].clip.h = 0; gc->pipe[i].clip.h = 0;
gc->pipe[i].clip.active = 0;
gc->pipe[i].shader.surface = NULL; gc->pipe[i].shader.surface = NULL;
gc->pipe[i].shader.cur_prog = 0; gc->pipe[i].shader.cur_prog = 0;
gc->pipe[i].shader.cur_tex = 0; gc->pipe[i].shader.cur_tex = 0;
@ -672,6 +685,10 @@ evas_gl_common_context_newframe(Evas_GL_Context *gc)
gc->pipe[i].shader.smooth = 0; gc->pipe[i].shader.smooth = 0;
gc->pipe[i].shader.blend = 0; gc->pipe[i].shader.blend = 0;
gc->pipe[i].shader.clip = 0; gc->pipe[i].shader.clip = 0;
gc->pipe[i].shader.cx = 0;
gc->pipe[i].shader.cy = 0;
gc->pipe[i].shader.cw = 0;
gc->pipe[i].shader.ch = 0;
} }
gc->change.size = 1; gc->change.size = 1;
@ -819,10 +836,14 @@ pipe_region_intersects(Evas_GL_Context *gc, int n,
ry = gc->pipe[n].region.y; ry = gc->pipe[n].region.y;
rw = gc->pipe[n].region.w; rw = gc->pipe[n].region.w;
rh = gc->pipe[n].region.h; rh = gc->pipe[n].region.h;
/// printf("CHECK region %3i %3i %3ix%3i in pipe [%2i] with %3i %3i %3ix%3i\n",
/// x, y, w, h, n, rx, ry, rw, rh);
if (!RECTS_INTERSECT(x, y, w, h, rx, ry, rw, rh)) if (!RECTS_INTERSECT(x, y, w, h, rx, ry, rw, rh))
return 0; return 0;
// a hack for now. map pipes use their whole bounding box for intersects
// which at worst case reduces to old pipeline flushes, but cheaper than
// full quad region or triangle intersects right now
if (gc->pipe[n].region.type == RTYPE_MAP) return 1;
for (i = 0, for (i = 0,
ii = 0; ii = 0;
@ -838,8 +859,6 @@ pipe_region_intersects(Evas_GL_Context *gc, int n,
ry = gc->pipe[n].array.vertex[ii + 1]; ry = gc->pipe[n].array.vertex[ii + 1];
rw = gc->pipe[n].array.vertex[ii + 3] - rx; rw = gc->pipe[n].array.vertex[ii + 3] - rx;
rh = gc->pipe[n].array.vertex[ii + 7] - ry; rh = gc->pipe[n].array.vertex[ii + 7] - ry;
/// printf("CHECK sub %3i %3i %3ix%3i in pipe [%2i] with %3i %3i %3ix%3i\n",
/// x, y, w, h, n, rx, ry, rw, rh);
if (RECTS_INTERSECT(x, y, w, h, rx, ry, rw, rh)) if (RECTS_INTERSECT(x, y, w, h, rx, ry, rw, rh))
return 1; return 1;
} }
@ -858,9 +877,6 @@ pipe_region_expand(Evas_GL_Context *gc, int n,
gc->pipe[n].region.y = y; gc->pipe[n].region.y = y;
gc->pipe[n].region.w = w; gc->pipe[n].region.w = w;
gc->pipe[n].region.h = h; gc->pipe[n].region.h = h;
/// printf("SET pipe [%2i][%i] to %3i %3i %3ix%3i\n",
/// n, gc->pipe[n].region.type,
/// x, y, w, h);
return; return;
} }
x1 = gc->pipe[n].region.x; x1 = gc->pipe[n].region.x;
@ -875,12 +891,6 @@ pipe_region_expand(Evas_GL_Context *gc, int n,
gc->pipe[n].region.y = y1; gc->pipe[n].region.y = y1;
gc->pipe[n].region.w = x2 - x1; gc->pipe[n].region.w = x2 - x1;
gc->pipe[n].region.h = y2 - y1; gc->pipe[n].region.h = y2 - y1;
/// printf("EXPAND pipe [%2i][%i] to %3i %3i %3ix%3i\n",
/// n, gc->pipe[n].region.type,
/// x1,
/// y1,
/// x2 - x1,
/// y2 - y1);
} }
void void
@ -894,11 +904,10 @@ evas_gl_common_context_line_push(Evas_GL_Context *gc,
GLuint prog = gc->shared->shader.rect.prog; GLuint prog = gc->shared->shader.rect.prog;
int pn = 0; int pn = 0;
shader_array_flush(gc);
if (a < 255) blend = 1; if (a < 255) blend = 1;
if (gc->dc->render_op == EVAS_RENDER_COPY) blend = 0; if (gc->dc->render_op == EVAS_RENDER_COPY) blend = 0;
shader_array_flush(gc);
again: again:
pn = gc->state.top_pipe; pn = gc->state.top_pipe;
gc->pipe[pn].shader.cur_tex = 0; gc->pipe[pn].shader.cur_tex = 0;
@ -953,7 +962,6 @@ evas_gl_common_context_rectangle_push(Evas_GL_Context *gc,
if (a < 255) blend = 1; if (a < 255) blend = 1;
if (gc->dc->render_op == EVAS_RENDER_COPY) blend = 0; if (gc->dc->render_op == EVAS_RENDER_COPY) blend = 0;
/*xxx*/ shader_array_flush(gc);
again: again:
pn = gc->state.top_pipe; pn = gc->state.top_pipe;
#ifdef GLPIPES #ifdef GLPIPES
@ -965,17 +973,16 @@ again:
gc->pipe[pn].shader.blend = blend; gc->pipe[pn].shader.blend = blend;
gc->pipe[pn].shader.render_op = gc->dc->render_op; gc->pipe[pn].shader.render_op = gc->dc->render_op;
gc->pipe[pn].shader.clip = 0; gc->pipe[pn].shader.clip = 0;
gc->pipe[pn].shader.cx = 0;
gc->pipe[pn].shader.cy = 0;
gc->pipe[pn].shader.cw = 0;
gc->pipe[pn].shader.ch = 0;
gc->pipe[pn].array.line = 0; gc->pipe[pn].array.line = 0;
gc->pipe[pn].array.use_vertex = 1; gc->pipe[pn].array.use_vertex = 1;
gc->pipe[pn].array.use_color = 1; gc->pipe[pn].array.use_color = 1;
gc->pipe[pn].array.use_texuv = 0; gc->pipe[pn].array.use_texuv = 0;
gc->pipe[pn].array.use_texuv2 = 0; gc->pipe[pn].array.use_texuv2 = 0;
gc->pipe[pn].array.use_texuv3 = 0; gc->pipe[pn].array.use_texuv3 = 0;
/// printf(" rec %i -> %i, size %i %i %ix%i\n",
/// gc->pipe[i].shader.cur_tex,
/// 0,
/// x, y, w, h);
} }
else else
{ {
@ -983,48 +990,39 @@ again:
for (i = pn; i >= 0; i--) for (i = pn; i >= 0; i--)
{ {
if ((gc->pipe[i].region.type == RTYPE_RECT)
/// printf(" rec %i == %i, size %i %i %ix%i\n", && (gc->pipe[i].shader.cur_tex == 0)
/// gc->pipe[i].shader.cur_tex,
/// 0,
/// x, y, w, h);
if ((gc->pipe[i].shader.cur_tex == 0)
&& (gc->pipe[i].shader.cur_prog == prog) && (gc->pipe[i].shader.cur_prog == prog)
&& (gc->pipe[i].shader.blend == blend) && (gc->pipe[i].shader.blend == blend)
&& (gc->pipe[i].shader.render_op == gc->dc->render_op) && (gc->pipe[i].shader.render_op == gc->dc->render_op)
&& (gc->pipe[i].shader.clip == 0) && (gc->pipe[i].shader.clip == 0)
) )
{ {
/// printf(" drop %i -> %i\n", pn, i);
found = 1; found = 1;
pn = i; pn = i;
break; break;
} }
// if (i != pn) if (pipe_region_intersects(gc, i, x, y, w, h)) break;
{
if (pipe_region_intersects(gc, i, x, y, w, h))
{
/// printf(" abort drop. interset @ %i\n", i);
break;
}
}
} }
if (!found) if (!found)
{ {
pn = gc->state.top_pipe + 1; pn = gc->state.top_pipe + 1;
if (pn >= MAX_PIPES) if (pn >= gc->shared->info.pipes_max)
{ {
shader_array_flush(gc); shader_array_flush(gc);
goto again; goto again;
} }
gc->state.top_pipe = pn; gc->state.top_pipe = pn;
gc->pipe[pn].region.type = RTYPE_RECT;
gc->pipe[pn].shader.cur_tex = 0; gc->pipe[pn].shader.cur_tex = 0;
gc->pipe[pn].shader.cur_prog = prog; gc->pipe[pn].shader.cur_prog = prog;
gc->pipe[pn].shader.blend = blend; gc->pipe[pn].shader.blend = blend;
gc->pipe[pn].shader.render_op = gc->dc->render_op; gc->pipe[pn].shader.render_op = gc->dc->render_op;
gc->pipe[pn].shader.clip = 0; gc->pipe[pn].shader.clip = 0;
gc->pipe[pn].region.type = RTYPE_RECT; gc->pipe[pn].shader.cx = 0;
gc->pipe[pn].shader.cy = 0;
gc->pipe[pn].shader.cw = 0;
gc->pipe[pn].shader.ch = 0;
gc->pipe[pn].array.line = 0; gc->pipe[pn].array.line = 0;
gc->pipe[pn].array.use_vertex = 1; gc->pipe[pn].array.use_vertex = 1;
gc->pipe[pn].array.use_color = 1; gc->pipe[pn].array.use_color = 1;
@ -1048,6 +1046,10 @@ again:
gc->pipe[pn].shader.blend = blend; gc->pipe[pn].shader.blend = blend;
gc->pipe[pn].shader.render_op = gc->dc->render_op; gc->pipe[pn].shader.render_op = gc->dc->render_op;
gc->pipe[pn].shader.clip = 0; gc->pipe[pn].shader.clip = 0;
gc->pipe[pn].shader.cx = 0;
gc->pipe[pn].shader.cy = 0;
gc->pipe[pn].shader.cw = 0;
gc->pipe[pn].shader.ch = 0;
} }
gc->pipe[pn].region.type = RTYPE_RECT; gc->pipe[pn].region.type = RTYPE_RECT;
@ -1134,6 +1136,10 @@ again:
gc->pipe[pn].shader.blend = blend; gc->pipe[pn].shader.blend = blend;
gc->pipe[pn].shader.render_op = gc->dc->render_op; gc->pipe[pn].shader.render_op = gc->dc->render_op;
gc->pipe[pn].shader.clip = 0; gc->pipe[pn].shader.clip = 0;
gc->pipe[pn].shader.cx = 0;
gc->pipe[pn].shader.cy = 0;
gc->pipe[pn].shader.cw = 0;
gc->pipe[pn].shader.ch = 0;
gc->pipe[pn].array.line = 0; gc->pipe[pn].array.line = 0;
gc->pipe[pn].array.use_vertex = 1; gc->pipe[pn].array.use_vertex = 1;
// if nomul... dont need this // if nomul... dont need this
@ -1141,11 +1147,6 @@ again:
gc->pipe[pn].array.use_texuv = 1; gc->pipe[pn].array.use_texuv = 1;
gc->pipe[pn].array.use_texuv2 = 0; gc->pipe[pn].array.use_texuv2 = 0;
gc->pipe[pn].array.use_texuv3 = 0; gc->pipe[pn].array.use_texuv3 = 0;
/// printf(" tex %i -> %i, size %i %i %ix%i\n",
/// gc->pipe[i].shader.cur_tex,
/// tex->pt->texture,
/// x, y, w, h);
} }
else else
{ {
@ -1153,11 +1154,8 @@ again:
for (i = pn; i >= 0; i--) for (i = pn; i >= 0; i--)
{ {
/// printf(" tex %i == %i, size %i %i %ix%i\n", if ((gc->pipe[i].region.type == RTYPE_IMAGE)
/// gc->pipe[i].shader.cur_tex, && (gc->pipe[i].shader.cur_tex == tex->pt->texture)
/// tex->pt->texture,
/// x, y, w, h);
if ((gc->pipe[i].shader.cur_tex == tex->pt->texture)
&& (gc->pipe[i].shader.cur_prog == prog) && (gc->pipe[i].shader.cur_prog == prog)
&& (gc->pipe[i].shader.smooth == smooth) && (gc->pipe[i].shader.smooth == smooth)
&& (gc->pipe[i].shader.blend == blend) && (gc->pipe[i].shader.blend == blend)
@ -1165,24 +1163,16 @@ again:
&& (gc->pipe[i].shader.clip == 0) && (gc->pipe[i].shader.clip == 0)
) )
{ {
/// printf(" drop %i -> %i\n", pn, i);
found = 1; found = 1;
pn = i; pn = i;
break; break;
} }
// if (i != pn) if (pipe_region_intersects(gc, i, x, y, w, h)) break;
{
if (pipe_region_intersects(gc, i, x, y, w, h))
{
/// printf(" abort drop. interset @ %i\n", i);
break;
}
}
} }
if (!found) if (!found)
{ {
pn = gc->state.top_pipe + 1; pn = gc->state.top_pipe + 1;
if (pn >= MAX_PIPES) if (pn >= gc->shared->info.pipes_max)
{ {
shader_array_flush(gc); shader_array_flush(gc);
goto again; goto again;
@ -1195,6 +1185,10 @@ again:
gc->pipe[pn].shader.blend = blend; gc->pipe[pn].shader.blend = blend;
gc->pipe[pn].shader.render_op = gc->dc->render_op; gc->pipe[pn].shader.render_op = gc->dc->render_op;
gc->pipe[pn].shader.clip = 0; gc->pipe[pn].shader.clip = 0;
gc->pipe[pn].shader.cx = 0;
gc->pipe[pn].shader.cy = 0;
gc->pipe[pn].shader.cw = 0;
gc->pipe[pn].shader.ch = 0;
gc->pipe[pn].array.line = 0; gc->pipe[pn].array.line = 0;
gc->pipe[pn].array.use_vertex = 1; gc->pipe[pn].array.use_vertex = 1;
// if nomul... dont need this // if nomul... dont need this
@ -1231,6 +1225,10 @@ again:
gc->pipe[pn].shader.blend = blend; gc->pipe[pn].shader.blend = blend;
gc->pipe[pn].shader.render_op = gc->dc->render_op; gc->pipe[pn].shader.render_op = gc->dc->render_op;
gc->pipe[pn].shader.clip = 0; gc->pipe[pn].shader.clip = 0;
gc->pipe[pn].shader.cx = 0;
gc->pipe[pn].shader.cy = 0;
gc->pipe[pn].shader.cw = 0;
gc->pipe[pn].shader.ch = 0;
} }
if ((tex->im) && (tex->im->native.data)) if ((tex->im) && (tex->im->native.data))
{ {
@ -1319,6 +1317,10 @@ again:
gc->pipe[pn].shader.blend = 1; gc->pipe[pn].shader.blend = 1;
gc->pipe[pn].shader.render_op = gc->dc->render_op; gc->pipe[pn].shader.render_op = gc->dc->render_op;
gc->pipe[pn].shader.clip = 0; gc->pipe[pn].shader.clip = 0;
gc->pipe[pn].shader.cx = 0;
gc->pipe[pn].shader.cy = 0;
gc->pipe[pn].shader.cw = 0;
gc->pipe[pn].shader.ch = 0;
gc->pipe[pn].array.line = 0; gc->pipe[pn].array.line = 0;
gc->pipe[pn].array.use_vertex = 1; gc->pipe[pn].array.use_vertex = 1;
gc->pipe[pn].array.use_color = 1; gc->pipe[pn].array.use_color = 1;
@ -1332,11 +1334,8 @@ again:
for (i = pn; i >= 0; i--) for (i = pn; i >= 0; i--)
{ {
/// printf(" fon %i == %i, size %i %i %ix%i\n", if ((gc->pipe[i].region.type == RTYPE_FONT)
/// gc->pipe[i].shader.cur_tex, && (gc->pipe[i].shader.cur_tex == tex->pt->texture)
/// tex->pt->texture,
/// x, y, w, h);
if ((gc->pipe[i].shader.cur_tex == tex->pt->texture)
&& (gc->pipe[i].shader.cur_prog == gc->shared->shader.font.prog) && (gc->pipe[i].shader.cur_prog == gc->shared->shader.font.prog)
&& (gc->pipe[i].shader.smooth == 0) && (gc->pipe[i].shader.smooth == 0)
&& (gc->pipe[i].shader.blend == 1) && (gc->pipe[i].shader.blend == 1)
@ -1344,24 +1343,16 @@ again:
&& (gc->pipe[i].shader.clip == 0) && (gc->pipe[i].shader.clip == 0)
) )
{ {
/// printf(" drop %i -> %i\n", pn, i);
found = 1; found = 1;
pn = i; pn = i;
break; break;
} }
// if (i != pn) if (pipe_region_intersects(gc, i, x, y, w, h)) break;
{
if (pipe_region_intersects(gc, i, x, y, w, h))
{
/// printf(" abort drop. interset @ %i\n", i);
break;
}
}
} }
if (!found) if (!found)
{ {
pn = gc->state.top_pipe + 1; pn = gc->state.top_pipe + 1;
if (pn >= MAX_PIPES) if (pn >= gc->shared->info.pipes_max)
{ {
shader_array_flush(gc); shader_array_flush(gc);
goto again; goto again;
@ -1374,6 +1365,10 @@ again:
gc->pipe[pn].shader.blend = 1; gc->pipe[pn].shader.blend = 1;
gc->pipe[pn].shader.render_op = gc->dc->render_op; gc->pipe[pn].shader.render_op = gc->dc->render_op;
gc->pipe[pn].shader.clip = 0; gc->pipe[pn].shader.clip = 0;
gc->pipe[pn].shader.cx = 0;
gc->pipe[pn].shader.cy = 0;
gc->pipe[pn].shader.cw = 0;
gc->pipe[pn].shader.ch = 0;
gc->pipe[pn].array.line = 0; gc->pipe[pn].array.line = 0;
gc->pipe[pn].array.use_vertex = 1; gc->pipe[pn].array.use_vertex = 1;
gc->pipe[pn].array.use_color = 1; gc->pipe[pn].array.use_color = 1;
@ -1398,6 +1393,10 @@ again:
gc->pipe[pn].shader.blend = 1; gc->pipe[pn].shader.blend = 1;
gc->pipe[pn].shader.render_op = gc->dc->render_op; gc->pipe[pn].shader.render_op = gc->dc->render_op;
gc->pipe[pn].shader.clip = 0; gc->pipe[pn].shader.clip = 0;
gc->pipe[pn].shader.cx = 0;
gc->pipe[pn].shader.cy = 0;
gc->pipe[pn].shader.cw = 0;
gc->pipe[pn].shader.ch = 0;
} }
gc->pipe[pn].region.type = RTYPE_FONT; gc->pipe[pn].region.type = RTYPE_FONT;
@ -1474,9 +1473,79 @@ evas_gl_common_context_yuv_push(Evas_GL_Context *gc,
else else
prog = gc->shared->shader.yuv.prog; prog = gc->shared->shader.yuv.prog;
/*xxx*/ shader_array_flush(gc);
again: again:
pn = gc->state.top_pipe; pn = gc->state.top_pipe;
#ifdef GLPIPES
if ((pn == 0) && (gc->pipe[pn].array.num == 0))
{
gc->pipe[pn].region.type = RTYPE_YUV;
gc->pipe[pn].shader.cur_tex = tex->pt->texture;
gc->pipe[pn].shader.cur_prog = gc->shared->shader.font.prog;
gc->pipe[pn].shader.smooth = smooth;
gc->pipe[pn].shader.blend = blend;
gc->pipe[pn].shader.render_op = gc->dc->render_op;
gc->pipe[pn].shader.clip = 0;
gc->pipe[pn].shader.cx = 0;
gc->pipe[pn].shader.cy = 0;
gc->pipe[pn].shader.cw = 0;
gc->pipe[pn].shader.ch = 0;
gc->pipe[pn].array.line = 0;
gc->pipe[pn].array.use_vertex = 1;
gc->pipe[pn].array.use_color = 1;
gc->pipe[pn].array.use_texuv = 1;
gc->pipe[pn].array.use_texuv2 = 1;
gc->pipe[pn].array.use_texuv3 = 1;
}
else
{
int found = 0;
for (i = pn; i >= 0; i--)
{
if ((gc->pipe[i].region.type == RTYPE_YUV)
&& (gc->pipe[i].shader.cur_tex == tex->pt->texture)
&& (gc->pipe[i].shader.cur_prog == gc->shared->shader.font.prog)
&& (gc->pipe[i].shader.smooth == smooth)
&& (gc->pipe[i].shader.blend == blend)
&& (gc->pipe[i].shader.render_op == gc->dc->render_op)
&& (gc->pipe[i].shader.clip == 0)
)
{
found = 1;
pn = i;
break;
}
if (pipe_region_intersects(gc, i, x, y, w, h)) break;
}
if (!found)
{
pn = gc->state.top_pipe + 1;
if (pn >= gc->shared->info.pipes_max)
{
shader_array_flush(gc);
goto again;
}
gc->state.top_pipe = pn;
gc->pipe[pn].region.type = RTYPE_YUV;
gc->pipe[pn].shader.cur_tex = tex->pt->texture;
gc->pipe[pn].shader.cur_prog = gc->shared->shader.font.prog;
gc->pipe[pn].shader.smooth = smooth;
gc->pipe[pn].shader.blend = blend;
gc->pipe[pn].shader.render_op = gc->dc->render_op;
gc->pipe[pn].shader.clip = 0;
gc->pipe[pn].shader.cx = 0;
gc->pipe[pn].shader.cy = 0;
gc->pipe[pn].shader.cw = 0;
gc->pipe[pn].shader.ch = 0;
gc->pipe[pn].array.line = 0;
gc->pipe[pn].array.use_vertex = 1;
gc->pipe[pn].array.use_color = 1;
gc->pipe[pn].array.use_texuv = 1;
gc->pipe[pn].array.use_texuv2 = 1;
gc->pipe[pn].array.use_texuv3 = 1;
}
}
#else
if ((gc->pipe[pn].shader.cur_tex != tex->pt->texture) if ((gc->pipe[pn].shader.cur_tex != tex->pt->texture)
|| (gc->pipe[pn].shader.cur_prog != prog) || (gc->pipe[pn].shader.cur_prog != prog)
|| (gc->pipe[pn].shader.smooth != smooth) || (gc->pipe[pn].shader.smooth != smooth)
@ -1494,9 +1563,12 @@ again:
gc->pipe[pn].shader.blend = blend; gc->pipe[pn].shader.blend = blend;
gc->pipe[pn].shader.render_op = gc->dc->render_op; gc->pipe[pn].shader.render_op = gc->dc->render_op;
gc->pipe[pn].shader.clip = 0; gc->pipe[pn].shader.clip = 0;
gc->pipe[pn].shader.cx = 0;
gc->pipe[pn].shader.cy = 0;
gc->pipe[pn].shader.cw = 0;
gc->pipe[pn].shader.ch = 0;
} }
// FIXME: do this once only on new pipe setupe
gc->pipe[pn].region.type = RTYPE_YUV; gc->pipe[pn].region.type = RTYPE_YUV;
gc->pipe[pn].array.line = 0; gc->pipe[pn].array.line = 0;
gc->pipe[pn].array.use_vertex = 1; gc->pipe[pn].array.use_vertex = 1;
@ -1504,6 +1576,7 @@ again:
gc->pipe[pn].array.use_texuv = 1; gc->pipe[pn].array.use_texuv = 1;
gc->pipe[pn].array.use_texuv2 = 1; gc->pipe[pn].array.use_texuv2 = 1;
gc->pipe[pn].array.use_texuv3 = 1; gc->pipe[pn].array.use_texuv3 = 1;
#endif
pipe_region_expand(gc, pn, x, y, w, h); pipe_region_expand(gc, pn, x, y, w, h);
@ -1561,6 +1634,8 @@ again:
} }
} }
// FIXME: we don't handle mapped yuv!!!! :(
// FIXME: we don't handle clipped maps right :(
void void
evas_gl_common_context_image_map4_push(Evas_GL_Context *gc, evas_gl_common_context_image_map4_push(Evas_GL_Context *gc,
Evas_GL_Texture *tex, Evas_GL_Texture *tex,
@ -1571,6 +1646,7 @@ evas_gl_common_context_image_map4_push(Evas_GL_Context *gc,
{ {
int pnum, nv, nc, nu, nu2, nt, i; int pnum, nv, nc, nu, nu2, nt, i;
const int points[6] = { 0, 1, 2, 0, 2, 3 }; const int points[6] = { 0, 1, 2, 0, 2, 3 };
int x, y, w, h, px, py;
GLfloat tx[4], ty[4]; GLfloat tx[4], ty[4];
Eina_Bool blend = 1; Eina_Bool blend = 1;
RGBA_Map_Point *pt; RGBA_Map_Point *pt;
@ -1630,6 +1706,91 @@ evas_gl_common_context_image_map4_push(Evas_GL_Context *gc,
/*xxx*/ shader_array_flush(gc); /*xxx*/ shader_array_flush(gc);
again: again:
pn = gc->state.top_pipe; pn = gc->state.top_pipe;
#ifdef GLPIPES
if ((pn == 0) && (gc->pipe[pn].array.num == 0))
{
gc->pipe[pn].region.type = RTYPE_MAP;
gc->pipe[pn].shader.cur_tex = tex->pt->texture;
gc->pipe[pn].shader.cur_prog = prog;
gc->pipe[pn].shader.smooth = smooth;
gc->pipe[pn].shader.blend = blend;
gc->pipe[pn].shader.render_op = gc->dc->render_op;
gc->pipe[pn].shader.clip = clip;
gc->pipe[pn].shader.cx = cx;
gc->pipe[pn].shader.cy = cy;
gc->pipe[pn].shader.cw = cw;
gc->pipe[pn].shader.ch = ch;
gc->pipe[pn].array.line = 0;
gc->pipe[pn].array.use_vertex = 1;
gc->pipe[pn].array.use_color = 1;
gc->pipe[pn].array.use_texuv = 1;
gc->pipe[pn].array.use_texuv2 = 0;
gc->pipe[pn].array.use_texuv3 = 0;
}
else
{
int found = 0;
for (i = pn; i >= 0; i--)
{
if ((gc->pipe[i].region.type == RTYPE_MAP)
&& (gc->pipe[i].shader.cur_tex == tex->pt->texture)
&& (gc->pipe[i].shader.cur_prog == prog)
&& (gc->pipe[i].shader.smooth == smooth)
&& (gc->pipe[i].shader.blend == blend)
&& (gc->pipe[i].shader.render_op == gc->dc->render_op)
&& (gc->pipe[i].shader.clip == clip)
&& (gc->pipe[i].shader.cx == cx)
&& (gc->pipe[i].shader.cy == cy)
&& (gc->pipe[i].shader.cw == cw)
&& (gc->pipe[i].shader.ch == ch)
)
{
found = 1;
pn = i;
break;
}
if (pipe_region_intersects(gc, i, x, y, w, h)) break;
}
if (!found)
{
pn = gc->state.top_pipe + 1;
if (pn >= gc->shared->info.pipes_max)
{
shader_array_flush(gc);
goto again;
}
gc->state.top_pipe = pn;
gc->pipe[pn].region.type = RTYPE_MAP;
gc->pipe[pn].shader.cur_tex = tex->pt->texture;
gc->pipe[pn].shader.cur_prog = prog;
gc->pipe[pn].shader.smooth = smooth;
gc->pipe[pn].shader.blend = blend;
gc->pipe[pn].shader.render_op = gc->dc->render_op;
gc->pipe[pn].shader.clip = clip;
gc->pipe[pn].shader.cx = cx;
gc->pipe[pn].shader.cy = cy;
gc->pipe[pn].shader.cw = cw;
gc->pipe[pn].shader.ch = ch;
gc->pipe[pn].array.line = 0;
gc->pipe[pn].array.use_vertex = 1;
gc->pipe[pn].array.use_color = 1;
gc->pipe[pn].array.use_texuv = 1;
gc->pipe[pn].array.use_texuv2 = 0;
gc->pipe[pn].array.use_texuv3 = 0;
}
}
if ((tex->im) && (tex->im->native.data))
{
if (gc->pipe[pn].array.im != tex->im)
{
shader_array_flush(gc);
pn = gc->state.top_pipe;
gc->pipe[pn].array.im = tex->im;
goto again;
}
}
#else
if ((gc->pipe[pn].shader.cur_tex != tex->pt->texture) if ((gc->pipe[pn].shader.cur_tex != tex->pt->texture)
|| (gc->pipe[pn].shader.cur_prog != prog) || (gc->pipe[pn].shader.cur_prog != prog)
|| (gc->pipe[pn].shader.smooth != smooth) || (gc->pipe[pn].shader.smooth != smooth)
@ -1662,18 +1823,35 @@ again:
gc->pipe[pn].array.im = tex->im; gc->pipe[pn].array.im = tex->im;
} }
} }
// FIXME: do this once only on new pipe setupe
gc->pipe[pn].region.type = RTYPE_MAP; gc->pipe[pn].region.type = RTYPE_MAP;
gc->pipe[pn].array.line = 0; gc->pipe[pn].array.line = 0;
gc->pipe[pn].array.use_vertex = 1; gc->pipe[pn].array.use_vertex = 1;
gc->pipe[pn].array.use_color = 1; gc->pipe[pn].array.use_color = 1;
gc->pipe[pn].array.use_texuv = 1; gc->pipe[pn].array.use_texuv = 1;
gc->pipe[pn].array.use_texuv2 = 1; gc->pipe[pn].array.use_texuv2 = 0;
gc->pipe[pn].array.use_texuv3 = 0; gc->pipe[pn].array.use_texuv3 = 0;
#endif
// pipe_region_expand(gc, pn, x, y, w, h);
x = w = (p[points[i]].x >> FP);
y = h = (p[points[i]].y >> FP);
for (i = 0; i < 4; i++)
{
tx[i] = ((double)(tex->x) + (((double)p[i].u) / FP1)) /
(double)tex->pt->w;
ty[i] = ((double)(tex->y) + (((double)p[i].v) / FP1)) /
(double)tex->pt->h;
px = (p[points[i]].x >> FP);
if (px < x) x = px;
else if (px > w) w = py;
py = (p[points[i]].y >> FP);
if (py < y) y = py;
else if (py > h) h = py;
}
w = w - x;
h = h - y;
pipe_region_expand(gc, pn, x, y, w, h);
pnum = gc->pipe[pn].array.num; pnum = gc->pipe[pn].array.num;
nv = pnum * 3; nc = pnum * 4; nu = pnum * 2; nu2 = pnum * 2; nv = pnum * 3; nc = pnum * 4; nu = pnum * 2; nu2 = pnum * 2;
@ -1681,16 +1859,10 @@ again:
gc->pipe[pn].array.num += 6; gc->pipe[pn].array.num += 6;
array_alloc(gc, pn); array_alloc(gc, pn);
for (i = 0; i < 4; i++)
{
tx[i] = ((double)(tex->x) + (((double)p[i].u) / FP1)) /
(double)tex->pt->w;
ty[i] = ((double)(tex->y) + (((double)p[i].v) / FP1)) /
(double)tex->pt->h;
}
if ((tex->im) && (tex->im->native.data) && (!tex->im->native.yinvert)) if ((tex->im) && (tex->im->native.data) && (!tex->im->native.yinvert))
{ {
// FIXME: handle yinvert // FIXME: handle yinvert
fprintf(stderr, "EVAS GL ENGINE ERROR: not handling inverted y case for map4\n");
} }
cmul = ARGB_JOIN(a, r, g, b); cmul = ARGB_JOIN(a, r, g, b);
@ -1717,7 +1889,6 @@ void
evas_gl_common_context_flush(Evas_GL_Context *gc) evas_gl_common_context_flush(Evas_GL_Context *gc)
{ {
shader_array_flush(gc); shader_array_flush(gc);
// fprintf(stderr, "------------FRAME: done\n");
} }
static void static void
@ -1725,25 +1896,11 @@ shader_array_flush(Evas_GL_Context *gc)
{ {
int i; int i;
for (i = 0; i < MAX_PIPES; i++) for (i = 0; i < gc->shared->info.pipes_max; i++)
{ {
const char *tname[] = {
"N/A ",
"RECT ",
"IMAGE",
"FONT ",
"YUV ",
"MAP "
};
if (gc->pipe[i].array.num <= 0) break; if (gc->pipe[i].array.num <= 0) break;
gc->flushnum++; gc->flushnum++;
/// printf(" ::: FLUSH PIPE [%2i] | %s | texid: %3i | tri: %i\n",
/// i,
/// tname[gc->pipe[i].region.type],
/// gc->pipe[i].shader.cur_tex,
/// gc->pipe[i].array.num);
GLERR(__FUNCTION__, __FILE__, __LINE__, "<flush err>"); GLERR(__FUNCTION__, __FILE__, __LINE__, "<flush err>");
if (gc->pipe[i].shader.cur_prog != gc->state.current.cur_prog) if (gc->pipe[i].shader.cur_prog != gc->state.current.cur_prog)
{ {