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. > + 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? > } > > 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...) > + }; > + > + consts->MaxSamples = > + get_max_samples_for_formats(screen, Elements(color_formats), > + color_formats, 16, > + PIPE_BIND_RENDER_TARGET); > + > + consts->MaxColorTextureSamples = > + get_max_samples_for_formats(screen, Elements(color_formats), > + color_formats, consts->MaxSamples, > + PIPE_BIND_SAMPLER_VIEW); > + > + consts->MaxDepthTextureSamples = > + get_max_samples_for_formats(screen, Elements(depth_formats), > + depth_formats, consts->MaxSamples, > + PIPE_BIND_SAMPLER_VIEW); > + > + consts->MaxIntegerSamples = > + get_max_samples_for_formats(screen, Elements(int_formats), > + int_formats, consts->MaxSamples, > + PIPE_BIND_SAMPLER_VIEW); > } > - for (i = ctx->Const.MaxSamples; i > 0; --i) { > - enum pipe_format pformat = st_choose_format(st, GL_DEPTH_STENCIL, > - GL_NONE, GL_NONE, > - PIPE_TEXTURE_2D, i, > - PIPE_BIND_DEPTH_STENCIL, > FALSE); > - if (pformat != PIPE_FORMAT_NONE) { > - ctx->Const.MaxDepthTextureSamples = i; > - break; > - } > - } > - for (i = ctx->Const.MaxSamples; i > 0; --i) { > - enum pipe_format pformat = st_choose_format(st, GL_RGBA_INTEGER, > - GL_NONE, GL_NONE, > - PIPE_TEXTURE_2D, i, > - PIPE_BIND_RENDER_TARGET, > FALSE); > - if (pformat != PIPE_FORMAT_NONE) { > - ctx->Const.MaxIntegerSamples = i; > - break; > - } > - } _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev