1 /*
2 * Copyright (C) 2011 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 #include "GLDecoder.h"
17 #include <string.h>
18 #include <stdio.h>
19 #include <stdlib.h>
20 #include <EGL/egl.h>
21 #include <GLES/gl.h>
22 #include <GLES/glext.h>
23
GLDecoder()24 GLDecoder::GLDecoder()
25 {
26 m_contextData = NULL;
27 m_glesDso = NULL;
28 }
29
~GLDecoder()30 GLDecoder::~GLDecoder()
31 {
32 if (m_glesDso != NULL) {
33 delete m_glesDso;
34 }
35 }
36
37
initGL(get_proc_func_t getProcFunc,void * getProcFuncData)38 int GLDecoder::initGL(get_proc_func_t getProcFunc, void *getProcFuncData)
39 {
40 if (getProcFunc == NULL) {
41 const char *libname = GLES_LIBNAME;
42 if (getenv(GLES_LIBNAME_VAR) != NULL) {
43 libname = getenv(GLES_LIBNAME_VAR);
44 }
45
46 m_glesDso = osUtils::dynLibrary::open(libname);
47 if (m_glesDso == NULL) {
48 fprintf(stderr, "Couldn't find %s \n", GLES_LIBNAME);
49 return -1;
50 }
51
52 this->initDispatchByName(s_getProc, this);
53 } else {
54 this->initDispatchByName(getProcFunc, getProcFuncData);
55 }
56
57 set_glGetCompressedTextureFormats(s_glGetCompressedTextureFormats);
58 set_glVertexPointerOffset(s_glVertexPointerOffset);
59 set_glColorPointerOffset(s_glColorPointerOffset);
60 set_glNormalPointerOffset(s_glNormalPointerOffset);
61 set_glTexCoordPointerOffset(s_glTexCoordPointerOffset);
62 set_glPointSizePointerOffset(s_glPointSizePointerOffset);
63 set_glWeightPointerOffset(s_glWeightPointerOffset);
64 set_glMatrixIndexPointerOffset(s_glMatrixIndexPointerOffset);
65
66 set_glVertexPointerData(s_glVertexPointerData);
67 set_glColorPointerData(s_glColorPointerData);
68 set_glNormalPointerData(s_glNormalPointerData);
69 set_glTexCoordPointerData(s_glTexCoordPointerData);
70 set_glPointSizePointerData(s_glPointSizePointerData);
71 set_glWeightPointerData(s_glWeightPointerData);
72 set_glMatrixIndexPointerData(s_glMatrixIndexPointerData);
73
74 set_glDrawElementsOffset(s_glDrawElementsOffset);
75 set_glDrawElementsData(s_glDrawElementsData);
76 set_glFinishRoundTrip(s_glFinishRoundTrip);
77
78 return 0;
79 }
80
s_glFinishRoundTrip(void * self)81 int GLDecoder::s_glFinishRoundTrip(void *self)
82 {
83 GLDecoder *ctx = (GLDecoder *)self;
84 ctx->glFinish();
85 return 0;
86 }
87
s_glVertexPointerOffset(void * self,GLint size,GLenum type,GLsizei stride,GLuint offset)88 void GLDecoder::s_glVertexPointerOffset(void *self, GLint size, GLenum type, GLsizei stride, GLuint offset)
89 {
90 GLDecoder *ctx = (GLDecoder *)self;
91 ctx->glVertexPointer(size, type, stride, (void *)offset);
92 }
93
s_glColorPointerOffset(void * self,GLint size,GLenum type,GLsizei stride,GLuint offset)94 void GLDecoder::s_glColorPointerOffset(void *self, GLint size, GLenum type, GLsizei stride, GLuint offset)
95 {
96 GLDecoder *ctx = (GLDecoder *)self;
97 ctx->glColorPointer(size, type, stride, (void *)offset);
98 }
99
s_glTexCoordPointerOffset(void * self,GLint size,GLenum type,GLsizei stride,GLuint offset)100 void GLDecoder::s_glTexCoordPointerOffset(void *self, GLint size, GLenum type, GLsizei stride, GLuint offset)
101 {
102 GLDecoder *ctx = (GLDecoder *)self;
103 ctx->glTexCoordPointer(size, type, stride, (void *) offset);
104 }
105
s_glNormalPointerOffset(void * self,GLenum type,GLsizei stride,GLuint offset)106 void GLDecoder::s_glNormalPointerOffset(void *self, GLenum type, GLsizei stride, GLuint offset)
107 {
108 GLDecoder *ctx = (GLDecoder *)self;
109 ctx->glNormalPointer(type, stride, (void *)offset);
110 }
111
s_glPointSizePointerOffset(void * self,GLenum type,GLsizei stride,GLuint offset)112 void GLDecoder::s_glPointSizePointerOffset(void *self, GLenum type, GLsizei stride, GLuint offset)
113 {
114 GLDecoder *ctx = (GLDecoder *)self;
115 ctx->glPointSizePointerOES(type, stride, (void *)offset);
116 }
117
s_glWeightPointerOffset(void * self,GLint size,GLenum type,GLsizei stride,GLuint offset)118 void GLDecoder::s_glWeightPointerOffset(void * self, GLint size, GLenum type, GLsizei stride, GLuint offset)
119 {
120 GLDecoder *ctx = (GLDecoder *)self;
121 ctx->glWeightPointerOES(size, type, stride, (void*)offset);
122 }
123
s_glMatrixIndexPointerOffset(void * self,GLint size,GLenum type,GLsizei stride,GLuint offset)124 void GLDecoder::s_glMatrixIndexPointerOffset(void * self, GLint size, GLenum type, GLsizei stride, GLuint offset)
125 {
126 GLDecoder *ctx = (GLDecoder *)self;
127 ctx->glMatrixIndexPointerOES(size, type, stride, (void*)offset);
128 }
129
130
131
132 #define STORE_POINTER_DATA_OR_ABORT(location) \
133 if (ctx->m_contextData != NULL) { \
134 ctx->m_contextData->storePointerData((location), data, datalen); \
135 } else { \
136 return; \
137 }
138
s_glVertexPointerData(void * self,GLint size,GLenum type,GLsizei stride,void * data,GLuint datalen)139 void GLDecoder::s_glVertexPointerData(void *self, GLint size, GLenum type, GLsizei stride, void *data, GLuint datalen)
140 {
141 GLDecoder *ctx = (GLDecoder *)self;
142
143 STORE_POINTER_DATA_OR_ABORT(GLDecoderContextData::VERTEX_LOCATION);
144
145 ctx->glVertexPointer(size, type, 0, ctx->m_contextData->pointerData(GLDecoderContextData::VERTEX_LOCATION));
146 }
147
s_glColorPointerData(void * self,GLint size,GLenum type,GLsizei stride,void * data,GLuint datalen)148 void GLDecoder::s_glColorPointerData(void *self, GLint size, GLenum type, GLsizei stride, void *data, GLuint datalen)
149 {
150 GLDecoder *ctx = (GLDecoder *)self;
151
152 STORE_POINTER_DATA_OR_ABORT(GLDecoderContextData::COLOR_LOCATION);
153
154 ctx->glColorPointer(size, type, 0, ctx->m_contextData->pointerData(GLDecoderContextData::COLOR_LOCATION));
155 }
156
s_glTexCoordPointerData(void * self,GLint unit,GLint size,GLenum type,GLsizei stride,void * data,GLuint datalen)157 void GLDecoder::s_glTexCoordPointerData(void *self, GLint unit, GLint size, GLenum type, GLsizei stride, void *data, GLuint datalen)
158 {
159 GLDecoder *ctx = (GLDecoder *)self;
160 STORE_POINTER_DATA_OR_ABORT((GLDecoderContextData::PointerDataLocation)
161 (GLDecoderContextData::TEXCOORD0_LOCATION + unit));
162
163 ctx->glTexCoordPointer(size, type, 0,
164 ctx->m_contextData->pointerData((GLDecoderContextData::PointerDataLocation)
165 (GLDecoderContextData::TEXCOORD0_LOCATION + unit)));
166 }
167
s_glNormalPointerData(void * self,GLenum type,GLsizei stride,void * data,GLuint datalen)168 void GLDecoder::s_glNormalPointerData(void *self, GLenum type, GLsizei stride, void *data, GLuint datalen)
169 {
170 GLDecoder *ctx = (GLDecoder *)self;
171
172 STORE_POINTER_DATA_OR_ABORT(GLDecoderContextData::NORMAL_LOCATION);
173
174 ctx->glNormalPointer(type, 0, ctx->m_contextData->pointerData(GLDecoderContextData::NORMAL_LOCATION));
175 }
176
s_glPointSizePointerData(void * self,GLenum type,GLsizei stride,void * data,GLuint datalen)177 void GLDecoder::s_glPointSizePointerData(void *self, GLenum type, GLsizei stride, void *data, GLuint datalen)
178 {
179 GLDecoder *ctx = (GLDecoder *)self;
180
181 STORE_POINTER_DATA_OR_ABORT(GLDecoderContextData::POINTSIZE_LOCATION);
182
183 ctx->glPointSizePointerOES(type, 0, ctx->m_contextData->pointerData(GLDecoderContextData::POINTSIZE_LOCATION));
184 }
185
s_glWeightPointerData(void * self,GLint size,GLenum type,GLsizei stride,void * data,GLuint datalen)186 void GLDecoder::s_glWeightPointerData(void * self, GLint size, GLenum type, GLsizei stride, void * data, GLuint datalen)
187 {
188 GLDecoder *ctx = (GLDecoder *)self;
189
190 STORE_POINTER_DATA_OR_ABORT(GLDecoderContextData::WEIGHT_LOCATION);
191
192 ctx->glWeightPointerOES(size, type, 0, ctx->m_contextData->pointerData(GLDecoderContextData::WEIGHT_LOCATION));
193 }
194
s_glMatrixIndexPointerData(void * self,GLint size,GLenum type,GLsizei stride,void * data,GLuint datalen)195 void GLDecoder::s_glMatrixIndexPointerData(void * self, GLint size, GLenum type, GLsizei stride, void * data, GLuint datalen)
196 {
197 GLDecoder *ctx = (GLDecoder *)self;
198
199 STORE_POINTER_DATA_OR_ABORT(GLDecoderContextData::MATRIXINDEX_LOCATION);
200
201 ctx->glMatrixIndexPointerOES(size, type, 0, ctx->m_contextData->pointerData(GLDecoderContextData::MATRIXINDEX_LOCATION));
202 }
203
s_glDrawElementsOffset(void * self,GLenum mode,GLsizei count,GLenum type,GLuint offset)204 void GLDecoder::s_glDrawElementsOffset(void *self, GLenum mode, GLsizei count, GLenum type, GLuint offset)
205 {
206 GLDecoder *ctx = (GLDecoder *)self;
207 ctx->glDrawElements(mode, count, type, (void *)offset);
208 }
209
s_glDrawElementsData(void * self,GLenum mode,GLsizei count,GLenum type,void * data,GLuint datalen)210 void GLDecoder::s_glDrawElementsData(void *self, GLenum mode, GLsizei count, GLenum type, void * data, GLuint datalen)
211 {
212 GLDecoder *ctx = (GLDecoder *)self;
213 ctx->glDrawElements(mode, count, type, data);
214 }
215
s_glGetCompressedTextureFormats(void * self,GLint count,GLint * data)216 void GLDecoder::s_glGetCompressedTextureFormats(void *self, GLint count, GLint *data)
217 {
218 GLDecoder *ctx = (GLDecoder *) self;
219 ctx->glGetIntegerv(GL_COMPRESSED_TEXTURE_FORMATS, data);
220 }
221
s_getProc(const char * name,void * userData)222 void *GLDecoder::s_getProc(const char *name, void *userData)
223 {
224 GLDecoder *ctx = (GLDecoder *)userData;
225
226 if (ctx == NULL || ctx->m_glesDso == NULL) {
227 return NULL;
228 }
229
230 void *func = NULL;
231 #ifdef USE_EGL_GETPROCADDRESS
232 func = (void *) eglGetProcAddress(name);
233 #endif
234 if (func == NULL) {
235 func = (void *)(ctx->m_glesDso->findSymbol(name));
236 }
237 return func;
238 }
239