forked from enlightenment/efl
render-to-texture now is used for evas maps... but only simple cases seem to
work. (in ello) elementary stuff seems... less happy. will work on it! also havent done the gles bits. just desktop gl (first port of call for doing/testing). the #ifdefs are ther waiting with fixme's SVN revision: 43653
This commit is contained in:
parent
7df346f50e
commit
e3fcdd8b48
|
@ -32,6 +32,10 @@ shader/yuv_frag.h \
|
|||
shader/yuv_frag_bin_s3c6410.h \
|
||||
shader/yuv_vert.h \
|
||||
shader/yuv_vert_bin_s3c6410.h \
|
||||
shader/tex_frag.h \
|
||||
shader/tex_frag_bin_s3c6410.h \
|
||||
shader/tex_vert.h \
|
||||
shader/tex_vert_bin_s3c6410.h \
|
||||
evas_gl_rectangle.c \
|
||||
evas_gl_texture.c \
|
||||
evas_gl_image.c \
|
||||
|
@ -63,4 +67,7 @@ shader/font_frag_s3c6410.asm \
|
|||
shader/font_vert.shd \
|
||||
shader/yuv_frag.shd \
|
||||
shader/yuv_frag_s3c6410.asm \
|
||||
shader/yuv_vert.shd
|
||||
shader/yuv_vert.shd \
|
||||
shader/tex_frag.shd \
|
||||
shader/tex_frag_s3c6410.asm \
|
||||
shader/tex_vert.shd
|
||||
|
|
|
@ -91,7 +91,7 @@ struct _Evas_GL_Shared
|
|||
} tex;
|
||||
|
||||
struct {
|
||||
Evas_GL_Program rect, img, font, yuv;
|
||||
Evas_GL_Program rect, img, font, yuv, tex;
|
||||
} shader;
|
||||
int references;
|
||||
int w, h;
|
||||
|
@ -109,13 +109,16 @@ struct _Evas_GL_Context
|
|||
Eina_Bool active : 1;
|
||||
} clip;
|
||||
struct {
|
||||
Evas_GL_Image *surface;
|
||||
GLuint cur_prog;
|
||||
GLuint cur_tex, cur_texu, cur_texv;
|
||||
int render_op;
|
||||
Eina_Bool smooth : 1;
|
||||
Eina_Bool blend : 1;
|
||||
struct {
|
||||
GLuint cur_prog;
|
||||
GLuint cur_tex, cur_texum, cur_texv;
|
||||
int render_op;
|
||||
Eina_Bool smooth : 1;
|
||||
Eina_Bool blend : 1;
|
||||
} current;
|
||||
|
@ -132,12 +135,14 @@ struct _Evas_GL_Context
|
|||
struct {
|
||||
Eina_Bool size : 1;
|
||||
} change;
|
||||
|
||||
Evas_GL_Image *def_surface;
|
||||
};
|
||||
|
||||
struct _Evas_GL_Texture_Pool
|
||||
{
|
||||
Evas_GL_Context *gc;
|
||||
GLuint texture;
|
||||
GLuint texture, fb;
|
||||
GLuint intformat, format, dataformat;
|
||||
int w, h;
|
||||
int references;
|
||||
|
@ -162,6 +167,8 @@ struct _Evas_GL_Image
|
|||
Evas_GL_Texture *tex;
|
||||
RGBA_Image_Loadopts load_opts;
|
||||
int references;
|
||||
// if im->im == NULL, it's a render-surface so these here are used
|
||||
int w, h;
|
||||
struct {
|
||||
int space;
|
||||
void *data;
|
||||
|
@ -169,6 +176,8 @@ struct _Evas_GL_Image
|
|||
} cs;
|
||||
unsigned char dirty : 1;
|
||||
unsigned char cached : 1;
|
||||
unsigned char alpha : 1;
|
||||
unsigned char tex_only : 1;
|
||||
};
|
||||
|
||||
struct _Evas_GL_Font_Texture
|
||||
|
@ -213,6 +222,8 @@ extern Evas_GL_Program_Source shader_font_frag_src;
|
|||
extern Evas_GL_Program_Source shader_font_vert_src;
|
||||
extern Evas_GL_Program_Source shader_yuv_frag_src;
|
||||
extern Evas_GL_Program_Source shader_yuv_vert_src;
|
||||
extern Evas_GL_Program_Source shader_tex_frag_src;
|
||||
extern Evas_GL_Program_Source shader_tex_vert_src;
|
||||
|
||||
void glerr(const char *file, const char *func, int line, const char *op);
|
||||
|
||||
|
@ -220,6 +231,7 @@ Evas_GL_Context *evas_gl_common_context_new(void);
|
|||
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_resize(Evas_GL_Context *gc, int w, int h);
|
||||
void evas_gl_common_context_target_surface_set(Evas_GL_Context *gc, Evas_GL_Image *surface);
|
||||
|
||||
void evas_gl_common_context_rectangle_push(Evas_GL_Context *gc,
|
||||
int x, int y, int w, int h,
|
||||
|
@ -246,7 +258,8 @@ void evas_gl_common_context_image_map4_push(Evas_GL_Context *gc,
|
|||
RGBA_Map_Point *p,
|
||||
int clip, int cx, int cy, int cw, int ch,
|
||||
int r, int g, int b, int a,
|
||||
Eina_Bool smooth);
|
||||
Eina_Bool smooth,
|
||||
Eina_Bool tex_only);
|
||||
void evas_gl_common_context_flush(Evas_GL_Context *gc);
|
||||
|
||||
void evas_gl_common_shader_program_init(Evas_GL_Program *p,
|
||||
|
@ -257,6 +270,7 @@ void evas_gl_common_shader_program_init(Evas_GL_Program *p,
|
|||
void evas_gl_common_rect_draw(Evas_GL_Context *gc, int x, int y, int w, int h);
|
||||
|
||||
Evas_GL_Texture *evas_gl_common_texture_new(Evas_GL_Context *gc, RGBA_Image *im);
|
||||
Evas_GL_Texture *evas_gl_common_texture_render_new(Evas_GL_Context *gc, int w, int h, int alpha);
|
||||
void evas_gl_common_texture_update(Evas_GL_Texture *tex, RGBA_Image *im);
|
||||
void evas_gl_common_texture_free(Evas_GL_Texture *tex);
|
||||
Evas_GL_Texture *evas_gl_common_texture_alpha_new(Evas_GL_Context *gc, DATA8 *pixels, int w, int h, int fh);
|
||||
|
@ -269,6 +283,7 @@ Evas_GL_Image *evas_gl_common_image_new_from_data(Evas_GL_Context *gc, int w,
|
|||
Evas_GL_Image *evas_gl_common_image_new_from_copied_data(Evas_GL_Context *gc, int w, int h, DATA32 *data, int alpha, int cspace);
|
||||
Evas_GL_Image *evas_gl_common_image_new(Evas_GL_Context *gc, int w, int h, int alpha, int cspace);
|
||||
void evas_gl_common_image_free(Evas_GL_Image *im);
|
||||
Evas_GL_Image *evas_gl_common_image_surface_new(Evas_GL_Context *gc, int w, int h, int alpha);
|
||||
void evas_gl_common_image_dirty(Evas_GL_Image *im);
|
||||
void evas_gl_common_image_map4_draw(Evas_GL_Context *gc, Evas_GL_Image *im, RGBA_Map_Point *p, int smooth, int level);
|
||||
void evas_gl_common_image_draw(Evas_GL_Context *gc, Evas_GL_Image *im, int sx, int sy, int sw, int sh, int dx, int dy, int dw, int dh, int smooth);
|
||||
|
|
|
@ -40,7 +40,10 @@ matrix_ident(GLfloat *m)
|
|||
}
|
||||
|
||||
static void
|
||||
matrix_ortho(GLfloat *m, GLfloat l, GLfloat r, GLfloat t, GLfloat b, GLfloat near, GLfloat far)
|
||||
matrix_ortho(GLfloat *m,
|
||||
GLfloat l, GLfloat r,
|
||||
GLfloat t, GLfloat b,
|
||||
GLfloat near, GLfloat far)
|
||||
{
|
||||
m[0] = 2.0 / (r - l);
|
||||
m[1] = m[2] = m[3] = 0.0;
|
||||
|
@ -63,18 +66,35 @@ static void
|
|||
_evas_gl_common_viewport_set(Evas_GL_Context *gc)
|
||||
{
|
||||
GLfloat proj[16];
|
||||
int w = 1, h = 1, m = 1;
|
||||
|
||||
if ((gc->shader.surface == gc->def_surface) ||
|
||||
(!gc->shader.surface))
|
||||
{
|
||||
w = gc->w;
|
||||
h = gc->h;
|
||||
}
|
||||
else
|
||||
{
|
||||
w = gc->shader.surface->w;
|
||||
h = gc->shader.surface->h;
|
||||
m = -1;
|
||||
}
|
||||
|
||||
if ((!gc->change.size) ||
|
||||
((gc->shared->w == gc->w) && (gc->shared->h == gc->h)))
|
||||
((gc->shared->w == w) && (gc->shared->h == gc->h)))
|
||||
return;
|
||||
gc->shared->w = gc->w;
|
||||
gc->shared->h = gc->h;
|
||||
gc->shared->w = w;
|
||||
gc->shared->h = h;
|
||||
gc->change.size = 0;
|
||||
|
||||
glViewport(0, 0, gc->w, gc->h);
|
||||
glViewport(0, 0, w, h);
|
||||
|
||||
matrix_ident(proj);
|
||||
matrix_ortho(proj, 0, gc->w, 0, gc->h, -1.0, 1.0);
|
||||
if (m == 1)
|
||||
matrix_ortho(proj, 0, w, 0, h, -1.0, 1.0);
|
||||
else
|
||||
matrix_ortho(proj, 0, w, h, 0, -1.0, 1.0);
|
||||
|
||||
glUseProgram(gc->shared->shader.rect.prog);
|
||||
glUniformMatrix4fv(glGetUniformLocation(gc->shared->shader.rect.prog, "mvp"), 1,
|
||||
|
@ -88,6 +108,9 @@ _evas_gl_common_viewport_set(Evas_GL_Context *gc)
|
|||
glUseProgram(gc->shared->shader.yuv.prog);
|
||||
glUniformMatrix4fv(glGetUniformLocation(gc->shared->shader.yuv.prog, "mvp"), 1,
|
||||
GL_FALSE, proj);
|
||||
glUseProgram(gc->shared->shader.tex.prog);
|
||||
glUniformMatrix4fv(glGetUniformLocation(gc->shared->shader.tex.prog, "mvp"), 1,
|
||||
GL_FALSE, proj);
|
||||
}
|
||||
|
||||
Evas_GL_Context *
|
||||
|
@ -150,7 +173,9 @@ evas_gl_common_context_new(void)
|
|||
glEnable(GL_DITHER);
|
||||
glDisable(GL_BLEND);
|
||||
glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
|
||||
// glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
||||
// no dest alpha
|
||||
// glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); // dest alpha
|
||||
// glBlendFunc(GL_SRC_ALPHA, GL_ONE); // ???
|
||||
glDepthMask(GL_FALSE);
|
||||
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
||||
|
@ -181,6 +206,10 @@ evas_gl_common_context_new(void)
|
|||
&(shader_yuv_vert_src),
|
||||
&(shader_yuv_frag_src),
|
||||
"yuv");
|
||||
evas_gl_common_shader_program_init(&(shared->shader.tex),
|
||||
&(shader_tex_vert_src),
|
||||
&(shader_tex_frag_src),
|
||||
"tex");
|
||||
glUseProgram(shared->shader.yuv.prog);
|
||||
glUniform1i(glGetUniformLocation(shared->shader.yuv.prog, "tex"), 0);
|
||||
glUniform1i(glGetUniformLocation(shared->shader.yuv.prog, "texu"), 1);
|
||||
|
@ -197,6 +226,8 @@ evas_gl_common_context_new(void)
|
|||
gc->shared->references++;
|
||||
_evas_gl_common_viewport_set(gc);
|
||||
|
||||
gc->def_surface = evas_gl_common_image_surface_new(gc, 1, 1, 1);
|
||||
|
||||
return gc;
|
||||
}
|
||||
|
||||
|
@ -223,13 +254,16 @@ evas_gl_common_context_free(Evas_GL_Context *gc)
|
|||
for (j = 0; j < 3; j++)
|
||||
{
|
||||
while (gc->shared->tex.atlas[i][j])
|
||||
evas_gl_common_texture_free(gc->shared->tex.atlas[i][j]);
|
||||
evas_gl_common_texture_free
|
||||
((Evas_GL_Texture *)gc->shared->tex.atlas[i][j]);
|
||||
}
|
||||
}
|
||||
free(gc->shared);
|
||||
shared = NULL;
|
||||
}
|
||||
|
||||
evas_gl_common_image_free(gc->def_surface);
|
||||
|
||||
free(gc->array.vertex);
|
||||
free(gc->array.color);
|
||||
free(gc->array.texuv);
|
||||
|
@ -258,6 +292,32 @@ evas_gl_common_context_resize(Evas_GL_Context *gc, int w, int h)
|
|||
if (_evas_gl_common_context == gc) _evas_gl_common_viewport_set(gc);
|
||||
}
|
||||
|
||||
void
|
||||
evas_gl_common_context_target_surface_set(Evas_GL_Context *gc,
|
||||
Evas_GL_Image *surface)
|
||||
{
|
||||
if (surface == gc->shader.surface) return;
|
||||
|
||||
evas_gl_common_context_flush(gc);
|
||||
|
||||
gc->shader.surface = surface;
|
||||
#if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX)
|
||||
// FIXME: XXX render-to-texture for gles2
|
||||
#else
|
||||
// FIXME: viewport goopies
|
||||
gc->change.size = 1;
|
||||
if (gc->shader.surface == gc->def_surface)
|
||||
{
|
||||
glBindFramebuffer(GL_FRAMEBUFFER_EXT, 0);
|
||||
}
|
||||
else
|
||||
{
|
||||
glBindFramebuffer(GL_FRAMEBUFFER_EXT, surface->tex->pt->fb);
|
||||
}
|
||||
_evas_gl_common_viewport_set(gc);
|
||||
#endif
|
||||
}
|
||||
|
||||
#define PUSH_VERTEX(x, y, z) \
|
||||
gc->array.vertex[nv++] = x; \
|
||||
gc->array.vertex[nv++] = y; \
|
||||
|
@ -303,15 +363,18 @@ evas_gl_common_context_rectangle_push(Evas_GL_Context *gc,
|
|||
Eina_Bool blend = 0;
|
||||
|
||||
if (a < 255) blend = 1;
|
||||
if (gc->dc->render_op == EVAS_RENDER_COPY) blend = 0;
|
||||
if ((gc->shader.cur_tex != 0)
|
||||
|| (gc->shader.cur_prog != gc->shared->shader.rect.prog)
|
||||
|| (gc->shader.blend != blend)
|
||||
|| (gc->shader.render_op != gc->dc->render_op)
|
||||
)
|
||||
{
|
||||
shader_array_flush(gc);
|
||||
gc->shader.cur_tex = 0;
|
||||
gc->shader.cur_prog = gc->shared->shader.rect.prog;
|
||||
gc->shader.blend = blend;
|
||||
gc->shader.render_op = gc->dc->render_op;
|
||||
}
|
||||
|
||||
pnum = gc->array.num;
|
||||
|
@ -356,6 +419,7 @@ evas_gl_common_context_image_push(Evas_GL_Context *gc,
|
|||
|| (gc->shader.cur_prog != gc->shared->shader.img.prog)
|
||||
|| (gc->shader.smooth != smooth)
|
||||
|| (gc->shader.blend != blend)
|
||||
|| (gc->shader.render_op != gc->dc->render_op)
|
||||
)
|
||||
{
|
||||
shader_array_flush(gc);
|
||||
|
@ -363,6 +427,7 @@ evas_gl_common_context_image_push(Evas_GL_Context *gc,
|
|||
gc->shader.cur_prog = gc->shared->shader.img.prog;
|
||||
gc->shader.smooth = smooth;
|
||||
gc->shader.blend = blend;
|
||||
gc->shader.render_op = gc->dc->render_op;
|
||||
}
|
||||
|
||||
pnum = gc->array.num;
|
||||
|
@ -411,6 +476,7 @@ evas_gl_common_context_font_push(Evas_GL_Context *gc,
|
|||
|| (gc->shader.cur_prog != gc->shared->shader.font.prog)
|
||||
|| (gc->shader.smooth != 0)
|
||||
|| (gc->shader.blend != 1)
|
||||
|| (gc->shader.render_op != gc->dc->render_op)
|
||||
)
|
||||
{
|
||||
shader_array_flush(gc);
|
||||
|
@ -418,6 +484,7 @@ evas_gl_common_context_font_push(Evas_GL_Context *gc,
|
|||
gc->shader.cur_prog = gc->shared->shader.font.prog;
|
||||
gc->shader.smooth = 0;
|
||||
gc->shader.blend = 1;
|
||||
gc->shader.render_op = gc->dc->render_op;
|
||||
}
|
||||
|
||||
pnum = gc->array.num;
|
||||
|
@ -480,6 +547,7 @@ evas_gl_common_context_yuv_push(Evas_GL_Context *gc,
|
|||
|| (gc->shader.cur_prog != gc->shared->shader.yuv.prog)
|
||||
|| (gc->shader.smooth != smooth)
|
||||
|| (gc->shader.blend != blend)
|
||||
|| (gc->shader.render_op != gc->dc->render_op)
|
||||
)
|
||||
{
|
||||
shader_array_flush(gc);
|
||||
|
@ -489,6 +557,7 @@ evas_gl_common_context_yuv_push(Evas_GL_Context *gc,
|
|||
gc->shader.cur_prog = gc->shared->shader.yuv.prog;
|
||||
gc->shader.smooth = smooth;
|
||||
gc->shader.blend = blend;
|
||||
gc->shader.render_op = gc->dc->render_op;
|
||||
}
|
||||
|
||||
pnum = gc->array.num;
|
||||
|
@ -551,7 +620,7 @@ evas_gl_common_context_image_map4_push(Evas_GL_Context *gc,
|
|||
RGBA_Map_Point *p,
|
||||
int clip, int cx, int cy, int cw, int ch,
|
||||
int r, int g, int b, int a,
|
||||
Eina_Bool smooth)
|
||||
Eina_Bool smooth, Eina_Bool tex_only)
|
||||
{
|
||||
int pnum, nv, nc, nu, nt, i;
|
||||
const int points[6] = { 0, 1, 2, 0, 2, 3 };
|
||||
|
@ -566,16 +635,22 @@ evas_gl_common_context_image_map4_push(Evas_GL_Context *gc,
|
|||
// if (a < 255) blend = 1;
|
||||
|
||||
if ((gc->shader.cur_tex != tex->pt->texture)
|
||||
|| (gc->shader.cur_prog != gc->shared->shader.img.prog)
|
||||
|| ((tex_only) && (gc->shader.cur_prog != gc->shared->shader.tex.prog))
|
||||
|| ((!tex_only) && (gc->shader.cur_prog != gc->shared->shader.img.prog))
|
||||
|| (gc->shader.smooth != smooth)
|
||||
|| (gc->shader.blend != blend)
|
||||
|| (gc->shader.render_op != gc->dc->render_op)
|
||||
)
|
||||
{
|
||||
shader_array_flush(gc);
|
||||
gc->shader.cur_tex = tex->pt->texture;
|
||||
gc->shader.cur_prog = gc->shared->shader.img.prog;
|
||||
if (tex_only)
|
||||
gc->shader.cur_prog = gc->shared->shader.tex.prog;
|
||||
else
|
||||
gc->shader.cur_prog =gc->shared->shader.img.prog;
|
||||
gc->shader.smooth = smooth;
|
||||
gc->shader.blend = blend;
|
||||
gc->shader.render_op = gc->dc->render_op;
|
||||
}
|
||||
|
||||
pnum = gc->array.num;
|
||||
|
@ -635,6 +710,33 @@ shader_array_flush(Evas_GL_Context *gc)
|
|||
else
|
||||
glDisable(GL_BLEND);
|
||||
}
|
||||
if (gc->shader.render_op != gc->shader.current.render_op)
|
||||
{
|
||||
switch (gc->shader.render_op)
|
||||
{
|
||||
case EVAS_RENDER_BLEND: /**< default op: d = d*(1-sa) + s */
|
||||
glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
|
||||
break;
|
||||
case EVAS_RENDER_COPY: /**< d = s */
|
||||
glDisable(GL_BLEND);
|
||||
glBlendFunc(GL_ONE, GL_ONE);
|
||||
break;
|
||||
// FIXME: fix blend funcs below!
|
||||
case EVAS_RENDER_BLEND_REL: /**< d = d*(1 - sa) + s*da */
|
||||
case EVAS_RENDER_COPY_REL: /**< d = s*da */
|
||||
case EVAS_RENDER_ADD: /**< d = d + s */
|
||||
case EVAS_RENDER_ADD_REL: /**< d = d + s*da */
|
||||
case EVAS_RENDER_SUB: /**< d = d - s */
|
||||
case EVAS_RENDER_SUB_REL: /**< d = d - s*da */
|
||||
case EVAS_RENDER_TINT: /**< d = d*s + d*(1 - sa) + s*(1 - da) */
|
||||
case EVAS_RENDER_TINT_REL: /**< d = d*(1 - sa + s) */
|
||||
case EVAS_RENDER_MASK: /**< d = d*sa */
|
||||
case EVAS_RENDER_MUL: /**< d = d*s */
|
||||
default:
|
||||
glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (gc->shader.smooth != gc->shader.current.smooth)
|
||||
{
|
||||
if (gc->shader.smooth)
|
||||
|
@ -685,6 +787,7 @@ shader_array_flush(Evas_GL_Context *gc)
|
|||
gc->shader.current.cur_tex = gc->shader.cur_tex;
|
||||
gc->shader.current.blend = gc->shader.blend;
|
||||
gc->shader.current.smooth = gc->shader.smooth;
|
||||
gc->shader.current.render_op = gc->shader.render_op;
|
||||
|
||||
free(gc->array.vertex);
|
||||
free(gc->array.color);
|
||||
|
|
|
@ -30,6 +30,9 @@ evas_gl_common_image_load(Evas_GL_Context *gc, const char *file, const char *key
|
|||
im->references = 1;
|
||||
im->cached = 1;
|
||||
im->cs.space = EVAS_COLORSPACE_ARGB8888;
|
||||
im->alpha = im->im->cache_entry.flags.alpha;
|
||||
im->w = im->im->cache_entry.w;
|
||||
im->h = im->im->cache_entry.h;
|
||||
if (lo) im->load_opts = *lo;
|
||||
gc->shared->images = eina_list_prepend(gc->shared->images, im);
|
||||
return im;
|
||||
|
@ -65,6 +68,9 @@ evas_gl_common_image_new_from_data(Evas_GL_Context *gc, int w, int h, DATA32 *da
|
|||
}
|
||||
im->gc = gc;
|
||||
im->cs.space = cspace;
|
||||
im->alpha = im->im->cache_entry.flags.alpha;
|
||||
im->w = im->im->cache_entry.w;
|
||||
im->h = im->im->cache_entry.h;
|
||||
switch (cspace)
|
||||
{
|
||||
case EVAS_COLORSPACE_ARGB8888:
|
||||
|
@ -104,6 +110,9 @@ evas_gl_common_image_new_from_copied_data(Evas_GL_Context *gc, int w, int h, DAT
|
|||
}
|
||||
im->gc = gc;
|
||||
im->cs.space = cspace;
|
||||
im->alpha = im->im->cache_entry.flags.alpha;
|
||||
im->w = im->im->cache_entry.w;
|
||||
im->h = im->im->cache_entry.h;
|
||||
switch (cspace)
|
||||
{
|
||||
case EVAS_COLORSPACE_ARGB8888:
|
||||
|
@ -139,8 +148,11 @@ evas_gl_common_image_new(Evas_GL_Context *gc, int w, int h, int alpha, int cspac
|
|||
return NULL;
|
||||
}
|
||||
im->gc = gc;
|
||||
im->cs.space = cspace;
|
||||
im->im->cache_entry.flags.alpha = alpha ? 1 : 0;
|
||||
im->cs.space = cspace;
|
||||
im->alpha = im->im->cache_entry.flags.alpha;
|
||||
im->w = im->im->cache_entry.w;
|
||||
im->h = im->im->cache_entry.h;
|
||||
evas_cache_image_colorspace(&im->im->cache_entry, cspace);
|
||||
im->im = (RGBA_Image *) evas_cache_image_size_set(&im->im->cache_entry, w, h);
|
||||
switch (cspace)
|
||||
|
@ -177,16 +189,38 @@ evas_gl_common_image_free(Evas_GL_Image *im)
|
|||
free(im);
|
||||
}
|
||||
|
||||
Evas_GL_Image *
|
||||
evas_gl_common_image_surface_new(Evas_GL_Context *gc, int w, int h, int alpha)
|
||||
{
|
||||
Evas_GL_Image *im;
|
||||
|
||||
im = calloc(1, sizeof(Evas_GL_Image));
|
||||
if (!im) return NULL;
|
||||
im->references = 1;
|
||||
im->gc = gc;
|
||||
im->cs.space = EVAS_COLORSPACE_ARGB8888;
|
||||
im->alpha = alpha;
|
||||
im->w = w;
|
||||
im->h = h;
|
||||
im->tex = evas_gl_common_texture_render_new(gc, w, h, alpha);
|
||||
im->tex_only = 1;
|
||||
return im;
|
||||
}
|
||||
|
||||
void
|
||||
evas_gl_common_image_dirty(Evas_GL_Image *im)
|
||||
{
|
||||
if (im->im)
|
||||
{
|
||||
im->im = (RGBA_Image *) evas_cache_image_dirty(&im->im->cache_entry, 0, 0, im->im->cache_entry.w, im->im->cache_entry.h);
|
||||
}
|
||||
im->dirty = 1;
|
||||
}
|
||||
|
||||
static void
|
||||
image_update(Evas_GL_Context *gc, Evas_GL_Image *im)
|
||||
_evas_gl_common_image_update(Evas_GL_Context *gc, Evas_GL_Image *im)
|
||||
{
|
||||
if (!im->im) return;
|
||||
/*
|
||||
if ((im->cs.space == EVAS_COLORSPACE_YCBCR422P601_PL) ||
|
||||
(im->cs.space == EVAS_COLORSPACE_YCBCR422P709_PL))
|
||||
|
@ -266,14 +300,16 @@ evas_gl_common_image_map4_draw(Evas_GL_Context *gc, Evas_GL_Image *im,
|
|||
r = g = b = a = 255;
|
||||
}
|
||||
|
||||
image_update(gc, im);
|
||||
_evas_gl_common_image_update(gc, im);
|
||||
|
||||
glFlush();
|
||||
|
||||
c = gc->dc->clip.use;
|
||||
cx = gc->dc->clip.x; cy = gc->dc->clip.y;
|
||||
cw = gc->dc->clip.w; ch = gc->dc->clip.h;
|
||||
evas_gl_common_context_image_map4_push(gc, im->tex, p,
|
||||
c, cx, cy, cw, ch,
|
||||
r, g, b, a, smooth);
|
||||
r, g, b, a, smooth, im->tex_only);
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -303,7 +339,7 @@ evas_gl_common_image_draw(Evas_GL_Context *gc, Evas_GL_Image *im, int sx, int sy
|
|||
r = g = b = a = 255;
|
||||
}
|
||||
|
||||
image_update(gc, im);
|
||||
_evas_gl_common_image_update(gc, im);
|
||||
|
||||
if ((im->cs.space == EVAS_COLORSPACE_YCBCR422P601_PL) ||
|
||||
(im->cs.space == EVAS_COLORSPACE_YCBCR422P709_PL))
|
||||
|
|
|
@ -13,7 +13,7 @@ evas_gl_common_rect_draw(Evas_GL_Context *gc, int x, int y, int w, int h)
|
|||
c = gc->dc->clip.use; cx = gc->dc->clip.x; cy = gc->dc->clip.y; cw = gc->dc->clip.w; ch = gc->dc->clip.h;
|
||||
|
||||
ca = (gc->dc->col.col >> 24) & 0xff;
|
||||
if (ca <= 0) return;
|
||||
// if (ca <= 0) return;
|
||||
cr = (gc->dc->col.col >> 16) & 0xff;
|
||||
cg = (gc->dc->col.col >> 8 ) & 0xff;
|
||||
cb = (gc->dc->col.col ) & 0xff;
|
||||
|
|
|
@ -160,6 +160,46 @@ Evas_GL_Program_Source shader_yuv_vert_src =
|
|||
#endif
|
||||
};
|
||||
|
||||
/////////////////////////////////////////////
|
||||
#if defined (GLES_VARIETY_S3C6410)
|
||||
const unsigned int tex_frag_bin[] =
|
||||
{
|
||||
# include "shader/tex_frag_bin_s3c6410.h"
|
||||
};
|
||||
#endif
|
||||
|
||||
const char tex_frag_glsl[] =
|
||||
#include "shader/tex_frag.h"
|
||||
;
|
||||
Evas_GL_Program_Source shader_tex_frag_src =
|
||||
{
|
||||
tex_frag_glsl,
|
||||
#if defined (GLES_VARIETY_S3C6410)
|
||||
tex_frag_bin, sizeof(tex_frag_bin)
|
||||
#else
|
||||
NULL, 0
|
||||
#endif
|
||||
};
|
||||
|
||||
#if defined (GLES_VARIETY_S3C6410)
|
||||
const unsigned int tex_vert_bin[] =
|
||||
{
|
||||
# include "shader/tex_vert_bin_s3c6410.h"
|
||||
};
|
||||
#endif
|
||||
const char tex_vert_glsl[] =
|
||||
#include "shader/tex_vert.h"
|
||||
;
|
||||
Evas_GL_Program_Source shader_tex_vert_src =
|
||||
{
|
||||
tex_vert_glsl,
|
||||
#if defined (GLES_VARIETY_S3C6410)
|
||||
tex_vert_bin, sizeof(tex_vert_bin)
|
||||
#else
|
||||
NULL, 0
|
||||
#endif
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
|
@ -252,6 +252,67 @@ evas_gl_common_texture_new(Evas_GL_Context *gc, RGBA_Image *im)
|
|||
return tex;
|
||||
}
|
||||
|
||||
static Evas_GL_Texture_Pool *
|
||||
_pool_tex_render_new(Evas_GL_Context *gc, int w, int h, int intformat, int format)
|
||||
{
|
||||
Evas_GL_Texture_Pool *pt;
|
||||
|
||||
pt = calloc(1, sizeof(Evas_GL_Texture_Pool));
|
||||
if (!pt) return NULL;
|
||||
h = _tex_round_slot(gc, h) << 4;
|
||||
_tex_adjust(gc, &w, &h);
|
||||
pt->gc = gc;
|
||||
pt->w = w;
|
||||
pt->h = h;
|
||||
pt->intformat = intformat;
|
||||
pt->format = format;
|
||||
pt->dataformat = GL_UNSIGNED_BYTE;
|
||||
pt->references = 0;
|
||||
#if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX)
|
||||
// FIXME: XXX render-to-texture for gles2
|
||||
#else
|
||||
glGenTextures(1, &(pt->texture));
|
||||
glBindTexture(GL_TEXTURE_2D, pt->texture);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
|
||||
_tex_2d(pt->intformat, w, h, pt->format, pt->dataformat);
|
||||
glGenFramebuffers(1, &(pt->fb));
|
||||
glBindFramebuffer(GL_FRAMEBUFFER_EXT, pt->fb);
|
||||
glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, pt->texture, 0);
|
||||
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
|
||||
glBindTexture(GL_TEXTURE_2D, gc->shader.cur_tex);
|
||||
#endif
|
||||
return pt;
|
||||
}
|
||||
|
||||
Evas_GL_Texture *
|
||||
evas_gl_common_texture_render_new(Evas_GL_Context *gc, int w, int h, int alpha)
|
||||
{
|
||||
Evas_GL_Texture *tex;
|
||||
Eina_List *l_after = NULL;
|
||||
int u = 0, v = 0;
|
||||
|
||||
tex = calloc(1, sizeof(Evas_GL_Texture));
|
||||
if (!tex) return NULL;
|
||||
|
||||
tex->gc = gc;
|
||||
tex->references = 1;
|
||||
tex->pt = _pool_tex_render_new(gc, w, h, rgba_ifmt, rgba_fmt);
|
||||
if (!tex->pt)
|
||||
{
|
||||
free(tex);
|
||||
return NULL;
|
||||
}
|
||||
tex->x = 0;
|
||||
tex->y = 0;
|
||||
tex->w = w;
|
||||
tex->h = h;
|
||||
tex->pt->references++;
|
||||
return tex;
|
||||
}
|
||||
|
||||
void
|
||||
evas_gl_common_texture_update(Evas_GL_Texture *tex, RGBA_Image *im)
|
||||
{
|
||||
|
|
|
@ -33,3 +33,4 @@ compile rect
|
|||
compile img
|
||||
compile font
|
||||
compile yuv
|
||||
compile tex
|
||||
|
|
|
@ -11,3 +11,4 @@ compile rect
|
|||
compile img
|
||||
compile font
|
||||
compile yuv
|
||||
compile tex
|
||||
|
|
|
@ -0,0 +1,10 @@
|
|||
"#ifdef GL_ES\n"
|
||||
"precision mediump float;\n"
|
||||
"#endif\n"
|
||||
"uniform sampler2D tex;\n"
|
||||
"varying vec4 col;\n"
|
||||
"varying vec2 tex_c;\n"
|
||||
"void main()\n"
|
||||
"{\n"
|
||||
" gl_FragColor = texture2D(tex, tex_c.xy) * col;\n"
|
||||
"}\n"
|
|
@ -0,0 +1,10 @@
|
|||
#ifdef GL_ES
|
||||
precision mediump float;
|
||||
#endif
|
||||
uniform sampler2D tex;
|
||||
varying vec4 col;
|
||||
varying vec2 tex_c;
|
||||
void main()
|
||||
{
|
||||
gl_FragColor = texture2D(tex, tex_c.xy) * col;
|
||||
}
|
|
@ -0,0 +1,9 @@
|
|||
0x20205350, 0xffff0008, 0x00000048, 0x01020000, 0x00000003, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000002, 0x00000000, 0x00000000, 0x00000001,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x0000000e, 0x00000000,
|
||||
0x00000000, 0x0000e407, 0x307820e4, 0x00000000, 0x01000000, 0x0100e400,
|
||||
0x237a10e4, 0x00000000, 0x00000000, 0x00000000, 0x1e000000, 0x00000000,
|
||||
0x00000004, 0x00000003, 0x00000009, 0x00000000, 0x00000004, 0x00000008,
|
||||
0x00000005, 0x00000003, 0x00000000, 0x00000000, 0x00000000, 0x00000003,
|
||||
0x0000000f, 0x00030005, 0x00000000, 0x00786574, 0x006c6f63, 0x5f786574,
|
||||
0x00000063,
|
|
@ -0,0 +1,26 @@
|
|||
|
||||
#-------------------------------------------------
|
||||
# ORION - OpenGL ES 2.0 Shading Language Compiler
|
||||
# SAMSUNG INDIA SOFTWARE OPERATIONS PVT. LTD.
|
||||
# Compiler Version : v04.00.09
|
||||
# Release Date : 19.01.2009
|
||||
# FIMG VERSION : FIMGv1.5
|
||||
# Optimizer Options : -O --nolodcalc
|
||||
#-------------------------------------------------
|
||||
|
||||
# hand optimised - removed useless ops
|
||||
|
||||
ps_3_0
|
||||
|
||||
fimg_version 0x01020000
|
||||
|
||||
dcl_s2_tex s0
|
||||
dcl_f4_col v1.x
|
||||
dcl_f2_tex_c v0.x
|
||||
|
||||
label start
|
||||
label main_
|
||||
texld r0.xyzw, v0.xyzw, s0 # tex=s0
|
||||
mul_sat oColor.xyzw, r0.xyzw, v1.xyzw # gl_FragColor=oColor.xyzw, col=v1.xyzw
|
||||
label main_end
|
||||
ret
|
|
@ -0,0 +1,15 @@
|
|||
"#ifdef GL_ES\n"
|
||||
"precision mediump float;\n"
|
||||
"#endif\n"
|
||||
"attribute vec4 vertex;\n"
|
||||
"attribute vec4 color;\n"
|
||||
"attribute vec2 tex_coord;\n"
|
||||
"uniform mat4 mvp;\n"
|
||||
"varying vec4 col;\n"
|
||||
"varying vec2 tex_c;\n"
|
||||
"void main()\n"
|
||||
"{\n"
|
||||
" gl_Position = mvp * vertex;\n"
|
||||
" col = color;\n"
|
||||
" tex_c = tex_coord;\n"
|
||||
"}\n"
|
|
@ -0,0 +1,15 @@
|
|||
#ifdef GL_ES
|
||||
precision mediump float;
|
||||
#endif
|
||||
attribute vec4 vertex;
|
||||
attribute vec4 color;
|
||||
attribute vec2 tex_coord;
|
||||
uniform mat4 mvp;
|
||||
varying vec4 col;
|
||||
varying vec2 tex_c;
|
||||
void main()
|
||||
{
|
||||
gl_Position = mvp * vertex;
|
||||
col = color;
|
||||
tex_c = tex_coord;
|
||||
}
|
|
@ -0,0 +1,20 @@
|
|||
0x20205356, 0xffff0008, 0x00000048, 0x01020000, 0x00000007, 0x00000006,
|
||||
0x00000000, 0x00000000, 0x00000003, 0x00000003, 0x00000001, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000031, 0x00000000,
|
||||
0x00000000, 0x02020000, 0x237820e4, 0x00000000, 0x00e40100, 0x02035500,
|
||||
0x2ef820e4, 0x00000000, 0x00e40100, 0x0204aa00, 0x2ef820e4, 0x00000000,
|
||||
0x00e40100, 0x0205ff00, 0x2ef800e4, 0x00000000, 0x00000000, 0x00010000,
|
||||
0x20f801e4, 0x00000000, 0x00000000, 0x00020000, 0x20980254, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x1e000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x3f800000, 0x3f800000, 0x3f800000, 0x3f800000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x0000000c, 0x00000006,
|
||||
0x00000009, 0x00000000, 0x00000000, 0x00000013, 0x00000005, 0x00000009,
|
||||
0x00000000, 0x00000004, 0x00000019, 0x00000009, 0x00000003, 0x00000000,
|
||||
0x00000008, 0x00000000, 0x0000000b, 0x00000009, 0x00010004, 0x00000000,
|
||||
0x00000027, 0x00000003, 0x00000009, 0x00010004, 0x00000004, 0x0000002b,
|
||||
0x00000005, 0x00000003, 0x00010004, 0x00000008, 0x00000023, 0x00000003,
|
||||
0x0000000e, 0x00020001, 0x00000008, 0x505f6c67, 0x7469736f, 0x006e6f69,
|
||||
0x74726576, 0x63007865, 0x726f6c6f, 0x78657400, 0x6f6f635f, 0x6d006472,
|
||||
0x63007076, 0x74006c6f, 0x635f7865, 0x00000000,
|
|
@ -250,7 +250,7 @@ eng_output_redraws_next_update_get(void *data, int *x, int *y, int *w, int *h, i
|
|||
// glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
|
||||
// glClear(GL_COLOR_BUFFER_BIT);
|
||||
//x// printf("frame -> new\n");
|
||||
return re;
|
||||
return re->win->gl_context->def_surface;
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -333,23 +333,25 @@ eng_context_cutout_clear(void *data, void *context)
|
|||
}
|
||||
|
||||
static void
|
||||
eng_rectangle_draw(void *data, void *context, void *surface __UNUSED__, int x, int y, int w, int h)
|
||||
eng_rectangle_draw(void *data, void *context, void *surface, int x, int y, int w, int h)
|
||||
{
|
||||
Render_Engine *re;
|
||||
|
||||
re = (Render_Engine *)data;
|
||||
eng_window_use(re->win);
|
||||
evas_gl_common_context_target_surface_set(re->win->gl_context, surface);
|
||||
re->win->gl_context->dc = context;
|
||||
evas_gl_common_rect_draw(re->win->gl_context, x, y, w, h);
|
||||
}
|
||||
|
||||
static void
|
||||
eng_line_draw(void *data, void *context, void *surface __UNUSED__, int x1, int y1, int x2, int y2)
|
||||
eng_line_draw(void *data, void *context, void *surface, int x1, int y1, int x2, int y2)
|
||||
{
|
||||
Render_Engine *re;
|
||||
|
||||
re = (Render_Engine *)data;
|
||||
eng_window_use(re->win);
|
||||
evas_gl_common_context_target_surface_set(re->win->gl_context, surface);
|
||||
re->win->gl_context->dc = context;
|
||||
//-// evas_gl_common_line_draw(re->win->gl_context, x1, y1, x2, y2);
|
||||
}
|
||||
|
@ -375,12 +377,13 @@ eng_polygon_points_clear(void *data, void *context __UNUSED__, void *polygon)
|
|||
}
|
||||
|
||||
static void
|
||||
eng_polygon_draw(void *data, void *context, void *surface __UNUSED__, void *polygon)
|
||||
eng_polygon_draw(void *data, void *context, void *surface, void *polygon)
|
||||
{
|
||||
Render_Engine *re;
|
||||
|
||||
re = (Render_Engine *)data;
|
||||
eng_window_use(re->win);
|
||||
evas_gl_common_context_target_surface_set(re->win->gl_context, surface);
|
||||
re->win->gl_context->dc = context;
|
||||
//--// evas_gl_common_poly_draw(re->win->gl_context, polygon);
|
||||
}
|
||||
|
@ -1006,13 +1009,14 @@ eng_image_data_preload_cancel(void *data __UNUSED__, void *image, const void *ta
|
|||
}
|
||||
|
||||
static void
|
||||
eng_image_draw(void *data, void *context, void *surface __UNUSED__, void *image, int src_x, int src_y, int src_w, int src_h, int dst_x, int dst_y, int dst_w, int dst_h, int smooth)
|
||||
eng_image_draw(void *data, void *context, void *surface, void *image, int src_x, int src_y, int src_w, int src_h, int dst_x, int dst_y, int dst_w, int dst_h, int smooth)
|
||||
{
|
||||
Render_Engine *re;
|
||||
|
||||
re = (Render_Engine *)data;
|
||||
if (!image) return;
|
||||
eng_window_use(re->win);
|
||||
evas_gl_common_context_target_surface_set(re->win->gl_context, surface);
|
||||
re->win->gl_context->dc = context;
|
||||
evas_gl_common_image_draw(re->win->gl_context, image,
|
||||
src_x, src_y, src_w, src_h,
|
||||
|
@ -1031,20 +1035,25 @@ eng_image_map4_draw(void *data __UNUSED__, void *context, void *surface, void *i
|
|||
Render_Engine *re;
|
||||
|
||||
re = (Render_Engine *)data;
|
||||
eng_window_use(re->win);
|
||||
evas_gl_common_context_target_surface_set(re->win->gl_context, surface);
|
||||
re->win->gl_context->dc = context;
|
||||
evas_gl_common_image_map4_draw(re->win->gl_context, image, p, smooth, level);
|
||||
}
|
||||
|
||||
static void *
|
||||
eng_image_map_surface_new(void *data __UNUSED__, int w, int h, int alpha)
|
||||
{
|
||||
// XXX
|
||||
return NULL;
|
||||
Render_Engine *re;
|
||||
|
||||
re = (Render_Engine *)data;
|
||||
return evas_gl_common_image_surface_new(re->win->gl_context, w, h, alpha);
|
||||
}
|
||||
|
||||
static void
|
||||
eng_image_map_surface_free(void *data __UNUSED__, void *surface)
|
||||
{
|
||||
// XXX
|
||||
evas_gl_common_image_free(surface);
|
||||
}
|
||||
|
||||
static int
|
||||
|
@ -1054,12 +1063,14 @@ eng_image_scale_hint_get(void *data __UNUSED__, void *image)
|
|||
}
|
||||
|
||||
static void
|
||||
eng_font_draw(void *data, void *context, void *surface __UNUSED__, void *font, int x, int y, int w __UNUSED__, int h __UNUSED__, int ow __UNUSED__, int oh __UNUSED__, const char *text)
|
||||
eng_font_draw(void *data, void *context, void *surface, void *font, int x, int y, int w __UNUSED__, int h __UNUSED__, int ow __UNUSED__, int oh __UNUSED__, const char *text)
|
||||
{
|
||||
Render_Engine *re;
|
||||
|
||||
re = (Render_Engine *)data;
|
||||
eng_window_use(re->win);
|
||||
evas_gl_common_context_target_surface_set(re->win->gl_context, surface);
|
||||
re->win->gl_context->dc = context;
|
||||
{
|
||||
// FIXME: put im into context so we can free it
|
||||
static RGBA_Image *im = NULL;
|
||||
|
|
Loading…
Reference in New Issue