Transform the code from clever, obfuscated, and imperative to straight-forward and table-driven.
CC: Ian Romanick <i...@freedesktop.org> Signed-off-by: Chad Versace <chad.vers...@linux.intel.com> --- src/mesa/drivers/dri/intel/intel_screen.c | 167 +++++++++++++++++------------- 1 file changed, 97 insertions(+), 70 deletions(-) diff --git a/src/mesa/drivers/dri/intel/intel_screen.c b/src/mesa/drivers/dri/intel/intel_screen.c index 9bb42dd..61daea7 100644 --- a/src/mesa/drivers/dri/intel/intel_screen.c +++ b/src/mesa/drivers/dri/intel/intel_screen.c @@ -851,85 +851,112 @@ intel_detect_swizzling(struct intel_screen *screen) 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 + struct config_params { + GLenum color_format; + GLenum color_type; + const uint8_t depth_sizes[4]; + const uint8_t stencil_sizes[4]; + unsigned num_depth_stencil_sizes; + unsigned num_back_buffer_modes; + unsigned num_msaa_modes; + bool enable_accum; }; - 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; + static const GLenum back_buffer_modes[] = { + GLX_SWAP_UNDEFINED_OML, GLX_NONE, GLX_SWAP_COPY_OML, + }; - depth_bits[0] = 0; - stencil_bits[0] = 0; + static const uint8_t msaa_samples[] = {0}; - /* Generate a rich set of useful configs that do not include an - * accumulation buffer. + /* 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. */ - 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. + struct config_params params[] = { + /* Configs without accumulation buffer. */ + { + .color_format = GL_RGB, + .color_type = GL_UNSIGNED_SHORT_5_6_5, + .depth_sizes = {0, 16}, + .stencil_sizes = {0, 0}, + .num_depth_stencil_sizes = 2, + .num_back_buffer_modes = 3, + .num_msaa_modes = 1, + .enable_accum = false, + }, + { + .color_format = GL_BGR, + .color_type = GL_UNSIGNED_INT_8_8_8_8_REV, + .depth_sizes = {0, 24}, + .stencil_sizes = {0, 8}, + .num_depth_stencil_sizes = 2, + .num_back_buffer_modes = 3, + .num_msaa_modes = 1, + .enable_accum = false, + }, + { + .color_format = GL_BGRA, + .color_type = GL_UNSIGNED_INT_8_8_8_8_REV, + .depth_sizes = {0, 24}, + .stencil_sizes = {0, 8}, + .num_depth_stencil_sizes = 2, + .num_back_buffer_modes = 3, + .num_msaa_modes = 1, + .enable_accum = false, + }, + + /* Configs with accumulation buffer. + * + * We generate the minimum possible set of configs that include an + * accumulation buffer. */ - 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); - } + { + .color_format = GL_RGB, + .color_type = GL_UNSIGNED_SHORT_5_6_5, + .depth_sizes = {16}, + .stencil_sizes = {0}, + .num_depth_stencil_sizes = 1, + .num_back_buffer_modes = 1, + .num_msaa_modes = 1, + .enable_accum = true, + }, + { + .color_format = GL_BGR, + .color_type = GL_UNSIGNED_INT_8_8_8_8_REV, + .depth_sizes = {24}, + .stencil_sizes = {8}, + .num_depth_stencil_sizes = 1, + .num_back_buffer_modes = 1, + .num_msaa_modes = 1, + .enable_accum = true, + }, + { + .color_format = GL_BGRA, + .color_type = GL_UNSIGNED_INT_8_8_8_8_REV, + .depth_sizes = {24}, + .stencil_sizes = {8}, + .num_depth_stencil_sizes = 1, + .num_back_buffer_modes = 1, + .num_msaa_modes = 1, + .enable_accum = true, + }, + }; - /* Generate the minimum possible set of configs that include an - * accumulation buffer. - */ - for (color = 0; color < ARRAY_SIZE(fb_format); color++) { - __DRIconfig **new_configs; + __DRIconfig **configs = NULL; - 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; - } + for (int i = 0; i < ARRAY_SIZE(params); ++i) { + __DRIconfig **new_configs = + driCreateConfigs(params[i].color_format, + params[i].color_type, + params[i].depth_sizes, + params[i].stencil_sizes, + params[i].num_depth_stencil_sizes, + back_buffer_modes, + params[i].num_back_buffer_modes, + msaa_samples, + params[i].num_msaa_modes, + params[i].enable_accum); - 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 -- 1.7.11.2 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev