VK-GL-CTS(二)

先从代码组织结构分析,然后分开看:代码流程和框架、详细的gl的测试、egl的依赖、其他辅助库

代码组织结构

先直接看看代码的目录结构:

image.png

data : testcase所需要的imge、shader和结果对比图
doc : 各API测试点的说明, 有API分类、testcase的res大小和输出结果格式
excserver : exec server 和 client 模式的代码,三个入口函数再tools目录下。生成lib:xscore; exe: execserver、execserver-test、execserver-client
executor : 和上面的execserver对应,根据tools目录下的cpp生成exe文件和lib。lib:xecore;exe:executor、testlog-to-csv、testlog-to-xml、testlog-to-junit、extract-values、extract-shader-programs、merge-testlogs、extract-sample-lists
external : 所有外部依赖的库和包
framework : 框架部分的代码
modules : 具体testcase的代码
scripts : 编译、使用、结果验证、代码辅助生成等的脚本
target : 编译配置的cmake文件

目标文件

先看下生成的可执行文件都有哪些:

  1. deqp glcts各可执行文件
    VK-GL-CTS-master/CMakeLists.txt中定义了宏add_deqp_module,这个中有add_executable,第一个参数是target名称:
macro (add_deqp_module MODULE_NAME SRCS LIBS ENTRY)
VK-GL-CTS-master/external/openglcts/modules/CMakeLists.txt:
   59: add_deqp_module(glcts "${GLCTS_SRCS}" "${GLCTS_LIBS}" glcTestPackageEntry.cpp)
VK-GL-CTS-master/external/vulkancts/modules/vulkan/CMakeLists.txt:
  150: add_deqp_module(deqp-vk "${DEQP_VK_SRCS}" "${DEQP_VK_LIBS}" vktTestPackageEntry.cpp)
VK-GL-CTS-master/modules/egl/CMakeLists.txt:
  137: add_deqp_module(deqp-egl "${DEQP_EGL_SRCS}" 
VK-GL-CTS-master/modules/gles2/CMakeLists.txt:
   41: add_deqp_module(deqp-gles2 "${DEQP_GLES2_SRCS}" 
VK-GL-CTS-master/modules/gles3/CMakeLists.txt:
   41: add_deqp_module(deqp-gles3 "${DEQP_GLES3_SRCS}" 
VK-GL-CTS-master/modules/gles31/CMakeLists.txt:
   35: add_deqp_module(deqp-gles31 "${DEQP_GLES31_SRCS}" 
VK-GL-CTS-master/modules/internal/CMakeLists.txt:
   38: add_deqp_module(de-internal-tests "${DE_INTERNAL_TESTS_SRCS}" 
  1. 包含工具相关的可执行目标:
    有execserver和log处理相关的可执行程序
VK-GL-CTS-master/execserver/CMakeLists.txt:
   43:  add_executable(execserver tools/xsMain.cpp)
   47:  add_executable(execserver-test tools/xsTest.cpp)
   52:  add_executable(execserver-client tools/xsClient.cpp)
VK-GL-CTS-master/executor/CMakeLists.txt:
   55:  add_executable(executor tools/xeCommandLineExecutor.cpp)
   60:  add_executable(testlog-to-csv tools/xeTestLogCompare.cpp)
   63:  add_executable(testlog-to-xml tools/xeBatchResultToXml.cpp)
   66:  add_executable(testlog-to-junit tools/xeBatchResultToJUnit.cpp)
   69:  add_executable(extract-values tools/xeExtractValues.cpp)
   72:  add_executable(extract-shader-programs tools/xeExtractShaderPrograms.cpp)
   75:  add_executable(merge-testlogs tools/xeMergeTestLogs.cpp)
   78:  add_executable(extract-sample-lists tools/xeExtractSampleLists.cpp)
  1. 独立模块的可执行目标:
    有opengl、vulkan、dethread和随机shader的测试程序。
VK-GL-CTS-master/external/openglcts/modules/CMakeLists.txt:
   74:  add_executable(cts-runner runner/glcTestRunnerMain.cpp glcTestPackageEntry.cpp)
VK-GL-CTS-master/external/vulkancts/modules/vulkan/CMakeLists.txt:
  155:  add_executable(vk-build-programs vktBuildPrograms.cpp)
VK-GL-CTS-master/framework/delibs/dethread/CMakeLists.txt:
   55:  add_executable(dethread_test standalone_test.c)
VK-GL-CTS-master/framework/randomshaders/CMakeLists.txt:
   57:  add_executable(rsgtest rsgTest.cpp)

本文值看opengl相关的测试,vulkan的暂时不看。opengl的主要有:cts-runner、glcts和deqp-gl*等。

cts-runner代码流程:

主程序的入口在runner/glcTestRunnerMain.cpp 中

  • parseCommandLine:解析命令的入参,一套完整的argc和argv参数的解析,包含gl和es的各个版本号。
  • try-catch中进行主体runner函数调用:
    try
    {
        de::UniquePtr platform(createPlatform());
        tcu::DirArchive              archive(".");
        glcts::TestRunner runner(static_cast(*platform.get()), archive, cmdLine.dstLogDir.c_str(),
                                 cmdLine.runType, cmdLine.flags);

        for (;;)
        {
            if (!runner.iterate())
            {
                if (!runner.isConformant())
                {
                    exitStatus = EXIT_FAILURE;
                }

                break;
            }
        }
    }
    catch (const std::exception& e)
    {
        printf("ERROR: %s\n", e.what());
        return -1;
    }
  1. de::UniquePtr platform(createPlatform());
    平台的的定义:
    de是命名空间detail,UniquePtr是独享指针类,在deUniquetr.hpp中定义,一个完整的独享指针类,定义分了三层:class UniqueBase、class MovePtr : public UniqueBase和class UniquePtr : public UniqueBase。通过protected保护内容的修改关系,只能通过move来改变值。对外只留了move方法和构造函数。
    tcu::Platform是个接口在tcuPlatform文件中,没有具体的实现,都是虚函数。后面由不同平台的platform继承和实现:
platform/android/tcuAndroidPlatform.hpp:
   39: class Platform : public tcu::Platform, private eglu::Platform, private glu::Platform, private vk::Platform
platform/ios/tcuIOSPlatform.hh:
   74: class Platform : public tcu::Platform, private glu::Platform
platform/lnx/tcuLnxPlatform.cpp:
   58: class LinuxPlatform : public tcu::Platform
platform/null/tcuNullPlatform.hpp:
   37: class Platform : public tcu::Platform, private glu::Platform, private eglu::Platform, private vk::Platform
platform/nullws/tcuNullWSPlatform.hpp:
   37: class Platform: public tcu::Platform, private glu::Platform, private eglu::Platform
platform/osx/tcuOSXPlatform.cpp:
   94: class OSXPlatform : public tcu::Platform
patform/raspi/tcuRaspiPlatform.hpp:
   38: class Platform : public tcu::Platform, private eglu::Platform, private glu::Platform
platform/surfaceless/tcuSurfacelessPlatform.cpp:
  187: class Platform : public tcu::Platform, public glu::Platform
platform/win32/tcuWin32Platform.hpp:
   38: class Platform : public tcu::Platform, private glu::Platform, private eglu::Platform
  1. tcu::DirArchive archive(".");
    当前文件路径
  2. glcts::TestRunner runner(static_cast(*platform.get()), archive, cmdLine.dstLogDir.c_str(), cmdLine.runType, cmdLine.flags);
    实例化一个TestRunner,只是进行了初始化,没有进行任何操作,具体实现在VK-GL-CTS\external\openglcts\modules\runner\glcTestRunner.cpp中。初始话的参数是命令行的参数,log存放路径、运行的类型。TestRunner类是主要的运行类。
  3. for循环中进行循环运行,iterate是个状态机,TesRunner中通过状态进行控制,完成初始化,启动和注销等所有操作。

TestRunner类

MultipleContextsTests

测试multi context switch的时候后subrotine的uniform是不是会保留。
MultipleContextsTests中addChild(UniformPreservationTest),UniformPreservationTest类在cpp中定义,public方法:iterate
在NoDefaultContextPackage::init(void)中调用:
tcu::TestCaseGroup* gl40Group = new tcu::TestCaseGroup(getTestContext(), "gl40", "");
gl40Group->addChild(new glcts::MultipleContextsTests(getTestContext(), glu::ApiType::core(4, 0)));
addChild(gl40Group);

你可能感兴趣的:(VK-GL-CTS(二))