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