forked from enlightenment/efl
force scissor to always be on indicating partial gl update region so
gpu can.. do more sensible things.
This commit is contained in:
parent
08d81394aa
commit
1a81f0a8c2
|
@ -350,6 +350,11 @@ struct _Evas_Engine_GL_Context
|
||||||
int clip;
|
int clip;
|
||||||
} current;
|
} current;
|
||||||
} state;
|
} state;
|
||||||
|
|
||||||
|
struct {
|
||||||
|
int x, y, w, h;
|
||||||
|
Eina_Bool enabled : 1;
|
||||||
|
} master_clip;
|
||||||
|
|
||||||
struct {
|
struct {
|
||||||
struct {
|
struct {
|
||||||
|
|
|
@ -2571,7 +2571,7 @@ scissor_rot(Evas_Engine_GL_Context *gc EINA_UNUSED,
|
||||||
static void
|
static void
|
||||||
shader_array_flush(Evas_Engine_GL_Context *gc)
|
shader_array_flush(Evas_Engine_GL_Context *gc)
|
||||||
{
|
{
|
||||||
int i, gw, gh, setclip, cy, fbo = 0, done = 0;
|
int i, gw, gh, setclip, fbo = 0, done = 0;
|
||||||
|
|
||||||
if (!gc->havestuff) return;
|
if (!gc->havestuff) return;
|
||||||
gw = gc->w;
|
gw = gc->w;
|
||||||
|
@ -2719,47 +2719,89 @@ shader_array_flush(Evas_Engine_GL_Context *gc)
|
||||||
}
|
}
|
||||||
if (gc->pipe[i].shader.clip != gc->state.current.clip)
|
if (gc->pipe[i].shader.clip != gc->state.current.clip)
|
||||||
{
|
{
|
||||||
|
int cx, cy, cw, ch;
|
||||||
if (gc->pipe[i].shader.clip)
|
|
||||||
|
cx = gc->pipe[i].shader.cx;
|
||||||
|
cy = gc->pipe[i].shader.cy;
|
||||||
|
cw = gc->pipe[i].shader.cw;
|
||||||
|
ch = gc->pipe[i].shader.ch;
|
||||||
|
if ((gc->master_clip.enabled) && (!fbo))
|
||||||
|
{
|
||||||
|
if (gc->pipe[i].shader.clip)
|
||||||
|
{
|
||||||
|
RECTS_CLIP_TO_RECT(cx, cy, cw, ch,
|
||||||
|
gc->master_clip.x, gc->master_clip.y,
|
||||||
|
gc->master_clip.w, gc->master_clip.h);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
cx = gc->master_clip.x;
|
||||||
|
cy = gc->master_clip.y;
|
||||||
|
cw = gc->master_clip.w;
|
||||||
|
ch = gc->master_clip.h;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ((gc->pipe[i].shader.clip) || (gc->master_clip.enabled))
|
||||||
{
|
{
|
||||||
cy = gh - gc->pipe[i].shader.cy - gc->pipe[i].shader.ch;
|
|
||||||
if (fbo) cy = gc->pipe[i].shader.cy;
|
|
||||||
glEnable(GL_SCISSOR_TEST);
|
glEnable(GL_SCISSOR_TEST);
|
||||||
if (!fbo)
|
if (!fbo)
|
||||||
scissor_rot(gc, gc->rot, gw, gh,
|
scissor_rot(gc, gc->rot, gw, gh, cx, gh - cy - ch, cw, ch);
|
||||||
gc->pipe[i].shader.cx,
|
|
||||||
cy,
|
|
||||||
gc->pipe[i].shader.cw,
|
|
||||||
gc->pipe[i].shader.ch);
|
|
||||||
else
|
else
|
||||||
glScissor(gc->pipe[i].shader.cx, cy,
|
glScissor(cx, cy, cw, ch);
|
||||||
gc->pipe[i].shader.cw, gc->pipe[i].shader.ch);
|
|
||||||
setclip = 1;
|
setclip = 1;
|
||||||
|
gc->state.current.cx = cx;
|
||||||
|
gc->state.current.cy = cy;
|
||||||
|
gc->state.current.cw = cw;
|
||||||
|
gc->state.current.ch = ch;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
glDisable(GL_SCISSOR_TEST);
|
glDisable(GL_SCISSOR_TEST);
|
||||||
glScissor(0, 0, 0, 0);
|
glScissor(0, 0, 0, 0);
|
||||||
|
gc->state.current.cx = 0;
|
||||||
|
gc->state.current.cy = 0;
|
||||||
|
gc->state.current.cw = 0;
|
||||||
|
gc->state.current.ch = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if ((gc->pipe[i].shader.clip) && (!setclip))
|
if (((gc->pipe[i].shader.clip) && (!setclip)) ||
|
||||||
|
(gc->master_clip.enabled))
|
||||||
{
|
{
|
||||||
if ((gc->pipe[i].shader.cx != gc->state.current.cx) ||
|
int cx, cy, cw, ch;
|
||||||
(gc->pipe[i].shader.cy != gc->state.current.cy) ||
|
|
||||||
(gc->pipe[i].shader.cw != gc->state.current.cw) ||
|
cx = gc->pipe[i].shader.cx;
|
||||||
(gc->pipe[i].shader.ch != gc->state.current.ch))
|
cy = gc->pipe[i].shader.cy;
|
||||||
|
cw = gc->pipe[i].shader.cw;
|
||||||
|
ch = gc->pipe[i].shader.ch;
|
||||||
|
if ((gc->master_clip.enabled) && (!fbo))
|
||||||
{
|
{
|
||||||
cy = gh - gc->pipe[i].shader.cy - gc->pipe[i].shader.ch;
|
if (gc->pipe[i].shader.clip)
|
||||||
if (fbo) cy = gc->pipe[i].shader.cy;
|
{
|
||||||
if (!fbo)
|
RECTS_CLIP_TO_RECT(cx, cy, cw, ch,
|
||||||
scissor_rot(gc, gc->rot, gw, gh,
|
gc->master_clip.x, gc->master_clip.y,
|
||||||
gc->pipe[i].shader.cx,
|
gc->master_clip.w, gc->master_clip.h);
|
||||||
cy,
|
}
|
||||||
gc->pipe[i].shader.cw,
|
|
||||||
gc->pipe[i].shader.ch);
|
|
||||||
else
|
else
|
||||||
glScissor(gc->pipe[i].shader.cx, cy,
|
{
|
||||||
gc->pipe[i].shader.cw, gc->pipe[i].shader.ch);
|
cx = gc->master_clip.x;
|
||||||
|
cy = gc->master_clip.y;
|
||||||
|
cw = gc->master_clip.w;
|
||||||
|
ch = gc->master_clip.h;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ((cx != gc->state.current.cx) ||
|
||||||
|
(cy != gc->state.current.cy) ||
|
||||||
|
(cw != gc->state.current.cw) ||
|
||||||
|
(ch != gc->state.current.ch))
|
||||||
|
{
|
||||||
|
if (!fbo)
|
||||||
|
scissor_rot(gc, gc->rot, gw, gh, cx, gh - cy - ch, cw, ch);
|
||||||
|
else
|
||||||
|
glScissor(cx, cy, cw, ch);
|
||||||
|
gc->state.current.cx = cx;
|
||||||
|
gc->state.current.cy = cy;
|
||||||
|
gc->state.current.cw = cw;
|
||||||
|
gc->state.current.ch = ch;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2976,10 +3018,10 @@ shader_array_flush(Evas_Engine_GL_Context *gc)
|
||||||
gc->state.current.cur_prog = gc->pipe[i].shader.cur_prog;
|
gc->state.current.cur_prog = gc->pipe[i].shader.cur_prog;
|
||||||
gc->state.current.cur_tex = gc->pipe[i].shader.cur_tex;
|
gc->state.current.cur_tex = gc->pipe[i].shader.cur_tex;
|
||||||
gc->state.current.render_op = gc->pipe[i].shader.render_op;
|
gc->state.current.render_op = gc->pipe[i].shader.render_op;
|
||||||
gc->state.current.cx = gc->pipe[i].shader.cx;
|
// gc->state.current.cx = gc->pipe[i].shader.cx;
|
||||||
gc->state.current.cy = gc->pipe[i].shader.cy;
|
// gc->state.current.cy = gc->pipe[i].shader.cy;
|
||||||
gc->state.current.cw = gc->pipe[i].shader.cw;
|
// gc->state.current.cw = gc->pipe[i].shader.cw;
|
||||||
gc->state.current.ch = gc->pipe[i].shader.ch;
|
// gc->state.current.ch = gc->pipe[i].shader.ch;
|
||||||
gc->state.current.smooth = gc->pipe[i].shader.smooth;
|
gc->state.current.smooth = gc->pipe[i].shader.smooth;
|
||||||
gc->state.current.blend = gc->pipe[i].shader.blend;
|
gc->state.current.blend = gc->pipe[i].shader.blend;
|
||||||
gc->state.current.clip = gc->pipe[i].shader.clip;
|
gc->state.current.clip = gc->pipe[i].shader.clip;
|
||||||
|
|
|
@ -1314,6 +1314,11 @@ eng_output_redraws_next_update_get(void *data, int *x, int *y, int *w, int *h, i
|
||||||
*cw = rect->w;
|
*cw = rect->w;
|
||||||
*ch = rect->h;
|
*ch = rect->h;
|
||||||
re->cur_rect = re->cur_rect->next;
|
re->cur_rect = re->cur_rect->next;
|
||||||
|
re->win->gl_context->master_clip.enabled = EINA_TRUE;
|
||||||
|
re->win->gl_context->master_clip.x = rect->x;
|
||||||
|
re->win->gl_context->master_clip.y = rect->y;
|
||||||
|
re->win->gl_context->master_clip.w = rect->w;
|
||||||
|
re->win->gl_context->master_clip.h = rect->h;
|
||||||
break;
|
break;
|
||||||
case MODE_FULL:
|
case MODE_FULL:
|
||||||
re->cur_rect = NULL;
|
re->cur_rect = NULL;
|
||||||
|
@ -1325,6 +1330,7 @@ eng_output_redraws_next_update_get(void *data, int *x, int *y, int *w, int *h, i
|
||||||
if (cy) *cy = 0;
|
if (cy) *cy = 0;
|
||||||
if (cw) *cw = re->win->w;
|
if (cw) *cw = re->win->w;
|
||||||
if (ch) *ch = re->win->h;
|
if (ch) *ch = re->win->h;
|
||||||
|
re->win->gl_context->master_clip.enabled = EINA_FALSE;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
|
|
Loading…
Reference in New Issue