1/*
2 * Copyright (C) 2015 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#include <EGL/egl.h>
18#include <EGL/eglext.h>
19
20#include <pthread.h>
21#include <stdlib.h>
22#include <string.h>
23
24static EGLDisplay gDisplay = (EGLDisplay) 1;
25
26typedef struct {
27    EGLSurface surface;
28    EGLContext context;
29} ThreadState;
30
31static pthread_key_t ThreadStateKey;
32static pthread_once_t ThreadStateSetupOnce = PTHREAD_ONCE_INIT;
33
34static void destroyThreadState(void* state) {
35    free(state);
36}
37
38static void makeThreadState() {
39    pthread_key_create(&ThreadStateKey, destroyThreadState);
40}
41
42ThreadState* getThreadState() {
43    ThreadState* ptr;
44    pthread_once(&ThreadStateSetupOnce, makeThreadState);
45    if ((ptr = (ThreadState*) pthread_getspecific(ThreadStateKey)) == NULL) {
46        ptr = (ThreadState*) calloc(1, sizeof(ThreadState));
47        ptr->context = EGL_NO_CONTEXT;
48        ptr->surface = EGL_NO_SURFACE;
49        pthread_setspecific(ThreadStateKey, ptr);
50    }
51    return ptr;
52}
53
54EGLint eglGetError(void) {
55    return EGL_SUCCESS;
56}
57
58EGLDisplay eglGetDisplay(EGLNativeDisplayType display_id) {
59    return gDisplay;
60}
61
62EGLBoolean eglInitialize(EGLDisplay dpy, EGLint *major, EGLint *minor) {
63    return EGL_TRUE;
64}
65
66EGLBoolean eglTerminate(EGLDisplay dpy) {
67    return EGL_TRUE;
68}
69
70const char * eglQueryString(EGLDisplay dpy, EGLint name) {
71    return "";
72}
73
74EGLBoolean eglChooseConfig(EGLDisplay dpy, const EGLint *attrib_list,
75               EGLConfig *configs, EGLint config_size,
76               EGLint *num_config) {
77    memset(configs, 9, sizeof(EGLConfig) * config_size);
78    *num_config = config_size;
79    return EGL_TRUE;
80}
81
82EGLSurface eglCreateWindowSurface(EGLDisplay dpy, EGLConfig config,
83                  EGLNativeWindowType win,
84                  const EGLint *attrib_list) {
85    return (EGLSurface) malloc(sizeof(void*));
86}
87
88EGLSurface eglCreatePbufferSurface(EGLDisplay dpy, EGLConfig config,
89                   const EGLint *attrib_list) {
90    return (EGLSurface) malloc(sizeof(void*));
91}
92
93EGLBoolean eglDestroySurface(EGLDisplay dpy, EGLSurface surface) {
94    free(surface);
95    return EGL_TRUE;
96}
97
98EGLBoolean eglQuerySurface(EGLDisplay dpy, EGLSurface surface,
99               EGLint attribute, EGLint *value) {
100    *value = 1000;
101    return EGL_TRUE;
102}
103
104EGLBoolean eglReleaseThread(void) {
105    return EGL_TRUE;
106}
107
108EGLBoolean eglSurfaceAttrib(EGLDisplay dpy, EGLSurface surface,
109                EGLint attribute, EGLint value) {
110    return EGL_TRUE;
111}
112
113EGLBoolean eglSwapInterval(EGLDisplay dpy, EGLint interval) {
114    return EGL_TRUE;
115}
116
117EGLContext eglCreateContext(EGLDisplay dpy, EGLConfig config,
118                EGLContext share_context,
119                const EGLint *attrib_list) {
120    return (EGLContext) malloc(sizeof(void*));
121}
122EGLBoolean eglDestroyContext(EGLDisplay dpy, EGLContext ctx) {
123    free(ctx);
124    return EGL_TRUE;
125}
126
127EGLBoolean eglMakeCurrent(EGLDisplay dpy, EGLSurface draw,
128              EGLSurface read, EGLContext ctx) {
129    ThreadState* state = getThreadState();
130    state->surface = draw;
131    state->context = ctx;
132    return EGL_TRUE;
133}
134
135EGLContext eglGetCurrentContext(void) {
136    return getThreadState()->context;
137}
138
139EGLSurface eglGetCurrentSurface(EGLint readdraw) {
140    return getThreadState()->surface;
141}
142
143EGLDisplay eglGetCurrentDisplay(void) {
144    return gDisplay;
145}
146
147EGLBoolean eglSwapBuffers(EGLDisplay dpy, EGLSurface surface) {
148    return EGL_TRUE;
149}
150
151EGLImageKHR eglCreateImageKHR(EGLDisplay dpy, EGLContext ctx, EGLenum target, EGLClientBuffer buffer, const EGLint *attrib_list) {
152    return (EGLImageKHR) malloc(sizeof(EGLImageKHR));
153}
154
155EGLBoolean eglDestroyImageKHR(EGLDisplay dpy, EGLImageKHR image) {
156    free(image);
157    return EGL_TRUE;
158}
159
160void eglBeginFrame(EGLDisplay dpy, EGLSurface surface) {}
161