Example #1
0
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
Example #2
0
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
Example #3
0
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
Example #4
0
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
Example #5
0
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
Example #6
0
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
Example #7
0
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
Example #8
0
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
Example #9
0
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
Example #10
0
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
Example #11
0
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
Example #12
0
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
Example #13
0
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
Example #14
0
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