summaryrefslogtreecommitdiff
path: root/src/glx/apple/apple_glx_pbuffer.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/glx/apple/apple_glx_pbuffer.c')
-rw-r--r--src/glx/apple/apple_glx_pbuffer.c331
1 files changed, 0 insertions, 331 deletions
diff --git a/src/glx/apple/apple_glx_pbuffer.c b/src/glx/apple/apple_glx_pbuffer.c
deleted file mode 100644
index fb56b7512e..0000000000
--- a/src/glx/apple/apple_glx_pbuffer.c
+++ /dev/null
@@ -1,331 +0,0 @@
-/*
- Copyright (c) 2009 Apple Inc.
-
- Permission is hereby granted, free of charge, to any person
- obtaining a copy of this software and associated documentation files
- (the "Software"), to deal in the Software without restriction,
- including without limitation the rights to use, copy, modify, merge,
- publish, distribute, sublicense, and/or sell copies of the Software,
- and to permit persons to whom the Software is furnished to do so,
- subject to the following conditions:
-
- The above copyright notice and this permission notice shall be
- included in all copies or substantial portions of the Software.
-
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- NONINFRINGEMENT. IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT
- HOLDER(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
- WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- DEALINGS IN THE SOFTWARE.
-
- Except as contained in this notice, the name(s) of the above
- copyright holders shall not be used in advertising or otherwise to
- promote the sale, use or other dealings in this Software without
- prior written authorization.
-*/
-
-#include <stdlib.h>
-#include <pthread.h>
-#include <assert.h>
-#include <GL/glew.h>
-#include "apple_glx.h"
-#include "glcontextmodes.h"
-#include "apple_glx_context.h"
-#include "apple_glx_drawable.h"
-#include "apple_cgl.h"
-
-static bool pbuffer_make_current(struct apple_glx_context *ac,
- struct apple_glx_drawable *d);
-
-static void pbuffer_destroy(Display * dpy, struct apple_glx_drawable *d);
-
-static struct apple_glx_drawable_callbacks callbacks = {
- .type = APPLE_GLX_DRAWABLE_PBUFFER,
- .make_current = pbuffer_make_current,
- .destroy = pbuffer_destroy
-};
-
-
-/* Return true if an error occurred. */
-bool
-pbuffer_make_current(struct apple_glx_context *ac,
- struct apple_glx_drawable *d)
-{
- struct apple_glx_pbuffer *pbuf = &d->types.pbuffer;
- CGLError cglerr;
-
- assert(APPLE_GLX_DRAWABLE_PBUFFER == d->type);
-
- cglerr = apple_cgl.set_pbuffer(ac->context_obj, pbuf->buffer_obj, 0, 0, 0);
-
- if (kCGLNoError != cglerr) {
- fprintf(stderr, "set_pbuffer: %s\n", apple_cgl.error_string(cglerr));
- return true;
- }
-
- if (!ac->made_current) {
- glViewport(0, 0, pbuf->width, pbuf->height);
- glScissor(0, 0, pbuf->width, pbuf->height);
- ac->made_current = true;
- }
-
- apple_glx_diagnostic("made pbuffer drawable 0x%lx current\n", d->drawable);
-
- return false;
-}
-
-void
-pbuffer_destroy(Display * dpy, struct apple_glx_drawable *d)
-{
- struct apple_glx_pbuffer *pbuf = &d->types.pbuffer;
-
- assert(APPLE_GLX_DRAWABLE_PBUFFER == d->type);
-
- apple_glx_diagnostic("destroying pbuffer for drawable 0x%lx\n",
- d->drawable);
-
- apple_cgl.destroy_pbuffer(pbuf->buffer_obj);
- XFreePixmap(dpy, pbuf->xid);
-}
-
-/* Return true if an error occurred. */
-bool
-apple_glx_pbuffer_destroy(Display * dpy, GLXPbuffer pbuf)
-{
- return !apple_glx_drawable_destroy_by_type(dpy, pbuf,
- APPLE_GLX_DRAWABLE_PBUFFER);
-}
-
-/* Return true if an error occurred. */
-bool
-apple_glx_pbuffer_create(Display * dpy, GLXFBConfig config,
- int width, int height, int *errorcode,
- GLXPbuffer * result)
-{
- struct apple_glx_drawable *d;
- struct apple_glx_pbuffer *pbuf = NULL;
- CGLError err;
- Window root;
- int screen;
- Pixmap xid;
- __GLcontextModes *modes = (__GLcontextModes *) config;
-
- root = DefaultRootWindow(dpy);
- screen = DefaultScreen(dpy);
-
- /*
- * This pixmap is only used for a persistent XID.
- * The XC-MISC extension cleans up XIDs and reuses them transparently,
- * so we need to retain a server-side reference.
- */
- xid = XCreatePixmap(dpy, root, (unsigned int) 1,
- (unsigned int) 1, DefaultDepth(dpy, screen));
-
- if (None == xid) {
- *errorcode = BadAlloc;
- return true;
- }
-
- if (apple_glx_drawable_create(dpy, screen, xid, &d, &callbacks)) {
- *errorcode = BadAlloc;
- return true;
- }
-
- /* The lock is held in d from create onward. */
- pbuf = &d->types.pbuffer;
-
- pbuf->xid = xid;
- pbuf->width = width;
- pbuf->height = height;
-
- err = apple_cgl.create_pbuffer(width, height, GL_TEXTURE_RECTANGLE_EXT,
- (modes->alphaBits > 0) ? GL_RGBA : GL_RGB,
- 0, &pbuf->buffer_obj);
-
- if (kCGLNoError != err) {
- d->unlock(d);
- d->destroy(d);
- *errorcode = BadMatch;
- return true;
- }
-
- pbuf->fbconfigID = modes->fbconfigID;
-
- pbuf->event_mask = 0;
-
- *result = pbuf->xid;
-
- d->unlock(d);
-
- return false;
-}
-
-
-
-/* Return true if an error occurred. */
-static bool
-get_max_size(int *widthresult, int *heightresult)
-{
- CGLContextObj oldcontext;
- GLint ar[2];
-
- oldcontext = apple_cgl.get_current_context();
-
- if (!oldcontext) {
- /*
- * There is no current context, so we need to make one in order
- * to call glGetInteger.
- */
- CGLPixelFormatObj pfobj;
- CGLError err;
- CGLPixelFormatAttribute attr[10];
- int c = 0;
- GLint vsref = 0;
- CGLContextObj newcontext;
-
- attr[c++] = kCGLPFAColorSize;
- attr[c++] = 32;
- attr[c++] = 0;
-
- err = apple_cgl.choose_pixel_format(attr, &pfobj, &vsref);
- if (kCGLNoError != err) {
- if (getenv("LIBGL_DIAGNOSTIC")) {
- printf("choose_pixel_format error in %s: %s\n", __func__,
- apple_cgl.error_string(err));
- }
-
- return true;
- }
-
-
- err = apple_cgl.create_context(pfobj, NULL, &newcontext);
-
- if (kCGLNoError != err) {
- if (getenv("LIBGL_DIAGNOSTIC")) {
- printf("create_context error in %s: %s\n", __func__,
- apple_cgl.error_string(err));
- }
-
- apple_cgl.destroy_pixel_format(pfobj);
-
- return true;
- }
-
- err = apple_cgl.set_current_context(newcontext);
-
- if (kCGLNoError != err) {
- printf("set_current_context error in %s: %s\n", __func__,
- apple_cgl.error_string(err));
- return true;
- }
-
-
- glGetIntegerv(GL_MAX_VIEWPORT_DIMS, ar);
-
- apple_cgl.set_current_context(oldcontext);
- apple_cgl.destroy_context(newcontext);
- apple_cgl.destroy_pixel_format(pfobj);
- }
- else {
- /* We have a valid context. */
-
- glGetIntegerv(GL_MAX_VIEWPORT_DIMS, ar);
- }
-
- *widthresult = ar[0];
- *heightresult = ar[1];
-
- return false;
-}
-
-bool
-apple_glx_pbuffer_query(GLXPbuffer p, int attr, unsigned int *value)
-{
- bool result = false;
- struct apple_glx_drawable *d;
- struct apple_glx_pbuffer *pbuf;
-
- d = apple_glx_drawable_find_by_type(p, APPLE_GLX_DRAWABLE_PBUFFER,
- APPLE_GLX_DRAWABLE_LOCK);
-
- if (d) {
- pbuf = &d->types.pbuffer;
-
- switch (attr) {
- case GLX_WIDTH:
- *value = pbuf->width;
- result = true;
- break;
-
- case GLX_HEIGHT:
- *value = pbuf->height;
- result = true;
- break;
-
- case GLX_PRESERVED_CONTENTS:
- *value = true;
- result = true;
- break;
-
- case GLX_LARGEST_PBUFFER:{
- int width, height;
- if (get_max_size(&width, &height)) {
- fprintf(stderr, "internal error: "
- "unable to find the largest pbuffer!\n");
- }
- else {
- *value = width;
- result = true;
- }
- }
- break;
-
- case GLX_FBCONFIG_ID:
- *value = pbuf->fbconfigID;
- result = true;
- break;
- }
-
- d->unlock(d);
- }
-
- return result;
-}
-
-bool
-apple_glx_pbuffer_set_event_mask(GLXDrawable drawable, unsigned long mask)
-{
- struct apple_glx_drawable *d;
- bool result = false;
-
- d = apple_glx_drawable_find_by_type(drawable, APPLE_GLX_DRAWABLE_PBUFFER,
- APPLE_GLX_DRAWABLE_LOCK);
-
- if (d) {
- d->types.pbuffer.event_mask = mask;
- result = true;
- d->unlock(d);
- }
-
- return result;
-}
-
-bool
-apple_glx_pbuffer_get_event_mask(GLXDrawable drawable, unsigned long *mask)
-{
- struct apple_glx_drawable *d;
- bool result = false;
-
- d = apple_glx_drawable_find_by_type(drawable, APPLE_GLX_DRAWABLE_PBUFFER,
- APPLE_GLX_DRAWABLE_LOCK);
- if (d) {
- *mask = d->types.pbuffer.event_mask;
- result = true;
- d->unlock(d);
- }
-
- return result;
-}