1d63442d87c6d35af4b2771a30a80e67d6aa92b68Mike Klein/* 2d63442d87c6d35af4b2771a30a80e67d6aa92b68Mike Klein * Copyright 2017 Google Inc. 3d63442d87c6d35af4b2771a30a80e67d6aa92b68Mike Klein * 4d63442d87c6d35af4b2771a30a80e67d6aa92b68Mike Klein * Use of this source code is governed by a BSD-style license that can be 5d63442d87c6d35af4b2771a30a80e67d6aa92b68Mike Klein * found in the LICENSE file. 6d63442d87c6d35af4b2771a30a80e67d6aa92b68Mike Klein */ 7d63442d87c6d35af4b2771a30a80e67d6aa92b68Mike Klein 8d63442d87c6d35af4b2771a30a80e67d6aa92b68Mike Klein#include "ok.h" 9d63442d87c6d35af4b2771a30a80e67d6aa92b68Mike Klein#include "Test.h" 10d63442d87c6d35af4b2771a30a80e67d6aa92b68Mike Klein 11d63442d87c6d35af4b2771a30a80e67d6aa92b68Mike Kleinstruct TestStream : Stream { 12d63442d87c6d35af4b2771a30a80e67d6aa92b68Mike Klein const skiatest::TestRegistry* registry = skiatest::TestRegistry::Head(); 136105e4bf2da14d07d4c19576a67e000f51711c9dMike Klein bool extended = false, verbose = false; 14d63442d87c6d35af4b2771a30a80e67d6aa92b68Mike Klein 156105e4bf2da14d07d4c19576a67e000f51711c9dMike Klein static std::unique_ptr<Stream> Create(Options options) { 16d63442d87c6d35af4b2771a30a80e67d6aa92b68Mike Klein TestStream stream; 176105e4bf2da14d07d4c19576a67e000f51711c9dMike Klein if (options("extended") != "") { stream.extended = true; } 186105e4bf2da14d07d4c19576a67e000f51711c9dMike Klein if (options("verbose" ) != "") { stream.verbose = true; } 196105e4bf2da14d07d4c19576a67e000f51711c9dMike Klein 20d63442d87c6d35af4b2771a30a80e67d6aa92b68Mike Klein return move_unique(stream); 21d63442d87c6d35af4b2771a30a80e67d6aa92b68Mike Klein } 22d63442d87c6d35af4b2771a30a80e67d6aa92b68Mike Klein 23d63442d87c6d35af4b2771a30a80e67d6aa92b68Mike Klein struct TestSrc : Src { 24d63442d87c6d35af4b2771a30a80e67d6aa92b68Mike Klein skiatest::Test test {"", false, nullptr}; 256105e4bf2da14d07d4c19576a67e000f51711c9dMike Klein bool extended, verbose; 26d63442d87c6d35af4b2771a30a80e67d6aa92b68Mike Klein 27d63442d87c6d35af4b2771a30a80e67d6aa92b68Mike Klein std::string name() override { return test.name; } 28d63442d87c6d35af4b2771a30a80e67d6aa92b68Mike Klein SkISize size() override { return {0,0}; } 29d63442d87c6d35af4b2771a30a80e67d6aa92b68Mike Klein 30d63442d87c6d35af4b2771a30a80e67d6aa92b68Mike Klein bool draw(SkCanvas*) override { 316105e4bf2da14d07d4c19576a67e000f51711c9dMike Klein // TODO(mtklein): GrContext 326105e4bf2da14d07d4c19576a67e000f51711c9dMike Klein 336105e4bf2da14d07d4c19576a67e000f51711c9dMike Klein struct : public skiatest::Reporter { 346105e4bf2da14d07d4c19576a67e000f51711c9dMike Klein bool ok = true; 356105e4bf2da14d07d4c19576a67e000f51711c9dMike Klein const char* name; 366105e4bf2da14d07d4c19576a67e000f51711c9dMike Klein bool extended, verbose_; 376105e4bf2da14d07d4c19576a67e000f51711c9dMike Klein 386105e4bf2da14d07d4c19576a67e000f51711c9dMike Klein void reportFailed(const skiatest::Failure& failure) override { 396105e4bf2da14d07d4c19576a67e000f51711c9dMike Klein SkDebugf("%s: %s\n", name, failure.toString().c_str()); 406105e4bf2da14d07d4c19576a67e000f51711c9dMike Klein ok = false; 416105e4bf2da14d07d4c19576a67e000f51711c9dMike Klein } 426105e4bf2da14d07d4c19576a67e000f51711c9dMike Klein bool allowExtendedTest() const override { return extended; } 436105e4bf2da14d07d4c19576a67e000f51711c9dMike Klein bool verbose() const override { return verbose_; } 446105e4bf2da14d07d4c19576a67e000f51711c9dMike Klein } reporter; 456105e4bf2da14d07d4c19576a67e000f51711c9dMike Klein reporter.name = test.name; 466105e4bf2da14d07d4c19576a67e000f51711c9dMike Klein reporter.extended = extended; 476105e4bf2da14d07d4c19576a67e000f51711c9dMike Klein reporter.verbose_ = verbose; 486105e4bf2da14d07d4c19576a67e000f51711c9dMike Klein 496105e4bf2da14d07d4c19576a67e000f51711c9dMike Klein test.proc(&reporter, nullptr); 506105e4bf2da14d07d4c19576a67e000f51711c9dMike Klein return reporter.ok; 51d63442d87c6d35af4b2771a30a80e67d6aa92b68Mike Klein } 52d63442d87c6d35af4b2771a30a80e67d6aa92b68Mike Klein }; 53d63442d87c6d35af4b2771a30a80e67d6aa92b68Mike Klein 54d63442d87c6d35af4b2771a30a80e67d6aa92b68Mike Klein std::unique_ptr<Src> next() override { 55d63442d87c6d35af4b2771a30a80e67d6aa92b68Mike Klein if (!registry) { 56d63442d87c6d35af4b2771a30a80e67d6aa92b68Mike Klein return nullptr; 57d63442d87c6d35af4b2771a30a80e67d6aa92b68Mike Klein } 58d63442d87c6d35af4b2771a30a80e67d6aa92b68Mike Klein TestSrc src; 59d63442d87c6d35af4b2771a30a80e67d6aa92b68Mike Klein src.test = registry->factory(); 606105e4bf2da14d07d4c19576a67e000f51711c9dMike Klein src.extended = extended; 616105e4bf2da14d07d4c19576a67e000f51711c9dMike Klein src.verbose = verbose; 62d63442d87c6d35af4b2771a30a80e67d6aa92b68Mike Klein registry = registry->next(); 63d63442d87c6d35af4b2771a30a80e67d6aa92b68Mike Klein return move_unique(src); 64d63442d87c6d35af4b2771a30a80e67d6aa92b68Mike Klein } 65d63442d87c6d35af4b2771a30a80e67d6aa92b68Mike Klein}; 66d63442d87c6d35af4b2771a30a80e67d6aa92b68Mike Kleinstatic Register test{"test", TestStream::Create}; 67d63442d87c6d35af4b2771a30a80e67d6aa92b68Mike Klein 68d63442d87c6d35af4b2771a30a80e67d6aa92b68Mike Klein// Hey, now why were these defined in DM.cpp? That's kind of weird. 69d63442d87c6d35af4b2771a30a80e67d6aa92b68Mike Kleinnamespace skiatest { 70d63442d87c6d35af4b2771a30a80e67d6aa92b68Mike Klein#if SK_SUPPORT_GPU 71d63442d87c6d35af4b2771a30a80e67d6aa92b68Mike Klein bool IsGLContextType(sk_gpu_test::GrContextFactory::ContextType type) { 72d63442d87c6d35af4b2771a30a80e67d6aa92b68Mike Klein return kOpenGL_GrBackend == sk_gpu_test::GrContextFactory::ContextTypeBackend(type); 73d63442d87c6d35af4b2771a30a80e67d6aa92b68Mike Klein } 74d63442d87c6d35af4b2771a30a80e67d6aa92b68Mike Klein bool IsVulkanContextType(sk_gpu_test::GrContextFactory::ContextType type) { 75d63442d87c6d35af4b2771a30a80e67d6aa92b68Mike Klein return kVulkan_GrBackend == sk_gpu_test::GrContextFactory::ContextTypeBackend(type); 76d63442d87c6d35af4b2771a30a80e67d6aa92b68Mike Klein } 77d63442d87c6d35af4b2771a30a80e67d6aa92b68Mike Klein bool IsRenderingGLContextType(sk_gpu_test::GrContextFactory::ContextType type) { 78d63442d87c6d35af4b2771a30a80e67d6aa92b68Mike Klein return IsGLContextType(type) && sk_gpu_test::GrContextFactory::IsRenderingContext(type); 79d63442d87c6d35af4b2771a30a80e67d6aa92b68Mike Klein } 80d63442d87c6d35af4b2771a30a80e67d6aa92b68Mike Klein bool IsNullGLContextType(sk_gpu_test::GrContextFactory::ContextType type) { 81d63442d87c6d35af4b2771a30a80e67d6aa92b68Mike Klein return type == sk_gpu_test::GrContextFactory::kNullGL_ContextType; 82d63442d87c6d35af4b2771a30a80e67d6aa92b68Mike Klein } 83d63442d87c6d35af4b2771a30a80e67d6aa92b68Mike Klein#else 84d63442d87c6d35af4b2771a30a80e67d6aa92b68Mike Klein bool IsGLContextType (int) { return false; } 85d63442d87c6d35af4b2771a30a80e67d6aa92b68Mike Klein bool IsVulkanContextType (int) { return false; } 86d63442d87c6d35af4b2771a30a80e67d6aa92b68Mike Klein bool IsRenderingGLContextType(int) { return false; } 87d63442d87c6d35af4b2771a30a80e67d6aa92b68Mike Klein bool IsNullGLContextType (int) { return false; } 88d63442d87c6d35af4b2771a30a80e67d6aa92b68Mike Klein#endif 89d63442d87c6d35af4b2771a30a80e67d6aa92b68Mike Klein 90d63442d87c6d35af4b2771a30a80e67d6aa92b68Mike Klein void RunWithGPUTestContexts(GrContextTestFn* test, GrContextTypeFilterFn* contextTypeFilter, 91d63442d87c6d35af4b2771a30a80e67d6aa92b68Mike Klein Reporter* reporter, sk_gpu_test::GrContextFactory* factory) { 92d63442d87c6d35af4b2771a30a80e67d6aa92b68Mike Klein // TODO(bsalomon) 93d63442d87c6d35af4b2771a30a80e67d6aa92b68Mike Klein } 94d63442d87c6d35af4b2771a30a80e67d6aa92b68Mike Klein} 95