#include "evas_gl_private.h"
+#ifdef HAVE_DLSYM
+# include <dlfcn.h> /* dlopen,dlclose,etc */
+#else
+# error gl_common should not get compiled if dlsym is not found on the system!
+#endif
+
+#define PRG_INVALID 0xffffffff
#define GLPIPES 1
static int sym_done = 0;
void (*glsym_glBindFramebuffer) (GLenum a, GLuint b) = NULL;
void (*glsym_glFramebufferTexture2D) (GLenum a, GLenum b, GLenum c, GLuint d, GLint e) = NULL;
void (*glsym_glDeleteFramebuffers) (GLsizei a, const GLuint *b) = NULL;
+void (*glsym_glGetProgramBinary) (GLuint a, GLsizei b, GLsizei *c, GLenum *d, void *e) = NULL;
+void (*glsym_glProgramBinary) (GLuint a, GLenum b, const void *c, GLint d) = NULL;
+void (*glsym_glProgramParameteri) (GLuint a, GLuint b, GLint d) = NULL;
+void (*glsym_glReleaseShaderCompiler)(void) = NULL;
#if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX)
// just used for finding symbols :)
if (sym_done) return;
sym_done = 1;
-#ifdef _EVAS_ENGINE_SDL_H
-# define FINDSYM(dst, sym, typ) if (!dst) dst = (typ)SDL_GL_GetProcAddress(sym)
-#else
-# define FINDSYM(dst, sym, typ) if (!dst) dst = (typ)dlsym(RTLD_DEFAULT, sym)
-#endif
+ /* FIXME: If using the SDL engine, we should use SDL_GL_GetProcAddress
+ * instead of dlsym
+ * if (!dst) dst = (typ)SDL_GL_GetProcAddress(sym)
+ */
+#define FINDSYM(dst, sym, typ) if (!dst) dst = (typ)dlsym(RTLD_DEFAULT, sym)
#define FALLBAK(dst, typ) if (!dst) dst = (typ)sym_missing;
-
+
FINDSYM(glsym_glGenFramebuffers, "glGenFramebuffers", glsym_func_void);
FINDSYM(glsym_glGenFramebuffers, "glGenFramebuffersEXT", glsym_func_void);
FINDSYM(glsym_glGenFramebuffers, "glGenFramebuffersARB", glsym_func_void);
FALLBAK(glsym_glGenFramebuffers, glsym_func_void);
-
+
FINDSYM(glsym_glBindFramebuffer, "glBindFramebuffer", glsym_func_void);
FINDSYM(glsym_glBindFramebuffer, "glBindFramebufferEXT", glsym_func_void);
FINDSYM(glsym_glBindFramebuffer, "glBindFramebufferARB", glsym_func_void);
FALLBAK(glsym_glBindFramebuffer, glsym_func_void);
-
+
FINDSYM(glsym_glFramebufferTexture2D, "glFramebufferTexture2D", glsym_func_void);
FINDSYM(glsym_glFramebufferTexture2D, "glFramebufferTexture2DEXT", glsym_func_void);
FINDSYM(glsym_glFramebufferTexture2D, "glFramebufferTexture2DARB", glsym_func_void);
FINDSYM(glsym_glDeleteFramebuffers, "glDeleteFramebuffersARB", glsym_func_void);
FALLBAK(glsym_glDeleteFramebuffers, glsym_func_void);
+ FINDSYM(glsym_glGetProgramBinary, "glGetProgramBinary", glsym_func_void);
+ FINDSYM(glsym_glGetProgramBinary, "glGetProgramBinaryEXT", glsym_func_void);
+ FINDSYM(glsym_glGetProgramBinary, "glGetProgramBinaryARB", glsym_func_void);
+ FINDSYM(glsym_glGetProgramBinary, "glGetProgramBinaryOES", glsym_func_void);
+
+ FINDSYM(glsym_glProgramBinary, "glProgramBinary", glsym_func_void);
+ FINDSYM(glsym_glProgramBinary, "glProgramBinaryEXT", glsym_func_void);
+ FINDSYM(glsym_glProgramBinary, "glProgramBinaryARB", glsym_func_void);
+
+ FINDSYM(glsym_glProgramParameteri, "glProgramParameteri", glsym_func_void);
+ FINDSYM(glsym_glProgramParameteri, "glProgramParameteriEXT", glsym_func_void);
+ FINDSYM(glsym_glProgramParameteri, "glProgramParameteriARB", glsym_func_void);
+
+ FINDSYM(glsym_glReleaseShaderCompiler, "glReleaseShaderCompiler", glsym_func_void);
+ FINDSYM(glsym_glReleaseShaderCompiler, "glReleaseShaderCompilerEXT", glsym_func_void);
+ FINDSYM(glsym_glReleaseShaderCompiler, "glReleaseShaderCompilerARB", glsym_func_void);
+
#if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX)
#undef FINDSYM
#define FINDSYM(dst, sym, typ) \
FINDSYM(secsym_eglGetProcAddress, "eglGetProcAddressEXT", secsym_func_eng_fn);
FINDSYM(secsym_eglGetProcAddress, "eglGetProcAddressARB", secsym_func_eng_fn);
FINDSYM(secsym_eglGetProcAddress, "eglGetProcAddressKHR", secsym_func_eng_fn);
-
+
FINDSYM(secsym_eglCreateImage, "eglCreateImage", secsym_func_void_ptr);
FINDSYM(secsym_eglCreateImage, "eglCreateImageEXT", secsym_func_void_ptr);
FINDSYM(secsym_eglCreateImage, "eglCreateImageARB", secsym_func_void_ptr);
FINDSYM(secsym_eglCreateImage, "eglCreateImageKHR", secsym_func_void_ptr);
-
+
FINDSYM(secsym_eglDestroyImage, "eglDestroyImage", secsym_func_uint);
FINDSYM(secsym_eglDestroyImage, "eglDestroyImageEXT", secsym_func_uint);
FINDSYM(secsym_eglDestroyImage, "eglDestroyImageARB", secsym_func_uint);
FINDSYM(secsym_eglDestroyImage, "eglDestroyImageKHR", secsym_func_uint);
-
+
+ FINDSYM(glsym_glGetProgramBinary, "glGetProgramBinary", glsym_func_void);
+ FINDSYM(glsym_glGetProgramBinary, "glGetProgramBinaryEXT", glsym_func_void);
+ FINDSYM(glsym_glGetProgramBinary, "glGetProgramBinaryARB", glsym_func_void);
+ FINDSYM(glsym_glGetProgramBinary, "glGetProgramBinaryOES", glsym_func_void);
+ FINDSYM(glsym_glGetProgramBinary, "glGetProgramBinaryKHR", glsym_func_void);
+
+ FINDSYM(glsym_glProgramBinary, "glProgramBinary", glsym_func_void);
+ FINDSYM(glsym_glProgramBinary, "glProgramBinaryEXT", glsym_func_void);
+ FINDSYM(glsym_glProgramBinary, "glProgramBinaryARB", glsym_func_void);
+ FINDSYM(glsym_glProgramBinary, "glProgramBinaryOES", glsym_func_void);
+ FINDSYM(glsym_glProgramBinary, "glProgramBinaryKHR", glsym_func_void);
+
+ FINDSYM(glsym_glProgramParameteri, "glProgramParameteri", glsym_func_void);
+ FINDSYM(glsym_glProgramParameteri, "glProgramParameteriEXT", glsym_func_void);
+ FINDSYM(glsym_glProgramParameteri, "glProgramParameteriARB", glsym_func_void);
+ FINDSYM(glsym_glProgramParameteri, "glProgramParameteriOES", glsym_func_void);
+ FINDSYM(glsym_glProgramParameteri, "glProgramParameteriKHR", glsym_func_void);
+
FINDSYM(secsym_glEGLImageTargetTexture2DOES, "glEGLImageTargetTexture2DOES", glsym_func_void);
-
+
FINDSYM(secsym_eglMapImageSEC, "eglMapImageSEC", secsym_func_void_ptr);
-
+
FINDSYM(secsym_eglUnmapImageSEC, "eglUnmapImageSEC", secsym_func_uint);
-
+
FINDSYM(secsym_eglGetImageAttribSEC, "eglGetImageAttribSEC", secsym_func_uint);
-#endif
+#endif
}
static void shader_array_flush(Evas_Engine_GL_Context *gc);
GLfloat rotf;
GLfloat cosv, sinv;
GLfloat tx, ty;
-
+
rotf = (((rot / 90) & 0x3) * M_PI) / 2.0;
-
+
tx = -0.5 * (1.0 - orth);
ty = -0.5 * (1.0 - orth);
-
+
if (rot == 90)
{
tx += -(vw * 1.0);
tx += -(vw * 0.0);
ty += -(vh * 1.0);
}
-
+
cosv = cos(rotf);
sinv = sin(rotf);
-
+
m[0] = (2.0 / (r - l)) * ( cosv);
m[1] = (2.0 / (r - l)) * ( sinv);
m[2] = 0.0;
m[3] = 0.0;
-
+
m[4] = (2.0 / (t - b)) * (-sinv);
m[5] = (2.0 / (t - b)) * ( cosv);
m[6] = 0.0;
m[7] = 0.0;
-
+
m[8] = 0.0;
m[9] = 0.0;
m[10] = -(2.0 / (far - near));
m[11] = 1.0 / (GLfloat)foc;
-
+
m[12] = (m[0] * tx) + (m[4] * ty) - ((r + l) / (r - l));
m[13] = (m[1] * tx) + (m[5] * ty) - ((t + b) / (t - b));
m[14] = (m[2] * tx) + (m[6] * ty) - ((near + far) / (far - near));
_evas_gl_common_viewport_set(Evas_Engine_GL_Context *gc)
{
GLfloat proj[16];
+ unsigned int i;
int w = 1, h = 1, m = 1, rot = 1, foc = 0;
EINA_SAFETY_ON_NULL_RETURN(gc);
rot = 0;
m = -1;
}
-
- if ((!gc->change.size) ||
+
+ if ((!gc->change.size) ||
((gc->shared->w == w) && (gc->shared->h == h) &&
(gc->shared->rot == rot) && (gc->shared->foc == gc->foc) &&
(gc->shared->mflip == m)))
return;
-
+
gc->shared->w = w;
gc->shared->h = h;
gc->shared->rot = rot;
GLERR(__FUNCTION__, __FILE__, __LINE__, "");
// std matrix
if (m == 1)
- matrix_ortho(proj,
- 0, w, 0, h,
+ matrix_ortho(proj,
+ 0, w, 0, h,
-1000000.0, 1000000.0,
rot, w, h,
1, 1.0);
// v flipped matrix for render-to-texture
else
- matrix_ortho(proj,
- 0, w, h, 0,
+ matrix_ortho(proj,
+ 0, w, h, 0,
-1000000.0, 1000000.0,
rot, w, h,
1, 1.0);
else
{
int px, py, vx, vy, vw = 0, vh = 0, ax = 0, ay = 0, ppx = 0, ppy = 0;
-
+
px = gc->shared->px;
py = gc->shared->py;
-
+
if ((rot == 0 ) || (rot == 90 )) ppx = px;
else if ((rot == 180) || (rot == 270)) ppx = w - px;
if ((rot == 0 ) || (rot == 270)) ppy = py;
else if ((rot == 90 ) || (rot == 180)) ppy = h - py;
-
+
vx = ((w / 2) - ppx);
if (vx >= 0)
{
else if ((rot == 180) || (rot == 270)) ax = ppx - px;
vx = 0;
}
-
+
vy = ((h / 2) - ppy);
if (vy < 0)
{
else if ((rot == 90 ) || (rot == 180)) ay = 0;
vy = 0;
}
-
+
if (m == -1) ay = vy * 2;
-
+
if ((rot == 0) || (rot == 180))
glViewport(-2 * vx, -2 * vy, vw, vh);
else
gc->shared->ax = ax;
gc->shared->ay = ay;
}
-
- glUseProgram(gc->shared->shader.rect.prog);
- GLERR(__FUNCTION__, __FILE__, __LINE__, "");
- glUniformMatrix4fv(glGetUniformLocation(gc->shared->shader.rect.prog, "mvp"), 1,
- GL_FALSE, proj);
- GLERR(__FUNCTION__, __FILE__, __LINE__, "");
- glUseProgram(gc->shared->shader.font.prog);
- GLERR(__FUNCTION__, __FILE__, __LINE__, "");
- glUniformMatrix4fv(glGetUniformLocation(gc->shared->shader.font.prog, "mvp"), 1,
- GL_FALSE, proj);
- GLERR(__FUNCTION__, __FILE__, __LINE__, "");
-
- glUseProgram(gc->shared->shader.yuv.prog);
- GLERR(__FUNCTION__, __FILE__, __LINE__, "");
- glUniformMatrix4fv(glGetUniformLocation(gc->shared->shader.yuv.prog, "mvp"), 1,
- GL_FALSE, proj);
- GLERR(__FUNCTION__, __FILE__, __LINE__, "");
- glUseProgram(gc->shared->shader.yuv_nomul.prog);
- GLERR(__FUNCTION__, __FILE__, __LINE__, "");
- glUniformMatrix4fv(glGetUniformLocation(gc->shared->shader.yuv_nomul.prog, "mvp"), 1,
- GL_FALSE, proj);
- GLERR(__FUNCTION__, __FILE__, __LINE__, "");
-
- glUseProgram(gc->shared->shader.tex.prog);
- GLERR(__FUNCTION__, __FILE__, __LINE__, "");
- glUniformMatrix4fv(glGetUniformLocation(gc->shared->shader.tex.prog, "mvp"), 1,
- GL_FALSE, proj);
- GLERR(__FUNCTION__, __FILE__, __LINE__, "");
- glUseProgram(gc->shared->shader.tex_nomul.prog);
- GLERR(__FUNCTION__, __FILE__, __LINE__, "");
- glUniformMatrix4fv(glGetUniformLocation(gc->shared->shader.tex_nomul.prog, "mvp"), 1,
- GL_FALSE, proj);
- GLERR(__FUNCTION__, __FILE__, __LINE__, "");
-
- glUseProgram(gc->shared->shader.img.prog);
- GLERR(__FUNCTION__, __FILE__, __LINE__, "");
- glUniformMatrix4fv(glGetUniformLocation(gc->shared->shader.img.prog, "mvp"), 1,
- GL_FALSE, proj);
- GLERR(__FUNCTION__, __FILE__, __LINE__, "");
- glUseProgram(gc->shared->shader.img_nomul.prog);
- GLERR(__FUNCTION__, __FILE__, __LINE__, "");
- glUniformMatrix4fv(glGetUniformLocation(gc->shared->shader.img_nomul.prog, "mvp"), 1,
- GL_FALSE, proj);
- GLERR(__FUNCTION__, __FILE__, __LINE__, "");
-
- glUseProgram(gc->shared->shader.img_bgra.prog);
- GLERR(__FUNCTION__, __FILE__, __LINE__, "");
- glUniformMatrix4fv(glGetUniformLocation(gc->shared->shader.img_bgra.prog, "mvp"), 1,
- GL_FALSE, proj);
- GLERR(__FUNCTION__, __FILE__, __LINE__, "");
- glUseProgram(gc->shared->shader.img_bgra_nomul.prog);
- GLERR(__FUNCTION__, __FILE__, __LINE__, "");
- glUniformMatrix4fv(glGetUniformLocation(gc->shared->shader.img_bgra_nomul.prog, "mvp"), 1,
- GL_FALSE, proj);
- GLERR(__FUNCTION__, __FILE__, __LINE__, "");
- glUseProgram(gc->shared->shader.img_mask.prog);
- GLERR(__FUNCTION__, __FILE__, __LINE__, "");
- glUniformMatrix4fv(glGetUniformLocation(gc->shared->shader.img_mask.prog, "mvp"), 1,
- GL_FALSE, proj);
- GLERR(__FUNCTION__, __FILE__, __LINE__, "");
-
+ for (i = 0; i < SHADER_LAST; ++i)
+ {
+ glUseProgram(gc->shared->shader[i].prog);
+ GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+ glUniformMatrix4fv(glGetUniformLocation(gc->shared->shader[i].prog, "mvp"), 1, GL_FALSE, proj);
+ GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+ }
- glUseProgram(gc->pipe[0].shader.cur_prog);
+ if (gc->state.current.cur_prog == PRG_INVALID)
+ glUseProgram(gc->shared->shader[0].prog);
+ else glUseProgram(gc->state.current.cur_prog);
GLERR(__FUNCTION__, __FILE__, __LINE__, "");
}
if (!gc) return NULL;
gl_symbols();
-
+
gc->references = 1;
-
+
_evas_gl_common_context = gc;
-
+
for (i = 0; i < MAX_PIPES; i++)
gc->pipe[i].shader.render_op = EVAS_RENDER_BLEND;
-
+
if (!shared)
{
const GLubyte *ext;
(strstr((char *)ext, "GL_EXT_texture_rectangle")) ||
(strstr((char *)ext, "GL_ARB_texture_rectangle")))
shared->info.tex_rect = 1;
+ if ((strstr((char *)ext, "GL_ARB_get_program_binary")) ||
+ (strstr((char *)ext, "GL_OES_get_program_binary")))
+ shared->info.bin_program = 1;
#ifdef GL_TEXTURE_MAX_ANISOTROPY_EXT
if ((strstr((char *)ext, "GL_EXT_texture_filter_anisotropic")))
- glGetFloatv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT,
+ glGetFloatv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT,
&(shared->info.anisotropic));
#endif
#ifdef GL_BGRA
(secsym_eglGetImageAttribSEC))
shared->info.sec_image_map = 1;
}
-#endif
+#endif
}
glGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS,
&(shared->info.max_texture_units));
glGetIntegerv(GL_MAX_TEXTURE_SIZE,
&(shared->info.max_texture_size));
- shared->info.max_vertex_elements = 6 * 10000;
+ shared->info.max_vertex_elements = 6 * 100000;
#ifdef GL_MAX_ELEMENTS_VERTICES
+/* only applies to glDrawRangeElements. don't really need to get it.
glGetIntegerv(GL_MAX_ELEMENTS_VERTICES,
&(shared->info.max_vertex_elements));
+ */
#endif
s = getenv("EVAS_GL_VERTEX_MAX");
if (s) shared->info.max_vertex_elements = atoi(s);
if (shared->info.max_vertex_elements < 6)
shared->info.max_vertex_elements = 6;
-
+
// magic numbers that are a result of imperical testing and getting
// "best case" performance across a range of systems
shared->info.tune.cutout.max = DEF_CUTOUT;
shared->info.tune.atlas.max_w = DEF_ATLAS_W;
shared->info.tune.atlas.max_h = DEF_ATLAS_H;
shared->info.tune.atlas.slot_size = DEF_ATLAS_SLOT;
-
+
// per gpu hacks. based on impirical measurement of some known gpu's
s = (const char *)glGetString(GL_RENDERER);
if (s)
else if (strstr(s, "NVIDIA Tegra"))
shared->info.tune.pipes.max = DEF_PIPES_TEGRA_2;
}
-
+
#define GETENVOPT(name, tune_param, min, max) \
do { \
const char *__v = getenv(name); \
GETENVOPT("EVAS_GL_ATLAS_MAX_W", atlas.max_w, 0, MAX_ATLAS_W);
GETENVOPT("EVAS_GL_ATLAS_MAX_H", atlas.max_h, 0, MAX_ATLAS_H);
GETENVOPT("EVAS_GL_ATLAS_SLOT_SIZE", atlas.slot_size, MIN_ATLAS_SLOT, MAX_ATLAS_SLOT);
+ s = (const char *)getenv("EVAS_GL_GET_PROGRAM_BINARY");
+ if (s)
+ {
+ if (atoi(s) == 0) shared->info.bin_program = 0;
+ }
if (getenv("EVAS_GL_INFO"))
fprintf(stderr,
"\n"
"(can set EVAS_GL_VERTEX_MAX EVAS_GL_NO_MAP_IMAGE_SEC EVAS_GL_INFO EVAS_GL_MEMINFO )\n"
"\n"
+ "EVAS_GL_GET_PROGRAM_BINARY: %i\n"
"EVAS_GL_CUTOUT_MAX: %i\n"
"EVAS_GL_PIPES_MAX: %i\n"
"EVAS_GL_ATLAS_ALLOC_SIZE: %i\n"
"EVAS_GL_ATLAS_ALLOC_ALPHA_SIZE: %i\n"
"EVAS_GL_ATLAS_MAX_W x EVAS_GL_ATLAS_MAX_H: %i x %i\n"
"EVAS_GL_ATLAS_SLOT_SIZE: %i\n"
- ,
+ ,
(int)shared->info.max_texture_size, (int)shared->info.max_texture_size,
(int)shared->info.max_texture_units,
(int)shared->info.tex_npo2,
(double)shared->info.anisotropic,
(int)shared->info.sec_image_map,
(int)shared->info.max_vertex_elements,
-
+
+ (int)shared->info.bin_program,
(int)shared->info.tune.cutout.max,
(int)shared->info.tune.pipes.max,
(int)shared->info.tune.atlas.max_alloc_size,
(int)shared->info.tune.atlas.max_w, (int)shared->info.tune.atlas.max_h,
(int)shared->info.tune.atlas.slot_size
);
-
+
glDisable(GL_DEPTH_TEST);
GLERR(__FUNCTION__, __FILE__, __LINE__, "");
glEnable(GL_DITHER);
// glBlendFunc(GL_SRC_ALPHA, GL_ONE); // ???
glDepthMask(GL_FALSE);
GLERR(__FUNCTION__, __FILE__, __LINE__, "");
-
+
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
GLERR(__FUNCTION__, __FILE__, __LINE__, "");
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
GLERR(__FUNCTION__, __FILE__, __LINE__, "");
}
#endif
-
+
glEnableVertexAttribArray(SHAD_VERTEX);
GLERR(__FUNCTION__, __FILE__, __LINE__, "");
glEnableVertexAttribArray(SHAD_COLOR);
GLERR(__FUNCTION__, __FILE__, __LINE__, "");
- if (!evas_gl_common_shader_program_init(&(shared->shader.rect),
- &(shader_rect_vert_src),
- &(shader_rect_frag_src),
- "rect")) goto error;
- if (!evas_gl_common_shader_program_init(&(shared->shader.font),
- &(shader_font_vert_src),
- &(shader_font_frag_src),
- "font")) goto error;
- if (!evas_gl_common_shader_program_init(&(shared->shader.img),
- &(shader_img_vert_src),
- &(shader_img_frag_src),
- "img")) goto error;
- if (!evas_gl_common_shader_program_init(&(shared->shader.img_nomul),
- &(shader_img_nomul_vert_src),
- &(shader_img_nomul_frag_src),
- "img_nomul")) goto error;
- if (!evas_gl_common_shader_program_init(&(shared->shader.img_bgra),
- &(shader_img_bgra_vert_src),
- &(shader_img_bgra_frag_src),
- "img_bgra")) goto error;
- if (!evas_gl_common_shader_program_init(&(shared->shader.img_bgra_nomul),
- &(shader_img_bgra_nomul_vert_src),
- &(shader_img_bgra_nomul_frag_src),
- "img_bgra_nomul")) goto error;
- if (!evas_gl_common_shader_program_init(&(shared->shader.img_mask),
- &(shader_img_mask_vert_src),
- &(shader_img_mask_frag_src),
- "img_mask")) goto error;
- if (!evas_gl_common_shader_program_init(&(shared->shader.tex),
- &(shader_tex_vert_src),
- &(shader_tex_frag_src),
- "tex")) goto error;
- if (!evas_gl_common_shader_program_init(&(shared->shader.tex_nomul),
- &(shader_tex_nomul_vert_src),
- &(shader_tex_nomul_frag_src),
- "tex_nomul")) goto error;
- if (!evas_gl_common_shader_program_init(&(shared->shader.yuv),
- &(shader_yuv_vert_src),
- &(shader_yuv_frag_src),
- "yuv")) goto error;
- if (!evas_gl_common_shader_program_init(&(shared->shader.yuv_nomul),
- &(shader_yuv_nomul_vert_src),
- &(shader_yuv_nomul_frag_src),
- "yuv_nomul")) goto error;
-
- glUseProgram(shared->shader.yuv.prog);
- GLERR(__FUNCTION__, __FILE__, __LINE__, "");
- glUniform1i(glGetUniformLocation(shared->shader.yuv.prog, "tex"), 0);
- GLERR(__FUNCTION__, __FILE__, __LINE__, "");
- glUniform1i(glGetUniformLocation(shared->shader.yuv.prog, "texu"), 1);
- GLERR(__FUNCTION__, __FILE__, __LINE__, "");
- glUniform1i(glGetUniformLocation(shared->shader.yuv.prog, "texv"), 2);
- GLERR(__FUNCTION__, __FILE__, __LINE__, "");
-
- glUseProgram(shared->shader.yuv_nomul.prog);
- GLERR(__FUNCTION__, __FILE__, __LINE__, "");
- glUniform1i(glGetUniformLocation(shared->shader.yuv_nomul.prog, "tex"), 0);
- GLERR(__FUNCTION__, __FILE__, __LINE__, "");
- glUniform1i(glGetUniformLocation(shared->shader.yuv_nomul.prog, "texu"), 1);
- GLERR(__FUNCTION__, __FILE__, __LINE__, "");
- glUniform1i(glGetUniformLocation(shared->shader.yuv_nomul.prog, "texv"), 2);
- GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+ if (!evas_gl_common_shader_program_init(shared)) goto error;
- glUseProgram(shared->shader.img_mask.prog);
- GLERR(__FUNCTION__, __FILE__, __LINE__, "");
- glUniform1i(glGetUniformLocation(shared->shader.img_mask.prog, "tex"), 0);
- GLERR(__FUNCTION__, __FILE__, __LINE__, "");
- glUniform1i(glGetUniformLocation(shared->shader.img_mask.prog, "texm"), 1);
+#define SHADER_TEXTURE_ADD(Shared, Shader, Name) \
+ glUseProgram(Shared->shader[SHADER_##Shader].prog); \
+ GLERR(__FUNCTION__, __FILE__, __LINE__, ""); \
+ glUniform1i(glGetUniformLocation(Shared->shader[SHADER_##Shader].prog, #Name), Shared->shader[SHADER_##Shader].tex_count++); \
GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+ SHADER_TEXTURE_ADD(shared, YUV, tex);
+ SHADER_TEXTURE_ADD(shared, YUV, texu);
+ SHADER_TEXTURE_ADD(shared, YUV, texv);
+
+ SHADER_TEXTURE_ADD(shared, YUY2, tex);
+ SHADER_TEXTURE_ADD(shared, YUY2, texuv);
+
+ SHADER_TEXTURE_ADD(shared, NV12, tex);
+ SHADER_TEXTURE_ADD(shared, NV12, texuv);
+
+ SHADER_TEXTURE_ADD(shared, YUV_NOMUL, tex);
+ SHADER_TEXTURE_ADD(shared, YUV_NOMUL, texu);
+ SHADER_TEXTURE_ADD(shared, YUV_NOMUL, texv);
+
+ SHADER_TEXTURE_ADD(shared, YUY2_NOMUL, tex);
+ SHADER_TEXTURE_ADD(shared, YUY2_NOMUL, texuv);
+
+ SHADER_TEXTURE_ADD(shared, NV12_NOMUL, tex);
+ SHADER_TEXTURE_ADD(shared, NV12_NOMUL, texuv);
+ SHADER_TEXTURE_ADD(shared, IMG_MASK, tex);
+ SHADER_TEXTURE_ADD(shared, IMG_MASK, texm);
- glUseProgram(gc->pipe[0].shader.cur_prog);
+ if (gc->state.current.cur_prog == PRG_INVALID)
+ glUseProgram(gc->shared->shader[0].prog);
+ else glUseProgram(gc->state.current.cur_prog);
GLERR(__FUNCTION__, __FILE__, __LINE__, "");
-
+
evas_gl_common_shader_program_init_done();
// in shader:
// uniform sampler2D tex[8];
- //
+ //
// in code:
// GLuint texes[8];
// GLint loc = glGetUniformLocation(prog, "tex");
gc->shared = shared;
gc->shared->references++;
_evas_gl_common_viewport_set(gc);
-
+
gc->def_surface = evas_gl_common_image_surface_new(gc, 1, 1, 1);
-
+
return gc;
error:
evas_gl_common_context_free(gc);
{
int i, j;
Eina_List *l;
-
+
gc->references--;
if (gc->references > 0) return;
if (gc->shared) gc->shared->references--;
-
+
if (gc->def_surface) evas_gl_common_image_free(gc->def_surface);
if (gc->shared)
if (gc->pipe[i].array.texuv3) free(gc->pipe[i].array.texuv3);
}
}
-
+
if ((gc->shared) && (gc->shared->references == 0))
{
Evas_GL_Texture_Pool *pt;
-
- evas_gl_common_shader_program_shutdown(&(gc->shared->shader.rect));
- evas_gl_common_shader_program_shutdown(&(gc->shared->shader.font));
- evas_gl_common_shader_program_shutdown(&(gc->shared->shader.img));
- evas_gl_common_shader_program_shutdown(&(gc->shared->shader.img_nomul));
- evas_gl_common_shader_program_shutdown(&(gc->shared->shader.img_bgra));
- evas_gl_common_shader_program_shutdown(&(gc->shared->shader.img_bgra_nomul));
- evas_gl_common_shader_program_shutdown(&(gc->shared->shader.img_mask));
- evas_gl_common_shader_program_shutdown(&(gc->shared->shader.yuv));
- evas_gl_common_shader_program_shutdown(&(gc->shared->shader.yuv_nomul));
- evas_gl_common_shader_program_shutdown(&(gc->shared->shader.tex));
- evas_gl_common_shader_program_shutdown(&(gc->shared->shader.tex_nomul));
-
+
+ for (i = 0; i < SHADER_LAST; ++i)
+ evas_gl_common_shader_program_shutdown(&(gc->shared->shader[i]));
+
while (gc->shared->images)
{
evas_gl_common_image_free(gc->shared->images->data);
}
-
+
EINA_LIST_FOREACH(gc->shared->tex.whole, l, pt)
evas_gl_texture_pool_empty(pt);
for (i = 0; i < 33; i++)
{
if (_evas_gl_common_context == gc) return;
_evas_gl_common_context = gc;
- _evas_gl_common_viewport_set(gc);
+ if (gc) _evas_gl_common_viewport_set(gc);
}
void
if (getenv("EVAS_GL_DBG")) dbgflushnum = 1;
}
if (dbgflushnum) printf("----prev-flushnum: %i -----------------------------------\n", gc->flushnum);
-
+
gc->flushnum = 0;
gc->state.current.cur_prog = 0;
gc->state.current.cur_tex = 0;
gc->state.current.cy = 0;
gc->state.current.cw = 0;
gc->state.current.ch = 0;
-
+
for (i = 0; i < gc->shared->info.tune.pipes.max; i++)
{
gc->pipe[i].region.x = 0;
gc->pipe[i].shader.ch = 0;
}
gc->change.size = 1;
-
+
glDisable(GL_SCISSOR_TEST);
GLERR(__FUNCTION__, __FILE__, __LINE__, "");
glScissor(0, 0, 0, 0);
GLERR(__FUNCTION__, __FILE__, __LINE__, "");
-
+
glDisable(GL_DEPTH_TEST);
GLERR(__FUNCTION__, __FILE__, __LINE__, "");
glEnable(GL_DITHER);
// glBlendFunc(GL_SRC_ALPHA, GL_ONE); // ???
glDepthMask(GL_FALSE);
GLERR(__FUNCTION__, __FILE__, __LINE__, "");
-
+
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
GLERR(__FUNCTION__, __FILE__, __LINE__, "");
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
GLERR(__FUNCTION__, __FILE__, __LINE__, "");
}
#endif
-
+
glEnableVertexAttribArray(SHAD_VERTEX);
GLERR(__FUNCTION__, __FILE__, __LINE__, "");
glEnableVertexAttribArray(SHAD_COLOR);
GLERR(__FUNCTION__, __FILE__, __LINE__, "");
- glUseProgram(gc->pipe[0].shader.cur_prog);
+ if (gc->state.current.cur_prog == PRG_INVALID)
+ glUseProgram(gc->shared->shader[0].prog);
+ else glUseProgram(gc->state.current.cur_prog);
GLERR(__FUNCTION__, __FILE__, __LINE__, "");
-
+
glActiveTexture(GL_TEXTURE0);
GLERR(__FUNCTION__, __FILE__, __LINE__, "");
glBindTexture(GL_TEXTURE_2D, gc->pipe[0].shader.cur_tex);
Evas_GL_Image *surface)
{
if (surface == gc->pipe[0].shader.surface) return;
-
+
evas_gl_common_context_flush(gc);
-
- gc->state.current.cur_prog = -1;
+
+ gc->state.current.cur_prog = PRG_INVALID;
gc->state.current.cur_tex = -1;
gc->state.current.cur_texu = -1;
gc->state.current.cur_texv = -1;
#if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX)
# ifndef GL_FRAMEBUFFER
# define GL_FRAMEBUFFER GL_FRAMEBUFFER_OES
-# endif
+# endif
#else
# ifndef GL_FRAMEBUFFER
# define GL_FRAMEBUFFER GL_FRAMEBUFFER_EXT
-# endif
-#endif
+# endif
+#endif
if (gc->pipe[0].shader.surface == gc->def_surface)
{
glsym_glBindFramebuffer(GL_FRAMEBUFFER, 0);
gc->pipe[n].array.alloc * sizeof(GLfloat) * 2);
}
+#ifdef GLPIPES
static int
pipe_region_intersects(Evas_Engine_GL_Context *gc, int n,
int x, int y, int w, int h)
{
int i, rx, ry, rw, rh, ii;
-
+
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;
-
+
// 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
// full quad region or triangle intersects right now
if (gc->pipe[n].region.type == RTYPE_MAP) return 1;
-
- for (i = 0,
- ii = 0;
-
- i < gc->pipe[n].array.num;
-
- i += (3 * 2),
+
+ for (i = 0,
+ ii = 0;
+
+ i < gc->pipe[n].array.num;
+
+ i += (3 * 2),
ii += (3 * 3 * 2))
{ // tri 1...
// 0, 1, 2 < top left
}
return 0;
}
+#endif
static void
pipe_region_expand(Evas_Engine_GL_Context *gc, int n,
int x, int y, int w, int h)
{
int x1, y1, x2, y2;
-
+
if (gc->pipe[n].region.w <= 0)
{
gc->pipe[n].region.x = x;
return 1;
}
+static inline Evas_GL_Shader
+evas_gl_common_shader_choice(int npoints __UNUSED__,
+ RGBA_Map_Point *p,
+ int r, int g, int b, int a,
+ Evas_GL_Shader nomul,
+ Evas_GL_Shader mul)
+{
+ if ((a == 255) && (r == 255) && (g == 255) && (b == 255))
+ {
+ if (!p) return nomul;
+
+ if ((p[0].col == 0xffffffff) && (p[1].col == 0xffffffff) &&
+ (p[2].col == 0xffffffff) && (p[3].col == 0xffffffff))
+ return nomul;
+ }
+ return mul;
+}
+
+static int
+_evas_gl_common_context_push(int rtype,
+ Evas_Engine_GL_Context *gc,
+ Evas_GL_Texture *tex,
+ Evas_GL_Texture *texm,
+ GLuint prog,
+ int x, int y, int w, int h,
+ Eina_Bool blend,
+ Eina_Bool smooth,
+ Eina_Bool clip,
+ int cx, int cy, int cw, int ch)
+{
+ int pn = 0;
+
+#ifdef GLPIPES
+ again:
+#endif
+ vertex_array_size_check(gc, gc->state.top_pipe, 6);
+ pn = gc->state.top_pipe;
+#ifdef GLPIPES
+ if (!((pn == 0) && (gc->pipe[pn].array.num == 0)))
+ {
+ int found = 0;
+ int i;
+
+ for (i = pn; i >= 0; i--)
+ {
+ if ((gc->pipe[i].region.type == rtype)
+ && (!tex || gc->pipe[i].shader.cur_tex == tex->pt->texture)
+ && (!texm || gc->pipe[i].shader.cur_texm == texm->pt->texture)
+ && (gc->pipe[i].shader.cur_prog == prog)
+ && (gc->pipe[i].shader.smooth == smooth)
+ && (gc->pipe[i].shader.blend == blend)
+ && (gc->pipe[i].shader.render_op == gc->dc->render_op)
+ && (gc->pipe[i].shader.clip == clip)
+ && (!clip || ((gc->pipe[i].shader.cx == cx)
+ && (gc->pipe[i].shader.cy == cy)
+ && (gc->pipe[i].shader.cw == cw)
+ && (gc->pipe[i].shader.ch == ch))))
+ {
+ found = 1;
+ pn = i;
+ break;
+ }
+ if (pipe_region_intersects(gc, i, x, y, w, h)) break;
+ }
+ if (!found)
+ {
+ pn = gc->state.top_pipe + 1;
+ if (pn >= gc->shared->info.tune.pipes.max)
+ {
+ shader_array_flush(gc);
+ goto again;
+ }
+ gc->state.top_pipe = pn;
+ }
+ }
+ if ((tex) && (((tex->im) && (tex->im->native.data)) || tex->pt->dyn.img))
+ {
+ if (gc->pipe[pn].array.im != tex->im)
+ {
+ shader_array_flush(gc);
+ pn = gc->state.top_pipe;
+ gc->pipe[pn].array.im = tex->im;
+ goto again;
+ }
+ }
+#else
+ if (!((gc->pipe[pn].region.type == rtype)
+ && (!tex || gc->pipe[pn].shader.cur_tex == tex->pt->texture)
+ && (!texm || gc->pipe[pn].shader.cur_texm == texm->pt->texture)
+ && (gc->pipe[pn].shader.cur_prog == prog)
+ && (gc->pipe[pn].shader.smooth == smooth)
+ && (gc->pipe[pn].shader.blend == blend)
+ && (gc->pipe[pn].shader.render_op == gc->dc->render_op)
+ && (gc->pipe[pn].shader.clip == clip)
+ && (!clip || ((gc->pipe[pn].shader.cx == cx)
+ && (gc->pipe[pn].shader.cy == cy)
+ && (gc->pipe[pn].shader.cw == cw)
+ && (gc->pipe[pn].shader.ch == ch)))))
+ {
+ shader_array_flush(gc);
+ }
+ if ((tex) && (((tex->im) && (tex->im->native.data)) || tex->pt->dyn.img))
+ {
+ if (gc->pipe[pn].array.im != tex->im)
+ {
+ shader_array_flush(gc);
+ gc->pipe[pn].array.im = tex->im;
+ }
+ }
+#endif
+
+ return pn;
+}
+
void
-evas_gl_common_context_line_push(Evas_Engine_GL_Context *gc,
+evas_gl_common_context_line_push(Evas_Engine_GL_Context *gc,
int x1, int y1, int x2, int y2,
int clip, int cx, int cy, int cw, int ch,
int r, int g, int b, int a)
{
int pnum, nv, nc, nu, nt, i;
Eina_Bool blend = 0;
- GLuint prog = gc->shared->shader.rect.prog;
+ GLuint prog = gc->shared->shader[SHADER_RECT].prog;
int pn = 0;
-
+
if (a < 255) blend = 1;
if (gc->dc->render_op == EVAS_RENDER_COPY) blend = 0;
-
+
shader_array_flush(gc);
vertex_array_size_check(gc, gc->state.top_pipe, 2);
pn = gc->state.top_pipe;
gc->pipe[pn].shader.cy = cy;
gc->pipe[pn].shader.cw = cw;
gc->pipe[pn].shader.ch = ch;
-
+
gc->pipe[pn].array.line = 1;
gc->pipe[pn].array.use_vertex = 1;
gc->pipe[pn].array.use_color = 1;
gc->pipe[pn].array.use_texuv = 0;
gc->pipe[pn].array.use_texuv2 = 0;
gc->pipe[pn].array.use_texuv3 = 0;
-
+
pnum = gc->pipe[pn].array.num;
nv = pnum * 3; nc = pnum * 4; nu = pnum * 2; nt = pnum * 4;
gc->pipe[pn].array.num += 2;
array_alloc(gc, pn);
-
+
PUSH_VERTEX(pn, x1, y1, 0);
PUSH_VERTEX(pn, x2, y2, 0);
-
+
for (i = 0; i < 2; i++)
{
PUSH_COLOR(pn, r, g, b, a);
}
-
+
shader_array_flush(gc);
gc->pipe[pn].array.line = 0;
gc->pipe[pn].array.use_vertex = 0;
}
void
-evas_gl_common_context_rectangle_push(Evas_Engine_GL_Context *gc,
+evas_gl_common_context_rectangle_push(Evas_Engine_GL_Context *gc,
int x, int y, int w, int h,
int r, int g, int b, int a)
{
int pnum, nv, nc, nu, nt, i;
Eina_Bool blend = 0;
- GLuint prog = gc->shared->shader.rect.prog;
+ GLuint prog = gc->shared->shader[SHADER_RECT].prog;
int pn = 0;
if (gc->dc->mask.mask)
Evas_GL_Image *im;
im = (void *)dc->mask.mask;
evas_gl_common_context_font_push(gc, im->tex,
- x - dc->mask.x,y - dc->mask.y,
- dc->mask.w,dc->mask.h,
- x,y,w,h,r,g,b,a);
+ x - dc->mask.x,
+ y - dc->mask.y,
+ dc->mask.w, dc->mask.h,
+ x, y, w, h,
+ r, g, b, a);
return;
}
if (a < 255) blend = 1;
if (gc->dc->render_op == EVAS_RENDER_COPY) blend = 0;
-
+
again:
vertex_array_size_check(gc, gc->state.top_pipe, 6);
pn = gc->state.top_pipe;
else
{
int found = 0;
-
+
for (i = pn; i >= 0; i--)
{
if ((gc->pipe[i].region.type == RTYPE_RECT)
gc->pipe[pn].array.use_texuv3 = 0;
}
}
-#else
+#else
if ((gc->pipe[pn].shader.cur_tex != 0)
|| (gc->pipe[pn].shader.cur_prog != prog)
|| (gc->pipe[pn].shader.blend != blend)
gc->pipe[pn].shader.cw = 0;
gc->pipe[pn].shader.ch = 0;
}
-
+
gc->pipe[pn].region.type = RTYPE_RECT;
gc->pipe[pn].array.line = 0;
gc->pipe[pn].array.use_vertex = 1;
gc->pipe[pn].array.use_texuv2 = 0;
gc->pipe[pn].array.use_texuv3 = 0;
#endif
-
+
pipe_region_expand(gc, pn, x, y, w, h);
-
+
pnum = gc->pipe[pn].array.num;
nv = pnum * 3; nc = pnum * 4; nu = pnum * 2; nt = pnum * 4;
gc->pipe[pn].array.num += 6;
array_alloc(gc, pn);
-
+
PUSH_VERTEX(pn, x , y , 0);
PUSH_VERTEX(pn, x + w, y , 0);
PUSH_VERTEX(pn, x , y + h, 0);
-
+
PUSH_VERTEX(pn, x + w, y , 0);
PUSH_VERTEX(pn, x + w, y + h, 0);
PUSH_VERTEX(pn, x , y + h, 0);
-
+
for (i = 0; i < 6; i++)
{
PUSH_COLOR(pn, r, g, b, a);
int pnum, nv, nc, nu, nu2, nt, i;
GLfloat tx1, tx2, ty1, ty2;
Eina_Bool blend = 1;
- GLuint prog = gc->shared->shader.img.prog;
+ GLuint prog = gc->shared->shader[SHADER_IMG].prog;
int pn = 0;
if (!tex->alpha) blend = 0;
if (a < 255) blend = 1;
-
- if (tex_only)
+
+ if (gc->filter_prog)
+ {
+ prog = gc->filter_prog;
+ }
+ else if (tex_only)
{
if (tex->pt->dyn.img)
{
- if ((a == 255) && (r == 255) && (g == 255) && (b == 255))
- prog = gc->shared->shader.img_nomul.prog;
- else
- prog = gc->shared->shader.img.prog;
+ prog = gc->shared->shader[evas_gl_common_shader_choice(0, NULL, r, g, b, a,
+ SHADER_IMG_BGRA_NOMUL, SHADER_IMG_BGRA)].prog;
}
else
{
- if ((a == 255) && (r == 255) && (g == 255) && (b == 255))
- prog = gc->shared->shader.tex_nomul.prog;
- else
- prog = gc->shared->shader.tex.prog;
+ prog = gc->shared->shader[evas_gl_common_shader_choice(0, NULL, r, g, b, a,
+ SHADER_TEX_NOMUL, SHADER_TEX)].prog;
}
}
else
{
if (tex->gc->shared->info.bgra)
{
- if ((a == 255) && (r == 255) && (g == 255) && (b == 255))
- prog = gc->shared->shader.img_bgra_nomul.prog;
- else
- prog = gc->shared->shader.img_bgra.prog;
+ prog = gc->shared->shader[evas_gl_common_shader_choice(0, NULL, r, g, b, a,
+ SHADER_IMG_BGRA_NOMUL, SHADER_IMG_BGRA)].prog;
}
else
{
- if ((a == 255) && (r == 255) && (g == 255) && (b == 255))
- prog = gc->shared->shader.img_nomul.prog;
- else
- prog = gc->shared->shader.img.prog;
+ prog = gc->shared->shader[evas_gl_common_shader_choice(0, NULL, r, g, b, a,
+ SHADER_IMG_NOMUL, SHADER_IMG)].prog;
}
}
-again:
- vertex_array_size_check(gc, gc->state.top_pipe, 6);
- pn = gc->state.top_pipe;
-#ifdef GLPIPES
- if ((pn == 0) && (gc->pipe[pn].array.num == 0))
+ pn = _evas_gl_common_context_push(RTYPE_IMAGE,
+ gc, tex, NULL,
+ prog,
+ x, y, w, h,
+ blend,
+ smooth,
+ 0, 0, 0, 0, 0);
+
+ gc->pipe[pn].region.type = RTYPE_IMAGE;
+ gc->pipe[pn].shader.cur_tex = tex->pt->texture;
+ gc->pipe[pn].shader.cur_prog = prog;
+ gc->pipe[pn].shader.smooth = smooth;
+ gc->pipe[pn].shader.blend = blend;
+ gc->pipe[pn].shader.render_op = gc->dc->render_op;
+ gc->pipe[pn].shader.clip = 0;
+ gc->pipe[pn].shader.cx = 0;
+ gc->pipe[pn].shader.cy = 0;
+ gc->pipe[pn].shader.cw = 0;
+ gc->pipe[pn].shader.ch = 0;
+ gc->pipe[pn].array.line = 0;
+ gc->pipe[pn].array.use_vertex = 1;
+ // if nomul... dont need this
+ gc->pipe[pn].array.use_color = 1;
+ gc->pipe[pn].array.use_texuv = 1;
+ gc->pipe[pn].array.use_texuv2 = 0;
+ gc->pipe[pn].array.use_texuv3 = 0;
+
+ pipe_region_expand(gc, pn, x, y, w, h);
+
+ pnum = gc->pipe[pn].array.num;
+ nv = pnum * 3; nc = pnum * 4; nu = pnum * 2; nu2 = pnum * 2;
+ nt = pnum * 4;
+ gc->pipe[pn].array.num += 6;
+ array_alloc(gc, pn);
+
+ if ((tex->im) && (tex->im->native.data) && (!tex->im->native.yinvert))
{
- gc->pipe[pn].region.type = RTYPE_IMAGE;
- gc->pipe[pn].shader.cur_tex = tex->pt->texture;
- gc->pipe[pn].shader.cur_prog = prog;
- gc->pipe[pn].shader.smooth = smooth;
- gc->pipe[pn].shader.blend = blend;
- gc->pipe[pn].shader.render_op = gc->dc->render_op;
- gc->pipe[pn].shader.clip = 0;
- gc->pipe[pn].shader.cx = 0;
- gc->pipe[pn].shader.cy = 0;
- gc->pipe[pn].shader.cw = 0;
- gc->pipe[pn].shader.ch = 0;
- gc->pipe[pn].array.line = 0;
- gc->pipe[pn].array.use_vertex = 1;
- // if nomul... dont need this
- gc->pipe[pn].array.use_color = 1;
- gc->pipe[pn].array.use_texuv = 1;
- gc->pipe[pn].array.use_texuv2 = 0;
- gc->pipe[pn].array.use_texuv3 = 0;
- }
- else
- {
- int found = 0;
-
- for (i = pn; i >= 0; i--)
- {
- if ((gc->pipe[i].region.type == RTYPE_IMAGE)
- && (gc->pipe[i].shader.cur_tex == tex->pt->texture)
- && (gc->pipe[i].shader.cur_prog == prog)
- && (gc->pipe[i].shader.smooth == smooth)
- && (gc->pipe[i].shader.blend == blend)
- && (gc->pipe[i].shader.render_op == gc->dc->render_op)
- && (gc->pipe[i].shader.clip == 0)
- )
- {
- found = 1;
- pn = i;
- break;
- }
- if (pipe_region_intersects(gc, i, x, y, w, h)) break;
- }
- if (!found)
- {
- pn = gc->state.top_pipe + 1;
- if (pn >= gc->shared->info.tune.pipes.max)
- {
- shader_array_flush(gc);
- goto again;
- }
- gc->state.top_pipe = pn;
- gc->pipe[pn].region.type = RTYPE_IMAGE;
- gc->pipe[pn].shader.cur_tex = tex->pt->texture;
- gc->pipe[pn].shader.cur_prog = prog;
- gc->pipe[pn].shader.smooth = smooth;
- gc->pipe[pn].shader.blend = blend;
- gc->pipe[pn].shader.render_op = gc->dc->render_op;
- gc->pipe[pn].shader.clip = 0;
- gc->pipe[pn].shader.cx = 0;
- gc->pipe[pn].shader.cy = 0;
- gc->pipe[pn].shader.cw = 0;
- gc->pipe[pn].shader.ch = 0;
- gc->pipe[pn].array.line = 0;
- gc->pipe[pn].array.use_vertex = 1;
- // if nomul... dont need this
- gc->pipe[pn].array.use_color = 1;
- gc->pipe[pn].array.use_texuv = 1;
- gc->pipe[pn].array.use_texuv2 = 0;
- gc->pipe[pn].array.use_texuv3 = 0;
-
- }
- }
- if ((tex->im) && (tex->im->native.data))
- {
- if (gc->pipe[pn].array.im != tex->im)
- {
- shader_array_flush(gc);
- pn = gc->state.top_pipe;
- gc->pipe[pn].array.im = tex->im;
- goto again;
- }
- }
- if (tex->pt->dyn.img)
- {
- if (gc->pipe[pn].array.im != tex->im)
- {
- shader_array_flush(gc);
- pn = gc->state.top_pipe;
- gc->pipe[pn].array.im = tex->im;
- goto again;
- }
- }
-#else
- if ((gc->pipe[pn].shader.cur_tex != tex->pt->texture)
- || (gc->pipe[pn].shader.cur_prog != prog)
- || (gc->pipe[pn].shader.smooth != smooth)
- || (gc->pipe[pn].shader.blend != blend)
- || (gc->pipe[pn].shader.render_op != gc->dc->render_op)
- || (gc->pipe[pn].shader.clip != 0)
- )
- {
- shader_array_flush(gc);
- gc->pipe[pn].shader.cur_tex = tex->pt->texture;
- gc->pipe[pn].shader.cur_prog = prog;
- gc->pipe[pn].shader.smooth = smooth;
- gc->pipe[pn].shader.blend = blend;
- gc->pipe[pn].shader.render_op = gc->dc->render_op;
- gc->pipe[pn].shader.clip = 0;
- gc->pipe[pn].shader.cx = 0;
- gc->pipe[pn].shader.cy = 0;
- gc->pipe[pn].shader.cw = 0;
- gc->pipe[pn].shader.ch = 0;
- }
- if ((tex->im) && (tex->im->native.data))
- {
- if (gc->pipe[pn].array.im != tex->im)
- {
- shader_array_flush(gc);
- gc->pipe[pn].array.im = tex->im;
- }
- }
- if (tex->pt->dyn.img)
- {
- if (gc->pipe[pn].array.im != tex->im)
- {
- shader_array_flush(gc);
- gc->pipe[pn].array.im = tex->im;
- }
- }
-
- gc->pipe[pn].array.line = 0;
- gc->pipe[pn].array.use_vertex = 1;
- // if nomul... dont need this
- gc->pipe[pn].array.use_color = 1;
- gc->pipe[pn].array.use_texuv = 1;
- gc->pipe[pn].array.use_texuvm = 0;
- gc->pipe[pn].array.use_texuv2 = 0;
- gc->pipe[pn].array.use_texuv3 = 0;
-#endif
-
- pipe_region_expand(gc, pn, x, y, w, h);
-
- pnum = gc->pipe[pn].array.num;
- nv = pnum * 3; nc = pnum * 4; nu = pnum * 2; nu2 = pnum * 2;
- nt = pnum * 4;
- gc->pipe[pn].array.num += 6;
- array_alloc(gc, pn);
-
- if ((tex->im) && (tex->im->native.data) && (!tex->im->native.yinvert))
- {
- tx1 = ((double)(tex->x) + sx) / (double)tex->pt->w;
- ty1 = 1.0 - ((double)(tex->y) + sy) / (double)tex->pt->h;
- tx2 = ((double)(tex->x) + sx + sw) / (double)tex->pt->w;
- ty2 = 1.0 - ((double)(tex->y) + sy + sh) / (double)tex->pt->h;
+ tx1 = ((double)(tex->x) + sx) / (double)tex->pt->w;
+ ty1 = 1.0 - ((double)(tex->y) + sy) / (double)tex->pt->h;
+ tx2 = ((double)(tex->x) + sx + sw) / (double)tex->pt->w;
+ ty2 = 1.0 - ((double)(tex->y) + sy + sh) / (double)tex->pt->h;
}
else
{
PUSH_VERTEX(pn, x , y , 0);
PUSH_VERTEX(pn, x + w, y , 0);
PUSH_VERTEX(pn, x , y + h, 0);
-
+
PUSH_TEXUV(pn, tx1, ty1);
PUSH_TEXUV(pn, tx2, ty1);
PUSH_TEXUV(pn, tx1, ty2);
-
+
PUSH_VERTEX(pn, x + w, y , 0);
PUSH_VERTEX(pn, x + w, y + h, 0);
PUSH_VERTEX(pn, x , y + h, 0);
-
+
PUSH_TEXUV(pn, tx2, ty1);
PUSH_TEXUV(pn, tx2, ty2);
PUSH_TEXUV(pn, tx1, ty2);
GLfloat tx1, tx2, ty1, ty2;
GLfloat txm1, txm2, tym1, tym2;
Eina_Bool blend = 1;
- GLuint prog = gc->shared->shader.img_mask.prog;
+ GLuint prog = gc->shared->shader[SHADER_IMG_MASK].prog;
int pn = 0;
#if 0
if (tex->gc->shared->info.bgra)
{
- prog = gc->shared->shader.img_mask.prog;
+ prog = gc->shared->shader[SHADER_IMG_MASK].prog;
}
else
{
#warning Nash: FIXME: Need two shaders?
printf("Not good: Need other texture\n");
- prog = gc->shared->shader.img.prog;
+ prog = gc->shared->shader[SHADER_IMG].prog;
}
#endif
-again:
- vertex_array_size_check(gc, gc->state.top_pipe, 6);
- pn = gc->state.top_pipe;
-#ifdef GLPIPES
- if ((pn == 0) && (gc->pipe[pn].array.num == 0))
- {
- gc->pipe[pn].region.type = RTYPE_IMASK;
- gc->pipe[pn].shader.cur_tex = tex->pt->texture;
- gc->pipe[pn].shader.cur_texm = texm->pt->texture;
- gc->pipe[pn].shader.cur_prog = prog;
- gc->pipe[pn].shader.smooth = smooth;
- gc->pipe[pn].shader.blend = blend;
- gc->pipe[pn].shader.render_op = gc->dc->render_op;
- gc->pipe[pn].shader.clip = 0;
- gc->pipe[pn].shader.cx = 0;
- gc->pipe[pn].shader.cy = 0;
- gc->pipe[pn].shader.cw = 0;
- gc->pipe[pn].shader.ch = 0;
- gc->pipe[pn].array.line = 0;
- gc->pipe[pn].array.use_vertex = 1;
- // if nomul... dont need this
- gc->pipe[pn].array.use_color = 1;
- gc->pipe[pn].array.use_texuv = 1;
- gc->pipe[pn].array.use_texuv2 = 0;
- gc->pipe[pn].array.use_texuv3 = 0;
- gc->pipe[pn].array.use_texm = 1;
- }
- else
- {
- int found = 0;
-
- for (i = pn; i >= 0; i--)
- {
- if ((gc->pipe[i].region.type == RTYPE_IMASK)
- && (gc->pipe[i].shader.cur_tex == tex->pt->texture)
- && (gc->pipe[i].shader.cur_texm == texm->pt->texture)
- && (gc->pipe[i].shader.cur_prog == prog)
- && (gc->pipe[i].shader.smooth == smooth)
- && (gc->pipe[i].shader.blend == blend)
- && (gc->pipe[i].shader.render_op == gc->dc->render_op)
- && (gc->pipe[i].shader.clip == 0)
- )
- {
- found = 1;
- pn = i;
- break;
- }
- if (pipe_region_intersects(gc, i, x, y, w, h)) break;
- }
- if (!found)
- {
- pn = gc->state.top_pipe + 1;
- if (pn >= gc->shared->info.tune.pipes.max)
- {
- shader_array_flush(gc);
- goto again;
- }
- gc->state.top_pipe = pn;
- gc->pipe[pn].region.type = RTYPE_IMASK;
- gc->pipe[pn].shader.cur_tex = tex->pt->texture;
- gc->pipe[pn].shader.cur_texm = texm->pt->texture;
- gc->pipe[pn].shader.cur_prog = prog;
- gc->pipe[pn].shader.smooth = smooth;
- gc->pipe[pn].shader.blend = blend;
- gc->pipe[pn].shader.render_op = gc->dc->render_op;
- gc->pipe[pn].shader.clip = 0;
- gc->pipe[pn].shader.cx = 0;
- gc->pipe[pn].shader.cy = 0;
- gc->pipe[pn].shader.cw = 0;
- gc->pipe[pn].shader.ch = 0;
- gc->pipe[pn].array.line = 0;
- gc->pipe[pn].array.use_vertex = 1;
- gc->pipe[pn].array.use_color = 1;
- gc->pipe[pn].array.use_texuv = 1;
- gc->pipe[pn].array.use_texuv2 = 0;
- gc->pipe[pn].array.use_texuv3 = 0;
- gc->pipe[pn].array.use_texm = 1;
-
- }
- }
- if ((tex->im) && (tex->im->native.data))
- {
- if (gc->pipe[pn].array.im != tex->im)
- {
- shader_array_flush(gc);
- pn = gc->state.top_pipe;
- gc->pipe[pn].array.im = tex->im;
- goto again;
- }
- }
- if (tex->pt->dyn.img)
- {
- if (gc->pipe[pn].array.im != tex->im)
- {
- shader_array_flush(gc);
- pn = gc->state.top_pipe;
- gc->pipe[pn].array.im = tex->im;
- goto again;
- }
- }
-#else
- if ((gc->pipe[pn].shader.cur_tex != tex->pt->texture)
- || (gc->pipe[pn].shader.cur_prog != prog)
- || (gc->pipe[pn].shader.smooth != smooth)
- || (gc->pipe[pn].shader.blend != blend)
- || (gc->pipe[pn].shader.render_op != gc->dc->render_op)
- || (gc->pipe[pn].shader.clip != 0)
- )
- {
- shader_array_flush(gc);
- gc->pipe[pn].shader.cur_tex = tex->pt->texture;
- gc->pipe[pn].shader.cur_texm = texm->pt->texture;
- gc->pipe[pn].shader.cur_prog = prog;
- gc->pipe[pn].shader.smooth = smooth;
- gc->pipe[pn].shader.blend = blend;
- gc->pipe[pn].shader.render_op = gc->dc->render_op;
- gc->pipe[pn].shader.clip = 0;
- gc->pipe[pn].shader.cx = 0;
- gc->pipe[pn].shader.cy = 0;
- gc->pipe[pn].shader.cw = 0;
- gc->pipe[pn].shader.ch = 0;
- }
- if ((tex->im) && (tex->im->native.data))
- {
- if (gc->pipe[pn].array.im != tex->im)
- {
- shader_array_flush(gc);
- gc->pipe[pn].array.im = tex->im;
- }
- }
- if (tex->pt->dyn.img)
- {
- if (gc->pipe[pn].array.im != tex->im)
- {
- shader_array_flush(gc);
- gc->pipe[pn].array.im = tex->im;
- }
- }
-
+ pn = _evas_gl_common_context_push(RTYPE_IMASK,
+ gc, tex, texm,
+ prog,
+ x, y, w, h,
+ blend,
+ smooth,
+ 0, 0, 0, 0, 0);
+
+ gc->pipe[pn].region.type = RTYPE_IMASK;
+ gc->pipe[pn].shader.cur_tex = tex->pt->texture;
+ gc->pipe[pn].shader.cur_texm = texm->pt->texture;
+ gc->pipe[pn].shader.cur_prog = prog;
+ gc->pipe[pn].shader.smooth = smooth;
+ gc->pipe[pn].shader.blend = blend;
+ gc->pipe[pn].shader.render_op = gc->dc->render_op;
+ gc->pipe[pn].shader.clip = 0;
+ gc->pipe[pn].shader.cx = 0;
+ gc->pipe[pn].shader.cy = 0;
+ gc->pipe[pn].shader.cw = 0;
+ gc->pipe[pn].shader.ch = 0;
gc->pipe[pn].array.line = 0;
gc->pipe[pn].array.use_vertex = 1;
+ // if nomul... dont need this
gc->pipe[pn].array.use_color = 1;
gc->pipe[pn].array.use_texuv = 1;
gc->pipe[pn].array.use_texuv2 = 0;
gc->pipe[pn].array.use_texuv3 = 0;
gc->pipe[pn].array.use_texm = 1;
-#endif
pipe_region_expand(gc, pn, x, y, w, h);
-
+
pnum = gc->pipe[pn].array.num;
nv = pnum * 3; nc = pnum * 4; nm = pnum * 2; nu = pnum * 2;
nt = pnum * 4;
PUSH_VERTEX(pn, x , y , 0);
PUSH_VERTEX(pn, x + w, y , 0);
PUSH_VERTEX(pn, x , y + h, 0);
-
+
PUSH_TEXUV(pn, tx1, ty1);
PUSH_TEXUV(pn, tx2, ty1);
PUSH_TEXUV(pn, tx1, ty2);
PUSH_VERTEX(pn, x + w, y , 0);
PUSH_VERTEX(pn, x + w, y + h, 0);
PUSH_VERTEX(pn, x , y + h, 0);
-
+
PUSH_TEXUV(pn, tx2, ty1);
PUSH_TEXUV(pn, tx2, ty2);
PUSH_TEXUV(pn, tx1, ty2);
{
int pnum, nv, nc, nu, nt, i;
GLfloat tx1, tx2, ty1, ty2;
+ GLuint prog = gc->shared->shader[SHADER_FONT].prog;
int pn = 0;
-again:
- vertex_array_size_check(gc, gc->state.top_pipe, 6);
- pn = gc->state.top_pipe;
-#ifdef GLPIPES
- if ((pn == 0) && (gc->pipe[pn].array.num == 0))
- {
- gc->pipe[pn].region.type = RTYPE_FONT;
- gc->pipe[pn].shader.cur_tex = tex->pt->texture;
- gc->pipe[pn].shader.cur_prog = gc->shared->shader.font.prog;
- gc->pipe[pn].shader.smooth = 0;
- gc->pipe[pn].shader.blend = 1;
- gc->pipe[pn].shader.render_op = gc->dc->render_op;
- gc->pipe[pn].shader.clip = 0;
- gc->pipe[pn].shader.cx = 0;
- gc->pipe[pn].shader.cy = 0;
- gc->pipe[pn].shader.cw = 0;
- gc->pipe[pn].shader.ch = 0;
- gc->pipe[pn].array.line = 0;
- gc->pipe[pn].array.use_vertex = 1;
- gc->pipe[pn].array.use_color = 1;
- gc->pipe[pn].array.use_texuv = 1;
- gc->pipe[pn].array.use_texuv2 = 0;
- gc->pipe[pn].array.use_texuv3 = 0;
- }
- else
- {
- int found = 0;
-
- for (i = pn; i >= 0; i--)
- {
- if ((gc->pipe[i].region.type == RTYPE_FONT)
- && (gc->pipe[i].shader.cur_tex == tex->pt->texture)
- && (gc->pipe[i].shader.cur_prog == gc->shared->shader.font.prog)
- && (gc->pipe[i].shader.smooth == 0)
- && (gc->pipe[i].shader.blend == 1)
- && (gc->pipe[i].shader.render_op == gc->dc->render_op)
- && (gc->pipe[i].shader.clip == 0)
- )
- {
- found = 1;
- pn = i;
- break;
- }
- if (pipe_region_intersects(gc, i, x, y, w, h)) break;
- }
- if (!found)
- {
- pn = gc->state.top_pipe + 1;
- if (pn >= gc->shared->info.tune.pipes.max)
- {
- shader_array_flush(gc);
- goto again;
- }
- gc->state.top_pipe = pn;
- gc->pipe[pn].region.type = RTYPE_FONT;
- gc->pipe[pn].shader.cur_tex = tex->pt->texture;
- gc->pipe[pn].shader.cur_prog = gc->shared->shader.font.prog;
- gc->pipe[pn].shader.smooth = 0;
- gc->pipe[pn].shader.blend = 1;
- gc->pipe[pn].shader.render_op = gc->dc->render_op;
- gc->pipe[pn].shader.clip = 0;
- gc->pipe[pn].shader.cx = 0;
- gc->pipe[pn].shader.cy = 0;
- gc->pipe[pn].shader.cw = 0;
- gc->pipe[pn].shader.ch = 0;
- gc->pipe[pn].array.line = 0;
- gc->pipe[pn].array.use_vertex = 1;
- gc->pipe[pn].array.use_color = 1;
- gc->pipe[pn].array.use_texuv = 1;
- gc->pipe[pn].array.use_texuv2 = 0;
- gc->pipe[pn].array.use_texuv3 = 0;
- }
- }
-#else
- if ((gc->pipe[pn].shader.cur_tex != tex->pt->texture)
- || (gc->pipe[pn].shader.cur_prog != gc->shared->shader.font.prog)
- || (gc->pipe[pn].shader.smooth != 0)
- || (gc->pipe[pn].shader.blend != 1)
- || (gc->pipe[pn].shader.render_op != gc->dc->render_op)
- || (gc->pipe[pn].shader.clip != 0)
- )
- {
- shader_array_flush(gc);
- gc->pipe[pn].shader.cur_tex = tex->pt->texture;
- gc->pipe[pn].shader.cur_prog = gc->shared->shader.font.prog;
- gc->pipe[pn].shader.smooth = 0;
- gc->pipe[pn].shader.blend = 1;
- gc->pipe[pn].shader.render_op = gc->dc->render_op;
- gc->pipe[pn].shader.clip = 0;
- gc->pipe[pn].shader.cx = 0;
- gc->pipe[pn].shader.cy = 0;
- gc->pipe[pn].shader.cw = 0;
- gc->pipe[pn].shader.ch = 0;
- }
-
- gc->pipe[pn].region.type = RTYPE_FONT;
- gc->pipe[pn].array.line = 0;
- gc->pipe[pn].array.use_vertex = 1;
- gc->pipe[pn].array.use_color = 1;
- gc->pipe[pn].array.use_texuv = 1;
- gc->pipe[pn].array.use_texuv2 = 0;
- gc->pipe[pn].array.use_texuv3 = 0;
-#endif
-
- pipe_region_expand(gc, pn, x, y, w, h);
-
- pnum = gc->pipe[pn].array.num;
- nv = pnum * 3; nc = pnum * 4; nu = pnum * 2; nt = pnum * 4;
- gc->pipe[pn].array.num += 6;
- array_alloc(gc, pn);
-
- if (sw == 0.0)
+ pn = _evas_gl_common_context_push(RTYPE_FONT,
+ gc, tex, NULL,
+ prog,
+ x, y, w, h,
+ 1,
+ 0,
+ 0, 0, 0, 0, 0);
+
+ gc->pipe[pn].region.type = RTYPE_FONT;
+ gc->pipe[pn].shader.cur_tex = tex->pt->texture;
+ gc->pipe[pn].shader.cur_prog = prog;
+ gc->pipe[pn].shader.smooth = 0;
+ gc->pipe[pn].shader.blend = 1;
+ gc->pipe[pn].shader.render_op = gc->dc->render_op;
+ gc->pipe[pn].shader.clip = 0;
+ gc->pipe[pn].shader.cx = 0;
+ gc->pipe[pn].shader.cy = 0;
+ gc->pipe[pn].shader.cw = 0;
+ gc->pipe[pn].shader.ch = 0;
+ gc->pipe[pn].array.line = 0;
+ gc->pipe[pn].array.use_vertex = 1;
+ gc->pipe[pn].array.use_color = 1;
+ gc->pipe[pn].array.use_texuv = 1;
+ gc->pipe[pn].array.use_texuv2 = 0;
+ gc->pipe[pn].array.use_texuv3 = 0;
+
+ pipe_region_expand(gc, pn, x, y, w, h);
+
+ pnum = gc->pipe[pn].array.num;
+ nv = pnum * 3; nc = pnum * 4; nu = pnum * 2; nt = pnum * 4;
+ gc->pipe[pn].array.num += 6;
+ array_alloc(gc, pn);
+
+ if (sw == 0.0)
{
tx1 = tex->sx1;
ty1 = tex->sy1;
tx2 = ((double)(tex->x) + sx + sw) / (double)tex->pt->w;
ty2 = ((double)(tex->y) + sy + sh) / (double)tex->pt->h;
}
-
+
PUSH_VERTEX(pn, x , y , 0);
PUSH_VERTEX(pn, x + w, y , 0);
PUSH_VERTEX(pn, x , y + h, 0);
-
+
PUSH_TEXUV(pn, tx1, ty1);
PUSH_TEXUV(pn, tx2, ty1);
PUSH_TEXUV(pn, tx1, ty2);
-
+
PUSH_VERTEX(pn, x + w, y , 0);
PUSH_VERTEX(pn, x + w, y + h, 0);
PUSH_VERTEX(pn, x , y + h, 0);
-
+
PUSH_TEXUV(pn, tx2, ty1);
PUSH_TEXUV(pn, tx2, ty2);
PUSH_TEXUV(pn, tx1, ty2);
void
evas_gl_common_context_yuv_push(Evas_Engine_GL_Context *gc,
- Evas_GL_Texture *tex,
+ Evas_GL_Texture *tex,
double sx, double sy, double sw, double sh,
int x, int y, int w, int h,
int r, int g, int b, int a,
int pnum, nv, nc, nu, nu2, nu3, nt, i;
GLfloat tx1, tx2, ty1, ty2, t2x1, t2x2, t2y1, t2y2;
Eina_Bool blend = 0;
- GLuint prog = gc->shared->shader.yuv.prog;
+ GLuint prog;
int pn = 0;
if (a < 255) blend = 1;
-
- if ((a == 255) && (r == 255) && (g == 255) && (b == 255))
- prog = gc->shared->shader.yuv_nomul.prog;
- else
- prog = gc->shared->shader.yuv.prog;
-
-again:
- vertex_array_size_check(gc, gc->state.top_pipe, 6);
- pn = gc->state.top_pipe;
-#ifdef GLPIPES
- if ((pn == 0) && (gc->pipe[pn].array.num == 0))
- {
- gc->pipe[pn].region.type = RTYPE_YUV;
- gc->pipe[pn].shader.cur_tex = tex->pt->texture;
- gc->pipe[pn].shader.cur_texu = tex->ptu->texture;
- gc->pipe[pn].shader.cur_texv = tex->ptv->texture;
- gc->pipe[pn].shader.cur_prog = prog;
- gc->pipe[pn].shader.smooth = smooth;
- gc->pipe[pn].shader.blend = blend;
- gc->pipe[pn].shader.render_op = gc->dc->render_op;
- gc->pipe[pn].shader.clip = 0;
- gc->pipe[pn].shader.cx = 0;
- gc->pipe[pn].shader.cy = 0;
- gc->pipe[pn].shader.cw = 0;
- gc->pipe[pn].shader.ch = 0;
- gc->pipe[pn].array.line = 0;
- gc->pipe[pn].array.use_vertex = 1;
- gc->pipe[pn].array.use_color = 1;
- gc->pipe[pn].array.use_texuv = 1;
- gc->pipe[pn].array.use_texuv2 = 1;
- gc->pipe[pn].array.use_texuv3 = 1;
- }
- else
+
+ prog = gc->shared->shader[evas_gl_common_shader_choice(0, NULL, r, g, b, a,
+ SHADER_YUV_NOMUL, SHADER_YUV)].prog;
+
+ pn = _evas_gl_common_context_push(RTYPE_YUV,
+ gc, tex, NULL,
+ prog,
+ x, y, w, h,
+ blend,
+ smooth,
+ 0, 0, 0, 0, 0);
+
+ gc->pipe[pn].region.type = RTYPE_YUV;
+ gc->pipe[pn].shader.cur_tex = tex->pt->texture;
+ gc->pipe[pn].shader.cur_texu = tex->ptu->texture;
+ gc->pipe[pn].shader.cur_texv = tex->ptv->texture;
+ gc->pipe[pn].shader.cur_prog = prog;
+ gc->pipe[pn].shader.smooth = smooth;
+ gc->pipe[pn].shader.blend = blend;
+ gc->pipe[pn].shader.render_op = gc->dc->render_op;
+ gc->pipe[pn].shader.clip = 0;
+ gc->pipe[pn].shader.cx = 0;
+ gc->pipe[pn].shader.cy = 0;
+ gc->pipe[pn].shader.cw = 0;
+ gc->pipe[pn].shader.ch = 0;
+ gc->pipe[pn].array.line = 0;
+ gc->pipe[pn].array.use_vertex = 1;
+ gc->pipe[pn].array.use_color = 1;
+ gc->pipe[pn].array.use_texuv = 1;
+ gc->pipe[pn].array.use_texuv2 = 1;
+ gc->pipe[pn].array.use_texuv3 = 1;
+
+ pipe_region_expand(gc, pn, x, y, w, h);
+
+ pnum = gc->pipe[pn].array.num;
+ nv = pnum * 3; nc = pnum * 4; nu = pnum * 2;
+ nu2 = pnum * 2; nu3 = pnum * 2; nt = pnum * 4;
+ gc->pipe[pn].array.num += 6;
+ array_alloc(gc, pn);
+
+ tx1 = (sx) / (double)tex->pt->w;
+ ty1 = (sy) / (double)tex->pt->h;
+ tx2 = (sx + sw) / (double)tex->pt->w;
+ ty2 = (sy + sh) / (double)tex->pt->h;
+
+ t2x1 = ((sx) / 2) / (double)tex->ptu->w;
+ t2y1 = ((sy) / 2) / (double)tex->ptu->h;
+ t2x2 = ((sx + sw) / 2) / (double)tex->ptu->w;
+ t2y2 = ((sy + sh) / 2) / (double)tex->ptu->h;
+
+ PUSH_VERTEX(pn, x , y , 0);
+ PUSH_VERTEX(pn, x + w, y , 0);
+ PUSH_VERTEX(pn, x , y + h, 0);
+
+ PUSH_TEXUV(pn, tx1, ty1);
+ PUSH_TEXUV(pn, tx2, ty1);
+ PUSH_TEXUV(pn, tx1, ty2);
+
+ PUSH_TEXUV2(pn, t2x1, t2y1);
+ PUSH_TEXUV2(pn, t2x2, t2y1);
+ PUSH_TEXUV2(pn, t2x1, t2y2);
+
+ PUSH_TEXUV3(pn, t2x1, t2y1);
+ PUSH_TEXUV3(pn, t2x2, t2y1);
+ PUSH_TEXUV3(pn, t2x1, t2y2);
+
+ PUSH_VERTEX(pn, x + w, y , 0);
+ PUSH_VERTEX(pn, x + w, y + h, 0);
+ PUSH_VERTEX(pn, x , y + h, 0);
+
+ PUSH_TEXUV(pn, tx2, ty1);
+ PUSH_TEXUV(pn, tx2, ty2);
+ PUSH_TEXUV(pn, tx1, ty2);
+
+ PUSH_TEXUV2(pn, t2x2, t2y1);
+ PUSH_TEXUV2(pn, t2x2, t2y2);
+ PUSH_TEXUV2(pn, t2x1, t2y2);
+
+ PUSH_TEXUV3(pn, t2x2, t2y1);
+ PUSH_TEXUV3(pn, t2x2, t2y2);
+ PUSH_TEXUV3(pn, t2x1, t2y2);
+
+ for (i = 0; i < 6; i++)
{
- int found = 0;
-
- for (i = pn; i >= 0; i--)
- {
- if ((gc->pipe[i].region.type == RTYPE_YUV)
- && (gc->pipe[i].shader.cur_tex == tex->pt->texture)
- && (gc->pipe[i].shader.cur_prog == gc->shared->shader.font.prog)
- && (gc->pipe[i].shader.smooth == smooth)
- && (gc->pipe[i].shader.blend == blend)
- && (gc->pipe[i].shader.render_op == gc->dc->render_op)
- && (gc->pipe[i].shader.clip == 0)
- )
- {
- found = 1;
- pn = i;
- break;
- }
- if (pipe_region_intersects(gc, i, x, y, w, h)) break;
- }
- if (!found)
- {
- pn = gc->state.top_pipe + 1;
- if (pn >= gc->shared->info.tune.pipes.max)
- {
- shader_array_flush(gc);
- goto again;
- }
- gc->state.top_pipe = pn;
- gc->pipe[pn].region.type = RTYPE_YUV;
- gc->pipe[pn].shader.cur_tex = tex->pt->texture;
- gc->pipe[pn].shader.cur_texu = tex->ptu->texture;
- gc->pipe[pn].shader.cur_texv = tex->ptv->texture;
- gc->pipe[pn].shader.cur_prog = prog;
- gc->pipe[pn].shader.smooth = smooth;
- gc->pipe[pn].shader.blend = blend;
- gc->pipe[pn].shader.render_op = gc->dc->render_op;
- gc->pipe[pn].shader.clip = 0;
- gc->pipe[pn].shader.cx = 0;
- gc->pipe[pn].shader.cy = 0;
- gc->pipe[pn].shader.cw = 0;
- gc->pipe[pn].shader.ch = 0;
- gc->pipe[pn].array.line = 0;
- gc->pipe[pn].array.use_vertex = 1;
- gc->pipe[pn].array.use_color = 1;
- gc->pipe[pn].array.use_texuv = 1;
- gc->pipe[pn].array.use_texuv2 = 1;
- gc->pipe[pn].array.use_texuv3 = 1;
- }
+ PUSH_COLOR(pn, r, g, b, a);
}
-#else
- if ((gc->pipe[pn].shader.cur_tex != tex->pt->texture)
- || (gc->pipe[pn].shader.cur_prog != prog)
- || (gc->pipe[pn].shader.smooth != smooth)
- || (gc->pipe[pn].shader.blend != blend)
- || (gc->pipe[pn].shader.render_op != gc->dc->render_op)
- || (gc->pipe[pn].shader.clip != 0)
- )
+}
+
+void
+evas_gl_common_context_yuy2_push(Evas_Engine_GL_Context *gc,
+ Evas_GL_Texture *tex,
+ double sx, double sy, double sw, double sh,
+ int x, int y, int w, int h,
+ int r, int g, int b, int a,
+ Eina_Bool smooth)
+{
+ int pnum, nv, nc, nu, nu2, nu3, nt, i;
+ GLfloat tx1, tx2, ty1, ty2, t2x1, t2x2, t2y1, t2y2;
+ Eina_Bool blend = 0;
+ GLuint prog;
+ int pn = 0;
+
+ if (a < 255) blend = 1;
+
+ prog = gc->shared->shader[evas_gl_common_shader_choice(0, NULL, r, g, b, a,
+ SHADER_YUY2_NOMUL, SHADER_YUY2)].prog;
+
+ pn = _evas_gl_common_context_push(RTYPE_YUY2,
+ gc, tex, NULL,
+ prog,
+ x, y, w, h,
+ blend,
+ smooth,
+ 0, 0, 0, 0, 0);
+
+ gc->pipe[pn].region.type = RTYPE_YUY2;
+ gc->pipe[pn].shader.cur_tex = tex->pt->texture;
+ gc->pipe[pn].shader.cur_texu = tex->ptuv->texture;
+ gc->pipe[pn].shader.cur_prog = prog;
+ gc->pipe[pn].shader.smooth = smooth;
+ gc->pipe[pn].shader.blend = blend;
+ gc->pipe[pn].shader.render_op = gc->dc->render_op;
+ gc->pipe[pn].shader.clip = 0;
+ gc->pipe[pn].shader.cx = 0;
+ gc->pipe[pn].shader.cy = 0;
+ gc->pipe[pn].shader.cw = 0;
+ gc->pipe[pn].shader.ch = 0;
+ gc->pipe[pn].array.line = 0;
+ gc->pipe[pn].array.use_vertex = 1;
+ gc->pipe[pn].array.use_color = 1;
+ gc->pipe[pn].array.use_texuv = 1;
+ gc->pipe[pn].array.use_texuv2 = 1;
+ gc->pipe[pn].array.use_texuv3 = 0;
+
+ pipe_region_expand(gc, pn, x, y, w, h);
+
+ pnum = gc->pipe[pn].array.num;
+ nv = pnum * 3; nc = pnum * 4; nu = pnum * 2;
+ nu2 = pnum * 2; nu3 = pnum * 2; nt = pnum * 4;
+ gc->pipe[pn].array.num += 6;
+ array_alloc(gc, pn);
+
+ tx1 = (sx) / (double)tex->pt->w;
+ ty1 = (sy) / (double)tex->pt->h;
+ tx2 = (sx + sw) / (double)tex->pt->w;
+ ty2 = (sy + sh) / (double)tex->pt->h;
+
+ t2x1 = sx / (double)tex->ptuv->w;
+ t2y1 = sy / (double)tex->ptuv->h;
+ t2x2 = (sx + sw) / (double)tex->ptuv->w;
+ t2y2 = (sy + sh) / (double)tex->ptuv->h;
+
+ PUSH_VERTEX(pn, x , y , 0);
+ PUSH_VERTEX(pn, x + w, y , 0);
+ PUSH_VERTEX(pn, x , y + h, 0);
+
+ PUSH_TEXUV(pn, tx1, ty1);
+ PUSH_TEXUV(pn, tx2, ty1);
+ PUSH_TEXUV(pn, tx1, ty2);
+
+ PUSH_TEXUV2(pn, t2x1, t2y1);
+ PUSH_TEXUV2(pn, t2x2, t2y1);
+ PUSH_TEXUV2(pn, t2x1, t2y2);
+
+ PUSH_VERTEX(pn, x + w, y , 0);
+ PUSH_VERTEX(pn, x + w, y + h, 0);
+ PUSH_VERTEX(pn, x , y + h, 0);
+
+ PUSH_TEXUV(pn, tx2, ty1);
+ PUSH_TEXUV(pn, tx2, ty2);
+ PUSH_TEXUV(pn, tx1, ty2);
+
+ PUSH_TEXUV2(pn, t2x2, t2y1);
+ PUSH_TEXUV2(pn, t2x2, t2y2);
+ PUSH_TEXUV2(pn, t2x1, t2y2);
+
+ for (i = 0; i < 6; i++)
{
- shader_array_flush(gc);
- gc->pipe[pn].shader.cur_tex = tex->pt->texture;
- gc->pipe[pn].shader.cur_texu = tex->ptu->texture;
- gc->pipe[pn].shader.cur_texv = tex->ptv->texture;
- gc->pipe[pn].shader.cur_prog = prog;
- gc->pipe[pn].shader.smooth = smooth;
- gc->pipe[pn].shader.blend = blend;
- gc->pipe[pn].shader.render_op = gc->dc->render_op;
- gc->pipe[pn].shader.clip = 0;
- gc->pipe[pn].shader.cx = 0;
- gc->pipe[pn].shader.cy = 0;
- gc->pipe[pn].shader.cw = 0;
- gc->pipe[pn].shader.ch = 0;
+ PUSH_COLOR(pn, r, g, b, a);
}
-
- gc->pipe[pn].region.type = RTYPE_YUV;
+}
+
+void
+evas_gl_common_context_nv12_push(Evas_Engine_GL_Context *gc,
+ Evas_GL_Texture *tex,
+ double sx, double sy, double sw, double sh,
+ int x, int y, int w, int h,
+ int r, int g, int b, int a,
+ Eina_Bool smooth)
+{
+ int pnum, nv, nc, nu, nu2, nu3, nt, i;
+ GLfloat tx1, tx2, ty1, ty2, t2x1, t2x2, t2y1, t2y2;
+ Eina_Bool blend = 0;
+ GLuint prog;
+ int pn = 0;
+
+ if (a < 255) blend = 1;
+
+ prog = gc->shared->shader[evas_gl_common_shader_choice(0, NULL, r, g, b, a,
+ SHADER_NV12_NOMUL, SHADER_NV12)].prog;
+
+ pn = _evas_gl_common_context_push(RTYPE_NV12,
+ gc, tex, NULL,
+ prog,
+ x, y, w, h,
+ blend,
+ smooth,
+ 0, 0, 0, 0, 0);
+
+ gc->pipe[pn].region.type = RTYPE_NV12;
+ gc->pipe[pn].shader.cur_tex = tex->pt->texture;
+ gc->pipe[pn].shader.cur_tex_dyn = tex->pt->dyn.img;
+ gc->pipe[pn].shader.cur_texu = tex->ptuv->texture;
+ gc->pipe[pn].shader.cur_texu_dyn = tex->ptuv->dyn.img;
+ gc->pipe[pn].shader.cur_prog = prog;
+ gc->pipe[pn].shader.smooth = smooth;
+ gc->pipe[pn].shader.blend = blend;
+ gc->pipe[pn].shader.render_op = gc->dc->render_op;
+ gc->pipe[pn].shader.clip = 0;
+ gc->pipe[pn].shader.cx = 0;
+ gc->pipe[pn].shader.cy = 0;
+ gc->pipe[pn].shader.cw = 0;
+ gc->pipe[pn].shader.ch = 0;
gc->pipe[pn].array.line = 0;
gc->pipe[pn].array.use_vertex = 1;
gc->pipe[pn].array.use_color = 1;
gc->pipe[pn].array.use_texuv = 1;
- gc->pipe[pn].array.use_texuv2 = 1;
- gc->pipe[pn].array.use_texuv3 = 1;
-#endif
-
+ gc->pipe[pn].array.use_texuv2 = 1;
+ gc->pipe[pn].array.use_texuv3 = 0;
+
pipe_region_expand(gc, pn, x, y, w, h);
-
+
pnum = gc->pipe[pn].array.num;
- nv = pnum * 3; nc = pnum * 4; nu = pnum * 2;
+ nv = pnum * 3; nc = pnum * 4; nu = pnum * 2;
nu2 = pnum * 2; nu3 = pnum * 2; nt = pnum * 4;
gc->pipe[pn].array.num += 6;
array_alloc(gc, pn);
ty1 = (sy) / (double)tex->pt->h;
tx2 = (sx + sw) / (double)tex->pt->w;
ty2 = (sy + sh) / (double)tex->pt->h;
-
- t2x1 = ((sx) / 2) / (double)tex->ptu->w;
- t2y1 = ((sy) / 2) / (double)tex->ptu->h;
- t2x2 = ((sx + sw) / 2) / (double)tex->ptu->w;
- t2y2 = ((sy + sh) / 2) / (double)tex->ptu->h;
-
+
+ t2x1 = sx / (double)tex->ptuv->w;
+ t2y1 = sy / (double)tex->ptuv->h;
+ t2x2 = (sx + sw) / (double)tex->ptuv->w;
+ t2y2 = (sy + sh) / (double)tex->ptuv->h;
+
PUSH_VERTEX(pn, x , y , 0);
PUSH_VERTEX(pn, x + w, y , 0);
PUSH_VERTEX(pn, x , y + h, 0);
-
+
PUSH_TEXUV(pn, tx1, ty1);
PUSH_TEXUV(pn, tx2, ty1);
PUSH_TEXUV(pn, tx1, ty2);
-
+
PUSH_TEXUV2(pn, t2x1, t2y1);
PUSH_TEXUV2(pn, t2x2, t2y1);
PUSH_TEXUV2(pn, t2x1, t2y2);
-
- PUSH_TEXUV3(pn, t2x1, t2y1);
- PUSH_TEXUV3(pn, t2x2, t2y1);
- PUSH_TEXUV3(pn, t2x1, t2y2);
-
+
PUSH_VERTEX(pn, x + w, y , 0);
PUSH_VERTEX(pn, x + w, y + h, 0);
PUSH_VERTEX(pn, x , y + h, 0);
-
+
PUSH_TEXUV(pn, tx2, ty1);
PUSH_TEXUV(pn, tx2, ty2);
PUSH_TEXUV(pn, tx1, ty2);
PUSH_TEXUV2(pn, t2x2, t2y2);
PUSH_TEXUV2(pn, t2x1, t2y2);
- PUSH_TEXUV3(pn, t2x2, t2y1);
- PUSH_TEXUV3(pn, t2x2, t2y2);
- PUSH_TEXUV3(pn, t2x1, t2y2);
-
for (i = 0; i < 6; i++)
{
PUSH_COLOR(pn, r, g, b, a);
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 tex_only,
- Eina_Bool yuv)
+ Eina_Bool smooth, Eina_Bool tex_only,
+ Evas_Colorspace cspace)
{
int pnum, nv, nc, nu, nu2, nu3, nt, i;
const int points[6] = { 0, 1, 2, 0, 2, 3 };
GLfloat tx[4], ty[4], t2x[4], t2y[4];
Eina_Bool blend = 1;
DATA32 cmul;
- GLuint prog = gc->shared->shader.img.prog;
+ GLuint prog = gc->shared->shader[SHADER_IMG].prog;
+ Eina_Bool utexture = EINA_FALSE;
+ Eina_Bool uvtexture = EINA_FALSE;
int pn = 0;
int flat = 0;
if (a < 255) blend = 1;
if (npoints != 4)
{
- // FIXME: nash - you didnt fix this for n points. its still all 4 point stuff!!! grrrr.
+ // FIXME: nash - you didn't fix this for n points. its still all
+ // 4 point stuff!!! grrrr.
abort();
}
if ((A_VAL(&(p[0].col)) < 0xff) || (A_VAL(&(p[1].col)) < 0xff) ||
(A_VAL(&(p[2].col)) < 0xff) || (A_VAL(&(p[3].col)) < 0xff))
blend = 1;
-
+
if ((p[0].z == p[1].z) && (p[1].z == p[2].z) && (p[2].z == p[3].z))
flat = 1;
if (!clip) cx = cy = cw = ch = 0;
-
+
if (!flat)
{
if (p[0].foc <= 0) flat = 1;
}
- if (yuv)
- {
- prog = gc->shared->shader.yuv.prog;
- if ((a == 255) && (r == 255) && (g == 255) && (b == 255))
- {
- if ((p[0].col == 0xffffffff) && (p[1].col == 0xffffffff) &&
- (p[2].col == 0xffffffff) && (p[3].col == 0xffffffff))
- prog = gc->shared->shader.yuv_nomul.prog;
+
+ switch (cspace)
+ {
+ case EVAS_COLORSPACE_YCBCR422P601_PL:
+ case EVAS_COLORSPACE_YCBCR422P709_PL:
+ prog = gc->shared->shader[evas_gl_common_shader_choice(npoints, p, r, g, b, a,
+ SHADER_YUV_NOMUL, SHADER_YUV)].prog;
+ utexture = EINA_TRUE;
+ break;
+ case EVAS_COLORSPACE_YCBCR422601_PL:
+ prog = gc->shared->shader[evas_gl_common_shader_choice(npoints, p, r, g, b, a,
+ SHADER_YUY2_NOMUL, SHADER_YUY2)].prog;
+ uvtexture = EINA_TRUE;
+ break;
+ case EVAS_COLORSPACE_YCBCR420NV12601_PL:
+ case EVAS_COLORSPACE_YCBCR420TM12601_PL:
+ prog = gc->shared->shader[evas_gl_common_shader_choice(npoints, p, r, g, b, a,
+ SHADER_NV12_NOMUL, SHADER_NV12)].prog;
+ uvtexture = EINA_TRUE;
+ break;
+
+ default:
+ if (tex_only)
+ {
+ if (tex->pt->dyn.img)
+ {
+ prog = gc->shared->shader[evas_gl_common_shader_choice(npoints, p, r, g, b, a,
+ SHADER_IMG_BGRA_NOMUL, SHADER_IMG_BGRA)].prog;
+ }
+ else
+ {
+ prog = gc->shared->shader[evas_gl_common_shader_choice(npoints, p, r, g, b, a,
+ SHADER_TEX_NOMUL, SHADER_TEX)].prog;
+ }
+ }
+ else
+ {
+ if (tex->gc->shared->info.bgra)
+ {
+ prog = gc->shared->shader[evas_gl_common_shader_choice(npoints, p, r, g, b, a,
+ SHADER_IMG_BGRA_NOMUL,
+ SHADER_IMG_BGRA)].prog;
+ }
else
- prog = gc->shared->shader.yuv.prog;
- }
- else
- prog = gc->shared->shader.yuv.prog;
+ {
+ prog = gc->shared->shader[evas_gl_common_shader_choice(npoints, p, r, g, b, a,
+ SHADER_IMG_NOMUL,
+ SHADER_IMG)].prog;
+ }
+ }
}
- else
+
+ x = w = (p[0].x >> FP);
+ y = h = (p[0].y >> FP);
+ for (i = 0; i < 4; i++)
{
- if (tex_only)
+ tx[i] = ((double)(tex->x) + (((double)p[i].u) / FP1)) /
+ (double)tex->pt->w;
+ ty[i] = ((double)(tex->y) + (((double)p[i].v) / FP1)) /
+ (double)tex->pt->h;
+ px = (p[i].x >> FP);
+ if (px < x) x = px;
+ else if (px > w) w = px;
+ py = (p[i].y >> FP);
+ if (py < y) y = py;
+ else if (py > h) h = py;
+ if (utexture)
{
- if (tex->pt->dyn.img)
- {
- if ((a == 255) && (r == 255) && (g == 255) && (b == 255))
- {
- if ((p[0].col == 0xffffffff) && (p[1].col == 0xffffffff) &&
- (p[2].col == 0xffffffff) && (p[3].col == 0xffffffff))
- prog = gc->shared->shader.img_nomul.prog;
- else
- prog = gc->shared->shader.img.prog;
- }
- else
- prog = gc->shared->shader.img.prog;
- }
- else
- {
- if ((a == 255) && (r == 255) && (g == 255) && (b == 255))
- {
- if ((p[0].col == 0xffffffff) && (p[1].col == 0xffffffff) &&
- (p[2].col == 0xffffffff) && (p[3].col == 0xffffffff))
- prog = gc->shared->shader.tex_nomul.prog;
- else
- prog = gc->shared->shader.tex.prog;
- }
- else
- prog = gc->shared->shader.tex.prog;
- }
+ t2x[i] = ((((double)p[i].u / 2) / FP1)) / (double)tex->ptu->w;
+ t2y[i] = ((((double)p[i].v / 2) / FP1)) / (double)tex->ptu->h;
}
- else
+ else if (uvtexture)
{
- if (tex->gc->shared->info.bgra)
- {
- if ((a == 255) && (r == 255) && (g == 255) && (b == 255))
- {
- if ((p[0].col == 0xffffffff) && (p[1].col == 0xffffffff) &&
- (p[2].col == 0xffffffff) && (p[3].col == 0xffffffff))
- prog = gc->shared->shader.img_bgra_nomul.prog;
- else
- prog = gc->shared->shader.img_bgra.prog;
- }
- else
- prog = gc->shared->shader.img_bgra.prog;
- }
- else
- {
- if ((a == 255) && (r == 255) && (g == 255) && (b == 255))
- {
- if ((p[0].col == 0xffffffff) && (p[1].col == 0xffffffff) &&
- (p[2].col == 0xffffffff) && (p[3].col == 0xffffffff))
- prog = gc->shared->shader.img_nomul.prog;
- else
- prog = gc->shared->shader.img.prog;
- }
- else
- prog = gc->shared->shader.img.prog;
- }
+ t2x[i] = ((((double)p[i].u / 2) / FP1)) / (double)tex->ptuv->w;
+ t2y[i] = ((((double)p[i].v / 2) / FP1)) / (double)tex->ptuv->h;
}
}
-
+ w = w - x;
+ h = h - y;
+
+ if (clip)
+ {
+ int nx = x, ny = y, nw = w, nh = h;
+
+ RECTS_CLIP_TO_RECT(nx, ny, nw, nh, cx, cy, cw, ch);
+ if ((nx == x) && (ny == y) && (nw == w) && (nh == h))
+ {
+ clip = 0; cx = 0; cy = 0; cw = 0; ch = 0;
+ }
+ x = nx; y = nw; w = nw; h = nh;
+ }
+
if (!flat)
{
shader_array_flush(gc);
gc->change.size = 1;
_evas_gl_common_viewport_set(gc);
}
-again:
- vertex_array_size_check(gc, gc->state.top_pipe, 6);
- pn = gc->state.top_pipe;
-#ifdef GLPIPES
- if ((pn == 0) && (gc->pipe[pn].array.num == 0))
- {
- gc->pipe[pn].region.type = RTYPE_MAP;
- gc->pipe[pn].shader.cur_tex = tex->pt->texture;
- if (yuv)
- {
- gc->pipe[pn].shader.cur_texu = tex->ptu->texture;
- gc->pipe[pn].shader.cur_texv = tex->ptv->texture;
- }
- gc->pipe[pn].shader.cur_prog = prog;
- gc->pipe[pn].shader.smooth = smooth;
- gc->pipe[pn].shader.blend = blend;
- gc->pipe[pn].shader.render_op = gc->dc->render_op;
- gc->pipe[pn].shader.clip = clip;
- gc->pipe[pn].shader.cx = cx;
- gc->pipe[pn].shader.cy = cy;
- gc->pipe[pn].shader.cw = cw;
- gc->pipe[pn].shader.ch = ch;
- gc->pipe[pn].array.line = 0;
- gc->pipe[pn].array.use_vertex = 1;
- gc->pipe[pn].array.use_color = 1;
- gc->pipe[pn].array.use_texuv = 1;
- if (yuv)
- {
- gc->pipe[pn].array.use_texuv2 = 1;
- gc->pipe[pn].array.use_texuv3 = 1;
- }
- else
- {
- gc->pipe[pn].array.use_texuv2 = 0;
- gc->pipe[pn].array.use_texuv3 = 0;
- }
- }
- else
- {
- int found = 0;
-
- for (i = pn; i >= 0; i--)
- {
- if ((gc->pipe[i].region.type == RTYPE_MAP)
- && (gc->pipe[i].shader.cur_tex == tex->pt->texture)
- && (gc->pipe[i].shader.cur_prog == prog)
- && (gc->pipe[i].shader.smooth == smooth)
- && (gc->pipe[i].shader.blend == blend)
- && (gc->pipe[i].shader.render_op == gc->dc->render_op)
- && (gc->pipe[i].shader.clip == clip)
- && (gc->pipe[i].shader.cx == cx)
- && (gc->pipe[i].shader.cy == cy)
- && (gc->pipe[i].shader.cw == cw)
- && (gc->pipe[i].shader.ch == ch)
- )
- {
- found = 1;
- pn = i;
- break;
- }
- if (pipe_region_intersects(gc, i, x, y, w, h)) break;
- }
- if (!found)
- {
- pn = gc->state.top_pipe + 1;
- if (pn >= gc->shared->info.tune.pipes.max)
- {
- shader_array_flush(gc);
- goto again;
- }
- gc->state.top_pipe = pn;
- gc->pipe[pn].region.type = RTYPE_MAP;
- gc->pipe[pn].shader.cur_tex = tex->pt->texture;
- if (yuv)
- {
- gc->pipe[pn].shader.cur_texu = tex->ptu->texture;
- gc->pipe[pn].shader.cur_texv = tex->ptv->texture;
- }
- gc->pipe[pn].shader.cur_prog = prog;
- gc->pipe[pn].shader.smooth = smooth;
- gc->pipe[pn].shader.blend = blend;
- gc->pipe[pn].shader.render_op = gc->dc->render_op;
- gc->pipe[pn].shader.clip = clip;
- gc->pipe[pn].shader.cx = cx;
- gc->pipe[pn].shader.cy = cy;
- gc->pipe[pn].shader.cw = cw;
- gc->pipe[pn].shader.ch = ch;
- gc->pipe[pn].array.line = 0;
- gc->pipe[pn].array.use_vertex = 1;
- gc->pipe[pn].array.use_color = 1;
- gc->pipe[pn].array.use_texuv = 1;
- if (yuv)
- {
- gc->pipe[pn].array.use_texuv2 = 1;
- gc->pipe[pn].array.use_texuv3 = 1;
- }
- else
- {
- gc->pipe[pn].array.use_texuv2 = 0;
- gc->pipe[pn].array.use_texuv3 = 0;
- }
- }
- }
- if ((tex->im) && (tex->im->native.data))
- {
- if (gc->pipe[pn].array.im != tex->im)
- {
- shader_array_flush(gc);
- pn = gc->state.top_pipe;
- gc->pipe[pn].array.im = tex->im;
- goto again;
- }
- }
- if (tex->pt->dyn.img)
- {
- if (gc->pipe[pn].array.im != tex->im)
- {
- shader_array_flush(gc);
- pn = gc->state.top_pipe;
- gc->pipe[pn].array.im = tex->im;
- goto again;
- }
- }
-#else
- if ((gc->pipe[pn].shader.cur_tex != tex->pt->texture)
- || (gc->pipe[pn].shader.cur_prog != prog)
- || (gc->pipe[pn].shader.smooth != smooth)
- || (gc->pipe[pn].shader.blend != blend)
- || (gc->pipe[pn].shader.render_op != gc->dc->render_op)
- || (gc->pipe[pn].shader.clip != clip)
- || (gc->pipe[pn].shader.cx != cx)
- || (gc->pipe[pn].shader.cy != cy)
- || (gc->pipe[pn].shader.cw != cw)
- || (gc->pipe[pn].shader.ch != ch)
- )
- {
- shader_array_flush(gc);
- gc->pipe[pn].shader.cur_tex = tex->pt->texture;
- gc->pipe[pn].shader.cur_prog = prog;
- gc->pipe[pn].shader.smooth = smooth;
- gc->pipe[pn].shader.blend = blend;
- gc->pipe[pn].shader.render_op = gc->dc->render_op;
- gc->pipe[pn].shader.clip = clip;
- gc->pipe[pn].shader.cx = cx;
- gc->pipe[pn].shader.cy = cy;
- gc->pipe[pn].shader.cw = cw;
- gc->pipe[pn].shader.ch = ch;
- }
- if ((tex->im) && (tex->im->native.data))
+
+ pn = _evas_gl_common_context_push(RTYPE_MAP,
+ gc, tex, NULL,
+ prog,
+ x, y, w, h,
+ blend,
+ smooth,
+ clip, cx, cy, cw, ch);
+ gc->pipe[pn].region.type = RTYPE_MAP;
+ gc->pipe[pn].shader.cur_tex = tex->pt->texture;
+ if (utexture)
{
- if (gc->pipe[pn].array.im != tex->im)
- {
- shader_array_flush(gc);
- gc->pipe[pn].array.im = tex->im;
- }
+ gc->pipe[pn].shader.cur_texu = tex->ptu->texture;
+ gc->pipe[pn].shader.cur_texu_dyn = tex->ptu->dyn.img;
+ gc->pipe[pn].shader.cur_texv = tex->ptv->texture;
+ gc->pipe[pn].shader.cur_texv_dyn = tex->ptv->dyn.img;
}
- if (tex->pt->dyn.img)
+ else if (uvtexture)
{
- if (gc->pipe[pn].array.im != tex->im)
- {
- shader_array_flush(gc);
- gc->pipe[pn].array.im = tex->im;
- }
+ gc->pipe[pn].shader.cur_texu = tex->ptuv->texture;
+ gc->pipe[pn].shader.cur_texu_dyn = tex->ptuv->dyn.img;
}
-
- gc->pipe[pn].region.type = RTYPE_MAP;
+ gc->pipe[pn].shader.cur_prog = prog;
+ gc->pipe[pn].shader.smooth = smooth;
+ gc->pipe[pn].shader.blend = blend;
+ gc->pipe[pn].shader.render_op = gc->dc->render_op;
+ gc->pipe[pn].shader.clip = clip;
+ gc->pipe[pn].shader.cx = cx;
+ gc->pipe[pn].shader.cy = cy;
+ gc->pipe[pn].shader.cw = cw;
+ gc->pipe[pn].shader.ch = ch;
gc->pipe[pn].array.line = 0;
gc->pipe[pn].array.use_vertex = 1;
gc->pipe[pn].array.use_color = 1;
gc->pipe[pn].array.use_texuv = 1;
- if (yuv)
- {
- gc->pipe[pn].array.use_texuv2 = 1;
- gc->pipe[pn].array.use_texuv3 = 1;
- }
- else
- {
- gc->pipe[pn].array.use_texuv2 = 0;
- gc->pipe[pn].array.use_texuv3 = 0;
- }
-#endif
-
- x = w = (p[points[0]].x >> FP);
- y = h = (p[points[0]].y >> FP);
- for (i = 0; i < 4; i++)
- {
- tx[i] = ((double)(tex->x) + (((double)p[i].u) / FP1)) /
- (double)tex->pt->w;
- ty[i] = ((double)(tex->y) + (((double)p[i].v) / FP1)) /
- (double)tex->pt->h;
- px = (p[points[i]].x >> FP);
- if (px < x) x = px;
- else if (px > w) w = py;
- py = (p[points[i]].y >> FP);
- if (py < y) y = py;
- else if (py > h) h = py;
- if (yuv)
- {
- t2x[i] = ((((double)p[i].u / 2) / FP1)) / (double)tex->ptu->w;
- t2y[i] = ((((double)p[i].v / 2) / FP1)) / (double)tex->ptu->h;
- }
- }
- w = w - x;
- h = h - y;
-
+ gc->pipe[pn].array.use_texuv2 = (utexture || uvtexture) ? 1 : 0;
+ gc->pipe[pn].array.use_texuv3 = (utexture) ? 1 : 0;
+
pipe_region_expand(gc, pn, x, y, w, h);
-
+
pnum = gc->pipe[pn].array.num;
nv = pnum * 3; nc = pnum * 4; nu = pnum * 2; nu2 = pnum * 2;
nu2 = pnum * 2; nu3 = pnum * 2; nt = pnum * 4;
if ((tex->im) && (tex->im->native.data) && (!tex->im->native.yinvert))
{
- // FIXME: handle yinvert
- ERR("not handling inverted y case for map");
+ for (i = 0; i < 4; i++)
+ {
+ ty[i] = 1.0 - ty[i];
+ if (utexture || uvtexture)
+ t2y[i] = 1.0 - t2y[i];
+ }
}
-
+
cmul = ARGB_JOIN(a, r, g, b);
for (i = 0; i < 6; i++)
{
if (flat)
{
PUSH_VERTEX(pn,
- (p[points[i]].x >> FP),
+ (p[points[i]].x >> FP),
(p[points[i]].y >> FP),
0);
}
else
{
PUSH_VERTEX(pn,
- (p[points[i]].fx) + gc->shared->ax,
+ (p[points[i]].fx) + gc->shared->ax,
(p[points[i]].fy) + gc->shared->ay,
- (p[points[i]].fz)
+ (p[points[i]].fz)
+ (gc->shared->foc - gc->shared->z0));
}
PUSH_TEXUV(pn,
tx[points[i]],
ty[points[i]]);
- if (yuv)
+ if (utexture)
{
PUSH_TEXUV2(pn,
t2x[points[i]],
t2x[points[i]],
t2y[points[i]]);
}
-
+ else if (uvtexture)
+ {
+ PUSH_TEXUV2(pn,
+ t2x[points[i]],
+ t2y[points[i]]);
+ }
+
PUSH_COLOR(pn,
R_VAL(&cl),
G_VAL(&cl),
}
static void
+scissor_rot(Evas_Engine_GL_Context *gc __UNUSED__,
+ int rot, int gw, int gh, int cx, int cy, int cw, int ch)
+{
+ switch (rot)
+ {
+ case 0: // UP this way: ^
+ glScissor(cx, cy, cw, ch);
+ break;
+ case 90: // UP this way: <
+ glScissor(gh - (cy + ch), cx, ch, cw);
+ break;
+ case 180: // UP this way: v
+ glScissor(gw - (cx + cw), gh - (cy + ch), cw, ch);
+ break;
+ case 270: // UP this way: >
+ glScissor(cy, gw - (cx + cw), ch, cw);
+ break;
+ default: // assume up is up
+ glScissor(cx, cy, cw, ch);
+ break;
+ }
+}
+
+static void
shader_array_flush(Evas_Engine_GL_Context *gc)
{
int i, gw, gh, setclip, cy, fbo = 0, done = 0;
glUseProgram(gc->pipe[i].shader.cur_prog);
GLERR(__FUNCTION__, __FILE__, __LINE__, "");
}
-
+
if (gc->pipe[i].shader.cur_tex != gc->state.current.cur_tex)
{
#if 0
(GL_TEXTURE_2D, gc->pipe[i].array.im->tex->pt->dyn.img);
}
else
-#endif
+#endif
{
if (!gc->pipe[i].array.im->native.loose)
{
if (gc->pipe[i].array.im->native.func.bind)
- gc->pipe[i].array.im->native.func.bind(gc->pipe[i].array.im->native.func.data,
+ gc->pipe[i].array.im->native.func.bind(gc->pipe[i].array.im->native.func.data,
gc->pipe[i].array.im);
}
}
}
if (gc->pipe[i].shader.clip != gc->state.current.clip)
{
-
+
if (gc->pipe[i].shader.clip)
{
cy = gh - gc->pipe[i].shader.cy - gc->pipe[i].shader.ch;
if (fbo) cy = gc->pipe[i].shader.cy;
glEnable(GL_SCISSOR_TEST);
- glScissor(gc->pipe[i].shader.cx, cy,
- gc->pipe[i].shader.cw, gc->pipe[i].shader.ch);
+ if (!fbo)
+ scissor_rot(gc, gc->rot, gw, gh,
+ gc->pipe[i].shader.cx,
+ cy,
+ gc->pipe[i].shader.cw,
+ gc->pipe[i].shader.ch);
+ else
+ glScissor(gc->pipe[i].shader.cx, cy,
+ gc->pipe[i].shader.cw, gc->pipe[i].shader.ch);
setclip = 1;
}
else
{
cy = gh - gc->pipe[i].shader.cy - gc->pipe[i].shader.ch;
if (fbo) cy = gc->pipe[i].shader.cy;
- glScissor(gc->pipe[i].shader.cx, cy,
- gc->pipe[i].shader.cw, gc->pipe[i].shader.ch);
+ if (!fbo)
+ scissor_rot(gc, gc->rot, gw, gh,
+ gc->pipe[i].shader.cx,
+ cy,
+ gc->pipe[i].shader.cw,
+ gc->pipe[i].shader.ch);
+ else
+ glScissor(gc->pipe[i].shader.cx, cy,
+ gc->pipe[i].shader.cw, gc->pipe[i].shader.ch);
}
}
glDisableVertexAttribArray(SHAD_TEXUV);
GLERR(__FUNCTION__, __FILE__, __LINE__, "");
}
-
+
if (gc->pipe[i].array.line)
{
glDisableVertexAttribArray(SHAD_TEXUV);
{
if (gc->pipe[i].array.use_texm)
{
- printf("using tex m (%d)\n",gc->pipe[i].shader.cur_texm);
glEnableVertexAttribArray(SHAD_TEXM);
GLERR(__FUNCTION__, __FILE__, __LINE__, "");
glVertexAttribPointer(SHAD_TEXM, 2, GL_FLOAT, GL_FALSE, 0, gc->pipe[i].array.texm);
GLERR(__FUNCTION__, __FILE__, __LINE__, "");
glVertexAttribPointer(SHAD_TEXUV3, 2, GL_FLOAT, GL_FALSE, 0, gc->pipe[i].array.texuv3);
GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
glActiveTexture(GL_TEXTURE1);
GLERR(__FUNCTION__, __FILE__, __LINE__, "");
glBindTexture(GL_TEXTURE_2D, gc->pipe[i].shader.cur_texu);
GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+#if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX)
+ if (gc->pipe[i].shader.cur_texu_dyn)
+ secsym_glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, gc->pipe[i].shader.cur_texu_dyn);
+#endif
+
glActiveTexture(GL_TEXTURE2);
GLERR(__FUNCTION__, __FILE__, __LINE__, "");
glBindTexture(GL_TEXTURE_2D, gc->pipe[i].shader.cur_texv);
GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+#if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX)
+ if (gc->pipe[i].shader.cur_texv_dyn)
+ secsym_glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, gc->pipe[i].shader.cur_texv_dyn);
+#endif
glActiveTexture(GL_TEXTURE0);
GLERR(__FUNCTION__, __FILE__, __LINE__, "");
}
GLERR(__FUNCTION__, __FILE__, __LINE__, "");
glVertexAttribPointer(SHAD_TEXUV2, 2, GL_FLOAT, GL_FALSE, 0, gc->pipe[i].array.texuv2);
GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
glActiveTexture(GL_TEXTURE1);
GLERR(__FUNCTION__, __FILE__, __LINE__, "");
glBindTexture(GL_TEXTURE_2D, gc->pipe[i].shader.cur_texu);
+ GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+#if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX)
+ if (gc->pipe[i].shader.cur_texu_dyn)
+ secsym_glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, gc->pipe[i].shader.cur_texu_dyn);
+#endif
glActiveTexture(GL_TEXTURE0);
GLERR(__FUNCTION__, __FILE__, __LINE__, "");
}
}
if (dbgflushnum)
{
- const char *types[6] =
+ const char *types[6] =
{"----", "RECT", "IMAG", "FONT", "YUV-", "MAP"};
printf(" DRAW#%3i %4i -> %p[%4ix%4i] @ %4ix%4i -{ tex %4i type %s }-\n",
i,
- gc->pipe[i].array.num / 6,
+ gc->pipe[i].array.num / 6,
gc->pipe[0].shader.surface,
gc->pipe[0].shader.surface->w,
gc->pipe[0].shader.surface->h,
if (!gc->pipe[i].array.im->native.loose)
{
if (gc->pipe[i].array.im->native.func.unbind)
- gc->pipe[i].array.im->native.func.unbind(gc->pipe[i].array.im->native.func.data,
+ gc->pipe[i].array.im->native.func.unbind(gc->pipe[i].array.im->native.func.data,
gc->pipe[i].array.im);
}
gc->pipe[i].array.im = NULL;
}
-
+
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.blend = gc->pipe[i].shader.blend;
- gc->state.current.smooth = gc->pipe[i].shader.smooth;
gc->state.current.render_op = gc->pipe[i].shader.render_op;
- gc->state.current.clip = gc->pipe[i].shader.clip;
gc->state.current.cx = gc->pipe[i].shader.cx;
gc->state.current.cy = gc->pipe[i].shader.cy;
gc->state.current.cw = gc->pipe[i].shader.cw;
gc->state.current.ch = gc->pipe[i].shader.ch;
-
+ gc->state.current.smooth = gc->pipe[i].shader.smooth;
+ gc->state.current.blend = gc->pipe[i].shader.blend;
+ gc->state.current.clip = gc->pipe[i].shader.clip;
+
if (gc->pipe[i].array.vertex) free(gc->pipe[i].array.vertex);
if (gc->pipe[i].array.color) free(gc->pipe[i].array.color);
if (gc->pipe[i].array.texuv) free(gc->pipe[i].array.texuv);
if (gc->pipe[i].array.texm) free(gc->pipe[i].array.texm);
if (gc->pipe[i].array.texuv2) free(gc->pipe[i].array.texuv2);
if (gc->pipe[i].array.texuv3) free(gc->pipe[i].array.texuv3);
-
+
gc->pipe[i].array.vertex = NULL;
gc->pipe[i].array.color = NULL;
gc->pipe[i].array.texuv = NULL;
gc->pipe[i].array.num = 0;
gc->pipe[i].array.alloc = 0;
-
+
gc->pipe[i].region.x = 0;
gc->pipe[i].region.y = 0;
gc->pipe[i].region.w = 0;