working on new gl engine feature. inactive right now.

SVN revision: 51027
This commit is contained in:
Carsten Haitzler 2010-08-12 06:02:15 +00:00
parent 2eb9af4c97
commit 83f2ef6142
4 changed files with 158 additions and 17 deletions

View File

@ -1936,6 +1936,7 @@ evas_object_image_scale_hint_set(Evas_Object *obj, Evas_Image_Scale_Hint hint)
MAGIC_CHECK(o, Evas_Object_Image, MAGIC_OBJ_IMAGE); MAGIC_CHECK(o, Evas_Object_Image, MAGIC_OBJ_IMAGE);
return; return;
MAGIC_CHECK_END(); MAGIC_CHECK_END();
if (o->scale_hint == hint) return;
#ifdef EVAS_FRAME_QUEUING #ifdef EVAS_FRAME_QUEUING
if (o->scale_hint != hint) if (o->scale_hint != hint)
{ {
@ -1990,6 +1991,14 @@ evas_object_image_content_hint_set(Evas_Object *obj, Evas_Image_Content_Hint hin
MAGIC_CHECK(o, Evas_Object_Image, MAGIC_OBJ_IMAGE); MAGIC_CHECK(o, Evas_Object_Image, MAGIC_OBJ_IMAGE);
return; return;
MAGIC_CHECK_END(); MAGIC_CHECK_END();
if (o->content_hint == hint) return;
#ifdef EVAS_FRAME_QUEUING
if (o->content_hint != hint)
{
if (o->engine_data)
evas_common_pipe_op_image_flush(o->engine_data);
}
#endif
o->content_hint = hint; o->content_hint = hint;
} }

View File

@ -45,10 +45,38 @@
#endif #endif
#ifndef GL_TEXTURE_RECTANGLE_NV #ifndef GL_TEXTURE_RECTANGLE_NV
#define GL_TEXTURE_RECTANGLE_NV 0x84F5 # define GL_TEXTURE_RECTANGLE_NV 0x84F5
#endif #endif
#ifndef GL_BGRA #ifndef GL_BGRA
#define GL_BGRA 0x80E1 # define GL_BGRA 0x80E1
#endif
#ifndef EGL_MAP_GL_TEXTURE_2D_SEC
# define EGL_MAP_GL_TEXTURE_2D_SEC 0x3201
#endif
#ifndef EGL_MAP_GL_TEXTURE_HEIGHT_SEC
# define EGL_MAP_GL_TEXTURE_HEIGHT_SEC 0x3202
#endif
#ifndef EGL_MAP_GL_TEXTURE_WIDTH_SEC
# define EGL_MAP_GL_TEXTURE_WIDTH_SEC 0x3203
#endif
#ifndef EGL_MAP_GL_TEXTURE_FORMAT_SEC
# define EGL_MAP_GL_TEXTURE_FORMAT_SEC 0x3204
#endif
#ifndef EGL_MAP_GL_TEXTURE_RGB_SEC
# define EGL_MAP_GL_TEXTURE_RGB_SEC 0x3205
#endif
#ifndef EGL_MAP_GL_TEXTURE_RGBA_SEC
# define EGL_MAP_GL_TEXTURE_RGBA_SEC 0x3206
#endif
#ifndef EGL_MAP_GL_TEXTURE_PIXEL_TYPE_SEC
# define EGL_MAP_GL_TEXTURE_PIXEL_TYPE_SEC 0x3206
#endif
#ifndef EGL_MAP_GL_TEXTURE_UNSIGNED_BYTE_SEC
# define EGL_MAP_GL_TEXTURE_UNSIGNED_BYTE_SEC 0x3207
#endif
#ifdef EGL_MAP_GL_TEXTURE_STRIDE_IN_BYTES_SEC
# define EGL_MAP_GL_TEXTURE_STRIDE_IN_BYTES_SEC 0x3208
#endif #endif
#define SHAD_VERTEX 0 #define SHAD_VERTEX 0
@ -98,6 +126,7 @@ struct _Evas_GL_Shared
Eina_Bool bgra : 1; Eina_Bool bgra : 1;
Eina_Bool tex_npo2 : 1; Eina_Bool tex_npo2 : 1;
Eina_Bool tex_rect : 1; Eina_Bool tex_rect : 1;
Eina_Bool sec_image_map : 1;
// tuning params - per gpu/cpu combo? // tuning params - per gpu/cpu combo?
int cutout_max; int cutout_max;
int pipes_max; int pipes_max;
@ -399,6 +428,15 @@ void (*glsym_glBindFramebuffer) (GLenum a, GLuint b);
void (*glsym_glFramebufferTexture2D) (GLenum a, GLenum b, GLenum c, GLuint d, GLint e); void (*glsym_glFramebufferTexture2D) (GLenum a, GLenum b, GLenum c, GLuint d, GLint e);
void (*glsym_glDeleteFramebuffers) (GLsizei a, const GLuint *b); void (*glsym_glDeleteFramebuffers) (GLsizei a, const GLuint *b);
#if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX)
void *(*secsym_eglCreateImage) (void *a, void *b, GLenum c, void *d, const int *e);
void (*secsym_eglDestroyImage) (void *a, void *b);
void (*secsym_glEGLImageTargetTexture2DOES) (int a, void *b);
void (*secsym_eglMapImageSEC) (void *a, void *b);
void (*secsym_eglUnmapImageSEC) (void *a, void *b);
void (*secsym_eglGetImageAttribSEC) (void *a, void *b, int c, int *d);
#endif
#define GL_ERRORS 1 #define GL_ERRORS 1
#ifdef GL_ERRORS #ifdef GL_ERRORS

View File

@ -9,6 +9,19 @@ void (*glsym_glBindFramebuffer) (GLenum a, GLuint b) = NULL;
void (*glsym_glFramebufferTexture2D) (GLenum a, GLenum b, GLenum c, GLuint d, GLint e) = 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_glDeleteFramebuffers) (GLsizei a, const GLuint *b) = NULL;
#if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX)
// just used for finding symbols :)
typedef void (*_eng_fn) (void);
static _eng_fn (*secsym_eglGetProcAddress) (const char *a) = NULL;
void *(*secsym_eglCreateImage) (void *a, void *b, GLenum c, void *d, const int *e) = NULL;
void (*secsym_eglDestroyImage) (void *a, void *b) = NULL;
void (*secsym_glEGLImageTargetTexture2DOES) (int a, void *b) = NULL;
void (*secsym_eglMapImageSEC) (void *a, void *b) = NULL;
void (*secsym_eglUnmapImageSEC) (void *a, void *b) = NULL;
void (*secsym_eglGetImageAttribSEC) (void *a, void *b, int c, int *d) = NULL;
#endif
static void static void
sym_missing(void) sym_missing(void)
{ {
@ -47,6 +60,44 @@ gl_symbols(void)
FINDSYM(glsym_glDeleteFramebuffers, "glDeleteFramebuffersEXT"); FINDSYM(glsym_glDeleteFramebuffers, "glDeleteFramebuffersEXT");
FINDSYM(glsym_glDeleteFramebuffers, "glDeleteFramebuffersARB"); FINDSYM(glsym_glDeleteFramebuffers, "glDeleteFramebuffersARB");
FALLBAK(glsym_glDeleteFramebuffers); FALLBAK(glsym_glDeleteFramebuffers);
#if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX)
#undef FINDSYM
#define FINDSYM(dst, sym) \
if ((!dst) && (secsym_eglGetProcAddress)) dst = secsym_eglGetProcAddress(sym); \
if (!dst) dst = dlsym(RTLD_DEFAULT, sym)
// yes - gl core looking for egl stuff. i know it's odd. a reverse-layer thing
// but it will work as the egl/glx layer calls gl core common stuff and thus
// these symbols will work. making the glx/egl + x11 layer do this kind-of is
// wrong as this is not x11 (output) layer specific like the native surface
// stuff. this is generic zero-copy textures for gl
FINDSYM(secsym_eglGetProcAddress, "eglGetProcAddress");
FINDSYM(secsym_eglGetProcAddress, "eglGetProcAddressEXT");
FINDSYM(secsym_eglGetProcAddress, "eglGetProcAddressARB");
FINDSYM(secsym_eglGetProcAddress, "eglGetProcAddressKHR");
FINDSYM(secsym_eglCreateImage, "eglCreateImage");
FINDSYM(secsym_eglCreateImage, "eglCreateImageEXT");
FINDSYM(secsym_eglCreateImage, "eglCreateImageARB");
FINDSYM(secsym_eglCreateImage, "eglCreateImageKHR");
FINDSYM(secsym_eglDestroyImage, "eglDestroyImage");
FINDSYM(secsym_eglDestroyImage, "eglDestroyImageEXT");
FINDSYM(secsym_eglDestroyImage, "eglDestroyImageARB");
FINDSYM(secsym_eglDestroyImage, "eglDestroyImageKHR");
FINDSYM(secsym_glEGLImageTargetTexture2DOES, "glEGLImageTargetTexture2DOES");
FINDSYM(secsym_eglMapImageSEC, "eglMapImageSEC");
// FALLBAK(secsym_eglMapImageSEC);
FINDSYM(secsym_eglUnmapImageSEC, "eglUnmapImageSEC");
// FALLBAK(secsym_eglUnmapImageSEC);
FINDSYM(secsym_eglGetImageAttribSEC, "eglGetImageAttribSEC");
// FALLBAK(secsym_eglGetImageAttribSEC);
#endif
} }
static void shader_array_flush(Evas_GL_Context *gc); static void shader_array_flush(Evas_GL_Context *gc);
@ -354,6 +405,7 @@ Evas_GL_Context *
evas_gl_common_context_new(void) evas_gl_common_context_new(void)
{ {
Evas_GL_Context *gc; Evas_GL_Context *gc;
const char *s;
int i; int i;
#if 1 #if 1
@ -388,24 +440,43 @@ evas_gl_common_context_new(void)
if (ext) if (ext)
{ {
fprintf(stderr, "EXT:\n%s\n", ext); fprintf(stderr, "EXT:\n%s\n", ext);
if ((strstr((char*) ext, "GL_ARB_texture_non_power_of_two")) || if ((strstr((char *)ext, "GL_ARB_texture_non_power_of_two")) ||
(strstr((char*) ext, "OES_texture_npot")) || (strstr((char *)ext, "OES_texture_npot")) ||
(strstr((char*) ext, "GL_IMG_texture_npot"))) (strstr((char *)ext, "GL_IMG_texture_npot")))
shared->info.tex_npo2 = 1; shared->info.tex_npo2 = 1;
if ((strstr((char*) ext, "GL_NV_texture_rectangle")) || if ((strstr((char *)ext, "GL_NV_texture_rectangle")) ||
(strstr((char*) ext, "GL_EXT_texture_rectangle")) || (strstr((char *)ext, "GL_EXT_texture_rectangle")) ||
(strstr((char*) ext, "GL_ARB_texture_rectangle"))) (strstr((char *)ext, "GL_ARB_texture_rectangle")))
shared->info.tex_rect = 1; shared->info.tex_rect = 1;
#ifdef GL_TEXTURE_MAX_ANISOTROPY_EXT #ifdef GL_TEXTURE_MAX_ANISOTROPY_EXT
if ((strstr((char*) ext, "GL_EXT_texture_filter_anisotropic"))) 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)); &(shared->info.anisotropic));
#endif #endif
#ifdef GL_BGRA #ifdef GL_BGRA
if ((strstr((char*) ext, "GL_EXT_bgra")) || if ((strstr((char *)ext, "GL_EXT_bgra")) ||
(strstr((char*) ext, "GL_EXT_texture_format_BGRA8888"))) (strstr((char *)ext, "GL_EXT_texture_format_BGRA8888")))
shared->info.bgra = 1; shared->info.bgra = 1;
#endif #endif
#if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX)
// FIXME: there should be an extension name/string to check for
// not just symbols in the lib
i = 0;
if (getenv("EVAS_GL_NO_MAP_IMAGE_SEC"))
i = atoi(getenv("EVAS_GL_NO_MAP_IMAGE_SEC"));
if (!i)
{
// test for all needed symbols - be "conservative" and
// need all of it
if ((secsym_eglCreateImage) &&
(secsym_eglDestroyImage) &&
(secsym_glEGLImageTargetTexture2DOES) &&
(secsym_eglMapImageSEC) &&
(secsym_eglUnmapImageSEC) &&
(secsym_eglGetImageAttribSEC))
shared->info.sec_image_map = 1;
}
#endif
} }
glGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS, glGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS,
&(shared->info.max_texture_units)); &(shared->info.max_texture_units));
@ -417,6 +488,16 @@ evas_gl_common_context_new(void)
shared->info.cutout_max = 512; shared->info.cutout_max = 512;
shared->info.pipes_max = 32; shared->info.pipes_max = 32;
// per gpu hacks. based on impirical measurement of some known gpu's
s = glGetString(GL_RENDERER);
if (s)
{
if (strstr(s, "PowerVR SGX 540"))
shared->info.pipes_max = 32;
else if (strstr(s, "NVIDIA Tegra"))
shared->info.pipes_max = 1;
}
if (getenv("EVAS_GL_CUTOUT_MAX")) if (getenv("EVAS_GL_CUTOUT_MAX"))
shared->info.cutout_max = atoi(getenv("EVAS_GL_CUTOUT_MAX")); shared->info.cutout_max = atoi(getenv("EVAS_GL_CUTOUT_MAX"));
if (getenv("EVAS_GL_PIPES_MAX")) if (getenv("EVAS_GL_PIPES_MAX"))
@ -428,26 +509,28 @@ evas_gl_common_context_new(void)
shared->info.pipes_max = 1; shared->info.pipes_max = 1;
} }
fprintf(stderr,
fprintf(stderr, "max tex size %ix%i\n" "max tex size %ix%i\n"
"max units %i\n" "max units %i\n"
"non-power-2 tex %i\n" "non-power-2 tex %i\n"
"rect tex %i\n" "rect tex %i\n"
"bgra : %i\n" "bgra : %i\n"
"max ansiotropic filtering: %3.3f\n" "max ansiotropic filtering: %3.3f\n"
"egl sec map image: %i\n"
"\n" "\n"
"cutout max: %i\n" "cutout max: %i\n"
"pipes max: %i\n" "pipes max: %i\n"
, ,
shared->info.max_texture_size, shared->info.max_texture_size, (int)shared->info.max_texture_size, (int)shared->info.max_texture_size,
shared->info.max_texture_units, (int)shared->info.max_texture_units,
(int)shared->info.tex_npo2, (int)shared->info.tex_npo2,
(int)shared->info.tex_rect, (int)shared->info.tex_rect,
(int)shared->info.bgra, (int)shared->info.bgra,
(double)shared->info.anisotropic, (double)shared->info.anisotropic,
(int)shared->info.sec_image_map,
shared->info.cutout_max, (int)shared->info.cutout_max,
shared->info.pipes_max (int)shared->info.pipes_max
); );
glDisable(GL_DEPTH_TEST); glDisable(GL_DEPTH_TEST);

View File

@ -289,6 +289,17 @@ eng_window_new(Display *disp,
fprintf(stderr, "version: %s\n", version); fprintf(stderr, "version: %s\n", version);
if (strstr(vendor, "NVIDIA")) if (strstr(vendor, "NVIDIA"))
// FIXME: also same as tegra2 - maybe check renderer too
//
// vendor: NVIDIA Corporation
// renderer: NVIDIA Tegra
// version: OpenGL ES 2.0
//
// vs (for example)
//
// vendor: NVIDIA Corporation
// renderer: GeForce GT 220/PCI/SSE2
// version: 3.2.0 NVIDIA 195.36.24
{ {
gw->detected.loose_binding = 1; gw->detected.loose_binding = 1;
} }