Home | History | Annotate | Download | only in src
      1 /**************************************************************************
      2  *
      3  * Copyright (C) 2016 Red Hat Inc.
      4  *
      5  * Permission is hereby granted, free of charge, to any person obtaining a
      6  * copy of this software and associated documentation files (the "Software"),
      7  * to deal in the Software without restriction, including without limitation
      8  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
      9  * and/or sell copies of the Software, and to permit persons to whom the
     10  * Software is furnished to do so, subject to the following conditions:
     11  *
     12  * The above copyright notice and this permission notice shall be included
     13  * in all copies or substantial portions of the Software.
     14  *
     15  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
     16  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
     17  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
     18  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
     19  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
     20  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
     21  * OTHER DEALINGS IN THE SOFTWARE.
     22  *
     23  **************************************************************************/
     24 
     25 
     26 #ifdef HAVE_CONFIG_H
     27 #include "config.h"
     28 #endif
     29 
     30 #include <epoxy/glx.h>
     31 #include "virglrenderer.h"
     32 #include "virgl_glx.h"
     33 
     34 struct virgl_glx {
     35    Display *display;
     36    GLXFBConfig* fbConfigs;
     37    GLXPbuffer pbuffer;
     38 };
     39 
     40 struct virgl_glx *virgl_glx_init(void)
     41 {
     42    struct virgl_glx *d;
     43 
     44    d = malloc(sizeof(struct virgl_glx));
     45    if (!d)
     46       return NULL;
     47 
     48    d->display = XOpenDisplay(NULL);
     49 
     50    if (!d->display) {
     51       free(d);
     52       return NULL;
     53    }
     54 
     55    int visualAttribs[] = { None };
     56    int numberOfFramebufferConfigurations = 0;
     57 
     58    d->fbConfigs = glXChooseFBConfig(d->display, DefaultScreen(d->display),
     59                                     visualAttribs, &numberOfFramebufferConfigurations);
     60 
     61    int pbufferAttribs[] = {
     62       GLX_PBUFFER_WIDTH,  32,
     63       GLX_PBUFFER_HEIGHT, 32,
     64       None
     65    };
     66    d->pbuffer = glXCreatePbuffer(d->display, d->fbConfigs[0], pbufferAttribs);
     67 
     68    return d;
     69 }
     70 
     71 void virgl_glx_destroy(struct virgl_glx *d)
     72 {
     73    XFree(d->fbConfigs);
     74    glXDestroyPbuffer(d->display,d->pbuffer);
     75    XCloseDisplay(d->display);
     76    free(d);
     77 }
     78 
     79 virgl_renderer_gl_context virgl_glx_create_context(struct virgl_glx *d, struct virgl_gl_ctx_param *vparams)
     80 {
     81    int context_attribs[] = {
     82       GLX_CONTEXT_MAJOR_VERSION_ARB, vparams->major_ver,
     83       GLX_CONTEXT_MINOR_VERSION_ARB, vparams->minor_ver,
     84       None
     85    };
     86 
     87    GLXContext ctx =
     88       glXCreateContextAttribsARB(d->display, d->fbConfigs[0],
     89                                  vparams->shared ? glXGetCurrentContext() : NULL,
     90                                  True, context_attribs);
     91    return (virgl_renderer_gl_context)ctx;
     92 }
     93 
     94 void virgl_glx_destroy_context(struct virgl_glx *d, virgl_renderer_gl_context virglctx)
     95 {
     96    GLXContext ctx = (GLXContext)virglctx;
     97 
     98    glXDestroyContext(d->display,ctx);
     99 }
    100 
    101 int virgl_glx_make_context_current(struct virgl_glx *d, virgl_renderer_gl_context virglctx)
    102 {
    103    return glXMakeContextCurrent(d->display, d->pbuffer, d->pbuffer, virglctx);
    104 }
    105 
    106 virgl_renderer_gl_context virgl_glx_get_current_context(struct virgl_glx *d)
    107 {
    108    return glXGetCurrentContext();
    109 }
    110