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:
parent
82a9b0c540
commit
4c8ed1756a
|
@ -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");
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Loading…
Reference in New Issue