From b2d428cb8d20e003b65769c7757a137406c671e6 Mon Sep 17 00:00:00 2001 From: Chad Versace Date: Thu, 12 Jul 2012 14:17:22 -0700 Subject: [PATCH] intel: Refactor creation of DRI2 configs DRI2 configs were constructed in intelInitScreen2. That function already does too much, so move verbatim the code for creating configs to a new function, intel_screen_make_configs. Reviewed-by: Eric Anholt Reviewed-by: Paul Berry Signed-off-by: Chad Versace --- src/mesa/drivers/dri/intel/intel_screen.c | 189 ++++++++++++++++-------------- 1 file changed, 98 insertions(+), 91 deletions(-) diff --git a/src/mesa/drivers/dri/intel/intel_screen.c b/src/mesa/drivers/dri/intel/intel_screen.c index a3c0140..491f12a 100644 --- a/src/mesa/drivers/dri/intel/intel_screen.c +++ b/src/mesa/drivers/dri/intel/intel_screen.c @@ -821,6 +821,103 @@ intel_detect_swizzling(struct intel_screen *screen) return true; } +static __DRIconfig** +intel_screen_make_configs(__DRIscreen *dri_screen) +{ + static const GLenum back_buffer_modes[] = { + GLX_NONE, GLX_SWAP_UNDEFINED_OML, GLX_SWAP_COPY_OML + }; + + GLenum fb_format[3]; + GLenum fb_type[3]; + uint8_t depth_bits[4], stencil_bits[4], msaa_samples_array[1]; + int color; + __DRIconfig **configs = NULL; + + msaa_samples_array[0] = 0; + + fb_format[0] = GL_RGB; + fb_type[0] = GL_UNSIGNED_SHORT_5_6_5; + + fb_format[1] = GL_BGR; + fb_type[1] = GL_UNSIGNED_INT_8_8_8_8_REV; + + fb_format[2] = GL_BGRA; + fb_type[2] = GL_UNSIGNED_INT_8_8_8_8_REV; + + depth_bits[0] = 0; + stencil_bits[0] = 0; + + /* Generate a rich set of useful configs that do not include an + * accumulation buffer. + */ + for (color = 0; color < ARRAY_SIZE(fb_format); color++) { + __DRIconfig **new_configs; + int depth_factor; + + /* Starting with DRI2 protocol version 1.1 we can request a depth/stencil + * buffer that has a different number of bits per pixel than the color + * buffer. This isn't yet supported here. + */ + if (fb_type[color] == GL_UNSIGNED_SHORT_5_6_5) { + depth_bits[1] = 16; + stencil_bits[1] = 0; + } else { + depth_bits[1] = 24; + stencil_bits[1] = 8; + } + + depth_factor = 2; + + new_configs = driCreateConfigs(fb_format[color], fb_type[color], + depth_bits, + stencil_bits, + depth_factor, + back_buffer_modes, + ARRAY_SIZE(back_buffer_modes), + msaa_samples_array, + ARRAY_SIZE(msaa_samples_array), + false); + if (configs == NULL) + configs = new_configs; + else + configs = driConcatConfigs(configs, new_configs); + } + + /* Generate the minimum possible set of configs that include an + * accumulation buffer. + */ + for (color = 0; color < ARRAY_SIZE(fb_format); color++) { + __DRIconfig **new_configs; + + if (fb_type[color] == GL_UNSIGNED_SHORT_5_6_5) { + depth_bits[0] = 16; + stencil_bits[0] = 0; + } else { + depth_bits[0] = 24; + stencil_bits[0] = 8; + } + + new_configs = driCreateConfigs(fb_format[color], fb_type[color], + depth_bits, stencil_bits, 1, + back_buffer_modes + 1, 1, + msaa_samples_array, 1, + true); + if (configs == NULL) + configs = new_configs; + else + configs = driConcatConfigs(configs, new_configs); + } + + if (configs == NULL) { + fprintf(stderr, "[%s:%u] Error creating FBConfig!\n", __func__, + __LINE__); + return NULL; + } + + return configs; +} + /** * This is the driver specific part of the createNewScreen entry point. * Called when using DRI2. @@ -831,17 +928,8 @@ static const __DRIconfig **intelInitScreen2(__DRIscreen *psp) { struct intel_screen *intelScreen; - GLenum fb_format[3]; - GLenum fb_type[3]; unsigned int api_mask; - static const GLenum back_buffer_modes[] = { - GLX_NONE, GLX_SWAP_UNDEFINED_OML, GLX_SWAP_COPY_OML - }; - uint8_t depth_bits[4], stencil_bits[4], msaa_samples_array[1]; - int color; - __DRIconfig **configs = NULL; - if (psp->dri2.loader->base.version <= 2 || psp->dri2.loader->getBuffersWithFormat == NULL) { fprintf(stderr, @@ -914,88 +1002,7 @@ __DRIconfig **intelInitScreen2(__DRIscreen *psp) psp->extensions = intelScreenExtensions; - msaa_samples_array[0] = 0; - - fb_format[0] = GL_RGB; - fb_type[0] = GL_UNSIGNED_SHORT_5_6_5; - - fb_format[1] = GL_BGR; - fb_type[1] = GL_UNSIGNED_INT_8_8_8_8_REV; - - fb_format[2] = GL_BGRA; - fb_type[2] = GL_UNSIGNED_INT_8_8_8_8_REV; - - depth_bits[0] = 0; - stencil_bits[0] = 0; - - /* Generate a rich set of useful configs that do not include an - * accumulation buffer. - */ - for (color = 0; color < ARRAY_SIZE(fb_format); color++) { - __DRIconfig **new_configs; - int depth_factor; - - /* Starting with DRI2 protocol version 1.1 we can request a depth/stencil - * buffer that has a diffferent number of bits per pixel than the color - * buffer. This isn't yet supported here. - */ - if (fb_type[color] == GL_UNSIGNED_SHORT_5_6_5) { - depth_bits[1] = 16; - stencil_bits[1] = 0; - } else { - depth_bits[1] = 24; - stencil_bits[1] = 8; - } - - depth_factor = 2; - - new_configs = driCreateConfigs(fb_format[color], fb_type[color], - depth_bits, - stencil_bits, - depth_factor, - back_buffer_modes, - ARRAY_SIZE(back_buffer_modes), - msaa_samples_array, - ARRAY_SIZE(msaa_samples_array), - false); - if (configs == NULL) - configs = new_configs; - else - configs = driConcatConfigs(configs, new_configs); - } - - /* Generate the minimum possible set of configs that include an - * accumulation buffer. - */ - for (color = 0; color < ARRAY_SIZE(fb_format); color++) { - __DRIconfig **new_configs; - - if (fb_type[color] == GL_UNSIGNED_SHORT_5_6_5) { - depth_bits[0] = 16; - stencil_bits[0] = 0; - } else { - depth_bits[0] = 24; - stencil_bits[0] = 8; - } - - new_configs = driCreateConfigs(fb_format[color], fb_type[color], - depth_bits, stencil_bits, 1, - back_buffer_modes + 1, 1, - msaa_samples_array, 1, - true); - if (configs == NULL) - configs = new_configs; - else - configs = driConcatConfigs(configs, new_configs); - } - - if (configs == NULL) { - fprintf(stderr, "[%s:%u] Error creating FBConfig!\n", __func__, - __LINE__); - return NULL; - } - - return (const __DRIconfig **)configs; + return (const __DRIconfig**) intel_screen_make_configs(psp); } struct intel_buffer { -- 2.7.4