glamor: add support for allocating linear buffers (v2)

We need this for doing USB offload scenarios using glamor
and modesetting driver.

unfortunately only gbm in mesa 10.6 has support for the
linear API.

v1.1: fix bad define
v2: update the configure.ac test as per amdgpu. (Michel)
set linear bos to external to avoid cache. (Eric)

Reviewed-by: Eric Anholt <eric@anholt.net>
Signed-off-by: Dave Airlie <airlied@redhat.com>
This commit is contained in:
Dave Airlie 2015-06-10 14:46:22 +10:00 committed by Dave Airlie
parent 5c55560538
commit ea0e4d752b
7 changed files with 23 additions and 9 deletions

View File

@ -2105,6 +2105,10 @@ if test "x$GLAMOR" = xyes; then
if test "x$GBM" = xyes; then if test "x$GBM" = xyes; then
AC_DEFINE(GLAMOR_HAS_GBM, 1, AC_DEFINE(GLAMOR_HAS_GBM, 1,
[Build glamor with GBM-based EGL support]) [Build glamor with GBM-based EGL support])
AC_CHECK_DECL(GBM_BO_USE_LINEAR,
[AC_DEFINE(GLAMOR_HAS_GBM_LINEAR, 1, [Have GBM_BO_USE_LINEAR])], [],
[#include <stdlib.h>
#include <gbm.h>])
fi fi
fi fi

View File

@ -142,7 +142,8 @@ extern _X_EXPORT void glamor_enable_dri3(ScreenPtr screen);
extern _X_EXPORT unsigned int glamor_egl_create_argb8888_based_texture(ScreenPtr extern _X_EXPORT unsigned int glamor_egl_create_argb8888_based_texture(ScreenPtr
screen, screen,
int w, int w,
int h); int h,
Bool linear);
extern _X_EXPORT int glamor_egl_dri3_fd_name_from_tex(ScreenPtr, PixmapPtr, extern _X_EXPORT int glamor_egl_dri3_fd_name_from_tex(ScreenPtr, PixmapPtr,
unsigned int, Bool, unsigned int, Bool,
CARD16 *, CARD32 *); CARD16 *, CARD32 *);

View File

@ -187,7 +187,7 @@ glamor_egl_get_gbm_device(ScreenPtr screen)
} }
unsigned int unsigned int
glamor_egl_create_argb8888_based_texture(ScreenPtr screen, int w, int h) glamor_egl_create_argb8888_based_texture(ScreenPtr screen, int w, int h, Bool linear)
{ {
ScrnInfoPtr scrn = xf86ScreenToScrn(screen); ScrnInfoPtr scrn = xf86ScreenToScrn(screen);
struct glamor_egl_screen_private *glamor_egl; struct glamor_egl_screen_private *glamor_egl;
@ -200,6 +200,9 @@ glamor_egl_create_argb8888_based_texture(ScreenPtr screen, int w, int h)
glamor_egl = glamor_egl_get_screen_private(scrn); glamor_egl = glamor_egl_get_screen_private(scrn);
bo = gbm_bo_create(glamor_egl->gbm, w, h, GBM_FORMAT_ARGB8888, bo = gbm_bo_create(glamor_egl->gbm, w, h, GBM_FORMAT_ARGB8888,
#ifdef GLAMOR_HAS_GBM_LINEAR
(linear ? GBM_BO_USE_LINEAR : 0) |
#endif
GBM_BO_USE_RENDERING | GBM_BO_USE_SCANOUT); GBM_BO_USE_RENDERING | GBM_BO_USE_SCANOUT);
if (!bo) if (!bo)
return 0; return 0;

View File

@ -50,7 +50,7 @@ glamor_egl_dri3_fd_name_from_tex(ScreenPtr screen,
} }
unsigned int unsigned int
glamor_egl_create_argb8888_based_texture(ScreenPtr screen, int w, int h) glamor_egl_create_argb8888_based_texture(ScreenPtr screen, int w, int h, Bool linear)
{ {
return 0; return 0;
} }

View File

@ -228,6 +228,9 @@ glamor_create_fbo_from_tex(glamor_screen_private *glamor_priv,
fbo->external = FALSE; fbo->external = FALSE;
fbo->format = format; fbo->format = format;
if (flag == CREATE_PIXMAP_USAGE_SHARED)
fbo->external = TRUE;
if (flag != GLAMOR_CREATE_FBO_NO_FBO) { if (flag != GLAMOR_CREATE_FBO_NO_FBO) {
if (glamor_pixmap_ensure_fb(glamor_priv, fbo) != 0) { if (glamor_pixmap_ensure_fb(glamor_priv, fbo) != 0) {
glamor_purge_fbo(glamor_priv, fbo); glamor_purge_fbo(glamor_priv, fbo);
@ -313,7 +316,7 @@ glamor_destroy_fbo(glamor_screen_private *glamor_priv,
static int static int
_glamor_create_tex(glamor_screen_private *glamor_priv, _glamor_create_tex(glamor_screen_private *glamor_priv,
int w, int h, GLenum format) int w, int h, GLenum format, Bool linear)
{ {
unsigned int tex = 0; unsigned int tex = 0;
@ -323,7 +326,7 @@ _glamor_create_tex(glamor_screen_private *glamor_priv,
* an ARGB8888 based texture for us. */ * an ARGB8888 based texture for us. */
if (glamor_priv->dri3_enabled && format == GL_RGBA) { if (glamor_priv->dri3_enabled && format == GL_RGBA) {
tex = glamor_egl_create_argb8888_based_texture(glamor_priv->screen, tex = glamor_egl_create_argb8888_based_texture(glamor_priv->screen,
w, h); w, h, linear);
} }
if (!tex) { if (!tex) {
glamor_make_current(glamor_priv); glamor_make_current(glamor_priv);
@ -344,14 +347,14 @@ glamor_create_fbo(glamor_screen_private *glamor_priv,
glamor_pixmap_fbo *fbo; glamor_pixmap_fbo *fbo;
GLint tex = 0; GLint tex = 0;
if (flag == GLAMOR_CREATE_FBO_NO_FBO) if (flag == GLAMOR_CREATE_FBO_NO_FBO || flag == CREATE_PIXMAP_USAGE_SHARED)
goto new_fbo; goto new_fbo;
fbo = glamor_pixmap_fbo_cache_get(glamor_priv, w, h, format); fbo = glamor_pixmap_fbo_cache_get(glamor_priv, w, h, format);
if (fbo) if (fbo)
return fbo; return fbo;
new_fbo: new_fbo:
tex = _glamor_create_tex(glamor_priv, w, h, format); tex = _glamor_create_tex(glamor_priv, w, h, format, flag == CREATE_PIXMAP_USAGE_SHARED);
fbo = glamor_create_fbo_from_tex(glamor_priv, w, h, format, tex, flag); fbo = glamor_create_fbo_from_tex(glamor_priv, w, h, format, tex, flag);
return fbo; return fbo;
@ -531,7 +534,7 @@ glamor_pixmap_ensure_fbo(PixmapPtr pixmap, GLenum format, int flag)
if (!pixmap_priv->fbo->tex) if (!pixmap_priv->fbo->tex)
pixmap_priv->fbo->tex = pixmap_priv->fbo->tex =
_glamor_create_tex(glamor_priv, pixmap->drawable.width, _glamor_create_tex(glamor_priv, pixmap->drawable.width,
pixmap->drawable.height, format); pixmap->drawable.height, format, FALSE);
if (flag != GLAMOR_CREATE_FBO_NO_FBO && pixmap_priv->fbo->fb == 0) if (flag != GLAMOR_CREATE_FBO_NO_FBO && pixmap_priv->fbo->fb == 0)
if (glamor_pixmap_ensure_fb(glamor_priv, pixmap_priv->fbo) != 0) if (glamor_pixmap_ensure_fb(glamor_priv, pixmap_priv->fbo) != 0)

View File

@ -415,7 +415,7 @@ glamor_egl_dri3_fd_name_from_tex(ScreenPtr screen,
} }
unsigned int unsigned int
glamor_egl_create_argb8888_based_texture(ScreenPtr screen, int w, int h) glamor_egl_create_argb8888_based_texture(ScreenPtr screen, int w, int h, Bool linear)
{ {
return 0; return 0;
} }

View File

@ -503,6 +503,9 @@
/* Build glamor's GBM-based EGL support */ /* Build glamor's GBM-based EGL support */
#undef GLAMOR_HAS_GBM #undef GLAMOR_HAS_GBM
/* Build glamor/gbm has linear support */
#undef GLAMOR_HAS_GBM_LINEAR
/* byte order */ /* byte order */
#undef X_BYTE_ORDER #undef X_BYTE_ORDER