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
14 using namespace skgpu;
15
DEF_GRAPHITE_TEST_FOR_CONTEXTS(ProgramCacheTest,reporter,context)16 DEF_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