[Intel-gfx] [PATCH] EGL: Add hardware cursor image format for EGL image extension.
Kristian Høgsberg
krh at bitplanet.net
Tue May 10 14:22:21 CEST 2011
I implemented this just a few days ago:
http://cgit.freedesktop.org/mesa/mesa/commit/?id=e5169e9615e8391ea369415b356168717b8f7be0
It's a new use flags instead of a new format, because, well, it's not
a new pixel format, but a restriction on how the buffers should be
allocated.
Kristian
On Tue, May 10, 2011 at 5:47 AM, zhigang gong <zhigang.gong at gmail.com> wrote:
> Current EGL only support one drm buffer format which is
> EGL_DRM_BUFFER_FORMAT_ARGB32_MESA. This
> format works fine with normal image, but if we want to
> create a drm buffer which will be used for a hardware cursor,
> then it has problem. The default behaviou for this format is to
> enable tiling for i915 driver. Thus it will choose 512 as the buffer's
> stride. But the hardware cursor can only support 256 as the
> row stride. To solve this problem, I create a new drm buffer
> format named EGL_DRM_BUFFER_FORMAT_HWCURSOR_ARGB32_MESA
> for hardware cursor usage. It will disable the tiling by default
> for i915 driver and then choose 256 as its pitch value. I tested it on a
> Sandy bridge platform, it works fine.
> ---
> include/EGL/eglext.h | 1 +
> include/GL/internal/dri_interface.h | 1 +
> src/egl/drivers/dri2/egl_dri2.c | 3 +++
> src/mesa/drivers/dri/intel/intel_screen.c | 7 +++++--
> 4 files changed, 10 insertions(+), 2 deletions(-)
>
> diff --git a/include/EGL/eglext.h b/include/EGL/eglext.h
> index 9fd3eb8..d0153d3 100644
> --- a/include/EGL/eglext.h
> +++ b/include/EGL/eglext.h
> @@ -127,6 +127,7 @@ typedef EGLBoolean (EGLAPIENTRYP
> PFNEGLDESTROYIMAGEKHRPROC) (EGLDisplay dpy, EGL
>
> /* EGL_DRM_BUFFER_FORMAT_MESA tokens */
> #define EGL_DRM_BUFFER_FORMAT_ARGB32_MESA 0x31D2
> +#define EGL_DRM_BUFFER_FORMAT_HWCURSOR_ARGB32_MESA 0x31D3
>
> /* EGL_DRM_BUFFER_USE_MESA bits */
> #define EGL_DRM_BUFFER_USE_SCANOUT_MESA 0x0001
> diff --git a/include/GL/internal/dri_interface.h
> b/include/GL/internal/dri_interface.h
> index 2fb729a..fa2341b 100644
> --- a/include/GL/internal/dri_interface.h
> +++ b/include/GL/interna
> @@ -127,6 +127,7 @@ typedef EGLBoolean (EGLAPIENTRYP
> PFNEGLDESTROYIMAGEKHRPROC) (EGLDisplay dpy, EGL
>
> /* EGL_DRM_BUFFER_FORMAT_MESA tokens */
> #define EGL_DRM_BUFFER_FORMAT_ARGB32_MESA 0x31D2
> +#define EGL_DRM_BUFFER_FORMAT_HWCURSOR_ARGB32_MESA 0x31D3
>
> /* EGL_DRM_BUFFER_USE_MESA bits */
> #define EGL_DRM_BUFFER_USE_SCANOUT_MESA 0x0001
> diff --git a/include/GL/internal/dri_interface.h
> b/include/GL/internal/dri_interface.h
> index 2fb729a..fa2341b 100644
> --- a/include/GL/internal/dri_interface.h
> +++ b/include/GL/internal/dri_interface.h
> @@ -813,6 +813,7 @@ struct __DRIdri2ExtensionRec {
> #define __DRI_IMAGE_FORMAT_RGB565 0x1001
> #define __DRI_IMAGE_FORMAT_XRGB8888 0x1002
> #define __DRI_IMAGE_FORMAT_ARGB8888 0x1003
> +#define __DRI_IMAGE_FORMAT_HWCURSOR_ARGB 0x1004
>
> #define __DRI_IMAGE_USE_SHARE 0x0001
> #define __DRI_IMAGE_USE_SCANOUT 0x0002
> diff --git a/src/egl/drivers/dri2/egl_dri2.c b/src/egl/drivers/dri2/egl_dri2.c
> index 5e47fbe..23ab0ed 100644
> --- a/src/egl/drivers/dri2/egl_dri2.c
> +++ b/src/egl/drivers/dri2/egl_dri2.c
> @@ -1043,6 +1043,9 @@ dri2_create_drm_image_mesa(_EGLDriver *drv,
> _EGLDisplay *disp,
> }
>
> switch (attrs.DRMBufferFormatMESA) {
> + case EGL_DRM_BUFFER_FORMAT_HWCURSOR_ARGB32_MESA:
> + format = __DRI_IMAGE_FORMAT_HWCURSOR_ARGB;
> + break;
> case EGL_DRM_BUFFER_FORMAT_ARGB32_MESA:
> format = __DRI_IMAGE_FORMAT_ARGB8888;
> break;
> diff --git a/src/mesa/drivers/dri/intel/intel_screen.c
> b/src/mesa/drivers/dri/intel/intel_screen.c
> index 7de0d12..475c142 100644
> --- a/src/mesa/drivers/dri/intel/intel_screen.c
> +++ b/src/mesa/drivers/dri/intel/intel_screen.c
> @@ -217,11 +217,12 @@ intel_create_image(__DRIscreen *screen,
> __DRIimage *image;
> struct intel_screen *intelScreen = screen->private;
> int cpp;
> + int tiling;
>
> image = CALLOC(sizeof *image);
> if (image == NULL)
> return NULL;
> -
> + tiling = I915_TILING_X;
> switch (format) {
> case __DRI_IMAGE_FORMAT_RGB565:
> image->format = MESA_FORMAT_RGB565;
> @@ -233,6 +234,8 @@ intel_create_image(__DRIscreen *screen,
> image->internal_format = GL_RGB;
> image->data_type = GL_UNSIGNED_BYTE;
> break;
> + case __DRI_IMAGE_FORMAT_HWCURSOR_ARGB:
> + tiling = I915_TILING_NONE;
> case __DRI_IMAGE_FORMAT_ARGB8888:
> image->format = MESA_FORMAT_ARGB8888;
> image->internal_format = GL_RGBA;
> @@ -247,7 +250,7 @@ intel_create_image(__DRIscreen *screen,
> cpp = _mesa_get_format_bytes(image->format);
>
> image->region =
> - intel_region_alloc(intelScreen, I915_TILING_X,
> + intel_region_alloc(intelScreen, tiling,
> cpp, width, height, GL_TRUE);
> if (image->region == NULL) {
> FREE(image);
> --
> 1.7.3.1
> _______________________________________________
> Intel-gfx mailing list
> Intel-gfx at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/intel-gfx
>
More information about the Intel-gfx
mailing list