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 24 static EGLDisplay gDisplay = (EGLDisplay)1; 25 static EGLSyncKHR gFence = (EGLSyncKHR)1; 26 27 typedef struct { 28 EGLSurface surface; 29 EGLContext context; 30 } ThreadState; 31 32 static pthread_key_t ThreadStateKey; 33 static pthread_once_t ThreadStateSetupOnce = PTHREAD_ONCE_INIT; 34 35 static void destroyThreadState(void* state) { 36 free(state); 37 } 38 39 static void makeThreadState() { 40 pthread_key_create(&ThreadStateKey, destroyThreadState); 41 } 42 43 ThreadState* getThreadState() { 44 ThreadState* ptr; 45 pthread_once(&ThreadStateSetupOnce, makeThreadState); 46 if ((ptr = (ThreadState*)pthread_getspecific(ThreadStateKey)) == NULL) { 47 ptr = (ThreadState*)calloc(1, sizeof(ThreadState)); 48 ptr->context = EGL_NO_CONTEXT; 49 ptr->surface = EGL_NO_SURFACE; 50 pthread_setspecific(ThreadStateKey, ptr); 51 } 52 return ptr; 53 } 54 55 EGLint eglGetError(void) { 56 return EGL_SUCCESS; 57 } 58 59 EGLDisplay eglGetDisplay(EGLNativeDisplayType display_id) { 60 return gDisplay; 61 } 62 63 EGLBoolean eglInitialize(EGLDisplay dpy, EGLint* major, EGLint* minor) { 64 return EGL_TRUE; 65 } 66 67 EGLBoolean eglTerminate(EGLDisplay dpy) { 68 return EGL_TRUE; 69 } 70 71 const char* eglQueryString(EGLDisplay dpy, EGLint name) { 72 if (name == EGL_EXTENSIONS) { 73 return "EGL_KHR_swap_buffers_with_damage"; 74 } 75 return ""; 76 } 77 78 EGLBoolean eglChooseConfig(EGLDisplay dpy, const EGLint* attrib_list, EGLConfig* configs, 79 EGLint config_size, EGLint* num_config) { 80 memset(configs, 9, sizeof(EGLConfig) * config_size); 81 *num_config = config_size; 82 return EGL_TRUE; 83 } 84 85 EGLSurface eglCreateWindowSurface(EGLDisplay dpy, EGLConfig config, EGLNativeWindowType win, 86 const EGLint* attrib_list) { 87 return (EGLSurface)malloc(sizeof(void*)); 88 } 89 90 EGLSurface eglCreatePbufferSurface(EGLDisplay dpy, EGLConfig config, const EGLint* attrib_list) { 91 return (EGLSurface)malloc(sizeof(void*)); 92 } 93 94 EGLBoolean eglDestroySurface(EGLDisplay dpy, EGLSurface surface) { 95 free(surface); 96 return EGL_TRUE; 97 } 98 99 EGLBoolean eglQuerySurface(EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLint* value) { 100 *value = 1000; 101 return EGL_TRUE; 102 } 103 104 EGLBoolean eglReleaseThread(void) { 105 return EGL_TRUE; 106 } 107 108 EGLBoolean eglSurfaceAttrib(EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLint value) { 109 return EGL_TRUE; 110 } 111 112 EGLBoolean eglSwapInterval(EGLDisplay dpy, EGLint interval) { 113 return EGL_TRUE; 114 } 115 116 EGLContext eglCreateContext(EGLDisplay dpy, EGLConfig config, EGLContext share_context, 117 const EGLint* attrib_list) { 118 return (EGLContext)malloc(sizeof(void*)); 119 } 120 EGLBoolean eglDestroyContext(EGLDisplay dpy, EGLContext ctx) { 121 free(ctx); 122 return EGL_TRUE; 123 } 124 125 EGLBoolean eglMakeCurrent(EGLDisplay dpy, EGLSurface draw, EGLSurface read, EGLContext ctx) { 126 ThreadState* state = getThreadState(); 127 state->surface = draw; 128 state->context = ctx; 129 return EGL_TRUE; 130 } 131 132 EGLContext eglGetCurrentContext(void) { 133 return getThreadState()->context; 134 } 135 136 EGLSurface eglGetCurrentSurface(EGLint readdraw) { 137 return getThreadState()->surface; 138 } 139 140 EGLDisplay eglGetCurrentDisplay(void) { 141 return gDisplay; 142 } 143 144 EGLBoolean eglSwapBuffers(EGLDisplay dpy, EGLSurface surface) { 145 return EGL_TRUE; 146 } 147 148 EGLBoolean eglSwapBuffersWithDamageKHR(EGLDisplay dpy, EGLSurface surface, EGLint* rects, 149 EGLint rectCount) { 150 return EGL_TRUE; 151 } 152 153 EGLImageKHR eglCreateImageKHR(EGLDisplay dpy, EGLContext ctx, EGLenum target, 154 EGLClientBuffer buffer, const EGLint* attrib_list) { 155 return (EGLImageKHR)malloc(sizeof(EGLImageKHR)); 156 } 157 158 EGLSyncKHR eglCreateSyncKHR(EGLDisplay dpy, EGLenum type, const EGLint* attrib_list) { 159 return gFence; 160 } 161 162 EGLBoolean eglDestroySyncKHR(EGLDisplay dpy, EGLSyncKHR sync) { 163 return EGL_TRUE; 164 } 165 166 EGLint eglClientWaitSyncKHR(EGLDisplay dpy, EGLSyncKHR sync, EGLint flags, EGLTimeKHR timeout) { 167 return EGL_CONDITION_SATISFIED_KHR; 168 } 169 170 EGLBoolean eglDestroyImageKHR(EGLDisplay dpy, EGLImageKHR image) { 171 free(image); 172 return EGL_TRUE; 173 } 174 175 void eglBeginFrame(EGLDisplay dpy, EGLSurface surface) {} 176