1ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston/*
27d215e7c4d0ca8a18d91d4f30f79b97835a6d6c4Jeremy Huddleston Copyright (c) 2009-2011 Apple Inc.
3ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston
4ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston Permission is hereby granted, free of charge, to any person
5ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston obtaining a copy of this software and associated documentation files
6ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston (the "Software"), to deal in the Software without restriction,
7ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston including without limitation the rights to use, copy, modify, merge,
8ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston publish, distribute, sublicense, and/or sell copies of the Software,
9ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston and to permit persons to whom the Software is furnished to do so,
10ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston subject to the following conditions:
11ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston
12ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston The above copyright notice and this permission notice shall be
13ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston included in all copies or substantial portions of the Software.
14ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston
15ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston NONINFRINGEMENT.  IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT
19ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston HOLDER(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
20ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
22ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston DEALINGS IN THE SOFTWARE.
23ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston
24ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston Except as contained in this notice, the name(s) of the above
25ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston copyright holders shall not be used in advertising or otherwise to
26ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston promote the sale, use or other dealings in this Software without
27ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston prior written authorization.
28ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston*/
29ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston
30a1cb3babbef2af222b839a058694acc82a7074f1Jeremy Huddleston/* This should be removed once stereo hardware bugs are fixed
31a1cb3babbef2af222b839a058694acc82a7074f1Jeremy Huddleston * <rdar://problem/6729006>
32a1cb3babbef2af222b839a058694acc82a7074f1Jeremy Huddleston */
33a1cb3babbef2af222b839a058694acc82a7074f1Jeremy Huddleston
34ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#include <stdbool.h>
35a1cb3babbef2af222b839a058694acc82a7074f1Jeremy Huddleston
36a1cb3babbef2af222b839a058694acc82a7074f1Jeremy Huddleston#define GL_GLEXT_PROTOTYPES
37a1cb3babbef2af222b839a058694acc82a7074f1Jeremy Huddleston#include <GL/gl.h>
38a1cb3babbef2af222b839a058694acc82a7074f1Jeremy Huddleston#include <GL/glext.h>
39a1cb3babbef2af222b839a058694acc82a7074f1Jeremy Huddleston
40a1cb3babbef2af222b839a058694acc82a7074f1Jeremy Huddleston#include "glxclient.h"
41ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#include "apple_glx_context.h"
42a1cb3babbef2af222b839a058694acc82a7074f1Jeremy Huddleston#include "apple_xgl_api.h"
437d215e7c4d0ca8a18d91d4f30f79b97835a6d6c4Jeremy Huddleston#include "glapitable.h"
447d215e7c4d0ca8a18d91d4f30f79b97835a6d6c4Jeremy Huddleston
457d215e7c4d0ca8a18d91d4f30f79b97835a6d6c4Jeremy Huddlestonextern struct _glapi_table * __ogl_framework_api;
46ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston
47ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston/*
48ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston * These are special functions for stereoscopic support
49ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston * differences in MacOS X.
50ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston */
51ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddlestonvoid
527d215e7c4d0ca8a18d91d4f30f79b97835a6d6c4Jeremy Huddleston__applegl_glDrawBuffer(GLenum mode)
53ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston{
5422613d1670e3aafcfd3b95191b908a0adabe3eb9Jeremy Huddleston   struct glx_context * gc = __glXGetCurrentContext();
55ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston
5680b280db883edc9550484dba03bd5c124b6a9bf9Jeremy Huddleston   if (gc && apple_glx_context_uses_stereo(gc->driContext)) {
57ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston      GLenum buf[2];
58ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston      GLsizei n = 0;
59ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston
60ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston      switch (mode) {
61ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston      case GL_BACK:
62ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston         buf[0] = GL_BACK_LEFT;
63ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston         buf[1] = GL_BACK_RIGHT;
64ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston         n = 2;
65ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston         break;
66ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston      case GL_FRONT:
67ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston         buf[0] = GL_FRONT_LEFT;
68ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston         buf[1] = GL_FRONT_RIGHT;
69ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston         n = 2;
70ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston         break;
71ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston
72ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston      default:
73ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston         buf[0] = mode;
74ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston         n = 1;
75ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston         break;
76ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston      }
77ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston
787d215e7c4d0ca8a18d91d4f30f79b97835a6d6c4Jeremy Huddleston      __ogl_framework_api->DrawBuffersARB(n, buf);
79ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston   }
80ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston   else {
817d215e7c4d0ca8a18d91d4f30f79b97835a6d6c4Jeremy Huddleston      __ogl_framework_api->DrawBuffer(mode);
82ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston   }
83ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston}
84ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston
85ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston
86ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddlestonvoid
877d215e7c4d0ca8a18d91d4f30f79b97835a6d6c4Jeremy Huddleston__applegl_glDrawBuffersARB(GLsizei n, const GLenum * bufs)
88ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston{
8922613d1670e3aafcfd3b95191b908a0adabe3eb9Jeremy Huddleston   struct glx_context * gc = __glXGetCurrentContext();
90ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston
9180b280db883edc9550484dba03bd5c124b6a9bf9Jeremy Huddleston   if (gc && apple_glx_context_uses_stereo(gc->driContext)) {
92ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston      GLenum newbuf[n + 2];
93ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston      GLsizei i, outi = 0;
94ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston      bool have_back = false;
95ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston      bool have_front = false;
96ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston
97ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston      for (i = 0; i < n; ++i) {
98ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston         if (GL_BACK == bufs[i]) {
99ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston            have_back = true;
100ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston         }
101ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston         else if (GL_FRONT == bufs[i]) {
102ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston            have_back = true;
103ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston         }
104ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston         else {
105ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston            newbuf[outi++] = bufs[i];
106ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston         }
107ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston      }
108ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston
109ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston      if (have_back) {
110ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston         newbuf[outi++] = GL_BACK_LEFT;
111ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston         newbuf[outi++] = GL_BACK_RIGHT;
112ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston      }
113ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston
114ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston      if (have_front) {
115ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston         newbuf[outi++] = GL_FRONT_LEFT;
116ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston         newbuf[outi++] = GL_FRONT_RIGHT;
117ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston      }
118ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston
1197d215e7c4d0ca8a18d91d4f30f79b97835a6d6c4Jeremy Huddleston      __ogl_framework_api->DrawBuffersARB(outi, newbuf);
120ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston   }
121ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston   else {
1227d215e7c4d0ca8a18d91d4f30f79b97835a6d6c4Jeremy Huddleston      __ogl_framework_api->DrawBuffersARB(n, bufs);
123ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston   }
124ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston}
125