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/ContextUtils.h"
12cb93a386Sopenharmony_ci#include "experimental/graphite/src/Recorder.h"
13cb93a386Sopenharmony_ci#include "experimental/graphite/src/Uniform.h"
14cb93a386Sopenharmony_ci#include "experimental/graphite/src/UniformCache.h"
15cb93a386Sopenharmony_ci
16cb93a386Sopenharmony_ciusing namespace skgpu;
17cb93a386Sopenharmony_ci
18cb93a386Sopenharmony_cinamespace {
19cb93a386Sopenharmony_ci
20cb93a386Sopenharmony_cisk_sp<UniformData> make_ud(int numUniforms, int dataSize) {
21cb93a386Sopenharmony_ci    static constexpr int kMaxUniforms = 3;
22cb93a386Sopenharmony_ci    static constexpr Uniform kUniforms[kMaxUniforms] {
23cb93a386Sopenharmony_ci        {"point0",   SLType::kFloat2 },
24cb93a386Sopenharmony_ci        {"point1",   SLType::kFloat2 },
25cb93a386Sopenharmony_ci        {"point2",   SLType::kFloat2 },
26cb93a386Sopenharmony_ci    };
27cb93a386Sopenharmony_ci
28cb93a386Sopenharmony_ci    SkASSERT(numUniforms <= kMaxUniforms);
29cb93a386Sopenharmony_ci
30cb93a386Sopenharmony_ci    sk_sp<UniformData> ud = UniformData::Make(numUniforms, kUniforms, dataSize);
31cb93a386Sopenharmony_ci    for (int i = 0; i < numUniforms; ++i) {
32cb93a386Sopenharmony_ci        ud->offsets()[i] = i;
33cb93a386Sopenharmony_ci    }
34cb93a386Sopenharmony_ci    for (int i = 0; i < dataSize; ++i) {
35cb93a386Sopenharmony_ci        ud->data()[i] = i % 255;
36cb93a386Sopenharmony_ci    }
37cb93a386Sopenharmony_ci
38cb93a386Sopenharmony_ci    return ud;
39cb93a386Sopenharmony_ci}
40cb93a386Sopenharmony_ci
41cb93a386Sopenharmony_ci} // anonymous namespace
42cb93a386Sopenharmony_ci
43cb93a386Sopenharmony_ciDEF_GRAPHITE_TEST_FOR_CONTEXTS(UniformCacheTest, reporter, context) {
44cb93a386Sopenharmony_ci    Recorder recorder(sk_ref_sp(context));
45cb93a386Sopenharmony_ci
46cb93a386Sopenharmony_ci    auto cache = recorder.uniformCache();
47cb93a386Sopenharmony_ci
48cb93a386Sopenharmony_ci    REPORTER_ASSERT(reporter, cache->count() == 0);
49cb93a386Sopenharmony_ci
50cb93a386Sopenharmony_ci    // Add a new unique UD
51cb93a386Sopenharmony_ci    sk_sp<UniformData> result1;
52cb93a386Sopenharmony_ci    {
53cb93a386Sopenharmony_ci        sk_sp<UniformData> ud1 = make_ud(2, 16);
54cb93a386Sopenharmony_ci        result1 = cache->findOrCreate(ud1);
55cb93a386Sopenharmony_ci        REPORTER_ASSERT(reporter, result1->id() != UniformData::kInvalidUniformID);
56cb93a386Sopenharmony_ci        REPORTER_ASSERT(reporter, ud1->id() == result1->id());
57cb93a386Sopenharmony_ci        sk_sp<UniformData> lookup = cache->lookup(result1->id());
58cb93a386Sopenharmony_ci        REPORTER_ASSERT(reporter, lookup->id() == result1->id());
59cb93a386Sopenharmony_ci
60cb93a386Sopenharmony_ci        REPORTER_ASSERT(reporter, cache->count() == 1);
61cb93a386Sopenharmony_ci    }
62cb93a386Sopenharmony_ci
63cb93a386Sopenharmony_ci    // Try to add a duplicate UD
64cb93a386Sopenharmony_ci    {
65cb93a386Sopenharmony_ci        sk_sp<UniformData> ud2 = make_ud(2, 16);
66cb93a386Sopenharmony_ci        sk_sp<UniformData> result2 = cache->findOrCreate(ud2);
67cb93a386Sopenharmony_ci        REPORTER_ASSERT(reporter, result2->id() != UniformData::kInvalidUniformID);
68cb93a386Sopenharmony_ci        REPORTER_ASSERT(reporter, ud2->id() == UniformData::kInvalidUniformID);
69cb93a386Sopenharmony_ci        REPORTER_ASSERT(reporter, result2->id() == result1->id());
70cb93a386Sopenharmony_ci        sk_sp<UniformData> lookup = cache->lookup(result2->id());
71cb93a386Sopenharmony_ci        REPORTER_ASSERT(reporter, lookup->id() == result2->id());
72cb93a386Sopenharmony_ci
73cb93a386Sopenharmony_ci        REPORTER_ASSERT(reporter, cache->count() == 1);
74cb93a386Sopenharmony_ci    }
75cb93a386Sopenharmony_ci
76cb93a386Sopenharmony_ci    // Add a second new unique UD
77cb93a386Sopenharmony_ci    {
78cb93a386Sopenharmony_ci        sk_sp<UniformData> ud3 = make_ud(3, 16);
79cb93a386Sopenharmony_ci        sk_sp<UniformData> result3 = cache->findOrCreate(ud3);
80cb93a386Sopenharmony_ci        REPORTER_ASSERT(reporter, result3->id() != UniformData::kInvalidUniformID);
81cb93a386Sopenharmony_ci        REPORTER_ASSERT(reporter, ud3->id() == result3->id());
82cb93a386Sopenharmony_ci        REPORTER_ASSERT(reporter, result3->id() != result1->id());
83cb93a386Sopenharmony_ci        sk_sp<UniformData> lookup = cache->lookup(result3->id());
84cb93a386Sopenharmony_ci        REPORTER_ASSERT(reporter, lookup->id() == result3->id());
85cb93a386Sopenharmony_ci
86cb93a386Sopenharmony_ci        REPORTER_ASSERT(reporter, cache->count() == 2);
87cb93a386Sopenharmony_ci    }
88cb93a386Sopenharmony_ci
89cb93a386Sopenharmony_ci    // TODO(robertphillips): expand this test to exercise all the UD comparison failure modes
90cb93a386Sopenharmony_ci}
91