From f67b020a942911f80b7b774c6d64701d1981c608 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Kristian=20H=C3=B8gsberg?= Date: Mon, 24 May 2010 10:01:38 -0400 Subject: [PATCH] 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 f6da86d2961..150bc3886cf 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 f77a7737530..a6ada8a048b 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 4b876a460c2..2d8116850f9 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 ad866761570..e7938e55ad9 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 b16778f8ad4..3d4208ce4c5 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 -- 2.30.2