1a8fabd3f28abcca6ddc1a233189bd6deb98510fbJoe Gregorio/*
2a8fabd3f28abcca6ddc1a233189bd6deb98510fbJoe Gregorio * Copyright 2017 Google Inc.
3a8fabd3f28abcca6ddc1a233189bd6deb98510fbJoe Gregorio *
4a8fabd3f28abcca6ddc1a233189bd6deb98510fbJoe Gregorio * Use of this source code is governed by a BSD-style license that can be
5a8fabd3f28abcca6ddc1a233189bd6deb98510fbJoe Gregorio * found in the LICENSE file.
6a8fabd3f28abcca6ddc1a233189bd6deb98510fbJoe Gregorio */
7a8fabd3f28abcca6ddc1a233189bd6deb98510fbJoe Gregorio
8a8fabd3f28abcca6ddc1a233189bd6deb98510fbJoe Gregorio#include "fiddle_main.h"
9a8fabd3f28abcca6ddc1a233189bd6deb98510fbJoe Gregorio
10a8fabd3f28abcca6ddc1a233189bd6deb98510fbJoe Gregorio#include <EGL/egl.h>
1197b10ac4847fba563834911f35235aaf0299d0c8Joe Gregorio#include <GLES2/gl2.h>
12a8fabd3f28abcca6ddc1a233189bd6deb98510fbJoe Gregorio
13a8fabd3f28abcca6ddc1a233189bd6deb98510fbJoe Gregoriostatic const EGLint configAttribs[] = {
14a8fabd3f28abcca6ddc1a233189bd6deb98510fbJoe Gregorio    EGL_SURFACE_TYPE, EGL_PBUFFER_BIT,
15a8fabd3f28abcca6ddc1a233189bd6deb98510fbJoe Gregorio    EGL_BLUE_SIZE, 8,
16a8fabd3f28abcca6ddc1a233189bd6deb98510fbJoe Gregorio    EGL_GREEN_SIZE, 8,
17a8fabd3f28abcca6ddc1a233189bd6deb98510fbJoe Gregorio    EGL_RED_SIZE, 8,
18a8fabd3f28abcca6ddc1a233189bd6deb98510fbJoe Gregorio    EGL_DEPTH_SIZE, 8,
19a8fabd3f28abcca6ddc1a233189bd6deb98510fbJoe Gregorio    EGL_RENDERABLE_TYPE, EGL_OPENGL_BIT,
20a8fabd3f28abcca6ddc1a233189bd6deb98510fbJoe Gregorio    EGL_NONE
21a8fabd3f28abcca6ddc1a233189bd6deb98510fbJoe Gregorio};
22a8fabd3f28abcca6ddc1a233189bd6deb98510fbJoe Gregorio
23a8fabd3f28abcca6ddc1a233189bd6deb98510fbJoe Gregoriostatic const int pbufferWidth = 9;
24a8fabd3f28abcca6ddc1a233189bd6deb98510fbJoe Gregoriostatic const int pbufferHeight = 9;
25a8fabd3f28abcca6ddc1a233189bd6deb98510fbJoe Gregorio
26a8fabd3f28abcca6ddc1a233189bd6deb98510fbJoe Gregoriostatic const EGLint pbufferAttribs[] = {
27a8fabd3f28abcca6ddc1a233189bd6deb98510fbJoe Gregorio    EGL_WIDTH, pbufferWidth,
28a8fabd3f28abcca6ddc1a233189bd6deb98510fbJoe Gregorio    EGL_HEIGHT, pbufferHeight,
29a8fabd3f28abcca6ddc1a233189bd6deb98510fbJoe Gregorio    EGL_NONE,
30a8fabd3f28abcca6ddc1a233189bd6deb98510fbJoe Gregorio};
31a8fabd3f28abcca6ddc1a233189bd6deb98510fbJoe Gregorio
32a8fabd3f28abcca6ddc1a233189bd6deb98510fbJoe Gregorio// create_grcontext implementation for EGL.
3397b10ac4847fba563834911f35235aaf0299d0c8Joe Gregoriosk_sp<GrContext> create_grcontext(std::ostringstream &driverinfo) {
34a8fabd3f28abcca6ddc1a233189bd6deb98510fbJoe Gregorio    EGLDisplay eglDpy = eglGetDisplay(EGL_DEFAULT_DISPLAY);
35a8fabd3f28abcca6ddc1a233189bd6deb98510fbJoe Gregorio    if (EGL_NO_DISPLAY == eglDpy) {
36a8fabd3f28abcca6ddc1a233189bd6deb98510fbJoe Gregorio        return nullptr;
37a8fabd3f28abcca6ddc1a233189bd6deb98510fbJoe Gregorio    }
38a8fabd3f28abcca6ddc1a233189bd6deb98510fbJoe Gregorio
39a8fabd3f28abcca6ddc1a233189bd6deb98510fbJoe Gregorio    EGLint major, minor;
40a8fabd3f28abcca6ddc1a233189bd6deb98510fbJoe Gregorio    if (EGL_TRUE != eglInitialize(eglDpy, &major, &minor)) {
41a8fabd3f28abcca6ddc1a233189bd6deb98510fbJoe Gregorio        return nullptr;
42a8fabd3f28abcca6ddc1a233189bd6deb98510fbJoe Gregorio    }
43a8fabd3f28abcca6ddc1a233189bd6deb98510fbJoe Gregorio
44a8fabd3f28abcca6ddc1a233189bd6deb98510fbJoe Gregorio    EGLint numConfigs;
45a8fabd3f28abcca6ddc1a233189bd6deb98510fbJoe Gregorio    EGLConfig eglCfg;
46a8fabd3f28abcca6ddc1a233189bd6deb98510fbJoe Gregorio    if (EGL_TRUE != eglChooseConfig(eglDpy, configAttribs, &eglCfg, 1, &numConfigs)) {
47a8fabd3f28abcca6ddc1a233189bd6deb98510fbJoe Gregorio        return nullptr;
48a8fabd3f28abcca6ddc1a233189bd6deb98510fbJoe Gregorio    }
49a8fabd3f28abcca6ddc1a233189bd6deb98510fbJoe Gregorio
50a8fabd3f28abcca6ddc1a233189bd6deb98510fbJoe Gregorio    EGLSurface eglSurf = eglCreatePbufferSurface(eglDpy, eglCfg, pbufferAttribs);
51a8fabd3f28abcca6ddc1a233189bd6deb98510fbJoe Gregorio    if (EGL_NO_SURFACE == eglSurf) {
52a8fabd3f28abcca6ddc1a233189bd6deb98510fbJoe Gregorio        return nullptr;
53a8fabd3f28abcca6ddc1a233189bd6deb98510fbJoe Gregorio    }
54a8fabd3f28abcca6ddc1a233189bd6deb98510fbJoe Gregorio
55a8fabd3f28abcca6ddc1a233189bd6deb98510fbJoe Gregorio    if (EGL_TRUE != eglBindAPI(EGL_OPENGL_API)) {
56a8fabd3f28abcca6ddc1a233189bd6deb98510fbJoe Gregorio        return nullptr;
57a8fabd3f28abcca6ddc1a233189bd6deb98510fbJoe Gregorio    }
58a8fabd3f28abcca6ddc1a233189bd6deb98510fbJoe Gregorio
59a8fabd3f28abcca6ddc1a233189bd6deb98510fbJoe Gregorio    EGLContext eglCtx = eglCreateContext(eglDpy, eglCfg, EGL_NO_CONTEXT, NULL);
60a8fabd3f28abcca6ddc1a233189bd6deb98510fbJoe Gregorio    if (EGL_NO_CONTEXT == eglCtx) {
61a8fabd3f28abcca6ddc1a233189bd6deb98510fbJoe Gregorio        return nullptr;
62a8fabd3f28abcca6ddc1a233189bd6deb98510fbJoe Gregorio    }
63a8fabd3f28abcca6ddc1a233189bd6deb98510fbJoe Gregorio    if (EGL_FALSE == eglMakeCurrent(eglDpy, eglSurf, eglSurf, eglCtx)) {
64a8fabd3f28abcca6ddc1a233189bd6deb98510fbJoe Gregorio        return nullptr;
65a8fabd3f28abcca6ddc1a233189bd6deb98510fbJoe Gregorio    }
66a8fabd3f28abcca6ddc1a233189bd6deb98510fbJoe Gregorio
6797b10ac4847fba563834911f35235aaf0299d0c8Joe Gregorio    driverinfo << "EGL " << major << "." << minor << "\n";
6897b10ac4847fba563834911f35235aaf0299d0c8Joe Gregorio    GrGLGetStringProc getString = (GrGLGetStringProc )eglGetProcAddress("glGetString");
6997b10ac4847fba563834911f35235aaf0299d0c8Joe Gregorio    driverinfo << "GL Versionr: " << getString(GL_VERSION) << "\n";
7097b10ac4847fba563834911f35235aaf0299d0c8Joe Gregorio    driverinfo << "GL Vendor: " << getString(GL_VENDOR) << "\n";
7197b10ac4847fba563834911f35235aaf0299d0c8Joe Gregorio    driverinfo << "GL Renderer: " << getString(GL_RENDERER) << "\n";
7297b10ac4847fba563834911f35235aaf0299d0c8Joe Gregorio    driverinfo << "GL Extensions: " << getString(GL_EXTENSIONS) << "\n";
7397b10ac4847fba563834911f35235aaf0299d0c8Joe Gregorio
74a8fabd3f28abcca6ddc1a233189bd6deb98510fbJoe Gregorio    auto interface = GrGLCreateNativeInterface();
75a8fabd3f28abcca6ddc1a233189bd6deb98510fbJoe Gregorio    if (!interface) {
76a8fabd3f28abcca6ddc1a233189bd6deb98510fbJoe Gregorio        return nullptr;
77a8fabd3f28abcca6ddc1a233189bd6deb98510fbJoe Gregorio    }
78a8fabd3f28abcca6ddc1a233189bd6deb98510fbJoe Gregorio    eglTerminate(eglDpy);
79a8fabd3f28abcca6ddc1a233189bd6deb98510fbJoe Gregorio
80a8fabd3f28abcca6ddc1a233189bd6deb98510fbJoe Gregorio    return sk_sp<GrContext>(GrContext::Create(kOpenGL_GrBackend, (GrBackendContext)interface));
81a8fabd3f28abcca6ddc1a233189bd6deb98510fbJoe Gregorio}
82