title: glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BORDER, 0); Throws a GL_INVALID_ENUM?
body: <p>I am creating a 2D openGL texture from an NSImage (cocoa desktop).
  I grabbed some code from the internet and it seems to work.</p>
  
  <p>However, I started to insert calls to glGetError() here and there to track other rendering  bugs, and thus I traced a GL_INVALID_ENUM error to the call mentioned above. As per the documentation on glTexParameteri, both GL_TEXTURE_2D and GL_TEXTURE_BORDER seem to be valid parameters...?</p>
  
  <p>any clue?</p>
  
  <p>this is the code:</p>
  
  <pre><code>- (void) createOpenGLTexture
  {
  [_openGLContext makeCurrentContext];
  
  
  if (_textureID != 0) {
      glDeleteTextures(1, &amp;_textureID);
      _textureID = 0;
  }
  
  NSSize imageSize = [_originalImage size];
  
  
  // .............................................................
  // Flip Image Vertically
  
  NSImage* image = [[NSImage alloc] initWithSize:imageSize];
  
  
  NSRect rect = NSMakeRect(0, 0, imageSize.width, imageSize.height);
  
  [image lockFocus];
  
  NSAffineTransform* transform = [NSAffineTransform transform];
  [transform translateXBy:0 yBy:rect.size.height];
  [transform scaleXBy:+1.0 yBy:-1.0];
  [transform concat];
  [_originalImage drawAtPoint:NSZeroPoint 
                     fromRect:rect 
                    operation:NSCompositeCopy 
                     fraction:1];
  [image unlockFocus];
  
  
  // Then we grab the raw bitmap data from the NSBitmapImageRep that is 
  // the ‘source’ of an NSImage
  
  NSBitmapImageRep* bitmap = [[NSBitmapImageRep alloc] initWithData:[image TIFFRepresentation]];
  [image release];
  
  
  GLenum   imageFormat = GL_RGBA;
  
  imageSize = [bitmap size];  // Needed?
  
  long sourceRowBytes = [bitmap bytesPerRow];
  
  //  This SHOULD be enough but nope
  GLubyte* sourcePic = (GLubyte*) [bitmap bitmapData];
  
  //  We have to copy that raw data one row at a time….yay
  GLubyte* pic = malloc( imageSize.height * sourceRowBytes );
  GLuint  i;
  GLuint intHeight = (GLuint) (imageSize.height);
  
  for (i = 0; i &lt; imageSize.height; i++) {
      memcpy(pic + (i * sourceRowBytes), 
             sourcePic + (( intHeight - i - 1 )*sourceRowBytes), 
             sourceRowBytes);
  }
  
  [bitmap release];
  
  sourcePic = pic;
  
  
  // .........................................................................
  // Create the texture proper
  
  glEnable(GL_TEXTURE_2D);
  checkOpenGLError();
  
  glEnable(GL_COLOR_MATERIAL);
  checkOpenGLError();
  
  glGenTextures (1, &amp;_textureID);
  checkOpenGLError();
  
  glBindTexture (GL_TEXTURE_2D, _textureID);
  checkOpenGLError();
  
  glPixelStorei(GL_UNPACK_ALIGNMENT,1);
  checkOpenGLError();
  
  //  Here we set the basic properties such as how it looks when resized and if it's bordered
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BORDER, 0);
  checkOpenGLError();
  
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  checkOpenGLError();
  
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
  checkOpenGLError();
  
  //  Not really necessary all the time but we can also define if it can be tiled (repeating)
  //  Here GL_TEXTURE_WRAP_S = horizontal and GL_TEXTURE_WRAP_T = vertical
  //  This defaults to GL_REPEAT so we're going to prevent that by using GL_CLAMP
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
  checkOpenGLError();
  
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
  checkOpenGLError();
  
  //  And.....CREATE
  glTexImage2D(GL_TEXTURE_2D, 
               0, 
               imageFormat, 
               rect.size.width, 
               rect.size.height, 
               0, 
               imageFormat, 
               GL_UNSIGNED_BYTE, 
               sourcePic);
  checkOpenGLError();
  
  glDisable(GL_TEXTURE_2D);
  checkOpenGLError();
  
  glDisable(GL_COLOR_MATERIAL);
  
  checkOpenGLError();
  }
  </code></pre>