/* * Copyright (C) 2015 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include <EGL/egl.h> #include <EGL/eglext.h> #include <pthread.h> #include <stdlib.h> #include <string.h> static EGLDisplay gDisplay = (EGLDisplay)1; static EGLSyncKHR gFence = (EGLSyncKHR)1; typedef struct { EGLSurface surface; EGLContext context; } ThreadState; static pthread_key_t ThreadStateKey; static pthread_once_t ThreadStateSetupOnce = PTHREAD_ONCE_INIT; static void destroyThreadState(void* state) { free(state); } static void makeThreadState() { pthread_key_create(&ThreadStateKey, destroyThreadState); } ThreadState* getThreadState() { ThreadState* ptr; pthread_once(&ThreadStateSetupOnce, makeThreadState); if ((ptr = (ThreadState*)pthread_getspecific(ThreadStateKey)) == NULL) { ptr = (ThreadState*)calloc(1, sizeof(ThreadState)); ptr->context = EGL_NO_CONTEXT; ptr->surface = EGL_NO_SURFACE; pthread_setspecific(ThreadStateKey, ptr); } return ptr; } EGLint eglGetError(void) { return EGL_SUCCESS; } EGLDisplay eglGetDisplay(EGLNativeDisplayType display_id) { return gDisplay; } EGLBoolean eglInitialize(EGLDisplay dpy, EGLint* major, EGLint* minor) { return EGL_TRUE; } EGLBoolean eglTerminate(EGLDisplay dpy) { return EGL_TRUE; } const char* eglQueryString(EGLDisplay dpy, EGLint name) { if (name == EGL_EXTENSIONS) { return "EGL_KHR_swap_buffers_with_damage"; } return ""; } EGLBoolean eglChooseConfig(EGLDisplay dpy, const EGLint* attrib_list, EGLConfig* configs, EGLint config_size, EGLint* num_config) { memset(configs, 9, sizeof(EGLConfig) * config_size); *num_config = config_size; return EGL_TRUE; } EGLSurface eglCreateWindowSurface(EGLDisplay dpy, EGLConfig config, EGLNativeWindowType win, const EGLint* attrib_list) { return (EGLSurface)malloc(sizeof(void*)); } EGLSurface eglCreatePbufferSurface(EGLDisplay dpy, EGLConfig config, const EGLint* attrib_list) { return (EGLSurface)malloc(sizeof(void*)); } EGLBoolean eglDestroySurface(EGLDisplay dpy, EGLSurface surface) { free(surface); return EGL_TRUE; } EGLBoolean eglQuerySurface(EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLint* value) { *value = 1000; return EGL_TRUE; } EGLBoolean eglReleaseThread(void) { return EGL_TRUE; } EGLBoolean eglSurfaceAttrib(EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLint value) { return EGL_TRUE; } EGLBoolean eglSwapInterval(EGLDisplay dpy, EGLint interval) { return EGL_TRUE; } EGLContext eglCreateContext(EGLDisplay dpy, EGLConfig config, EGLContext share_context, const EGLint* attrib_list) { return (EGLContext)malloc(sizeof(void*)); } EGLBoolean eglDestroyContext(EGLDisplay dpy, EGLContext ctx) { free(ctx); return EGL_TRUE; } EGLBoolean eglMakeCurrent(EGLDisplay dpy, EGLSurface draw, EGLSurface read, EGLContext ctx) { ThreadState* state = getThreadState(); state->surface = draw; state->context = ctx; return EGL_TRUE; } EGLContext eglGetCurrentContext(void) { return getThreadState()->context; } EGLSurface eglGetCurrentSurface(EGLint readdraw) { return getThreadState()->surface; } EGLDisplay eglGetCurrentDisplay(void) { return gDisplay; } EGLBoolean eglSwapBuffers(EGLDisplay dpy, EGLSurface surface) { return EGL_TRUE; } EGLBoolean eglSwapBuffersWithDamageKHR(EGLDisplay dpy, EGLSurface surface, EGLint* rects, EGLint rectCount) { return EGL_TRUE; } EGLImageKHR eglCreateImageKHR(EGLDisplay dpy, EGLContext ctx, EGLenum target, EGLClientBuffer buffer, const EGLint* attrib_list) { return (EGLImageKHR)malloc(sizeof(EGLImageKHR)); } EGLSyncKHR eglCreateSyncKHR(EGLDisplay dpy, EGLenum type, const EGLint* attrib_list) { return gFence; } EGLBoolean eglDestroySyncKHR(EGLDisplay dpy, EGLSyncKHR sync) { return EGL_TRUE; } EGLint eglClientWaitSyncKHR(EGLDisplay dpy, EGLSyncKHR sync, EGLint flags, EGLTimeKHR timeout) { return EGL_CONDITION_SATISFIED_KHR; } EGLBoolean eglDestroyImageKHR(EGLDisplay dpy, EGLImageKHR image) { free(image); return EGL_TRUE; } void eglBeginFrame(EGLDisplay dpy, EGLSurface surface) {}