[Mesa-dev] Trying to add pixmap support in Mesa
Vivek Singh
vivek.siwan at gmail.com
Sun Sep 25 22:41:12 PDT 2011
ello All
I am using Mesa-7.10.2 stack.
I am trying to run EGL with egl_gallium state trackers
(GLES=>EGL=>egl_gallium=>fbdev) over fbdev with following configuration
./configure --prefix=/opt/mesa-arm-genoa-new --host=arm-linux
--build=i686-linux --enable-gles2 --with-x=no --with-egl-platforms=fbdev
--with-egl-displays=fbdev --with-driver=no --disable-glu --disable-glw
--disable-glut --disable-gl-osmesa --disable-opengl --enable-debug
--enable-gles-overlay
I am able to run applications which can draw directly on scanout
surfaces/pbuffer (es2gears).
I want to run application which uses eglCreateImageKHR (with user defined
pixmap structures) to make textures
and eglCreatePixmapSurface (with user defined pixmap structures) to create a
Pixmap surfaces. Since Native_fbdev.c doesnot support pixmap surfaces both
calls fail.
I tried to put pixmap support in native_fbdev.c with following steps
1)putting a function in
fbdpy->base.destroy = fbdev_display_destroy;
fbdpy->base.get_param = fbdev_display_get_param;
fbdpy->base.get_configs = fbdev_display_get_configs;
/*Adding function to create PIXMAP surface*/
fbdpy->base.is_pixmap_supported = fbdev_display_is_pixmap_supported;
fbdpy->base.create_pixmap_surface = fbdev_display_create_pixmap_surface;
2)Added support flag true in native_config
pixmap_bit=true;
I am able to get finctions eglCreateImageKHR/eglCreatePixmapSurface run
successfully able to get user defined pixmap
to native_fbdev by typecasting it ot EGLNativePixmaptype. But I am not able
to draw any texture on EGLImage. I suspect
glEGLImageTargetTexture2DOES is not working properly with EGLImage returned
from eglCreateImageKHR.
I dont know how I can make it visible to GLES by calling function like
glEGLImageTargetTexture2DOES.
I am very new to GLES and EGL . Please provide me suggestions so that I can
proceed further.
For convenient i am putting my code which I have inserted to native_fbdev.c
static struct native_surface *
fbdev_display_create_pixmap_surface(struct native_display *ndpy,
EGLNativePixmapType pix,
const struct native_config *nconf)
{
printf("START %s %s\n", __FUNCTION__, __FILE__);
fbdev_pixmap *pixmap = (fbdev_pixmap *)pix;
/*Trying To print pixmap detail*/
printf("pixmap->height ::%d\n", pixmap->height);
printf("pixmap->width ::%d\n", pixmap->width);
printf("pixmap->bytes_per_pixel ::%d\n", pixmap->bytes_per_pixel);
printf("pixmap->buffer_size ::%d\n", pixmap->buffer_size);
printf("pixmap->red_size ::%d\n", pixmap->red_size);
printf("pixmap->green_size ::%d\n", pixmap->green_size);
printf("pixmap->red_size ::%d\n", pixmap->blue_size);
printf("pixmap->alpha_size ::%d\n", pixmap->alpha_size);
printf("pixmap->luminance_size ::%d\n", pixmap->luminance_size);
printf("pixmap->flags ::%d\n", pixmap->flags);
printf("pixmap->data ::%p\n", pixmap->data);
struct fbdev_display *fbdpy = fbdev_display(ndpy);
struct fbdev_surface *fbsurf;
fbsurf = CALLOC_STRUCT(fbdev_surface);
if (!fbsurf)
return NULL;
fbsurf->fbdpy = fbdpy;
fbsurf->width = pixmap->width;
fbsurf->height = pixmap->height;
fbsurf->type = FBDEV_SURFACE_TYPE_PIXMAP;
fbsurf->pixmap = pix;
fbsurf->rsurf = resource_surface_create(fbdpy->base.screen,
nconf->color_format,
PIPE_BIND_RENDER_TARGET |
PIPE_BIND_DISPLAY_TARGET | PIPE_BIND_SCANOUT );
if (!fbsurf->rsurf) {
FREE(fbsurf);
return NULL;
}
resource_surface_set_size(fbsurf->rsurf, fbsurf->width, fbsurf->height);
fbsurf->base.destroy = fbdev_surface_destroy;
fbsurf->base.present = fbdev_surface_present;
fbsurf->base.validate = fbdev_surface_validate;
fbsurf->base.wait = fbdev_surface_wait;
printf("END %s %s\n", __FUNCTION__, __FILE__);
return &fbsurf->base;
}
static struct native_display *
fbdev_display_create(int fd, struct native_event_handler *event_handler,
void *user_data)
{
struct fbdev_display *fbdpy;
fbdpy = CALLOC_STRUCT(fbdev_display);
if (!fbdpy)
return NULL;
fbdpy->fd = fd;
fbdpy->event_handler = event_handler;
fbdpy->base.user_data = user_data;
if (!fbdev_display_init(&fbdpy->base)) {
FREE(fbdpy);
return NULL;
}
fbdpy->base.destroy = fbdev_display_destroy;
fbdpy->base.get_param = fbdev_display_get_param;
fbdpy->base.get_configs = fbdev_display_get_configs;
/*Vivek:: Adding function to create PIXMAP surface*/
fbdpy->base.is_pixmap_supported = fbdev_display_is_pixmap_supported;
fbdpy->base.create_pixmap_surface = fbdev_display_create_pixmap_surface;
fbdpy->base.modeset = &fbdev_display_modeset;
return &fbdpy->base;
}
static boolean
fbdev_display_is_pixmap_supported(struct native_display *ndpy,
EGLNativePixmapType pix,
const struct native_config *nconf)
{
printf("START %s %s\n", __FUNCTION__, __FILE__);
struct fbdev_display *fdpy = fbdev_display(ndpy);
enum pipe_format fmt;
uint depth;
depth = 32; //hard coded for 4bpp
switch (depth) {
case 32:
fmt = PIPE_FORMAT_B8G8R8A8_UNORM;
break;
case 24:
fmt = PIPE_FORMAT_B8G8R8X8_UNORM;
break;
case 16:
fmt = PIPE_FORMAT_B5G6R5_UNORM;
break;
default:
fmt = PIPE_FORMAT_NONE;
break;
}
return (fmt == nconf->color_format);
}
static boolean
fbdev_surface_flush_frontbuffer(struct native_surface *nsurf)
{
printf("%s %s\n", __FUNCTION__, __FILE__);
struct fbdev_surface *fbsurf = fbdev_surface(nsurf);
if (!fbsurf->is_current)
return TRUE;
if(fbsurf->type == FBDEV_SURFACE_TYPE_PIXMAP) //Vivek
{
return resource_surface_present(fbsurf->rsurf,
NATIVE_ATTACHMENT_FRONT_LEFT, fbsurf->pixmap);
}
else
{
return resource_surface_present(fbsurf->rsurf,
NATIVE_ATTACHMENT_FRONT_LEFT, NULL);
}
}
Regards
Vivek
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/mesa-dev/attachments/20110926/50b0f41b/attachment-0001.html>
More information about the mesa-dev
mailing list