mesa: INVALID_VALUE for wrong type or format in Clear*Buffer*Data
[mesa.git] / src / mesa / main / pipelineobj.c
index 172a014e3eca2fce9bf1b5977a51e014d43a14c5..b4ca14d7257de4e036c72a71695d334062f23e9d 100644 (file)
 #include <stdbool.h>
 #include "main/glheader.h"
 #include "main/context.h"
-#include "main/dispatch.h"
 #include "main/enums.h"
 #include "main/hash.h"
 #include "main/mtypes.h"
 #include "main/pipelineobj.h"
 #include "main/shaderapi.h"
 #include "main/shaderobj.h"
+#include "main/state.h"
 #include "main/transformfeedback.h"
 #include "main/uniforms.h"
 #include "compiler/glsl/glsl_parser_extras.h"
@@ -371,24 +371,50 @@ _mesa_UseProgramStages(GLuint pipeline, GLbitfield stages, GLuint program)
    use_program_stages(ctx, shProg, stages, pipe);
 }
 
-void GLAPIENTRY
-_mesa_ActiveShaderProgram_no_error(GLuint pipeline, GLuint program)
+static ALWAYS_INLINE void
+active_shader_program(struct gl_context *ctx, GLuint pipeline, GLuint program,
+                      bool no_error)
 {
-   GET_CURRENT_CONTEXT(ctx);
    struct gl_shader_program *shProg = NULL;
    struct gl_pipeline_object *pipe = _mesa_lookup_pipeline_object(ctx, pipeline);
 
-   if (program)
-      shProg = _mesa_lookup_shader_program(ctx, program);
+   if (program) {
+      if (no_error) {
+         shProg = _mesa_lookup_shader_program(ctx, program);
+      } else {
+         shProg = _mesa_lookup_shader_program_err(ctx, program,
+                                                  "glActiveShaderProgram(program)");
+         if (shProg == NULL)
+            return;
+      }
+   }
+
+   if (!no_error && !pipe) {
+      _mesa_error(ctx, GL_INVALID_OPERATION, "glActiveShaderProgram(pipeline)");
+      return;
+   }
 
    /* Object is created by any Pipeline call but glGenProgramPipelines,
     * glIsProgramPipeline and GetProgramPipelineInfoLog
     */
    pipe->EverBound = GL_TRUE;
 
+   if (!no_error && shProg != NULL && !shProg->data->LinkStatus) {
+      _mesa_error(ctx, GL_INVALID_OPERATION,
+            "glActiveShaderProgram(program %u not linked)", shProg->Name);
+      return;
+   }
+
    _mesa_reference_shader_program(ctx, &pipe->ActiveProgram, shProg);
 }
 
+void GLAPIENTRY
+_mesa_ActiveShaderProgram_no_error(GLuint pipeline, GLuint program)
+{
+   GET_CURRENT_CONTEXT(ctx);
+   active_shader_program(ctx, pipeline, program, true);
+}
+
 /**
  * Use the named shader program for subsequent glUniform calls (if pipeline
  * bound)
@@ -397,36 +423,11 @@ void GLAPIENTRY
 _mesa_ActiveShaderProgram(GLuint pipeline, GLuint program)
 {
    GET_CURRENT_CONTEXT(ctx);
-   struct gl_shader_program *shProg = NULL;
-   struct gl_pipeline_object *pipe = _mesa_lookup_pipeline_object(ctx, pipeline);
 
    if (MESA_VERBOSE & VERBOSE_API)
       _mesa_debug(ctx, "glActiveShaderProgram(%u, %u)\n", pipeline, program);
 
-   if (program != 0) {
-      shProg = _mesa_lookup_shader_program_err(ctx, program,
-                                               "glActiveShaderProgram(program)");
-      if (shProg == NULL)
-         return;
-   }
-
-   if (!pipe) {
-      _mesa_error(ctx, GL_INVALID_OPERATION, "glActiveShaderProgram(pipeline)");
-      return;
-   }
-
-   /* Object is created by any Pipeline call but glGenProgramPipelines,
-    * glIsProgramPipeline and GetProgramPipelineInfoLog
-    */
-   pipe->EverBound = GL_TRUE;
-
-   if ((shProg != NULL) && !shProg->data->LinkStatus) {
-      _mesa_error(ctx, GL_INVALID_OPERATION,
-            "glActiveShaderProgram(program %u not linked)", shProg->Name);
-      return;
-   }
-
-   _mesa_reference_shader_program(ctx, &pipe->ActiveProgram, shProg);
+   active_shader_program(ctx, pipeline, program, false);
 }
 
 static ALWAYS_INLINE void
@@ -531,6 +532,8 @@ _mesa_bind_pipeline(struct gl_context *ctx,
             _mesa_program_init_subroutine_defaults(ctx, prog);
          }
       }
+
+      _mesa_update_vertex_processing_mode(ctx);
    }
 }