forked from enlightenment/efl
hunting bug in fglrx libs - make comment!
SVN revision: 45330
This commit is contained in:
parent
5049832c3a
commit
250496b0ea
|
@ -1063,7 +1063,7 @@ evas_event_feed_multi_up(Evas *e,
|
||||||
if (y != ev.canvas.y)
|
if (y != ev.canvas.y)
|
||||||
ev.canvas.ysub = ev.canvas.y; // fixme - lost precision
|
ev.canvas.ysub = ev.canvas.y; // fixme - lost precision
|
||||||
if (e->events_frozen <= 0)
|
if (e->events_frozen <= 0)
|
||||||
evas_object_event_callback_call(obj, EVAS_CALLBACK_MOUSE_UP, &ev);
|
evas_object_event_callback_call(obj, EVAS_CALLBACK_MULTI_UP, &ev);
|
||||||
if (e->delete_me) break;
|
if (e->delete_me) break;
|
||||||
}
|
}
|
||||||
if (copy) copy = eina_list_free(copy);
|
if (copy) copy = eina_list_free(copy);
|
||||||
|
|
|
@ -162,6 +162,8 @@ struct _Evas_GL_Texture
|
||||||
int x, y, w, h;
|
int x, y, w, h;
|
||||||
double sx1, sy1, sx2, sy2;
|
double sx1, sy1, sx2, sy2;
|
||||||
int references;
|
int references;
|
||||||
|
|
||||||
|
Eina_Bool alpha : 1;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct _Evas_GL_Image
|
struct _Evas_GL_Image
|
||||||
|
|
|
@ -3,8 +3,8 @@
|
||||||
#if 1
|
#if 1
|
||||||
static const GLenum rgba_fmt = GL_RGBA;
|
static const GLenum rgba_fmt = GL_RGBA;
|
||||||
static const GLenum rgba_ifmt = GL_RGBA;
|
static const GLenum rgba_ifmt = GL_RGBA;
|
||||||
//static const GLenum rgb_fmt = GL_RGBA;
|
static const GLenum rgb_fmt = GL_RGBA;
|
||||||
//static const GLenum rgb_ifmt = GL_RGBA;
|
static const GLenum rgb_ifmt = GL_RGBA;
|
||||||
static const GLenum alpha_fmt = GL_ALPHA;
|
static const GLenum alpha_fmt = GL_ALPHA;
|
||||||
static const GLenum alpha_ifmt = GL_ALPHA;
|
static const GLenum alpha_ifmt = GL_ALPHA;
|
||||||
static const GLenum lum_fmt = GL_LUMINANCE;
|
static const GLenum lum_fmt = GL_LUMINANCE;
|
||||||
|
@ -12,8 +12,8 @@ static const GLenum lum_ifmt = GL_LUMINANCE;
|
||||||
#else
|
#else
|
||||||
static const GLenum rgba_fmt = GL_RGBA;
|
static const GLenum rgba_fmt = GL_RGBA;
|
||||||
static const GLenum rgba_ifmt = GL_COMPRESSED_RGBA;
|
static const GLenum rgba_ifmt = GL_COMPRESSED_RGBA;
|
||||||
//static const GLenum rgb_fmt = GL_RGBA;
|
static const GLenum rgb_fmt = GL_RGBA;
|
||||||
//static const GLenum rgb_ifmt = GL_COMPRESSED_RGBA;
|
static const GLenum rgb_ifmt = GL_COMPRESSED_RGBA;
|
||||||
static const GLenum alpha_fmt = GL_ALPHA;
|
static const GLenum alpha_fmt = GL_ALPHA;
|
||||||
static const GLenum alpha_ifmt = GL_COMPRESSED_ALPHA;
|
static const GLenum alpha_ifmt = GL_COMPRESSED_ALPHA;
|
||||||
static const GLenum lum_fmt = GL_LUMINANCE;
|
static const GLenum lum_fmt = GL_LUMINANCE;
|
||||||
|
@ -224,14 +224,18 @@ evas_gl_common_texture_new(Evas_GL_Context *gc, RGBA_Image *im)
|
||||||
|
|
||||||
tex->gc = gc;
|
tex->gc = gc;
|
||||||
tex->references = 1;
|
tex->references = 1;
|
||||||
// if (im->cache_entry.flags.alpha)
|
|
||||||
tex->pt = _pool_tex_find(gc, im->cache_entry.w + 2,
|
if (im->cache_entry.flags.alpha)
|
||||||
im->cache_entry.h + 1, rgba_ifmt, rgba_fmt,
|
{
|
||||||
&u, &v, &l_after, 1024);
|
tex->pt = _pool_tex_find(gc, im->cache_entry.w + 2,
|
||||||
// else
|
im->cache_entry.h + 1, rgba_ifmt, rgba_fmt,
|
||||||
// tex->pt = _pool_tex_find(gc, im->cache_entry.w + 3,
|
&u, &v, &l_after, 1024);
|
||||||
// im->cache_entry.h + 1, rgb_ifmt, rgb_fmt,
|
tex->alpha = 1;
|
||||||
// &u, &v, &l_after, 1024);
|
}
|
||||||
|
else
|
||||||
|
tex->pt = _pool_tex_find(gc, im->cache_entry.w + 3,
|
||||||
|
im->cache_entry.h + 1, rgb_ifmt, rgb_fmt,
|
||||||
|
&u, &v, &l_after, 1024);
|
||||||
if (!tex->pt)
|
if (!tex->pt)
|
||||||
{
|
{
|
||||||
free(tex);
|
free(tex);
|
||||||
|
@ -300,6 +304,21 @@ _pool_tex_render_new(Evas_GL_Context *gc, int w, int h, int intformat, int forma
|
||||||
return pt;
|
return pt;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
pt_unref(Evas_GL_Texture_Pool *pt)
|
||||||
|
{
|
||||||
|
pt->references--;
|
||||||
|
if (pt->references > 0) return;
|
||||||
|
if (pt->whole)
|
||||||
|
pt->gc->shared->tex.whole = eina_list_remove(pt->gc->shared->tex.whole, pt);
|
||||||
|
else
|
||||||
|
pt->gc->shared->tex.atlas [pt->slot][pt->fslot] =
|
||||||
|
eina_list_remove(pt->gc->shared->tex.atlas[pt->slot][pt->fslot], pt);
|
||||||
|
glDeleteTextures(1, &(pt->texture));
|
||||||
|
if (pt->fb) glsym_glDeleteFramebuffers(1, &(pt->fb));
|
||||||
|
free(pt);
|
||||||
|
}
|
||||||
|
|
||||||
Evas_GL_Texture *
|
Evas_GL_Texture *
|
||||||
evas_gl_common_texture_render_new(Evas_GL_Context *gc, int w, int h, int alpha)
|
evas_gl_common_texture_render_new(Evas_GL_Context *gc, int w, int h, int alpha)
|
||||||
{
|
{
|
||||||
|
@ -312,7 +331,11 @@ evas_gl_common_texture_render_new(Evas_GL_Context *gc, int w, int h, int alpha)
|
||||||
|
|
||||||
tex->gc = gc;
|
tex->gc = gc;
|
||||||
tex->references = 1;
|
tex->references = 1;
|
||||||
tex->pt = _pool_tex_render_new(gc, w, h, rgba_ifmt, rgba_fmt);
|
tex->alpha = alpha;
|
||||||
|
if (alpha)
|
||||||
|
tex->pt = _pool_tex_render_new(gc, w, h, rgba_ifmt, rgba_fmt);
|
||||||
|
else
|
||||||
|
tex->pt = _pool_tex_render_new(gc, w, h, rgb_ifmt, rgb_fmt);
|
||||||
if (!tex->pt)
|
if (!tex->pt)
|
||||||
{
|
{
|
||||||
free(tex);
|
free(tex);
|
||||||
|
@ -329,6 +352,29 @@ evas_gl_common_texture_render_new(Evas_GL_Context *gc, int w, int h, int alpha)
|
||||||
void
|
void
|
||||||
evas_gl_common_texture_update(Evas_GL_Texture *tex, RGBA_Image *im)
|
evas_gl_common_texture_update(Evas_GL_Texture *tex, RGBA_Image *im)
|
||||||
{
|
{
|
||||||
|
if (tex->alpha != im->cache_entry.flags.alpha)
|
||||||
|
{
|
||||||
|
tex->pt->allocations = eina_list_remove(tex->pt->allocations, tex);
|
||||||
|
pt_unref(tex->pt);
|
||||||
|
tex->alpha = im->cache_entry.flags.alpha;
|
||||||
|
if (tex->alpha)
|
||||||
|
tex->pt = _pool_tex_render_new(tex->gc, tex->w, tex->h, rgba_ifmt, rgba_fmt);
|
||||||
|
else
|
||||||
|
tex->pt = _pool_tex_render_new(tex->gc, tex->w, tex->h, rgb_ifmt, rgb_fmt);
|
||||||
|
}
|
||||||
|
/* FIXME: on fglrx this doesnt work - is uploads alpha channel too AND uses it
|
||||||
|
* so need to fill in alpha channel - all bad! the texture is set up as rgb,
|
||||||
|
* not rgba. perhaps a shader can fix this that forcible sets a to 0xff if
|
||||||
|
* blend is off
|
||||||
|
if (!tex->alpha)
|
||||||
|
{
|
||||||
|
DATA32 *pixels, *p, *end;
|
||||||
|
|
||||||
|
pixels = im->image.data;
|
||||||
|
end = pixels + (im->cache_entry.w * im->cache_entry.h);
|
||||||
|
for (p = pixels; p < end; p++) *p |= 0xff000000;
|
||||||
|
}
|
||||||
|
*/
|
||||||
glBindTexture(GL_TEXTURE_2D, tex->pt->texture);
|
glBindTexture(GL_TEXTURE_2D, tex->pt->texture);
|
||||||
#ifdef GL_UNPACK_ROW_LENGTH
|
#ifdef GL_UNPACK_ROW_LENGTH
|
||||||
glPixelStorei(GL_UNPACK_ROW_LENGTH, 0);
|
glPixelStorei(GL_UNPACK_ROW_LENGTH, 0);
|
||||||
|
@ -381,21 +427,6 @@ evas_gl_common_texture_update(Evas_GL_Texture *tex, RGBA_Image *im)
|
||||||
glBindTexture(GL_TEXTURE_2D, tex->gc->shader.cur_tex);
|
glBindTexture(GL_TEXTURE_2D, tex->gc->shader.cur_tex);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
|
||||||
pt_unref(Evas_GL_Texture_Pool *pt)
|
|
||||||
{
|
|
||||||
pt->references--;
|
|
||||||
if (pt->references > 0) return;
|
|
||||||
if (pt->whole)
|
|
||||||
pt->gc->shared->tex.whole = eina_list_remove(pt->gc->shared->tex.whole, pt);
|
|
||||||
else
|
|
||||||
pt->gc->shared->tex.atlas [pt->slot][pt->fslot] =
|
|
||||||
eina_list_remove(pt->gc->shared->tex.atlas[pt->slot][pt->fslot], pt);
|
|
||||||
glDeleteTextures(1, &(pt->texture));
|
|
||||||
if (pt->fb) glsym_glDeleteFramebuffers(1, &(pt->fb));
|
|
||||||
free(pt);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
void
|
||||||
evas_gl_common_texture_free(Evas_GL_Texture *tex)
|
evas_gl_common_texture_free(Evas_GL_Texture *tex)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue