Trying to put pixmap support in Native_fbdev.c

Vivek Singh <[email protected]>
Newsgroups gmane.comp.video.mesa3d.user
Message-ID <CAJrcCc0UFEzKZY_f5oNU=RyyvwYy52bdPeR-T30e8KRWDCZK+Q@mail.gmail.com>
Hello 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

_______________________________________________
mesa-users mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/mesa-users
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.