Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(120)

Side by Side Diff: include/gpu/GrResourceKey.h

Issue 879193002: Fix wrapped content keys for npot textures. (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: fix warning Created 5 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 1
2 /* 2 /*
3 * Copyright 2014 Google Inc. 3 * Copyright 2014 Google Inc.
4 * 4 *
5 * Use of this source code is governed by a BSD-style license that can be 5 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file. 6 * found in the LICENSE file.
7 */ 7 */
8 8
9 #ifndef GrResourceKey_DEFINED 9 #ifndef GrResourceKey_DEFINED
10 #define GrResourceKey_DEFINED 10 #define GrResourceKey_DEFINED
11 11
12 #include "GrTypes.h" 12 #include "GrTypes.h"
13 #include "SkTemplates.h" 13 #include "SkTemplates.h"
14 14
15 uint32_t GrResourceKeyHash(const uint32_t* data, size_t size); 15 uint32_t GrResourceKeyHash(const uint32_t* data, size_t size);
16 16
17 class GrResourceKey { 17 class GrResourceKey {
18 public: 18 public:
19 uint32_t hash() const { 19 uint32_t hash() const {
20 this->validate(); 20 this->validate();
21 return fKey[kHash_MetaDataIdx]; 21 return fKey[kHash_MetaDataIdx];
22 } 22 }
23 23
24 size_t size() const { 24 size_t size() const {
25 this->validate(); 25 this->validate();
26 SkASSERT(this->isValid());
26 return this->internalSize(); 27 return this->internalSize();
27 } 28 }
28 29
29 const uint32_t* data() const {
30 this->validate();
31 return &fKey[kMetaDataCnt];
32 }
33
34 protected: 30 protected:
35 static const uint32_t kInvalidDomain = 0; 31 static const uint32_t kInvalidDomain = 0;
36 32
37 GrResourceKey() { this->reset(); } 33 GrResourceKey() { this->reset(); }
38 34
39 /** Reset to an invalid key. */ 35 /** Reset to an invalid key. */
40 void reset() { 36 void reset() {
41 GR_STATIC_ASSERT((uint16_t)kInvalidDomain == kInvalidDomain); 37 GR_STATIC_ASSERT((uint16_t)kInvalidDomain == kInvalidDomain);
42 fKey.reset(kMetaDataCnt); 38 fKey.reset(kMetaDataCnt);
43 fKey[kHash_MetaDataIdx] = 0; 39 fKey[kHash_MetaDataIdx] = 0;
(...skipping 12 matching lines...) Expand all
56 fKey.reset(SkToInt(bytes / sizeof(uint32_t))); 52 fKey.reset(SkToInt(bytes / sizeof(uint32_t)));
57 memcpy(fKey.get(), that.fKey.get(), bytes); 53 memcpy(fKey.get(), that.fKey.get(), bytes);
58 } 54 }
59 return *this; 55 return *this;
60 } 56 }
61 57
62 bool isValid() const { return kInvalidDomain != this->domain(); } 58 bool isValid() const { return kInvalidDomain != this->domain(); }
63 59
64 uint32_t domain() const { return fKey[kDomainAndSize_MetaDataIdx] & 0xffff; } 60 uint32_t domain() const { return fKey[kDomainAndSize_MetaDataIdx] & 0xffff; }
65 61
62 /** size of the key data, excluding meta-data (hash, domain, etc). */
63 size_t dataSize() const { return this->size() - 4 * kMetaDataCnt; }
64
65 /** ptr to the key data, excluding meta-data (hash, domain, etc). */
66 const uint32_t* data() const {
67 this->validate();
68 return &fKey[kMetaDataCnt];
69 }
70
66 /** Used to initialize a key. */ 71 /** Used to initialize a key. */
67 class Builder { 72 class Builder {
68 public: 73 public:
69 Builder(GrResourceKey* key, uint32_t domain, int data32Count) : fKey(key ) { 74 Builder(GrResourceKey* key, uint32_t domain, int data32Count) : fKey(key ) {
70 SkASSERT(data32Count >= 0); 75 SkASSERT(data32Count >= 0);
71 SkASSERT(domain != kInvalidDomain); 76 SkASSERT(domain != kInvalidDomain);
72 key->fKey.reset(kMetaDataCnt + data32Count); 77 key->fKey.reset(kMetaDataCnt + data32Count);
73 int size = (data32Count + kMetaDataCnt) * sizeof(uint32_t); 78 int size = (data32Count + kMetaDataCnt) * sizeof(uint32_t);
74 SkASSERT(SkToU16(size) == size); 79 SkASSERT(SkToU16(size) == size);
75 SkASSERT(SkToU16(domain) == domain); 80 SkASSERT(SkToU16(domain) == domain);
(...skipping 18 matching lines...) Expand all
94 SkDEBUGCODE(size_t dataCount = fKey->internalSize() / sizeof(uint32_ t) - kMetaDataCnt;) 99 SkDEBUGCODE(size_t dataCount = fKey->internalSize() / sizeof(uint32_ t) - kMetaDataCnt;)
95 SkASSERT(SkToU32(dataIdx) < dataCount); 100 SkASSERT(SkToU32(dataIdx) < dataCount);
96 return fKey->fKey[kMetaDataCnt + dataIdx]; 101 return fKey->fKey[kMetaDataCnt + dataIdx];
97 } 102 }
98 103
99 private: 104 private:
100 GrResourceKey* fKey; 105 GrResourceKey* fKey;
101 }; 106 };
102 107
103 private: 108 private:
109 enum MetaDataIdx {
110 kHash_MetaDataIdx,
111 // The key domain and size are packed into a single uint32_t.
112 kDomainAndSize_MetaDataIdx,
113
114 kLastMetaDataIdx = kDomainAndSize_MetaDataIdx
115 };
116 static const uint32_t kMetaDataCnt = kLastMetaDataIdx + 1;
117
104 size_t internalSize() const { 118 size_t internalSize() const {
105 return fKey[kDomainAndSize_MetaDataIdx] >> 16; 119 return fKey[kDomainAndSize_MetaDataIdx] >> 16;
106 } 120 }
107 121
108 void validate() const { 122 void validate() const {
109 SkASSERT(fKey[kHash_MetaDataIdx] == 123 SkASSERT(fKey[kHash_MetaDataIdx] ==
110 GrResourceKeyHash(&fKey[kHash_MetaDataIdx] + 1, 124 GrResourceKeyHash(&fKey[kHash_MetaDataIdx] + 1,
111 this->internalSize() - sizeof(uint32_t))); 125 this->internalSize() - sizeof(uint32_t)));
126 SkASSERT(SkIsAlign4(this->internalSize()));
112 } 127 }
113 128
114 enum MetaDataIdx {
115 kHash_MetaDataIdx,
116 // The key domain and size are packed into a single uint32_t.
117 kDomainAndSize_MetaDataIdx,
118
119 kLastMetaDataIdx = kDomainAndSize_MetaDataIdx
120 };
121 static const uint32_t kMetaDataCnt = kLastMetaDataIdx + 1;
122
123 friend class TestResource; // For unit test to access kMetaDataCnt. 129 friend class TestResource; // For unit test to access kMetaDataCnt.
124 130
125 // bmp textures require 4 uint32_t values. 131 // bmp textures require 4 uint32_t values.
126 SkAutoSTArray<kMetaDataCnt + 4, uint32_t> fKey; 132 SkAutoSTArray<kMetaDataCnt + 4, uint32_t> fKey;
127 }; 133 };
128 134
129 /** 135 /**
130 * A key used for scratch resources. The key consists of a resource type (subcla ss) identifier, a 136 * A key used for scratch resources. The key consists of a resource type (subcla ss) identifier, a
131 * hash, a data length, and type-specific data. A Builder object is used to init ialize the 137 * hash, a data length, and type-specific data. A Builder object is used to init ialize the
132 * key contents. The contents must be initialized before the key can be used. 138 * key contents. The contents must be initialized before the key can be used.
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after
206 bool operator!=(const GrContentKey& that) const { return !(*this == that); } 212 bool operator!=(const GrContentKey& that) const { return !(*this == that); }
207 213
208 class Builder : public INHERITED::Builder { 214 class Builder : public INHERITED::Builder {
209 public: 215 public:
210 Builder(GrContentKey* key, Domain domain, int data32Count) 216 Builder(GrContentKey* key, Domain domain, int data32Count)
211 : INHERITED::Builder(key, domain, data32Count) {} 217 : INHERITED::Builder(key, domain, data32Count) {}
212 218
213 /** Used to build a key that wraps another key and adds additional data. */ 219 /** Used to build a key that wraps another key and adds additional data. */
214 Builder(GrContentKey* key, const GrContentKey& innerKey, Domain domain, 220 Builder(GrContentKey* key, const GrContentKey& innerKey, Domain domain,
215 int extraData32Cnt) 221 int extraData32Cnt)
216 : INHERITED::Builder(key, domain, (SkToInt(innerKey.size()) >> 2) + extraData32Cnt) { 222 : INHERITED::Builder(key, domain, Data32CntForInnerKey(innerKey) + e xtraData32Cnt) {
217 int innerKeyCnt = SkToInt(innerKey.size()) >> 2;
218 // add the inner key to the end of the key so that op[] can be index ed normally. 223 // add the inner key to the end of the key so that op[] can be index ed normally.
219 for (int i = 0; i < innerKeyCnt; ++i) { 224 uint32_t* innerKeyData = &this->operator[](extraData32Cnt);
220 this->operator[](extraData32Cnt + i) = innerKey.data()[i]; 225 const uint32_t* srcData = innerKey.data();
221 } 226 (*innerKeyData++) = innerKey.domain();
227 memcpy(innerKeyData, srcData, innerKey.dataSize());
228 }
229
230 private:
231 static int Data32CntForInnerKey(const GrContentKey& innerKey) {
232 // key data + domain
233 return SkToInt((innerKey.dataSize() >> 2) + 1);
222 } 234 }
223 }; 235 };
224 }; 236 };
225 237
226 #endif 238 #endif
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698