xref: /aosp_15_r20/cts/hostsidetests/gputools/layers/jni/glesLayer.cpp (revision b7c941bb3fa97aba169d73cee0bed2de8ac964bf)
1*b7c941bbSAndroid Build Coastguard Worker /*
2*b7c941bbSAndroid Build Coastguard Worker  * Copyright (C) 2018 The Android Open Source Project
3*b7c941bbSAndroid Build Coastguard Worker  *
4*b7c941bbSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*b7c941bbSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*b7c941bbSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*b7c941bbSAndroid Build Coastguard Worker  *
8*b7c941bbSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*b7c941bbSAndroid Build Coastguard Worker  *
10*b7c941bbSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*b7c941bbSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*b7c941bbSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*b7c941bbSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*b7c941bbSAndroid Build Coastguard Worker  * limitations under the License.
15*b7c941bbSAndroid Build Coastguard Worker  */
16*b7c941bbSAndroid Build Coastguard Worker 
17*b7c941bbSAndroid Build Coastguard Worker #include <android/log.h>
18*b7c941bbSAndroid Build Coastguard Worker #include <cstring>
19*b7c941bbSAndroid Build Coastguard Worker #include <EGL/egl.h>
20*b7c941bbSAndroid Build Coastguard Worker #include <GLES3/gl3.h>
21*b7c941bbSAndroid Build Coastguard Worker #include <string>
22*b7c941bbSAndroid Build Coastguard Worker #include <string.h>
23*b7c941bbSAndroid Build Coastguard Worker #include <unordered_map>
24*b7c941bbSAndroid Build Coastguard Worker 
25*b7c941bbSAndroid Build Coastguard Worker #define xstr(a) str(a)
26*b7c941bbSAndroid Build Coastguard Worker #define str(a) #a
27*b7c941bbSAndroid Build Coastguard Worker 
28*b7c941bbSAndroid Build Coastguard Worker #define LOG_TAG "glesLayer" xstr(LAYERNAME)
29*b7c941bbSAndroid Build Coastguard Worker 
30*b7c941bbSAndroid Build Coastguard Worker #define ALOGI(msg, ...) \
31*b7c941bbSAndroid Build Coastguard Worker     __android_log_print(ANDROID_LOG_INFO, LOG_TAG, (msg), __VA_ARGS__)
32*b7c941bbSAndroid Build Coastguard Worker 
33*b7c941bbSAndroid Build Coastguard Worker 
34*b7c941bbSAndroid Build Coastguard Worker // Announce if anything loads this layer.  LAYERNAME is defined in Android.mk
35*b7c941bbSAndroid Build Coastguard Worker class StaticLogMessage {
36*b7c941bbSAndroid Build Coastguard Worker     public:
StaticLogMessage(const char * msg)37*b7c941bbSAndroid Build Coastguard Worker         StaticLogMessage(const char* msg) {
38*b7c941bbSAndroid Build Coastguard Worker             ALOGI("%s", msg);
39*b7c941bbSAndroid Build Coastguard Worker     }
40*b7c941bbSAndroid Build Coastguard Worker };
41*b7c941bbSAndroid Build Coastguard Worker StaticLogMessage g_initMessage("glesLayer" xstr(LAYERNAME) " loaded");
42*b7c941bbSAndroid Build Coastguard Worker 
43*b7c941bbSAndroid Build Coastguard Worker typedef __eglMustCastToProperFunctionPointerType EGLFuncPointer;
44*b7c941bbSAndroid Build Coastguard Worker typedef void* (*PFNEGLGETNEXTLAYERPROCADDRESSPROC)(void*, const char*);
45*b7c941bbSAndroid Build Coastguard Worker 
46*b7c941bbSAndroid Build Coastguard Worker namespace {
47*b7c941bbSAndroid Build Coastguard Worker 
48*b7c941bbSAndroid Build Coastguard Worker std::unordered_map<std::string, EGLFuncPointer> funcMap;
49*b7c941bbSAndroid Build Coastguard Worker 
glesLayer_glCompileShaderA(GLuint shader)50*b7c941bbSAndroid Build Coastguard Worker EGLAPI void EGLAPIENTRY glesLayer_glCompileShaderA (GLuint shader) {
51*b7c941bbSAndroid Build Coastguard Worker     ALOGI("%s%u", "glesLayer_glCompileShaderA called with parameter ", shader);
52*b7c941bbSAndroid Build Coastguard Worker 
53*b7c941bbSAndroid Build Coastguard Worker     if (funcMap.find("glCompileShader") == funcMap.end())
54*b7c941bbSAndroid Build Coastguard Worker         ALOGI("%s", "Unable to find funcMap entry for glCompileShader");
55*b7c941bbSAndroid Build Coastguard Worker 
56*b7c941bbSAndroid Build Coastguard Worker     EGLFuncPointer entry = funcMap["glCompileShader"];
57*b7c941bbSAndroid Build Coastguard Worker 
58*b7c941bbSAndroid Build Coastguard Worker     PFNGLCOMPILESHADERPROC next = reinterpret_cast<PFNGLCOMPILESHADERPROC>(entry);
59*b7c941bbSAndroid Build Coastguard Worker 
60*b7c941bbSAndroid Build Coastguard Worker     next(shader);
61*b7c941bbSAndroid Build Coastguard Worker }
62*b7c941bbSAndroid Build Coastguard Worker 
glesLayer_glCompileShaderB(GLuint shader)63*b7c941bbSAndroid Build Coastguard Worker EGLAPI void EGLAPIENTRY glesLayer_glCompileShaderB (GLuint shader) {
64*b7c941bbSAndroid Build Coastguard Worker     ALOGI("%s%u", "glesLayer_CompileShaderB called with parameter ", shader);
65*b7c941bbSAndroid Build Coastguard Worker 
66*b7c941bbSAndroid Build Coastguard Worker     if (funcMap.find("glCompileShader") == funcMap.end())
67*b7c941bbSAndroid Build Coastguard Worker         ALOGI("%s", "Unable to find funcMap entry for glCompileShader");
68*b7c941bbSAndroid Build Coastguard Worker 
69*b7c941bbSAndroid Build Coastguard Worker     EGLFuncPointer entry = funcMap["glCompileShader"];
70*b7c941bbSAndroid Build Coastguard Worker 
71*b7c941bbSAndroid Build Coastguard Worker     PFNGLCOMPILESHADERPROC next = reinterpret_cast<PFNGLCOMPILESHADERPROC>(entry);
72*b7c941bbSAndroid Build Coastguard Worker 
73*b7c941bbSAndroid Build Coastguard Worker     next(shader);
74*b7c941bbSAndroid Build Coastguard Worker }
75*b7c941bbSAndroid Build Coastguard Worker 
glesLayer_glDrawArraysInstanced(GLenum mode,GLint first,GLsizei count,GLsizei instancecount)76*b7c941bbSAndroid Build Coastguard Worker EGLAPI void EGLAPI glesLayer_glDrawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instancecount) {
77*b7c941bbSAndroid Build Coastguard Worker     ALOGI("%s %i, %i, %i", "glesLayer_glDrawArraysInstanced called with parameters (minus GLenum):", first, count, instancecount);
78*b7c941bbSAndroid Build Coastguard Worker 
79*b7c941bbSAndroid Build Coastguard Worker     if (funcMap.find("glDrawArraysInstanced") == funcMap.end())
80*b7c941bbSAndroid Build Coastguard Worker         ALOGI("%s", "Unable to find funcMap entry for glDrawArraysInstanced");
81*b7c941bbSAndroid Build Coastguard Worker 
82*b7c941bbSAndroid Build Coastguard Worker     EGLFuncPointer entry = funcMap["glDrawArraysInstanced"];
83*b7c941bbSAndroid Build Coastguard Worker 
84*b7c941bbSAndroid Build Coastguard Worker     PFNGLDRAWARRAYSINSTANCEDPROC next = reinterpret_cast<PFNGLDRAWARRAYSINSTANCEDPROC>(entry);
85*b7c941bbSAndroid Build Coastguard Worker 
86*b7c941bbSAndroid Build Coastguard Worker     next(mode, first, count, instancecount);
87*b7c941bbSAndroid Build Coastguard Worker }
88*b7c941bbSAndroid Build Coastguard Worker 
glesLayer_glBindBuffer(GLenum target,GLuint buffer)89*b7c941bbSAndroid Build Coastguard Worker EGLAPI void EGLAPIENTRY glesLayer_glBindBuffer(GLenum target, GLuint buffer) {
90*b7c941bbSAndroid Build Coastguard Worker     ALOGI("%s %i", "glesLayer_glBindBuffer called with parameters (minus GLenum):", buffer);
91*b7c941bbSAndroid Build Coastguard Worker 
92*b7c941bbSAndroid Build Coastguard Worker     if (funcMap.find("glBindBuffer") == funcMap.end())
93*b7c941bbSAndroid Build Coastguard Worker         ALOGI("%s", "Unable to find funcMap entry for glBindBuffer");
94*b7c941bbSAndroid Build Coastguard Worker 
95*b7c941bbSAndroid Build Coastguard Worker     EGLFuncPointer entry = funcMap["glBindBuffer"];
96*b7c941bbSAndroid Build Coastguard Worker 
97*b7c941bbSAndroid Build Coastguard Worker     PFNGLBINDBUFFERPROC next = reinterpret_cast<PFNGLBINDBUFFERPROC>(entry);
98*b7c941bbSAndroid Build Coastguard Worker 
99*b7c941bbSAndroid Build Coastguard Worker     next(target, buffer);
100*b7c941bbSAndroid Build Coastguard Worker }
101*b7c941bbSAndroid Build Coastguard Worker 
glesLayer_glGetString(GLenum name)102*b7c941bbSAndroid Build Coastguard Worker EGLAPI const GLubyte* EGLAPIENTRY glesLayer_glGetString(GLenum name) {
103*b7c941bbSAndroid Build Coastguard Worker     ALOGI("%s %lu", "glesLayer_glGetString called with parameters:", (unsigned long)name);
104*b7c941bbSAndroid Build Coastguard Worker 
105*b7c941bbSAndroid Build Coastguard Worker     if (funcMap.find("glGetString") == funcMap.end())
106*b7c941bbSAndroid Build Coastguard Worker         ALOGI("%s", "Unable to find funcMap entry for glGetString");
107*b7c941bbSAndroid Build Coastguard Worker 
108*b7c941bbSAndroid Build Coastguard Worker     EGLFuncPointer entry = funcMap["glGetString"];
109*b7c941bbSAndroid Build Coastguard Worker 
110*b7c941bbSAndroid Build Coastguard Worker     PFNGLGETSTRINGPROC next = reinterpret_cast<PFNGLGETSTRINGPROC>(entry);
111*b7c941bbSAndroid Build Coastguard Worker 
112*b7c941bbSAndroid Build Coastguard Worker     return next(name);
113*b7c941bbSAndroid Build Coastguard Worker }
114*b7c941bbSAndroid Build Coastguard Worker 
glesLayer_eglGetDisplay(EGLNativeDisplayType display_type)115*b7c941bbSAndroid Build Coastguard Worker EGLAPI EGLDisplay EGLAPIENTRY glesLayer_eglGetDisplay(EGLNativeDisplayType display_type) {
116*b7c941bbSAndroid Build Coastguard Worker     ALOGI("%s %lu", "glesLayer_eglGetDisplay called with parameters:", (unsigned long)display_type);
117*b7c941bbSAndroid Build Coastguard Worker 
118*b7c941bbSAndroid Build Coastguard Worker     if (funcMap.find("eglGetDisplay") == funcMap.end())
119*b7c941bbSAndroid Build Coastguard Worker         ALOGI("%s", "Unable to find funcMap entry for eglGetDisplay");
120*b7c941bbSAndroid Build Coastguard Worker 
121*b7c941bbSAndroid Build Coastguard Worker     EGLFuncPointer entry = funcMap["eglGetDisplay"];
122*b7c941bbSAndroid Build Coastguard Worker 
123*b7c941bbSAndroid Build Coastguard Worker     typedef EGLDisplay (*PFNEGLGETDISPLAYPROC)(EGLNativeDisplayType);
124*b7c941bbSAndroid Build Coastguard Worker     PFNEGLGETDISPLAYPROC next = reinterpret_cast<PFNEGLGETDISPLAYPROC>(entry);
125*b7c941bbSAndroid Build Coastguard Worker 
126*b7c941bbSAndroid Build Coastguard Worker     return next(display_type);
127*b7c941bbSAndroid Build Coastguard Worker }
128*b7c941bbSAndroid Build Coastguard Worker 
glesLayer_eglInitialize(EGLDisplay dpy,EGLint * major,EGLint * minor)129*b7c941bbSAndroid Build Coastguard Worker EGLAPI EGLBoolean EGLAPIENTRY glesLayer_eglInitialize(EGLDisplay dpy, EGLint *major, EGLint *minor) {
130*b7c941bbSAndroid Build Coastguard Worker     ALOGI("%s %lu %li %li", "glesLayer_eglInitialize called with parameters:", (unsigned long)dpy, major ? (long)*major : 0, minor ? (long)*minor : 0);
131*b7c941bbSAndroid Build Coastguard Worker 
132*b7c941bbSAndroid Build Coastguard Worker     if (funcMap.find("eglInitialize") == funcMap.end())
133*b7c941bbSAndroid Build Coastguard Worker         ALOGI("%s", "Unable to find funcMap entry for eglInitialize");
134*b7c941bbSAndroid Build Coastguard Worker 
135*b7c941bbSAndroid Build Coastguard Worker     EGLFuncPointer entry = funcMap["eglInitialize"];
136*b7c941bbSAndroid Build Coastguard Worker 
137*b7c941bbSAndroid Build Coastguard Worker     typedef EGLBoolean (*PFNEGLINITIALIZEPROC)(EGLDisplay, EGLint*, EGLint*);
138*b7c941bbSAndroid Build Coastguard Worker     PFNEGLINITIALIZEPROC next = reinterpret_cast<PFNEGLINITIALIZEPROC>(entry);
139*b7c941bbSAndroid Build Coastguard Worker 
140*b7c941bbSAndroid Build Coastguard Worker     return next(dpy, major, minor);
141*b7c941bbSAndroid Build Coastguard Worker }
142*b7c941bbSAndroid Build Coastguard Worker 
glesLayer_eglChooseConfig(EGLDisplay dpy,const EGLint * attrib_list,EGLConfig * configs,EGLint config_size,EGLint * num_config)143*b7c941bbSAndroid Build Coastguard Worker EGLAPI EGLBoolean EGLAPIENTRY glesLayer_eglChooseConfig (EGLDisplay dpy, const EGLint *attrib_list, EGLConfig *configs, EGLint config_size, EGLint *num_config) {
144*b7c941bbSAndroid Build Coastguard Worker 
145*b7c941bbSAndroid Build Coastguard Worker     const char* msg = "glesLayer_eglChooseConfig called in glesLayer" xstr(LAYERNAME);
146*b7c941bbSAndroid Build Coastguard Worker     ALOGI("%s", msg);
147*b7c941bbSAndroid Build Coastguard Worker 
148*b7c941bbSAndroid Build Coastguard Worker     if (funcMap.find("eglChooseConfig") == funcMap.end())
149*b7c941bbSAndroid Build Coastguard Worker         ALOGI("%s", "Unable to find funcMap entry for eglChooseConfig");
150*b7c941bbSAndroid Build Coastguard Worker 
151*b7c941bbSAndroid Build Coastguard Worker     EGLFuncPointer entry = funcMap["eglChooseConfig"];
152*b7c941bbSAndroid Build Coastguard Worker 
153*b7c941bbSAndroid Build Coastguard Worker     typedef EGLBoolean (*PFNEGLCHOOSECONFIGPROC)(EGLDisplay, const EGLint*, EGLConfig*, EGLint, EGLint*);
154*b7c941bbSAndroid Build Coastguard Worker     PFNEGLCHOOSECONFIGPROC next = reinterpret_cast<PFNEGLCHOOSECONFIGPROC>(entry);
155*b7c941bbSAndroid Build Coastguard Worker 
156*b7c941bbSAndroid Build Coastguard Worker     return next(dpy, attrib_list, configs, config_size, num_config);
157*b7c941bbSAndroid Build Coastguard Worker }
158*b7c941bbSAndroid Build Coastguard Worker 
glesLayer_eglSwapBuffersWithDamageKHR(EGLDisplay dpy,EGLSurface surface,EGLint * rects,EGLint n_rects)159*b7c941bbSAndroid Build Coastguard Worker EGLAPI EGLBoolean EGLAPIENTRY glesLayer_eglSwapBuffersWithDamageKHR (EGLDisplay dpy, EGLSurface surface, EGLint *rects, EGLint n_rects) {
160*b7c941bbSAndroid Build Coastguard Worker 
161*b7c941bbSAndroid Build Coastguard Worker     const char* msg = "glesLayer_eglSwapBuffersWithDamageKHR called in glesLayer" xstr(LAYERNAME);
162*b7c941bbSAndroid Build Coastguard Worker     ALOGI("%s", msg);
163*b7c941bbSAndroid Build Coastguard Worker 
164*b7c941bbSAndroid Build Coastguard Worker     if (funcMap.find("eglSwapBuffersWithDamageKHR") == funcMap.end())
165*b7c941bbSAndroid Build Coastguard Worker         ALOGI("%s", "Unable to find funcMap entry for eglSwapBuffersWithDamageKHR");
166*b7c941bbSAndroid Build Coastguard Worker 
167*b7c941bbSAndroid Build Coastguard Worker     EGLFuncPointer entry = funcMap["eglSwapBuffersWithDamageKHR"];
168*b7c941bbSAndroid Build Coastguard Worker 
169*b7c941bbSAndroid Build Coastguard Worker     typedef EGLBoolean (*PFNEGLSWAPBUFFERSWITHDAMAGEKHRPROC)(EGLDisplay, EGLSurface, EGLint*, EGLint);
170*b7c941bbSAndroid Build Coastguard Worker     PFNEGLSWAPBUFFERSWITHDAMAGEKHRPROC next = reinterpret_cast<PFNEGLSWAPBUFFERSWITHDAMAGEKHRPROC>(entry);
171*b7c941bbSAndroid Build Coastguard Worker 
172*b7c941bbSAndroid Build Coastguard Worker     return next(dpy, surface, rects, n_rects);
173*b7c941bbSAndroid Build Coastguard Worker }
174*b7c941bbSAndroid Build Coastguard Worker 
glesLayer_eglGetProcAddress(const char * procname)175*b7c941bbSAndroid Build Coastguard Worker EGLAPI void* EGLAPIENTRY glesLayer_eglGetProcAddress (const char* procname) {
176*b7c941bbSAndroid Build Coastguard Worker 
177*b7c941bbSAndroid Build Coastguard Worker     const char* msg = "glesLayer_eglGetProcAddress called in glesLayer" xstr(LAYERNAME) " for:";
178*b7c941bbSAndroid Build Coastguard Worker     ALOGI("%s%s", msg, procname);
179*b7c941bbSAndroid Build Coastguard Worker 
180*b7c941bbSAndroid Build Coastguard Worker     if (funcMap.find("eglGetProcAddress") == funcMap.end())
181*b7c941bbSAndroid Build Coastguard Worker         ALOGI("%s", "Unable to find funcMap entry for eglGetProcAddress");
182*b7c941bbSAndroid Build Coastguard Worker 
183*b7c941bbSAndroid Build Coastguard Worker     EGLFuncPointer entry = funcMap["eglGetProcAddress"];
184*b7c941bbSAndroid Build Coastguard Worker 
185*b7c941bbSAndroid Build Coastguard Worker     typedef void* (*PFNEGLGETPROCADDRESSPROC)(const char*);
186*b7c941bbSAndroid Build Coastguard Worker     PFNEGLGETPROCADDRESSPROC next = reinterpret_cast<PFNEGLGETPROCADDRESSPROC>(entry);
187*b7c941bbSAndroid Build Coastguard Worker 
188*b7c941bbSAndroid Build Coastguard Worker     return next(procname);
189*b7c941bbSAndroid Build Coastguard Worker }
190*b7c941bbSAndroid Build Coastguard Worker 
eglGPA(const char * funcName)191*b7c941bbSAndroid Build Coastguard Worker EGLAPI EGLFuncPointer EGLAPIENTRY eglGPA(const char* funcName) {
192*b7c941bbSAndroid Build Coastguard Worker 
193*b7c941bbSAndroid Build Coastguard Worker #define GETPROCADDR(func) if(!strcmp(funcName, #func)) { \
194*b7c941bbSAndroid Build Coastguard Worker ALOGI("%s%s%s", "Returning glesLayer_" #func " for ", funcName, " in eglGPA"); \
195*b7c941bbSAndroid Build Coastguard Worker return (EGLFuncPointer)glesLayer_##func; \
196*b7c941bbSAndroid Build Coastguard Worker }
197*b7c941bbSAndroid Build Coastguard Worker 
198*b7c941bbSAndroid Build Coastguard Worker     if (strcmp("A", xstr(LAYERNAME)) == 0) {
199*b7c941bbSAndroid Build Coastguard Worker 
200*b7c941bbSAndroid Build Coastguard Worker         const char* targetFunc = "glCompileShader";
201*b7c941bbSAndroid Build Coastguard Worker         if (strcmp(targetFunc, funcName) == 0) {
202*b7c941bbSAndroid Build Coastguard Worker             ALOGI("%s%s%s", "Returning glesLayer_glCompileShaderA for ", funcName, " in eglGPA");
203*b7c941bbSAndroid Build Coastguard Worker             return (EGLFuncPointer)glesLayer_glCompileShaderA;
204*b7c941bbSAndroid Build Coastguard Worker         }
205*b7c941bbSAndroid Build Coastguard Worker 
206*b7c941bbSAndroid Build Coastguard Worker         GETPROCADDR(glDrawArraysInstanced);
207*b7c941bbSAndroid Build Coastguard Worker 
208*b7c941bbSAndroid Build Coastguard Worker     } else if (strcmp("B", xstr(LAYERNAME)) == 0) {
209*b7c941bbSAndroid Build Coastguard Worker 
210*b7c941bbSAndroid Build Coastguard Worker         const char* targetFunc = "glCompileShader";
211*b7c941bbSAndroid Build Coastguard Worker         if (strcmp(targetFunc, funcName) == 0) {
212*b7c941bbSAndroid Build Coastguard Worker             ALOGI("%s%s%s", "Returning glesLayer_glCompileShaderB for ", funcName, " in eglGPA");
213*b7c941bbSAndroid Build Coastguard Worker             return (EGLFuncPointer)glesLayer_glCompileShaderB;
214*b7c941bbSAndroid Build Coastguard Worker         }
215*b7c941bbSAndroid Build Coastguard Worker 
216*b7c941bbSAndroid Build Coastguard Worker         GETPROCADDR(glBindBuffer);
217*b7c941bbSAndroid Build Coastguard Worker     }
218*b7c941bbSAndroid Build Coastguard Worker 
219*b7c941bbSAndroid Build Coastguard Worker     GETPROCADDR(glGetString);
220*b7c941bbSAndroid Build Coastguard Worker     GETPROCADDR(eglGetDisplay);
221*b7c941bbSAndroid Build Coastguard Worker     GETPROCADDR(eglInitialize);
222*b7c941bbSAndroid Build Coastguard Worker     GETPROCADDR(eglChooseConfig);
223*b7c941bbSAndroid Build Coastguard Worker     GETPROCADDR(eglSwapBuffersWithDamageKHR);
224*b7c941bbSAndroid Build Coastguard Worker     GETPROCADDR(eglGetProcAddress);
225*b7c941bbSAndroid Build Coastguard Worker 
226*b7c941bbSAndroid Build Coastguard Worker     // Don't return anything for unrecognized functions
227*b7c941bbSAndroid Build Coastguard Worker     return nullptr;
228*b7c941bbSAndroid Build Coastguard Worker }
229*b7c941bbSAndroid Build Coastguard Worker 
glesLayer_InitializeLayer(void * layer_id,PFNEGLGETNEXTLAYERPROCADDRESSPROC get_next_layer_proc_address)230*b7c941bbSAndroid Build Coastguard Worker EGLAPI void EGLAPIENTRY glesLayer_InitializeLayer(void* layer_id, PFNEGLGETNEXTLAYERPROCADDRESSPROC get_next_layer_proc_address) {
231*b7c941bbSAndroid Build Coastguard Worker     ALOGI("%s%llu%s%llu", "glesLayer_InitializeLayer called with layer_id (", (unsigned long long) layer_id,
232*b7c941bbSAndroid Build Coastguard Worker                               ") get_next_layer_proc_address (", (unsigned long long) get_next_layer_proc_address);
233*b7c941bbSAndroid Build Coastguard Worker 
234*b7c941bbSAndroid Build Coastguard Worker     // Pick a real function to look up and test the pointer we've been handed
235*b7c941bbSAndroid Build Coastguard Worker     const char* func = "eglGetProcAddress";
236*b7c941bbSAndroid Build Coastguard Worker 
237*b7c941bbSAndroid Build Coastguard Worker     ALOGI("%s%s%s%llu%s%llu%s", "Looking up address of ", func,
238*b7c941bbSAndroid Build Coastguard Worker                                 " using get_next_layer_proc_address (", (unsigned long long) get_next_layer_proc_address,
239*b7c941bbSAndroid Build Coastguard Worker                                 ") with layer_id (", (unsigned long long) layer_id,
240*b7c941bbSAndroid Build Coastguard Worker                                 ")");
241*b7c941bbSAndroid Build Coastguard Worker 
242*b7c941bbSAndroid Build Coastguard Worker     void* gpa = get_next_layer_proc_address(layer_id, func);
243*b7c941bbSAndroid Build Coastguard Worker 
244*b7c941bbSAndroid Build Coastguard Worker     // Pick a fake function to look up and test the pointer we've been handed
245*b7c941bbSAndroid Build Coastguard Worker     func = "eglFoo";
246*b7c941bbSAndroid Build Coastguard Worker 
247*b7c941bbSAndroid Build Coastguard Worker     ALOGI("%s%s%s%llu%s%llu%s", "Looking up address of ", func,
248*b7c941bbSAndroid Build Coastguard Worker                                 " using get_next_layer_proc_address (", (unsigned long long) get_next_layer_proc_address,
249*b7c941bbSAndroid Build Coastguard Worker                                 ") with layer_id (", (unsigned long long) layer_id,
250*b7c941bbSAndroid Build Coastguard Worker                                 ")");
251*b7c941bbSAndroid Build Coastguard Worker 
252*b7c941bbSAndroid Build Coastguard Worker     gpa = get_next_layer_proc_address(layer_id, func);
253*b7c941bbSAndroid Build Coastguard Worker 
254*b7c941bbSAndroid Build Coastguard Worker     ALOGI("%s%llu%s%s", "Got back (", (unsigned long long) gpa, ") for ", func);
255*b7c941bbSAndroid Build Coastguard Worker }
256*b7c941bbSAndroid Build Coastguard Worker 
glesLayer_GetLayerProcAddress(const char * funcName,EGLFuncPointer next)257*b7c941bbSAndroid Build Coastguard Worker EGLAPI EGLFuncPointer EGLAPIENTRY glesLayer_GetLayerProcAddress(const char* funcName, EGLFuncPointer next) {
258*b7c941bbSAndroid Build Coastguard Worker 
259*b7c941bbSAndroid Build Coastguard Worker     EGLFuncPointer entry = eglGPA(funcName);
260*b7c941bbSAndroid Build Coastguard Worker 
261*b7c941bbSAndroid Build Coastguard Worker     if (entry != nullptr) {
262*b7c941bbSAndroid Build Coastguard Worker         ALOGI("%s%s%s%llu%s", "Setting up glesLayer version of ", funcName, " calling down with: next (", (unsigned long long) next, ")");
263*b7c941bbSAndroid Build Coastguard Worker         funcMap[std::string(funcName)] = next;
264*b7c941bbSAndroid Build Coastguard Worker         return entry;
265*b7c941bbSAndroid Build Coastguard Worker     }
266*b7c941bbSAndroid Build Coastguard Worker 
267*b7c941bbSAndroid Build Coastguard Worker     // If the layer does not intercept the function, just return original func pointer
268*b7c941bbSAndroid Build Coastguard Worker     return next;
269*b7c941bbSAndroid Build Coastguard Worker }
270*b7c941bbSAndroid Build Coastguard Worker 
271*b7c941bbSAndroid Build Coastguard Worker }  // namespace
272*b7c941bbSAndroid Build Coastguard Worker 
273*b7c941bbSAndroid Build Coastguard Worker extern "C" {
274*b7c941bbSAndroid Build Coastguard Worker 
AndroidGLESLayer_Initialize(void * layer_id,PFNEGLGETNEXTLAYERPROCADDRESSPROC get_next_layer_proc_address)275*b7c941bbSAndroid Build Coastguard Worker     __attribute((visibility("default"))) EGLAPI void AndroidGLESLayer_Initialize(void* layer_id,
276*b7c941bbSAndroid Build Coastguard Worker             PFNEGLGETNEXTLAYERPROCADDRESSPROC get_next_layer_proc_address) {
277*b7c941bbSAndroid Build Coastguard Worker         return (void)glesLayer_InitializeLayer(layer_id, get_next_layer_proc_address);
278*b7c941bbSAndroid Build Coastguard Worker     }
279*b7c941bbSAndroid Build Coastguard Worker 
AndroidGLESLayer_GetProcAddress(const char * funcName,EGLFuncPointer next)280*b7c941bbSAndroid Build Coastguard Worker     __attribute((visibility("default"))) EGLAPI void* AndroidGLESLayer_GetProcAddress(const char *funcName, EGLFuncPointer next) {
281*b7c941bbSAndroid Build Coastguard Worker         return (void*)glesLayer_GetLayerProcAddress(funcName, next);
282*b7c941bbSAndroid Build Coastguard Worker     }
283*b7c941bbSAndroid Build Coastguard Worker }
284