evas gl: move to floating point coordinate system.
authorHermet Park <hermetpark@gmail.com>
Thu, 18 Apr 2019 11:08:16 +0000 (20:08 +0900)
committerYeongjong Lee <yj34.lee@samsung.com>
Wed, 24 Apr 2019 05:24:47 +0000 (14:24 +0900)
Summary:
GL engine has used integer coordinates system since it's born though
OpenGL basically uses floating point vertex coordinates system.

There were many dissatisfaction, complaints about this
since object's transition is jiggled, not perfectly smooth.

It's obvious because Positioning must be stepping with integer units
without any subpixel rendering.

Our gl engine currently supports msaa options and evas map allows to
have double precivion coordinates system, our engine must do handle this over as well,
to work together.

If you don't like change,

We could switch behaviors optionally (turn on, only when msaa is enabled)
But I think it's pointless using integer coordinates system in GL thesedays.
It just make code complex to maintain.

There will be an additional patch coming for SW backend map behavior soon.

Left: before patch
Right: after patch

{F3694624}

Reviewers: #committers, raster

Reviewed By: #committers, raster

Subscribers: raster, cedric, #reviewers, #committers

Tags: #efl

Differential Revision: https://phab.enlightenment.org/D8552

Change-Id: Icd0d0abc8805b1654c99e2e2171ba45a7a2e98d8

src/modules/evas/engines/gl_common/evas_gl_common.h
src/modules/evas/engines/gl_common/evas_gl_context.c
src/modules/evas/engines/gl_generic/evas_engine.c
src/modules/evas/engines/gl_x11/evas_x_main.c

index 69f9fac..b9091f3 100755 (executable)
@@ -318,8 +318,6 @@ struct _Evas_Engine_GL_Context
       Eina_Bool          size       : 1;
    } change;
 
-   Eina_Bool             havestuff  : 1;
-
    struct {
       struct { // TIZEN_ONLY(20171114) : EvasGL Render Thread
         int foc, z0, px, py;
@@ -355,7 +353,7 @@ struct _Evas_Engine_GL_Context
       } shader;
       struct {
          int            num, alloc;
-         GLshort       *vertex;
+         GLfloat       *vertex;
          GLubyte       *color;
          GLfloat       *texuv;
          GLfloat       *texuv2;
@@ -402,6 +400,9 @@ struct _Evas_Engine_GL_Context
    GLuint preserve_bit;
    int    gles_version;
 
+   Eina_Bool havestuff : 1;
+   Eina_Bool msaa : 1;
+
    //TIZEN_ONLY(20161121)
    // If set, the driver will rotate the buffer itself
    Eina_Bool pre_rotated : 1;
@@ -410,7 +411,6 @@ struct _Evas_Engine_GL_Context
    // modified to share resource by each gl backend
    Eina_TLS context_key;
    Eina_TLS shared_key;
-
 };
 
 struct _Evas_GL_Texture_Pool
index 85a51f2..c153f5b 100644 (file)
@@ -1477,7 +1477,7 @@ array_alloc(Evas_Engine_GL_Context *gc, int n)
       gc->pipe[n].array.field = _pipebuf_resize(gc->pipe[n].array.field, \
                                                 gc->pipe[n].array.alloc * sizeof(type) * size)
 
-   RALOC(vertex, GLshort, VERTEX_CNT);
+   RALOC(vertex, GLfloat, VERTEX_CNT);
    RALOC(color,  GLubyte, COLOR_CNT);
    RALOC(texuv,  GLfloat, TEX_CNT);
    RALOC(texa,   GLfloat, TEX_CNT);
@@ -1893,14 +1893,21 @@ static int
 pipe_region_intersects(Evas_Engine_GL_Context *gc, int n,
                        int x, int y, int w, int h)
 {
-   int rx, ry, rw, rh, ii, end;
-   const GLshort *v;
-   
+#define SPANS_INTERSECT(x1, w1, x2, w2) \
+(!((((x2) + (w2)) <= (x1)) || ((x2) >= ((x1) + (w1)))))
+
+#define REGIONS_INTERSECT(x, y, w, h, xx, yy, ww, hh) \
+((SPANS_COMMON((x), (w), (xx), (ww))) && (SPANS_COMMON((y), (h), (yy), (hh))))
+
+   float rx, ry, rw, rh;
+   int ii, end;
+   const GLfloat *v;
+
    rx = gc->pipe[n].region.x;
    ry = gc->pipe[n].region.y;
    rw = gc->pipe[n].region.w;
    rh = gc->pipe[n].region.h;
-   if (!RECTS_INTERSECT(x, y, w, h, rx, ry, rw, rh)) return 0;
+   if (!REGIONS_INTERSECT(x, y, w, h, rx, ry, rw, rh)) 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
@@ -1918,7 +1925,7 @@ pipe_region_intersects(Evas_Engine_GL_Context *gc, int n,
         ry = v[ii + 1];
         rw = v[ii + 3] - rx;
         rh = v[ii + 7] - ry;
-        if (RECTS_INTERSECT(x, y, w, h, rx, ry, rw, rh)) return 1;
+        if (REGIONS_INTERSECT(x, y, w, h, rx, ry, rw, rh)) return 1;
      }
    return 0;
 }
@@ -2081,11 +2088,11 @@ evas_gl_common_context_line_push(Evas_Engine_GL_Context *gc,
                                      gc, NULL, mtex,
                                      prog,
                                      0, 0, 0, 0,
-                                     x, y, w, h,
-                                     blend,
-                                     EINA_FALSE,
-                                     0, 0, 0, 0, 0,
-                                     mask_smooth);
+                                   x, y, w, h,
+                                   blend,
+                                   EINA_FALSE,
+                                   0, 0, 0, 0, 0,
+                                   mask_smooth);
 
    gc->pipe[pn].region.type = SHD_LINE;
    gc->pipe[pn].shader.prog = prog;
@@ -3194,16 +3201,14 @@ evas_gl_common_context_image_map_push(Evas_Engine_GL_Context *gc,
        (A_VAL(&(p[2].col)) < 0xff) || (A_VAL(&(p[3].col)) < 0xff))
      blend = EINA_TRUE;
 
-   if ((p[0].z == p[1].z) && (p[1].z == p[2].z) && (p[2].z == p[3].z))
-      flat = EINA_TRUE;
-
-   if (!clip) cx = cy = cw = ch = 0;
-
-   if (!flat)
+   if (((p[0].z == p[1].z) && (p[1].z == p[2].z) && (p[2].z == p[3].z)) ||
+       (p[0].foc <= 0))
      {
-        if (p[0].foc <= 0) flat = EINA_TRUE;
+        flat = EINA_TRUE;
      }
 
+   if (!clip) cx = cy = cw = ch = 0;
+
    switch (cspace)
      {
       case EVAS_COLORSPACE_YCBCR422P601_PL:
@@ -3264,14 +3269,12 @@ evas_gl_common_context_image_map_push(Evas_Engine_GL_Context *gc,
    w = w - x;
    h = h - y;
 
-   if (!flat)
-     {
-        // FUZZZZ!
-        x -= 3;
-        y -= 3;
-        w += 6;
-        h += 6;
-     }
+   // FUZZZZ!
+   x -= 3;
+   y -= 3;
+   w += 6;
+   h += 6;
+
    if (clip)
      {
         if (flat)
@@ -3302,11 +3305,11 @@ evas_gl_common_context_image_map_push(Evas_Engine_GL_Context *gc,
                                        gc, tex, mtex,
                                        prog,
                                        0, 0, 0, 0,
-                                     x, y, w, h,
-                                     blend,
-                                     smooth,
-                                     clip, cx, cy, cw, ch,
-                                     mask_smooth);
+                                       x, y, w, h,
+                                       blend,
+                                       smooth,
+                                       clip, cx, cy, cw, ch,
+                                       mask_smooth);
 
    gc->pipe[pn].region.type = SHD_MAP;
    gc->pipe[pn].shader.prog = prog;
@@ -3374,8 +3377,8 @@ evas_gl_common_context_image_map_push(Evas_Engine_GL_Context *gc,
         if (flat)
           {
              PUSH_VERTEX(pn,
-                         (p[points[i]].x >> FP),
-                         (p[points[i]].y >> FP),
+                         p[points[i]].fx,
+                         p[points[i]].fy,
                          0);
           }
         else
@@ -4405,7 +4408,7 @@ _orig_shader_array_flush(Evas_Engine_GL_Context *gc)
           }
 
         // use_vertex is always true
-        GL_TH(glVertexAttribPointer, SHAD_VERTEX, VERTEX_CNT, GL_SHORT, GL_FALSE, 0, vertex_ptr);
+        GL_TH(glVertexAttribPointer, SHAD_VERTEX, VERTEX_CNT, GL_FLOAT, GL_FALSE, 0, vertex_ptr);
 
         if (gc->pipe[i].array.use_color)
           {
index e121f72..25f837a 100755 (executable)
@@ -1387,7 +1387,8 @@ eng_image_scale_hint_get(void *engine EINA_UNUSED, void *image)
 }
 
 static Eina_Bool
-eng_image_map_draw(void *engine, void *data, void *context, void *surface, void *image, RGBA_Map *m, int smooth, int level, Eina_Bool do_async)
+eng_image_map_draw(void *engine EINA_UNUSED, void *data, void *context, void *surface, void *image,
+                   RGBA_Map *m, int smooth, int level, Eina_Bool do_async EINA_UNUSED)
 {
    Evas_Engine_GL_Context *gl_context;
    Evas_GL_Image *gim = image;
@@ -1397,7 +1398,8 @@ eng_image_map_draw(void *engine, void *data, void *context, void *surface, void
    evas_gl_common_context_target_surface_set(gl_context, surface);
    gl_context->dc = context;
 
-   if ((m->pts[0].x == m->pts[3].x) &&
+   if (!gl_context->msaa &&
+       (m->pts[0].x == m->pts[3].x) &&
        (m->pts[1].x == m->pts[2].x) &&
        (m->pts[0].y == m->pts[1].y) &&
        (m->pts[3].y == m->pts[2].y) &&
@@ -1417,7 +1419,6 @@ eng_image_map_draw(void *engine, void *data, void *context, void *surface, void
        (m->pts[3].col == 0xffffffff))
      {
         int dx, dy, dw, dh;
-
         dx = m->pts[0].x >> FP;
         dy = m->pts[0].y >> FP;
         dw = (m->pts[2].x >> FP) - dx;
index 17f7842..7122f5c 100755 (executable)
@@ -632,6 +632,7 @@ try_gles2:
    glXGetFBConfigAttrib(gw->disp, evis->config, GLX_FBCONFIG_ID, &gw->gl_context->glxcfg_rgb);
    glXGetFBConfigAttrib(gw->disp, evis2->config, GLX_FBCONFIG_ID, &gw->gl_context->glxcfg_rgba);
 #endif
+   gw->gl_context->msaa = (Eina_Bool) msaa_bits;
    eng_window_use(gw);
    glsym_evas_gl_common_context_resize(gw->gl_context, w, h, rot, 1);
    gw->surf = 1;