summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKristian Høgsberg <krh@bitplanet.net>2010-05-24 10:01:38 -0400
committerKristian Høgsberg <krh@bitplanet.net>2010-05-24 10:02:13 -0400
commitf67b020a942911f80b7b774c6d64701d1981c608 (patch)
tree346fe4eb66b537070037f544cf632b88b1bf02ec
parent740c8ea6d371732f3530accde44836930e03cc80 (diff)
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
-rw-r--r--src/mesa/main/api_validate.c34
-rw-r--r--src/mesa/shader/program.c3
-rw-r--r--src/mesa/shader/slang/slang_codegen.c4
-rw-r--r--src/mesa/shader/slang/slang_compile.c25
-rw-r--r--src/mesa/shader/slang/slang_link.c16
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