Example #1
0
def main(argsstring, options, profile):
    version,extensions,funcslist,funcsblacklist = flext.parse_profile(profile)

    # Download spec file(s) if necessary
    if version.api == 'vulkan':
        if version.release:
            version_string = 'v{}.{}.{}'.format(version.major, version.minor, version.release)
            if version.major == 1 and version.minor == 0:
                spec_url = flext.vk_spec_url10.format(version_string)
            else:
                spec_url = flext.vk_spec_url.format(version_string)
            spec_file = 'vk.{}.xml'.format(version_string)
        else:
            spec_url = flext.vk_spec_url.format('master')
            spec_file = 'vk.xml'
    else:
        spec_url = flext.gl_spec_url
        spec_file = 'gl.xml'

    flext.download_spec(spec_url, spec_file, options.download)

    # Parse spec
    passthru, enums, functions, types, raw_enums = flext.parse_xml(spec_file, version, extensions, funcslist, funcsblacklist)

    # Generate source from templates
    flext.generate_source(argsstring, options, version, enums, functions,
        passthru, extensions, types, raw_enums)
Example #2
0
def main():
    # Read command line arguments and profile settings
    options,profile = parse_args()    
    version,extensions = flext.parse_profile(profile)

    # Download spec file(s) if necessary
    flext.download_spec(options.download)

    # Parse spec
    passthru, enums, functions = flext.parse_xml(version, extensions)

    # Generate source from templates
    flext.generate_source(options, version, enums, functions, passthru, extensions)
Example #3
0
def main():
    # Read command line arguments and profile settings
    options, profile = parse_args()
    version, extensions = flext.parse_profile(profile)

    # Download spec file(s) if necessary
    flext.download_spec(options.download)

    # Parse spec
    passthru, enums, functions = flext.parse_xml(version, extensions)

    # Generate source from templates
    flext.generate_source(options, version, enums, functions, passthru,
                          extensions)
Example #4
0
def main(options, profile):
    version,extensions,funcslist,funcsblacklist = flext.parse_profile(profile)

    # Download spec file(s) if necessary
    if version.api == 'vulkan':
        if version.release:
            version_string = 'v{}.{}.{}'.format(version.major, version.minor, version.release)
            spec_url = flext.vk_spec_url.format(version_string)
            spec_file = 'vk.{}.xml'.format(version_string)
        else:
            spec_url = flext.vk_spec_url.format('master')
            spec_file = 'vk.xml'
    else:
        spec_url = flext.gl_spec_url
        spec_file = 'gl.xml'

    flext.download_spec(spec_url, spec_file, options.download)

    # Parse spec
    passthru, enums, functions, types, raw_enums = flext.parse_xml(spec_file, version, extensions, funcslist, funcsblacklist)

    # Generate source from templates
    flext.generate_source(options, version, enums, functions, passthru,
                          extensions, types, raw_enums)
Example #5
0
def main(argsstring, options, profile):
    version, extraspecs, extensions, funcslist, funcsblacklist = flext.parse_profile(
        profile)

    # Download spec file(s) if necessary
    if version.api == 'vulkan':
        if version.release:
            version_string = 'v{}.{}.{}'.format(version.major, version.minor,
                                                version.release)
            if version.major == 1 and version.minor == 0:
                spec_url = flext.vk_spec_url10.format(version_string)
            else:
                spec_url = flext.vk_spec_url.format(version_string)
            spec_file = 'vk.{}.xml'.format(version_string)
        else:
            spec_url = flext.vk_spec_url.format('main')
            spec_file = 'vk.xml'
    else:
        spec_url = flext.gl_spec_url
        spec_file = 'gl.xml'

    flext.download_spec(spec_url, spec_file, options.download)
    xml = etree.parse(os.path.join(flext.spec_dir, spec_file))
    root = xml.getroot()

    # If there are extra spec files, download them and merge into the main one
    for extraspec in extraspecs:
        # If extraspec exists locally, use directly, otherwise download
        if os.path.exists(os.path.join(os.path.dirname(profile), extraspec)):
            spec_file_local = os.path.join(os.path.dirname(profile), extraspec)
        else:
            spec_file = os.path.basename(urllib.parse.urlparse(extraspec).path)
            spec_file_local = os.path.join(flext.spec_dir, spec_file)
            flext.download_spec(extraspec, spec_file, options.download)

        # IF ONLY it would be so easy, implementing a generic way to merge the
        # spec files, eh? NOPE, WE'RE GOOGLE, WE DON'T CARE TO PUBLISH THE
        # EXTENSIONS UPSTREAM AND WE DON'T CARE ABOUT HAVING THE FILE VALID
        # EITHER! CHROME! FTW!! WE OWN THE WORLD, YAKNOW?!?!
        with open(spec_file_local, 'r') as f:
            data = f.read()
            # 1. gl_angle_ext.xml uses `<ptype>const GLtype *</ptype>` instead
            #    of `const <ptype>GLsizei</ptype> *` so we have to patch it
            #   first to get something valid
            data = re.sub(_gl_angle_ext_patch_re, _gl_angle_ext_patch_sub,
                          data)
            # 2. `<ptype>const void*</ptype>` is not valid either, it should
            #    not be wrapped in that tag at all
            data = re.sub(_gl_angle_ext_patch_void_re,
                          _gl_angle_ext_patch_void_sub, data)

        # ET, THE F**K is this?! https://stackoverflow.com/a/18281386
        extra = etree.ElementTree(etree.fromstring(data)).getroot()

        # The <comment> field is ignored

        # The <extensions> and <commands> contents are merged
        for i in ['extensions', 'commands']:
            extension_point = root.findall('./{}'.format(i))[0]
            for member in extra.iter(i):
                extension_point.extend(member)

        # The <enums> blocks are appended. Ideally this would be inserted right
        # after all the <enums> in the original file, but it doesn't really
        # matter FOR THE MACHINE GOD so I won'ลง bother.
        for enum in extra.iter('enums'):
            root.append(enum)

    # Might be useful for debugging someday
    # xml.write(os.path.join(flext.spec_dir, 'merged_' + spec_file))

    # Parse spec
    passthru, enums, functions, types, raw_enums = flext.parse_xml(
        root, version, extensions, funcslist, funcsblacklist)

    # Generate source from templates
    flext.generate_source(argsstring, options, version, enums, functions,
                          passthru, extensions, types, raw_enums)