13e980c3d88fbc509b79e7ccef16ca38f5bbfb180kkinnunen/*
23e980c3d88fbc509b79e7ccef16ca38f5bbfb180kkinnunen * Copyright 2015 Google Inc.
33e980c3d88fbc509b79e7ccef16ca38f5bbfb180kkinnunen *
43e980c3d88fbc509b79e7ccef16ca38f5bbfb180kkinnunen * Use of this source code is governed by a BSD-style license that can be
53e980c3d88fbc509b79e7ccef16ca38f5bbfb180kkinnunen * found in the LICENSE file.
63e980c3d88fbc509b79e7ccef16ca38f5bbfb180kkinnunen */
73e980c3d88fbc509b79e7ccef16ca38f5bbfb180kkinnunen
83e980c3d88fbc509b79e7ccef16ca38f5bbfb180kkinnunen#ifndef SK_COMMON_FLAGS_CONFIG_H
93e980c3d88fbc509b79e7ccef16ca38f5bbfb180kkinnunen#define SK_COMMON_FLAGS_CONFIG_H
103e980c3d88fbc509b79e7ccef16ca38f5bbfb180kkinnunen
113e980c3d88fbc509b79e7ccef16ca38f5bbfb180kkinnunen#include "SkCommandLineFlags.h"
123e980c3d88fbc509b79e7ccef16ca38f5bbfb180kkinnunen
133e980c3d88fbc509b79e7ccef16ca38f5bbfb180kkinnunen#if SK_SUPPORT_GPU
143e980c3d88fbc509b79e7ccef16ca38f5bbfb180kkinnunen#include "GrContextFactory.h"
153e980c3d88fbc509b79e7ccef16ca38f5bbfb180kkinnunen#endif
163e980c3d88fbc509b79e7ccef16ca38f5bbfb180kkinnunen
173e980c3d88fbc509b79e7ccef16ca38f5bbfb180kkinnunenDECLARE_string(config);
183e980c3d88fbc509b79e7ccef16ca38f5bbfb180kkinnunen
193e980c3d88fbc509b79e7ccef16ca38f5bbfb180kkinnunen#if SK_SUPPORT_GPU
203e980c3d88fbc509b79e7ccef16ca38f5bbfb180kkinnunenclass SkCommandLineConfigGpu;
213e980c3d88fbc509b79e7ccef16ca38f5bbfb180kkinnunen#endif
223e980c3d88fbc509b79e7ccef16ca38f5bbfb180kkinnunen
233e980c3d88fbc509b79e7ccef16ca38f5bbfb180kkinnunen// SkCommandLineConfig represents a Skia rendering configuration string.
243e980c3d88fbc509b79e7ccef16ca38f5bbfb180kkinnunen// The string has following form:
253e980c3d88fbc509b79e7ccef16ca38f5bbfb180kkinnunen// tag:
263e980c3d88fbc509b79e7ccef16ca38f5bbfb180kkinnunen//   [via-]*backend
2711abd8d6cb2887bf66711863fb2dfe47da86d979bsalomon// where 'backend' consists of chars excluding hyphen
283e980c3d88fbc509b79e7ccef16ca38f5bbfb180kkinnunen// and each 'via' consists of chars excluding hyphen.
293e980c3d88fbc509b79e7ccef16ca38f5bbfb180kkinnunenclass SkCommandLineConfig {
303e980c3d88fbc509b79e7ccef16ca38f5bbfb180kkinnunen  public:
313e980c3d88fbc509b79e7ccef16ca38f5bbfb180kkinnunen    SkCommandLineConfig(const SkString& tag, const SkString& backend,
323e980c3d88fbc509b79e7ccef16ca38f5bbfb180kkinnunen                        const SkTArray<SkString>& viaParts);
333e980c3d88fbc509b79e7ccef16ca38f5bbfb180kkinnunen    virtual ~SkCommandLineConfig();
343e980c3d88fbc509b79e7ccef16ca38f5bbfb180kkinnunen#if SK_SUPPORT_GPU
353e980c3d88fbc509b79e7ccef16ca38f5bbfb180kkinnunen    virtual const SkCommandLineConfigGpu* asConfigGpu() const { return nullptr; }
363e980c3d88fbc509b79e7ccef16ca38f5bbfb180kkinnunen#endif
373e980c3d88fbc509b79e7ccef16ca38f5bbfb180kkinnunen    const SkString& getTag() const { return fTag; }
383e980c3d88fbc509b79e7ccef16ca38f5bbfb180kkinnunen    const SkString& getBackend() const { return fBackend; }
393e980c3d88fbc509b79e7ccef16ca38f5bbfb180kkinnunen    const SkTArray<SkString>& getViaParts() const { return fViaParts; }
403e980c3d88fbc509b79e7ccef16ca38f5bbfb180kkinnunen  private:
413e980c3d88fbc509b79e7ccef16ca38f5bbfb180kkinnunen    SkString fTag;
423e980c3d88fbc509b79e7ccef16ca38f5bbfb180kkinnunen    SkString fBackend;
433e980c3d88fbc509b79e7ccef16ca38f5bbfb180kkinnunen    SkTArray<SkString> fViaParts;
443e980c3d88fbc509b79e7ccef16ca38f5bbfb180kkinnunen};
453e980c3d88fbc509b79e7ccef16ca38f5bbfb180kkinnunen
463e980c3d88fbc509b79e7ccef16ca38f5bbfb180kkinnunen#if SK_SUPPORT_GPU
473e980c3d88fbc509b79e7ccef16ca38f5bbfb180kkinnunen// SkCommandLineConfigGpu is a SkCommandLineConfig that extracts information out of the backend
483e980c3d88fbc509b79e7ccef16ca38f5bbfb180kkinnunen// part of the tag. It is constructed tags that have:
496405e71279e99731f89db69325c6763ec62a98e1Brian Salomon// * backends of form "gpu[option=value,option2=value,...]"
5050f66d805bcd424e34e1191a24a66b09e5611fe2Brian Salomon// * backends that represent a shorthand of above (such as "glmsaa16" representing
516405e71279e99731f89db69325c6763ec62a98e1Brian Salomon// "gpu(api=gl,samples=16)")
523e980c3d88fbc509b79e7ccef16ca38f5bbfb180kkinnunenclass SkCommandLineConfigGpu : public SkCommandLineConfig {
533e980c3d88fbc509b79e7ccef16ca38f5bbfb180kkinnunen  public:
5485b4b53e78dcdeae2a51935ca5e214b0f1a06492bsalomon    typedef sk_gpu_test::GrContextFactory::ContextType ContextType;
55e812d496aaa5e5e9f2117de8f442c297c9cb1367csmartdalton    typedef sk_gpu_test::GrContextFactory::ContextOverrides ContextOverrides;
563e980c3d88fbc509b79e7ccef16ca38f5bbfb180kkinnunen    SkCommandLineConfigGpu(const SkString& tag, const SkTArray<SkString>& viaParts,
57e0d362929d6569e8737d80dead791c640390e819csmartdalton                           ContextType contextType, bool useNVPR, bool useInstanced, bool useDIText,
58e0d362929d6569e8737d80dead791c640390e819csmartdalton                           int samples, SkColorType colorType, sk_sp<SkColorSpace> colorSpace);
593e980c3d88fbc509b79e7ccef16ca38f5bbfb180kkinnunen    const SkCommandLineConfigGpu* asConfigGpu() const override { return this; }
603e980c3d88fbc509b79e7ccef16ca38f5bbfb180kkinnunen    ContextType getContextType() const { return fContextType; }
61e812d496aaa5e5e9f2117de8f442c297c9cb1367csmartdalton    ContextOverrides getContextOverrides() const { return fContextOverrides; }
62e812d496aaa5e5e9f2117de8f442c297c9cb1367csmartdalton    bool getUseNVPR() const {
63e812d496aaa5e5e9f2117de8f442c297c9cb1367csmartdalton        SkASSERT(!(fContextOverrides & ContextOverrides::kRequireNVPRSupport) ||
64e812d496aaa5e5e9f2117de8f442c297c9cb1367csmartdalton                 !(fContextOverrides & ContextOverrides::kDisableNVPR));
65e812d496aaa5e5e9f2117de8f442c297c9cb1367csmartdalton        return fContextOverrides & ContextOverrides::kRequireNVPRSupport;
66e812d496aaa5e5e9f2117de8f442c297c9cb1367csmartdalton    }
67e812d496aaa5e5e9f2117de8f442c297c9cb1367csmartdalton    bool getUseInstanced() const { return fContextOverrides & ContextOverrides::kUseInstanced; }
683e980c3d88fbc509b79e7ccef16ca38f5bbfb180kkinnunen    bool getUseDIText() const { return fUseDIText; }
693e980c3d88fbc509b79e7ccef16ca38f5bbfb180kkinnunen    int getSamples() const { return fSamples; }
70d93c1208520376ec062c8e9b6b7e6d0eac6c6fafbrianosman    SkColorType getColorType() const { return fColorType; }
71b109b8c5ec40a7dd85a0a2951a1f98fa63b805aabrianosman    SkColorSpace* getColorSpace() const { return fColorSpace.get(); }
723e980c3d88fbc509b79e7ccef16ca38f5bbfb180kkinnunen
733e980c3d88fbc509b79e7ccef16ca38f5bbfb180kkinnunen  private:
743e980c3d88fbc509b79e7ccef16ca38f5bbfb180kkinnunen    ContextType fContextType;
75e812d496aaa5e5e9f2117de8f442c297c9cb1367csmartdalton    ContextOverrides fContextOverrides;
763e980c3d88fbc509b79e7ccef16ca38f5bbfb180kkinnunen    bool fUseDIText;
773e980c3d88fbc509b79e7ccef16ca38f5bbfb180kkinnunen    int fSamples;
78d93c1208520376ec062c8e9b6b7e6d0eac6c6fafbrianosman    SkColorType fColorType;
79b109b8c5ec40a7dd85a0a2951a1f98fa63b805aabrianosman    sk_sp<SkColorSpace> fColorSpace;
803e980c3d88fbc509b79e7ccef16ca38f5bbfb180kkinnunen};
813e980c3d88fbc509b79e7ccef16ca38f5bbfb180kkinnunen#endif
823e980c3d88fbc509b79e7ccef16ca38f5bbfb180kkinnunen
83145dbcd165d9d27298eb8888bc240e2d06a95464Ben Wagnertypedef SkTArray<std::unique_ptr<SkCommandLineConfig>, true> SkCommandLineConfigArray;
843e980c3d88fbc509b79e7ccef16ca38f5bbfb180kkinnunenvoid ParseConfigs(const SkCommandLineFlags::StringArray& configList,
853e980c3d88fbc509b79e7ccef16ca38f5bbfb180kkinnunen                  SkCommandLineConfigArray* outResult);
863e980c3d88fbc509b79e7ccef16ca38f5bbfb180kkinnunen
873e980c3d88fbc509b79e7ccef16ca38f5bbfb180kkinnunen#endif
88