1/*
2 * Copyright 2017 Google Inc.
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
8in uniform sampler2D image;
9in half4x4 matrix;
10
11@constructorParams {
12    GrSamplerState samplerParams
13}
14
15@coordTransform(image) {
16    matrix
17}
18
19@samplerParams(image) {
20    samplerParams
21}
22
23@make {
24    static std::unique_ptr<GrFragmentProcessor> Make(sk_sp<GrTextureProxy> proxy,
25                                                     const SkMatrix& matrix) {
26        return std::unique_ptr<GrFragmentProcessor>(
27            new GrSimpleTextureEffect(std::move(proxy), matrix,
28                    GrSamplerState(GrSamplerState::WrapMode::kClamp, GrSamplerState::Filter::kNearest)));
29    }
30
31    /* clamp mode */
32    static std::unique_ptr<GrFragmentProcessor> Make(sk_sp<GrTextureProxy> proxy,
33                                                     const SkMatrix& matrix,
34                                                     GrSamplerState::Filter filter) {
35        return std::unique_ptr<GrFragmentProcessor>(
36            new GrSimpleTextureEffect(std::move(proxy), matrix,
37                                      GrSamplerState(GrSamplerState::WrapMode::kClamp, filter)));
38     }
39
40    static std::unique_ptr<GrFragmentProcessor> Make(sk_sp<GrTextureProxy> proxy,
41                                                     const SkMatrix& matrix,
42                                                     const GrSamplerState& p) {
43        return std::unique_ptr<GrFragmentProcessor>(
44            new GrSimpleTextureEffect(std::move(proxy), matrix, p));
45    }
46}
47
48@optimizationFlags {
49    ModulateForSamplerOptFlags(image->config(),
50            samplerParams.wrapModeX() == GrSamplerState::WrapMode::kClampToBorder ||
51            samplerParams.wrapModeY() == GrSamplerState::WrapMode::kClampToBorder)
52}
53
54void main() {
55    sk_OutColor = sk_InColor * texture(image, sk_TransformedCoords2D[0]);
56}
57
58@test(testData) {
59    int texIdx = testData->fRandom->nextBool() ? GrProcessorUnitTest::kSkiaPMTextureIdx
60                                               : GrProcessorUnitTest::kAlphaTextureIdx;
61    GrSamplerState::WrapMode wrapModes[2];
62    GrTest::TestWrapModes(testData->fRandom, wrapModes);
63    if (!testData->caps()->npotTextureTileSupport()) {
64        // Performing repeat sampling on npot textures will cause asserts on HW
65        // that lacks support.
66        wrapModes[0] = GrSamplerState::WrapMode::kClamp;
67        wrapModes[1] = GrSamplerState::WrapMode::kClamp;
68    }
69
70    GrSamplerState params(wrapModes, testData->fRandom->nextBool()
71                                                               ? GrSamplerState::Filter::kBilerp
72                                                               : GrSamplerState::Filter::kNearest);
73
74    const SkMatrix& matrix = GrTest::TestMatrix(testData->fRandom);
75    return GrSimpleTextureEffect::Make(testData->textureProxy(texIdx), matrix, params);
76}
77