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

Side by Side Diff: src/gpu/gl/GrGLProgramDesc.cpp

Issue 628633003: gl programs rewrite (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: build fix Created 6 years, 2 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 | « src/gpu/gl/GrGLProgramDesc.h ('k') | src/gpu/gl/GrGpuGL_program.cpp » ('j') | 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 * Copyright 2013 Google Inc. 2 * Copyright 2013 Google Inc.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license that can be 4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file. 5 * found in the LICENSE file.
6 */ 6 */
7 7
8 #include "gl/builders/GrGLFragmentShaderBuilder.h" 8 #include "gl/builders/GrGLFragmentShaderBuilder.h"
9 #include "GrGLProgramDesc.h" 9 #include "GrGLProgramDesc.h"
10 #include "GrBackendProcessorFactory.h" 10 #include "GrBackendProcessorFactory.h"
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after
133 if ((textureKey | transformKey | classID) & kMetaKeyInvalidMask) { 133 if ((textureKey | transformKey | classID) & kMetaKeyInvalidMask) {
134 return NULL; 134 return NULL;
135 } 135 }
136 136
137 uint32_t* key = b->add32n(2); 137 uint32_t* key = b->add32n(2);
138 key[0] = (textureKey << 16 | transformKey); 138 key[0] = (textureKey << 16 | transformKey);
139 key[1] = (classID << 16); 139 key[1] = (classID << 16);
140 return key; 140 return key;
141 } 141 }
142 142
143 bool GrGLProgramDesc::GetProcessorKey(const GrProcessorStage& stage, 143 static bool get_fp_key(const GrProcessorStage& stage,
144 const GrGLCaps& caps, 144 const GrGLCaps& caps,
145 bool useExplicitLocalCoords, 145 bool useExplicitLocalCoords,
146 GrProcessorKeyBuilder* b, 146 GrProcessorKeyBuilder* b,
147 uint16_t* processorKeySize) { 147 uint16_t* processorKeySize) {
148 const GrProcessor& effect = *stage.getProcessor(); 148 const GrProcessor& effect = *stage.getProcessor();
149 const GrBackendProcessorFactory& factory = effect.getFactory(); 149 const GrBackendProcessorFactory& factory = effect.getFactory();
150 factory.getGLProcessorKey(effect, caps, b); 150 factory.getGLProcessorKey(effect, caps, b);
151 size_t size = b->size(); 151 size_t size = b->size();
152 if (size > SK_MaxU16) { 152 if (size > SK_MaxU16) {
153 *processorKeySize = 0; // suppresses a warning. 153 *processorKeySize = 0; // suppresses a warning.
154 return false; 154 return false;
155 } 155 }
156 *processorKeySize = SkToU16(size); 156 *processorKeySize = SkToU16(size);
157 if (NULL == get_processor_meta_key(stage, useExplicitLocalCoords, caps, b)) { 157 if (NULL == get_processor_meta_key(stage, useExplicitLocalCoords, caps, b)) {
158 return false; 158 return false;
159 } 159 }
160 return true; 160 return true;
161 } 161 }
162 162
163 bool GrGLProgramDesc::GetGeometryProcessorKey(const GrGeometryStage& stage, 163 static bool get_gp_key(const GrGeometryStage& stage,
164 const GrGLCaps& caps, 164 const GrGLCaps& caps,
165 bool useExplicitLocalCoords, 165 bool useExplicitLocalCoords,
166 GrProcessorKeyBuilder* b, 166 GrProcessorKeyBuilder* b,
167 uint16_t* processorKeySize) { 167 uint16_t* processorKeySize) {
168 const GrProcessor& effect = *stage.getProcessor(); 168 const GrProcessor& effect = *stage.getProcessor();
169 const GrBackendProcessorFactory& factory = effect.getFactory(); 169 const GrBackendProcessorFactory& factory = effect.getFactory();
170 factory.getGLProcessorKey(effect, caps, b); 170 factory.getGLProcessorKey(effect, caps, b);
171 size_t size = b->size(); 171 size_t size = b->size();
172 if (size > SK_MaxU16) { 172 if (size > SK_MaxU16) {
173 *processorKeySize = 0; // suppresses a warning. 173 *processorKeySize = 0; // suppresses a warning.
174 return false; 174 return false;
175 } 175 }
176 *processorKeySize = SkToU16(size); 176 *processorKeySize = SkToU16(size);
177 uint32_t* key = get_processor_meta_key(stage, useExplicitLocalCoords, caps, b); 177 uint32_t* key = get_processor_meta_key(stage, useExplicitLocalCoords, caps, b);
178 if (NULL == key) { 178 if (NULL == key) {
179 return false; 179 return false;
180 } 180 }
181 uint32_t attribKey = gen_attrib_key(stage.getProcessor()); 181 uint32_t attribKey = gen_attrib_key(stage.getProcessor());
182 182
183 // Currently we allow 16 bits for each of the above portions of the meta-key . Fail if they 183 // Currently we allow 16 bits for each of the above portions of the meta-key . Fail if they
184 // don't fit. 184 // don't fit.
185 static const uint32_t kMetaKeyInvalidMask = ~((uint32_t) SK_MaxU16); 185 static const uint32_t kMetaKeyInvalidMask = ~((uint32_t) SK_MaxU16);
186 if ((attribKey) & kMetaKeyInvalidMask) { 186 if ((attribKey) & kMetaKeyInvalidMask) {
187 return false; 187 return false;
188 } 188 }
189 189
190 key[1] |= attribKey; 190 key[1] |= attribKey;
191 return true; 191 return true;
192 } 192 }
193 193
194 struct GeometryProcessorKeyBuilder {
195 typedef GrGeometryStage StagedProcessor;
196 static bool GetProcessorKey(const GrGeometryStage& gpStage,
197 const GrGLCaps& caps,
198 bool requiresLocalCoordAttrib,
199 GrProcessorKeyBuilder* b,
200 uint16_t* processorKeySize) {
201 return get_gp_key(gpStage, caps, requiresLocalCoordAttrib, b, processorK eySize);
202 }
203 };
204
205 struct FragmentProcessorKeyBuilder {
206 typedef GrFragmentStage StagedProcessor;
207 static bool GetProcessorKey(const GrFragmentStage& fpStage,
208 const GrGLCaps& caps,
209 bool requiresLocalCoordAttrib,
210 GrProcessorKeyBuilder* b,
211 uint16_t* processorKeySize) {
212 return get_fp_key(fpStage, caps, requiresLocalCoordAttrib, b, processorK eySize);
213 }
214 };
215
216
217 template <class ProcessorKeyBuilder>
218 bool
219 GrGLProgramDesc::BuildStagedProcessorKey(const typename ProcessorKeyBuilder::Sta gedProcessor& stage,
220 const GrGLCaps& caps,
221 bool requiresLocalCoordAttrib,
222 GrGLProgramDesc* desc,
223 int* offsetAndSizeIndex) {
224 GrProcessorKeyBuilder b(&desc->fKey);
225 uint16_t processorKeySize;
226 uint32_t processorOffset = desc->fKey.count();
227 if (processorOffset > SK_MaxU16 ||
228 !ProcessorKeyBuilder::GetProcessorKey(stage, caps, requiresLocalCoor dAttrib, &b,
229 &processorKeySize)){
230 desc->fKey.reset();
231 return false;
232 }
233
234 uint16_t* offsetAndSize =
235 reinterpret_cast<uint16_t*>(desc->fKey.begin() + kEffectKeyOffsetsAn dLengthOffset +
236 *offsetAndSizeIndex * 2 * sizeof(uint16_ t));
237 offsetAndSize[0] = SkToU16(processorOffset);
238 offsetAndSize[1] = processorKeySize;
239 ++(*offsetAndSizeIndex);
240 return true;
241 }
194 242
195 bool GrGLProgramDesc::Build(const GrOptDrawState& optState, 243 bool GrGLProgramDesc::Build(const GrOptDrawState& optState,
196 GrGpu::DrawType drawType, 244 GrGpu::DrawType drawType,
197 GrBlendCoeff srcCoeff, 245 GrBlendCoeff srcCoeff,
198 GrBlendCoeff dstCoeff, 246 GrBlendCoeff dstCoeff,
199 GrGpuGL* gpu, 247 GrGpuGL* gpu,
200 const GrDeviceCoordTexture* dstCopy, 248 const GrDeviceCoordTexture* dstCopy,
201 const GrGeometryStage** geometryProcessor, 249 const GrGeometryStage** geometryProcessor,
202 SkTArray<const GrFragmentStage*, true>* colorStages, 250 SkTArray<const GrFragmentStage*, true>* colorStages,
203 SkTArray<const GrFragmentStage*, true>* coverageStag es, 251 SkTArray<const GrFragmentStage*, true>* coverageStag es,
(...skipping 13 matching lines...) Expand all
217 265
218 int numStages = optState.numTotalStages(); 266 int numStages = optState.numTotalStages();
219 267
220 GR_STATIC_ASSERT(0 == kEffectKeyOffsetsAndLengthOffset % sizeof(uint32_t)); 268 GR_STATIC_ASSERT(0 == kEffectKeyOffsetsAndLengthOffset % sizeof(uint32_t));
221 // Make room for everything up to and including the array of offsets to effe ct keys. 269 // Make room for everything up to and including the array of offsets to effe ct keys.
222 desc->fKey.reset(); 270 desc->fKey.reset();
223 desc->fKey.push_back_n(kEffectKeyOffsetsAndLengthOffset + 2 * sizeof(uint16_ t) * numStages); 271 desc->fKey.push_back_n(kEffectKeyOffsetsAndLengthOffset + 2 * sizeof(uint16_ t) * numStages);
224 272
225 int offsetAndSizeIndex = 0; 273 int offsetAndSizeIndex = 0;
226 274
227 KeyHeader* header = desc->header();
228 // make sure any padding in the header is zeroed.
229 memset(desc->header(), 0, kHeaderSize);
230
231 // We can only have one effect which touches the vertex shader 275 // We can only have one effect which touches the vertex shader
232 if (optState.hasGeometryProcessor()) { 276 if (optState.hasGeometryProcessor()) {
233 uint16_t* offsetAndSize =
234 reinterpret_cast<uint16_t*>(desc->fKey.begin() + kEffectKeyOffse tsAndLengthOffset +
235 offsetAndSizeIndex * 2 * sizeof(uint 16_t));
236
237 GrProcessorKeyBuilder b(&desc->fKey);
238 uint16_t processorKeySize;
239 uint32_t processorOffset = desc->fKey.count();
240 const GrGeometryStage& gpStage = *optState.getGeometryProcessor(); 277 const GrGeometryStage& gpStage = *optState.getGeometryProcessor();
241 if (processorOffset > SK_MaxU16 || 278 if (!BuildStagedProcessorKey<GeometryProcessorKeyBuilder>(gpStage,
242 !GetGeometryProcessorKey(gpStage, gpu->glCaps(), requiresLocalCo ordAttrib, &b, 279 gpu->glCaps(),
243 &processorKeySize)) { 280 requiresLocalC oordAttrib,
244 desc->fKey.reset(); 281 desc,
282 &offsetAndSize Index)) {
245 return false; 283 return false;
246 } 284 }
247
248 offsetAndSize[0] = SkToU16(processorOffset);
249 offsetAndSize[1] = processorKeySize;
250 ++offsetAndSizeIndex;
251 *geometryProcessor = &gpStage; 285 *geometryProcessor = &gpStage;
252 header->fHasGeometryProcessor = true;
253 } 286 }
254 287
255 for (int s = 0; s < optState.numColorStages(); ++s) { 288 for (int s = 0; s < optState.numColorStages(); ++s) {
256 uint16_t* offsetAndSize = 289 if (!BuildStagedProcessorKey<FragmentProcessorKeyBuilder>(optState.getCo lorStage(s),
257 reinterpret_cast<uint16_t*>(desc->fKey.begin() + kEffectKeyOffsetsAn dLengthOffset + 290 gpu->glCaps(),
258 offsetAndSizeIndex * 2 * sizeof(uint16_t )); 291 requiresLocalC oordAttrib,
259 292 desc,
260 GrProcessorKeyBuilder b(&desc->fKey); 293 &offsetAndSize Index)) {
261 uint16_t processorKeySize;
262 uint32_t processorOffset = desc->fKey.count();
263 if (processorOffset > SK_MaxU16 ||
264 !GetProcessorKey(optState.getColorStage(s), gpu->glCaps(),
265 requiresLocalCoordAttrib, &b, &processorKeySize )) {
266 desc->fKey.reset();
267 return false; 294 return false;
268 } 295 }
269
270 offsetAndSize[0] = SkToU16(processorOffset);
271 offsetAndSize[1] = processorKeySize;
272 ++offsetAndSizeIndex;
273 } 296 }
274 297
275 for (int s = 0; s < optState.numCoverageStages(); ++s) { 298 for (int s = 0; s < optState.numCoverageStages(); ++s) {
276 uint16_t* offsetAndSize = 299 if (!BuildStagedProcessorKey<FragmentProcessorKeyBuilder>(optState.getCo verageStage(s),
277 reinterpret_cast<uint16_t*>(desc->fKey.begin() + kEffectKeyOffsetsAn dLengthOffset + 300 gpu->glCaps(),
278 offsetAndSizeIndex * 2 * sizeof(uint16_t )); 301 requiresLocalC oordAttrib,
279 302 desc,
280 GrProcessorKeyBuilder b(&desc->fKey); 303 &offsetAndSize Index)) {
281 uint16_t processorKeySize;
282 uint32_t processorOffset = desc->fKey.count();
283 if (processorOffset > SK_MaxU16 ||
284 !GetProcessorKey(optState.getCoverageStage(s), gpu->glCaps(),
285 requiresLocalCoordAttrib, &b, &processorKeySize )) {
286 desc->fKey.reset();
287 return false; 304 return false;
288 } 305 }
289
290 offsetAndSize[0] = SkToU16(processorOffset);
291 offsetAndSize[1] = processorKeySize;
292 ++offsetAndSizeIndex;
293 } 306 }
294 307
308 // --------DO NOT MOVE HEADER ABOVE THIS LINE------------------------------- -------------------
295 // Because header is a pointer into the dynamic array, we can't push any new data into the key 309 // Because header is a pointer into the dynamic array, we can't push any new data into the key
296 // below here. 310 // below here.
311 KeyHeader* header = desc->header();
297 312
313 // make sure any padding in the header is zeroed.
314 memset(header, 0, kHeaderSize);
315
316 header->fHasGeometryProcessor = optState.hasGeometryProcessor();
298 317
299 header->fEmitsPointSize = GrGpu::kDrawPoints_DrawType == drawType; 318 header->fEmitsPointSize = GrGpu::kDrawPoints_DrawType == drawType;
300 319
301 // Currently the experimental GS will only work with triangle prims (and it doesn't do anything
302 // other than pass through values from the VS to the FS anyway).
303 #if GR_GL_EXPERIMENTAL_GS
304 #if 0
305 header->fExperimentalGS = gpu->caps().geometryShaderSupport();
306 #else
307 header->fExperimentalGS = false;
308 #endif
309 #endif
310
311 if (gpu->caps()->pathRenderingSupport() && 320 if (gpu->caps()->pathRenderingSupport() &&
312 GrGpu::IsPathRenderingDrawType(drawType) && 321 GrGpu::IsPathRenderingDrawType(drawType) &&
313 gpu->glPathRendering()->texturingMode() == GrGLPathRendering::FixedFunct ion_TexturingMode) { 322 gpu->glPathRendering()->texturingMode() == GrGLPathRendering::FixedFunct ion_TexturingMode) {
314 header->fUseFragShaderOnly = true; 323 header->fUseFragShaderOnly = true;
315 SkASSERT(!optState.hasGeometryProcessor()); 324 SkASSERT(!optState.hasGeometryProcessor());
316 } else { 325 } else {
317 header->fUseFragShaderOnly = false; 326 header->fUseFragShaderOnly = false;
318 } 327 }
319 328
320 bool defaultToUniformInputs = GrGpu::IsPathRenderingDrawType(drawType) || 329 bool defaultToUniformInputs = GrGpu::IsPathRenderingDrawType(drawType) ||
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
392 401
393 for (int s = 0; s < optState.numColorStages(); ++s) { 402 for (int s = 0; s < optState.numColorStages(); ++s) {
394 colorStages->push_back(&optState.getColorStage(s)); 403 colorStages->push_back(&optState.getColorStage(s));
395 } 404 }
396 for (int s = 0; s < optState.numCoverageStages(); ++s) { 405 for (int s = 0; s < optState.numCoverageStages(); ++s) {
397 coverageStages->push_back(&optState.getCoverageStage(s)); 406 coverageStages->push_back(&optState.getCoverageStage(s));
398 } 407 }
399 408
400 header->fColorEffectCnt = colorStages->count(); 409 header->fColorEffectCnt = colorStages->count();
401 header->fCoverageEffectCnt = coverageStages->count(); 410 header->fCoverageEffectCnt = coverageStages->count();
402
403 desc->finalize(); 411 desc->finalize();
404 return true; 412 return true;
405 } 413 }
406 414
407 void GrGLProgramDesc::finalize() { 415 void GrGLProgramDesc::finalize() {
408 int keyLength = fKey.count(); 416 int keyLength = fKey.count();
409 SkASSERT(0 == (keyLength % 4)); 417 SkASSERT(0 == (keyLength % 4));
410 *this->atOffset<uint32_t, kLengthOffset>() = SkToU32(keyLength); 418 *this->atOffset<uint32_t, kLengthOffset>() = SkToU32(keyLength);
411 419
412 uint32_t* checksum = this->atOffset<uint32_t, kChecksumOffset>(); 420 uint32_t* checksum = this->atOffset<uint32_t, kChecksumOffset>();
413 *checksum = 0; 421 *checksum = 0;
414 *checksum = SkChecksum::Compute(reinterpret_cast<uint32_t*>(fKey.begin()), k eyLength); 422 *checksum = SkChecksum::Compute(reinterpret_cast<uint32_t*>(fKey.begin()), k eyLength);
415 } 423 }
416 424
417 GrGLProgramDesc& GrGLProgramDesc::operator= (const GrGLProgramDesc& other) { 425 GrGLProgramDesc& GrGLProgramDesc::operator= (const GrGLProgramDesc& other) {
418 size_t keyLength = other.keyLength(); 426 size_t keyLength = other.keyLength();
419 fKey.reset(keyLength); 427 fKey.reset(keyLength);
420 memcpy(fKey.begin(), other.fKey.begin(), keyLength); 428 memcpy(fKey.begin(), other.fKey.begin(), keyLength);
421 return *this; 429 return *this;
422 } 430 }
OLDNEW
« no previous file with comments | « src/gpu/gl/GrGLProgramDesc.h ('k') | src/gpu/gl/GrGpuGL_program.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698