xref: /aosp_15_r20/external/deqp/scripts/gen_khronos_cts_bp.py (revision 35238bce31c2a825756842865a792f8cf7f89930)
1# -*- coding: utf-8 -*-
2
3#-------------------------------------------------------------------------
4# drawElements Quality Program utilities
5# --------------------------------------
6#
7# Copyright 2024 The Android Open Source Project
8#
9# Licensed under the Apache License, Version 2.0 (the "License");
10# you may not use this file except in compliance with the License.
11# You may obtain a copy of the License at
12#
13#      http://www.apache.org/licenses/LICENSE-2.0
14#
15# Unless required by applicable law or agreed to in writing, software
16# distributed under the License is distributed on an "AS IS" BASIS,
17# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18# See the License for the specific language governing permissions and
19# limitations under the License.
20#
21#-------------------------------------------------------------------------
22
23import os
24import posixpath
25from fnmatch import fnmatch
26
27from ctsbuild.common import DEQP_DIR, writeFile, which, execute
28
29# source code to compile into static lib libkhronoscts_common
30LIB_KHRONOS_CTS_COMMON_SRC_ROOTS = [
31    "execserver",
32    "executor",
33    "framework/common",
34    "framework/delibs",
35    "framework/egl",
36    "framework/opengl",
37    "framework/qphelper",
38    "framework/randomshaders",
39    "framework/referencerenderer",
40    "framework/xexml",
41]
42
43LIB_KHRONOS_CTS_COMMON_INCLUDE_PATTERNS = [
44    "*.cpp",
45    "*.c",
46]
47
48LIB_KHRONOS_CTS_COMMON_EXCLUDE_PATTERNS = [
49    "execserver/xsWin32TestProcess.cpp",
50    "framework/delibs/dethread/standalone_test.c",
51    "framework/randomshaders/rsgTest.cpp",
52    "execserver/tools/*",
53    "executor/tools/*",
54]
55
56LIB_KHRONOS_CTS_COMMON_EXTRA_INCLUDE_DIRS = []
57
58# source code to compile into static lib libkhronoscts_modules_gles
59LIB_KHRONOS_CTS_MODULES_SRC_ROOTS = [
60    "modules",
61]
62
63LIB_KHRONOS_CTS_MODULES_INCLUDE_PATTERNS = [
64    "*.cpp",
65    "*.c",
66]
67
68LIB_KHRONOS_CTS_MODULES_EXCLUDE_PATTERNS = [
69    "modules/egl/teglTestPackageEntry.cpp",
70    "modules/gles2/tes2TestPackageEntry.cpp",
71    "modules/gles3/tes3TestPackageEntry.cpp",
72    "modules/gles31/tes31TestPackageEntry.cpp",
73    "modules/internal/ditTestPackageEntry.cpp",
74]
75
76LIB_KHRONOS_CTS_MODULES_EXTRA_INCLUDE_DIRS = [
77    "external/vulkancts/framework/vulkan",
78    "external/vulkancts/framework/vulkan/generated/vulkan",
79]
80
81# source code to compile into static lib libkhronoscts_openglcts
82LIB_KHRONOS_CTS_OPENGLCTS_SRC_ROOTS = [
83    "external/openglcts",
84]
85
86LIB_KHRONOS_CTS_OPENGLCTS_INCLUDE_PATTERNS = [
87    "*.cpp",
88    "*.c",
89]
90
91LIB_KHRONOS_CTS_OPENGLCTS_EXCLUDE_PATTERNS = [
92    "external/openglcts/modules/gl/gl4cContextFlushControlTests.cpp",
93    "external/openglcts/modules/glcTestPackageEntry.cpp",
94    "external/openglcts/modules/runner/glcAndroidMain.cpp",
95    "external/openglcts/modules/runner/glcAndroidTestActivity.cpp",
96    "external/openglcts/modules/runner/glcTestRunner.cpp",
97    "external/openglcts/modules/runner/glcTestRunnerMain.cpp",
98]
99
100LIB_KHRONOS_CTS_OPENGLCTS_EXTRA_INCLUDE_DIRS = [
101]
102
103# source code to compile into static lib libkhronoscts_vulkancts
104LIB_KHRONOS_CTS_VULKANCTS_SRC_ROOTS = [
105    "external/vulkancts",
106]
107
108LIB_KHRONOS_CTS_VULKANCTS_INCLUDE_PATTERNS = [
109    "*.cpp",
110    "*.c",
111]
112
113LIB_KHRONOS_CTS_VULKANCTS_EXCLUDE_PATTERNS = [
114    "external/vulkancts/framework/vulkan/vkRenderDocUtil.cpp",
115    "external/vulkancts/modules/vulkan/vktBuildPrograms.cpp",
116    "external/vulkancts/modules/vulkan/sc/*",
117    "external/vulkancts/modules/vulkan/vktTestPackageEntrySC.cpp",
118    "external/vulkancts/vkscpc/*",
119    "external/vulkancts/vkscserver/*",
120    "external/vulkancts/modules/vulkan/video/*",
121]
122
123LIB_KHRONOS_CTS_VULKANCTS_EXTRA_INCLUDE_DIRS = [
124    "external/vulkancts/framework/vulkan/generated/vulkan",
125]
126
127# source code to compile into static lib libkhronoscts_platform
128LIB_KHRONOS_CTS_PLATFORM_SRC_ROOTS = [
129    "framework/platform/android",
130    "framework/platform/surfaceless",
131    "external/openglcts/modules/runner",
132]
133
134LIB_KHRONOS_CTS_PLATFORM_INCLUDE_PATTERNS = [
135    "*.cpp",
136    "*.c",
137]
138
139LIB_KHRONOS_CTS_PLATFORM_EXCLUDE_PATTERNS = [
140    "external/openglcts/modules/runner/glcAndroidMain.cpp",
141    "framework/platform/android/tcuAndroidJNI.cpp",
142    "framework/platform/android/tcuAndroidMain.cpp",
143    "framework/platform/android/tcuAndroidPlatformCapabilityQueryJNI.cpp",
144]
145
146LIB_KHRONOS_CTS_PLATFORM_EXTRA_INCLUDE_DIRS = [
147]
148
149AUTO_GEN_WARNING = """// WARNING: This is auto-generated file. Do not modify, since changes will
150// be lost! Modify scripts/gen_khronos_cts_bp.py instead.
151"""
152
153CC_LIBRARY_KHRONOS_COMPILE_OPTION = """
154cc_defaults {
155    name: "khronosctscompilationflag_default",
156    cppflags: [
157        "-fexceptions",
158        "-Wno-non-virtual-dtor",
159        "-Wno-delete-non-virtual-dtor",
160        "-Wno-implicit-int-conversion",
161        "-Wno-implicit-float-conversion",
162        "-Wno-unused-function",
163        "-Wno-enum-float-conversion",
164        "-Wno-missing-field-initializers",
165        "-Wno-switch",
166        "-Wno-unused-parameter",
167        "-Wno-unused-variable",
168        "-Wno-macro-redefined",
169    ],
170
171    cpp_std: "c++17",
172    cflags: [
173        // Amber defines.
174        "-DAMBER_CTS_VULKAN_HEADER=1",
175        "-DAMBER_ENABLE_CLSPV=0",
176        "-DAMBER_ENABLE_DXC=0",
177        "-DAMBER_ENABLE_LODEPNG=1", // This has no effect.
178        "-DAMBER_ENABLE_RTTI=1",
179        "-DAMBER_ENABLE_SHADERC=0",
180        "-DAMBER_ENABLE_SPIRV_TOOLS=0",
181        "-DAMBER_ENABLE_VK_DEBUGGING=0",
182        "-DAMBER_ENGINE_DAWN=0",
183        "-DAMBER_ENGINE_VULKAN=1",
184
185        // glslang defines:
186        "-DENABLE_HLSL",
187        "-DENABLE_OPT=0",
188        "-DGLSLANG_OSINCLUDE_UNIX",
189
190        // SPIRV-Tools defines:
191        "-DSPIRV_ANDROID",
192        "-DSPIRV_CHECK_CONTEXT",
193        "-DSPIRV_COLOR_TERMINAL",
194        "-DSPIRV_TIMER_ENABLED",
195
196        // Android/Clang defines (not needed):
197        // -D_FORTIFY_SOURCE=2
198        // -DANDROID
199        // -DNDEBUG
200
201        // dEQP defines that we don't want/need:
202        // -DDE_DEBUG
203        // -DDEQP_USE_RELEASE_INFO_FILE
204        // -DPNG_DEBUG
205
206        // dEQP defines that are worked out in deDefs.h, without needing
207        // explicit defs:
208        // -DDE_PTR_SIZE=8
209        // -DDE_CPU=DE_CPU_ARM_64
210        //"-DDE_FENV_ACCESS_ON=_Pragma(\"STDC FENV_ACCESS ON\")",
211
212        // dEQP defines:
213        "-D_XOPEN_SOURCE=600",
214        "-DDE_ANDROID_API=28",
215        "-DDE_ASSERT_FAILURE_CALLBACK",
216        "-DDE_COMPILER=DE_COMPILER_CLANG",
217        "-DDE_MINGW=0",
218        "-DDE_OS=DE_OS_ANDROID",
219        "-DDEQP_GLES2_DIRECT_LINK=1",
220        "-DDEQP_HAVE_RENDERDOC_HEADER=0", // Needs to be 0.
221        "-DDEQP_EXCLUDE_VK_VIDEO_TESTS",
222        "-DDEQP_SUPPORT_DRM=0",
223        "-DDEQP_SUPPORT_GLES1=1",
224        "-DDEQP_TARGET_NAME=\\"Android\\"",
225        "-DQP_SUPPORT_PNG",
226        "-DCTS_USES_VULKAN",
227
228        "-Wall",
229        "-Werror",
230        "-Wconversion",
231
232        "-fwrapv",
233
234        "-Wno-implicit-fallthrough",
235        "-Wno-sign-conversion",
236        "-Wno-unused-private-field",
237        "-Wno-shorten-64-to-32",
238    ],
239
240    include_dirs: [
241        "external/deqp-deps/SPIRV-Headers/include",
242    ],
243
244    header_libs: ["jni_headers"],
245    shared_libs: ["libandroid"],
246
247    sdk_version: "current",
248    rtti: true,
249    stl: "c++_static",
250}
251"""
252
253CC_LIBRARY_STATIC_TEMPLATE = """
254
255cc_library_static {
256    name: "{CC_STATIC_LIB_NAME}",
257
258    defaults: ["khronosctscompilationflag_default"],
259
260    srcs: [
261{SRC_FILES}    ],
262    export_include_dirs: [
263{EXPORT_INCLUDES}    ],
264    static_libs: [
265{STATIC_LIBS}    ],
266}
267
268"""[1:-1]
269
270def matchesAny (filename, patterns):
271    for ptrn in patterns:
272        if fnmatch(filename, ptrn):
273            return True
274    return False
275
276def isSourceFile (filename, include_patterns, exclude_patterns):
277    return matchesAny(filename, include_patterns) and not matchesAny(filename, exclude_patterns)
278
279def toPortablePath (nativePath):
280    # os.path is so convenient...
281    head, tail = os.path.split(nativePath)
282    components = [tail]
283
284    while head != None and head != '':
285        head, tail = os.path.split(head)
286        components.append(tail)
287
288    components.reverse()
289
290    portablePath = ""
291    for component in components:
292        portablePath = posixpath.join(portablePath, component)
293
294    return portablePath
295
296def getSourceFiles (src_roots, include_patterns, exclude_patterns):
297    sources = []
298
299    for srcRoot in src_roots:
300        baseDir = os.path.join(DEQP_DIR, srcRoot)
301        for root, dirs, files in os.walk(baseDir):
302            for file in files:
303                absPath = os.path.join(root, file)
304                nativeRelPath = os.path.relpath(absPath, DEQP_DIR)
305                portablePath = toPortablePath(nativeRelPath)
306
307                if isSourceFile(portablePath, include_patterns, exclude_patterns):
308                    sources.append(portablePath)
309
310    sources.sort()
311
312    return sources
313
314def getSourceDirs (sourceFiles, extra_include_dirs):
315    seenDirs = set()
316    sourceDirs = []
317
318    for sourceFile in sourceFiles:
319        sourceDir = posixpath.dirname(sourceFile)
320
321        if not sourceDir in seenDirs:
322            sourceDirs.append(sourceDir)
323            seenDirs.add(sourceDir)
324
325    sourceDirs.extend(extra_include_dirs)
326    sourceDirs.sort()
327
328    return sourceDirs
329
330def genBpStringList (items):
331    src = ""
332
333    for item in items:
334        src += "        \"%s\",\n" % item
335
336    return src
337
338def genCCStaticLibrary (ccStaticLibName, sourceDirs, sourceFiles, staticLibs):
339    src = CC_LIBRARY_STATIC_TEMPLATE
340    src = src.replace("{EXPORT_INCLUDES}", genBpStringList(sourceDirs))
341    src = src.replace("{SRC_FILES}", genBpStringList(sourceFiles))
342    src = src.replace("{CC_STATIC_LIB_NAME}", ccStaticLibName)
343    src = src.replace("{STATIC_LIBS}", genBpStringList(staticLibs))
344
345    return src
346
347if __name__ == "__main__":
348    # Android bp content for compiling static lib libkhronoscts_common
349    libKhronosCTSCommonSourceFiles = getSourceFiles(LIB_KHRONOS_CTS_COMMON_SRC_ROOTS,
350                                                            LIB_KHRONOS_CTS_COMMON_INCLUDE_PATTERNS,
351                                                            LIB_KHRONOS_CTS_COMMON_EXCLUDE_PATTERNS)
352    libKhronosCTSCommonSourceDirs = getSourceDirs(libKhronosCTSCommonSourceFiles,
353                                                            LIB_KHRONOS_CTS_COMMON_EXTRA_INCLUDE_DIRS)
354    libKhronosCTSCommonStaticLibs = ["libpng_ndk"]
355    libKhronosCTSCommonAndroidBpText = genCCStaticLibrary("libkhronoscts_common",
356                                                                libKhronosCTSCommonSourceDirs,
357                                                                libKhronosCTSCommonSourceFiles,
358                                                            libKhronosCTSCommonStaticLibs)
359
360    # Android bp content for compiling static lib libkhronoscts_modules_gles
361    libKhronosCTSModulesSourceFiles = getSourceFiles(LIB_KHRONOS_CTS_MODULES_SRC_ROOTS,
362                                                        LIB_KHRONOS_CTS_MODULES_INCLUDE_PATTERNS,
363                                                        LIB_KHRONOS_CTS_MODULES_EXCLUDE_PATTERNS)
364    libKhronosCTSModulesSourceDirs = getSourceDirs(libKhronosCTSModulesSourceFiles,
365                                                                LIB_KHRONOS_CTS_MODULES_EXTRA_INCLUDE_DIRS)
366    libKhronosCTSModulesStaticLibs = ["libkhronoscts_common"]
367    libKhronosCTSModulesAndroidBpText = genCCStaticLibrary("libkhronoscts_modules_gles",
368                                                                    libKhronosCTSModulesSourceDirs,
369                                                                    libKhronosCTSModulesSourceFiles,
370                                                                    libKhronosCTSModulesStaticLibs)
371
372    # Android bp content for compiling static lib libkhronoscts_openglcts
373    libKhronosCTSOpenGLCTSSourceFiles = getSourceFiles(LIB_KHRONOS_CTS_OPENGLCTS_SRC_ROOTS,
374                                                    LIB_KHRONOS_CTS_OPENGLCTS_INCLUDE_PATTERNS,
375                                                    LIB_KHRONOS_CTS_OPENGLCTS_EXCLUDE_PATTERNS)
376    libKhronosCTSOpenGLCTSSourceDirs = getSourceDirs(libKhronosCTSOpenGLCTSSourceFiles,
377                                                    LIB_KHRONOS_CTS_OPENGLCTS_EXTRA_INCLUDE_DIRS)
378    libKhronosCTSOpenGLCTSStaticLibs = ["libkhronoscts_common",
379                                        "libkhronoscts_modules_gles",
380                                        "deqp_glslang_SPIRV",
381                                        "deqp_spirv-tools"]
382    libKhronosCTSOpenGLCTSAndroidBpText = genCCStaticLibrary("libkhronoscts_openglcts",
383                                                            libKhronosCTSOpenGLCTSSourceDirs,
384                                                            libKhronosCTSOpenGLCTSSourceFiles,
385                                                            libKhronosCTSOpenGLCTSStaticLibs)
386
387    # Android bp content for compiling static lib libkhronoscts_vulkancts
388    libKhronosCTSVulkanCTSSourceFiles = getSourceFiles(LIB_KHRONOS_CTS_VULKANCTS_SRC_ROOTS,
389                                                    LIB_KHRONOS_CTS_VULKANCTS_INCLUDE_PATTERNS,
390                                                    LIB_KHRONOS_CTS_VULKANCTS_EXCLUDE_PATTERNS)
391    libKhronosCTSVulkanCTSSourceDirs = getSourceDirs(libKhronosCTSVulkanCTSSourceFiles,
392                                                    LIB_KHRONOS_CTS_VULKANCTS_EXTRA_INCLUDE_DIRS)
393    libKhronosCTSVulkanCTSStaticLibs = ["libkhronoscts_common",
394                                        "deqp_glslang_glslang",
395                                        "deqp_spirv-tools",
396                                        "deqp_amber"]
397    libKhronosCTSVulkanCTSAndroidBpText = genCCStaticLibrary("libkhronoscts_vulkancts",
398                                                        libKhronosCTSVulkanCTSSourceDirs,
399                                                        libKhronosCTSVulkanCTSSourceFiles,
400                                                        libKhronosCTSVulkanCTSStaticLibs)
401
402    # Android bp content for compiling libkhronoscts_platform
403    libKhronosCTSPlatformSourceFiles = getSourceFiles(LIB_KHRONOS_CTS_PLATFORM_SRC_ROOTS,
404                                                LIB_KHRONOS_CTS_PLATFORM_INCLUDE_PATTERNS,
405                                                LIB_KHRONOS_CTS_PLATFORM_EXCLUDE_PATTERNS)
406    libKhronosCTSPlatformSourceDirs = getSourceDirs(libKhronosCTSPlatformSourceFiles,
407                                                    LIB_KHRONOS_CTS_PLATFORM_EXTRA_INCLUDE_DIRS)
408    libKhronosCTSPlatformStaticLibs = ["libkhronoscts_common",
409                                        "libkhronoscts_modules_gles",
410                                        "libkhronoscts_vulkancts",
411                                        "libkhronoscts_openglcts"]
412    libKhronosCTSPlatformAndroidBpText = genCCStaticLibrary("libkhronoscts_platform",
413                                                        libKhronosCTSPlatformSourceDirs,
414                                                        libKhronosCTSPlatformSourceFiles,
415                                                        libKhronosCTSPlatformStaticLibs)
416
417    # put everything together into the final Android bp content
418    libKhronosCTSAndroidBpText = "".join([AUTO_GEN_WARNING,
419                                            CC_LIBRARY_KHRONOS_COMPILE_OPTION,
420                                            libKhronosCTSCommonAndroidBpText,
421                                            libKhronosCTSModulesAndroidBpText,
422                                            libKhronosCTSOpenGLCTSAndroidBpText,
423                                            libKhronosCTSVulkanCTSAndroidBpText,
424                                            libKhronosCTSPlatformAndroidBpText])
425    writeFile(os.path.join(DEQP_DIR, "AndroidKhronosCTSGen.bp"), libKhronosCTSAndroidBpText)
426