/* * Copyright 2015 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #include "SkCommonFlagsConfig.h" #include "SkColorSpace.h" #include "Test.h" #include using sk_gpu_test::GrContextFactory; namespace { // The code // SkCommandLineFlags::StringArray FLAGS_config1 = make_string_array({"a", "b"}) // can be used to construct string array that one gets with command line flags. // For example, the call above is equivalent of // DEFINE_string(config1, "a b", ""); // in cases where the default command line flag value ("a b") is used. // make_string_array can be used to construct StringArray strings that have spaces in // them. SkCommandLineFlags::StringArray make_string_array(std::initializer_list strings) { SkTArray array; for (auto& s : strings) { array.push_back(SkString(s)); } return SkCommandLineFlags::StringArray(array); } } DEF_TEST(ParseConfigs_Gpu, reporter) { // Parses a normal config and returns correct "tag". // Gpu config defaults work. SkCommandLineFlags::StringArray config1 = make_string_array({"gpu"}); SkCommandLineConfigArray configs; ParseConfigs(config1, &configs); REPORTER_ASSERT(reporter, configs.count() == 1); REPORTER_ASSERT(reporter, configs[0]->getTag().equals("gpu")); REPORTER_ASSERT(reporter, configs[0]->getViaParts().count() == 0); #if SK_SUPPORT_GPU REPORTER_ASSERT(reporter, configs[0]->asConfigGpu()); REPORTER_ASSERT(reporter, configs[0]->asConfigGpu()->getContextType() == GrContextFactory::kNativeGL_ContextType); REPORTER_ASSERT(reporter, configs[0]->asConfigGpu()->getUseNVPR() == false); REPORTER_ASSERT(reporter, configs[0]->asConfigGpu()->getUseInstanced() == false); REPORTER_ASSERT(reporter, configs[0]->asConfigGpu()->getUseDIText() == false); REPORTER_ASSERT(reporter, configs[0]->asConfigGpu()->getSamples() == 0); REPORTER_ASSERT(reporter, configs[0]->asConfigGpu()->getColorType() == kN32_SkColorType); REPORTER_ASSERT(reporter, configs[0]->asConfigGpu()->getColorSpace() == nullptr); #endif } DEF_TEST(ParseConfigs_OutParam, reporter) { // Clears the out parameter. SkCommandLineFlags::StringArray config1 = make_string_array({"gpu"}); SkCommandLineConfigArray configs; ParseConfigs(config1, &configs); REPORTER_ASSERT(reporter, configs.count() == 1); REPORTER_ASSERT(reporter, configs[0]->getTag().equals("gpu")); SkCommandLineFlags::StringArray config2 = make_string_array({"8888"}); ParseConfigs(config2, &configs); REPORTER_ASSERT(reporter, configs.count() == 1); REPORTER_ASSERT(reporter, configs[0]->getTag().equals("8888")); SkCommandLineFlags::StringArray config3 = make_string_array({"gl"}); ParseConfigs(config3, &configs); REPORTER_ASSERT(reporter, configs.count() == 1); REPORTER_ASSERT(reporter, configs[0]->getTag().equals("gl")); } DEF_TEST(ParseConfigs_DefaultConfigs, reporter) { // Parses all default configs and returns correct "tag". SkCommandLineFlags::StringArray config1 = make_string_array({ "565", "8888", "debug", "gpu", "gpudebug", "gpudft", "gpunull", "msaa16", "msaa4", "nonrendering", "null", "nullgpu", "nvpr16", "nvpr4", "nvprdit16", "nvprdit4", "pdf", "skp", "svg", "xps", "angle", "angle-gl", "commandbuffer", "mesa", "hwui", "gpuf16", "gpusrgb", "gl", "glnvpr4", "glnvprdit4", "glsrgb", "glmsaa4", "vk", "glinst", "glinst4", "glinstdit4", "glinst16", "glinstdit16", "esinst", "esinst4", "esinstdit4" }); SkCommandLineConfigArray configs; ParseConfigs(config1, &configs); auto srgbColorSpace = SkColorSpace::NewNamed(SkColorSpace::kSRGB_Named); REPORTER_ASSERT(reporter, configs.count() == config1.count()); for (int i = 0; i < config1.count(); ++i) { REPORTER_ASSERT(reporter, configs[i]->getTag().equals(config1[i])); REPORTER_ASSERT(reporter, configs[i]->getViaParts().count() == 0); } #if SK_SUPPORT_GPU REPORTER_ASSERT(reporter, !configs[0]->asConfigGpu()); REPORTER_ASSERT(reporter, !configs[1]->asConfigGpu()); REPORTER_ASSERT(reporter, configs[2]->asConfigGpu()); REPORTER_ASSERT(reporter, configs[3]->asConfigGpu()); REPORTER_ASSERT(reporter, configs[4]->asConfigGpu()); REPORTER_ASSERT(reporter, configs[5]->asConfigGpu()->getUseDIText()); REPORTER_ASSERT(reporter, configs[6]->asConfigGpu()); REPORTER_ASSERT(reporter, configs[7]->asConfigGpu()->getSamples() == 16); REPORTER_ASSERT(reporter, configs[8]->asConfigGpu()->getSamples() == 4); REPORTER_ASSERT(reporter, !configs[9]->asConfigGpu()); REPORTER_ASSERT(reporter, !configs[10]->asConfigGpu()); REPORTER_ASSERT(reporter, configs[11]->asConfigGpu()); REPORTER_ASSERT(reporter, configs[12]->asConfigGpu()->getSamples() == 16); REPORTER_ASSERT(reporter, configs[12]->asConfigGpu()->getUseNVPR()); REPORTER_ASSERT(reporter, !configs[12]->asConfigGpu()->getUseDIText()); REPORTER_ASSERT(reporter, configs[13]->asConfigGpu()->getSamples() == 4); REPORTER_ASSERT(reporter, configs[13]->asConfigGpu()->getUseNVPR()); REPORTER_ASSERT(reporter, !configs[13]->asConfigGpu()->getUseDIText()); REPORTER_ASSERT(reporter, configs[14]->asConfigGpu()->getSamples() == 16); REPORTER_ASSERT(reporter, configs[14]->asConfigGpu()->getUseNVPR()); REPORTER_ASSERT(reporter, configs[14]->asConfigGpu()->getUseDIText()); REPORTER_ASSERT(reporter, configs[15]->asConfigGpu()->getSamples() == 4); REPORTER_ASSERT(reporter, configs[15]->asConfigGpu()->getUseNVPR()); REPORTER_ASSERT(reporter, configs[15]->asConfigGpu()->getUseDIText()); REPORTER_ASSERT(reporter, !configs[16]->asConfigGpu()); REPORTER_ASSERT(reporter, !configs[17]->asConfigGpu()); REPORTER_ASSERT(reporter, !configs[18]->asConfigGpu()); REPORTER_ASSERT(reporter, !configs[19]->asConfigGpu()); REPORTER_ASSERT(reporter, !configs[24]->asConfigGpu()); REPORTER_ASSERT(reporter, configs[25]->asConfigGpu()->getColorType() == kRGBA_F16_SkColorType); REPORTER_ASSERT(reporter, configs[25]->asConfigGpu()->getColorSpace()); REPORTER_ASSERT(reporter, configs[25]->asConfigGpu()->getColorSpace()->gammaIsLinear()); REPORTER_ASSERT(reporter, configs[25]->asConfigGpu()->getColorSpace()->toXYZD50() == srgbColorSpace->toXYZD50()); REPORTER_ASSERT(reporter, configs[26]->asConfigGpu()->getColorType() == kN32_SkColorType); REPORTER_ASSERT(reporter, configs[26]->asConfigGpu()->getColorSpace() == srgbColorSpace.get()); REPORTER_ASSERT(reporter, configs[33]->asConfigGpu()->getContextType() == GrContextFactory::kGL_ContextType); REPORTER_ASSERT(reporter, configs[33]->asConfigGpu()->getUseInstanced()); REPORTER_ASSERT(reporter, configs[34]->asConfigGpu()->getContextType() == GrContextFactory::kGL_ContextType); REPORTER_ASSERT(reporter, configs[34]->asConfigGpu()->getUseInstanced()); REPORTER_ASSERT(reporter, configs[34]->asConfigGpu()->getSamples() == 4); REPORTER_ASSERT(reporter, configs[35]->asConfigGpu()->getContextType() == GrContextFactory::kGL_ContextType); REPORTER_ASSERT(reporter, configs[35]->asConfigGpu()->getUseInstanced()); REPORTER_ASSERT(reporter, configs[35]->asConfigGpu()->getUseDIText()); REPORTER_ASSERT(reporter, configs[35]->asConfigGpu()->getSamples() == 4); REPORTER_ASSERT(reporter, configs[36]->asConfigGpu()->getContextType() == GrContextFactory::kGL_ContextType); REPORTER_ASSERT(reporter, configs[36]->asConfigGpu()->getUseInstanced()); REPORTER_ASSERT(reporter, configs[36]->asConfigGpu()->getSamples() == 16); REPORTER_ASSERT(reporter, configs[37]->asConfigGpu()->getContextType() == GrContextFactory::kGL_ContextType); REPORTER_ASSERT(reporter, configs[37]->asConfigGpu()->getUseInstanced()); REPORTER_ASSERT(reporter, configs[37]->asConfigGpu()->getUseDIText()); REPORTER_ASSERT(reporter, configs[37]->asConfigGpu()->getSamples() == 16); REPORTER_ASSERT(reporter, configs[38]->asConfigGpu()->getContextType() == GrContextFactory::kGLES_ContextType); REPORTER_ASSERT(reporter, configs[38]->asConfigGpu()->getUseInstanced()); REPORTER_ASSERT(reporter, configs[39]->asConfigGpu()->getContextType() == GrContextFactory::kGLES_ContextType); REPORTER_ASSERT(reporter, configs[39]->asConfigGpu()->getUseInstanced()); REPORTER_ASSERT(reporter, configs[39]->asConfigGpu()->getSamples() == 4); REPORTER_ASSERT(reporter, configs[40]->asConfigGpu()->getContextType() == GrContextFactory::kGLES_ContextType); REPORTER_ASSERT(reporter, configs[40]->asConfigGpu()->getUseInstanced()); REPORTER_ASSERT(reporter, configs[40]->asConfigGpu()->getUseDIText()); REPORTER_ASSERT(reporter, configs[40]->asConfigGpu()->getSamples() == 4); #if SK_ANGLE #ifdef SK_BUILD_FOR_WIN REPORTER_ASSERT(reporter, configs[20]->asConfigGpu()); #else REPORTER_ASSERT(reporter, !configs[20]->asConfigGpu()); #endif REPORTER_ASSERT(reporter, configs[21]->asConfigGpu()); #else REPORTER_ASSERT(reporter, !configs[20]->asConfigGpu()); REPORTER_ASSERT(reporter, !configs[21]->asConfigGpu()); #endif #if SK_COMMAND_BUFFER REPORTER_ASSERT(reporter, configs[22]->asConfigGpu()); #else REPORTER_ASSERT(reporter, !configs[22]->asConfigGpu()); #endif #if SK_MESA REPORTER_ASSERT(reporter, configs[23]->asConfigGpu()); #else REPORTER_ASSERT(reporter, !configs[23]->asConfigGpu()); #endif REPORTER_ASSERT(reporter, configs[27]->asConfigGpu()); REPORTER_ASSERT(reporter, configs[28]->asConfigGpu()); REPORTER_ASSERT(reporter, configs[28]->asConfigGpu()->getSamples() == 4); REPORTER_ASSERT(reporter, configs[28]->asConfigGpu()->getUseNVPR()); REPORTER_ASSERT(reporter, configs[29]->asConfigGpu()); REPORTER_ASSERT(reporter, configs[29]->asConfigGpu()->getSamples() == 4); REPORTER_ASSERT(reporter, configs[29]->asConfigGpu()->getUseNVPR()); REPORTER_ASSERT(reporter, configs[29]->asConfigGpu()->getUseDIText()); REPORTER_ASSERT(reporter, configs[30]->asConfigGpu()); REPORTER_ASSERT(reporter, configs[30]->asConfigGpu()->getColorType() == kN32_SkColorType); REPORTER_ASSERT(reporter, configs[30]->asConfigGpu()->getColorSpace() == srgbColorSpace.get()); REPORTER_ASSERT(reporter, configs[31]->asConfigGpu()); REPORTER_ASSERT(reporter, configs[31]->asConfigGpu()->getSamples() == 4); #ifdef SK_VULKAN REPORTER_ASSERT(reporter, configs[32]->asConfigGpu()); #endif #endif } DEF_TEST(ParseConfigs_ExtendedGpuConfigsCorrect, reporter) { SkCommandLineFlags::StringArray config1 = make_string_array({ "gpu(nvpr=true,dit=false)", "gpu(api=angle)", "gpu(api=angle-gl)", "gpu(api=mesa,samples=77)", "gpu(dit=true,api=commandbuffer)", "gpu()", "gpu(api=gles)", "gpu(api=gl)", "gpu(api=vulkan)", }); SkCommandLineConfigArray configs; ParseConfigs(config1, &configs); REPORTER_ASSERT(reporter, configs.count() == config1.count()); for (int i = 0; i < config1.count(); ++i) { REPORTER_ASSERT(reporter, configs[i]->getTag().equals(config1[i])); } #if SK_SUPPORT_GPU REPORTER_ASSERT(reporter, configs[0]->asConfigGpu()->getContextType() == GrContextFactory::kNativeGL_ContextType); REPORTER_ASSERT(reporter, configs[0]->asConfigGpu()->getUseNVPR()); REPORTER_ASSERT(reporter, !configs[0]->asConfigGpu()->getUseDIText()); REPORTER_ASSERT(reporter, configs[0]->asConfigGpu()->getSamples() == 0); #if SK_ANGLE #ifdef SK_BUILD_FOR_WIN REPORTER_ASSERT(reporter, configs[1]->asConfigGpu()->getContextType() == GrContextFactory::kANGLE_ContextType); #else REPORTER_ASSERT(reporter, !configs[1]->asConfigGpu()); #endif REPORTER_ASSERT(reporter, configs[2]->asConfigGpu()->getContextType() == GrContextFactory::kANGLE_GL_ContextType); #else REPORTER_ASSERT(reporter, !configs[1]->asConfigGpu()); REPORTER_ASSERT(reporter, !configs[2]->asConfigGpu()); #endif #if SK_MESA REPORTER_ASSERT(reporter, configs[3]->asConfigGpu()->getContextType() == GrContextFactory::kMESA_ContextType); #else REPORTER_ASSERT(reporter, !configs[3]->asConfigGpu()); #endif #if SK_COMMAND_BUFFER REPORTER_ASSERT(reporter, configs[4]->asConfigGpu()->getContextType() == GrContextFactory::kCommandBuffer_ContextType); #else REPORTER_ASSERT(reporter, !configs[4]->asConfigGpu()); #endif REPORTER_ASSERT(reporter, configs[5]->asConfigGpu()->getContextType() == GrContextFactory::kNativeGL_ContextType); REPORTER_ASSERT(reporter, !configs[5]->asConfigGpu()->getUseNVPR()); REPORTER_ASSERT(reporter, !configs[5]->asConfigGpu()->getUseDIText()); REPORTER_ASSERT(reporter, configs[5]->asConfigGpu()->getSamples() == 0); REPORTER_ASSERT(reporter, configs[6]->asConfigGpu()->getContextType() == GrContextFactory::kGLES_ContextType); REPORTER_ASSERT(reporter, !configs[6]->asConfigGpu()->getUseNVPR()); REPORTER_ASSERT(reporter, !configs[6]->asConfigGpu()->getUseDIText()); REPORTER_ASSERT(reporter, configs[6]->asConfigGpu()->getSamples() == 0); REPORTER_ASSERT(reporter, configs[7]->asConfigGpu()->getContextType() == GrContextFactory::kGL_ContextType); REPORTER_ASSERT(reporter, !configs[7]->asConfigGpu()->getUseNVPR()); REPORTER_ASSERT(reporter, !configs[7]->asConfigGpu()->getUseDIText()); REPORTER_ASSERT(reporter, configs[7]->asConfigGpu()->getSamples() == 0); #ifdef SK_VULKAN REPORTER_ASSERT(reporter, configs[8]->asConfigGpu()->getContextType() == GrContextFactory::kVulkan_ContextType); REPORTER_ASSERT(reporter, !configs[7]->asConfigGpu()->getUseNVPR()); REPORTER_ASSERT(reporter, !configs[7]->asConfigGpu()->getUseDIText()); REPORTER_ASSERT(reporter, configs[7]->asConfigGpu()->getSamples() == 0); #endif #endif } DEF_TEST(ParseConfigs_ExtendedGpuConfigsIncorrect, reporter) { SkCommandLineFlags::StringArray config1 = make_string_array({ "gpu(nvpr=1)", // Number as bool. "gpu(api=gl,)", // Trailing in comma. "gpu(api=angle-glu)", // Unknown api. "gpu(api=,samples=0)", // Empty api. "gpu(samples=true)", // Value true as a number. "gpu(samples=0,samples=0)", // Duplicate option key. "gpu(,samples=0)", // Leading comma. "gpu(samples=54", // Missing closing parenthesis. ",,", "gpu(", // Missing parenthesis. "samples=54" // No backend. "gpu(nvpr=true )", // Space. }); SkCommandLineConfigArray configs; ParseConfigs(config1, &configs); REPORTER_ASSERT(reporter, configs.count() == config1.count()); for (int i = 0; i < config1.count(); ++i) { REPORTER_ASSERT(reporter, configs[i]->getTag().equals(config1[i])); REPORTER_ASSERT(reporter, configs[i]->getBackend().equals(config1[i])); #if SK_SUPPORT_GPU REPORTER_ASSERT(reporter, !configs[i]->asConfigGpu()); #endif } } DEF_TEST(ParseConfigs_ExtendedGpuConfigsSurprises, reporter) { // These just list explicitly some properties of the system. SkCommandLineFlags::StringArray config1 = make_string_array({ // Options are not canonized -> two same configs have a different tag. "gpu(nvpr=true,dit=true)", "gpu(dit=true,nvpr=true)", "gpu(api=debug)", "gpu(api=gl)", "gpu(api=gles)", "" "gpu", "gpu()", "gpu(samples=0)", "gpu(api=gles,samples=0)" }); SkCommandLineConfigArray configs; ParseConfigs(config1, &configs); REPORTER_ASSERT(reporter, configs.count() == config1.count()); for (int i = 0; i < config1.count(); ++i) { REPORTER_ASSERT(reporter, configs[i]->getTag().equals(config1[i])); #if SK_SUPPORT_GPU REPORTER_ASSERT(reporter, configs[i]->getBackend().equals("gpu")); REPORTER_ASSERT(reporter, configs[i]->asConfigGpu()); #else REPORTER_ASSERT(reporter, configs[i]->getBackend().equals(config1[i])); #endif } } DEF_TEST(ParseConfigs_ViaParsing, reporter) { SkCommandLineFlags::StringArray config1 = make_string_array({ "a-b-c-8888", "zz-qq-gpu", "a-angle-gl" }); SkCommandLineConfigArray configs; ParseConfigs(config1, &configs); const struct { const char* backend; const char* vias[3]; } expectedConfigs[] = { {"8888", {"a", "b", "c"}}, {"gpu", {"zz", "qq", nullptr}}, #if SK_ANGLE { "gpu",{ "a", nullptr, nullptr } } // With SK_ANGLE, angle-gl becomes gpu(api=angle-gl) #else { "angle-gl",{ "a", nullptr, nullptr } } // The angle-gl tag is only tag that contains // hyphen. #endif }; for (int i = 0; i < config1.count(); ++i) { REPORTER_ASSERT(reporter, configs[i]->getTag().equals(config1[i])); REPORTER_ASSERT(reporter, configs[i]->getBackend().equals(expectedConfigs[i].backend)); for (int j = 0; j < static_cast(SK_ARRAY_COUNT(expectedConfigs[i].vias)); ++j) { if (!expectedConfigs[i].vias[j]) { REPORTER_ASSERT(reporter, configs[i]->getViaParts().count() == j); break; } REPORTER_ASSERT(reporter, configs[i]->getViaParts()[j].equals(expectedConfigs[i].vias[j])); } } } DEF_TEST(ParseConfigs_ViaParsingExtendedForm, reporter) { SkCommandLineFlags::StringArray config1 = make_string_array({ "zz-qq-gpu(api=gles)", "a-gpu(samples=1", "abc-def-angle-gl(samples=1)", }); SkCommandLineConfigArray configs; ParseConfigs(config1, &configs); const struct { const char* backend; const char* vias[3]; } expectedConfigs[] = { #if SK_SUPPORT_GPU {"gpu", {"zz", "qq", nullptr}}, #else {"gpu(api=gles)", {"zz", "qq", nullptr}}, #endif {"gpu(samples=1", {"a", nullptr, nullptr}}, // This is not extended form, but via still // works as expected. {"gl(samples=1)", {"abc", "def", "angle"}} // This is not extended form. Also // angle-gl is not a "backend" in this case. }; for (int i = 0; i < config1.count(); ++i) { REPORTER_ASSERT(reporter, configs[i]->getTag().equals(config1[i])); REPORTER_ASSERT(reporter, configs[i]->getBackend().equals(expectedConfigs[i].backend)); for (int j = 0; j < static_cast(SK_ARRAY_COUNT(expectedConfigs[i].vias)); ++j) { if (!expectedConfigs[i].vias[j]) { REPORTER_ASSERT(reporter, configs[i]->getViaParts().count() == static_cast(j)); break; } REPORTER_ASSERT(reporter, configs[i]->getViaParts()[j].equals(expectedConfigs[i].vias[j])); } } #if SK_SUPPORT_GPU REPORTER_ASSERT(reporter, configs[0]->asConfigGpu()); REPORTER_ASSERT(reporter, !configs[1]->asConfigGpu()); REPORTER_ASSERT(reporter, !configs[2]->asConfigGpu()); #endif }