fix some glBindProgramNV/ARB details
authorBrian Paul <brian.paul@tungstengraphics.com>
Thu, 17 Apr 2003 23:14:30 +0000 (23:14 +0000)
committerBrian Paul <brian.paul@tungstengraphics.com>
Thu, 17 Apr 2003 23:14:30 +0000 (23:14 +0000)
src/mesa/main/arbprogram.c
src/mesa/main/nvprogram.c

index eeac11bd98d17e5deb08e6e40bae27072b07626c..639a4d33a3e65b58d804283a53869f88da9840df 100644 (file)
@@ -463,19 +463,30 @@ _mesa_BindProgramARB(GLenum target, GLuint program)
    }
    else {
       prog = (struct program *) _mesa_HashLookup(ctx->Shared->Programs, program);
-   }
-   if (!prog && program > 0){
-      /* allocate new program */
-      prog = _mesa_alloc_program(ctx, target, program);
-      if (!prog) {
-         _mesa_error(ctx, GL_OUT_OF_MEMORY, "glBindProgramARB");
-         return;
+      if (prog) {
+         if (prog->Target == 0) {
+            /* prog was allocated with glGenProgramsARB */
+            prog->Target = target;
+         }
+         else if (prog->Target != target) {
+            _mesa_error(ctx, GL_INVALID_OPERATION,
+                        "glBindProgramARB(target mismatch)");
+            return;
+         }
+      }
+      else {
+         /* allocate a new program now */
+         prog = _mesa_alloc_program(ctx, target, program);
+         if (!prog) {
+            _mesa_error(ctx, GL_OUT_OF_MEMORY, "glBindProgramARB");
+            return;
+         }
+         prog->Id = program;
+         prog->Target = target;
+         prog->Resident = GL_TRUE;
+         prog->RefCount = 1;
+         _mesa_HashInsert(ctx->Shared->Programs, program, prog);
       }
-      prog->Id = program;
-      prog->Target = target;
-      prog->Resident = GL_TRUE;
-      prog->RefCount = 1;
-      _mesa_HashInsert(ctx->Shared->Programs, program, prog);
    }
 
    /* bind now */
index af1ff36f79c2446bf0000c041dcedc1ae8a3a2c5..00ea579b2e8aee30508db8aaa13c3809e02ccea0 100644 (file)
@@ -227,12 +227,24 @@ _mesa_BindProgramNV(GLenum target, GLuint id)
     */
    if (id == 0) {
       /* OK, the null program object */
+      /* XXX use the ARB_vertex/fragment prorgram default objects??? */
       prog = NULL;
    }
    else {
       prog = (struct program *) _mesa_HashLookup(ctx->Shared->Programs, id);
-      if (!prog && id > 0){
-         /* allocate new program */
+      if (prog) {
+         if (prog->Target == 0) {
+            /* prog was allocated with glGenProgramsNV */
+            prog->Target = target;
+         }
+         else if (prog->Target != target) {
+            _mesa_error(ctx, GL_INVALID_OPERATION,
+                        "glBindProgramNV(target mismatch)");
+            return;
+         }
+      }
+      else {
+         /* allocate a new program now */
          prog = _mesa_alloc_program(ctx, target, id);
          if (!prog) {
             _mesa_error(ctx, GL_OUT_OF_MEMORY, "glBindProgramNV");