dri: Add config attributes for color channel shift
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>
This commit is contained in:

committed by
Adam Jackson

parent
9328e7c04c
commit
5a747306ce
@@ -809,7 +809,11 @@ struct __DRIuseInvalidateExtensionRec {
|
|||||||
#define __DRI_ATTRIB_YINVERTED 47
|
#define __DRI_ATTRIB_YINVERTED 47
|
||||||
#define __DRI_ATTRIB_FRAMEBUFFER_SRGB_CAPABLE 48
|
#define __DRI_ATTRIB_FRAMEBUFFER_SRGB_CAPABLE 48
|
||||||
#define __DRI_ATTRIB_MUTABLE_RENDER_BUFFER 49 /* EGL_MUTABLE_RENDER_BUFFER_BIT_KHR */
|
#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 */
|
/* __DRI_ATTRIB_RENDER_TYPE */
|
||||||
#define __DRI_ATTRIB_RGBA_BIT 0x01
|
#define __DRI_ATTRIB_RGBA_BIT 0x01
|
||||||
|
@@ -181,28 +181,41 @@ driCreateConfigs(mesa_format format,
|
|||||||
GLboolean enable_accum, GLboolean color_depth_match,
|
GLboolean enable_accum, GLboolean color_depth_match,
|
||||||
GLboolean mutable_render_buffer)
|
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 */
|
/* MESA_FORMAT_B5G6R5_UNORM */
|
||||||
{ 0x0000F800, 0x000007E0, 0x0000001F, 0x00000000 },
|
{{ 0x0000F800, 0x000007E0, 0x0000001F, 0x00000000 },
|
||||||
|
{ 11, 5, 0, -1 }},
|
||||||
/* MESA_FORMAT_B8G8R8X8_UNORM */
|
/* MESA_FORMAT_B8G8R8X8_UNORM */
|
||||||
{ 0x00FF0000, 0x0000FF00, 0x000000FF, 0x00000000 },
|
{{ 0x00FF0000, 0x0000FF00, 0x000000FF, 0x00000000 },
|
||||||
|
{ 16, 8, 0, -1 }},
|
||||||
/* MESA_FORMAT_B8G8R8A8_UNORM */
|
/* MESA_FORMAT_B8G8R8A8_UNORM */
|
||||||
{ 0x00FF0000, 0x0000FF00, 0x000000FF, 0xFF000000 },
|
{{ 0x00FF0000, 0x0000FF00, 0x000000FF, 0xFF000000 },
|
||||||
|
{ 16, 8, 0, 24 }},
|
||||||
/* MESA_FORMAT_B10G10R10X2_UNORM */
|
/* MESA_FORMAT_B10G10R10X2_UNORM */
|
||||||
{ 0x3FF00000, 0x000FFC00, 0x000003FF, 0x00000000 },
|
{{ 0x3FF00000, 0x000FFC00, 0x000003FF, 0x00000000 },
|
||||||
|
{ 20, 10, 0, -1 }},
|
||||||
/* MESA_FORMAT_B10G10R10A2_UNORM */
|
/* MESA_FORMAT_B10G10R10A2_UNORM */
|
||||||
{ 0x3FF00000, 0x000FFC00, 0x000003FF, 0xC0000000 },
|
{{ 0x3FF00000, 0x000FFC00, 0x000003FF, 0xC0000000 },
|
||||||
|
{ 20, 10, 0, 30 }},
|
||||||
/* MESA_FORMAT_R8G8B8A8_UNORM */
|
/* MESA_FORMAT_R8G8B8A8_UNORM */
|
||||||
{ 0x000000FF, 0x0000FF00, 0x00FF0000, 0xFF000000 },
|
{{ 0x000000FF, 0x0000FF00, 0x00FF0000, 0xFF000000 },
|
||||||
|
{ 0, 8, 16, 24 }},
|
||||||
/* MESA_FORMAT_R8G8B8X8_UNORM */
|
/* MESA_FORMAT_R8G8B8X8_UNORM */
|
||||||
{ 0x000000FF, 0x0000FF00, 0x00FF0000, 0x00000000 },
|
{{ 0x000000FF, 0x0000FF00, 0x00FF0000, 0x00000000 },
|
||||||
|
{ 0, 8, 16, -1 }},
|
||||||
/* MESA_FORMAT_R10G10B10X2_UNORM */
|
/* MESA_FORMAT_R10G10B10X2_UNORM */
|
||||||
{ 0x000003FF, 0x000FFC00, 0x3FF00000, 0x00000000 },
|
{{ 0x000003FF, 0x000FFC00, 0x3FF00000, 0x00000000 },
|
||||||
|
{ 0, 10, 20, -1 }},
|
||||||
/* MESA_FORMAT_R10G10B10A2_UNORM */
|
/* MESA_FORMAT_R10G10B10A2_UNORM */
|
||||||
{ 0x000003FF, 0x000FFC00, 0x3FF00000, 0xC0000000 },
|
{{ 0x000003FF, 0x000FFC00, 0x3FF00000, 0xC0000000 },
|
||||||
|
{ 0, 10, 20, 30 }},
|
||||||
};
|
};
|
||||||
|
|
||||||
const uint32_t * masks;
|
const uint32_t * masks;
|
||||||
|
const int * shifts;
|
||||||
__DRIconfig **configs, **c;
|
__DRIconfig **configs, **c;
|
||||||
struct gl_config *modes;
|
struct gl_config *modes;
|
||||||
unsigned i, j, k, h;
|
unsigned i, j, k, h;
|
||||||
@@ -216,34 +229,43 @@ driCreateConfigs(mesa_format format,
|
|||||||
|
|
||||||
switch (format) {
|
switch (format) {
|
||||||
case MESA_FORMAT_B5G6R5_UNORM:
|
case MESA_FORMAT_B5G6R5_UNORM:
|
||||||
masks = masks_table[0];
|
masks = format_table[0].masks;
|
||||||
|
shifts = format_table[0].shifts;
|
||||||
break;
|
break;
|
||||||
case MESA_FORMAT_B8G8R8X8_UNORM:
|
case MESA_FORMAT_B8G8R8X8_UNORM:
|
||||||
case MESA_FORMAT_B8G8R8X8_SRGB:
|
case MESA_FORMAT_B8G8R8X8_SRGB:
|
||||||
masks = masks_table[1];
|
masks = format_table[1].masks;
|
||||||
|
shifts = format_table[1].shifts;
|
||||||
break;
|
break;
|
||||||
case MESA_FORMAT_B8G8R8A8_UNORM:
|
case MESA_FORMAT_B8G8R8A8_UNORM:
|
||||||
case MESA_FORMAT_B8G8R8A8_SRGB:
|
case MESA_FORMAT_B8G8R8A8_SRGB:
|
||||||
masks = masks_table[2];
|
masks = format_table[2].masks;
|
||||||
|
shifts = format_table[2].shifts;
|
||||||
break;
|
break;
|
||||||
case MESA_FORMAT_R8G8B8A8_UNORM:
|
case MESA_FORMAT_R8G8B8A8_UNORM:
|
||||||
case MESA_FORMAT_R8G8B8A8_SRGB:
|
case MESA_FORMAT_R8G8B8A8_SRGB:
|
||||||
masks = masks_table[5];
|
masks = format_table[5].masks;
|
||||||
|
shifts = format_table[5].shifts;
|
||||||
break;
|
break;
|
||||||
case MESA_FORMAT_R8G8B8X8_UNORM:
|
case MESA_FORMAT_R8G8B8X8_UNORM:
|
||||||
masks = masks_table[6];
|
masks = format_table[6].masks;
|
||||||
|
shifts = format_table[6].shifts;
|
||||||
break;
|
break;
|
||||||
case MESA_FORMAT_B10G10R10X2_UNORM:
|
case MESA_FORMAT_B10G10R10X2_UNORM:
|
||||||
masks = masks_table[3];
|
masks = format_table[3].masks;
|
||||||
|
shifts = format_table[3].shifts;
|
||||||
break;
|
break;
|
||||||
case MESA_FORMAT_B10G10R10A2_UNORM:
|
case MESA_FORMAT_B10G10R10A2_UNORM:
|
||||||
masks = masks_table[4];
|
masks = format_table[4].masks;
|
||||||
|
shifts = format_table[4].shifts;
|
||||||
break;
|
break;
|
||||||
case MESA_FORMAT_R10G10B10X2_UNORM:
|
case MESA_FORMAT_R10G10B10X2_UNORM:
|
||||||
masks = masks_table[7];
|
masks = format_table[7].masks;
|
||||||
|
shifts = format_table[7].shifts;
|
||||||
break;
|
break;
|
||||||
case MESA_FORMAT_R10G10B10A2_UNORM:
|
case MESA_FORMAT_R10G10B10A2_UNORM:
|
||||||
masks = masks_table[8];
|
masks = format_table[8].masks;
|
||||||
|
shifts = format_table[8].shifts;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
fprintf(stderr, "[%s:%u] Unknown framebuffer type %s (%d).\n",
|
fprintf(stderr, "[%s:%u] Unknown framebuffer type %s (%d).\n",
|
||||||
@@ -294,6 +316,10 @@ driCreateConfigs(mesa_format format,
|
|||||||
modes->greenMask = masks[1];
|
modes->greenMask = masks[1];
|
||||||
modes->blueMask = masks[2];
|
modes->blueMask = masks[2];
|
||||||
modes->alphaMask = masks[3];
|
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->rgbBits = modes->redBits + modes->greenBits
|
||||||
+ modes->blueBits + modes->alphaBits;
|
+ 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_BLUE_VALUE, transparentBlue),
|
||||||
__ATTRIB(__DRI_ATTRIB_TRANSPARENT_ALPHA_VALUE, transparentAlpha),
|
__ATTRIB(__DRI_ATTRIB_TRANSPARENT_ALPHA_VALUE, transparentAlpha),
|
||||||
__ATTRIB(__DRI_ATTRIB_RED_MASK, redMask),
|
__ATTRIB(__DRI_ATTRIB_RED_MASK, redMask),
|
||||||
|
__ATTRIB(__DRI_ATTRIB_RED_SHIFT, redShift),
|
||||||
__ATTRIB(__DRI_ATTRIB_GREEN_MASK, greenMask),
|
__ATTRIB(__DRI_ATTRIB_GREEN_MASK, greenMask),
|
||||||
|
__ATTRIB(__DRI_ATTRIB_GREEN_SHIFT, greenShift),
|
||||||
__ATTRIB(__DRI_ATTRIB_BLUE_MASK, blueMask),
|
__ATTRIB(__DRI_ATTRIB_BLUE_MASK, blueMask),
|
||||||
|
__ATTRIB(__DRI_ATTRIB_BLUE_SHIFT, blueShift),
|
||||||
__ATTRIB(__DRI_ATTRIB_ALPHA_MASK, alphaMask),
|
__ATTRIB(__DRI_ATTRIB_ALPHA_MASK, alphaMask),
|
||||||
|
__ATTRIB(__DRI_ATTRIB_ALPHA_SHIFT, alphaShift),
|
||||||
__ATTRIB(__DRI_ATTRIB_MAX_PBUFFER_WIDTH, maxPbufferWidth),
|
__ATTRIB(__DRI_ATTRIB_MAX_PBUFFER_WIDTH, maxPbufferWidth),
|
||||||
__ATTRIB(__DRI_ATTRIB_MAX_PBUFFER_HEIGHT, maxPbufferHeight),
|
__ATTRIB(__DRI_ATTRIB_MAX_PBUFFER_HEIGHT, maxPbufferHeight),
|
||||||
__ATTRIB(__DRI_ATTRIB_MAX_PBUFFER_PIXELS, maxPbufferPixels),
|
__ATTRIB(__DRI_ATTRIB_MAX_PBUFFER_PIXELS, maxPbufferPixels),
|
||||||
|
@@ -1564,9 +1564,12 @@ check_compatible(const struct gl_context *ctx,
|
|||||||
ctxvis->foo != bufvis->foo) \
|
ctxvis->foo != bufvis->foo) \
|
||||||
return GL_FALSE
|
return GL_FALSE
|
||||||
|
|
||||||
check_component(redMask);
|
check_component(redShift);
|
||||||
check_component(greenMask);
|
check_component(greenShift);
|
||||||
check_component(blueMask);
|
check_component(blueShift);
|
||||||
|
check_component(redBits);
|
||||||
|
check_component(greenBits);
|
||||||
|
check_component(blueBits);
|
||||||
check_component(depthBits);
|
check_component(depthBits);
|
||||||
check_component(stencilBits);
|
check_component(stencilBits);
|
||||||
|
|
||||||
|
@@ -170,6 +170,7 @@ struct gl_config
|
|||||||
|
|
||||||
GLint redBits, greenBits, blueBits, alphaBits; /* bits per comp */
|
GLint redBits, greenBits, blueBits, alphaBits; /* bits per comp */
|
||||||
GLuint redMask, greenMask, blueMask, alphaMask;
|
GLuint redMask, greenMask, blueMask, alphaMask;
|
||||||
|
GLint redShift, greenShift, blueShift, alphaShift;
|
||||||
GLint rgbBits; /* total bits for rgb */
|
GLint rgbBits; /* total bits for rgb */
|
||||||
GLint indexBits; /* total bits for colorindex */
|
GLint indexBits; /* total bits for colorindex */
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user