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