OLD | NEW |
1 | 1 |
2 /* | 2 /* |
3 * Copyright 2011 Google Inc. | 3 * Copyright 2011 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 // This is a GPU-backend specific test. It relies on static intializers to work | 9 // This is a GPU-backend specific test. It relies on static intializers to work |
10 | 10 |
11 #include "SkTypes.h" | 11 #include "SkTypes.h" |
12 | 12 |
13 #if SK_SUPPORT_GPU && SK_ALLOW_STATIC_GLOBAL_INITIALIZERS | 13 #if SK_SUPPORT_GPU && SK_ALLOW_STATIC_GLOBAL_INITIALIZERS |
14 | 14 |
15 #include "GrBackendEffectFactory.h" | 15 #include "GrBackendEffectFactory.h" |
16 #include "GrContextFactory.h" | 16 #include "GrContextFactory.h" |
17 #include "GrDrawEffect.h" | 17 #include "GrDrawEffect.h" |
18 #include "effects/GrConfigConversionEffect.h" | 18 #include "effects/GrConfigConversionEffect.h" |
19 #include "gl/GrGpuGL.h" | 19 #include "gl/GrGpuGL.h" |
20 | 20 |
21 #include "SkChecksum.h" | 21 #include "SkChecksum.h" |
22 #include "SkRandom.h" | 22 #include "SkRandom.h" |
23 #include "Test.h" | 23 #include "Test.h" |
24 | 24 |
25 void GrGLProgramDesc::setRandom(SkRandom* random, | 25 bool GrGLProgramDesc::setRandom(SkRandom* random, |
26 const GrGpuGL* gpu, | 26 const GrGpuGL* gpu, |
27 const GrRenderTarget* dstRenderTarget, | 27 const GrRenderTarget* dstRenderTarget, |
28 const GrTexture* dstCopyTexture, | 28 const GrTexture* dstCopyTexture, |
29 const GrEffectStage* stages[], | 29 const GrEffectStage* stages[], |
30 int numColorStages, | 30 int numColorStages, |
31 int numCoverageStages, | 31 int numCoverageStages, |
32 int currAttribIndex) { | 32 int currAttribIndex) { |
33 int numEffects = numColorStages + numCoverageStages; | 33 bool useLocalCoords = random->nextBool() && currAttribIndex < GrDrawState::k
MaxVertexAttribCnt; |
34 size_t keyLength = KeyLength(numEffects); | 34 |
35 fKey.reset(keyLength); | 35 int numStages = numColorStages + numCoverageStages; |
36 *this->atOffset<uint32_t, kLengthOffset>() = static_cast<uint32_t>(keyLength
); | 36 fKey.reset(); |
37 memset(this->header(), 0, kHeaderSize); | 37 |
| 38 GR_STATIC_ASSERT(0 == kEffectKeyLengthsOffset % sizeof(uint32_t)); |
| 39 |
| 40 // Make room for everything up to and including the array of offsets to effe
ct keys. |
| 41 fKey.push_back_n(kEffectKeyLengthsOffset + sizeof(uint32_t) * numStages); |
| 42 |
| 43 size_t offset = fKey.count(); |
| 44 int offsetIndex = 0; |
| 45 |
| 46 bool dstRead = false; |
| 47 bool fragPos = false; |
| 48 bool vertexCode = false; |
| 49 for (int s = 0; s < numStages; ++s) { |
| 50 uint32_t* offsetLocation = reinterpret_cast<uint32_t*>(fKey.begin() + |
| 51 kEffectKeyLengths
Offset + |
| 52 offsetIndex * siz
eof(uint32_t)); |
| 53 *offsetLocation = offset; |
| 54 ++offsetIndex; |
| 55 |
| 56 const GrBackendEffectFactory& factory = stages[s]->getEffect()->getFacto
ry(); |
| 57 GrDrawEffect drawEffect(*stages[s], useLocalCoords); |
| 58 GrEffectKeyBuilder b(&fKey); |
| 59 if (!factory.getGLEffectKey(drawEffect, gpu->glCaps(), &b)) { |
| 60 fKey.reset(); |
| 61 return false; |
| 62 } |
| 63 if (stages[s]->getEffect()->willReadDstColor()) { |
| 64 dstRead = true; |
| 65 } |
| 66 if (stages[s]->getEffect()->willReadFragmentPosition()) { |
| 67 fragPos = true; |
| 68 } |
| 69 if (stages[s]->getEffect()->hasVertexCode()) { |
| 70 vertexCode = true; |
| 71 } |
| 72 |
| 73 offset += b.size(); |
| 74 } |
38 | 75 |
39 KeyHeader* header = this->header(); | 76 KeyHeader* header = this->header(); |
| 77 memset(header, 0, kHeaderSize); |
40 header->fEmitsPointSize = random->nextBool(); | 78 header->fEmitsPointSize = random->nextBool(); |
41 | 79 |
42 header->fPositionAttributeIndex = 0; | 80 header->fPositionAttributeIndex = 0; |
43 | 81 |
44 // if the effects have used up all off the available attributes, | 82 // if the effects have used up all off the available attributes, |
45 // don't try to use color or coverage attributes as input | 83 // don't try to use color or coverage attributes as input |
46 do { | 84 do { |
47 header->fColorInput = static_cast<GrGLProgramDesc::ColorInput>( | 85 header->fColorInput = static_cast<GrGLProgramDesc::ColorInput>( |
48 random->nextULessThan(kColorInputCnt)); | 86 random->nextULessThan(kColorInputCnt)); |
49 } while (GrDrawState::kMaxVertexAttribCnt <= currAttribIndex && | 87 } while (GrDrawState::kMaxVertexAttribCnt <= currAttribIndex && |
50 kAttribute_ColorInput == header->fColorInput); | 88 kAttribute_ColorInput == header->fColorInput); |
| 89 |
51 header->fColorAttributeIndex = (header->fColorInput == kAttribute_ColorInput
) ? | 90 header->fColorAttributeIndex = (header->fColorInput == kAttribute_ColorInput
) ? |
52 currAttribIndex++ : | 91 currAttribIndex++ : |
53 -1; | 92 -1; |
54 | 93 |
55 do { | 94 do { |
56 header->fCoverageInput = static_cast<GrGLProgramDesc::ColorInput>( | 95 header->fCoverageInput = static_cast<GrGLProgramDesc::ColorInput>( |
57 random->nextULessThan(kColorInputCnt)); | 96 random->nextULessThan(kColorInputCnt)); |
58 } while (GrDrawState::kMaxVertexAttribCnt <= currAttribIndex && | 97 } while (GrDrawState::kMaxVertexAttribCnt <= currAttribIndex && |
59 kAttribute_ColorInput == header->fCoverageInput); | 98 kAttribute_ColorInput == header->fCoverageInput); |
60 header->fCoverageAttributeIndex = (header->fCoverageInput == kAttribute_Colo
rInput) ? | 99 header->fCoverageAttributeIndex = (header->fCoverageInput == kAttribute_Colo
rInput) ? |
61 currAttribIndex++ : | 100 currAttribIndex++ : |
62 -1; | 101 -1; |
63 | 102 |
64 #if GR_GL_EXPERIMENTAL_GS | 103 #if GR_GL_EXPERIMENTAL_GS |
65 header->fExperimentalGS = gpu->caps()->geometryShaderSupport() && random->ne
xtBool(); | 104 header->fExperimentalGS = gpu->caps()->geometryShaderSupport() && random->ne
xtBool(); |
66 #endif | 105 #endif |
67 | 106 |
68 bool useLocalCoords = random->nextBool() && currAttribIndex < GrDrawState::k
MaxVertexAttribCnt; | |
69 header->fLocalCoordAttributeIndex = useLocalCoords ? currAttribIndex++ : -1; | 107 header->fLocalCoordAttributeIndex = useLocalCoords ? currAttribIndex++ : -1; |
70 | 108 |
71 header->fColorEffectCnt = numColorStages; | 109 header->fColorEffectCnt = numColorStages; |
72 header->fCoverageEffectCnt = numCoverageStages; | 110 header->fCoverageEffectCnt = numCoverageStages; |
73 | 111 |
74 bool dstRead = false; | |
75 bool fragPos = false; | |
76 bool vertexCode = false; | |
77 int numStages = numColorStages + numCoverageStages; | |
78 for (int s = 0; s < numStages; ++s) { | |
79 const GrBackendEffectFactory& factory = stages[s]->getEffect()->getFacto
ry(); | |
80 GrDrawEffect drawEffect(*stages[s], useLocalCoords); | |
81 this->effectKeys()[s] = factory.glEffectKey(drawEffect, gpu->glCaps()); | |
82 if (stages[s]->getEffect()->willReadDstColor()) { | |
83 dstRead = true; | |
84 } | |
85 if (stages[s]->getEffect()->willReadFragmentPosition()) { | |
86 fragPos = true; | |
87 } | |
88 if (stages[s]->getEffect()->hasVertexCode()) { | |
89 vertexCode = true; | |
90 } | |
91 } | |
92 | |
93 if (dstRead) { | 112 if (dstRead) { |
94 header->fDstReadKey = GrGLShaderBuilder::KeyForDstRead(dstCopyTexture, g
pu->glCaps()); | 113 header->fDstReadKey = SkToU8(GrGLShaderBuilder::KeyForDstRead(dstCopyTex
ture, |
| 114 gpu->glCap
s())); |
95 } else { | 115 } else { |
96 header->fDstReadKey = 0; | 116 header->fDstReadKey = 0; |
97 } | 117 } |
98 if (fragPos) { | 118 if (fragPos) { |
99 header->fFragPosKey = GrGLShaderBuilder::KeyForFragmentPosition(dstRende
rTarget, | 119 header->fFragPosKey = SkToU8(GrGLShaderBuilder::KeyForFragmentPosition(d
stRenderTarget, |
100 gpu->gl
Caps()); | 120 g
pu->glCaps())); |
101 } else { | 121 } else { |
102 header->fFragPosKey = 0; | 122 header->fFragPosKey = 0; |
103 } | 123 } |
104 | 124 |
105 header->fHasVertexCode = vertexCode || | 125 header->fHasVertexCode = vertexCode || |
106 useLocalCoords || | 126 useLocalCoords || |
107 kAttribute_ColorInput == header->fColorInput || | 127 kAttribute_ColorInput == header->fColorInput || |
108 kAttribute_ColorInput == header->fCoverageInput; | 128 kAttribute_ColorInput == header->fCoverageInput; |
109 | 129 |
110 CoverageOutput coverageOutput; | 130 CoverageOutput coverageOutput; |
111 bool illegalCoverageOutput; | 131 bool illegalCoverageOutput; |
112 do { | 132 do { |
113 coverageOutput = static_cast<CoverageOutput>(random->nextULessThan(kCove
rageOutputCnt)); | 133 coverageOutput = static_cast<CoverageOutput>(random->nextULessThan(kCove
rageOutputCnt)); |
114 illegalCoverageOutput = (!gpu->caps()->dualSourceBlendingSupport() && | 134 illegalCoverageOutput = (!gpu->caps()->dualSourceBlendingSupport() && |
115 CoverageOutputUsesSecondaryOutput(coverageOutpu
t)) || | 135 CoverageOutputUsesSecondaryOutput(coverageOutpu
t)) || |
116 (!dstRead && kCombineWithDst_CoverageOutput == c
overageOutput); | 136 (!dstRead && kCombineWithDst_CoverageOutput == c
overageOutput); |
117 } while (illegalCoverageOutput); | 137 } while (illegalCoverageOutput); |
118 | 138 |
119 header->fCoverageOutput = coverageOutput; | 139 header->fCoverageOutput = coverageOutput; |
120 | 140 |
121 *this->checksum() = 0; | 141 this->finalize(); |
122 *this->checksum() = SkChecksum::Compute(reinterpret_cast<uint32_t*>(fKey.get
()), keyLength); | 142 return true; |
123 fInitialized = true; | |
124 } | 143 } |
125 | 144 |
126 bool GrGpuGL::programUnitTest(int maxStages) { | 145 bool GrGpuGL::programUnitTest(int maxStages) { |
127 | 146 |
128 GrTextureDesc dummyDesc; | 147 GrTextureDesc dummyDesc; |
129 dummyDesc.fFlags = kRenderTarget_GrTextureFlagBit; | 148 dummyDesc.fFlags = kRenderTarget_GrTextureFlagBit; |
130 dummyDesc.fConfig = kSkia8888_GrPixelConfig; | 149 dummyDesc.fConfig = kSkia8888_GrPixelConfig; |
131 dummyDesc.fWidth = 34; | 150 dummyDesc.fWidth = 34; |
132 dummyDesc.fHeight = 18; | 151 dummyDesc.fHeight = 18; |
133 SkAutoTUnref<GrTexture> dummyTexture1(this->createTexture(dummyDesc, NULL, 0
)); | 152 SkAutoTUnref<GrTexture> dummyTexture1(this->createTexture(dummyDesc, NULL, 0
)); |
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
195 | 214 |
196 for (int i = 0; i < numAttribs; ++i) { | 215 for (int i = 0; i < numAttribs; ++i) { |
197 attribIndices[i] = currAttribIndex++; | 216 attribIndices[i] = currAttribIndex++; |
198 } | 217 } |
199 GrEffectStage* stage = SkNEW_ARGS(GrEffectStage, | 218 GrEffectStage* stage = SkNEW_ARGS(GrEffectStage, |
200 (effect.get(), attribIndices[0], a
ttribIndices[1])); | 219 (effect.get(), attribIndices[0], a
ttribIndices[1])); |
201 stages[s] = stage; | 220 stages[s] = stage; |
202 ++s; | 221 ++s; |
203 } | 222 } |
204 const GrTexture* dstTexture = random.nextBool() ? dummyTextures[0] : dum
myTextures[1]; | 223 const GrTexture* dstTexture = random.nextBool() ? dummyTextures[0] : dum
myTextures[1]; |
205 pdesc.setRandom(&random, | 224 if (!pdesc.setRandom(&random, |
206 this, | 225 this, |
207 dummyTextures[0]->asRenderTarget(), | 226 dummyTextures[0]->asRenderTarget(), |
208 dstTexture, | 227 dstTexture, |
209 stages.get(), | 228 stages.get(), |
210 numColorStages, | 229 numColorStages, |
211 numCoverageStages, | 230 numCoverageStages, |
212 currAttribIndex); | 231 currAttribIndex)) { |
| 232 return false; |
| 233 } |
213 | 234 |
214 SkAutoTUnref<GrGLProgram> program(GrGLProgram::Create(this, | 235 SkAutoTUnref<GrGLProgram> program(GrGLProgram::Create(this, |
215 pdesc, | 236 pdesc, |
216 stages, | 237 stages, |
217 stages + numColorS
tages)); | 238 stages + numColorS
tages)); |
218 for (int s = 0; s < numStages; ++s) { | 239 for (int s = 0; s < numStages; ++s) { |
219 SkDELETE(stages[s]); | 240 SkDELETE(stages[s]); |
220 } | 241 } |
221 if (NULL == program.get()) { | 242 if (NULL == program.get()) { |
222 return false; | 243 return false; |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
261 SkRect::MakeWH(SK_Scalar1, SK_Scalar1), SK_Scalar1)); | 282 SkRect::MakeWH(SK_Scalar1, SK_Scalar1), SK_Scalar1)); |
262 GrConfigConversionEffect::Create(NULL, | 283 GrConfigConversionEffect::Create(NULL, |
263 false, | 284 false, |
264 GrConfigConversionEffect::kNone_PMConversio
n, | 285 GrConfigConversionEffect::kNone_PMConversio
n, |
265 SkMatrix::I()); | 286 SkMatrix::I()); |
266 SkScalar matrix[20]; | 287 SkScalar matrix[20]; |
267 SkAutoTUnref<SkColorMatrixFilter> cmf(SkColorMatrixFilter::Create(matrix)); | 288 SkAutoTUnref<SkColorMatrixFilter> cmf(SkColorMatrixFilter::Create(matrix)); |
268 } | 289 } |
269 | 290 |
270 #endif | 291 #endif |
OLD | NEW |