Coverage Report

Created: 2021-08-22 09:07

/src/skia/include/private/GrGLTypesPriv.h
Line
Count
Source (jump to first uncovered line)
1
/*
2
 * Copyright 2019 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 "include/core/SkRefCnt.h"
9
#include "include/gpu/gl/GrGLTypes.h"
10
11
#ifndef GrGLTypesPriv_DEFINED
12
#define GrGLTypesPriv_DEFINED
13
14
static constexpr int kGrGLColorFormatCount = static_cast<int>(GrGLFormat::kLastColorFormat) + 1;
15
16
class GrGLTextureParameters : public SkNVRefCnt<GrGLTextureParameters> {
17
public:
18
    // We currently consider texture parameters invalid on all textures
19
    // GrContext::resetContext(). We use this type to track whether instances of
20
    // GrGLTextureParameters were updated before or after the most recent resetContext(). At 10
21
    // resets / frame and 60fps a 64bit timestamp will overflow in about a billion years.
22
    // TODO: Require clients to use GrBackendTexture::glTextureParametersModified() to invalidate
23
    // texture parameters and get rid of timestamp checking.
24
    using ResetTimestamp = uint64_t;
25
26
    // This initializes the params to have an expired timestamp. They'll be considered invalid the
27
    // first time the texture is used unless set() is called.
28
0
    GrGLTextureParameters() = default;
29
30
    // This is texture parameter state that is overridden when a non-zero sampler object is bound.
31
    struct SamplerOverriddenState {
32
        SamplerOverriddenState();
33
        void invalidate();
34
35
        GrGLenum fMinFilter;
36
        GrGLenum fMagFilter;
37
        GrGLenum fWrapS;
38
        GrGLenum fWrapT;
39
        GrGLfloat fMinLOD;
40
        GrGLfloat fMaxLOD;
41
        // We always want the border color to be transparent black, so no need to store 4 floats.
42
        // Just track if it's been invalidated and no longer the default
43
        bool fBorderColorInvalid;
44
    };
45
46
    // Texture parameter state that is not overridden by a bound sampler object.
47
    struct NonsamplerState {
48
        NonsamplerState();
49
        void invalidate();
50
51
        GrGLint fBaseMipMapLevel;
52
        GrGLint fMaxMipmapLevel;
53
        bool    fSwizzleIsRGBA;
54
    };
55
56
    void invalidate();
57
58
0
    ResetTimestamp resetTimestamp() const { return fResetTimestamp; }
59
0
    const SamplerOverriddenState& samplerOverriddenState() const { return fSamplerOverriddenState; }
60
0
    const NonsamplerState& nonsamplerState() const { return fNonsamplerState; }
61
62
    // SamplerOverriddenState is optional because we don't track it when we're using sampler
63
    // objects.
64
    void set(const SamplerOverriddenState* samplerState,
65
             const NonsamplerState& nonsamplerState,
66
             ResetTimestamp currTimestamp);
67
68
private:
69
    static constexpr ResetTimestamp kExpiredTimestamp = 0;
70
71
    SamplerOverriddenState fSamplerOverriddenState;
72
    NonsamplerState fNonsamplerState;
73
    ResetTimestamp fResetTimestamp = kExpiredTimestamp;
74
};
75
76
class GrGLBackendTextureInfo {
77
public:
78
    GrGLBackendTextureInfo(const GrGLTextureInfo& info, GrGLTextureParameters* params)
79
0
            : fInfo(info), fParams(params) {}
80
    GrGLBackendTextureInfo(const GrGLBackendTextureInfo&) = delete;
81
    GrGLBackendTextureInfo& operator=(const GrGLBackendTextureInfo&) = delete;
82
0
    const GrGLTextureInfo& info() const { return fInfo; }
83
0
    GrGLTextureParameters* parameters() const { return fParams; }
84
0
    sk_sp<GrGLTextureParameters> refParameters() const { return sk_ref_sp(fParams); }
85
86
    void cleanup();
87
    void assign(const GrGLBackendTextureInfo&, bool thisIsValid);
88
89
private:
90
    GrGLTextureInfo fInfo;
91
    GrGLTextureParameters* fParams;
92
};
93
94
#endif