On Sun, Aug 3, 2014 at 12:28 PM, Marek Olšák <mar...@gmail.com> wrote: > On Sun, Aug 3, 2014 at 6:06 PM, Ilia Mirkin <imir...@alum.mit.edu> wrote: >> On Sun, Aug 3, 2014 at 11:18 AM, Marek Olšák <mar...@gmail.com> wrote: >>> From: Marek Olšák <marek.ol...@amd.com> >>> >>> Setting Const.MaxSamples needed a rework, so that it doesn't call >>> st_choose_format, which depends on st_context. >>> >>> Other than that, there is no change in functionality. >>> --- >>> src/mesa/state_tracker/st_context.c | 26 ++- >>> src/mesa/state_tracker/st_extensions.c | 400 >>> +++++++++++++++++---------------- >>> src/mesa/state_tracker/st_extensions.h | 8 +- >>> 3 files changed, 242 insertions(+), 192 deletions(-) >>> >>> diff --git a/src/mesa/state_tracker/st_context.c >>> b/src/mesa/state_tracker/st_context.c >>> index ccd19f3..5f83e52 100644 >>> --- a/src/mesa/state_tracker/st_context.c >>> +++ b/src/mesa/state_tracker/st_context.c >>> @@ -201,10 +201,34 @@ st_create_context_priv( struct gl_context *ctx, >>> struct pipe_context *pipe, >>> !!(screen->get_param(screen, PIPE_CAP_TEXTURE_BORDER_COLOR_QUIRK) & >>> (PIPE_QUIRK_TEXTURE_BORDER_COLOR_SWIZZLE_NV50 | >>> PIPE_QUIRK_TEXTURE_BORDER_COLOR_SWIZZLE_R600)); >>> + st->has_time_elapsed = >>> + screen->get_param(screen, PIPE_CAP_QUERY_TIME_ELAPSED); >>> >>> /* GL limits and extensions */ >>> st_init_limits(st); >>> - st_init_extensions(st); >>> + st_init_extensions(st->pipe->screen, ctx->API, &ctx->Const, >>> + &ctx->Extensions, &st->options, ctx->Mesa_DXTn); >>> + >>> + /* Enable shader-based fallbacks for ARB_color_buffer_float if needed. >>> */ >>> + if (screen->get_param(screen, PIPE_CAP_VERTEX_COLOR_UNCLAMPED)) { >>> + if (!screen->get_param(screen, PIPE_CAP_VERTEX_COLOR_CLAMPED)) { >>> + st->clamp_vert_color_in_shader = TRUE; >>> + } >>> + >>> + if (!screen->get_param(screen, PIPE_CAP_FRAGMENT_COLOR_CLAMPED)) { >>> + st->clamp_frag_color_in_shader = TRUE; >>> + } >>> + >>> + /* For drivers which cannot do color clamping, it's better to just >>> + * disable ARB_color_buffer_float in the core profile, because >>> + * the clamping is deprecated there anyway. */ >>> + if (ctx->API == API_OPENGL_CORE && >>> + (st->clamp_frag_color_in_shader || >>> st->clamp_vert_color_in_shader)) { >>> + st->clamp_vert_color_in_shader = GL_FALSE; >>> + st->clamp_frag_color_in_shader = GL_FALSE; >> >> I know it was like that in the original code, but you should either >> use TRUE/FALSE or GL_TRUE/GL_FALSE in both places... the fields are >> declared as GLbooleans ftr. > > Okay, consider it fixed. > >> >>> + ctx->Extensions.ARB_color_buffer_float = GL_FALSE; >>> + } >>> + } >>> >>> _mesa_compute_version(ctx); >>> >>> diff --git a/src/mesa/state_tracker/st_extensions.c >>> b/src/mesa/state_tracker/st_extensions.c >>> index f04ff4c..6901b51 100644 >>> --- a/src/mesa/state_tracker/st_extensions.c >>> +++ b/src/mesa/state_tracker/st_extensions.c >>> @@ -340,14 +340,15 @@ struct st_extension_format_mapping { >>> * >>> * target and bind_flags are passed to is_format_supported. >>> */ >>> -static void init_format_extensions(struct st_context *st, >>> - const struct st_extension_format_mapping >>> *mapping, >>> - unsigned num_mappings, >>> - enum pipe_texture_target target, >>> - unsigned bind_flags) >>> +static void >>> +init_format_extensions(struct pipe_screen *screen, >>> + struct gl_extensions *extensions, >>> + const struct st_extension_format_mapping *mapping, >>> + unsigned num_mappings, >>> + enum pipe_texture_target target, >>> + unsigned bind_flags) >>> { >>> - struct pipe_screen *screen = st->pipe->screen; >>> - GLboolean *extensions = (GLboolean *) &st->ctx->Extensions; >>> + GLboolean *extension_table = (GLboolean *) extensions; >>> unsigned i; >>> int j; >>> int num_formats = Elements(mapping->format); >>> @@ -371,10 +372,36 @@ static void init_format_extensions(struct st_context >>> *st, >>> >>> /* Enable all extensions in the list. */ >>> for (j = 0; j < num_ext && mapping[i].extension_offset[j]; j++) >>> - extensions[mapping[i].extension_offset[j]] = GL_TRUE; >>> + extension_table[mapping[i].extension_offset[j]] = GL_TRUE; >>> + } >>> +} >>> + >>> + >>> +/** >>> + * Given a list of formats and bind flags, return the maximum number >>> + * of samples supported by any of those formats. >>> + */ >>> +static unsigned >>> +get_max_samples_for_formats(struct pipe_screen *screen, >>> + unsigned num_formats, >>> + enum pipe_format *formats, >>> + unsigned max_samples, >>> + unsigned bind) >>> +{ >>> + unsigned i, f; >>> + >>> + for (i = max_samples; i > 0; --i) { >>> + for (f = 0; f < num_formats; f++) { >>> + if (screen->is_format_supported(screen, formats[f], >>> + PIPE_TEXTURE_2D, i, bind)) { >>> + return i; >>> + } >>> + } >>> } >>> + return 0; >>> } >>> >>> + >>> /** >>> * Use pipe_screen::get_param() to query PIPE_CAP_ values to determine >>> * which GL extensions are supported. >>> @@ -382,12 +409,15 @@ static void init_format_extensions(struct st_context >>> *st, >>> * features or can be built on top of other gallium features. >>> * Some fine tuning may still be needed. >>> */ >>> -void st_init_extensions(struct st_context *st) >>> +void st_init_extensions(struct pipe_screen *screen, >>> + gl_api api, >>> + struct gl_constants *consts, >>> + struct gl_extensions *extensions, >>> + struct st_config_options *options, >>> + boolean has_lib_dxtc) >>> { >>> - struct pipe_screen *screen = st->pipe->screen; >>> - struct gl_context *ctx = st->ctx; >>> int i, glsl_feature_level; >>> - GLboolean *extensions = (GLboolean *) &ctx->Extensions; >>> + GLboolean *extension_table = (GLboolean *) extensions; >>> >>> static const struct st_extension_cap_mapping cap_mapping[] = { >>> { o(ARB_base_instance), PIPE_CAP_START_INSTANCE >>> }, >> >> [...] >> >>> /* ARB_color_buffer_float. */ >>> if (screen->get_param(screen, PIPE_CAP_VERTEX_COLOR_UNCLAMPED)) { >>> - ctx->Extensions.ARB_color_buffer_float = GL_TRUE; >>> - >>> - if (!screen->get_param(screen, PIPE_CAP_VERTEX_COLOR_CLAMPED)) { >>> - st->clamp_vert_color_in_shader = TRUE; >>> - } >>> - >>> - if (!screen->get_param(screen, PIPE_CAP_FRAGMENT_COLOR_CLAMPED)) { >>> - st->clamp_frag_color_in_shader = TRUE; >>> - } >>> - >>> - /* For drivers which cannot do color clamping, it's better to just >>> - * disable ARB_color_buffer_float in the core profile, because >>> - * the clamping is deprecated there anyway. */ >>> - if (ctx->API == API_OPENGL_CORE && >>> - (st->clamp_frag_color_in_shader || >>> st->clamp_vert_color_in_shader)) { >>> - st->clamp_vert_color_in_shader = GL_FALSE; >>> - st->clamp_frag_color_in_shader = GL_FALSE; >>> - ctx->Extensions.ARB_color_buffer_float = GL_FALSE; >>> - } >>> + extensions->ARB_color_buffer_float = GL_TRUE; >> >> This should just go into the big table then, right? > > Yes, but not in this patch. Maybe in a later patch as a cleanup. > >> >>> } >>> >>> if (screen->fence_finish) { >>> - ctx->Extensions.ARB_sync = GL_TRUE; >>> + extensions->ARB_sync = GL_TRUE; >>> } >>> >>> /* Maximum sample count. */ >>> - for (i = 16; i > 0; --i) { >>> - enum pipe_format pformat = st_choose_format(st, GL_RGBA, >>> - GL_NONE, GL_NONE, >>> - PIPE_TEXTURE_2D, i, >>> - PIPE_BIND_RENDER_TARGET, >>> FALSE); >>> - if (pformat != PIPE_FORMAT_NONE) { >>> - ctx->Const.MaxSamples = i; >>> - ctx->Const.MaxColorTextureSamples = i; >>> - break; >>> - } >>> + { >>> + enum pipe_format color_formats[] = { >>> + PIPE_FORMAT_R8G8B8A8_UNORM, >>> + PIPE_FORMAT_B8G8R8A8_UNORM, >>> + PIPE_FORMAT_A8R8G8B8_UNORM, >>> + PIPE_FORMAT_A8B8G8R8_UNORM, >>> + }; >>> + enum pipe_format depth_formats[] = { >>> + PIPE_FORMAT_Z16_UNORM, >>> + PIPE_FORMAT_Z24X8_UNORM, >>> + PIPE_FORMAT_X8Z24_UNORM, >>> + PIPE_FORMAT_Z32_UNORM, >>> + PIPE_FORMAT_Z32_FLOAT >>> + }; >>> + enum pipe_format int_formats[] = { >>> + PIPE_FORMAT_R32G32B32A32_UINT, >>> + PIPE_FORMAT_R32G32B32A32_SINT, >> >> Uhm... should this be R8G8B8A8 instead? At least that's what's in the >> format_map in st_format.c for GL_RGBA_INTEGER_EXT. (And it doesn't >> include the UINT variant...) > > It doesn't matter which formats are tested as long as at least one > format in the list is supported for MSAA texturing. I assume all > drivers that support MSAA integer texturing support it with all > integer formats. R32G32B32A32 seemed like a safe choice.
For nv50 it'll still work out since you'll check lower MS levels, but e.g. we have: if (sample_count == 8 && util_format_get_blocksizebits(format) >= 128) return FALSE; I wouldn't be surprised if the 128-bit wide thing were a restriction elsewhere too. Especially since the old format check was for RGBA8, that seems like the more prudent thing to do, IMO. -ilia _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev