bsalomon@google.com | 047696c | 2012-09-11 13:29:29 +0000 | [diff] [blame] | 1 | /* |
| 2 | * Copyright 2012 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 | |
| 8 | #ifndef GrTextureAccess_DEFINED |
| 9 | #define GrTextureAccess_DEFINED |
| 10 | |
bsalomon | f96ba02 | 2014-09-17 08:05:40 -0700 | [diff] [blame] | 11 | #include "GrGpuResourceRef.h" |
bsalomon | c492334 | 2014-09-16 13:54:53 -0700 | [diff] [blame] | 12 | #include "GrTexture.h" |
bsalomon@google.com | 6d003d1 | 2012-09-11 15:45:20 +0000 | [diff] [blame] | 13 | #include "SkRefCnt.h" |
bsalomon@google.com | 1ce49fc | 2012-09-18 14:14:49 +0000 | [diff] [blame] | 14 | #include "SkShader.h" |
bsalomon@google.com | 047696c | 2012-09-11 13:29:29 +0000 | [diff] [blame] | 15 | |
bsalomon@google.com | 1ce49fc | 2012-09-18 14:14:49 +0000 | [diff] [blame] | 16 | /** |
| 17 | * Represents the filtering and tile modes used to access a texture. It is mostly used with |
| 18 | * GrTextureAccess (defined below). Also, some of the texture cache methods require knowledge about |
| 19 | * filtering and tiling to perform a cache lookup. If it wasn't for this latter usage this would |
commit-bot@chromium.org | 91a798f | 2013-09-06 15:31:06 +0000 | [diff] [blame] | 20 | * be folded into GrTextureAccess. The default is clamp tile modes and no filtering. |
bsalomon@google.com | 1ce49fc | 2012-09-18 14:14:49 +0000 | [diff] [blame] | 21 | */ |
| 22 | class GrTextureParams { |
| 23 | public: |
| 24 | GrTextureParams() { |
| 25 | this->reset(); |
| 26 | } |
skia.committer@gmail.com | 956b310 | 2013-07-26 07:00:58 +0000 | [diff] [blame] | 27 | |
humper@google.com | b86add1 | 2013-07-25 18:49:07 +0000 | [diff] [blame] | 28 | enum FilterMode { |
| 29 | kNone_FilterMode, |
| 30 | kBilerp_FilterMode, |
| 31 | kMipMap_FilterMode |
| 32 | }; |
bsalomon@google.com | 1ce49fc | 2012-09-18 14:14:49 +0000 | [diff] [blame] | 33 | |
humper@google.com | b86add1 | 2013-07-25 18:49:07 +0000 | [diff] [blame] | 34 | GrTextureParams(SkShader::TileMode tileXAndY, FilterMode filterMode) { |
| 35 | this->reset(tileXAndY, filterMode); |
bsalomon@google.com | 1ce49fc | 2012-09-18 14:14:49 +0000 | [diff] [blame] | 36 | } |
| 37 | |
commit-bot@chromium.org | bc91fd7 | 2013-12-10 12:53:39 +0000 | [diff] [blame] | 38 | GrTextureParams(const SkShader::TileMode tileModes[2], FilterMode filterMode) { |
humper@google.com | b86add1 | 2013-07-25 18:49:07 +0000 | [diff] [blame] | 39 | this->reset(tileModes, filterMode); |
bsalomon@google.com | 1ce49fc | 2012-09-18 14:14:49 +0000 | [diff] [blame] | 40 | } |
| 41 | |
| 42 | GrTextureParams(const GrTextureParams& params) { |
| 43 | *this = params; |
| 44 | } |
| 45 | |
| 46 | GrTextureParams& operator= (const GrTextureParams& params) { |
| 47 | fTileModes[0] = params.fTileModes[0]; |
| 48 | fTileModes[1] = params.fTileModes[1]; |
humper@google.com | b86add1 | 2013-07-25 18:49:07 +0000 | [diff] [blame] | 49 | fFilterMode = params.fFilterMode; |
bsalomon@google.com | 1ce49fc | 2012-09-18 14:14:49 +0000 | [diff] [blame] | 50 | return *this; |
| 51 | } |
| 52 | |
| 53 | void reset() { |
humper@google.com | b86add1 | 2013-07-25 18:49:07 +0000 | [diff] [blame] | 54 | this->reset(SkShader::kClamp_TileMode, kNone_FilterMode); |
bsalomon@google.com | 1ce49fc | 2012-09-18 14:14:49 +0000 | [diff] [blame] | 55 | } |
| 56 | |
humper@google.com | b86add1 | 2013-07-25 18:49:07 +0000 | [diff] [blame] | 57 | void reset(SkShader::TileMode tileXAndY, FilterMode filterMode) { |
bsalomon@google.com | 1ce49fc | 2012-09-18 14:14:49 +0000 | [diff] [blame] | 58 | fTileModes[0] = fTileModes[1] = tileXAndY; |
humper@google.com | b86add1 | 2013-07-25 18:49:07 +0000 | [diff] [blame] | 59 | fFilterMode = filterMode; |
bsalomon@google.com | 1ce49fc | 2012-09-18 14:14:49 +0000 | [diff] [blame] | 60 | } |
| 61 | |
commit-bot@chromium.org | bc91fd7 | 2013-12-10 12:53:39 +0000 | [diff] [blame] | 62 | void reset(const SkShader::TileMode tileModes[2], FilterMode filterMode) { |
bsalomon@google.com | 1ce49fc | 2012-09-18 14:14:49 +0000 | [diff] [blame] | 63 | fTileModes[0] = tileModes[0]; |
| 64 | fTileModes[1] = tileModes[1]; |
humper@google.com | b86add1 | 2013-07-25 18:49:07 +0000 | [diff] [blame] | 65 | fFilterMode = filterMode; |
bsalomon@google.com | 1ce49fc | 2012-09-18 14:14:49 +0000 | [diff] [blame] | 66 | } |
| 67 | |
| 68 | void setClampNoFilter() { |
| 69 | fTileModes[0] = fTileModes[1] = SkShader::kClamp_TileMode; |
humper@google.com | b86add1 | 2013-07-25 18:49:07 +0000 | [diff] [blame] | 70 | fFilterMode = kNone_FilterMode; |
bsalomon@google.com | 1ce49fc | 2012-09-18 14:14:49 +0000 | [diff] [blame] | 71 | } |
| 72 | |
| 73 | void setClamp() { |
| 74 | fTileModes[0] = fTileModes[1] = SkShader::kClamp_TileMode; |
| 75 | } |
| 76 | |
humper@google.com | b86add1 | 2013-07-25 18:49:07 +0000 | [diff] [blame] | 77 | void setFilterMode(FilterMode filterMode) { fFilterMode = filterMode; } |
bsalomon@google.com | 1ce49fc | 2012-09-18 14:14:49 +0000 | [diff] [blame] | 78 | |
| 79 | void setTileModeX(const SkShader::TileMode tm) { fTileModes[0] = tm; } |
| 80 | void setTileModeY(const SkShader::TileMode tm) { fTileModes[1] = tm; } |
| 81 | void setTileModeXAndY(const SkShader::TileMode tm) { fTileModes[0] = fTileModes[1] = tm; } |
| 82 | |
| 83 | SkShader::TileMode getTileModeX() const { return fTileModes[0]; } |
| 84 | |
| 85 | SkShader::TileMode getTileModeY() const { return fTileModes[1]; } |
| 86 | |
| 87 | bool isTiled() const { |
| 88 | return SkShader::kClamp_TileMode != fTileModes[0] || |
| 89 | SkShader::kClamp_TileMode != fTileModes[1]; |
| 90 | } |
| 91 | |
humper@google.com | b86add1 | 2013-07-25 18:49:07 +0000 | [diff] [blame] | 92 | FilterMode filterMode() const { return fFilterMode; } |
bsalomon@google.com | 1ce49fc | 2012-09-18 14:14:49 +0000 | [diff] [blame] | 93 | |
| 94 | bool operator== (const GrTextureParams& other) const { |
| 95 | return fTileModes[0] == other.fTileModes[0] && |
| 96 | fTileModes[1] == other.fTileModes[1] && |
humper@google.com | b86add1 | 2013-07-25 18:49:07 +0000 | [diff] [blame] | 97 | fFilterMode == other.fFilterMode; |
bsalomon@google.com | 1ce49fc | 2012-09-18 14:14:49 +0000 | [diff] [blame] | 98 | } |
| 99 | |
| 100 | bool operator!= (const GrTextureParams& other) const { return !(*this == other); } |
| 101 | |
| 102 | private: |
| 103 | |
| 104 | SkShader::TileMode fTileModes[2]; |
humper@google.com | b86add1 | 2013-07-25 18:49:07 +0000 | [diff] [blame] | 105 | FilterMode fFilterMode; |
bsalomon@google.com | 1ce49fc | 2012-09-18 14:14:49 +0000 | [diff] [blame] | 106 | }; |
| 107 | |
bsalomon@google.com | 6d003d1 | 2012-09-11 15:45:20 +0000 | [diff] [blame] | 108 | /** A class representing the swizzle access pattern for a texture. Note that if the texture is |
| 109 | * an alpha-only texture then the alpha channel is substituted for other components. Any mangling |
| 110 | * to handle the r,g,b->a conversions for alpha textures is automatically included in the stage |
joshualitt | b0a8a37 | 2014-09-23 09:50:21 -0700 | [diff] [blame] | 111 | * key. However, if a GrProcessor uses different swizzles based on its input then it must |
bsalomon@google.com | 6d003d1 | 2012-09-11 15:45:20 +0000 | [diff] [blame] | 112 | * consider that variation in its key-generation. |
bsalomon@google.com | 047696c | 2012-09-11 13:29:29 +0000 | [diff] [blame] | 113 | */ |
bsalomon | 2a9ca78 | 2014-09-05 14:27:43 -0700 | [diff] [blame] | 114 | class GrTextureAccess : public SkNoncopyable { |
bsalomon@google.com | 047696c | 2012-09-11 13:29:29 +0000 | [diff] [blame] | 115 | public: |
bsalomon@google.com | 6d003d1 | 2012-09-11 15:45:20 +0000 | [diff] [blame] | 116 | /** |
joshualitt | b0a8a37 | 2014-09-23 09:50:21 -0700 | [diff] [blame] | 117 | * A default GrTextureAccess must have reset() called on it in a GrProcessor subclass's |
| 118 | * constructor if it will be accessible via GrProcessor::textureAccess(). |
bsalomon@google.com | 6d003d1 | 2012-09-11 15:45:20 +0000 | [diff] [blame] | 119 | */ |
| 120 | GrTextureAccess(); |
bsalomon@google.com | 047696c | 2012-09-11 13:29:29 +0000 | [diff] [blame] | 121 | |
bsalomon@google.com | 6d003d1 | 2012-09-11 15:45:20 +0000 | [diff] [blame] | 122 | /** |
bsalomon@google.com | 1ce49fc | 2012-09-18 14:14:49 +0000 | [diff] [blame] | 123 | * Uses the default swizzle, "rgba". |
| 124 | */ |
| 125 | GrTextureAccess(GrTexture*, const GrTextureParams&); |
| 126 | explicit GrTextureAccess(GrTexture*, |
humper@google.com | b86add1 | 2013-07-25 18:49:07 +0000 | [diff] [blame] | 127 | GrTextureParams::FilterMode = GrTextureParams::kNone_FilterMode, |
bsalomon@google.com | 1ce49fc | 2012-09-18 14:14:49 +0000 | [diff] [blame] | 128 | SkShader::TileMode tileXAndY = SkShader::kClamp_TileMode); |
| 129 | |
| 130 | /** |
bsalomon@google.com | 6d003d1 | 2012-09-11 15:45:20 +0000 | [diff] [blame] | 131 | * swizzle must be a string between one and four (inclusive) characters containing only 'r', |
| 132 | * 'g', 'b', and/or 'a'. |
| 133 | */ |
bsalomon@google.com | 1ce49fc | 2012-09-18 14:14:49 +0000 | [diff] [blame] | 134 | GrTextureAccess(GrTexture*, const char* swizzle, const GrTextureParams&); |
| 135 | GrTextureAccess(GrTexture*, |
| 136 | const char* swizzle, |
humper@google.com | b86add1 | 2013-07-25 18:49:07 +0000 | [diff] [blame] | 137 | GrTextureParams::FilterMode = GrTextureParams::kNone_FilterMode, |
bsalomon@google.com | 1ce49fc | 2012-09-18 14:14:49 +0000 | [diff] [blame] | 138 | SkShader::TileMode tileXAndY = SkShader::kClamp_TileMode); |
bsalomon@google.com | 047696c | 2012-09-11 13:29:29 +0000 | [diff] [blame] | 139 | |
bsalomon@google.com | 1ce49fc | 2012-09-18 14:14:49 +0000 | [diff] [blame] | 140 | void reset(GrTexture*, const GrTextureParams&); |
| 141 | void reset(GrTexture*, |
humper@google.com | b86add1 | 2013-07-25 18:49:07 +0000 | [diff] [blame] | 142 | GrTextureParams::FilterMode = GrTextureParams::kNone_FilterMode, |
bsalomon@google.com | 1ce49fc | 2012-09-18 14:14:49 +0000 | [diff] [blame] | 143 | SkShader::TileMode tileXAndY = SkShader::kClamp_TileMode); |
| 144 | void reset(GrTexture*, const char* swizzle, const GrTextureParams&); |
| 145 | void reset(GrTexture*, |
| 146 | const char* swizzle, |
humper@google.com | b86add1 | 2013-07-25 18:49:07 +0000 | [diff] [blame] | 147 | GrTextureParams::FilterMode = GrTextureParams::kNone_FilterMode, |
bsalomon@google.com | 1ce49fc | 2012-09-18 14:14:49 +0000 | [diff] [blame] | 148 | SkShader::TileMode tileXAndY = SkShader::kClamp_TileMode); |
bsalomon@google.com | 047696c | 2012-09-11 13:29:29 +0000 | [diff] [blame] | 149 | |
bsalomon@google.com | 1ce49fc | 2012-09-18 14:14:49 +0000 | [diff] [blame] | 150 | bool operator== (const GrTextureAccess& other) const { |
commit-bot@chromium.org | 515dcd3 | 2013-08-28 14:17:03 +0000 | [diff] [blame] | 151 | #ifdef SK_DEBUG |
bsalomon@google.com | 1ce49fc | 2012-09-18 14:14:49 +0000 | [diff] [blame] | 152 | // below assumes all chars in fSwizzle are initialized even if string is < 4 chars long. |
tfarina@chromium.org | f6de475 | 2013-08-17 00:02:59 +0000 | [diff] [blame] | 153 | SkASSERT(memcmp(fSwizzle, other.fSwizzle, sizeof(fSwizzle)-1) == |
bsalomon@google.com | 1ce49fc | 2012-09-18 14:14:49 +0000 | [diff] [blame] | 154 | strcmp(fSwizzle, other.fSwizzle)); |
| 155 | #endif |
| 156 | return fParams == other.fParams && |
bsalomon | 2a9ca78 | 2014-09-05 14:27:43 -0700 | [diff] [blame] | 157 | (this->getTexture() == other.getTexture()) && |
bsalomon@google.com | db545ae | 2012-09-20 15:37:30 +0000 | [diff] [blame] | 158 | (0 == memcmp(fSwizzle, other.fSwizzle, sizeof(fSwizzle)-1)); |
bsalomon@google.com | 1ce49fc | 2012-09-18 14:14:49 +0000 | [diff] [blame] | 159 | } |
| 160 | |
| 161 | bool operator!= (const GrTextureAccess& other) const { return !(*this == other); } |
bsalomon@google.com | 6d003d1 | 2012-09-11 15:45:20 +0000 | [diff] [blame] | 162 | |
bsalomon | c492334 | 2014-09-16 13:54:53 -0700 | [diff] [blame] | 163 | GrTexture* getTexture() const { return fTexture.get(); } |
bsalomon | 2a9ca78 | 2014-09-05 14:27:43 -0700 | [diff] [blame] | 164 | |
| 165 | /** |
joshualitt | b0a8a37 | 2014-09-23 09:50:21 -0700 | [diff] [blame] | 166 | * For internal use by GrProcessor. |
bsalomon | 2a9ca78 | 2014-09-05 14:27:43 -0700 | [diff] [blame] | 167 | */ |
bsalomon | f96ba02 | 2014-09-17 08:05:40 -0700 | [diff] [blame] | 168 | const GrGpuResourceRef* getProgramTexture() const { return &fTexture; } |
bsalomon@google.com | 6d003d1 | 2012-09-11 15:45:20 +0000 | [diff] [blame] | 169 | |
| 170 | /** |
| 171 | * Returns a string representing the swizzle. The string is is null-terminated. |
| 172 | */ |
| 173 | const char* getSwizzle() const { return fSwizzle; } |
| 174 | |
bsalomon@google.com | b8eb2e8 | 2013-03-28 13:46:42 +0000 | [diff] [blame] | 175 | /** Returns a mask indicating which components are referenced in the swizzle. The return |
| 176 | is a bitfield of GrColorComponentFlags. */ |
bsalomon@google.com | 6d003d1 | 2012-09-11 15:45:20 +0000 | [diff] [blame] | 177 | uint32_t swizzleMask() const { return fSwizzleMask; } |
bsalomon@google.com | 047696c | 2012-09-11 13:29:29 +0000 | [diff] [blame] | 178 | |
bsalomon@google.com | 1ce49fc | 2012-09-18 14:14:49 +0000 | [diff] [blame] | 179 | const GrTextureParams& getParams() const { return fParams; } |
| 180 | |
bsalomon@google.com | 047696c | 2012-09-11 13:29:29 +0000 | [diff] [blame] | 181 | private: |
bsalomon@google.com | 1ce49fc | 2012-09-18 14:14:49 +0000 | [diff] [blame] | 182 | void setSwizzle(const char*); |
| 183 | |
bsalomon | f96ba02 | 2014-09-17 08:05:40 -0700 | [diff] [blame] | 184 | typedef GrTGpuResourceRef<GrTexture> ProgramTexture; |
bsalomon | c492334 | 2014-09-16 13:54:53 -0700 | [diff] [blame] | 185 | |
| 186 | ProgramTexture fTexture; |
bsalomon | 2a9ca78 | 2014-09-05 14:27:43 -0700 | [diff] [blame] | 187 | GrTextureParams fParams; |
| 188 | uint32_t fSwizzleMask; |
| 189 | char fSwizzle[5]; |
bsalomon@google.com | 1ce49fc | 2012-09-18 14:14:49 +0000 | [diff] [blame] | 190 | |
commit-bot@chromium.org | a0b4028 | 2013-09-18 13:00:55 +0000 | [diff] [blame] | 191 | typedef SkNoncopyable INHERITED; |
bsalomon@google.com | 047696c | 2012-09-11 13:29:29 +0000 | [diff] [blame] | 192 | }; |
| 193 | |
| 194 | #endif |