| /* |
| * 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) {} |