glamor-ddx: Use gbm to allocate front buffer and cursor image.

Signed-off-by: Zhigang Gong <zhigang.gong@linux.intel.com>
This commit is contained in:
Zhigang Gong 2011-09-19 06:31:57 +08:00
parent 82a9b0c540
commit 4c8ed1756a
2 changed files with 43 additions and 32 deletions

View File

@ -30,12 +30,14 @@
#ifdef HAVE_DIX_CONFIG_H #ifdef HAVE_DIX_CONFIG_H
#include <dix-config.h> #include <dix-config.h>
#endif #endif
#include <gbm.h>
#include <unistd.h> #include <unistd.h>
#include <fcntl.h> #include <fcntl.h>
#include <errno.h> #include <errno.h>
#include <xf86drm.h> #include <xf86drm.h>
#include "../../../mi/micmap.h" #include "../../../mi/micmap.h"
#include <xf86Crtc.h> #include <xf86Crtc.h>
#include <xf86.h> #include <xf86.h>
@ -57,7 +59,6 @@ glamor_ddx_identify(int flags)
xf86Msg(X_INFO, "Standalone %s: OpenGL accelerated X.org driver\n", glamor_ddx_name); xf86Msg(X_INFO, "Standalone %s: OpenGL accelerated X.org driver\n", glamor_ddx_name);
} }
Bool Bool
glamor_resize(ScrnInfoPtr scrn, int width, int height) glamor_resize(ScrnInfoPtr scrn, int width, int height)
{ {
@ -65,25 +66,25 @@ glamor_resize(ScrnInfoPtr scrn, int width, int height)
ScreenPtr screen = screenInfo.screens[scrn->scrnIndex]; ScreenPtr screen = screenInfo.screens[scrn->scrnIndex];
EGLImageKHR image; EGLImageKHR image;
GLuint texture; GLuint texture;
EGLint attribs[] = {
EGL_WIDTH, 0,
EGL_HEIGHT, 0,
EGL_DRM_BUFFER_FORMAT_MESA, EGL_DRM_BUFFER_FORMAT_ARGB32_MESA,
EGL_DRM_BUFFER_USE_MESA, EGL_DRM_BUFFER_USE_SHARE_MESA |
EGL_DRM_BUFFER_USE_SCANOUT_MESA,
EGL_NONE
};
if (glamor->root != EGL_NO_IMAGE_KHR && if (glamor->root != EGL_NO_IMAGE_KHR &&
scrn->virtualX == width && scrn->virtualY == height) scrn->virtualX == width && scrn->virtualY == height)
return TRUE; return TRUE;
attribs[1] = width; glamor->root_bo = gbm_bo_create(glamor->gbm, width, height,
attribs[3] = height; GBM_BO_FORMAT_ARGB8888,
image = (glamor->egl_create_drm_image_mesa)(glamor->display, attribs); GBM_BO_USE_SCANOUT | GBM_BO_USE_RENDERING);
if (image == EGL_NO_IMAGE_KHR)
if (glamor->root_bo == NULL)
return FALSE; return FALSE;
image = glamor->egl_create_image_khr(glamor->display, NULL, EGL_NATIVE_PIXMAP_KHR, glamor->root_bo, NULL);
if (image == EGL_NO_IMAGE_KHR) {
gbm_bo_destroy(glamor->root_bo);
return FALSE;
}
glGenTextures(1, &texture); glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_2D, texture); glBindTexture(GL_TEXTURE_2D, texture);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
@ -101,39 +102,36 @@ void
glamor_frontbuffer_handle(ScrnInfoPtr scrn, uint32_t *handle, uint32_t *pitch) glamor_frontbuffer_handle(ScrnInfoPtr scrn, uint32_t *handle, uint32_t *pitch)
{ {
struct glamor_ddx_screen_private *glamor = glamor_ddx_get_screen_private(scrn); struct glamor_ddx_screen_private *glamor = glamor_ddx_get_screen_private(scrn);
EGLint name; *handle = gbm_bo_get_handle(glamor->root_bo).u32;
(glamor->egl_export_drm_image_mesa)(glamor->display, glamor->root, &name, (EGLint*) handle, (EGLint*) pitch); *pitch = gbm_bo_get_pitch(glamor->root_bo);
} }
EGLImageKHR glamor_create_cursor_argb(ScrnInfoPtr scrn, int width, int height) EGLImageKHR glamor_create_cursor_argb(ScrnInfoPtr scrn, int width, int height)
{ {
struct glamor_ddx_screen_private *glamor = glamor_ddx_get_screen_private(scrn); struct glamor_ddx_screen_private *glamor = glamor_ddx_get_screen_private(scrn);
EGLint attribs[] = { glamor->cursor_bo = gbm_bo_create(glamor->gbm, width, height,
EGL_WIDTH, 0, GBM_BO_FORMAT_ARGB8888,
EGL_HEIGHT, 0, GBM_BO_USE_SCANOUT | GBM_BO_USE_RENDERING | GBM_BO_USE_CURSOR_64X64);
EGL_DRM_BUFFER_FORMAT_MESA, EGL_DRM_BUFFER_FORMAT_ARGB32_MESA,
EGL_DRM_BUFFER_USE_MESA, EGL_DRM_BUFFER_USE_SHARE_MESA |
EGL_DRM_BUFFER_USE_SCANOUT_MESA | EGL_DRM_BUFFER_USE_CURSOR_MESA,
EGL_NONE
};
attribs[1] = width; if (glamor->cursor_bo == NULL)
attribs[3] = height; return EGL_NO_IMAGE_KHR;
return (glamor->egl_create_drm_image_mesa)(glamor->display, attribs);
return glamor->egl_create_image_khr(glamor->display, NULL, EGL_NATIVE_PIXMAP_KHR, glamor->cursor_bo, NULL);
} }
void glamor_destroy_cursor(ScrnInfoPtr scrn, EGLImageKHR cursor) void glamor_destroy_cursor(ScrnInfoPtr scrn, EGLImageKHR cursor)
{ {
struct glamor_ddx_screen_private *glamor = glamor_ddx_get_screen_private(scrn); struct glamor_ddx_screen_private *glamor = glamor_ddx_get_screen_private(scrn);
eglDestroyImageKHR(glamor->display, cursor); eglDestroyImageKHR(glamor->display, cursor);
gbm_bo_destroy(glamor->cursor_bo);
} }
void void
glamor_cursor_handle(ScrnInfoPtr scrn, EGLImageKHR cursor, uint32_t *handle, uint32_t *pitch) glamor_cursor_handle(ScrnInfoPtr scrn, EGLImageKHR cursor, uint32_t *handle, uint32_t *pitch)
{ {
struct glamor_ddx_screen_private *glamor = glamor_ddx_get_screen_private(scrn); struct glamor_ddx_screen_private *glamor = glamor_ddx_get_screen_private(scrn);
EGLint name; *handle = gbm_bo_get_handle(glamor->cursor_bo).u32;
(glamor->egl_export_drm_image_mesa)(glamor->display, cursor, &name, (EGLint*) handle, (EGLint*) pitch); *pitch = gbm_bo_get_pitch(glamor->cursor_bo);
ErrorF("cursor stride: %d\n", *pitch); ErrorF("cursor stride: %d\n", *pitch);
} }
@ -257,6 +255,7 @@ glamor_ddx_close_screen(int scrnIndex, ScreenPtr screen)
glamor_fini(screen); glamor_fini(screen);
eglDestroyImageKHR(glamor->display, glamor->root); eglDestroyImageKHR(glamor->display, glamor->root);
gbm_bo_destroy(glamor->root_bo);
eglMakeCurrent(glamor->display, eglMakeCurrent(glamor->display,
EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
@ -328,9 +327,13 @@ glamor_ddx_screen_init(int scrnIndex, ScreenPtr screen, int argc, char **argv)
} }
glamor->gbm = gbm_create_device(glamor->fd);
if (glamor->gbm == NULL) {
ErrorF("couldn't create gbm device\n");
return FALSE;
}
glamor->display = eglGetDisplay(glamor->gbm);
glamor->display = eglGetDRMDisplayMESA(glamor->fd);
#ifndef GLAMOR_GLES2 #ifndef GLAMOR_GLES2
eglBindAPI(EGL_OPENGL_API); eglBindAPI(EGL_OPENGL_API);
#else #else
@ -360,6 +363,8 @@ glamor_ddx_screen_init(int scrnIndex, ScreenPtr screen, int argc, char **argv)
#endif #endif
glamor->egl_create_drm_image_mesa = (PFNEGLCREATEDRMIMAGEMESA)eglGetProcAddress("eglCreateDRMImageMESA"); glamor->egl_create_drm_image_mesa = (PFNEGLCREATEDRMIMAGEMESA)eglGetProcAddress("eglCreateDRMImageMESA");
glamor->egl_create_image_khr = (PFNEGLCREATEIMAGEKHRPROC)
eglGetProcAddress("eglCreateImageKHR");
glamor->egl_export_drm_image_mesa = (PFNEGLEXPORTDRMIMAGEMESA)eglGetProcAddress("eglExportDRMImageMESA"); glamor->egl_export_drm_image_mesa = (PFNEGLEXPORTDRMIMAGEMESA)eglGetProcAddress("eglExportDRMImageMESA");
glamor->egl_image_target_texture2d_oes = (PFNGLEGLIMAGETARGETTEXTURE2DOESPROC)eglGetProcAddress("glEGLImageTargetTexture2DOES"); glamor->egl_image_target_texture2d_oes = (PFNGLEGLIMAGETARGETTEXTURE2DOESPROC)eglGetProcAddress("glEGLImageTargetTexture2DOES");

View File

@ -16,25 +16,31 @@
#include <EGL/egl.h> #include <EGL/egl.h>
#include <EGL/eglext.h> #include <EGL/eglext.h>
#include <gbm.h>
#include "glamor_gl_dispatch.h" #include "glamor_gl_dispatch.h"
struct glamor_ddx_screen_private { struct glamor_ddx_screen_private {
EGLDisplay display; EGLDisplay display;
EGLContext context; EGLContext context;
EGLImageKHR root; EGLImageKHR root;
struct gbm_bo *root_bo;
struct gbm_bo *cursor_bo;
EGLint major, minor; EGLint major, minor;
CreateScreenResourcesProcPtr CreateScreenResources; CreateScreenResourcesProcPtr CreateScreenResources;
CloseScreenProcPtr CloseScreen; CloseScreenProcPtr CloseScreen;
int fd; int fd;
int cpp; int cpp;
struct gbm_device *gbm;
PFNEGLCREATEDRMIMAGEMESA egl_create_drm_image_mesa; PFNEGLCREATEDRMIMAGEMESA egl_create_drm_image_mesa;
PFNEGLEXPORTDRMIMAGEMESA egl_export_drm_image_mesa; PFNEGLEXPORTDRMIMAGEMESA egl_export_drm_image_mesa;
PFNEGLCREATEIMAGEKHRPROC egl_create_image_khr;
PFNGLEGLIMAGETARGETTEXTURE2DOESPROC egl_image_target_texture2d_oes; PFNGLEGLIMAGETARGETTEXTURE2DOESPROC egl_image_target_texture2d_oes;
struct glamor_gl_dispatch *dispatch; struct glamor_gl_dispatch *dispatch;
}; };
inline struct glamor_ddx_screen_private * inline static struct glamor_ddx_screen_private *
glamor_ddx_get_screen_private(ScrnInfoPtr scrn) glamor_ddx_get_screen_private(ScrnInfoPtr scrn)
{ {
return (struct glamor_ddx_screen_private *) (scrn->driverPrivate); return (struct glamor_ddx_screen_private *) (scrn->driverPrivate);