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