forked from enlightenment/efl
Evas GL: Fix scissors with direct rendering
If an app calls glDisable(SCISSORS) and uses direct rendering, then the DR scissors were dropped and so glClear would erase the contents of the entire canvas, instead of being restricted to the image object.
This commit is contained in:
parent
2a69980959
commit
e4a11c008c
|
@ -451,8 +451,66 @@ _evgl_glEnable(GLenum cap)
|
|||
|
||||
ctx = evas_gl_common_current_context_get();
|
||||
|
||||
if (cap == GL_SCISSOR_TEST)
|
||||
if (ctx) ctx->scissor_enabled = 1;
|
||||
if (ctx && (cap == GL_SCISSOR_TEST))
|
||||
{
|
||||
ctx->scissor_enabled = 1;
|
||||
|
||||
if (_evgl_direct_enabled())
|
||||
{
|
||||
EVGL_Resource *rsc = _evgl_tls_resource_get();
|
||||
int oc[4] = {0,0,0,0}, nc[4] = {0,0,0,0}, cc[4] = {0,0,0,0};
|
||||
|
||||
if (!ctx->current_fbo)
|
||||
{
|
||||
// Direct rendering to canvas
|
||||
if (!ctx->scissor_updated)
|
||||
{
|
||||
compute_gl_coordinates(rsc->direct.win_w, rsc->direct.win_h,
|
||||
rsc->direct.rot, 0,
|
||||
0, 0, 0, 0,
|
||||
rsc->direct.img.x, rsc->direct.img.y,
|
||||
rsc->direct.img.w, rsc->direct.img.h,
|
||||
rsc->direct.clip.x, rsc->direct.clip.y,
|
||||
rsc->direct.clip.w, rsc->direct.clip.h,
|
||||
oc, nc, cc);
|
||||
glScissor(cc[0], cc[1], cc[2], cc[3]);
|
||||
}
|
||||
else
|
||||
{
|
||||
compute_gl_coordinates(rsc->direct.win_w, rsc->direct.win_h,
|
||||
rsc->direct.rot, 1,
|
||||
ctx->scissor_coord[0], ctx->scissor_coord[1],
|
||||
ctx->scissor_coord[2], ctx->scissor_coord[3],
|
||||
rsc->direct.img.x, rsc->direct.img.y,
|
||||
rsc->direct.img.w, rsc->direct.img.h,
|
||||
rsc->direct.clip.x, rsc->direct.clip.y,
|
||||
rsc->direct.clip.w, rsc->direct.clip.h,
|
||||
oc, nc, cc);
|
||||
glScissor(nc[0], nc[1], nc[2], nc[3]);
|
||||
}
|
||||
ctx->direct_scissor = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
// Bound to an FBO, reset scissors to user data
|
||||
if (ctx->scissor_updated)
|
||||
{
|
||||
glScissor(ctx->scissor_coord[0], ctx->scissor_coord[1],
|
||||
ctx->scissor_coord[2], ctx->scissor_coord[3]);
|
||||
}
|
||||
else if (ctx->direct_scissor)
|
||||
{
|
||||
// Back to the default scissors (here: max texture size)
|
||||
glScissor(0, 0, evgl_engine->caps.max_w, evgl_engine->caps.max_h);
|
||||
}
|
||||
ctx->direct_scissor = 0;
|
||||
}
|
||||
|
||||
glEnable(GL_SCISSOR_TEST);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
glEnable(cap);
|
||||
}
|
||||
|
||||
|
@ -463,8 +521,43 @@ _evgl_glDisable(GLenum cap)
|
|||
|
||||
ctx = evas_gl_common_current_context_get();
|
||||
|
||||
if (cap == GL_SCISSOR_TEST)
|
||||
if (ctx) ctx->scissor_enabled = 0;
|
||||
if (ctx && (cap == GL_SCISSOR_TEST))
|
||||
{
|
||||
ctx->scissor_enabled = 0;
|
||||
|
||||
if (_evgl_direct_enabled())
|
||||
{
|
||||
if (!ctx->current_fbo)
|
||||
{
|
||||
// Restore default scissors for direct rendering
|
||||
int oc[4] = {0,0,0,0}, nc[4] = {0,0,0,0}, cc[4] = {0,0,0,0};
|
||||
EVGL_Resource *rsc = _evgl_tls_resource_get();
|
||||
|
||||
compute_gl_coordinates(rsc->direct.win_w, rsc->direct.win_h,
|
||||
rsc->direct.rot, 1,
|
||||
0, 0, rsc->direct.img.w, rsc->direct.img.h,
|
||||
rsc->direct.img.x, rsc->direct.img.y,
|
||||
rsc->direct.img.w, rsc->direct.img.h,
|
||||
rsc->direct.clip.x, rsc->direct.clip.y,
|
||||
rsc->direct.clip.w, rsc->direct.clip.h,
|
||||
oc, nc, cc);
|
||||
|
||||
RECTS_CLIP_TO_RECT(nc[0], nc[1], nc[2], nc[3], cc[0], cc[1], cc[2], cc[3]);
|
||||
glScissor(nc[0], nc[1], nc[2], nc[3]);
|
||||
|
||||
ctx->direct_scissor = 1;
|
||||
glEnable(GL_SCISSOR_TEST);
|
||||
}
|
||||
else
|
||||
{
|
||||
// Bound to an FBO, disable scissors for real
|
||||
ctx->direct_scissor = 0;
|
||||
glDisable(GL_SCISSOR_TEST);
|
||||
}
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
glDisable(cap);
|
||||
}
|
||||
|
||||
|
@ -506,8 +599,7 @@ _evgl_glGetIntegerv(GLenum pname, GLint* params)
|
|||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (pname == GL_VIEWPORT)
|
||||
else if (pname == GL_VIEWPORT)
|
||||
{
|
||||
if (ctx->viewport_updated)
|
||||
{
|
||||
|
@ -722,6 +814,7 @@ _evgl_glScissor(GLint x, GLint y, GLsizei width, GLsizei height)
|
|||
{
|
||||
if (!(rsc->current_ctx->current_fbo))
|
||||
{
|
||||
// Direct rendering to canvas
|
||||
if ((ctx->direct_scissor) && (!ctx->scissor_enabled))
|
||||
{
|
||||
glDisable(GL_SCISSOR_TEST);
|
||||
|
@ -747,11 +840,12 @@ _evgl_glScissor(GLint x, GLint y, GLsizei width, GLsizei height)
|
|||
|
||||
ctx->direct_scissor = 0;
|
||||
|
||||
// Check....!!!!
|
||||
// Mark user scissor_coord as valid
|
||||
ctx->scissor_updated = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
// Bound to an FBO, use these new scissors
|
||||
if ((ctx->direct_scissor) && (!ctx->scissor_enabled))
|
||||
{
|
||||
glDisable(GL_SCISSOR_TEST);
|
||||
|
@ -760,7 +854,8 @@ _evgl_glScissor(GLint x, GLint y, GLsizei width, GLsizei height)
|
|||
|
||||
glScissor(x, y, width, height);
|
||||
|
||||
ctx->scissor_updated = 0;
|
||||
// Why did we set this flag to 0???
|
||||
//ctx->scissor_updated = 0;
|
||||
}
|
||||
}
|
||||
else
|
||||
|
|
|
@ -157,12 +157,12 @@ struct _EVGL_Context
|
|||
GLuint current_fbo;
|
||||
|
||||
// Direct Rendering Related
|
||||
int scissor_enabled;
|
||||
int scissor_updated;
|
||||
int scissor_coord[4];
|
||||
int direct_scissor;
|
||||
int scissor_enabled : 1;
|
||||
int scissor_updated : 1;
|
||||
int direct_scissor : 1;
|
||||
int viewport_updated : 1;
|
||||
|
||||
int viewport_updated;
|
||||
int scissor_coord[4];
|
||||
int viewport_coord[4];
|
||||
|
||||
// Partial Rendering
|
||||
|
|
Loading…
Reference in New Issue