| From e92068c2c2bcbfd3683a4ced30c026d0ec080b48 Mon Sep 17 00:00:00 2001 |
| From: Kevin Strasser <kevin.strasser@intel.com> |
| Date: Thu, 24 Jan 2019 16:11:11 -0800 |
| Subject: [PATCH 03/12] UPSTREAM: dri: Add config attributes for color channel |
| shift |
| MIME-Version: 1.0 |
| Content-Type: text/plain; charset=UTF-8 |
| Content-Transfer-Encoding: 8bit |
| |
| The existing mask attributes can only support up to 32 bpp. Introduce |
| per-channel SHIFT attributes that indicate how many bits, from lsb towards |
| msb, the bit field is offset. A shift of -1 will indicate that there is no |
| bit field set for the channel. |
| |
| As old loaders will still be looking for masks, we set the masks to 0 for |
| any formats wider than 32 bpp. |
| |
| Signed-off-by: Kevin Strasser <kevin.strasser@intel.com> |
| Reviewed-by: Adam Jackson <ajax@redhat.com> |
| Reviewed-by: Marek Olลกรกk <marek.olsak@amd.com> |
| Reviewed-by: Emil Velikov <emil.l.velikov@gmail.com> |
| (cherry picked from commit 5a747306ce6dd3021c15cfabc83465ec3fb4bb1c) |
| |
| Change-Id: I3bd603e85a5b47c17c6228d10434871896a35876 |
| --- |
| include/GL/internal/dri_interface.h | 6 ++- |
| src/mesa/drivers/dri/common/utils.c | 68 +++++++++++++++++++++-------- |
| src/mesa/main/context.c | 9 ++-- |
| src/mesa/main/mtypes.h | 1 + |
| 4 files changed, 61 insertions(+), 23 deletions(-) |
| |
| diff --git a/include/GL/internal/dri_interface.h b/include/GL/internal/dri_interface.h |
| index f2e46f65f92..6ffb86e8c7f 100644 |
| --- a/include/GL/internal/dri_interface.h |
| +++ b/include/GL/internal/dri_interface.h |
| @@ -764,7 +764,11 @@ struct __DRIuseInvalidateExtensionRec { |
| #define __DRI_ATTRIB_YINVERTED 47 |
| #define __DRI_ATTRIB_FRAMEBUFFER_SRGB_CAPABLE 48 |
| #define __DRI_ATTRIB_MUTABLE_RENDER_BUFFER 49 /* EGL_MUTABLE_RENDER_BUFFER_BIT_KHR */ |
| -#define __DRI_ATTRIB_MAX 50 |
| +#define __DRI_ATTRIB_RED_SHIFT 50 |
| +#define __DRI_ATTRIB_GREEN_SHIFT 51 |
| +#define __DRI_ATTRIB_BLUE_SHIFT 52 |
| +#define __DRI_ATTRIB_ALPHA_SHIFT 53 |
| +#define __DRI_ATTRIB_MAX 54 |
| |
| /* __DRI_ATTRIB_RENDER_TYPE */ |
| #define __DRI_ATTRIB_RGBA_BIT 0x01 |
| diff --git a/src/mesa/drivers/dri/common/utils.c b/src/mesa/drivers/dri/common/utils.c |
| index 5a66bcf8e05..62780e2b1dc 100644 |
| --- a/src/mesa/drivers/dri/common/utils.c |
| +++ b/src/mesa/drivers/dri/common/utils.c |
| @@ -181,28 +181,41 @@ driCreateConfigs(mesa_format format, |
| GLboolean enable_accum, GLboolean color_depth_match, |
| GLboolean mutable_render_buffer) |
| { |
| - static const uint32_t masks_table[][4] = { |
| + static const struct { |
| + uint32_t masks[4]; |
| + int shifts[4]; |
| + } format_table[] = { |
| /* MESA_FORMAT_B5G6R5_UNORM */ |
| - { 0x0000F800, 0x000007E0, 0x0000001F, 0x00000000 }, |
| + {{ 0x0000F800, 0x000007E0, 0x0000001F, 0x00000000 }, |
| + { 11, 5, 0, -1 }}, |
| /* MESA_FORMAT_B8G8R8X8_UNORM */ |
| - { 0x00FF0000, 0x0000FF00, 0x000000FF, 0x00000000 }, |
| + {{ 0x00FF0000, 0x0000FF00, 0x000000FF, 0x00000000 }, |
| + { 16, 8, 0, -1 }}, |
| /* MESA_FORMAT_B8G8R8A8_UNORM */ |
| - { 0x00FF0000, 0x0000FF00, 0x000000FF, 0xFF000000 }, |
| + {{ 0x00FF0000, 0x0000FF00, 0x000000FF, 0xFF000000 }, |
| + { 16, 8, 0, 24 }}, |
| /* MESA_FORMAT_B10G10R10X2_UNORM */ |
| - { 0x3FF00000, 0x000FFC00, 0x000003FF, 0x00000000 }, |
| + {{ 0x3FF00000, 0x000FFC00, 0x000003FF, 0x00000000 }, |
| + { 20, 10, 0, -1 }}, |
| /* MESA_FORMAT_B10G10R10A2_UNORM */ |
| - { 0x3FF00000, 0x000FFC00, 0x000003FF, 0xC0000000 }, |
| + {{ 0x3FF00000, 0x000FFC00, 0x000003FF, 0xC0000000 }, |
| + { 20, 10, 0, 30 }}, |
| /* MESA_FORMAT_R8G8B8A8_UNORM */ |
| - { 0x000000FF, 0x0000FF00, 0x00FF0000, 0xFF000000 }, |
| + {{ 0x000000FF, 0x0000FF00, 0x00FF0000, 0xFF000000 }, |
| + { 0, 8, 16, 24 }}, |
| /* MESA_FORMAT_R8G8B8X8_UNORM */ |
| - { 0x000000FF, 0x0000FF00, 0x00FF0000, 0x00000000 }, |
| + {{ 0x000000FF, 0x0000FF00, 0x00FF0000, 0x00000000 }, |
| + { 0, 8, 16, -1 }}, |
| /* MESA_FORMAT_R10G10B10X2_UNORM */ |
| - { 0x000003FF, 0x000FFC00, 0x3FF00000, 0x00000000 }, |
| + {{ 0x000003FF, 0x000FFC00, 0x3FF00000, 0x00000000 }, |
| + { 0, 10, 20, -1 }}, |
| /* MESA_FORMAT_R10G10B10A2_UNORM */ |
| - { 0x000003FF, 0x000FFC00, 0x3FF00000, 0xC0000000 }, |
| + {{ 0x000003FF, 0x000FFC00, 0x3FF00000, 0xC0000000 }, |
| + { 0, 10, 20, 30 }}, |
| }; |
| |
| const uint32_t * masks; |
| + const int * shifts; |
| __DRIconfig **configs, **c; |
| struct gl_config *modes; |
| unsigned i, j, k, h; |
| @@ -216,34 +229,43 @@ driCreateConfigs(mesa_format format, |
| |
| switch (format) { |
| case MESA_FORMAT_B5G6R5_UNORM: |
| - masks = masks_table[0]; |
| + masks = format_table[0].masks; |
| + shifts = format_table[0].shifts; |
| break; |
| case MESA_FORMAT_B8G8R8X8_UNORM: |
| case MESA_FORMAT_B8G8R8X8_SRGB: |
| - masks = masks_table[1]; |
| + masks = format_table[1].masks; |
| + shifts = format_table[1].shifts; |
| break; |
| case MESA_FORMAT_B8G8R8A8_UNORM: |
| case MESA_FORMAT_B8G8R8A8_SRGB: |
| - masks = masks_table[2]; |
| + masks = format_table[2].masks; |
| + shifts = format_table[2].shifts; |
| break; |
| case MESA_FORMAT_R8G8B8A8_UNORM: |
| case MESA_FORMAT_R8G8B8A8_SRGB: |
| - masks = masks_table[5]; |
| + masks = format_table[5].masks; |
| + shifts = format_table[5].shifts; |
| break; |
| case MESA_FORMAT_R8G8B8X8_UNORM: |
| - masks = masks_table[6]; |
| + masks = format_table[6].masks; |
| + shifts = format_table[6].shifts; |
| break; |
| case MESA_FORMAT_B10G10R10X2_UNORM: |
| - masks = masks_table[3]; |
| + masks = format_table[3].masks; |
| + shifts = format_table[3].shifts; |
| break; |
| case MESA_FORMAT_B10G10R10A2_UNORM: |
| - masks = masks_table[4]; |
| + masks = format_table[4].masks; |
| + shifts = format_table[4].shifts; |
| break; |
| case MESA_FORMAT_R10G10B10X2_UNORM: |
| - masks = masks_table[7]; |
| + masks = format_table[7].masks; |
| + shifts = format_table[7].shifts; |
| break; |
| case MESA_FORMAT_R10G10B10A2_UNORM: |
| - masks = masks_table[8]; |
| + masks = format_table[8].masks; |
| + shifts = format_table[8].shifts; |
| break; |
| default: |
| fprintf(stderr, "[%s:%u] Unknown framebuffer type %s (%d).\n", |
| @@ -294,6 +316,10 @@ driCreateConfigs(mesa_format format, |
| modes->greenMask = masks[1]; |
| modes->blueMask = masks[2]; |
| modes->alphaMask = masks[3]; |
| + modes->redShift = shifts[0]; |
| + modes->greenShift = shifts[1]; |
| + modes->blueShift = shifts[2]; |
| + modes->alphaShift = shifts[3]; |
| modes->rgbBits = modes->redBits + modes->greenBits |
| + modes->blueBits + modes->alphaBits; |
| |
| @@ -414,9 +440,13 @@ static const struct { unsigned int attrib, offset; } attribMap[] = { |
| __ATTRIB(__DRI_ATTRIB_TRANSPARENT_BLUE_VALUE, transparentBlue), |
| __ATTRIB(__DRI_ATTRIB_TRANSPARENT_ALPHA_VALUE, transparentAlpha), |
| __ATTRIB(__DRI_ATTRIB_RED_MASK, redMask), |
| + __ATTRIB(__DRI_ATTRIB_RED_SHIFT, redShift), |
| __ATTRIB(__DRI_ATTRIB_GREEN_MASK, greenMask), |
| + __ATTRIB(__DRI_ATTRIB_GREEN_SHIFT, greenShift), |
| __ATTRIB(__DRI_ATTRIB_BLUE_MASK, blueMask), |
| + __ATTRIB(__DRI_ATTRIB_BLUE_SHIFT, blueShift), |
| __ATTRIB(__DRI_ATTRIB_ALPHA_MASK, alphaMask), |
| + __ATTRIB(__DRI_ATTRIB_ALPHA_SHIFT, alphaShift), |
| __ATTRIB(__DRI_ATTRIB_MAX_PBUFFER_WIDTH, maxPbufferWidth), |
| __ATTRIB(__DRI_ATTRIB_MAX_PBUFFER_HEIGHT, maxPbufferHeight), |
| __ATTRIB(__DRI_ATTRIB_MAX_PBUFFER_PIXELS, maxPbufferPixels), |
| diff --git a/src/mesa/main/context.c b/src/mesa/main/context.c |
| index 492f01de957..ebd28a16b5f 100644 |
| --- a/src/mesa/main/context.c |
| +++ b/src/mesa/main/context.c |
| @@ -1537,9 +1537,12 @@ check_compatible(const struct gl_context *ctx, |
| ctxvis->foo != bufvis->foo) \ |
| return GL_FALSE |
| |
| - check_component(redMask); |
| - check_component(greenMask); |
| - check_component(blueMask); |
| + check_component(redShift); |
| + check_component(greenShift); |
| + check_component(blueShift); |
| + check_component(redBits); |
| + check_component(greenBits); |
| + check_component(blueBits); |
| check_component(depthBits); |
| check_component(stencilBits); |
| |
| diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h |
| index 794b7b8f73e..764e411a1e6 100644 |
| --- a/src/mesa/main/mtypes.h |
| +++ b/src/mesa/main/mtypes.h |
| @@ -170,6 +170,7 @@ struct gl_config |
| |
| GLint redBits, greenBits, blueBits, alphaBits; /* bits per comp */ |
| GLuint redMask, greenMask, blueMask, alphaMask; |
| + GLint redShift, greenShift, blueShift, alphaShift; |
| GLint rgbBits; /* total bits for rgb */ |
| GLint indexBits; /* total bits for colorindex */ |
| |
| -- |
| 2.21.0 |
| |