X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fmesa%2Fdrivers%2Fdri%2Fcommon%2Futils.c;h=88835a7add55638570c71c3bbe3e96f53282624f;hb=3bbe180b982639554685c997ff51a7cbbf3247e6;hp=9c9483209d8a41a4fba855f925b045e5832936e7;hpb=a15a19f0d1b024f5f18f1dfe878ae8d399e38469;p=mesa.git diff --git a/src/mesa/drivers/dri/common/utils.c b/src/mesa/drivers/dri/common/utils.c index 9c9483209d8..88835a7add5 100644 --- a/src/mesa/drivers/dri/common/utils.c +++ b/src/mesa/drivers/dri/common/utils.c @@ -30,8 +30,10 @@ */ #include +#include #include #include +#include #include "main/macros.h" #include "main/mtypes.h" #include "main/cpuinfo.h" @@ -39,31 +41,6 @@ #include "utils.h" #include "dri_util.h" - -unsigned -driParseDebugString( const char * debug, - const struct dri_debug_control * control ) -{ - unsigned flag; - - - flag = 0; - if ( debug != NULL ) { - while( control->string != NULL ) { - if ( !strcmp( debug, "all" ) || - strstr( debug, control->string ) != NULL ) { - flag |= control->flag; - } - - control++; - } - } - - return flag; -} - - - /** * Create the \c GL_RENDERER string for DRI drivers. * @@ -151,7 +128,7 @@ driGetRendererString( char * buffer, const char * hardware_name, * If the function fails and returns \c GL_FALSE, this * value will be unmodified, but some elements in the * linked list may be modified. - * \param format Mesa gl_format enum describing the pixel format + * \param format Mesa mesa_format enum describing the pixel format * \param depth_bits Array of depth buffer sizes to be exposed. * \param stencil_bits Array of stencil buffer sizes to be exposed. * \param num_depth_stencil_bits Number of entries in both \c depth_bits and @@ -166,9 +143,14 @@ driGetRendererString( char * buffer, const char * hardware_name, * \param msaa_samples Array of msaa sample count. 0 represents a visual * without a multisample buffer. * \param num_msaa_modes Number of entries in \c msaa_samples. - * \param visType GLX visual type. Usually either \c GLX_TRUE_COLOR or - * \c GLX_DIRECT_COLOR. - * + * \param enable_accum Add an accum buffer to the configs + * \param color_depth_match Whether the color depth must match the zs depth + * This forces 32-bit color to have 24-bit depth, and + * 16-bit color to have 16-bit depth. + * \param mutable_render_buffer Enable __DRI_ATTRIB_MUTABLE_RENDER_BUFFER, + * which translates to + * EGL_MUTABLE_RENDER_BUFFER_BIT_KHR. + * * \returns * Pointer to any array of pointers to the \c __DRIconfig structures created * for the specified formats. If there is an error, \c NULL is returned. @@ -176,24 +158,33 @@ driGetRendererString( char * buffer, const char * hardware_name, * \c format). */ __DRIconfig ** -driCreateConfigs(gl_format format, +driCreateConfigs(mesa_format format, const uint8_t * depth_bits, const uint8_t * stencil_bits, unsigned num_depth_stencil_bits, const GLenum * db_modes, unsigned num_db_modes, const uint8_t * msaa_samples, unsigned num_msaa_modes, - GLboolean enable_accum) + GLboolean enable_accum, GLboolean color_depth_match, + GLboolean mutable_render_buffer) { static const uint32_t masks_table[][4] = { - /* MESA_FORMAT_RGB565 */ + /* MESA_FORMAT_B5G6R5_UNORM */ { 0x0000F800, 0x000007E0, 0x0000001F, 0x00000000 }, - /* MESA_FORMAT_XRGB8888 */ + /* MESA_FORMAT_B8G8R8X8_UNORM */ { 0x00FF0000, 0x0000FF00, 0x000000FF, 0x00000000 }, - /* MESA_FORMAT_ARGB8888 */ + /* MESA_FORMAT_B8G8R8A8_UNORM */ { 0x00FF0000, 0x0000FF00, 0x000000FF, 0xFF000000 }, - /* MESA_FORMAT_XRGB2101010_UNORM */ + /* MESA_FORMAT_B10G10R10X2_UNORM */ { 0x3FF00000, 0x000FFC00, 0x000003FF, 0x00000000 }, - /* MESA_FORMAT_ARGB2101010 */ + /* MESA_FORMAT_B10G10R10A2_UNORM */ { 0x3FF00000, 0x000FFC00, 0x000003FF, 0xC0000000 }, + /* MESA_FORMAT_R8G8B8A8_UNORM */ + { 0x000000FF, 0x0000FF00, 0x00FF0000, 0xFF000000 }, + /* MESA_FORMAT_R8G8B8X8_UNORM */ + { 0x000000FF, 0x0000FF00, 0x00FF0000, 0x00000000 }, + /* MESA_FORMAT_R10G10B10X2_UNORM */ + { 0x000003FF, 0x000FFC00, 0x3FF00000, 0x00000000 }, + /* MESA_FORMAT_R10G10B10A2_UNORM */ + { 0x000003FF, 0x000FFC00, 0x3FF00000, 0xC0000000 }, }; const uint32_t * masks; @@ -209,25 +200,39 @@ driCreateConfigs(gl_format format, bool is_srgb; switch (format) { - case MESA_FORMAT_RGB565: + case MESA_FORMAT_B5G6R5_UNORM: masks = masks_table[0]; break; - case MESA_FORMAT_XRGB8888: + case MESA_FORMAT_B8G8R8X8_UNORM: + case MESA_FORMAT_B8G8R8X8_SRGB: masks = masks_table[1]; break; - case MESA_FORMAT_ARGB8888: - case MESA_FORMAT_SARGB8: + case MESA_FORMAT_B8G8R8A8_UNORM: + case MESA_FORMAT_B8G8R8A8_SRGB: masks = masks_table[2]; break; - case MESA_FORMAT_XRGB2101010_UNORM: + case MESA_FORMAT_R8G8B8A8_UNORM: + case MESA_FORMAT_R8G8B8A8_SRGB: + masks = masks_table[5]; + break; + case MESA_FORMAT_R8G8B8X8_UNORM: + masks = masks_table[6]; + break; + case MESA_FORMAT_B10G10R10X2_UNORM: masks = masks_table[3]; break; - case MESA_FORMAT_ARGB2101010: + case MESA_FORMAT_B10G10R10A2_UNORM: masks = masks_table[4]; break; + case MESA_FORMAT_R10G10B10X2_UNORM: + masks = masks_table[7]; + break; + case MESA_FORMAT_R10G10B10A2_UNORM: + masks = masks_table[8]; + break; default: fprintf(stderr, "[%s:%u] Unknown framebuffer type %s (%d).\n", - __FUNCTION__, __LINE__, + __func__, __LINE__, _mesa_get_format_name(format), format); return NULL; } @@ -239,7 +244,7 @@ driCreateConfigs(gl_format format, is_srgb = _mesa_get_format_color_encoding(format) == GL_SRGB; num_modes = num_depth_stencil_bits * num_db_modes * num_accum_bits * num_msaa_modes; - configs = calloc(1, (num_modes + 1) * sizeof *configs); + configs = calloc(num_modes + 1, sizeof *configs); if (configs == NULL) return NULL; @@ -248,6 +253,19 @@ driCreateConfigs(gl_format format, for ( i = 0 ; i < num_db_modes ; i++ ) { for ( h = 0 ; h < num_msaa_modes; h++ ) { for ( j = 0 ; j < num_accum_bits ; j++ ) { + if (color_depth_match && + (depth_bits[k] || stencil_bits[k])) { + /* Depth can really only be 0, 16, 24, or 32. A 32-bit + * color format still matches 24-bit depth, as there + * is an implicit 8-bit stencil. So really we just + * need to make sure that color/depth are both 16 or + * both non-16. + */ + if ((depth_bits[k] + stencil_bits[k] == 16) != + (red_bits + green_bits + blue_bits + alpha_bits == 16)) + continue; + } + *c = malloc (sizeof **c); modes = &(*c)->modes; c++; @@ -281,8 +299,9 @@ driCreateConfigs(gl_format format, modes->transparentIndex = GLX_DONT_CARE; modes->rgbMode = GL_TRUE; - if ( db_modes[i] == GLX_NONE ) { + if (db_modes[i] == __DRI_ATTRIB_SWAP_NONE) { modes->doubleBufferMode = GL_FALSE; + modes->swapMethod = __DRI_ATTRIB_SWAP_UNDEFINED; } else { modes->doubleBufferMode = GL_TRUE; @@ -308,7 +327,9 @@ driCreateConfigs(gl_format format, __DRI_ATTRIB_TEXTURE_2D_BIT | __DRI_ATTRIB_TEXTURE_RECTANGLE_BIT; + modes->yInverted = GL_TRUE; modes->sRGBCapable = is_srgb; + modes->mutableRenderBuffer = mutable_render_buffer; } } } @@ -393,13 +414,13 @@ static const struct { unsigned int attrib, offset; } attribMap[] = { __ATTRIB(__DRI_ATTRIB_BIND_TO_TEXTURE_TARGETS, bindToTextureTargets), __ATTRIB(__DRI_ATTRIB_YINVERTED, yInverted), __ATTRIB(__DRI_ATTRIB_FRAMEBUFFER_SRGB_CAPABLE, sRGBCapable), + __ATTRIB(__DRI_ATTRIB_MUTABLE_RENDER_BUFFER, mutableRenderBuffer), /* The struct field doesn't matter here, these are handled by the * switch in driGetConfigAttribIndex. We need them in the array * so the iterator includes them though.*/ __ATTRIB(__DRI_ATTRIB_RENDER_TYPE, level), __ATTRIB(__DRI_ATTRIB_CONFIG_CAVEAT, level), - __ATTRIB(__DRI_ATTRIB_SWAP_METHOD, level) }; @@ -424,10 +445,6 @@ driGetConfigAttribIndex(const __DRIconfig *config, else *value = 0; break; - case __DRI_ATTRIB_SWAP_METHOD: - /* XXX no return value??? */ - break; - default: /* any other int-sized field */ *value = *(unsigned int *) @@ -450,7 +467,7 @@ int driGetConfigAttrib(const __DRIconfig *config, unsigned int attrib, unsigned int *value) { - int i; + unsigned i; for (i = 0; i < ARRAY_SIZE(attribMap); i++) if (attribMap[i].attrib == attrib) @@ -485,6 +502,7 @@ driIndexConfigAttrib(const __DRIconfig *config, int index, * Currently only the following queries are supported by this function: * * - \c __DRI2_RENDERER_VERSION + * - \c __DRI2_RENDERER_PREFERRED_PROFILE * - \c __DRI2_RENDERER_OPENGL_CORE_PROFILE_VERSION * - \c __DRI2_RENDERER_OPENGL_COMPATIBLITY_PROFILE_VERSION * - \c __DRI2_RENDERER_ES_PROFILE_VERSION @@ -519,6 +537,10 @@ driQueryRendererIntegerCommon(__DRIscreen *psp, int param, unsigned int *value) value[2] = v[2]; return 0; } + case __DRI2_RENDERER_PREFERRED_PROFILE: + value[0] = (psp->max_gl_core_version != 0) + ? (1U << __DRI_API_OPENGL_CORE) : (1U << __DRI_API_OPENGL); + return 0; case __DRI2_RENDERER_OPENGL_CORE_PROFILE_VERSION: value[0] = psp->max_gl_core_version / 10; value[1] = psp->max_gl_core_version % 10;