gl engine now does rotates (0, 90, 180, 270), like software engines

SVN revision: 48704
This commit is contained in:
Carsten Haitzler 2010-05-09 05:15:20 +00:00
parent dc4449c764
commit fa6a067737
5 changed files with 101 additions and 30 deletions

View File

@ -113,12 +113,14 @@ struct _Evas_GL_Shared
} shader; } shader;
int references; int references;
int w, h; int w, h;
int rot;
}; };
struct _Evas_GL_Context struct _Evas_GL_Context
{ {
int references; int references;
int w, h; int w, h;
int rot;
RGBA_Draw_Context *dc; RGBA_Draw_Context *dc;
Evas_GL_Shared *shared; Evas_GL_Shared *shared;
@ -284,7 +286,7 @@ void glerr(int err, const char *file, const char *func, int line, const char *op
Evas_GL_Context *evas_gl_common_context_new(void); Evas_GL_Context *evas_gl_common_context_new(void);
void evas_gl_common_context_free(Evas_GL_Context *gc); void evas_gl_common_context_free(Evas_GL_Context *gc);
void evas_gl_common_context_use(Evas_GL_Context *gc); void evas_gl_common_context_use(Evas_GL_Context *gc);
void evas_gl_common_context_resize(Evas_GL_Context *gc, int w, int h); void evas_gl_common_context_resize(Evas_GL_Context *gc, int w, int h, int rot);
void evas_gl_common_context_target_surface_set(Evas_GL_Context *gc, Evas_GL_Image *surface); void evas_gl_common_context_target_surface_set(Evas_GL_Context *gc, Evas_GL_Image *surface);
void evas_gl_common_context_line_push(Evas_GL_Context *gc, void evas_gl_common_context_line_push(Evas_GL_Context *gc,

View File

@ -80,29 +80,83 @@ matrix_ident(GLfloat *m)
{ {
memset(m, 0, 16 * sizeof(GLfloat)); memset(m, 0, 16 * sizeof(GLfloat));
m[0] = m[5] = m[10] = m[15] = 1.0; m[0] = m[5] = m[10] = m[15] = 1.0;
//------------------------
// 1 0 0 0
// 0 1 0 0
// 0 0 1 0
// 0 0 0 1
} }
static void static void
matrix_ortho(GLfloat *m, matrix_ortho(GLfloat *m,
GLfloat l, GLfloat r, GLfloat l, GLfloat r,
GLfloat t, GLfloat b, GLfloat t, GLfloat b,
GLfloat near, GLfloat far) GLfloat near, GLfloat far,
int rot, int w, int h)
{ {
m[0] = 2.0 / (r - l); GLfloat rotf;
m[1] = m[2] = m[3] = 0.0; GLfloat cosv, sinv;
GLfloat tx, ty;
// rot = 180;
//------------------------
m[0] = 2.0 / (r - l);
m[1] = 0.0;
m[2] = 0.0;
m[3] = 0.0;
//------------------------
m[4] = 0.0; m[4] = 0.0;
m[5] = 2.0 / (t - b); m[5] = 2.0 / (t - b);
m[6] = m[7] = 0.0; m[6] = 0.0;
m[7] = 0.0;
m[8] = m[9] = 0.0; //------------------------
m[8] = 0.0;
m[9] = 0.0;
m[10] = -(2.0 / (far - near)); m[10] = -(2.0 / (far - near));
m[11] = 0.0; m[11] = 0.0;
m[12] = -((r + l)/(r - l)); //------------------------
m[13] = -((t + b)/(t - b)); m[12] = -((r + l) / (r - l));
m[14] = -((near + far)/(far - near)); m[13] = -((t + b) / (t - b));
m[14] = -((near + far) / (far - near));
m[15] = 1.0; m[15] = 1.0;
// rot
rotf = (((rot / 90) & 0x3) * M_PI) / 2.0;
tx = 0.0;
ty = 0.0;
if (rot == 90)
{
tx = -(w * 1.0);
ty = -(h * 0.0);
}
if (rot == 180)
{
tx = -(w * 1.0);
ty = -(h * 1.0);
}
if (rot == 270)
{
tx = -(w * 0.0);
ty = -(h * 1.0);
}
cosv = cos(rotf);
sinv = sin(rotf);
m[0] = (2.0 / (r - l)) * ( cosv);
m[1] = (2.0 / (r - l)) * ( sinv);
m[4] = (2.0 / (t - b)) * (-sinv);
m[5] = (2.0 / (t - b)) * ( cosv);
m[12] += (m[0] * tx) + (m[4] * ty);
m[13] += (m[1] * tx) + (m[5] * ty);
m[14] += (m[2] * tx) + (m[6] * ty);
m[15] += (m[3] * tx) + (m[7] * ty);
} }
static int static int
@ -119,7 +173,7 @@ _evas_gl_common_version_check()
* GL_VERSION is used to get the version of the connection * GL_VERSION is used to get the version of the connection
*/ */
version = glGetString(GL_VERSION); version = (char *)glGetString(GL_VERSION);
/* /*
* OpengL ES * OpengL ES
@ -197,35 +251,41 @@ static void
_evas_gl_common_viewport_set(Evas_GL_Context *gc) _evas_gl_common_viewport_set(Evas_GL_Context *gc)
{ {
GLfloat proj[16]; GLfloat proj[16];
int w = 1, h = 1, m = 1; int w = 1, h = 1, m = 1, rot = 1;
if ((gc->shader.surface == gc->def_surface) || if ((gc->shader.surface == gc->def_surface) ||
(!gc->shader.surface)) (!gc->shader.surface))
{ {
w = gc->w; w = gc->w;
h = gc->h; h = gc->h;
rot = gc->rot;
} }
else else
{ {
w = gc->shader.surface->w; w = gc->shader.surface->w;
h = gc->shader.surface->h; h = gc->shader.surface->h;
rot = 0;
m = -1; m = -1;
} }
if ((!gc->change.size) || if ((!gc->change.size) ||
((gc->shared->w == w) && (gc->shared->h == h))) ((gc->shared->w == w) && (gc->shared->h == h) && (gc->shared->rot == rot)))
return; return;
gc->shared->w = w; gc->shared->w = w;
gc->shared->h = h; gc->shared->h = h;
gc->shared->rot = rot;
gc->change.size = 0; gc->change.size = 0;
glViewport(0, 0, w, h); if ((rot == 0) || (rot == 180))
glViewport(0, 0, w, h);
else
glViewport(0, 0, h, w);
GLERR(__FUNCTION__, __FILE__, __LINE__, ""); GLERR(__FUNCTION__, __FILE__, __LINE__, "");
matrix_ident(proj); matrix_ident(proj);
if (m == 1) matrix_ortho(proj, 0, w, 0, h, -1.0, 1.0); if (m == 1) matrix_ortho(proj, 0, w, 0, h, -1.0, 1.0, rot, w, h);
else matrix_ortho(proj, 0, w, h, 0, -1.0, 1.0); else matrix_ortho(proj, 0, w, h, 0, -1.0, 1.0, rot, w, h);
glUseProgram(gc->shared->shader.rect.prog); glUseProgram(gc->shared->shader.rect.prog);
GLERR(__FUNCTION__, __FILE__, __LINE__, ""); GLERR(__FUNCTION__, __FILE__, __LINE__, "");
@ -540,10 +600,11 @@ evas_gl_common_context_use(Evas_GL_Context *gc)
} }
void void
evas_gl_common_context_resize(Evas_GL_Context *gc, int w, int h) evas_gl_common_context_resize(Evas_GL_Context *gc, int w, int h, int rot)
{ {
if ((gc->w == w) && (gc->h == h)) return; if ((gc->w == w) && (gc->h == h) && (gc->rot == rot)) return;
gc->change.size = 1; gc->change.size = 1;
gc->rot = rot;
gc->w = w; gc->w = w;
gc->h = h; gc->h = h;
if (_evas_gl_common_context == gc) _evas_gl_common_viewport_set(gc); if (_evas_gl_common_context == gc) _evas_gl_common_viewport_set(gc);

View File

@ -220,14 +220,15 @@ eng_setup(Evas *e, void *in)
e->engine.data.output = re; e->engine.data.output = re;
re->win = eng_window_new(info->info.display, re->win = eng_window_new(info->info.display,
info->info.drawable, info->info.drawable,
0 /* FIXME: screen 0 assumption */, info->info.screen,
info->info.visual, info->info.visual,
info->info.colormap, info->info.colormap,
info->info.depth, info->info.depth,
e->output.w, e->output.w,
e->output.h, e->output.h,
info->indirect, info->indirect,
info->info.destination_alpha); info->info.destination_alpha,
info->info.rotation);
if (!re->win) if (!re->win)
{ {
free(re); free(re);
@ -308,23 +309,25 @@ eng_setup(Evas *e, void *in)
re = e->engine.data.output; re = e->engine.data.output;
if ((info->info.display != re->win->disp) || if ((info->info.display != re->win->disp) ||
(info->info.drawable != re->win->win) || (info->info.drawable != re->win->win) ||
(0 != re->win->screen) || /* FIXME: screen 0 assumption */ (info->info.screen != re->win->screen) ||
(info->info.visual != re->win->visual) || (info->info.visual != re->win->visual) ||
(info->info.colormap != re->win->colormap) || (info->info.colormap != re->win->colormap) ||
(info->info.depth != re->win->depth) || (info->info.depth != re->win->depth) ||
(info->info.destination_alpha != re->win->alpha)) (info->info.destination_alpha != re->win->alpha) ||
(info->info.rotation != re->win->rot))
{ {
eng_window_free(re->win); eng_window_free(re->win);
re->win = eng_window_new(info->info.display, re->win = eng_window_new(info->info.display,
info->info.drawable, info->info.drawable,
0,/* FIXME: screen 0 assumption */ info->info.screen,
info->info.visual, info->info.visual,
info->info.colormap, info->info.colormap,
info->info.depth, info->info.depth,
e->output.w, e->output.w,
e->output.h, e->output.h,
info->indirect, info->indirect,
info->info.destination_alpha); info->info.destination_alpha,
info->info.rotation);
} }
else if ((re->win->w != e->output.w) || else if ((re->win->w != e->output.w) ||
(re->win->h != e->output.h)) (re->win->h != e->output.h))
@ -332,7 +335,7 @@ eng_setup(Evas *e, void *in)
re->win->w = e->output.w; re->win->w = e->output.w;
re->win->h = e->output.h; re->win->h = e->output.h;
eng_window_use(re->win); eng_window_use(re->win);
evas_gl_common_context_resize(re->win->gl_context, re->win->w, re->win->h); evas_gl_common_context_resize(re->win->gl_context, re->win->w, re->win->h, re->win->rot);
} }
} }
@ -379,7 +382,7 @@ eng_output_resize(void *data, int w, int h)
re->win->w = w; re->win->w = w;
re->win->h = h; re->win->h = h;
eng_window_use(re->win); eng_window_use(re->win);
evas_gl_common_context_resize(re->win->gl_context, w, h); evas_gl_common_context_resize(re->win->gl_context, w, h, re->win->rot);
} }
static void static void
@ -396,7 +399,7 @@ eng_output_redraws_rect_add(void *data, int x, int y, int w, int h)
Render_Engine *re; Render_Engine *re;
re = (Render_Engine *)data; re = (Render_Engine *)data;
evas_gl_common_context_resize(re->win->gl_context, re->win->w, re->win->h); evas_gl_common_context_resize(re->win->gl_context, re->win->w, re->win->h, re->win->rot);
/* smple bounding box */ /* smple bounding box */
RECTS_CLIP_TO_RECT(x, y, w, h, 0, 0, re->win->w, re->win->h); RECTS_CLIP_TO_RECT(x, y, w, h, 0, 0, re->win->w, re->win->h);
if ((w <= 0) || (h <= 0)) return; if ((w <= 0) || (h <= 0)) return;

View File

@ -82,6 +82,7 @@ struct _Evas_GL_X11_Window
Colormap colormap; Colormap colormap;
int depth; int depth;
int alpha; int alpha;
int rot;
Evas_GL_Context *gl_context; Evas_GL_Context *gl_context;
struct { struct {
int redraw : 1; int redraw : 1;
@ -114,7 +115,7 @@ struct _Evas_GL_X11_Window
Evas_GL_X11_Window *eng_window_new(Display *disp, Window win, int screen, Evas_GL_X11_Window *eng_window_new(Display *disp, Window win, int screen,
Visual *vis, Colormap cmap, Visual *vis, Colormap cmap,
int depth, int w, int h, int indirect, int depth, int w, int h, int indirect,
int alpha); int alpha, int rot);
void eng_window_free(Evas_GL_X11_Window *gw); void eng_window_free(Evas_GL_X11_Window *gw);
void eng_window_use(Evas_GL_X11_Window *gw); void eng_window_use(Evas_GL_X11_Window *gw);
Visual *eng_best_visual_get(Evas_Engine_Info_GL_X11 *einfo); Visual *eng_best_visual_get(Evas_Engine_Info_GL_X11 *einfo);

View File

@ -32,7 +32,8 @@ eng_window_new(Display *disp,
int w, int w,
int h, int h,
int indirect, int indirect,
int alpha) int alpha,
int rot)
{ {
Evas_GL_X11_Window *gw; Evas_GL_X11_Window *gw;
int context_attrs[3]; int context_attrs[3];
@ -53,6 +54,9 @@ eng_window_new(Display *disp,
gw->colormap = cmap; gw->colormap = cmap;
gw->depth = depth; gw->depth = depth;
gw->alpha = alpha; gw->alpha = alpha;
gw->w = w;
gw->h = h;
gw->rot = rot;
vi_use = _evas_gl_x11_vi; vi_use = _evas_gl_x11_vi;
if (alpha) if (alpha)
@ -382,7 +386,7 @@ eng_window_new(Display *disp,
return NULL; return NULL;
} }
evas_gl_common_context_use(gw->gl_context); evas_gl_common_context_use(gw->gl_context);
evas_gl_common_context_resize(gw->gl_context, w, h); evas_gl_common_context_resize(gw->gl_context, w, h, rot);
win_count++; win_count++;
return gw; return gw;
} }