bool GLRenderCallCache::Init() { //Return if we cannot make OpenGL calls if(!gliCallBacks->GetGLInternalCallState()) { return false; } //Test extension support float glVersion = gliCallBacks->GetGLVersion(); if(glVersion < 1.4f) { LOGERR(("GLRenderCallCache::Init - Need OpenGL 1.4 implementation to use render call cache")); return false; } void **loadFunc; //Helper define for function lookups #define GL_FUNC_LOOKUP(string) \ loadFunc = (void**)(&i##string); \ *loadFunc = gliCallBacks->GetGLFunction(#string); \ if(*loadFunc == NULL) \ { \ LOGERR(("Function %s unable to be mapped",#string)); \ return false; \ } //Init function pointers GL_FUNC_LOOKUP(glDrawRangeElements); GL_FUNC_LOOKUP(glMultiDrawArrays); GL_FUNC_LOOKUP(glMultiDrawElements); #undef GL_FUNC_LOOKUP #define FUNC_REGISTER(function, token) \ gliCallBacks->RegisterGLFunction(function); \ gliCallBacks->SetFunctionID(function, token); FUNC_REGISTER("glDrawArrays", CBI_glDrawArrays); FUNC_REGISTER("glDrawElements",CBI_glDrawElements); FUNC_REGISTER("glDrawRangeElements", CBI_glDrawRangeElements); FUNC_REGISTER("glDrawRangeElementsEXT",CBI_glDrawRangeElements); FUNC_REGISTER("glMultiDrawArrays", CBI_glMultiDrawArrays); FUNC_REGISTER("glMultiDrawArraysEXT",CBI_glMultiDrawArrays); FUNC_REGISTER("glMultiDrawElements", CBI_glMultiDrawElements); FUNC_REGISTER("glMultiDrawElementsEXT",CBI_glMultiDrawElements); #undef FUNC_REGISTER return true; }
#include "string.h" #include "stdlib.h" #define MAX_FUNC_LEN 32 #define FUNC_REGISTER(name) #name int func_example(); enum TEST_FUNCTION { func_example_ID, FUNCTION_CNT }; char function_list[FUNCTION_CNT][MAX_FUNC_LEN] = { FUNC_REGISTER(func_example) }; void Func_Call_Handler(char *func_name) { int i; for (i = 0; i < FUNCTION_CNT; i++) { if (strcmp(func_name, "func_example") == 0) { int retval = func_example(); serial.printf("Function name:%s\n\r", func_name); serial.printf("Argument:None\n\r"); serial.printf("Return value:%d <type-int>\n\r", retval); return; }