svga: always link with C++
[mesa.git] / src / mesa / main / shaderapi.c
index e664650c88d5ab919f4fdcc158c348d01f4a3f18..be69467986d417693819ed1d7df33f3e6ad33f78 100644 (file)
@@ -207,6 +207,8 @@ attach_shader(struct gl_context *ctx, GLuint program, GLuint shader)
    struct gl_shader *sh;
    GLuint i, n;
 
+   const bool same_type_disallowed = _mesa_is_gles(ctx);
+
    shProg = _mesa_lookup_shader_program_err(ctx, program, "glAttachShader");
    if (!shProg)
       return;
@@ -227,6 +229,18 @@ attach_shader(struct gl_context *ctx, GLuint program, GLuint shader)
           */
          _mesa_error(ctx, GL_INVALID_OPERATION, "glAttachShader");
          return;
+      } else if (same_type_disallowed &&
+                 shProg->Shaders[i]->Type == sh->Type) {
+        /* Shader with the same type is already attached to this program,
+         * OpenGL ES 2.0 and 3.0 specs say:
+         *
+         *      "Multiple shader objects of the same type may not be attached
+         *      to a single program object. [...] The error INVALID_OPERATION
+         *      is generated if [...] another shader object of the same type
+         *      as shader is already attached to program."
+         */
+         _mesa_error(ctx, GL_INVALID_OPERATION, "glAttachShader");
+         return;
       }
    }
 
@@ -595,6 +609,9 @@ get_programiv(struct gl_context *ctx, GLuint program, GLenum pname, GLint *param
 
       *params = shProg->BinaryRetreivableHint;
       return;
+   case GL_PROGRAM_BINARY_LENGTH:
+      *params = 0;
+      return;
    default:
       break;
    }
@@ -1397,8 +1414,6 @@ _mesa_UseProgram(GLhandleARB program)
    GET_CURRENT_CONTEXT(ctx);
    struct gl_shader_program *shProg;
 
-   ASSERT_OUTSIDE_BEGIN_END(ctx);
-
    if (_mesa_is_xfb_active_and_unpaused(ctx)) {
       _mesa_error(ctx, GL_INVALID_OPERATION,
                   "glUseProgram(transform feedback active)");
@@ -1519,8 +1534,6 @@ _mesa_GetProgramBinary(GLuint program, GLsizei bufSize, GLsizei *length,
    struct gl_shader_program *shProg;
    GET_CURRENT_CONTEXT(ctx);
 
-   ASSERT_OUTSIDE_BEGIN_END(ctx);
-
    shProg = _mesa_lookup_shader_program_err(ctx, program, "glGetProgramBinary");
    if (!shProg)
       return;
@@ -1555,8 +1568,6 @@ _mesa_ProgramBinary(GLuint program, GLenum binaryFormat,
    struct gl_shader_program *shProg;
    GET_CURRENT_CONTEXT(ctx);
 
-   ASSERT_OUTSIDE_BEGIN_END(ctx);
-
    shProg = _mesa_lookup_shader_program_err(ctx, program, "glProgramBinary");
    if (!shProg)
       return;
@@ -1574,8 +1585,6 @@ _mesa_ProgramParameteri(GLuint program, GLenum pname, GLint value)
    struct gl_shader_program *shProg;
    GET_CURRENT_CONTEXT(ctx);
 
-   ASSERT_OUTSIDE_BEGIN_END(ctx);
-
    shProg = _mesa_lookup_shader_program_err(ctx, program,
                                             "glProgramParameteri");
    if (!shProg)
@@ -1704,8 +1713,6 @@ _mesa_UseShaderProgramEXT(GLenum type, GLuint program)
    GET_CURRENT_CONTEXT(ctx);
    struct gl_shader_program *shProg = NULL;
 
-   ASSERT_OUTSIDE_BEGIN_END(ctx);
-
    if (!validate_shader_target(ctx, type)) {
       _mesa_error(ctx, GL_INVALID_ENUM, "glUseShaderProgramEXT(type)");
       return;
@@ -1796,84 +1803,3 @@ _mesa_CreateShaderProgramEXT(GLenum type, const GLchar *string)
 
    return program;
 }
-
-/**
- * Plug in shader-related functions into API dispatch table.
- */
-void
-_mesa_init_shader_dispatch(const struct gl_context *ctx,
-                           struct _glapi_table *exec)
-{
-#if FEATURE_GL
-   /* GL_ARB_vertex/fragment_shader */
-   if (_mesa_is_desktop_gl(ctx)) {
-      SET_DeleteObjectARB(exec, _mesa_DeleteObjectARB);
-      SET_GetHandleARB(exec, _mesa_GetHandleARB);
-      SET_DetachObjectARB(exec, _mesa_DetachObjectARB);
-      SET_CreateShaderObjectARB(exec, _mesa_CreateShaderObjectARB);
-      SET_CreateProgramObjectARB(exec, _mesa_CreateProgramObjectARB);
-      SET_AttachObjectARB(exec, _mesa_AttachObjectARB);
-      SET_GetObjectParameterfvARB(exec, _mesa_GetObjectParameterfvARB);
-      SET_GetObjectParameterivARB(exec, _mesa_GetObjectParameterivARB);
-      SET_GetInfoLogARB(exec, _mesa_GetInfoLogARB);
-      SET_GetAttachedObjectsARB(exec, _mesa_GetAttachedObjectsARB);
-   }
-
-   if (ctx->API != API_OPENGLES) {
-      SET_ShaderSource(exec, _mesa_ShaderSource);
-      SET_CompileShader(exec, _mesa_CompileShader);
-      SET_LinkProgram(exec, _mesa_LinkProgram);
-      SET_UseProgram(exec, _mesa_UseProgram);
-      SET_ValidateProgram(exec, _mesa_ValidateProgram);
-      SET_GetShaderSource(exec, _mesa_GetShaderSource);
-
-      /* OpenGL 2.0 */
-      SET_AttachShader(exec, _mesa_AttachShader);
-      SET_CreateProgram(exec, _mesa_CreateProgram);
-      SET_CreateShader(exec, _mesa_CreateShader);
-      SET_DeleteProgram(exec, _mesa_DeleteProgram);
-      SET_DeleteShader(exec, _mesa_DeleteShader);
-      SET_DetachShader(exec, _mesa_DetachShader);
-      SET_GetAttachedShaders(exec, _mesa_GetAttachedShaders);
-      SET_GetProgramiv(exec, _mesa_GetProgramiv);
-      SET_GetProgramInfoLog(exec, _mesa_GetProgramInfoLog);
-      SET_GetShaderiv(exec, _mesa_GetShaderiv);
-      SET_GetShaderInfoLog(exec, _mesa_GetShaderInfoLog);
-      SET_IsProgram(exec, _mesa_IsProgram);
-      SET_IsShader(exec, _mesa_IsShader);
-
-      /* GL_ARB_vertex_shader */
-      SET_BindAttribLocation(exec, _mesa_BindAttribLocation);
-      SET_GetActiveAttrib(exec, _mesa_GetActiveAttrib);
-      SET_GetAttribLocation(exec, _mesa_GetAttribLocation);
-   }
-
-   if (ctx->API == API_OPENGL_COMPAT) {
-      SET_UseShaderProgramEXT(exec, _mesa_UseShaderProgramEXT);
-      SET_ActiveProgramEXT(exec, _mesa_ActiveProgramEXT);
-      SET_CreateShaderProgramEXT(exec, _mesa_CreateShaderProgramEXT);
-   }
-
-   /* GL_EXT_gpu_shader4 / GL 3.0 */
-   if (_mesa_is_desktop_gl(ctx)) {
-      SET_BindFragDataLocation(exec, _mesa_BindFragDataLocation);
-   }
-   if (_mesa_is_desktop_gl(ctx) || _mesa_is_gles3(ctx)) {
-      SET_GetFragDataLocation(exec, _mesa_GetFragDataLocation);
-   }
-
-   /* GL_ARB_ES2_compatibility */
-   if (ctx->API != API_OPENGLES) {
-      SET_ReleaseShaderCompiler(exec, _mesa_ReleaseShaderCompiler);
-      SET_GetShaderPrecisionFormat(exec, _mesa_GetShaderPrecisionFormat);
-      SET_ShaderBinary(exec, _mesa_ShaderBinary);
-   }
-
-   /* GL_ARB_blend_func_extended */
-   if (_mesa_is_desktop_gl(ctx)) {
-      SET_BindFragDataLocationIndexed(exec, _mesa_BindFragDataLocationIndexed);
-      SET_GetFragDataIndex(exec, _mesa_GetFragDataIndex);
-   }
-#endif /* FEATURE_GL */
-}
-