From 903945c963408c7c03a3d485114a5d9dddb11de9 Mon Sep 17 00:00:00 2001 From: Stas Gurtovoy Date: Thu, 5 May 2011 14:56:30 +0300 Subject: [PATCH] emulator opengl: implemented getProcAddress in GLESv1. Also changed emugen to generates gl_ftable.h needed for getProcAddress implementation. Added not_api attrib to emugen's gl.attrib to exclude from the generated ftable. Change-Id: I03786ea5d5a640bbcf5efccadca5bf2ec3e09fca --- .../opengl/host/tools/emugen/ApiGen.cpp | 32 +++++++++++++++++++ .../opengl/host/tools/emugen/ApiGen.h | 1 + .../opengl/host/tools/emugen/EntryPoint.cpp | 3 ++ .../opengl/host/tools/emugen/EntryPoint.h | 3 ++ .../emulator/opengl/host/tools/emugen/README | 1 + .../opengl/host/tools/emugen/main.cpp | 1 + .../emulator/opengl/system/GLESv1/Android.mk | 2 +- tools/emulator/opengl/system/GLESv1/gl.cpp | 21 ++++++++++-- .../opengl/system/GLESv1_enc/gl.attrib | 19 +++++++++-- tools/emulator/opengl/system/GLESv1_enc/gl.in | 4 +-- 10 files changed, 79 insertions(+), 8 deletions(-) diff --git a/tools/emulator/opengl/host/tools/emugen/ApiGen.cpp b/tools/emulator/opengl/host/tools/emugen/ApiGen.cpp index 101628ada..d408e4b6e 100644 --- a/tools/emulator/opengl/host/tools/emugen/ApiGen.cpp +++ b/tools/emulator/opengl/host/tools/emugen/ApiGen.cpp @@ -79,6 +79,38 @@ int ApiGen::genProcTypes(const std::string &filename, SideType side) return 0; } +int ApiGen::genFuncTable(const std::string &filename, SideType side) +{ + FILE *fp = fopen(filename.c_str(), "wt"); + if (fp == NULL) { + perror(filename.c_str()); + return -1; + } + printHeader(fp); + + fprintf(fp, "#ifndef __%s_%s_ftable_t_h\n", m_basename.c_str(), sideString(side)); + fprintf(fp, "#define __%s_%s_ftable_t_h\n", m_basename.c_str(), sideString(side)); + fprintf(fp, "\n\n"); + fprintf(fp, "static struct _%s_funcs_by_name {\n", m_basename.c_str()); + fprintf(fp, + "\tconst char *name;\n" \ + "\tvoid *proc;\n" \ + "} %s_funcs_by_name[] = {\n", m_basename.c_str()); + + + for (size_t i = 0; i < size(); i++) { + EntryPoint *e = &at(i); + if (e->notApi()) continue; + fprintf(fp, "\t{\"%s\", (void*)%s},\n", e->name().c_str(), e->name().c_str()); + } + fprintf(fp, "};\n"); + fprintf(fp, "static int %s_num_funcs = sizeof(%s_funcs_by_name) / sizeof(struct _%s_funcs_by_name);\n", + m_basename.c_str(), m_basename.c_str(), m_basename.c_str()); + fprintf(fp, "\n\n#endif\n"); + return 0; +} + + int ApiGen::genContext(const std::string & filename, SideType side) { FILE *fp = fopen(filename.c_str(), "wt"); diff --git a/tools/emulator/opengl/host/tools/emugen/ApiGen.h b/tools/emulator/opengl/host/tools/emugen/ApiGen.h index 18f974b58..1627ef6fe 100644 --- a/tools/emulator/opengl/host/tools/emugen/ApiGen.h +++ b/tools/emulator/opengl/host/tools/emugen/ApiGen.h @@ -67,6 +67,7 @@ public: int genOpcodes(const std::string &filename); int genAttributesTemplate(const std::string &filename); int genProcTypes(const std::string &filename, SideType side); + int genFuncTable(const std::string &filename, SideType side); int genContext(const std::string &filename, SideType side); int genContextImpl(const std::string &filename, SideType side); diff --git a/tools/emulator/opengl/host/tools/emugen/EntryPoint.cpp b/tools/emulator/opengl/host/tools/emugen/EntryPoint.cpp index ac3a3c470..03410272e 100644 --- a/tools/emulator/opengl/host/tools/emugen/EntryPoint.cpp +++ b/tools/emulator/opengl/host/tools/emugen/EntryPoint.cpp @@ -34,6 +34,7 @@ void EntryPoint::reset() { m_unsupported = false; m_customDecoder = false; + m_notApi = false; m_vars.empty(); } @@ -313,6 +314,8 @@ int EntryPoint::setAttribute(const std::string &line, size_t lc) setUnsupported(true); } else if (flag == "custom_decoder") { setCustomDecoder(true); + } else if (flag == "not_api") { + setNotApi(true); } else { fprintf(stderr, "WARNING: %u: unknown flag %s\n", (unsigned int)lc, flag.c_str()); } diff --git a/tools/emulator/opengl/host/tools/emugen/EntryPoint.h b/tools/emulator/opengl/host/tools/emugen/EntryPoint.h index c417bda37..77b8a7f34 100644 --- a/tools/emulator/opengl/host/tools/emugen/EntryPoint.h +++ b/tools/emulator/opengl/host/tools/emugen/EntryPoint.h @@ -45,6 +45,8 @@ public: void setUnsupported(bool state) { m_unsupported = state; } bool customDecoder() { return m_customDecoder; } void setCustomDecoder(bool state) { m_customDecoder = state; } + bool notApi() const { return m_notApi; } + void setNotApi(bool state) { m_notApi = state; } int setAttribute(const std::string &line, size_t lc); private: @@ -54,6 +56,7 @@ private: VarsArray m_vars; bool m_unsupported; bool m_customDecoder; + bool m_notApi; void err(unsigned int lc, const char *msg) { fprintf(stderr, "line %d: %s\n", lc, msg); diff --git a/tools/emulator/opengl/host/tools/emugen/README b/tools/emulator/opengl/host/tools/emugen/README index 6fa9ec95a..4d2c28d41 100644 --- a/tools/emulator/opengl/host/tools/emugen/README +++ b/tools/emulator/opengl/host/tools/emugen/README @@ -324,5 +324,6 @@ custom_pack custom implementation. The call to the deocder function includes a pointer to the context + not_api - the function is not native gl api diff --git a/tools/emulator/opengl/host/tools/emugen/main.cpp b/tools/emulator/opengl/host/tools/emugen/main.cpp index bbc9d9058..96377f20a 100644 --- a/tools/emulator/opengl/host/tools/emugen/main.cpp +++ b/tools/emulator/opengl/host/tools/emugen/main.cpp @@ -125,6 +125,7 @@ int main(int argc, char *argv[]) apiEntries.genContextImpl(encoderDir + "/" + baseName + "_client_context.cpp", ApiGen::CLIENT_SIDE); apiEntries.genProcTypes(encoderDir + "/" + baseName + "_client_proc.h", ApiGen::CLIENT_SIDE); + apiEntries.genFuncTable(encoderDir + "/" + baseName + "_ftable.h", ApiGen::CLIENT_SIDE); apiEntries.genEntryPoints(encoderDir + "/" + baseName + "_entry.cpp", ApiGen::CLIENT_SIDE); apiEntries.genEncoderHeader(encoderDir + "/" + baseName + "_enc.h"); diff --git a/tools/emulator/opengl/system/GLESv1/Android.mk b/tools/emulator/opengl/system/GLESv1/Android.mk index 46e618e9f..fc7bc2dcd 100644 --- a/tools/emulator/opengl/system/GLESv1/Android.mk +++ b/tools/emulator/opengl/system/GLESv1/Android.mk @@ -15,7 +15,7 @@ LOCAL_SRC_FILES := \ LOCAL_PRELINK_MODULE := false -LOCAL_CFLAGS += -DLOG_TAG=\"GLES_emulation\" +LOCAL_CFLAGS += -DLOG_TAG=\"GLES_emulation\" -DGL_GLEXT_PROTOTYPES LOCAL_C_INCLUDES += \ $(emulatorOpengl)/host/include/libOpenglRender \ $(emulatorOpengl)/shared/OpenglCodecCommon \ diff --git a/tools/emulator/opengl/system/GLESv1/gl.cpp b/tools/emulator/opengl/system/GLESv1/gl.cpp index abd0f5424..9ff5f562b 100644 --- a/tools/emulator/opengl/system/GLESv1/gl.cpp +++ b/tools/emulator/opengl/system/GLESv1/gl.cpp @@ -1,19 +1,34 @@ #include "EGLClientIface.h" #include "HostConnection.h" #include "GLEncoder.h" - +#include "GLES/gl.h" +#include "GLES/glext.h" //XXX: fix this macro to get the context from fast tls path #define GET_CONTEXT gl_client_context_t * ctx = HostConnection::get()->glEncoder(); #include "gl_entry.cpp" +//The functions table +#include "gl_ftable.h" + static EGLClient_eglInterface * s_egl = NULL; static EGLClient_glesInterface * s_gl = NULL; +void * getProcAddress(const char * procname) +{ + // search in GL function table + for (int i=0; igetProcAddress = NULL; //TODO: what goes here? + s_gl->getProcAddress = getProcAddress; s_gl->finish = finish; } diff --git a/tools/emulator/opengl/system/GLESv1_enc/gl.attrib b/tools/emulator/opengl/system/GLESv1_enc/gl.attrib index f23c2a545..13da28b94 100644 --- a/tools/emulator/opengl/system/GLESv1_enc/gl.attrib +++ b/tools/emulator/opengl/system/GLESv1_enc/gl.attrib @@ -268,30 +268,35 @@ glVertexPointerData len data datalen custom_pack data glUtilsPackPointerData((unsigned char *)ptr, (unsigned char *)data, size, type, stride, datalen) flag custom_decoder + flag not_api #void glColorPointerData(GLint size, GLenum type, GLsizei stride, void *data, GLuint datalen) glColorPointerData len data datalen flag custom_decoder custom_pack data glUtilsPackPointerData((unsigned char *)ptr, (unsigned char *)data, size, type, stride, datalen) + flag not_api #void glNormalPointerData(GLenum type, GLsizei stride, void *data, GLuint datalen) glNormalPointerData len data datalen flag custom_decoder custom_pack data glUtilsPackPointerData((unsigned char *)ptr, (unsigned char *)data, 3, type, stride, datalen) + flag not_api #void glPointSizePointerData(GLenum type, GLsizei stride, void *data, GLuint datalen) glPointSizePointerData len data datalen flag custom_decoder custom_pack data glUtilsPackPointerData((unsigned char *)ptr, (unsigned char *)data, 1, type, stride, datalen) + flag not_api #void glTexCoordPointerData(GLint size, GLenum type, GLsizei stride, void *data, GLuint datalen) glTexCoordPointerData len data datalen flag custom_decoder custom_pack data glUtilsPackPointerData((unsigned char *)ptr, (unsigned char *)data, size, type, stride, datalen) + flag not_api #void glWeightPointerData(GLint size, GLenum type, GLsizei stride, void * data, GLuint datalen) glWeightPointerData @@ -309,30 +314,40 @@ glMatrixIndexPointerData glVertexPointerOffset flag custom_decoder + flag not_api glNormalPointerOffset flag custom_decoder + flag not_api glTexCoordPointerOffset flag custom_decoder + flag not_api glPointSizePointerOffset flag custom_decoder + flag not_api glColorPointerOffset flag custom_decoder + flag not_api glWeightPointerOffset - flag custom_decoder + flag custom_decoder + flag not_api glMatrixIndexPointerOffset - flag custom_decoder + flag custom_decoder + flag not_api glDrawElementsData len data datalen flag custom_decoder + flag not_api glDrawElementsOffset flag custom_decoder + flag not_api glGetCompressedTextureFormats dir formats out len formats (count * sizeof(GLint)) flag custom_decoder + flag not_api #gles1 extensions diff --git a/tools/emulator/opengl/system/GLESv1_enc/gl.in b/tools/emulator/opengl/system/GLESv1_enc/gl.in index c317c8653..84cf3c519 100644 --- a/tools/emulator/opengl/system/GLESv1_enc/gl.in +++ b/tools/emulator/opengl/system/GLESv1_enc/gl.in @@ -76,7 +76,7 @@ GL_ENTRY(void, glFrontFace, GLenum mode) GL_ENTRY(void, glFrustumx, GLfixed left, GLfixed right, GLfixed bottom, GLfixed top, GLfixed zNear, GLfixed zFar) GL_ENTRY(void, glGetBooleanv, GLenum pname, GLboolean *params) GL_ENTRY(void, glGetBufferParameteriv, GLenum target, GLenum pname, GLint *params) -GL_ENTRY(void, glClipPlanex, GLenum pname, GLfixed * eqn) +GL_ENTRY(void, glClipPlanex, GLenum pname, const GLfixed * eqn) GL_ENTRY(void, glGenBuffers, GLsizei n, GLuint *buffers) GL_ENTRY(void, glGenTextures, GLsizei n, GLuint *textures) GL_ENTRY(GLenum, glGetError, void) @@ -248,7 +248,7 @@ GL_ENTRY(void, glDepthRangefOES, GLclampf zNear, GLclampf zFar) GL_ENTRY(void, glFrustumfOES, GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar) GL_ENTRY(void, glOrthofOES, GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar) GL_ENTRY(void, glClipPlanefOES, GLenum plane, const GLfloat *equation) -GL_ENTRY(void, glClipPlanefIMG, GLenum plane, GLfloat *equation) +GL_ENTRY(void, glClipPlanefIMG, GLenum plane, const GLfloat *equation) GL_ENTRY(void, glGetClipPlanefOES, GLenum pname, GLfloat * eqn) GL_ENTRY(void, glClearDepthfOES, GLclampf depth) GL_ENTRY(void, glTexGenfOES, GLenum coord, GLenum pname, GLfloat param)