Mesa (master): mesa: Handle FEATURE_es2_glsl differences at runtime too

Kristian Høgsberg krh at kemper.freedesktop.org
Mon May 24 14:03:59 UTC 2010


Module: Mesa
Branch: master
Commit: f67b020a942911f80b7b774c6d64701d1981c608
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=f67b020a942911f80b7b774c6d64701d1981c608

Author: Kristian Høgsberg <krh at bitplanet.net>
Date:   Mon May 24 10:01:38 2010 -0400

mesa: Handle FEATURE_es2_glsl differences at runtime too

Now that we can support different APIs at runtime, we need to check the
context for the API we're currently providing as well.

https://bugs.freedesktop.org/show_bug.cgi?id=28194

---

 src/mesa/main/api_validate.c          |   34 +++++++++++++++++++++-----------
 src/mesa/shader/program.c             |    3 +-
 src/mesa/shader/slang/slang_codegen.c |    4 ++-
 src/mesa/shader/slang/slang_compile.c |   25 ++++++++++++++++-------
 src/mesa/shader/slang/slang_link.c    |   16 ++++++++------
 5 files changed, 53 insertions(+), 29 deletions(-)

diff --git a/src/mesa/main/api_validate.c b/src/mesa/main/api_validate.c
index f6da86d..150bc38 100644
--- a/src/mesa/main/api_validate.c
+++ b/src/mesa/main/api_validate.c
@@ -105,21 +105,31 @@ check_valid_to_render(GLcontext *ctx, const char *function)
       return GL_FALSE;
    }
 
+   switch (ctx->API) {
 #if FEATURE_es2_glsl
-   /* For ES2, we can draw if any vertex array is enabled (and we should
-    * always have a vertex program/shader).
-    */
-   if (ctx->Array.ArrayObj->_Enabled == 0x0 || !ctx->VertexProgram._Current)
-      return GL_FALSE;
-#else
-   /* For regular OpenGL, only draw if we have vertex positions (regardless
-    * of whether or not we have a vertex program/shader).
-    */
-   if (!ctx->Array.ArrayObj->Vertex.Enabled &&
-       !ctx->Array.ArrayObj->VertexAttrib[0].Enabled)
-      return GL_FALSE;
+   case API_OPENGLES2:
+      /* For ES2, we can draw if any vertex array is enabled (and we
+       * should always have a vertex program/shader). */
+      if (ctx->Array.ArrayObj->_Enabled == 0x0 || !ctx->VertexProgram._Current)
+	 return GL_FALSE;
+      break;
 #endif
 
+#if FEATURE_ES1 || FEATURE_GL
+   case API_OPENGLES:
+   case API_OPENGL:
+      /* For regular OpenGL, only draw if we have vertex positions
+       * (regardless of whether or not we have a vertex program/shader). */
+      if (!ctx->Array.ArrayObj->Vertex.Enabled &&
+	  !ctx->Array.ArrayObj->VertexAttrib[0].Enabled)
+	 return GL_FALSE;
+      break;
+#endif
+
+   default:
+      ASSERT_NO_FEATURE();
+   }
+
    return GL_TRUE;
 }
 
diff --git a/src/mesa/shader/program.c b/src/mesa/shader/program.c
index f77a773..a6ada8a 100644
--- a/src/mesa/shader/program.c
+++ b/src/mesa/shader/program.c
@@ -74,7 +74,8 @@ _mesa_init_program(GLcontext *ctx)
 #if FEATURE_NV_vertex_program || FEATURE_ARB_vertex_program
    ctx->VertexProgram.Enabled = GL_FALSE;
 #if FEATURE_es2_glsl
-   ctx->VertexProgram.PointSizeEnabled = GL_TRUE;
+   ctx->VertexProgram.PointSizeEnabled =
+      (ctx->API == API_OPENGLES2) ? GL_TRUE : GL_FALSE;
 #else
    ctx->VertexProgram.PointSizeEnabled = GL_FALSE;
 #endif
diff --git a/src/mesa/shader/slang/slang_codegen.c b/src/mesa/shader/slang/slang_codegen.c
index 4b876a4..2d81168 100644
--- a/src/mesa/shader/slang/slang_codegen.c
+++ b/src/mesa/shader/slang/slang_codegen.c
@@ -4971,6 +4971,7 @@ GLboolean
 _slang_codegen_global_variable(slang_assemble_ctx *A, slang_variable *var,
                                slang_unit_type type)
 {
+   GET_CURRENT_CONTEXT(ctx);
    struct gl_program *prog = A->program;
    const char *varName = (char *) var->a_name;
    GLboolean success = GL_TRUE;
@@ -5000,7 +5001,8 @@ _slang_codegen_global_variable(slang_assemble_ctx *A, slang_variable *var,
       }
 #if FEATURE_es2_glsl /* XXX should use FEATURE_texture_rect */
       /* disallow rect samplers */
-      if (is_rect_sampler_spec(&var->type.specifier)) {
+      if (ctx->API == API_OPENGLES2 &&
+	  is_rect_sampler_spec(&var->type.specifier)) {
          slang_info_log_error(A->log, "invalid sampler type for '%s'", varName);
          return GL_FALSE;
       }
diff --git a/src/mesa/shader/slang/slang_compile.c b/src/mesa/shader/slang/slang_compile.c
index ad86676..e7938e5 100644
--- a/src/mesa/shader/slang/slang_compile.c
+++ b/src/mesa/shader/slang/slang_compile.c
@@ -2485,10 +2485,14 @@ parse_default_precision(slang_parse_ctx * C, slang_output_ctx * O)
 static void
 init_default_precision(slang_output_ctx *O, slang_unit_type type)
 {
+   GET_CURRENT_CONTEXT(ctx);
    GLuint i;
    for (i = 0; i < TYPE_SPECIFIER_COUNT; i++) {
 #if FEATURE_es2_glsl
-      O->default_precision[i] = PRECISION_LOW;
+      if (ctx->API == API_OPENGLES2)
+	 O->default_precision[i] = PRECISION_LOW;
+      else
+	 O->default_precision[i] = PRECISION_HIGH;
 #else
       O->default_precision[i] = PRECISION_HIGH;
 #endif
@@ -2559,7 +2563,8 @@ parse_code_unit(slang_parse_ctx * C, slang_code_unit * unit,
 
    /* allow 'invariant' keyword? */
 #if FEATURE_es2_glsl
-   o.allow_invariant = GL_TRUE;
+   o.allow_invariant =
+      (ctx->API == API_OPENGLES2 || C->version >= 120) ? GL_TRUE : GL_FALSE;
 #else
    o.allow_invariant = (C->version >= 120) ? GL_TRUE : GL_FALSE;
 #endif
@@ -2569,7 +2574,8 @@ parse_code_unit(slang_parse_ctx * C, slang_code_unit * unit,
 
    /* allow 'lowp/mediump/highp' keywords? */
 #if FEATURE_es2_glsl
-   o.allow_precision = GL_TRUE;
+   o.allow_precision =
+      (ctx->API == API_OPENGLES2 || C->version >= 120) ? GL_TRUE : GL_FALSE;
 #else
    o.allow_precision = (C->version >= 120) ? GL_TRUE : GL_FALSE;
 #endif
@@ -2690,6 +2696,7 @@ compile_with_grammar(const char *source,
                      unsigned int shader_type,
                      unsigned int parsing_builtin)
 {
+   GET_CURRENT_CONTEXT(ctx);
    struct sl_pp_purify_options options;
    struct sl_pp_context *context;
    unsigned char *prod;
@@ -2728,11 +2735,13 @@ compile_with_grammar(const char *source,
 
 
 #if FEATURE_es2_glsl
-   if (sl_pp_context_add_predefined(context, "GL_ES", "1") ||
-       sl_pp_context_add_predefined(context, "GL_FRAGMENT_PRECISION_HIGH", "1")) {
-      slang_info_log_error(infolog, "%s", sl_pp_context_error_message(context));
-      sl_pp_context_destroy(context);
-      return GL_FALSE;
+   if (ctx->API == API_OPENGLES2) {
+      if (sl_pp_context_add_predefined(context, "GL_ES", "1") ||
+	  sl_pp_context_add_predefined(context, "GL_FRAGMENT_PRECISION_HIGH", "1")) {
+	 slang_info_log_error(infolog, "%s", sl_pp_context_error_message(context));
+	 sl_pp_context_destroy(context);
+	 return GL_FALSE;
+      }
    }
 #endif
 
diff --git a/src/mesa/shader/slang/slang_link.c b/src/mesa/shader/slang/slang_link.c
index b16778f..3d4208c 100644
--- a/src/mesa/shader/slang/slang_link.c
+++ b/src/mesa/shader/slang/slang_link.c
@@ -858,13 +858,15 @@ _slang_link(GLcontext *ctx,
 
 #if FEATURE_es2_glsl
    /* must have both a vertex and fragment program for ES2 */
-   if (!vertProg) {
-      link_error(shProg, "missing vertex shader\n");
-      return;
-   }
-   if (!fragProg) {
-      link_error(shProg, "missing fragment shader\n");
-      return;
+   if (ctx->API == API_OPENGLES2) {
+      if (!vertProg) {
+	 link_error(shProg, "missing vertex shader\n");
+	 return;
+      }
+      if (!fragProg) {
+	 link_error(shProg, "missing fragment shader\n");
+	 return;
+      }
    }
 #endif
 




More information about the mesa-commit mailing list