Edit

kc3-lang/angle/scripts/gen_vk_gl_cts_build.py

Branch :

  • Show log

    Commit

  • Author : Eddie Hatfield
    Date : 2022-08-09 14:02:59
    Hash : 3960e63b
    Message : Infra: Enable angle_deqp_gl46_tests on SwiftShader This change disables the WGL frontend by default on Windows when building ANGLE for desktop GL. This is because the WGL frontend is not yet fully implemented and it causes some of the trace tests to fail. The WGL frontend should be enabled by default on windows when more of its functionality gets implemented. Test: angle_deqp_gl46_tests --use-angle=swiftshader Bug: angleproject:7566 Bug: angleproject:7628 Change-Id: I69c695eb56d3858f715eeb86d28cc805e25c60eb Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/3858142 Reviewed-by: Jamie Madill <jmadill@chromium.org> Reviewed-by: Geoff Lang <geofflang@chromium.org> Reviewed-by: Cody Northrop <cnorthrop@google.com> Commit-Queue: Cody Northrop <cnorthrop@google.com>

  • scripts/gen_vk_gl_cts_build.py
  • #!/usr/bin/python3
    #  Copyright 2019 The ANGLE Project Authors. All rights reserved.
    #  Use of this source code is governed by a BSD-style license that can be
    #  found in the LICENSE file.
    #
    #  Code generation for:
    #  - src/tests/deqp_support/BUILD.gn
    #  - src/tests/deqp_data.gni
    #  NOTE: don't run this script directly. Run scripts/run_code_generation.py.
    
    import errno
    import os
    import sys
    import shutil
    
    
    def initDataDirectories(dataDirectories):
        dataDirectories.append(os.path.join("data", "gles2"))
        dataDirectories.append(os.path.join("data", "gles3"))
        dataDirectories.append(os.path.join("data", "gles31"))
        dataDirectories.append(os.path.join("external", "graphicsfuzz", "data", "gles3"))
        dataDirectories.append(os.path.join("external", "openglcts", "data", "gles3"))
        dataDirectories.append(os.path.join("external", "openglcts", "data", "gles31"))
        dataDirectories.append(os.path.join("external", "openglcts", "data", "gles32"))
    
    
    def initPathReplacements(pathReplacements):
        # The GraphicsFuzz data files need the 'external/graphicsfuzz/' prefix removed
        pathToReplace = os.path.join("external", "graphicsfuzz", "")  # Include trailing slash
        pathReplacements[pathToReplace] = ""
        # The KHR dEQP tests expect a root prefix of "gl_cts" for some reason.
        pathToReplace = os.path.join("external", "openglcts", "")  # Include trailing slash
        pathReplacements[pathToReplace] = os.path.join("data", "gl_cts", "")
    
    
    def createBuildGnFile(buildGnPath):
        # Cleanup the old file
        if os.path.exists(buildGnPath):
            os.remove(buildGnPath)
        # Make the new one
        return open(buildGnPath, "w+")
    
    
    def createGniFile(gniFilename):
        # Cleanup the old file
        if os.path.exists(gniFilename):
            os.remove(gniFilename)
        # Make the new one
        return open(gniFilename, "w+")
    
    
    def writeFileHeader(fileIn):
        templateFileHeader = """# GENERATED FILE - DO NOT EDIT.
    # Generated by: {script_name}
    #
    # Copyright 2019 The ANGLE Project Authors. All rights reserved.
    # Use of this source code is governed by a BSD-style license that can be
    # found in the LICENSE file.
    
    """
    
        fileHeader = templateFileHeader.format(script_name=os.path.basename(__file__))
        fileIn.write(fileHeader)
    
    
    def fixDestinationDirectory(pathReplacements, relativeDirectory):
        for pathReplacement in pathReplacements:
            if pathReplacement in relativeDirectory:
                return relativeDirectory.replace(pathReplacement, pathReplacements[pathReplacement])
        return relativeDirectory
    
    
    def convertPathToVarName(path):
        return path.replace(os.sep, "_")
    
    
    def getCMakeLists(deqpSrcDir):
        cmakeLists = []
        for root, directories, filenames in os.walk(deqpSrcDir):
            for filename in filenames:
                relativeDirectory = os.path.relpath(root, deqpSrcDir)
                if filename == "CMakeLists.txt":
                    cmakeLists.append(os.path.join(relativeDirectory, filename))
        return cmakeLists
    
    
    def main():
        # List of directories containing data files
        dataDirectories = []
        # List of directories to exclude from the copy
        excludedDirectories = [
            ".git",
        ]
        # List of files to exclude from the copy
        excludedFilenames = [
            "LICENSE",
        ]
        # Dictionary of parts of paths that need to be replaced
        # Key: Part of path to be replaced
        # Value: What to replace it with
        pathReplacements = {}
        # List of unique relative directories for the copy() command outputs
        relativeDirectories = []
        # VK-GL-CTS source directory
        deqpSourceDirectory = os.path.join("..", "third_party", "VK-GL-CTS", "src")
        # Tests Directory
        testsDirectory = os.path.join("..", "src", "tests")
        # dEQP Support Directory
        deqpSupportDirectory = "deqp_support"
        # BUILD.gn file to write to
        buildGnFilename = "BUILD.gn"
        # Path to BUILD.gn
        buildGnPath = os.path.join(testsDirectory, deqpSupportDirectory, buildGnFilename)
        # dEQP data GNI File to write to
        dataGniFilename = os.path.join(testsDirectory, deqpSupportDirectory, "deqp_data_autogen.gni")
    
        # run_code_generation.py parameters.
        if len(sys.argv) > 1:
            # All CMakeLists.txt in the dEQP source tree (at the time)
            cmakeDirs = getCMakeLists(deqpSourceDirectory)
            inputs = [os.path.join(deqpSourceDirectory, "%s" % dir) for dir in cmakeDirs]
            outputs = [dataGniFilename, buildGnPath]
    
            if sys.argv[1] == 'inputs':
                print(','.join(inputs))
            elif sys.argv[1] == 'outputs':
                print(','.join(outputs))
            else:
                print('Invalid script parameters')
                return 1
            return 0
    
        deqpSrcDir = os.path.abspath(os.path.join(sys.path[0], deqpSourceDirectory))
    
        initDataDirectories(dataDirectories)
        initPathReplacements(pathReplacements)
    
        dataFiles = []
        for dataDir in dataDirectories:
            dataPath = os.path.join(deqpSrcDir, dataDir)
            for root, directories, filenames in os.walk(dataPath):
                for filename in filenames:
                    relativeDirectory = os.path.relpath(root, deqpSrcDir)
                    # Skip any excluded directories
                    if any(directory in relativeDirectory for directory in excludedDirectories):
                        continue
                    # Skip any excluded files
                    if any(excludedFilename in filename for excludedFilename in excludedFilenames):
                        continue
                    # Record the relative directories and full paths to each data file
                    if relativeDirectory not in relativeDirectories:
                        relativeDirectories.append(relativeDirectory)
                    dataFiles.append(os.path.join(relativeDirectory, filename))
    
        dataFiles.sort()
        relativeDirectories.sort(key=convertPathToVarName)
    
        #
        # BUILD.gn
        #
        buildGnFile = createBuildGnFile(buildGnPath)
        writeFileHeader(buildGnFile)
        # Definitions
        buildGnFile.write("deqp_path = \"../../../third_party/VK-GL-CTS/src\"\n")
        # Create the copy() commands
        templateFilesToCopy = """    "$deqp_path/{dataFile}",
    """
        templateCopyCommand = """
    copy("vk_gl_cts_data_{relDir}") {{
      sources = [
        {filesToCopy}
      ]
      outputs = [ "$root_gen_dir/vk_gl_cts_data/{destDir}/{{{{source_file_part}}}}" ]
    }}
    """
        for relativeDirectory in relativeDirectories:
            filesToCopy = ""
            for dataFile in dataFiles:
                path, filename = os.path.split(dataFile)
                if relativeDirectory == path:
                    filesToCopy += templateFilesToCopy.format(dataFile=dataFile.replace(os.sep, '/'))
            copyCommand = ""
            destDir = fixDestinationDirectory(pathReplacements, relativeDirectory)
            copyCommand += templateCopyCommand.format(
                relDir=convertPathToVarName(relativeDirectory),
                filesToCopy=filesToCopy,
                destDir=destDir.replace(os.sep, '/'))
            buildGnFile.write(copyCommand)
    
        #
        # .gni
        #
        gniFile = createGniFile(dataGniFilename)
        writeFileHeader(gniFile)
        # Imports
        templateImports = """import("deqp.gni")
    """
        gniFile.write(templateImports)
        # Write the lists of data file dependencies
        templateDataFiles = """  "$root_gen_dir/vk_gl_cts_data/{dataFile}",
    """
        templateDataFileDeps = """
    {dataDepName} = [
    {files}]
    """
        for dataDirectory in dataDirectories:
            files = ""
            for dataFile in dataFiles:
                if dataDirectory + os.sep in dataFile:
                    files += templateDataFiles.format(
                        dataFile=fixDestinationDirectory(pathReplacements, dataFile).replace(
                            os.sep, '/'))
            dataDepName = "angle_deqp_" + convertPathToVarName(dataDirectory)
            fileDeps = templateDataFileDeps.format(dataDepName=dataDepName, files=files)
            gniFile.write(fileDeps)
    
        templateCopyTarget = """  "{deqpSupportDirectory}:vk_gl_cts_data_{relDir}",
    """
        templateCopyTargets = """
    angle_deqp_data_copy_targets = [
    {targets}]
    """
        targets = ""
        for relativeDirectory in relativeDirectories:
            targets += templateCopyTarget.format(
                deqpSupportDirectory=deqpSupportDirectory,
                relDir=convertPathToVarName(relativeDirectory))
        gniFile.write(templateCopyTargets.format(targets=targets))
    
    
    if __name__ == '__main__':
        sys.exit(main())