gbm-sdl2-example

annotate src/test.cc @ 0:665119a0580e

example program that uses gbm buffers
author Eleni Maria Stea <eleni@mutantstargoat.com>
date Wed, 04 Jul 2018 22:16:23 +0300
parents
children
rev   line source
eleni@0 1 #include <errno.h>
eleni@0 2 #include <stdio.h>
eleni@0 3 #include <stdlib.h>
eleni@0 4 #include <string.h>
eleni@0 5
eleni@0 6 #include <SDL2/SDL.h>
eleni@0 7 #include <GLES2/gl2.h>
eleni@0 8 #include <EGL/egl.h>
eleni@0 9 #include <EGL/eglext.h>
eleni@0 10 #include <EGL/eglplatform.h>
eleni@0 11 #include <KHR/khrplatform.h>
eleni@0 12 #include <gbm.h>
eleni@0 13
eleni@0 14 #include <fcntl.h>
eleni@0 15 #include <fnmatch.h>
eleni@0 16 #include <sys/stat.h>
eleni@0 17 #include <stdio.h>
eleni@0 18 #include <stdlib.h>
eleni@0 19 #include <unistd.h>
eleni@0 20 #include <assert.h>
eleni@0 21 #include <errno.h>
eleni@0 22 #include <libudev.h>
eleni@0 23
eleni@0 24 #include "drmtest.h"
eleni@0 25
eleni@0 26 int fd = -1;
eleni@0 27 static struct gbm_device *gbm_dev;
eleni@0 28 struct gbm_bo *bo;
eleni@0 29 struct gbm_surface *gbm_surf;
eleni@0 30
eleni@0 31 int main(int argc, char **argv)
eleni@0 32 {
eleni@0 33 // if((fd = open("/dev/dri/card0", O_RDWR) == -1)) {
eleni@0 34 // fprintf(stderr, "can't open device: %s\n", strerror(errno));
eleni@0 35 // exit(1);
eleni@0 36 // }
eleni@0 37 if((fd = drm_open_any()) == - 1) {
eleni@0 38 fprintf(stderr, "can't open device: %s\n", strerror(errno));
eleni@0 39 exit(1);
eleni@0 40 }
eleni@0 41
eleni@0 42 printf("fd: %d\n", fd);
eleni@0 43
eleni@0 44 if(!(gbm_dev = gbm_create_device(fd))) {
eleni@0 45 fprintf(stderr, "can't create gbm device: %s\n", strerror(errno));
eleni@0 46 exit(1);
eleni@0 47 }
eleni@0 48
eleni@0 49 if(!(gbm_surf = gbm_surface_create(gbm_dev, 640, 480, GBM_BO_FORMAT_XRGB8888, GBM_BO_USE_SCANOUT | GBM_BO_USE_RENDERING))) {
eleni@0 50 fprintf(stderr, "can't create gbm surface: %s\n", strerror(errno));
eleni@0 51 exit(1);
eleni@0 52 }
eleni@0 53
eleni@0 54 EGLDisplay dpy;
eleni@0 55 dpy = eglGetDisplay((_XDisplay*)gbm_dev);
eleni@0 56 EGLint major, minor;
eleni@0 57
eleni@0 58 //const char *ver;
eleni@0 59 const char *extensions;
eleni@0 60 eglInitialize(dpy, &major, &minor);
eleni@0 61 //ver = eglQueryString(dpy, EGL_VERSION);
eleni@0 62 extensions = eglQueryString(dpy, EGL_EXTENSIONS);
eleni@0 63
eleni@0 64 if (!strstr(extensions, "EGL_KHR_surfaceless_context")) {
eleni@0 65 fprintf(stderr, "no surfaceless support, cannot initialize\n");
eleni@0 66 exit(1);
eleni@0 67 }
eleni@0 68
eleni@0 69 SDL_Window *win;
eleni@0 70 SDL_GLContext ctx;
eleni@0 71
eleni@0 72 if(SDL_Init(SDL_INIT_VIDEO) == -1) {
eleni@0 73 fprintf(stderr, "failed to initialize sdl\n");
eleni@0 74 return 1;
eleni@0 75 }
eleni@0 76
eleni@0 77 SDL_GL_SetAttribute(SDL_GL_CONTEXT_EGL, 1);
eleni@0 78 SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 2);
eleni@0 79 SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 0);
eleni@0 80 SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 8);
eleni@0 81 SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 8);
eleni@0 82 SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 8);
eleni@0 83 SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 24);
eleni@0 84 SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
eleni@0 85 //SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_ES);
eleni@0 86
eleni@0 87 if(!(bo = gbm_bo_create(gbm_dev, 640, 480, GBM_BO_FORMAT_XRGB8888, GBM_BO_USE_SCANOUT | GBM_BO_USE_RENDERING))) {
eleni@0 88 fprintf(stderr, "Unable to create gbm buffer object!\n");
eleni@0 89 }
eleni@0 90
eleni@0 91 win = SDL_CreateWindow("foo", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 640, 480,
eleni@0 92 SDL_WINDOW_OPENGL | SDL_WINDOW_SHOWN);
eleni@0 93
eleni@0 94 if(!win) {
eleni@0 95 fprintf(stderr, "failed to create window: %s\n", SDL_GetError());
eleni@0 96 return 1;
eleni@0 97 }
eleni@0 98
eleni@0 99 if(!(ctx = SDL_GL_CreateContext(win))) {
eleni@0 100 fprintf(stderr, "failed to create OpenGL context: %s\n", SDL_GetError());
eleni@0 101 return 1;
eleni@0 102 }
eleni@0 103
eleni@0 104 glClearColor(1.0, 0.0, 0.0, 1.0);
eleni@0 105 glClear(GL_COLOR_BUFFER_BIT);
eleni@0 106
eleni@0 107 SDL_GL_SwapWindow(win);
eleni@0 108 SDL_Delay(5000);
eleni@0 109
eleni@0 110 gbm_device_destroy(gbm_dev);
eleni@0 111 SDL_GL_DeleteContext(win);
eleni@0 112 SDL_DestroyWindow(win);
eleni@0 113 SDL_Quit();
eleni@0 114 return 0;
eleni@0 115 }