src/video/mir/SDL_miropengl.c
author Ryan C. Gordon <icculus@icculus.org>
Sun, 02 Feb 2014 23:54:10 -0500
changeset 8154 ea6b25de67b6
parent 8153 3e43c73ac79b
child 8157 f5d262613ed2
permissions -rw-r--r--
Cleaned up headers and footers on Mir code.
icculus@8153
     1
/*
icculus@8153
     2
  Simple DirectMedia Layer
icculus@8153
     3
  Copyright (C) 1997-2013 Sam Lantinga <slouken@libsdl.org>
icculus@8153
     4
icculus@8153
     5
  This software is provided 'as-is', without any express or implied
icculus@8153
     6
  warranty.  In no event will the authors be held liable for any damages
icculus@8153
     7
  arising from the use of this software.
icculus@8153
     8
icculus@8153
     9
  Permission is granted to anyone to use this software for any purpose,
icculus@8153
    10
  including commercial applications, and to alter it and redistribute it
icculus@8153
    11
  freely, subject to the following restrictions:
icculus@8153
    12
icculus@8153
    13
  1. The origin of this software must not be misrepresented; you must not
icculus@8153
    14
     claim that you wrote the original software. If you use this software
icculus@8153
    15
     in a product, an acknowledgment in the product documentation would be
icculus@8153
    16
     appreciated but is not required.
icculus@8153
    17
  2. Altered source versions must be plainly marked as such, and must not be
icculus@8153
    18
     misrepresented as being the original software.
icculus@8153
    19
  3. This notice may not be removed or altered from any source distribution.
icculus@8153
    20
*/
icculus@8153
    21
icculus@8153
    22
/*
icculus@8153
    23
  Contributed by Brandon Schaefer, <brandon.schaefer@canonical.com>
icculus@8153
    24
*/
icculus@8153
    25
icculus@8154
    26
#include "../../SDL_internal.h"
icculus@8154
    27
icculus@8154
    28
#if SDL_VIDEO_DRIVER_MIR
icculus@8154
    29
icculus@8153
    30
#include "SDL_miropengl.h"
icculus@8153
    31
icculus@8153
    32
#include <dlfcn.h>
icculus@8153
    33
icculus@8153
    34
#define DEFAULT_OGL_ES2 "libGLESv2.so"
icculus@8153
    35
icculus@8153
    36
void* MIR_GLHandle = NULL;
icculus@8153
    37
icculus@8153
    38
void
icculus@8153
    39
MIR_GL_SwapWindow(_THIS, SDL_Window* window)
icculus@8153
    40
{
icculus@8153
    41
    MIR_Window* mir_wind = window->driverdata;
icculus@8153
    42
icculus@8153
    43
    SDL_EGL_SwapBuffers(_this, mir_wind->egl_surface);
icculus@8153
    44
}
icculus@8153
    45
icculus@8153
    46
int
icculus@8153
    47
MIR_GL_MakeCurrent(_THIS, SDL_Window* window, SDL_GLContext context)
icculus@8153
    48
{
icculus@8153
    49
  if (window) {
icculus@8153
    50
      EGLSurface egl_surface = ((MIR_Window*)window->driverdata)->egl_surface;
icculus@8153
    51
      return SDL_EGL_MakeCurrent(_this, egl_surface, context);
icculus@8153
    52
  }
icculus@8153
    53
icculus@8153
    54
  return SDL_EGL_MakeCurrent(_this, NULL, NULL);
icculus@8153
    55
}
icculus@8153
    56
icculus@8153
    57
SDL_GLContext
icculus@8153
    58
MIR_GL_CreateContext(_THIS, SDL_Window* window)
icculus@8153
    59
{
icculus@8153
    60
    MIR_Window* mir_window = window->driverdata;
icculus@8153
    61
icculus@8153
    62
    SDL_GLContext context;
icculus@8153
    63
    context = SDL_EGL_CreateContext(_this, mir_window->egl_surface);
icculus@8153
    64
icculus@8153
    65
    return context;
icculus@8153
    66
}
icculus@8153
    67
icculus@8153
    68
int
icculus@8153
    69
MIR_GL_LoadLibrary(_THIS, const char* path)
icculus@8153
    70
{
icculus@8153
    71
    MIR_Data* mir_data = _this->driverdata;
icculus@8153
    72
icculus@8153
    73
    SDL_EGL_LoadLibrary(_this, path,
icculus@8153
    74
                        mir_connection_get_egl_native_display(mir_data->connection));
icculus@8153
    75
icculus@8153
    76
    SDL_EGL_ChooseConfig(_this);
icculus@8153
    77
icculus@8153
    78
    return 0;
icculus@8153
    79
}
icculus@8153
    80
icculus@8153
    81
void
icculus@8153
    82
MIR_GL_UnloadLibrary(_THIS)
icculus@8153
    83
{
icculus@8153
    84
    SDL_EGL_UnloadLibrary(_this);
icculus@8153
    85
icculus@8153
    86
    if (MIR_GLHandle) {
icculus@8153
    87
        dlclose(MIR_GLHandle);
icculus@8153
    88
        MIR_GLHandle = NULL;
icculus@8153
    89
    }
icculus@8153
    90
}
icculus@8153
    91
icculus@8153
    92
void
icculus@8153
    93
Ensure_GL_HandleOpen()
icculus@8153
    94
{
icculus@8153
    95
    if (!MIR_GLHandle) {
icculus@8153
    96
        MIR_GLHandle = dlopen(DEFAULT_OGL_ES2, RTLD_GLOBAL);
icculus@8153
    97
        if (!MIR_GLHandle) {
icculus@8153
    98
            SDL_SetError("Failed to dlopen library.");
icculus@8153
    99
        }
icculus@8153
   100
    }
icculus@8153
   101
}
icculus@8153
   102
icculus@8153
   103
void*
icculus@8153
   104
MIR_GL_GetProcAddress(_THIS, const char* proc)
icculus@8153
   105
{
icculus@8153
   106
    void* proc_addr = eglGetProcAddress(proc);
icculus@8153
   107
icculus@8153
   108
    /* FIXME when on the phone/tablet eglGetProcAddress returns NULL through libhybris,
icculus@8153
   109
       seems to be a problem in android. Also looks like a problem in the android video driver:
icculus@8153
   110
       src/video/android/SDL_androidgl.c
icculus@8153
   111
icculus@8153
   112
       Workaround, to just get the address ourself
icculus@8153
   113
    */
icculus@8153
   114
icculus@8153
   115
    if (!proc_addr) {
icculus@8153
   116
        Ensure_GL_HandleOpen();
icculus@8153
   117
        proc_addr = dlsym(MIR_GLHandle, proc);
icculus@8153
   118
    }
icculus@8153
   119
icculus@8153
   120
    if (!proc_addr) {
icculus@8153
   121
        SDL_SetError("Failed to find proc address!");
icculus@8153
   122
    }
icculus@8153
   123
icculus@8153
   124
    return proc_addr;
icculus@8153
   125
}
icculus@8154
   126
icculus@8154
   127
#endif /* SDL_VIDEO_DRIVER_MIR */
icculus@8154
   128
icculus@8154
   129
/* vi: set ts=4 sw=4 expandtab: */