On Sun, Jan 22, 2012 at 4:36 PM, Marek Olšák <mar...@gmail.com> wrote: > I think the CAP-based approach is the way to expose GLSL 1.3 for st/mesa. > The later GLSL versions can be easily derived from exposed extensions, > it's just GLSL 1.3 that is tricky. Comments welcome. > --- > src/mesa/drivers/dri/intel/intel_extensions.c | 9 +-- > src/mesa/drivers/dri/intel/intel_screen.c | 2 +- > src/mesa/drivers/dri/nouveau/nouveau_context.c | 2 +- > src/mesa/drivers/dri/r200/r200_context.c | 2 +- > src/mesa/drivers/dri/radeon/radeon_context.c | 2 +- > src/mesa/main/context.c | 14 +---- > src/mesa/main/mtypes.h | 9 +++ > src/mesa/main/version.c | 76 > ++++++++++++++++++++++-- > src/mesa/main/version.h | 5 +- > src/mesa/state_tracker/st_extensions.c | 40 ++++++------- > src/mesa/state_tracker/st_manager.c | 2 +- > 11 files changed, 109 insertions(+), 54 deletions(-) > > diff --git a/src/mesa/drivers/dri/intel/intel_extensions.c > b/src/mesa/drivers/dri/intel/intel_extensions.c > index 0ce452f..f9caeee 100644 > --- a/src/mesa/drivers/dri/intel/intel_extensions.c > +++ b/src/mesa/drivers/dri/intel/intel_extensions.c > @@ -90,11 +90,10 @@ intelInitExtensions(struct gl_context *ctx) > ctx->Extensions.OES_EGL_image = true; > #endif > > - if (intel->gen >= 6) > - ctx->Const.GLSLVersion = 130; > - else > - ctx->Const.GLSLVersion = 120; > - _mesa_override_glsl_version(ctx); > + if (intel->gen >= 6) { > + ctx->Const.NativeIntegerResources = GL_TRUE; > + ctx->Const.ShadowCubeSamplers = GL_TRUE; > + } > > if (intel->gen == 6 || > (intel->gen == 7 && intel->intelScreen->kernel_has_gen7_sol_reset)) > diff --git a/src/mesa/drivers/dri/intel/intel_screen.c > b/src/mesa/drivers/dri/intel/intel_screen.c > index 094ff56..d51d59c 100644 > --- a/src/mesa/drivers/dri/intel/intel_screen.c > +++ b/src/mesa/drivers/dri/intel/intel_screen.c > @@ -563,7 +563,7 @@ intelCreateContext(gl_api api, > struct gl_context *ctx = > (struct gl_context *) driContextPriv->driverPrivate; > > - _mesa_compute_version(ctx); > + _mesa_validate_feature_support(ctx); > if (ctx->VersionMajor > major_version > || (ctx->VersionMajor == major_version > && ctx->VersionMinor >= minor_version)) { > diff --git a/src/mesa/drivers/dri/nouveau/nouveau_context.c > b/src/mesa/drivers/dri/nouveau/nouveau_context.c > index 0cb918e..039d952 100644 > --- a/src/mesa/drivers/dri/nouveau/nouveau_context.c > +++ b/src/mesa/drivers/dri/nouveau/nouveau_context.c > @@ -82,7 +82,7 @@ nouveau_context_create(gl_api api, > nctx->dri_context = dri_ctx; > dri_ctx->driverPrivate = ctx; > > - _mesa_compute_version(ctx); > + _mesa_validate_feature_support(ctx); > if (ctx->VersionMajor < major_version > || (ctx->VersionMajor == major_version > && ctx->VersionMinor < minor_version)) { > diff --git a/src/mesa/drivers/dri/r200/r200_context.c > b/src/mesa/drivers/dri/r200/r200_context.c > index 244973e..4f3b7ff 100644 > --- a/src/mesa/drivers/dri/r200/r200_context.c > +++ b/src/mesa/drivers/dri/r200/r200_context.c > @@ -453,7 +453,7 @@ GLboolean r200CreateContext( gl_api api, > TCL_FALLBACK(rmesa->radeon.glCtx, R200_TCL_FALLBACK_TCL_DISABLE, 1); > } > > - _mesa_compute_version(ctx); > + _mesa_validate_feature_support(ctx); > if (ctx->VersionMajor < major_version > || (ctx->VersionMajor == major_version > && ctx->VersionMinor < minor_version)) { > diff --git a/src/mesa/drivers/dri/radeon/radeon_context.c > b/src/mesa/drivers/dri/radeon/radeon_context.c > index 9881d00..1fbac45 100644 > --- a/src/mesa/drivers/dri/radeon/radeon_context.c > +++ b/src/mesa/drivers/dri/radeon/radeon_context.c > @@ -401,7 +401,7 @@ r100CreateContext( gl_api api, > /* _tnl_need_dlist_norm_lengths( ctx, GL_FALSE ); */ > } > > - _mesa_compute_version(ctx); > + _mesa_validate_feature_support(ctx); > if (ctx->VersionMajor < major_version > || (ctx->VersionMajor == major_version > && ctx->VersionMinor < minor_version)) { > diff --git a/src/mesa/main/context.c b/src/mesa/main/context.c > index f39cab5..7e3bdcf 100644 > --- a/src/mesa/main/context.c > +++ b/src/mesa/main/context.c > @@ -624,18 +624,6 @@ _mesa_init_constants(struct gl_context *ctx) > ctx->Const.MaxGeometryTotalOutputComponents = > MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS; > #endif > > - /* Shading language version */ > - if (ctx->API == API_OPENGL) { > - ctx->Const.GLSLVersion = 120; > - _mesa_override_glsl_version(ctx); > - } > - else if (ctx->API == API_OPENGLES2) { > - ctx->Const.GLSLVersion = 100; > - } > - else if (ctx->API == API_OPENGLES) { > - ctx->Const.GLSLVersion = 0; /* GLSL not supported */ > - } > - > /* GL_ARB_framebuffer_object */ > ctx->Const.MaxSamples = 0; > > @@ -1507,7 +1495,7 @@ _mesa_make_current( struct gl_context *newCtx, > } > > if (newCtx->FirstTimeCurrent) { > - _mesa_compute_version(newCtx); > + _mesa_validate_feature_support(newCtx); > > newCtx->Extensions.String = _mesa_make_extension_string(newCtx); > > diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h > index 2ff6085..1d2a265 100644 > --- a/src/mesa/main/mtypes.h > +++ b/src/mesa/main/mtypes.h > @@ -2814,6 +2814,15 @@ struct gl_constants > GLboolean NativeIntegers; > > /** > + * Does the driver support integer vertex attribs, textures, > + * and colorbuffers? > + */ > + GLboolean NativeIntegerResources; > + > + /** Whether shadow cube samplers are supported. */ > + GLboolean ShadowCubeSamplers; > + > + /** > * If the driver supports real 32-bit integers, what integer value should > be > * used for boolean true in uniform uploads? (Usually 1 or ~0.) > */ > diff --git a/src/mesa/main/version.c b/src/mesa/main/version.c > index fc6e17c..b4e9d28 100644 > --- a/src/mesa/main/version.c > +++ b/src/mesa/main/version.c > @@ -56,8 +56,8 @@ override_version(struct gl_context *ctx, GLuint *major, > GLuint *minor) > * MESA_GLSL_VERSION_OVERRIDE is set. Valid values for > * MESA_GLSL_VERSION_OVERRIDE are integers, such as "130". > */ > -void > -_mesa_override_glsl_version(struct gl_context *ctx) > +static void > +override_glsl_version(struct gl_context *ctx) > { > const char *env_var = "MESA_GLSL_VERSION_OVERRIDE"; > const char *version; > @@ -75,12 +75,45 @@ _mesa_override_glsl_version(struct gl_context *ctx) > } > } > > +static void > +compute_glsl_version_opengl(struct gl_context *ctx) > +{ > + if (ctx->Extensions.ARB_shading_language_100 && > + ctx->Extensions.ARB_shader_objects && > + ctx->Extensions.ARB_vertex_shader && > + ctx->Extensions.ARB_fragment_shader) { > + ctx->Const.GLSLVersion = 120; > + } > + > + if (ctx->Const.GLSLVersion >= 120 && > + ctx->Const.MaxClipPlanes >= 8 && > + ctx->Const.NativeIntegers && > + ctx->Const.NativeIntegerResources && > + ctx->Const.ShadowCubeSamplers && > + ctx->Extensions.ARB_shader_texture_lod && > + ctx->Extensions.EXT_texture_array) { > + ctx->Const.GLSLVersion = 130; > + } > + > + if (ctx->Const.GLSLVersion >= 130 && > + ctx->Extensions.ARB_draw_instanced && > + ctx->Extensions.ARB_texture_buffer_object && > + ctx->Extensions.ARB_uniform_buffer_object && > + ctx->Extensions.NV_texture_rectangle) { > + ctx->Const.GLSLVersion = 140; > + } > + > + /* And we could go on... */ > + > + override_glsl_version(ctx); > +} > + > /** > * Examine enabled GL extensions to determine GL version. > * Return major and minor version numbers.
This comment is out of date. We don't actually return the version numbers. We set the ctx->VersionMajor/Minor and VersionString fields. > */ > static void > -compute_version(struct gl_context *ctx) > +compute_version_opengl(struct gl_context *ctx) > { > GLuint major, minor; > static const int max = 100; > @@ -298,15 +331,15 @@ compute_version_es2(struct gl_context *ctx) > * This should only be called once as part of context initialization > * or to perform version check for GLX_ARB_create_context_profile. > */ > -void > -_mesa_compute_version(struct gl_context *ctx) > +static void > +compute_version(struct gl_context *ctx) > { > if (ctx->VersionMajor) > return; > > switch (ctx->API) { > case API_OPENGL: > - compute_version(ctx); > + compute_version_opengl(ctx); > break; > case API_OPENGLES: > compute_version_es1(ctx); > @@ -315,5 +348,36 @@ _mesa_compute_version(struct gl_context *ctx) > compute_version_es2(ctx); > break; > } > +} > > +static void > +compute_glsl_version(struct gl_context *ctx) > +{ > + switch (ctx->API) { > + case API_OPENGL: > + compute_glsl_version_opengl(ctx); > + break; > + case API_OPENGLES: > + ctx->Const.GLSLVersion = 0; /* GLSL not supported */ > + break; > + case API_OPENGLES2: > + ctx->Const.GLSLVersion = 100; > + break; > + } > +} > + > +void > +_mesa_validate_feature_support(struct gl_context *ctx) > +{ > + compute_glsl_version(ctx); > + compute_version(ctx); > + > + /* XXX disable the extensions which do not meet requirements of their > + * specifications. */ > + > + /* Extensions that depend on the versions *only*: > + */ > + if (ctx->Const.GLSLVersion >= 130) { > + ctx->Extensions.ARB_conservative_depth = GL_TRUE; > + } > } > diff --git a/src/mesa/main/version.h b/src/mesa/main/version.h > index 8723c1f..dbf9cd3 100644 > --- a/src/mesa/main/version.h > +++ b/src/mesa/main/version.h > @@ -43,9 +43,6 @@ struct gl_context; > > > extern void > -_mesa_compute_version(struct gl_context *ctx); > - > -extern void > -_mesa_override_glsl_version(struct gl_context *ctx); > +_mesa_validate_feature_support(struct gl_context *ctx); > > #endif /* VERSION_H */ > diff --git a/src/mesa/state_tracker/st_extensions.c > b/src/mesa/state_tracker/st_extensions.c > index 6c8a491..9e34272 100644 > --- a/src/mesa/state_tracker/st_extensions.c > +++ b/src/mesa/state_tracker/st_extensions.c > @@ -260,9 +260,6 @@ void st_init_extensions(struct st_context *st) > struct gl_context *ctx = st->ctx; > int i; > > - ctx->Const.GLSLVersion = 120; > - _mesa_override_glsl_version(st->ctx); > - > /* > * Extensions that are supported by all Gallium drivers: > */ > @@ -584,16 +581,15 @@ void st_init_extensions(struct st_context *st) > screen->get_shader_param(screen, PIPE_SHADER_FRAGMENT, > PIPE_SHADER_CAP_INTEGERS)) { > ctx->Const.NativeIntegers = GL_TRUE; > - } > > - if (ctx->Const.NativeIntegers) > - ctx->Const.GLSLVersion = 130; > - > - /* Extensions that only depend on the GLSL version: > - */ > - if (ctx->Const.GLSLVersion >= 130) { > - ctx->Extensions.ARB_conservative_depth = GL_TRUE; > + /* XXX maybe add caps for these. */ > ctx->Const.MaxClipPlanes = 8; > + ctx->Const.ShadowCubeSamplers = GL_TRUE; > + > + /* These extensions require native integers: */ > + if (screen->get_param(screen, PIPE_CAP_SHADER_STENCIL_EXPORT)) { > + ctx->Extensions.ARB_shader_stencil_export = GL_TRUE; > + } > } > > ctx->Extensions.NV_primitive_restart = GL_TRUE; > @@ -634,10 +630,6 @@ void st_init_extensions(struct st_context *st) > ctx->Extensions.ARB_color_buffer_float = GL_TRUE; > } > > - if (screen->get_param(screen, PIPE_CAP_SHADER_STENCIL_EXPORT)) { > - ctx->Extensions.ARB_shader_stencil_export = GL_TRUE; > - } > - > if (screen->get_param(screen, PIPE_CAP_TGSI_INSTANCEID)) { > ctx->Extensions.ARB_draw_instanced = GL_TRUE; > } > @@ -713,11 +705,17 @@ void st_init_extensions(struct st_context *st) > } > } > > - if (ctx->Const.NativeIntegers && > - screen->is_format_supported(screen, PIPE_FORMAT_R32G32B32A32_UINT, > PIPE_TEXTURE_2D, 0, > - PIPE_BIND_SAMPLER_VIEW | > PIPE_BIND_RENDER_TARGET) && > - screen->is_format_supported(screen, PIPE_FORMAT_R32G32B32A32_SINT, > PIPE_TEXTURE_2D, 0, > - PIPE_BIND_SAMPLER_VIEW | > PIPE_BIND_RENDER_TARGET)) > + if (screen->is_format_supported(screen, PIPE_FORMAT_R32G32B32A32_UINT, > + PIPE_TEXTURE_2D, 0, > + PIPE_BIND_VERTEX_BUFFER | > + PIPE_BIND_SAMPLER_VIEW | > + PIPE_BIND_RENDER_TARGET) && > + screen->is_format_supported(screen, PIPE_FORMAT_R32G32B32A32_SINT, > + PIPE_TEXTURE_2D, 0, > + PIPE_BIND_VERTEX_BUFFER | > + PIPE_BIND_SAMPLER_VIEW | > + PIPE_BIND_RENDER_TARGET)) { > + ctx->Const.NativeIntegerResources = GL_TRUE; > ctx->Extensions.EXT_texture_integer = GL_TRUE; > - > + } > } > diff --git a/src/mesa/state_tracker/st_manager.c > b/src/mesa/state_tracker/st_manager.c > index 63920a3..82612b1 100644 > --- a/src/mesa/state_tracker/st_manager.c > +++ b/src/mesa/state_tracker/st_manager.c > @@ -644,7 +644,7 @@ st_api_create_context(struct st_api *stapi, struct > st_manager *smapi, > > /* need to perform version check */ > if (attribs->major > 1 || attribs->minor > 0) { > - _mesa_compute_version(st->ctx); > + _mesa_validate_feature_support(st->ctx); > > /* Is the actual version less than the requested version? Mesa can't > * yet enforce the added restrictions of a forward-looking context, so Looks good to me but the GLSL guys might want to double-check too. Reviewed-by: Brian Paul <bri...@vmware.com> -Brian _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev