src/video/wayland/SDL_waylandopengles.c
author Sam Lantinga <slouken@libsdl.org>
Wed, 02 Aug 2017 10:22:48 -0700
changeset 11175 cbc6a8a5b701
parent 10737 3406a0f8b041
child 11811 5d94cb6b24d3
permissions -rw-r--r--
Fixed bug 3690 - SDL2 KMS/DRM render context support

Manuel

The attached patch adds support for KMS/DRM context graphics.

It builds with no problem on X86_64 GNU/Linux systems, provided the needed libraries are present, and on ARM GNU/Linux systems that have KMS/DRM support and a GLES2 implementation.
Tested on Raspberry Pi: KMS/DRM is what the Raspberry Pi will use as default in the near future, once the propietary DispmanX API by Broadcom is overtaken by open graphics stack, it's possible to boot current Raspbian system in KMS mode by adding "dtoverlay=vc4-kms-v3d" to config.txt on Raspbian's boot partition.
X86 systems use KMS right away in every current GNU/Linux system.

Simple build instructions:

$./autogen.sh
$./configure --enable-video-kmsdrm
$make
gabomdq@8062
     1
/*
gabomdq@8062
     2
  Simple DirectMedia Layer
slouken@10737
     3
  Copyright (C) 1997-2017 Sam Lantinga <slouken@libsdl.org>
gabomdq@8062
     4
gabomdq@8062
     5
  This software is provided 'as-is', without any express or implied
gabomdq@8062
     6
  warranty.  In no event will the authors be held liable for any damages
gabomdq@8062
     7
  arising from the use of this software.
gabomdq@8062
     8
gabomdq@8062
     9
  Permission is granted to anyone to use this software for any purpose,
gabomdq@8062
    10
  including commercial applications, and to alter it and redistribute it
gabomdq@8062
    11
  freely, subject to the following restrictions:
gabomdq@8062
    12
gabomdq@8062
    13
  1. The origin of this software must not be misrepresented; you must not
gabomdq@8062
    14
     claim that you wrote the original software. If you use this software
gabomdq@8062
    15
     in a product, an acknowledgment in the product documentation would be
gabomdq@8062
    16
     appreciated but is not required.
gabomdq@8062
    17
  2. Altered source versions must be plainly marked as such, and must not be
gabomdq@8062
    18
     misrepresented as being the original software.
gabomdq@8062
    19
  3. This notice may not be removed or altered from any source distribution.
gabomdq@8062
    20
*/
gabomdq@8104
    21
#include "../../SDL_internal.h"
gabomdq@8062
    22
gabomdq@8062
    23
#if SDL_VIDEO_DRIVER_WAYLAND && SDL_VIDEO_OPENGL_EGL
gabomdq@8062
    24
gabomdq@8062
    25
#include "SDL_waylandvideo.h"
gabomdq@8062
    26
#include "SDL_waylandopengles.h"
gabomdq@8062
    27
#include "SDL_waylandwindow.h"
gabomdq@8062
    28
#include "SDL_waylandevents_c.h"
gabomdq@8104
    29
#include "SDL_waylanddyn.h"
gabomdq@8062
    30
gabomdq@8062
    31
/* EGL implementation of SDL OpenGL ES support */
gabomdq@8062
    32
gabomdq@8062
    33
int
gabomdq@8062
    34
Wayland_GLES_LoadLibrary(_THIS, const char *path) {
gabomdq@8062
    35
    int ret;
gabomdq@8062
    36
    SDL_VideoData *data = (SDL_VideoData *) _this->driverdata;
gabomdq@8062
    37
    
slouken@11175
    38
    ret = SDL_EGL_LoadLibrary(_this, path, (NativeDisplayType) data->display, 0);
gabomdq@8062
    39
gabomdq@8062
    40
    Wayland_PumpEvents(_this);
gabomdq@8104
    41
    WAYLAND_wl_display_flush(data->display);
gabomdq@8062
    42
    
gabomdq@8062
    43
    return ret;
gabomdq@8062
    44
}
gabomdq@8062
    45
gabomdq@8062
    46
gabomdq@8062
    47
SDL_GLContext
gabomdq@8062
    48
Wayland_GLES_CreateContext(_THIS, SDL_Window * window)
gabomdq@8062
    49
{
gabomdq@8062
    50
    SDL_GLContext context;
gabomdq@8062
    51
    context = SDL_EGL_CreateContext(_this, ((SDL_WindowData *) window->driverdata)->egl_surface);
gabomdq@8104
    52
    WAYLAND_wl_display_flush( ((SDL_VideoData*)_this->driverdata)->display );
gabomdq@8062
    53
    
gabomdq@8062
    54
    return context;
gabomdq@8062
    55
}
gabomdq@8062
    56
slouken@10695
    57
int
gabomdq@8062
    58
Wayland_GLES_SwapWindow(_THIS, SDL_Window *window)
gabomdq@8062
    59
{
slouken@10695
    60
    if (SDL_EGL_SwapBuffers(_this, ((SDL_WindowData *) window->driverdata)->egl_surface) < 0) {
slouken@10695
    61
        return -1;
slouken@10695
    62
    }
gabomdq@8104
    63
    WAYLAND_wl_display_flush( ((SDL_VideoData*)_this->driverdata)->display );
slouken@10695
    64
    return 0;
gabomdq@8062
    65
}
gabomdq@8062
    66
gabomdq@8062
    67
int
gabomdq@8062
    68
Wayland_GLES_MakeCurrent(_THIS, SDL_Window * window, SDL_GLContext context)
gabomdq@8062
    69
{
gabomdq@8062
    70
    int ret;
gabomdq@8062
    71
    
gabomdq@8062
    72
    if (window && context) {
gabomdq@8062
    73
        ret = SDL_EGL_MakeCurrent(_this, ((SDL_WindowData *) window->driverdata)->egl_surface, context);
gabomdq@8062
    74
    }
gabomdq@8062
    75
    else {
gabomdq@8062
    76
        ret = SDL_EGL_MakeCurrent(_this, NULL, NULL);
gabomdq@8062
    77
    }
gabomdq@8062
    78
    
gabomdq@8104
    79
    WAYLAND_wl_display_flush( ((SDL_VideoData*)_this->driverdata)->display );
gabomdq@8062
    80
    
gabomdq@8062
    81
    return ret;
gabomdq@8062
    82
}
gabomdq@8062
    83
gabomdq@8062
    84
void 
gabomdq@8062
    85
Wayland_GLES_DeleteContext(_THIS, SDL_GLContext context)
gabomdq@8062
    86
{
gabomdq@8062
    87
    SDL_EGL_DeleteContext(_this, context);
gabomdq@8104
    88
    WAYLAND_wl_display_flush( ((SDL_VideoData*)_this->driverdata)->display );
gabomdq@8062
    89
}
gabomdq@8062
    90
gabomdq@8062
    91
#endif /* SDL_VIDEO_DRIVER_WAYLAND && SDL_VIDEO_OPENGL_EGL */
gabomdq@8062
    92
slouken@8149
    93
/* vi: set ts=4 sw=4 expandtab: */