Edit

kc3-lang/angle/scripts/gen_vk_gl_cts_build.py

Branch :

  • Show log

    Commit

  • Author : Courtney Goeltzenleuchter
    Date : 2019-12-18 16:37:20
    Hash : 7dfc99e5
    Message : Vulkan: Update dEQP source for test fixes Also fix scripts/gen_vk_gl_cts_build.py to always use '/' as file separator. Otherwise, running the script on Windows uses '\' which Linux doesn't like. Test: angle_deqp_gles31_tests --use-angle=swiftshader --gtest_filter=dEQP.GLES31/functional_debug_negative_coverage_get_error_vertex_array_draw_range_elements Bug: angleproject:2324 Bug: angleproject:4234 Change-Id: I3b212e0d0ba97996f1d86f7fc81e58c3b03a9cbb Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/1975020 Commit-Queue: Courtney Goeltzenleuchter <courtneygo@google.com> Reviewed-by: Jamie Madill <jmadill@chromium.org>

  • scripts/gen_vk_gl_cts_build.py
  • #  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"))
    
    
    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())