1041b985dbb2f75aa492236d46ab47dbda8c2c74eJohn Reck/*
2041b985dbb2f75aa492236d46ab47dbda8c2c74eJohn Reck * Copyright (C) 2015 The Android Open Source Project
3041b985dbb2f75aa492236d46ab47dbda8c2c74eJohn Reck *
4041b985dbb2f75aa492236d46ab47dbda8c2c74eJohn Reck * Licensed under the Apache License, Version 2.0 (the "License");
5041b985dbb2f75aa492236d46ab47dbda8c2c74eJohn Reck * you may not use this file except in compliance with the License.
6041b985dbb2f75aa492236d46ab47dbda8c2c74eJohn Reck * You may obtain a copy of the License at
7041b985dbb2f75aa492236d46ab47dbda8c2c74eJohn Reck *
8041b985dbb2f75aa492236d46ab47dbda8c2c74eJohn Reck *      http://www.apache.org/licenses/LICENSE-2.0
9041b985dbb2f75aa492236d46ab47dbda8c2c74eJohn Reck *
10041b985dbb2f75aa492236d46ab47dbda8c2c74eJohn Reck * Unless required by applicable law or agreed to in writing, software
11041b985dbb2f75aa492236d46ab47dbda8c2c74eJohn Reck * distributed under the License is distributed on an "AS IS" BASIS,
12041b985dbb2f75aa492236d46ab47dbda8c2c74eJohn Reck * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13041b985dbb2f75aa492236d46ab47dbda8c2c74eJohn Reck * See the License for the specific language governing permissions and
14041b985dbb2f75aa492236d46ab47dbda8c2c74eJohn Reck * limitations under the License.
15041b985dbb2f75aa492236d46ab47dbda8c2c74eJohn Reck */
16041b985dbb2f75aa492236d46ab47dbda8c2c74eJohn Reck
17041b985dbb2f75aa492236d46ab47dbda8c2c74eJohn Reck#include <EGL/egl.h>
18041b985dbb2f75aa492236d46ab47dbda8c2c74eJohn Reck#include <EGL/eglext.h>
19041b985dbb2f75aa492236d46ab47dbda8c2c74eJohn Reck
20041b985dbb2f75aa492236d46ab47dbda8c2c74eJohn Reck#include <pthread.h>
21041b985dbb2f75aa492236d46ab47dbda8c2c74eJohn Reck#include <stdlib.h>
22041b985dbb2f75aa492236d46ab47dbda8c2c74eJohn Reck#include <string.h>
23041b985dbb2f75aa492236d46ab47dbda8c2c74eJohn Reck
241bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reckstatic EGLDisplay gDisplay = (EGLDisplay)1;
251bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reckstatic EGLSyncKHR gFence = (EGLSyncKHR)1;
26041b985dbb2f75aa492236d46ab47dbda8c2c74eJohn Reck
27041b985dbb2f75aa492236d46ab47dbda8c2c74eJohn Recktypedef struct {
28041b985dbb2f75aa492236d46ab47dbda8c2c74eJohn Reck    EGLSurface surface;
29041b985dbb2f75aa492236d46ab47dbda8c2c74eJohn Reck    EGLContext context;
30041b985dbb2f75aa492236d46ab47dbda8c2c74eJohn Reck} ThreadState;
31041b985dbb2f75aa492236d46ab47dbda8c2c74eJohn Reck
32041b985dbb2f75aa492236d46ab47dbda8c2c74eJohn Reckstatic pthread_key_t ThreadStateKey;
33041b985dbb2f75aa492236d46ab47dbda8c2c74eJohn Reckstatic pthread_once_t ThreadStateSetupOnce = PTHREAD_ONCE_INIT;
34041b985dbb2f75aa492236d46ab47dbda8c2c74eJohn Reck
35041b985dbb2f75aa492236d46ab47dbda8c2c74eJohn Reckstatic void destroyThreadState(void* state) {
36041b985dbb2f75aa492236d46ab47dbda8c2c74eJohn Reck    free(state);
37041b985dbb2f75aa492236d46ab47dbda8c2c74eJohn Reck}
38041b985dbb2f75aa492236d46ab47dbda8c2c74eJohn Reck
39041b985dbb2f75aa492236d46ab47dbda8c2c74eJohn Reckstatic void makeThreadState() {
40041b985dbb2f75aa492236d46ab47dbda8c2c74eJohn Reck    pthread_key_create(&ThreadStateKey, destroyThreadState);
41041b985dbb2f75aa492236d46ab47dbda8c2c74eJohn Reck}
42041b985dbb2f75aa492236d46ab47dbda8c2c74eJohn Reck
43041b985dbb2f75aa492236d46ab47dbda8c2c74eJohn ReckThreadState* getThreadState() {
44041b985dbb2f75aa492236d46ab47dbda8c2c74eJohn Reck    ThreadState* ptr;
45041b985dbb2f75aa492236d46ab47dbda8c2c74eJohn Reck    pthread_once(&ThreadStateSetupOnce, makeThreadState);
461bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck    if ((ptr = (ThreadState*)pthread_getspecific(ThreadStateKey)) == NULL) {
471bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck        ptr = (ThreadState*)calloc(1, sizeof(ThreadState));
48041b985dbb2f75aa492236d46ab47dbda8c2c74eJohn Reck        ptr->context = EGL_NO_CONTEXT;
49041b985dbb2f75aa492236d46ab47dbda8c2c74eJohn Reck        ptr->surface = EGL_NO_SURFACE;
50041b985dbb2f75aa492236d46ab47dbda8c2c74eJohn Reck        pthread_setspecific(ThreadStateKey, ptr);
51041b985dbb2f75aa492236d46ab47dbda8c2c74eJohn Reck    }
52041b985dbb2f75aa492236d46ab47dbda8c2c74eJohn Reck    return ptr;
53041b985dbb2f75aa492236d46ab47dbda8c2c74eJohn Reck}
54041b985dbb2f75aa492236d46ab47dbda8c2c74eJohn Reck
55041b985dbb2f75aa492236d46ab47dbda8c2c74eJohn ReckEGLint eglGetError(void) {
56041b985dbb2f75aa492236d46ab47dbda8c2c74eJohn Reck    return EGL_SUCCESS;
57041b985dbb2f75aa492236d46ab47dbda8c2c74eJohn Reck}
58041b985dbb2f75aa492236d46ab47dbda8c2c74eJohn Reck
59041b985dbb2f75aa492236d46ab47dbda8c2c74eJohn ReckEGLDisplay eglGetDisplay(EGLNativeDisplayType display_id) {
60041b985dbb2f75aa492236d46ab47dbda8c2c74eJohn Reck    return gDisplay;
61041b985dbb2f75aa492236d46ab47dbda8c2c74eJohn Reck}
62041b985dbb2f75aa492236d46ab47dbda8c2c74eJohn Reck
631bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John ReckEGLBoolean eglInitialize(EGLDisplay dpy, EGLint* major, EGLint* minor) {
64041b985dbb2f75aa492236d46ab47dbda8c2c74eJohn Reck    return EGL_TRUE;
65041b985dbb2f75aa492236d46ab47dbda8c2c74eJohn Reck}
66041b985dbb2f75aa492236d46ab47dbda8c2c74eJohn Reck
67041b985dbb2f75aa492236d46ab47dbda8c2c74eJohn ReckEGLBoolean eglTerminate(EGLDisplay dpy) {
68041b985dbb2f75aa492236d46ab47dbda8c2c74eJohn Reck    return EGL_TRUE;
69041b985dbb2f75aa492236d46ab47dbda8c2c74eJohn Reck}
70041b985dbb2f75aa492236d46ab47dbda8c2c74eJohn Reck
711bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reckconst char* eglQueryString(EGLDisplay dpy, EGLint name) {
7263cd1b4d1150e47d1aa9a2124772ecbd223054e4Chris Craik    if (name == EGL_EXTENSIONS) {
7363cd1b4d1150e47d1aa9a2124772ecbd223054e4Chris Craik        return "EGL_KHR_swap_buffers_with_damage";
7463cd1b4d1150e47d1aa9a2124772ecbd223054e4Chris Craik    }
75041b985dbb2f75aa492236d46ab47dbda8c2c74eJohn Reck    return "";
76041b985dbb2f75aa492236d46ab47dbda8c2c74eJohn Reck}
77041b985dbb2f75aa492236d46ab47dbda8c2c74eJohn Reck
781bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John ReckEGLBoolean eglChooseConfig(EGLDisplay dpy, const EGLint* attrib_list, EGLConfig* configs,
791bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck                           EGLint config_size, EGLint* num_config) {
80041b985dbb2f75aa492236d46ab47dbda8c2c74eJohn Reck    memset(configs, 9, sizeof(EGLConfig) * config_size);
81041b985dbb2f75aa492236d46ab47dbda8c2c74eJohn Reck    *num_config = config_size;
82041b985dbb2f75aa492236d46ab47dbda8c2c74eJohn Reck    return EGL_TRUE;
83041b985dbb2f75aa492236d46ab47dbda8c2c74eJohn Reck}
84041b985dbb2f75aa492236d46ab47dbda8c2c74eJohn Reck
851bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John ReckEGLSurface eglCreateWindowSurface(EGLDisplay dpy, EGLConfig config, EGLNativeWindowType win,
861bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck                                  const EGLint* attrib_list) {
871bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck    return (EGLSurface)malloc(sizeof(void*));
88041b985dbb2f75aa492236d46ab47dbda8c2c74eJohn Reck}
89041b985dbb2f75aa492236d46ab47dbda8c2c74eJohn Reck
901bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John ReckEGLSurface eglCreatePbufferSurface(EGLDisplay dpy, EGLConfig config, const EGLint* attrib_list) {
911bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck    return (EGLSurface)malloc(sizeof(void*));
92041b985dbb2f75aa492236d46ab47dbda8c2c74eJohn Reck}
93041b985dbb2f75aa492236d46ab47dbda8c2c74eJohn Reck
94041b985dbb2f75aa492236d46ab47dbda8c2c74eJohn ReckEGLBoolean eglDestroySurface(EGLDisplay dpy, EGLSurface surface) {
95041b985dbb2f75aa492236d46ab47dbda8c2c74eJohn Reck    free(surface);
96041b985dbb2f75aa492236d46ab47dbda8c2c74eJohn Reck    return EGL_TRUE;
97041b985dbb2f75aa492236d46ab47dbda8c2c74eJohn Reck}
98041b985dbb2f75aa492236d46ab47dbda8c2c74eJohn Reck
991bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John ReckEGLBoolean eglQuerySurface(EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLint* value) {
100041b985dbb2f75aa492236d46ab47dbda8c2c74eJohn Reck    *value = 1000;
101041b985dbb2f75aa492236d46ab47dbda8c2c74eJohn Reck    return EGL_TRUE;
102041b985dbb2f75aa492236d46ab47dbda8c2c74eJohn Reck}
103041b985dbb2f75aa492236d46ab47dbda8c2c74eJohn Reck
104041b985dbb2f75aa492236d46ab47dbda8c2c74eJohn ReckEGLBoolean eglReleaseThread(void) {
105041b985dbb2f75aa492236d46ab47dbda8c2c74eJohn Reck    return EGL_TRUE;
106041b985dbb2f75aa492236d46ab47dbda8c2c74eJohn Reck}
107041b985dbb2f75aa492236d46ab47dbda8c2c74eJohn Reck
1081bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John ReckEGLBoolean eglSurfaceAttrib(EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLint value) {
109041b985dbb2f75aa492236d46ab47dbda8c2c74eJohn Reck    return EGL_TRUE;
110041b985dbb2f75aa492236d46ab47dbda8c2c74eJohn Reck}
111041b985dbb2f75aa492236d46ab47dbda8c2c74eJohn Reck
112041b985dbb2f75aa492236d46ab47dbda8c2c74eJohn ReckEGLBoolean eglSwapInterval(EGLDisplay dpy, EGLint interval) {
113041b985dbb2f75aa492236d46ab47dbda8c2c74eJohn Reck    return EGL_TRUE;
114041b985dbb2f75aa492236d46ab47dbda8c2c74eJohn Reck}
115041b985dbb2f75aa492236d46ab47dbda8c2c74eJohn Reck
1161bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John ReckEGLContext eglCreateContext(EGLDisplay dpy, EGLConfig config, EGLContext share_context,
1171bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck                            const EGLint* attrib_list) {
1181bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck    return (EGLContext)malloc(sizeof(void*));
119041b985dbb2f75aa492236d46ab47dbda8c2c74eJohn Reck}
120041b985dbb2f75aa492236d46ab47dbda8c2c74eJohn ReckEGLBoolean eglDestroyContext(EGLDisplay dpy, EGLContext ctx) {
121041b985dbb2f75aa492236d46ab47dbda8c2c74eJohn Reck    free(ctx);
122041b985dbb2f75aa492236d46ab47dbda8c2c74eJohn Reck    return EGL_TRUE;
123041b985dbb2f75aa492236d46ab47dbda8c2c74eJohn Reck}
124041b985dbb2f75aa492236d46ab47dbda8c2c74eJohn Reck
1251bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John ReckEGLBoolean eglMakeCurrent(EGLDisplay dpy, EGLSurface draw, EGLSurface read, EGLContext ctx) {
126041b985dbb2f75aa492236d46ab47dbda8c2c74eJohn Reck    ThreadState* state = getThreadState();
127041b985dbb2f75aa492236d46ab47dbda8c2c74eJohn Reck    state->surface = draw;
128041b985dbb2f75aa492236d46ab47dbda8c2c74eJohn Reck    state->context = ctx;
129041b985dbb2f75aa492236d46ab47dbda8c2c74eJohn Reck    return EGL_TRUE;
130041b985dbb2f75aa492236d46ab47dbda8c2c74eJohn Reck}
131041b985dbb2f75aa492236d46ab47dbda8c2c74eJohn Reck
132041b985dbb2f75aa492236d46ab47dbda8c2c74eJohn ReckEGLContext eglGetCurrentContext(void) {
133041b985dbb2f75aa492236d46ab47dbda8c2c74eJohn Reck    return getThreadState()->context;
134041b985dbb2f75aa492236d46ab47dbda8c2c74eJohn Reck}
135041b985dbb2f75aa492236d46ab47dbda8c2c74eJohn Reck
136041b985dbb2f75aa492236d46ab47dbda8c2c74eJohn ReckEGLSurface eglGetCurrentSurface(EGLint readdraw) {
137041b985dbb2f75aa492236d46ab47dbda8c2c74eJohn Reck    return getThreadState()->surface;
138041b985dbb2f75aa492236d46ab47dbda8c2c74eJohn Reck}
139041b985dbb2f75aa492236d46ab47dbda8c2c74eJohn Reck
140041b985dbb2f75aa492236d46ab47dbda8c2c74eJohn ReckEGLDisplay eglGetCurrentDisplay(void) {
141041b985dbb2f75aa492236d46ab47dbda8c2c74eJohn Reck    return gDisplay;
142041b985dbb2f75aa492236d46ab47dbda8c2c74eJohn Reck}
143041b985dbb2f75aa492236d46ab47dbda8c2c74eJohn Reck
144041b985dbb2f75aa492236d46ab47dbda8c2c74eJohn ReckEGLBoolean eglSwapBuffers(EGLDisplay dpy, EGLSurface surface) {
145041b985dbb2f75aa492236d46ab47dbda8c2c74eJohn Reck    return EGL_TRUE;
146041b985dbb2f75aa492236d46ab47dbda8c2c74eJohn Reck}
147041b985dbb2f75aa492236d46ab47dbda8c2c74eJohn Reck
1481bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John ReckEGLBoolean eglSwapBuffersWithDamageKHR(EGLDisplay dpy, EGLSurface surface, EGLint* rects,
1491bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck                                       EGLint rectCount) {
15063cd1b4d1150e47d1aa9a2124772ecbd223054e4Chris Craik    return EGL_TRUE;
15163cd1b4d1150e47d1aa9a2124772ecbd223054e4Chris Craik}
15263cd1b4d1150e47d1aa9a2124772ecbd223054e4Chris Craik
1531bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John ReckEGLImageKHR eglCreateImageKHR(EGLDisplay dpy, EGLContext ctx, EGLenum target,
1541bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck                              EGLClientBuffer buffer, const EGLint* attrib_list) {
1551bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck    return (EGLImageKHR)malloc(sizeof(EGLImageKHR));
156041b985dbb2f75aa492236d46ab47dbda8c2c74eJohn Reck}
157041b985dbb2f75aa492236d46ab47dbda8c2c74eJohn Reck
1581bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John ReckEGLSyncKHR eglCreateSyncKHR(EGLDisplay dpy, EGLenum type, const EGLint* attrib_list) {
15983809fec686b47da73ee0aaa80d226de7e33aab9sergeyv    return gFence;
16083809fec686b47da73ee0aaa80d226de7e33aab9sergeyv}
16183809fec686b47da73ee0aaa80d226de7e33aab9sergeyv
16283809fec686b47da73ee0aaa80d226de7e33aab9sergeyvEGLBoolean eglDestroySyncKHR(EGLDisplay dpy, EGLSyncKHR sync) {
16383809fec686b47da73ee0aaa80d226de7e33aab9sergeyv    return EGL_TRUE;
16483809fec686b47da73ee0aaa80d226de7e33aab9sergeyv}
16583809fec686b47da73ee0aaa80d226de7e33aab9sergeyv
16683809fec686b47da73ee0aaa80d226de7e33aab9sergeyvEGLint eglClientWaitSyncKHR(EGLDisplay dpy, EGLSyncKHR sync, EGLint flags, EGLTimeKHR timeout) {
16783809fec686b47da73ee0aaa80d226de7e33aab9sergeyv    return EGL_CONDITION_SATISFIED_KHR;
16883809fec686b47da73ee0aaa80d226de7e33aab9sergeyv}
16983809fec686b47da73ee0aaa80d226de7e33aab9sergeyv
170041b985dbb2f75aa492236d46ab47dbda8c2c74eJohn ReckEGLBoolean eglDestroyImageKHR(EGLDisplay dpy, EGLImageKHR image) {
171041b985dbb2f75aa492236d46ab47dbda8c2c74eJohn Reck    free(image);
172041b985dbb2f75aa492236d46ab47dbda8c2c74eJohn Reck    return EGL_TRUE;
173041b985dbb2f75aa492236d46ab47dbda8c2c74eJohn Reck}
174041b985dbb2f75aa492236d46ab47dbda8c2c74eJohn Reck
175041b985dbb2f75aa492236d46ab47dbda8c2c74eJohn Reckvoid eglBeginFrame(EGLDisplay dpy, EGLSurface surface) {}
176