[Mesa-dev] [PATCH] gbm: track buffer format through DRI drivers
Kristian Hoegsberg
hoegsberg at gmail.com
Wed Feb 22 09:42:59 PST 2012
On Tue, Feb 21, 2012 at 12:56:11PM -0800, Jesse Barnes wrote:
> GBM needs the buffer format in order to communicate with DRM and clients
> for things like scanout.
>
> So track the DRI format requested in the various back ends and use it to
> return the DRI format back to GBM when requested. GBM will then map
> this into the GBM surface type (which is in turn based on the DRM fb
> format list).
Yes, that looks good now. Just one thing left that I can see: we need
to bump the versions of the __DRI_IMAGE extension in the drivers so
that they advertise 3 if they support the format attribute.
Kristian
> Signed-off-by: Jesse Barnes <jbarnes at virtuousgeek.org>
> ---
> include/GL/internal/dri_interface.h | 3 +-
> src/gallium/state_trackers/dri/drm/dri2.c | 6 +
> src/gallium/winsys/sw/wayland/wayland_sw_winsys.h | 1 +
> src/gbm/backends/dri/gbm_dri.c | 45 ++++++++-
> src/gbm/main/gbm.c | 13 +++
> src/gbm/main/gbm.h | 110 ++++++++++++++++++++-
> src/gbm/main/gbmint.h | 1 +
> src/mesa/drivers/dri/intel/intel_regions.h | 1 +
> src/mesa/drivers/dri/intel/intel_screen.c | 4 +
> src/mesa/drivers/dri/radeon/radeon_screen.c | 2 +
> src/mesa/drivers/dri/radeon/radeon_screen.h | 1 +
> 11 files changed, 181 insertions(+), 6 deletions(-)
>
> diff --git a/include/GL/internal/dri_interface.h b/include/GL/internal/dri_interface.h
> index 701e83e..da83666 100644
> --- a/include/GL/internal/dri_interface.h
> +++ b/include/GL/internal/dri_interface.h
> @@ -894,7 +894,7 @@ struct __DRIdri2ExtensionRec {
> * extensions.
> */
> #define __DRI_IMAGE "DRI_IMAGE"
> -#define __DRI_IMAGE_VERSION 2
> +#define __DRI_IMAGE_VERSION 3
>
> /**
> * These formats correspond to the similarly named MESA_FORMAT_*
> @@ -918,6 +918,7 @@ struct __DRIdri2ExtensionRec {
> #define __DRI_IMAGE_ATTRIB_STRIDE 0x2000
> #define __DRI_IMAGE_ATTRIB_HANDLE 0x2001
> #define __DRI_IMAGE_ATTRIB_NAME 0x2002
> +#define __DRI_IMAGE_ATTRIB_FORMAT 0x2003 /* available in versions 3+ */
>
> typedef struct __DRIimageRec __DRIimage;
> typedef struct __DRIimageExtensionRec __DRIimageExtension;
> diff --git a/src/gallium/state_trackers/dri/drm/dri2.c b/src/gallium/state_trackers/dri/drm/dri2.c
> index 4c08a02..32cb077 100644
> --- a/src/gallium/state_trackers/dri/drm/dri2.c
> +++ b/src/gallium/state_trackers/dri/drm/dri2.c
> @@ -477,6 +477,7 @@ dri2_create_image_from_name(__DRIscreen *_screen,
> memset(&whandle, 0, sizeof(whandle));
> whandle.handle = name;
> whandle.stride = pitch * util_format_get_blocksize(pf);
> + whandle.dri_format = format;
>
> img->texture = screen->base.screen->resource_from_handle(screen->base.screen,
> &templ, &whandle);
> @@ -527,6 +528,8 @@ dri2_create_image(__DRIscreen *_screen,
> tex_usage |= PIPE_BIND_CURSOR;
> }
>
> + img->dri_format = format;
> +
> switch (format) {
> case __DRI_IMAGE_FORMAT_RGB565:
> pf = PIPE_FORMAT_B5G6R5_UNORM;
> @@ -598,6 +601,9 @@ dri2_query_image(__DRIimage *image, int attrib, int *value)
> image->texture, &whandle);
> *value = whandle.handle;
> return GL_TRUE;
> + case __DRI_IMAGE_ATTRIB_FORMAT:
> + *value = image->dri_format;
> + return GL_TRUE;
> default:
> return GL_FALSE;
> }
> diff --git a/src/gallium/winsys/sw/wayland/wayland_sw_winsys.h b/src/gallium/winsys/sw/wayland/wayland_sw_winsys.h
> index bedd240..8e6f329 100644
> --- a/src/gallium/winsys/sw/wayland/wayland_sw_winsys.h
> +++ b/src/gallium/winsys/sw/wayland/wayland_sw_winsys.h
> @@ -32,6 +32,7 @@ struct wl_display;
> struct winsys_handle {
> int fd;
> unsigned stride;
> + uint32_t dri_format;
> };
>
> struct sw_winsys *
> diff --git a/src/gbm/backends/dri/gbm_dri.c b/src/gbm/backends/dri/gbm_dri.c
> index ddd153a..34f07de 100644
> --- a/src/gbm/backends/dri/gbm_dri.c
> +++ b/src/gbm/backends/dri/gbm_dri.c
> @@ -216,13 +216,15 @@ free_screen:
>
> static int
> gbm_dri_is_format_supported(struct gbm_device *gbm,
> - enum gbm_bo_format format,
> + uint32_t format,
> uint32_t usage)
> {
> switch (format) {
> case GBM_BO_FORMAT_XRGB8888:
> + case GBM_FORMAT_XRGB8888:
> break;
> case GBM_BO_FORMAT_ARGB8888:
> + case GBM_FORMAT_ARGB8888:
> if (usage & GBM_BO_USE_SCANOUT)
> return 0;
> break;
> @@ -247,6 +249,32 @@ gbm_dri_bo_destroy(struct gbm_bo *_bo)
> free(bo);
> }
>
> +static uint32_t
> +gbm_dri_to_gbm_format(uint32_t dri_format)
> +{
> + uint32_t ret = 0;
> +
> + switch (dri_format) {
> + case __DRI_IMAGE_FORMAT_RGB565:
> + ret = GBM_FORMAT_RGB565;
> + break;
> + case __DRI_IMAGE_FORMAT_XRGB8888:
> + ret = GBM_FORMAT_XRGB8888;
> + break;
> + case __DRI_IMAGE_FORMAT_ARGB8888:
> + ret = GBM_FORMAT_ARGB8888;
> + break;
> + case __DRI_IMAGE_FORMAT_ABGR8888:
> + ret = GBM_FORMAT_ABGR8888;
> + break;
> + default:
> + ret = 0;
> + break;
> + }
> +
> + return ret;
> +}
> +
> static struct gbm_bo *
> gbm_dri_bo_create_from_egl_image(struct gbm_device *gbm,
> void *egl_dpy, void *egl_img,
> @@ -255,6 +283,7 @@ gbm_dri_bo_create_from_egl_image(struct gbm_device *gbm,
> {
> struct gbm_dri_device *dri = gbm_dri_device(gbm);
> struct gbm_dri_bo *bo;
> + int dri_format;
> unsigned dri_use = 0;
>
> (void) egl_dpy;
> @@ -291,6 +320,10 @@ gbm_dri_bo_create_from_egl_image(struct gbm_device *gbm,
> &bo->base.base.handle.s32);
> dri->image->queryImage(bo->image, __DRI_IMAGE_ATTRIB_STRIDE,
> (int *) &bo->base.base.pitch);
> + dri->image->queryImage(bo->image, __DRI_IMAGE_ATTRIB_FORMAT,
> + &dri_format);
> +
> + bo->base.base.format = gbm_dri_to_gbm_format(dri_format);
>
> return &bo->base.base;
> }
> @@ -298,7 +331,7 @@ gbm_dri_bo_create_from_egl_image(struct gbm_device *gbm,
> static struct gbm_bo *
> gbm_dri_bo_create(struct gbm_device *gbm,
> uint32_t width, uint32_t height,
> - enum gbm_bo_format format, uint32_t usage)
> + uint32_t format, uint32_t usage)
> {
> struct gbm_dri_device *dri = gbm_dri_device(gbm);
> struct gbm_dri_bo *bo;
> @@ -314,12 +347,20 @@ gbm_dri_bo_create(struct gbm_device *gbm,
> bo->base.base.height = height;
>
> switch (format) {
> + case GBM_FORMAT_RGB565:
> + dri_format =__DRI_IMAGE_FORMAT_RGB565;
> + break;
> + case GBM_FORMAT_XRGB8888:
> case GBM_BO_FORMAT_XRGB8888:
> dri_format = __DRI_IMAGE_FORMAT_XRGB8888;
> break;
> + case GBM_FORMAT_ARGB8888:
> case GBM_BO_FORMAT_ARGB8888:
> dri_format = __DRI_IMAGE_FORMAT_ARGB8888;
> break;
> + case GBM_FORMAT_ABGR8888:
> + dri_format = __DRI_IMAGE_FORMAT_ABGR8888;
> + break;
> default:
> return NULL;
> }
> diff --git a/src/gbm/main/gbm.c b/src/gbm/main/gbm.c
> index 03fc52b..9459720 100644
> --- a/src/gbm/main/gbm.c
> +++ b/src/gbm/main/gbm.c
> @@ -205,6 +205,19 @@ gbm_bo_get_pitch(struct gbm_bo *bo)
> return bo->pitch;
> }
>
> +/** Get the format of the buffer object
> + *
> + * The format of the pixels in the buffer.
> + *
> + * \param bo The buffer object
> + * \return The format of buffer object, on of the GBM_FORMAT_* codes
> + */
> +GBM_EXPORT uint32_t
> +gbm_bo_get_format(struct gbm_bo *bo)
> +{
> + return bo->format;
> +}
> +
> /** Get the handle of the buffer object
> *
> * This is stored in the platform generic union gbm_bo_handle type. However
> diff --git a/src/gbm/main/gbm.h b/src/gbm/main/gbm.h
> index c4ae51d..ecebf11 100644
> --- a/src/gbm/main/gbm.h
> +++ b/src/gbm/main/gbm.h
> @@ -75,6 +75,108 @@ enum gbm_bo_format {
> GBM_BO_FORMAT_ARGB8888
> };
>
> +#define __gbm_fourcc_code(a,b,c,d) ((uint32_t)(a) | ((uint32_t)(b) << 8) | \
> + ((uint32_t)(c) << 16) | ((uint32_t)(d) << 24))
> +
> +#define GBM_FORMAT_BIG_ENDIAN (1<<31) /* format is big endian instead of little endian */
> +
> +/* color index */
> +#define GBM_FORMAT_C8 __gbm_fourcc_code('C', '8', ' ', ' ') /* [7:0] C */
> +
> +/* 8 bpp RGB */
> +#define GBM_FORMAT_RGB332 __gbm_fourcc_code('R', 'G', 'B', '8') /* [7:0] R:G:B 3:3:2 */
> +#define GBM_FORMAT_BGR233 __gbm_fourcc_code('B', 'G', 'R', '8') /* [7:0] B:G:R 2:3:3 */
> +
> +/* 16 bpp RGB */
> +#define GBM_FORMAT_XRGB4444 __gbm_fourcc_code('X', 'R', '1', '2') /* [15:0] x:R:G:B 4:4:4:4 little endian */
> +#define GBM_FORMAT_XBGR4444 __gbm_fourcc_code('X', 'B', '1', '2') /* [15:0] x:B:G:R 4:4:4:4 little endian */
> +#define GBM_FORMAT_RGBX4444 __gbm_fourcc_code('R', 'X', '1', '2') /* [15:0] R:G:B:x 4:4:4:4 little endian */
> +#define GBM_FORMAT_BGRX4444 __gbm_fourcc_code('B', 'X', '1', '2') /* [15:0] B:G:R:x 4:4:4:4 little endian */
> +
> +#define GBM_FORMAT_ARGB4444 __gbm_fourcc_code('A', 'R', '1', '2') /* [15:0] A:R:G:B 4:4:4:4 little endian */
> +#define GBM_FORMAT_ABGR4444 __gbm_fourcc_code('A', 'B', '1', '2') /* [15:0] A:B:G:R 4:4:4:4 little endian */
> +#define GBM_FORMAT_RGBA4444 __gbm_fourcc_code('R', 'A', '1', '2') /* [15:0] R:G:B:A 4:4:4:4 little endian */
> +#define GBM_FORMAT_BGRA4444 __gbm_fourcc_code('B', 'A', '1', '2') /* [15:0] B:G:R:A 4:4:4:4 little endian */
> +
> +#define GBM_FORMAT_XRGB1555 __gbm_fourcc_code('X', 'R', '1', '5') /* [15:0] x:R:G:B 1:5:5:5 little endian */
> +#define GBM_FORMAT_XBGR1555 __gbm_fourcc_code('X', 'B', '1', '5') /* [15:0] x:B:G:R 1:5:5:5 little endian */
> +#define GBM_FORMAT_RGBX5551 __gbm_fourcc_code('R', 'X', '1', '5') /* [15:0] R:G:B:x 5:5:5:1 little endian */
> +#define GBM_FORMAT_BGRX5551 __gbm_fourcc_code('B', 'X', '1', '5') /* [15:0] B:G:R:x 5:5:5:1 little endian */
> +
> +#define GBM_FORMAT_ARGB1555 __gbm_fourcc_code('A', 'R', '1', '5') /* [15:0] A:R:G:B 1:5:5:5 little endian */
> +#define GBM_FORMAT_ABGR1555 __gbm_fourcc_code('A', 'B', '1', '5') /* [15:0] A:B:G:R 1:5:5:5 little endian */
> +#define GBM_FORMAT_RGBA5551 __gbm_fourcc_code('R', 'A', '1', '5') /* [15:0] R:G:B:A 5:5:5:1 little endian */
> +#define GBM_FORMAT_BGRA5551 __gbm_fourcc_code('B', 'A', '1', '5') /* [15:0] B:G:R:A 5:5:5:1 little endian */
> +
> +#define GBM_FORMAT_RGB565 __gbm_fourcc_code('R', 'G', '1', '6') /* [15:0] R:G:B 5:6:5 little endian */
> +#define GBM_FORMAT_BGR565 __gbm_fourcc_code('B', 'G', '1', '6') /* [15:0] B:G:R 5:6:5 little endian */
> +
> +/* 24 bpp RGB */
> +#define GBM_FORMAT_RGB888 __gbm_fourcc_code('R', 'G', '2', '4') /* [23:0] R:G:B little endian */
> +#define GBM_FORMAT_BGR888 __gbm_fourcc_code('B', 'G', '2', '4') /* [23:0] B:G:R little endian */
> +
> +/* 32 bpp RGB */
> +#define GBM_FORMAT_XRGB8888 __gbm_fourcc_code('X', 'R', '2', '4') /* [31:0] x:R:G:B 8:8:8:8 little endian */
> +#define GBM_FORMAT_XBGR8888 __gbm_fourcc_code('X', 'B', '2', '4') /* [31:0] x:B:G:R 8:8:8:8 little endian */
> +#define GBM_FORMAT_RGBX8888 __gbm_fourcc_code('R', 'X', '2', '4') /* [31:0] R:G:B:x 8:8:8:8 little endian */
> +#define GBM_FORMAT_BGRX8888 __gbm_fourcc_code('B', 'X', '2', '4') /* [31:0] B:G:R:x 8:8:8:8 little endian */
> +
> +#define GBM_FORMAT_ARGB8888 __gbm_fourcc_code('A', 'R', '2', '4') /* [31:0] A:R:G:B 8:8:8:8 little endian */
> +#define GBM_FORMAT_ABGR8888 __gbm_fourcc_code('A', 'B', '2', '4') /* [31:0] A:B:G:R 8:8:8:8 little endian */
> +#define GBM_FORMAT_RGBA8888 __gbm_fourcc_code('R', 'A', '2', '4') /* [31:0] R:G:B:A 8:8:8:8 little endian */
> +#define GBM_FORMAT_BGRA8888 __gbm_fourcc_code('B', 'A', '2', '4') /* [31:0] B:G:R:A 8:8:8:8 little endian */
> +
> +#define GBM_FORMAT_XRGB2101010 __gbm_fourcc_code('X', 'R', '3', '0') /* [31:0] x:R:G:B 2:10:10:10 little endian */
> +#define GBM_FORMAT_XBGR2101010 __gbm_fourcc_code('X', 'B', '3', '0') /* [31:0] x:B:G:R 2:10:10:10 little endian */
> +#define GBM_FORMAT_RGBX1010102 __gbm_fourcc_code('R', 'X', '3', '0') /* [31:0] R:G:B:x 10:10:10:2 little endian */
> +#define GBM_FORMAT_BGRX1010102 __gbm_fourcc_code('B', 'X', '3', '0') /* [31:0] B:G:R:x 10:10:10:2 little endian */
> +
> +#define GBM_FORMAT_ARGB2101010 __gbm_fourcc_code('A', 'R', '3', '0') /* [31:0] A:R:G:B 2:10:10:10 little endian */
> +#define GBM_FORMAT_ABGR2101010 __gbm_fourcc_code('A', 'B', '3', '0') /* [31:0] A:B:G:R 2:10:10:10 little endian */
> +#define GBM_FORMAT_RGBA1010102 __gbm_fourcc_code('R', 'A', '3', '0') /* [31:0] R:G:B:A 10:10:10:2 little endian */
> +#define GBM_FORMAT_BGRA1010102 __gbm_fourcc_code('B', 'A', '3', '0') /* [31:0] B:G:R:A 10:10:10:2 little endian */
> +
> +/* packed YCbCr */
> +#define GBM_FORMAT_YUYV __gbm_fourcc_code('Y', 'U', 'Y', 'V') /* [31:0] Cr0:Y1:Cb0:Y0 8:8:8:8 little endian */
> +#define GBM_FORMAT_YVYU __gbm_fourcc_code('Y', 'V', 'Y', 'U') /* [31:0] Cb0:Y1:Cr0:Y0 8:8:8:8 little endian */
> +#define GBM_FORMAT_UYVY __gbm_fourcc_code('U', 'Y', 'V', 'Y') /* [31:0] Y1:Cr0:Y0:Cb0 8:8:8:8 little endian */
> +#define GBM_FORMAT_VYUY __gbm_fourcc_code('V', 'Y', 'U', 'Y') /* [31:0] Y1:Cb0:Y0:Cr0 8:8:8:8 little endian */
> +
> +#define GBM_FORMAT_AYUV __gbm_fourcc_code('A', 'Y', 'U', 'V') /* [31:0] A:Y:Cb:Cr 8:8:8:8 little endian */
> +
> +/*
> + * 2 plane YCbCr
> + * index 0 = Y plane, [7:0] Y
> + * index 1 = Cr:Cb plane, [15:0] Cr:Cb little endian
> + * or
> + * index 1 = Cb:Cr plane, [15:0] Cb:Cr little endian
> + */
> +#define GBM_FORMAT_NV12 __gbm_fourcc_code('N', 'V', '1', '2') /* 2x2 subsampled Cr:Cb plane */
> +#define GBM_FORMAT_NV21 __gbm_fourcc_code('N', 'V', '2', '1') /* 2x2 subsampled Cb:Cr plane */
> +#define GBM_FORMAT_NV16 __gbm_fourcc_code('N', 'V', '1', '6') /* 2x1 subsampled Cr:Cb plane */
> +#define GBM_FORMAT_NV61 __gbm_fourcc_code('N', 'V', '6', '1') /* 2x1 subsampled Cb:Cr plane */
> +
> +/*
> + * 3 plane YCbCr
> + * index 0: Y plane, [7:0] Y
> + * index 1: Cb plane, [7:0] Cb
> + * index 2: Cr plane, [7:0] Cr
> + * or
> + * index 1: Cr plane, [7:0] Cr
> + * index 2: Cb plane, [7:0] Cb
> + */
> +#define GBM_FORMAT_YUV410 __gbm_fourcc_code('Y', 'U', 'V', '9') /* 4x4 subsampled Cb (1) and Cr (2) planes */
> +#define GBM_FORMAT_YVU410 __gbm_fourcc_code('Y', 'V', 'U', '9') /* 4x4 subsampled Cr (1) and Cb (2) planes */
> +#define GBM_FORMAT_YUV411 __gbm_fourcc_code('Y', 'U', '1', '1') /* 4x1 subsampled Cb (1) and Cr (2) planes */
> +#define GBM_FORMAT_YVU411 __gbm_fourcc_code('Y', 'V', '1', '1') /* 4x1 subsampled Cr (1) and Cb (2) planes */
> +#define GBM_FORMAT_YUV420 __gbm_fourcc_code('Y', 'U', '1', '2') /* 2x2 subsampled Cb (1) and Cr (2) planes */
> +#define GBM_FORMAT_YVU420 __gbm_fourcc_code('Y', 'V', '1', '2') /* 2x2 subsampled Cr (1) and Cb (2) planes */
> +#define GBM_FORMAT_YUV422 __gbm_fourcc_code('Y', 'U', '1', '6') /* 2x1 subsampled Cb (1) and Cr (2) planes */
> +#define GBM_FORMAT_YVU422 __gbm_fourcc_code('Y', 'V', '1', '6') /* 2x1 subsampled Cr (1) and Cb (2) planes */
> +#define GBM_FORMAT_YUV444 __gbm_fourcc_code('Y', 'U', '2', '4') /* non-subsampled Cb (1) and Cr (2) planes */
> +#define GBM_FORMAT_YVU444 __gbm_fourcc_code('Y', 'V', '2', '4') /* non-subsampled Cr (1) and Cb (2) planes */
> +
> +
> /**
> * Flags to indicate the intended use for the buffer - these are passed into
> * gbm_bo_create(). The caller must set the union of all the flags that are
> @@ -108,8 +210,7 @@ gbm_device_get_backend_name(struct gbm_device *gbm);
>
> int
> gbm_device_is_format_supported(struct gbm_device *gbm,
> - enum gbm_bo_format format,
> - uint32_t usage);
> + uint32_t format, uint32_t usage);
>
> void
> gbm_device_destroy(struct gbm_device *gbm);
> @@ -120,7 +221,7 @@ gbm_create_device(int fd);
> struct gbm_bo *
> gbm_bo_create(struct gbm_device *gbm,
> uint32_t width, uint32_t height,
> - enum gbm_bo_format format, uint32_t flags);
> + uint32_t format, uint32_t flags);
>
> struct gbm_bo *
> gbm_bo_create_from_egl_image(struct gbm_device *gbm,
> @@ -137,6 +238,9 @@ gbm_bo_get_height(struct gbm_bo *bo);
> uint32_t
> gbm_bo_get_pitch(struct gbm_bo *bo);
>
> +uint32_t
> +gbm_bo_get_format(struct gbm_bo *bo);
> +
> union gbm_bo_handle
> gbm_bo_get_handle(struct gbm_bo *bo);
>
> diff --git a/src/gbm/main/gbmint.h b/src/gbm/main/gbmint.h
> index 9e4072e..66c4c41 100644
> --- a/src/gbm/main/gbmint.h
> +++ b/src/gbm/main/gbmint.h
> @@ -83,6 +83,7 @@ struct gbm_bo {
> uint32_t width;
> uint32_t height;
> uint32_t pitch;
> + uint32_t format;
> union gbm_bo_handle handle;
> };
>
> diff --git a/src/mesa/drivers/dri/intel/intel_regions.h b/src/mesa/drivers/dri/intel/intel_regions.h
> index 8c7e138..4ea970a 100644
> --- a/src/mesa/drivers/dri/intel/intel_regions.h
> +++ b/src/mesa/drivers/dri/intel/intel_regions.h
> @@ -132,6 +132,7 @@ void _mesa_copy_rect(GLubyte * dst,
> struct __DRIimageRec {
> struct intel_region *region;
> GLenum internal_format;
> + uint32_t dri_format;
> GLuint format;
> GLenum data_type;
> void *data;
> diff --git a/src/mesa/drivers/dri/intel/intel_screen.c b/src/mesa/drivers/dri/intel/intel_screen.c
> index 60781e5..ee2df33 100644
> --- a/src/mesa/drivers/dri/intel/intel_screen.c
> +++ b/src/mesa/drivers/dri/intel/intel_screen.c
> @@ -245,6 +245,8 @@ intel_create_image(__DRIscreen *screen,
> if (image == NULL)
> return NULL;
>
> + image->dri_format = format;
> +
> switch (format) {
> case __DRI_IMAGE_FORMAT_RGB565:
> image->format = MESA_FORMAT_RGB565;
> @@ -297,6 +299,8 @@ intel_query_image(__DRIimage *image, int attrib, int *value)
> return true;
> case __DRI_IMAGE_ATTRIB_NAME:
> return intel_region_flink(image->region, (uint32_t *) value);
> + case __DRI_IMAGE_ATTRIB_FORMAT:
> + return image->dri_format;
> default:
> return false;
> }
> diff --git a/src/mesa/drivers/dri/radeon/radeon_screen.c b/src/mesa/drivers/dri/radeon/radeon_screen.c
> index 1f60f2a..85cfe17 100644
> --- a/src/mesa/drivers/dri/radeon/radeon_screen.c
> +++ b/src/mesa/drivers/dri/radeon/radeon_screen.c
> @@ -314,6 +314,8 @@ radeon_create_image(__DRIscreen *screen,
> if (image == NULL)
> return NULL;
>
> + image->dri_format = format;
> +
> switch (format) {
> case __DRI_IMAGE_FORMAT_RGB565:
> image->format = MESA_FORMAT_RGB565;
> diff --git a/src/mesa/drivers/dri/radeon/radeon_screen.h b/src/mesa/drivers/dri/radeon/radeon_screen.h
> index 1f0f383..dd618f5 100644
> --- a/src/mesa/drivers/dri/radeon/radeon_screen.h
> +++ b/src/mesa/drivers/dri/radeon/radeon_screen.h
> @@ -109,6 +109,7 @@ typedef struct radeon_screen {
> struct __DRIimageRec {
> struct radeon_bo *bo;
> GLenum internal_format;
> + uint32_t dri_format;
> GLuint format;
> GLenum data_type;
> int width, height; /* in pixels */
> --
> 1.7.5.4
>
More information about the mesa-dev
mailing list