def apiEmuDispatchFuncInitCode(apis, args): dispatchName = 'emu' categoryPrev = None code = '' for api in apis: code += '\n' if api.name in cond: code += '#if %s\n' % cond[api.name] for function in api.functions: if not function.needsContext: continue if getattr(function,'regalOnly',False)==True: continue name = function.name emue = [ None ] for i in range( len( emu ) - 1 ) : emue.append( emuFindEntry( function, emu[i]['formulae'], emu[i]['member'] ) ) if all(i is None for i in emue) and (getattr(function,'regalRemap',None)==None or isinstance(function.regalRemap, str) or isinstance(function.regalRemap, unicode)): continue params = paramsDefaultCode(function.parameters, True) callParams = paramsNameCode(function.parameters) rType = typeCode(function.ret.type) category = getattr(function, 'category', None) version = getattr(function, 'version', None) if category: category = category.replace('_DEPRECATED', '') elif version: category = version.replace('.', '_') category = 'GL_VERSION_' + category # Close prev category block. if categoryPrev and not (category == categoryPrev): code += '\n' # Begin new category block. if category and not (category == categoryPrev): code += '// %s\n\n' % category categoryPrev = category code += ' tbl.%s = %s_%s;\n' % ( name, dispatchName, name ) if api.name in cond: code += '#endif // %s\n' % cond[api.name] code += '\n' # Close pending if block. if categoryPrev: code += '\n' return code
def apiFuncDefineCode(apis, args): # code = '' for api in apis: tmp = [] for function in api.functions: name = function.name params = paramsDefaultCode(function.parameters, True) callParams = paramsNameCode(function.parameters) rType = typeCode(function.ret.type) rTypes = rType.strip() category = getattr(function, 'category', None) version = getattr(function, 'version', None) if category: category = category.replace('_DEPRECATED', '') elif version: category = version.replace('.', '_') category = 'GL_VERSION_' + category c = '' c += 'REGAL_DECL %sREGAL_CALL %s(%s) \n{\n' % (rType, name, params) emue = [ emuFindEntry( function, i['formulae'], i['member'] ) for i in emuRegal ] if function.needsContext: c += ' RegalContext *_context = REGAL_GET_CONTEXT();\n' c += listToString(indent(stripVertical(emuCodeGen(emue,'prefix')),' ')) c += ' %s\n' % logFunction( function, 'App' ) c += ' if (!_context) return' if typeIsVoid(rType): c += ';\n' else: if rTypes in api.defaults: c += ' %s;\n' % ( api.defaults[rTypes] ) else: if rType[-1]=='*' or typeIsVoidPointer(rType): c += ' NULL;\n' else: c += ' (%s) 0;\n' % ( rTypes ) c += listToString(indent(stripVertical(emuCodeGen(emue,'impl')),' ')) if getattr(function,'regalRemap',None)!=None and (isinstance(function.regalRemap, list) or isinstance(function.regalRemap, str) or isinstance(function.regalRemap, unicode)): # For an ES1 context, pass the call into the dispatch layers... if function.category in ['GL_REGAL_ES1_0_compatibility','GL_REGAL_ES1_1_compatibility']: c += ' #if REGAL_SYS_ES1\n' c += ' if (_context->isES1()) // Pass-through for ES1 only\n' c += ' {\n' c += ' DispatchTableGL *_next = &_context->dispatcher.front();\n' c += ' RegalAssert(_next);\n ' if not typeIsVoid(rType): c += 'return ' c += '_next->call(&_next->%s)(%s);\n' % ( name, callParams ) if typeIsVoid(rType): c += ' return;\n' c += ' }\n' c += ' #endif\n' # For ES2 or GL context, remap the ES1 call c += ' ' if not typeIsVoid(rType): c += 'return ' if isinstance(function.regalRemap, list): c += '\n '.join(function.regalRemap) + '\n' else: c += '%s;\n'%(function.regalRemap) else: if not getattr(function,'regalOnly',False): t = '' t += 'DispatchTableGL *_next = &_context->dispatcher.front();\n' t += 'RegalAssert(_next);\n' t += listToString(indent(stripVertical(emuCodeGen(emue,'pre')),'')) if not typeIsVoid(rType): t += 'return ' t += '_next->call(&_next->%s)(%s);\n' % ( name, callParams ) t += listToString(indent(stripVertical(emuCodeGen(emue,'post')),'')) for i in emue: if i!=None and i['cond']!=None: t = wrapCIf(i['cond'],indent(t)) c += indent(t) c += listToString(indent(stripVertical(emuCodeGen(emue,'suffix')),' ')) else: c += ' %s\n' % logFunction(function, 'App' ) c += listToString(indent(stripVertical(emuCodeGen(emue,'prefix')),' ')) if not getattr(function,'regalOnly',False): c += ' DispatchTableGlobal *_next = &dispatcherGlobal.front();\n' c += ' RegalAssert(_next);\n' if not typeIsVoid(rType): if rTypes in api.defaults: c += ' %s ret = %s;\n' % ( rTypes, api.defaults[rTypes] ) else: if rType[-1]=='*' or typeIsVoidPointer(rType): c += ' %s ret = NULL;\n' % rTypes else: c += ' %s ret = (%s) 0;\n' % ( rTypes, rTypes ) c += listToString(indent(stripVertical(emuCodeGen(emue,'impl')),' ')) c += ' ' if not typeIsVoid(rType): c += 'ret = ' c += '_next->call(&_next->%s)(%s);\n' % ( name, callParams ) c += listToString(indent(stripVertical(emuCodeGen(emue,'init')),' ')) c += listToString(indent(stripVertical(emuCodeGen(emue,'suffix')),' ')) if not typeIsVoid(rType): c += ' return ret;\n' c += '}\n\n' tmp.append( (category, indent(c,' ') ) ) tmp = listToString(unfoldCategory(tmp,' /* %s */')) if api.name in cond: tmp = wrapIf(cond[api.name], tmp) code += tmp return code
def apiEmuFuncDefineCode(apis, args): categoryPrev = None code = '' for api in apis: code += '\n' if api.name in cond: code += '#if %s\n' % cond[api.name] for function in api.functions: if not function.needsContext: continue if getattr(function, 'regalOnly', False) == True: continue name = function.name params = paramsDefaultCode(function.parameters, True) callParams = paramsNameCode(function.parameters) rType = typeCode(function.ret.type) category = getattr(function, 'category', None) version = getattr(function, 'version', None) if category: category = category.replace('_DEPRECATED', '') elif version: category = version.replace('.', '_') category = 'GL_VERSION_' + category # Close prev category block. if categoryPrev and not (category == categoryPrev): code += '\n' # Begin new category block. if category and not (category == categoryPrev): code += '// %s\n\n' % category categoryPrev = category emue = [ emuFindEntry(function, i['formulae'], i['member']) for i in emu ] if all(i is None for i in emue) and ( getattr(function, 'regalRemap', None) == None or isinstance(function.regalRemap, str) or isinstance(function.regalRemap, unicode)): continue code += '\nstatic %sREGAL_CALL %s%s(%s) \n{\n' % (rType, 'emu_', name, params) code += ' RegalContext *_context = GET_REGAL_CONTEXT();\n' code += ' RegalAssert(_context);\n' code += '\n' level = [(emu[i], emuFindEntry(function, emu[i]['formulae'], emu[i]['member'])) for i in range(len(emue) - 1)] if not all( i[1] == None or not 'prefix' in i[1] and not 'impl' in i[1] for i in level): code += ' // prefix\n' code += ' switch( _context->emuLevel ) {\n' for i in level: l, e = i[0], i[1] code += ' case %d :\n' % l['level'] if l['ifdef']: code += ' #if %s\n' % l['ifdef'] if e != None and 'prefix' in e and len(e['prefix']): if l['member']: code += ' if (_context->%s) {\n' % l[ 'member'] code += ' Push<int> pushLevel(_context->emuLevel);\n' code += ' _context->emuLevel = %d;\n' % ( int(l['level']) - 1) for j in e['prefix']: code += ' %s\n' % j if l['member']: code += ' }\n' if e != None and 'impl' in e and l['member']: code += ' if (_context->%s) break;\n' % l[ 'member'] if l['ifdef']: code += ' #endif\n' code += ' default:\n' code += ' break;\n' code += ' }\n\n' # Remap, as necessary remap = getattr(function, 'regalRemap', None) es2Name = None if remap != None: es2Name = remap.get('ES2.0', None) es2Params = callParams if es2Name != None: j = es2Name.find('(') if j != -1: es2Params = es2Name[j + 1:-1] es2Name = es2Name[0:j] if not all(i[1] == None or not 'impl' in i[1] for i in level): code += ' // impl\n' code += ' switch( _context->emuLevel ) {\n' for i in level: l, e = i[0], i[1] code += ' case %d :\n' % l['level'] if l['ifdef']: code += ' #if %s\n' % l['ifdef'] if e != None and 'impl' in e and len(e['impl']): if l['member']: code += ' if (_context->%s) {\n' % l[ 'member'] code += ' Push<int> pushLevel(_context->emuLevel);\n' code += ' _context->emuLevel = %d;\n' % ( int(l['level']) - 1) for j in e['impl']: code += ' %s\n' % j if l['member']: if typeIsVoid(rType): code += ' return;\n' code += ' }\n' if l['ifdef']: code += ' #endif\n' code += ' default: {\n' # glEnable/glDisable/glIsEnabled constraints for ES 2.0 # http://www.khronos.org/opengles/sdk/docs/man/xhtml/glEnable.xml if name == 'glEnable' or name == 'glDisable' or name == 'glIsEnabled': code += ' if (_context->info->gles)\n' code += ' switch (cap)\n' code += ' {\n' for i in api.enums: if i.name == 'defines': for j in i.enumerants: if getattr( j, 'esVersions', None ) != None and getattr( j, 'enableCap', None ) != None and 2.0 in j.esVersions and j.enableCap == True: code += ' case %s:\n' % ( j.name) code += ' break;\n' code += ' default:\n' code += ' Warning("%s does not support ",GLenumToString(cap)," for ES 2.0.");\n' % ( name) if name == 'glIsEnabled': code += ' return GL_FALSE;\n' else: code += ' return;\n' code += ' }\n' # glHint constraints for ES 2.0 # http://www.khronos.org/opengles/sdk/docs/man/xhtml/glHint.xml if name == 'glHint': code += ' if (_context->info->gles)\n' code += ' switch (target)\n' code += ' {\n' for i in api.enums: if i.name == 'defines': for j in i.enumerants: if getattr(j, 'esVersions', None) == None: continue if getattr(j, 'hint', None) == None: continue if getattr( j, 'esVersions', None ) != None and getattr( j, 'hint', None ) != None and 2.0 in j.esVersions and j.hint == True: code += ' case %s:\n' % ( j.name) code += ' break;\n' code += ' default:\n' code += ' Warning("%s does not support ",GLenumToString(target)," for ES 2.0.");\n' % ( name) code += ' return;\n' code += ' }\n' code += ' DispatchTable *_next = _context->dispatcher.emulation._next;\n' code += ' RegalAssert(_next);\n' if es2Name != None: code += ' ' code += 'if (_context->info->gles)\n' code += ' ' if not typeIsVoid(rType): code += ' return ' code += ' _next->call(&_next->%s)(%s);\n' % (es2Name, es2Params) code += ' else\n ' code += ' ' if not typeIsVoid(rType): code += 'return ' code += ' _next->call(&_next->%s)(%s);\n' % (name, callParams) code += ' break;\n' code += ' }\n\n' code += ' }\n\n' else: code += ' DispatchTable *_next = _context->dispatcher.emulation._next;\n' code += ' RegalAssert(_next);\n' code += ' ' if es2Name != None: code += 'if (_context->info->gles)\n' code += ' ' if not typeIsVoid(rType): code += 'return ' code += ' _next->call(& _next->%s)(%s);\n' % (es2Name, es2Params) code += ' else\n ' if not typeIsVoid(rType): code += 'return ' code += ' _next->call(& _next->%s)(%s);\n' % (name, callParams) code += '}\n\n' if api.name in cond: code += '#endif // %s\n' % cond[api.name] code += '\n' # Close pending if block. if categoryPrev: code += '\n' return code
def apiDebugFuncDefineCode(apis, args): categoryPrev = None code = '' for api in apis: code += '\n' if api.name in cond: code += '#if %s\n' % cond[api.name] for function in api.functions: if not function.needsContext: continue if getattr(function,'regalOnly',False)==True: continue name = function.name params = paramsDefaultCode(function.parameters, True) callParams = paramsNameCode(function.parameters) rType = typeCode(function.ret.type) category = getattr(function, 'category', None) version = getattr(function, 'version', None) if category: category = category.replace('_DEPRECATED', '') elif version: category = version.replace('.', '_') category = 'GL_VERSION_' + category # Close prev category block. if categoryPrev and not (category == categoryPrev): code += '\n' # Begin new category block. if category and not (category == categoryPrev): code += '// %s\n\n' % category categoryPrev = category code += 'static %sREGAL_CALL %s%s(%s) \n{\n' % (rType, 'debug_', name, params) code += ' RegalContext *_context = GET_REGAL_CONTEXT();\n' code += ' RegalAssert(_context);\n' code += ' DispatchTable *_next = _context->dispatcher.debug._next;\n' code += ' RegalAssert(_next);\n' e = emuFindEntry( function, debugDispatchFormulae, '' ) if e != None and 'prefix' in e : for l in e['prefix'] : code += ' %s\n' % l code += ' ' if not typeIsVoid(rType): code += '%s ret = ' % rType code += '_next->call(&_next->%s)(%s);\n' % ( name, callParams ) if not typeIsVoid(rType): code += ' return ret;\n' code += '}\n\n' if api.name in cond: code += '#endif // %s\n' % cond[api.name] code += '\n' # Close pending if block. if categoryPrev: code += '\n' return code
def apiFuncDefineCode(apis, args): code = '' for api in apis: tmp = [] for function in api.functions: name = function.name params = paramsDefaultCode(function.parameters, True) callParams = paramsNameCode(function.parameters) rType = typeCode(function.ret.type) category = getattr(function, 'category', None) version = getattr(function, 'version', None) if category: category = category.replace('_DEPRECATED', '') elif version: category = version.replace('.', '_') category = 'GL_VERSION_' + category c = '' c += 'REGAL_DECL %sREGAL_CALL %s(%s) \n{\n' % (rType, name, params) emue = [ emuFindEntry( function, i['formulae'], i['member'] ) for i in emuRegal ] if function.needsContext: c += ' RegalContext *_context = REGAL_GET_CONTEXT();\n' c += ' %s\n' % logFunction( function, 'App' ) c += ' if (!_context) return' if typeIsVoid(rType): c += ';\n' else: if rType[-1] != '*': c += ' (%s)0;\n' % ( rType ) else: c += ' NULL;\n' c += listToString(indent(emuCodeGen(emue,'impl'),' ')) if getattr(function,'regalRemap',None)!=None and (isinstance(function.regalRemap, list) or isinstance(function.regalRemap, str) or isinstance(function.regalRemap, unicode)): c += ' ' if not typeIsVoid(rType): c += 'return ' if isinstance(function.regalRemap, list): c += '\n '.join(function.regalRemap) + '\n' else: c += '%s;\n'%(function.regalRemap) else: if getattr(function,'regalOnly',False)==False: c += ' DispatchTable *_next = &_context->dispatcher.front();\n' c += ' RegalAssert(_next);\n' c += listToString(indent(emuCodeGen(emue,'suffix'),' ')) c += ' ' if not typeIsVoid(rType): c += 'return ' c += '_next->call(&_next->%s)(%s);\n' % ( name, callParams ) else: c += ' %s\n' % logFunction(function, 'App' ) c += listToString(indent(emuCodeGen(emue,'prefix'),' ')) if api.name=='egl': c += '\n' c += ' #if !REGAL_STATIC_EGL\n' c += ' if (!dispatchTableGlobal.%s)\n' % name c += ' {\n' c += ' GetProcAddress( dispatchTableGlobal.%s, "%s" );\n' % ( name, name ) c += ' RegalAssert(dispatchTableGlobal.%s!=%s);\n' % ( name, name ) c += ' if (dispatchTableGlobal.%s==%s)\n' % ( name, name ) c += ' dispatchTableGlobal.%s = NULL;\n' % ( name ) c += ' }\n' if api.name=='egl': c += ' #endif // !REGAL_STATIC_EGL\n\n' if not typeIsVoid(rType): if rType[-1] != '*': c += ' %s ret = (%s)0;\n' % ( rType, rType ) else: c += ' %s ret = NULL;\n' % rType c += listToString(indent(emuCodeGen(emue,'impl'),' ')) c += ' if (dispatchTableGlobal.%s)\n' % name c += ' {\n' c += ' %s\n' % logFunction( function, 'Driver' ) c += ' ' if not typeIsVoid(rType): c += 'ret = ' c += 'dispatchTableGlobal.%s(%s);\n' % ( name, callParams ) if name == 'wglMakeCurrent': c += ' Init::makeCurrent(RegalSystemContext(hglrc));\n' elif name == 'CGLSetCurrentContext': c += ' Init::makeCurrent( ctx );\n' elif name == 'glXMakeCurrent': c += ' Init::makeCurrent( RegalSystemContext(ctx) );\n' elif name == 'eglMakeCurrent': c += ' Init::makeCurrent( ctx );\n' elif name == 'wglDeleteContext': c += ' Init::destroyContext( RegalSystemContext(hglrc) );\n' elif name == 'CGLDestroyContext': c += ' Init::destroyContext( RegalSystemContext(ctx) );\n' elif name == 'glXDestroyContext': c += ' Init::destroyContext( RegalSystemContext(ctx) );\n' elif name == 'eglDestroyContext': c += ' Init::destroyContext( RegalSystemContext(ctx) );\n' c += ' }\n' c += ' else\n' c += ' Warning( "%s not available." );\n' % name c += listToString(indent(emuCodeGen(emue,'suffix'),' ')) if not typeIsVoid(rType): c += ' return ret;\n' c += '}\n\n' tmp.append( (category, indent(c,' ') ) ) tmp = listToString(unfoldCategory(tmp,' /* %s */')) if api.name in cond: tmp = wrapIf(cond[api.name], tmp) code += tmp return code
def apiFuncDefineCode(apis, args): # code = '' for api in apis: tmp = [] for function in api.functions: name = function.name params = paramsDefaultCode(function.parameters, True) callParams = paramsNameCode(function.parameters) rType = typeCode(function.ret.type) rTypes = rType.strip() category = getattr(function, 'category', None) version = getattr(function, 'version', None) if category: category = category.replace('_DEPRECATED', '') elif version: category = version.replace('.', '_') category = 'GL_VERSION_' + category c = '' c += 'REGAL_DECL %sREGAL_CALL %s(%s) \n{\n' % (rType, name, params) emue = [ emuFindEntry(function, i['formulae'], i['member'], i['ifdef']) for i in emuRegal ] if function.needsContext: c += ' RegalContext *_context = REGAL_GET_CONTEXT();\n' c += listToString( indent(stripVertical(emuCodeGen(emue, 'prefix')), ' ')) c += ' %s\n' % logFunction(function, 'App') c += ' if (!_context) return' if typeIsVoid(rType): c += ';\n' else: if rTypes in api.defaults: c += ' %s;\n' % (api.defaults[rTypes]) else: if rType[-1] == '*' or typeIsVoidPointer(rType): c += ' NULL;\n' else: c += ' (%s) 0;\n' % (rTypes) c += listToString( indent(stripVertical(emuCodeGen(emue, 'impl')), ' ')) if getattr(function, 'regalRemap', None) != None and ( isinstance(function.regalRemap, list) or isinstance(function.regalRemap, str) or isinstance(function.regalRemap, unicode)): # For an ES1 context, pass the call into the dispatch layers... if function.category in [ 'GL_REGAL_ES1_0_compatibility', 'GL_REGAL_ES1_1_compatibility' ]: c += ' #if REGAL_SYS_ES1\n' c += ' if (_context->isES1()) // Pass-through for ES1 only\n' c += ' {\n' c += ' DispatchTableGL *_next = &_context->dispatcher.front();\n' c += ' RegalAssert(_next);\n ' if not typeIsVoid(rType): c += 'return ' c += '_next->call(&_next->%s)(%s);\n' % (name, callParams) if typeIsVoid(rType): c += ' return;\n' c += ' }\n' c += ' #endif\n' # For ES2 or GL context, remap the ES1 call c += ' ' if not typeIsVoid(rType): c += 'return ' if isinstance(function.regalRemap, list): c += '\n '.join(function.regalRemap) + '\n' else: c += '%s;\n' % (function.regalRemap) else: if not getattr(function, 'regalOnly', False): t = '' t += 'DispatchTableGL *_next = &_context->dispatcher.front();\n' t += 'RegalAssert(_next);\n' t += listToString( indent(stripVertical(emuCodeGen(emue, 'pre')), '')) if not typeIsVoid(rType): t += 'return ' t += '_next->call(&_next->%s)(%s);\n' % (name, callParams) t += listToString( indent(stripVertical(emuCodeGen(emue, 'post')), '')) for i in emue: if i != None and i['cond'] != None: t = wrapCIf(i['cond'], indent(t)) c += indent(t) c += listToString( indent(stripVertical(emuCodeGen(emue, 'suffix')), ' ')) else: c += ' %s\n' % logFunction(function, 'App') c += listToString( indent(stripVertical(emuCodeGen(emue, 'prefix')), ' ')) if not getattr(function, 'regalOnly', False): c += ' DispatchTableGlobal *_next = &dispatcherGlobal.front();\n' c += ' RegalAssert(_next);\n' if not typeIsVoid(rType): if rTypes in api.defaults: c += ' %s ret = %s;\n' % (rTypes, api.defaults[rTypes]) else: if rType[-1] == '*' or typeIsVoidPointer(rType): c += ' %s ret = NULL;\n' % rTypes else: c += ' %s ret = (%s) 0;\n' % (rTypes, rTypes) c += listToString( indent(stripVertical(emuCodeGen(emue, 'impl')), ' ')) c += ' ' if not typeIsVoid(rType): c += 'ret = ' c += '_next->call(&_next->%s)(%s);\n' % (name, callParams) c += listToString( indent(stripVertical(emuCodeGen(emue, 'init')), ' ')) c += listToString( indent(stripVertical(emuCodeGen(emue, 'suffix')), ' ')) if not typeIsVoid(rType): c += ' return ret;\n' c += '}\n\n' tmp.append((category, indent(c, ' '))) tmp = listToString(unfoldCategory(tmp, ' /* %s */')) if api.name in cond: tmp = wrapIf(cond[api.name], tmp) code += tmp return code
def apiDebugFuncDefineCode(apis, args): categoryPrev = None code = '' for api in apis: code += '\n' if api.name in cond: code += '#if %s\n' % cond[api.name] for function in api.functions: if not function.needsContext: continue if getattr(function, 'regalOnly', False) == True: continue name = function.name params = paramsDefaultCode(function.parameters, True) callParams = paramsNameCode(function.parameters) rType = typeCode(function.ret.type) category = getattr(function, 'category', None) version = getattr(function, 'version', None) if category: category = category.replace('_DEPRECATED', '') elif version: category = version.replace('.', '_') category = 'GL_VERSION_' + category # Close prev category block. if categoryPrev and not (category == categoryPrev): code += '\n' # Begin new category block. if category and not (category == categoryPrev): code += '// %s\n\n' % category categoryPrev = category code += 'static %sREGAL_CALL %s%s(%s) \n{\n' % (rType, 'debug_', name, params) code += ' RegalContext *_context = GET_REGAL_CONTEXT();\n' code += ' RegalAssert(_context);\n' code += ' DispatchTable *_next = _context->dispatcher.debug._next;\n' code += ' RegalAssert(_next);\n' e = emuFindEntry(function, debugDispatchFormulae, '') if e != None and 'prefix' in e: for l in e['prefix']: code += ' %s\n' % l code += ' ' if not typeIsVoid(rType): code += '%s ret = ' % rType code += '_next->call(&_next->%s)(%s);\n' % (name, callParams) if not typeIsVoid(rType): code += ' return ret;\n' code += '}\n\n' if api.name in cond: code += '#endif // %s\n' % cond[api.name] code += '\n' # Close pending if block. if categoryPrev: code += '\n' return code
def apiEmuFuncDefineCode(apis, args): categoryPrev = None code = '' for api in apis: code += '\n' if api.name in cond: code += '#if %s\n' % cond[api.name] for function in api.functions: if not function.needsContext: continue if getattr(function,'regalOnly',False)==True: continue name = function.name params = paramsDefaultCode(function.parameters, True) callParams = paramsNameCode(function.parameters) rType = typeCode(function.ret.type) category = getattr(function, 'category', None) version = getattr(function, 'version', None) if category: category = category.replace('_DEPRECATED', '') elif version: category = version.replace('.', '_') category = 'GL_VERSION_' + category # Close prev category block. if categoryPrev and not (category == categoryPrev): code += '\n' # Begin new category block. if category and not (category == categoryPrev): code += '// %s\n\n' % category categoryPrev = category emue = [ emuFindEntry( function, i['formulae'], i['member'] ) for i in emu ] if all(i is None for i in emue) and (getattr(function,'regalRemap',None)==None or isinstance(function.regalRemap, str) or isinstance(function.regalRemap, unicode)): continue code += '\nstatic %sREGAL_CALL %s%s(%s) \n{\n' % (rType, 'emu_', name, params) code += ' RegalContext *_context = GET_REGAL_CONTEXT();\n' code += ' RegalAssert(_context);\n' code += '\n' level = [ (emu[i], emuFindEntry( function, emu[i]['formulae'], emu[i]['member'] )) for i in range( len( emue ) - 1 ) ] if not all(i[1]==None or not 'prefix' in i[1] and not 'impl' in i[1] for i in level): code += ' // prefix\n' code += ' switch( _context->emuLevel ) {\n' for i in level: l,e = i[0], i[1] code += ' case %d :\n' % l['level'] if l['ifdef']: code += ' #if %s\n' % l['ifdef'] if e != None and 'prefix' in e : if l['member'] : code += ' if (_context->%s) {\n' % l['member'] code += ' RegalEmuScopedActivate activate( _context, _context->%s );\n' % l['member'] for j in e['prefix'] : code += ' %s\n' % j if l['member'] : code += ' }\n' if e!= None and 'impl' in e and l['member']: code += ' if (_context->%s) break;\n' % l['member']; if l['ifdef']: code += ' #endif\n' code += ' default:\n' code += ' break;\n' code += ' }\n\n' # Remap, as necessary remap = getattr(function, 'regalRemap', None) es2Name = None if remap != None: es2Name = remap.get('ES2.0',None) es2Params = callParams if es2Name != None: j = es2Name.find('(') if j!=-1: es2Params = es2Name[j+1:-1] es2Name = es2Name[0:j] if not all(i[1]==None or not 'impl' in i[1] for i in level): code += ' // impl\n' code += ' switch( _context->emuLevel ) {\n' for i in level: l,e = i[0], i[1] code += ' case %d :\n' % l['level'] if l['ifdef']: code += ' #if %s\n' % l['ifdef'] if e != None and 'impl' in e : if l['member'] : code += ' if (_context->%s) {\n' % l['member'] code += ' RegalEmuScopedActivate activate( _context, _context->%s );\n' % l['member'] for j in e['impl'] : code += ' %s\n' % j if l['member'] : if typeIsVoid(rType): code += ' return;\n' code += ' }\n' if l['ifdef']: code += ' #endif\n' code += ' default: {\n' # debug print # code += ' %s\n' % debugPrintFunction( function, 'GTrace' ) # debug print if name=='glEnable' or name=='glDisable' or name=='glIsEnabled': code += ' if (_context->info->gles)\n' code += ' switch (cap)\n' code += ' {\n' for i in api.enums: if i.name=='defines': for j in i.enumerants: if getattr(j,'esVersions',None) != None and getattr(j,'enableCap',None) != None and 2.0 in j.esVersions and j.enableCap == True: code += ' case %s:\n'%(j.name) code += ' break;\n' code += ' default:\n' code += ' Warning("%s does not support ",GLenumToString(cap)," for ES 2.0.");\n'%(name) if name=='glIsEnabled': code += ' return GL_FALSE;\n' else: code += ' return;\n' code += ' }\n' code += ' Dispatcher::ScopedStep stepDown(_context->dispatcher);\n' if es2Name != None: code += ' ' code += 'if (_context->info->gles)\n' code += ' ' if not typeIsVoid(rType): code += ' return ' code += ' _context->dispatcher.call(&_context->dispatcher.table().%s)(%s);\n' % ( es2Name, es2Params ) code += ' else\n ' code += ' ' if not typeIsVoid(rType): code += 'return ' code += '_context->dispatcher.call(&_context->dispatcher.table().%s)(%s);\n' % ( name, callParams ) code += ' break;\n' code += ' }\n\n' code += ' }\n\n' else: code += ' Dispatcher::ScopedStep stepDown(_context->dispatcher);\n' code += ' ' if es2Name != None: code += 'if (_context->info->gles)\n' code += ' ' if not typeIsVoid(rType): code += 'return ' code += '_context->dispatcher.call(&_context->dispatcher.table().%s)(%s);\n' % ( es2Name, es2Params ) code += ' else\n ' if not typeIsVoid(rType): code += 'return ' code += '_context->dispatcher.call(&_context->dispatcher.table().%s)(%s);\n' % ( name, callParams ) code += '}\n\n' if api.name in cond: code += '#endif // %s\n' % cond[api.name] code += '\n' # Close pending if block. if categoryPrev: code += '\n' return code
def apiEmuDispatchFuncInitCode(apis, args): dispatchName = "emu" categoryPrev = None code = "" for api in apis: code += "\n" if api.name in cond: code += "#if %s\n" % cond[api.name] for function in api.functions: if not function.needsContext: continue if getattr(function, "regalOnly", False) == True: continue name = function.name emue = [None] for i in range(len(emu) - 1): emue.append(emuFindEntry(function, emu[i]["formulae"], emu[i]["member"])) if all(i is None for i in emue) and ( getattr(function, "regalRemap", None) == None or isinstance(function.regalRemap, str) or isinstance(function.regalRemap, unicode) ): continue params = paramsDefaultCode(function.parameters, True) callParams = paramsNameCode(function.parameters) rType = typeCode(function.ret.type) category = getattr(function, "category", None) version = getattr(function, "version", None) if category: category = category.replace("_DEPRECATED", "") elif version: category = version.replace(".", "_") category = "GL_VERSION_" + category # Close prev category block. if categoryPrev and not (category == categoryPrev): code += "\n" # Begin new category block. if category and not (category == categoryPrev): code += "// %s\n\n" % category categoryPrev = category code += " tbl.%s = %s_%s;\n" % (name, dispatchName, name) if api.name in cond: code += "#endif // %s\n" % cond[api.name] code += "\n" # Close pending if block. if categoryPrev: code += "\n" return code
def apiEmuFuncDefineCode(apis, args): categoryPrev = None code = "" for api in apis: code += "\n" if api.name in cond: code += "#if %s\n" % cond[api.name] for function in api.functions: if not function.needsContext: continue if getattr(function, "regalOnly", False) == True: continue name = function.name params = paramsDefaultCode(function.parameters, True) callParams = paramsNameCode(function.parameters) rType = typeCode(function.ret.type) category = getattr(function, "category", None) version = getattr(function, "version", None) if category: category = category.replace("_DEPRECATED", "") elif version: category = version.replace(".", "_") category = "GL_VERSION_" + category # Close prev category block. if categoryPrev and not (category == categoryPrev): code += "\n" # Begin new category block. if category and not (category == categoryPrev): code += "// %s\n\n" % category categoryPrev = category emue = [emuFindEntry(function, i["formulae"], i["member"]) for i in emu] if all(i is None for i in emue) and ( getattr(function, "regalRemap", None) == None or isinstance(function.regalRemap, str) or isinstance(function.regalRemap, unicode) ): continue code += "\nstatic %sREGAL_CALL %s%s(%s) \n{\n" % (rType, "emu_", name, params) code += " RegalContext *_context = REGAL_GET_CONTEXT();\n" code += " RegalAssert(_context);\n" code += " DispatchTableGL &_dispatch = _context->dispatcher.emulation;\n" code += "\n" level = [ (emu[i], emuFindEntry(function, emu[i]["formulae"], emu[i]["member"])) for i in range(len(emue) - 1) ] # PREFIX if not all(i[1] == None or not "prefix" in i[1] and not "impl" in i[1] for i in level): code += " // prefix\n" code += " switch( _context->emuLevel )\n" code += " {\n" for i in level: l, e = i[0], i[1] code += " case %d :\n" % l["level"] if l["ifdef"]: code += " #if %s\n" % l["ifdef"] if e != None and "prefix" in e and len(e["prefix"]): if l["member"]: code += " if (_context->%s)\n" % l["member"] code += " {\n" code += " Push<int> pushLevel(_context->emuLevel);\n" code += " _context->emuLevel = %d;\n" % (int(l["level"]) - 1) if l["plugin"]: code += " #if REGAL_PLUGIN\n" code += " Thread::ThreadLocal &_instance = Thread::ThreadLocal::instance();\n" code += " Push<DispatchTableGL *> pushDispatchTable(_instance.nextDispatchTable);\n" code += " _instance.nextDispatchTable = &_context->dispatcher.emulation;\n" code += " #endif\n" code += listToString(indent(e["prefix"], " ")) if l["member"]: code += " }\n" if e != None and "impl" in e and l["member"]: code += " if (_context->%s) break;\n" % l["member"] if l["ifdef"]: code += " #endif\n" code += " default:\n" code += " break;\n" code += " }\n\n" # Remap, as necessary remap = getattr(function, "regalRemap", None) es2Name = None if remap != None and isinstance(remap, dict): es2Name = remap.get("ES2.0", None) es2Params = callParams if es2Name != None: j = es2Name.find("(") if j != -1: es2Params = es2Name[j + 1 : -1] es2Name = es2Name[0:j] # IMPL if not all(i[1] == None or not "impl" in i[1] for i in level): code += " // impl\n" code += " switch( _context->emuLevel )\n" code += " {\n" for i in level: l, e = i[0], i[1] code += " case %d :\n" % l["level"] if l["ifdef"]: code += " #if %s\n" % l["ifdef"] if e != None and "impl" in e and len(e["impl"]): if l["member"]: code += " if (_context->%s)\n" % l["member"] code += " {\n" code += " Push<int> pushLevel(_context->emuLevel);\n" code += " _context->emuLevel = %d;\n" % (int(l["level"]) - 1) if l["plugin"]: code += " #if REGAL_PLUGIN\n" code += " Thread::ThreadLocal &_instance = Thread::ThreadLocal::instance();\n" code += " Push<DispatchTableGL *> pushDispatchTable(_instance.nextDispatchTable);\n" code += " _instance.nextDispatchTable = &_context->dispatcher.emulation;\n" code += " #endif\n" code += listToString(indent(e["impl"], " ")) if l["member"]: if l["member"] != "filt" and typeIsVoid(rType): code += " return;\n" code += " }\n" if l["ifdef"]: code += " #endif\n" code += " default: \n" code += " {\n" # glEnable/glDisable/glIsEnabled constraints for ES 2.0 # http://www.khronos.org/opengles/sdk/docs/man/xhtml/glEnable.xml if name == "glEnable" or name == "glDisable" or name == "glIsEnabled": code += " if (_context->isES2())\n" code += " switch (cap)\n" code += " {\n" for i in api.enums: if i.name == "defines": for j in i.enumerantsByName: if ( getattr(j, "esVersions", None) != None and getattr(j, "enableCap", None) != None and 2.0 in j.esVersions and j.enableCap == True ): code += " case %s:\n" % (j.name) code += " break;\n" code += " default:\n" code += ' Warning("%s does not support ",GLenumToString(cap)," for ES 2.0.");\n' % ( name ) if name == "glIsEnabled": code += " return GL_FALSE;\n" else: code += " return;\n" code += " }\n" # glBindTexture constraints for ES 2.0 # http://www.khronos.org/opengles/sdk/docs/man/xhtml/glBindTexture.xml if name == "glBindTexture": code += " if (_context->isES2())\n" code += " switch (target)\n" code += " {\n" for i in api.enums: if i.name == "defines": for j in i.enumerantsByName: if getattr(j, "esVersions", None) == None: continue if getattr(j, "bindTexture", None) == None: continue if 2.0 in j.esVersions and j.bindTexture == True: code += " case %s:\n" % (j.name) code += " break;\n" code += " default:\n" code += ' Warning("%s does not support ",GLenumToString(target)," for ES 2.0.");\n' % ( name ) code += " return;\n" code += " }\n" # glTexSubImage2D constraints for ES 2.0 # http://www.khronos.org/opengles/sdk/docs/man/xhtml/glTexSubImage2D.xml if name == "glTexSubImage2D": code += " if (_context->isES2())\n" code += " switch (target)\n" code += " {\n" for i in api.enums: if i.name == "defines": for j in i.enumerantsByName: if getattr(j, "esVersions", None) == None: continue if getattr(j, "texImage", None) == None: continue if 2.0 in j.esVersions and j.texImage: code += " case %s:\n" % (j.name) code += " break;\n" code += " default:\n" code += ' Warning("%s does not support ",GLenumToString(target)," for ES 2.0.");\n' % ( name ) code += " return;\n" code += " }\n" code += " DispatchTableGL *_next = _dispatch.next();\n" code += " RegalAssert(_next);\n" if es2Name != None: code += " " code += "if (_context->isES2())\n" code += " " if not typeIsVoid(rType): code += "return " code += "_next->call(&_next->%s)(%s);\n" % (es2Name, es2Params) code += " else\n " code += " " if not typeIsVoid(rType): code += "return " code += "_next->call(&_next->%s)(%s);\n" % (name, callParams) code += " break;\n" code += " }\n\n" code += " }\n\n" else: # glTexImage2D internalformat constraints for ES 2.0 # http://www.khronos.org/opengles/sdk/docs/man/xhtml/glTexImage2D.xml if name == "glTexImage2D": code += " if (_context->isES2())\n" code += " {\n" code += " switch (internalformat)\n" code += " {\n" for i in api.enums: if i.name == "defines": for j in i.enumerantsByName: if getattr(j, "esVersions", None) == None: continue if getattr(j, "internalformat", None) == None: continue if 2.0 in j.esVersions and j.internalformat == True: code += " case %s:\n" % (j.name) code += " break;\n" code += " default:\n" code += ( ' Warning("%s does not support ",GLenumToString(internalformat)," for ES 2.0.");\n' % (name) ) code += " return;\n" code += " }\n" code += " if (format!=GLenum(internalformat))\n" code += " {\n" code += ( ' Warning("%s does not support mismatching format and internalformat ",GLenumToString(format),"!=",GLenumToString(internalformat)," for ES 2.0.");\n' % (name) ) code += " return;\n" code += " }\n" code += " }\n" code += " DispatchTableGL *_next = _dispatch.next();\n" code += " RegalAssert(_next);\n" code += " " if es2Name != None: code += "if (_context->isES2())\n" code += " " if not typeIsVoid(rType): code += "return " code += "_next->call(& _next->%s)(%s);\n" % (es2Name, es2Params) code += " else\n " if not typeIsVoid(rType): code += "return " code += "_next->call(& _next->%s)(%s);\n" % (name, callParams) code += "}\n\n" if api.name in cond: code += "#endif // %s\n" % cond[api.name] code += "\n" # Close pending if block. if categoryPrev: code += "\n" return code
def apiFuncDefineCode(apis, args): # code = "" for api in apis: tmp = [] for function in api.functions: name = function.name params = paramsDefaultCode(function.parameters, True) callParams = paramsNameCode(function.parameters) rType = typeCode(function.ret.type) rTypes = rType.strip() category = getattr(function, "category", None) version = getattr(function, "version", None) if category: category = category.replace("_DEPRECATED", "") elif version: category = version.replace(".", "_") category = "GL_VERSION_" + category c = "" c += "REGAL_DECL %sREGAL_CALL %s(%s) \n{\n" % (rType, name, params) emue = [emuFindEntry(function, i["formulae"], i["member"]) for i in emuRegal] if function.needsContext: c += " RegalContext *_context = REGAL_GET_CONTEXT();\n" c += listToString(indent(emuCodeGen(emue, "prefix"), " ")) c += " %s\n" % logFunction(function, "App") c += " if (!_context) return" if typeIsVoid(rType): c += ";\n" else: if rTypes in api.defaults: c += " %s;\n" % (api.defaults[rTypes]) else: if rType[-1] == "*" or typeIsVoidPointer(rType): c += " NULL;\n" else: c += " (%s) 0;\n" % (rTypes) c += listToString(indent(emuCodeGen(emue, "impl"), " ")) if getattr(function, "regalRemap", None) != None and ( isinstance(function.regalRemap, list) or isinstance(function.regalRemap, str) or isinstance(function.regalRemap, unicode) ): # For an ES1 context, pass the call into the dispatch layers... if function.category in ["GL_REGAL_ES1_0_compatibility", "GL_REGAL_ES1_1_compatibility"]: c += " #if REGAL_SYS_ES1\n" c += " if (_context->isES1()) // Pass-through for ES1 only\n" c += " {\n" c += " DispatchTableGL *_next = &_context->dispatcher.front();\n" c += " RegalAssert(_next);\n " if not typeIsVoid(rType): c += "return " c += "_next->call(&_next->%s)(%s);\n" % (name, callParams) if typeIsVoid(rType): c += " return;\n" c += " }\n" c += " #endif\n" # For ES2 or GL context, remap the ES1 call c += " " if not typeIsVoid(rType): c += "return " if isinstance(function.regalRemap, list): c += "\n ".join(function.regalRemap) + "\n" else: c += "%s;\n" % (function.regalRemap) else: if getattr(function, "regalOnly", False) == False: t = "" t += "DispatchTableGL *_next = &_context->dispatcher.front();\n" t += "RegalAssert(_next);\n" t += listToString(indent(emuCodeGen(emue, "pre"), "")) if not typeIsVoid(rType): t += "return " t += "_next->call(&_next->%s)(%s);\n" % (name, callParams) t += listToString(indent(emuCodeGen(emue, "post"), "")) for i in emue: if i != None and i["cond"] != None: t = wrapCIf(i["cond"], indent(t)) c += indent(t) c += listToString(indent(emuCodeGen(emue, "suffix"), " ")) else: c += " %s\n" % logFunction(function, "App") c += listToString(indent(emuCodeGen(emue, "prefix"), " ")) if getattr(function, "regalOnly", False) == False: c += " DispatchTableGlobal *_next = &dispatcherGlobal.front();\n" c += " RegalAssert(_next);\n" if not typeIsVoid(rType): if rTypes in api.defaults: c += " %s ret = %s;\n" % (rTypes, api.defaults[rTypes]) else: if rType[-1] == "*" or typeIsVoidPointer(rType): c += " %s ret = NULL;\n" % rTypes else: c += " %s ret = (%s) 0;\n" % (rTypes, rTypes) c += listToString(indent(emuCodeGen(emue, "impl"), " ")) c += " " if not typeIsVoid(rType): c += "ret = " c += "_next->call(&_next->%s)(%s);\n" % (name, callParams) c += listToString(indent(emuCodeGen(emue, "init"), " ")) c += listToString(indent(emuCodeGen(emue, "suffix"), " ")) if not typeIsVoid(rType): c += " return ret;\n" c += "}\n\n" tmp.append((category, indent(c, " "))) tmp = listToString(unfoldCategory(tmp, " /* %s */")) if api.name in cond: tmp = wrapIf(cond[api.name], tmp) code += tmp return code
def apiEmuFuncDefineCode(apis, args): categoryPrev = None code = '' for api in apis: code += '\n' if api.name in cond: code += '#if %s\n' % cond[api.name] for function in api.functions: if not function.needsContext: continue if getattr(function,'regalOnly',False)==True: continue name = function.name params = paramsDefaultCode(function.parameters, True) callParams = paramsNameCode(function.parameters) rType = typeCode(function.ret.type) category = getattr(function, 'category', None) version = getattr(function, 'version', None) if category: category = category.replace('_DEPRECATED', '') elif version: category = version.replace('.', '_') category = 'GL_VERSION_' + category # Close prev category block. if categoryPrev and not (category == categoryPrev): code += '\n' # Begin new category block. if category and not (category == categoryPrev): code += '// %s\n\n' % category categoryPrev = category emue = [ emuFindEntry( function, i['formulae'], i['member'] ) for i in emu ] if all(i is None for i in emue) and (getattr(function,'regalRemap',None)==None or isinstance(function.regalRemap, str) or isinstance(function.regalRemap, unicode)): continue code += '\nstatic %sREGAL_CALL %s%s(%s) \n{\n' % (rType, 'emu_', name, params) code += ' RegalContext *_context = REGAL_GET_CONTEXT();\n' code += ' RegalAssert(_context);\n' code += ' DispatchTable &_dispatch = _context->dispatcher.emulation;\n' code += '\n' level = [ (emu[i], emuFindEntry( function, emu[i]['formulae'], emu[i]['member'] )) for i in range( len( emue ) - 1 ) ] if not all(i[1]==None or not 'prefix' in i[1] and not 'impl' in i[1] for i in level): code += ' // prefix\n' code += ' switch( _context->emuLevel )\n' code += ' {\n' for i in level: l,e = i[0], i[1] code += ' case %d :\n' % l['level'] if l['ifdef']: code += ' #if %s\n' % l['ifdef'] if e != None and 'prefix' in e and len(e['prefix']): if l['member'] : code += ' if (_context->%s)\n' % l['member'] code += ' {\n' code += ' Push<int> pushLevel(_context->emuLevel);\n' code += ' _context->emuLevel = %d;\n' %( int(l['level']) - 1 ) for j in e['prefix'] : code += ' %s\n' % j if l['member'] : code += ' }\n' if e!= None and 'impl' in e and l['member']: code += ' if (_context->%s) break;\n' % l['member']; if l['ifdef']: code += ' #endif\n' code += ' default:\n' code += ' break;\n' code += ' }\n\n' # Remap, as necessary remap = getattr(function, 'regalRemap', None) es2Name = None if remap!=None and isinstance(remap, dict): es2Name = remap.get('ES2.0',None) es2Params = callParams if es2Name != None: j = es2Name.find('(') if j!=-1: es2Params = es2Name[j+1:-1] es2Name = es2Name[0:j] if not all(i[1]==None or not 'impl' in i[1] for i in level): code += ' // impl\n' code += ' switch( _context->emuLevel )\n' code += ' {\n' for i in level: l,e = i[0], i[1] code += ' case %d :\n' % l['level'] if l['ifdef']: code += ' #if %s\n' % l['ifdef'] if e != None and 'impl' in e and len(e['impl']): if l['member'] : code += ' if (_context->%s)\n' % l['member'] code += ' {\n' code += ' Push<int> pushLevel(_context->emuLevel);\n' code += ' _context->emuLevel = %d;\n' %( int(l['level']) - 1 ) for j in e['impl'] : code += ' %s\n' % j if l['member'] : if l['member'] != "filt" and typeIsVoid(rType): code += ' return;\n' code += ' }\n' if l['ifdef']: code += ' #endif\n' code += ' default: \n' code += ' {\n' # glEnable/glDisable/glIsEnabled constraints for ES 2.0 # http://www.khronos.org/opengles/sdk/docs/man/xhtml/glEnable.xml if name=='glEnable' or name=='glDisable' or name=='glIsEnabled': code += ' #if !REGAL_FORCE_ES2_PROFILE\n' code += ' if (_context->info->es2)\n' code += ' #endif\n' code += ' switch (cap)\n' code += ' {\n' for i in api.enums: if i.name=='defines': for j in i.enumerants: if getattr(j,'esVersions',None) != None and getattr(j,'enableCap',None) != None and 2.0 in j.esVersions and j.enableCap == True: code += ' case %s:\n'%(j.name) code += ' break;\n' code += ' default:\n' code += ' Warning("%s does not support ",GLenumToString(cap)," for ES 2.0.");\n'%(name) if name=='glIsEnabled': code += ' return GL_FALSE;\n' else: code += ' return;\n' code += ' }\n' # glHint constraints for ES 2.0 # http://www.khronos.org/opengles/sdk/docs/man/xhtml/glHint.xml if name=='glHint': code += ' #if !REGAL_FORCE_ES2_PROFILE\n' code += ' if (_context->info->es2)\n' code += ' #endif\n' code += ' switch (target)\n' code += ' {\n' for i in api.enums: if i.name=='defines': for j in i.enumerants: if getattr(j,'esVersions',None)==None: continue if getattr(j,'hint',None)==None: continue if 2.0 in j.esVersions and j.hint == True: code += ' case %s:\n'%(j.name) code += ' break;\n' code += ' default:\n' code += ' Warning("%s does not support ",GLenumToString(target)," for ES 2.0.");\n'%(name) code += ' return;\n' code += ' }\n' # glBindTexture constraints for ES 2.0 # http://www.khronos.org/opengles/sdk/docs/man/xhtml/glBindTexture.xml if name=='glBindTexture': code += ' #if !REGAL_FORCE_ES2_PROFILE\n' code += ' if (_context->info->es2)\n' code += ' #endif\n' code += ' switch (target)\n' code += ' {\n' for i in api.enums: if i.name=='defines': for j in i.enumerants: if getattr(j,'esVersions',None)==None: continue if getattr(j,'bindTexture',None)==None: continue if 2.0 in j.esVersions and j.bindTexture == True: code += ' case %s:\n'%(j.name) code += ' break;\n' code += ' default:\n' code += ' Warning("%s does not support ",GLenumToString(target)," for ES 2.0.");\n'%(name) code += ' return;\n' code += ' }\n' # glTexSubImage2D constraints for ES 2.0 # http://www.khronos.org/opengles/sdk/docs/man/xhtml/glTexSubImage2D.xml if name=='glTexSubImage2D': code += ' #if !REGAL_FORCE_ES2_PROFILE\n' code += ' if (_context->info->es2)\n' code += ' #endif\n' code += ' switch (target)\n' code += ' {\n' for i in api.enums: if i.name=='defines': for j in i.enumerants: if getattr(j,'esVersions',None)==None: continue if getattr(j,'texImage',None)==None: continue if 2.0 in j.esVersions and j.texImage: code += ' case %s:\n'%(j.name) code += ' break;\n' code += ' default:\n' code += ' Warning("%s does not support ",GLenumToString(target)," for ES 2.0.");\n'%(name) code += ' return;\n' code += ' }\n' code += ' DispatchTable *_next = _dispatch._next;\n' code += ' RegalAssert(_next);\n' if es2Name != None: code += ' ' code += 'if (_context->info->es2)\n' code += ' ' if not typeIsVoid(rType): code += 'return ' code += '_next->call(&_next->%s)(%s);\n' % ( es2Name, es2Params ) code += ' else\n ' code += ' ' if not typeIsVoid(rType): code += 'return ' code += '_next->call(&_next->%s)(%s);\n' % ( name, callParams ) code += ' break;\n' code += ' }\n\n' code += ' }\n\n' else: # glTexImage2D internalformat constraints for ES 2.0 # http://www.khronos.org/opengles/sdk/docs/man/xhtml/glTexImage2D.xml if name=='glTexImage2D': code += ' #if !REGAL_FORCE_ES2_PROFILE\n' code += ' if (_context->info->es2)\n' code += ' #endif\n' code += ' {\n' code += ' switch (internalformat)\n' code += ' {\n' for i in api.enums: if i.name=='defines': for j in i.enumerants: if getattr(j,'esVersions',None)==None: continue if getattr(j,'internalformat',None)==None: continue if 2.0 in j.esVersions and j.internalformat == True: code += ' case %s:\n'%(j.name) code += ' break;\n' code += ' default:\n' code += ' Warning("%s does not support ",GLenumToString(internalformat)," for ES 2.0.");\n'%(name) code += ' return;\n' code += ' }\n' code += ' if (format!=GLenum(internalformat))\n' code += ' {\n' code += ' Warning("%s does not support mismatching format and internalformat ",GLenumToString(format),"!=",GLenumToString(internalformat)," for ES 2.0.");\n'%(name) code += ' return;\n' code += ' }\n' code += ' }\n' code += ' DispatchTable *_next = _dispatch._next;\n' code += ' RegalAssert(_next);\n' code += ' ' if es2Name != None: code += 'if (_context->info->es2)\n' code += ' ' if not typeIsVoid(rType): code += 'return ' code += '_next->call(& _next->%s)(%s);\n' % ( es2Name, es2Params ) code += ' else\n ' if not typeIsVoid(rType): code += 'return ' code += '_next->call(& _next->%s)(%s);\n' % ( name, callParams ) code += '}\n\n' if api.name in cond: code += '#endif // %s\n' % cond[api.name] code += '\n' # Close pending if block. if categoryPrev: code += '\n' return code
def apiFuncDefineCode(apis, args): code = '' for api in apis: tmp = [] for function in api.functions: name = function.name params = paramsDefaultCode(function.parameters, True) callParams = paramsNameCode(function.parameters) rType = typeCode(function.ret.type) category = getattr(function, 'category', None) version = getattr(function, 'version', None) if category: category = category.replace('_DEPRECATED', '') elif version: category = version.replace('.', '_') category = 'GL_VERSION_' + category c = '' c += 'REGAL_DECL %sREGAL_CALL %s(%s) \n{\n' % (rType, name, params) emue = [ emuFindEntry(function, i['formulae'], i['member']) for i in emuRegal ] if function.needsContext: c += ' RegalContext *_context = GET_REGAL_CONTEXT();\n' c += ' %s\n' % debugPrintFunction(function, 'App') c += ' if (!_context) return' if typeIsVoid(rType): c += ';\n' else: if rType[-1] != '*': c += ' (%s)0;\n' % (rType) else: c += ' NULL;\n' c += listToString(indent(emuCodeGen(emue, 'impl'), ' ')) if getattr(function, 'regalRemap', None) != None and ( isinstance(function.regalRemap, list) or isinstance(function.regalRemap, str) or isinstance(function.regalRemap, unicode)): c += ' ' if not typeIsVoid(rType): c += 'return ' if isinstance(function.regalRemap, list): c += '\n '.join(function.regalRemap) + '\n' else: c += '%s;\n' % (function.regalRemap) else: if getattr(function, 'regalOnly', False) == False: c += ' DispatchTable *_next = &_context->dispatcher.front();\n' c += ' RegalAssert(_next);\n' c += ' ' if not typeIsVoid(rType): c += 'return ' c += '_next->call(&_next->%s)(%s);\n' % (name, callParams) else: c += ' %s\n' % debugPrintFunction(function, 'App') if api.name == 'egl': c += '\n' c += ' #if !REGAL_STATIC_EGL\n' c += ' if (dispatchTableGlobal.%s == NULL) {\n' % name c += ' GetProcAddress( dispatchTableGlobal.%s, "%s" );\n' % ( name, name) c += ' RegalAssert(dispatchTableGlobal.%s!=%s);\n' % (name, name) c += ' if (dispatchTableGlobal.%s==%s)\n' % (name, name) c += ' dispatchTableGlobal.%s = NULL;\n' % (name) c += ' }\n' if api.name == 'egl': c += ' #endif // !REGAL_STATIC_EGL\n\n' if not typeIsVoid(rType): if rType[-1] != '*': c += ' %s ret = (%s)0;\n' % (rType, rType) else: c += ' %s ret = NULL;\n' % rType c += listToString(indent(emuCodeGen(emue, 'impl'), ' ')) c += ' if (dispatchTableGlobal.%s) {\n' % name c += ' %s\n' % debugPrintFunction(function, 'Driver') c += ' ' if not typeIsVoid(rType): c += 'ret = ' c += 'dispatchTableGlobal.%s(%s);\n' % (name, callParams) if name == 'wglMakeCurrent': c += ' RegalMakeCurrent(RegalSystemContext(hglrc));\n' elif name == 'CGLSetCurrentContext': c += ' RegalMakeCurrent( ctx );\n' elif name == 'glXMakeCurrent': c += ' RegalMakeCurrent( RegalSystemContext(ctx) );\n' elif name == 'eglMakeCurrent': c += ' RegalMakeCurrent( ctx );\n' c += ' }\n' c += ' else\n' c += ' Warning( "%s not available." );\n' % name c += listToString(indent(emuCodeGen(emue, 'suffix'), ' ')) if not typeIsVoid(rType): c += ' return ret;\n' c += '}\n\n' tmp.append((category, c)) tmp = listToString(unfoldCategory(tmp)) if api.name in cond: tmp = wrapIf(cond[api.name], tmp) code += tmp return code