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
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user