1/*
2 * Copyright 2021 Google LLC
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
8#include "tests/Test.h"
9
10#include "experimental/graphite/include/Context.h"
11#include "experimental/graphite/src/ProgramCache.h"
12#include "experimental/graphite/src/Recorder.h"
13
14using namespace skgpu;
15
16DEF_GRAPHITE_TEST_FOR_CONTEXTS(ProgramCacheTest, reporter, context) {
17    Recorder recorder(sk_ref_sp(context));
18
19    auto cache = recorder.programCache();
20
21    REPORTER_ASSERT(reporter, cache->count() == 0);
22
23    // Add an initial unique program
24    sk_sp<ProgramCache::ProgramInfo> pi1;
25    {
26        Combination c1 { ShaderCombo::ShaderType::kNone, SkTileMode::kRepeat, SkBlendMode::kSrc };
27        pi1 = cache->findOrCreateProgram(c1);
28        REPORTER_ASSERT(reporter, pi1->id() != ProgramCache::kInvalidProgramID);
29        REPORTER_ASSERT(reporter, pi1->combo() == c1);
30        sk_sp<ProgramCache::ProgramInfo> lookup = cache->lookup(pi1->id());
31        REPORTER_ASSERT(reporter, lookup->id() == pi1->id());
32
33        REPORTER_ASSERT(reporter, cache->count() == 1);
34    }
35
36    // Try to add a duplicate program
37    {
38        Combination c2 { ShaderCombo::ShaderType::kNone, SkTileMode::kRepeat, SkBlendMode::kSrc };
39        sk_sp<ProgramCache::ProgramInfo> pi2 = cache->findOrCreateProgram(c2);
40        REPORTER_ASSERT(reporter, pi2->id() != ProgramCache::kInvalidProgramID);
41        REPORTER_ASSERT(reporter, pi2->id() == pi1->id());
42        REPORTER_ASSERT(reporter, pi2->combo() == c2);
43        sk_sp<ProgramCache::ProgramInfo> lookup = cache->lookup(pi2->id());
44        REPORTER_ASSERT(reporter, lookup->id() == pi2->id());
45
46        REPORTER_ASSERT(reporter, cache->count() == 1);
47    }
48
49    // Add a second unique program
50    {
51        Combination c3 { ShaderCombo::ShaderType::kLinearGradient,
52                         SkTileMode::kRepeat,
53                         SkBlendMode::kSrc };
54
55        sk_sp<ProgramCache::ProgramInfo> pi3 = cache->findOrCreateProgram(c3);
56        REPORTER_ASSERT(reporter, pi3->id() != ProgramCache::kInvalidProgramID);
57        REPORTER_ASSERT(reporter, pi3->id() != pi1->id());
58        REPORTER_ASSERT(reporter, pi3->combo() == c3);
59        sk_sp<ProgramCache::ProgramInfo> lookup = cache->lookup(pi3->id());
60        REPORTER_ASSERT(reporter, lookup->id() == pi3->id());
61
62        REPORTER_ASSERT(reporter, cache->count() == 2);
63    }
64
65    // TODO(robertphillips): expand this test to exercise more program variations
66
67}
68