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

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

Issue 504203004: Attach GrOptDrawState into shader building pipeline (Closed) Base URL: https://skia.googlesource.com/skia.git@opt2
Patch Set: Remove BlendOpt Cache Created 6 years, 3 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
« src/gpu/gl/GrGLProgramDesc.cpp ('K') | « src/gpu/gl/GrGpuGL.cpp ('k') | 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 * Copyright 2011 Google Inc. 2 * Copyright 2011 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 "GrGpuGL.h" 8 #include "GrGpuGL.h"
9 9
10 #include "GrEffect.h" 10 #include "GrEffect.h"
11 #include "GrGLEffect.h" 11 #include "GrGLEffect.h"
12 #include "GrGLPathRendering.h"
13 #include "GrOptDrawState.h"
12 #include "SkRTConf.h" 14 #include "SkRTConf.h"
13 #include "GrGLPathRendering.h"
14 #include "SkTSearch.h" 15 #include "SkTSearch.h"
15 16
16 #ifdef PROGRAM_CACHE_STATS 17 #ifdef PROGRAM_CACHE_STATS
17 SK_CONF_DECLARE(bool, c_DisplayCache, "gpu.displayCache", false, 18 SK_CONF_DECLARE(bool, c_DisplayCache, "gpu.displayCache", false,
18 "Display program cache usage."); 19 "Display program cache usage.");
19 #endif 20 #endif
20 21
21 typedef GrGLProgramDataManager::UniformHandle UniformHandle; 22 typedef GrGLProgramDataManager::UniformHandle UniformHandle;
22 23
23 struct GrGpuGL::ProgramCache::Entry { 24 struct GrGpuGL::ProgramCache::Entry {
(...skipping 173 matching lines...) Expand 10 before | Expand all | Expand 10 after
197 } 198 }
198 ++fCurrLRUStamp; 199 ++fCurrLRUStamp;
199 return entry->fProgram; 200 return entry->fProgram;
200 } 201 }
201 202
202 //////////////////////////////////////////////////////////////////////////////// 203 ////////////////////////////////////////////////////////////////////////////////
203 204
204 #define GL_CALL(X) GR_GL_CALL(this->glInterface(), X) 205 #define GL_CALL(X) GR_GL_CALL(this->glInterface(), X)
205 206
206 bool GrGpuGL::flushGraphicsState(DrawType type, const GrDeviceCoordTexture* dstC opy) { 207 bool GrGpuGL::flushGraphicsState(DrawType type, const GrDeviceCoordTexture* dstC opy) {
207 const GrDrawState& drawState = this->getDrawState(); 208 const GrOptDrawState& optState = *this->getDrawState().createOptState();
209 optState.unref();
bsalomon 2014/09/15 14:04:34 This seems really dangerous... it is assuming an i
egdaniel 2014/09/15 17:51:35 Done.
208 210
209 // GrGpu::setupClipAndFlushState should have already checked this and bailed if not true. 211 // GrGpu::setupClipAndFlushState should have already checked this and bailed if not true.
210 SkASSERT(drawState.getRenderTarget()); 212 SkASSERT(optState.getRenderTarget());
211 213
212 if (kStencilPath_DrawType == type) { 214 if (kStencilPath_DrawType == type) {
213 const GrRenderTarget* rt = this->getDrawState().getRenderTarget(); 215 const GrRenderTarget* rt = optState.getRenderTarget();
214 SkISize size; 216 SkISize size;
215 size.set(rt->width(), rt->height()); 217 size.set(rt->width(), rt->height());
216 this->glPathRendering()->setProjectionMatrix(drawState.getViewMatrix(), size, rt->origin()); 218 this->glPathRendering()->setProjectionMatrix(optState.getViewMatrix(), s ize, rt->origin());
217 } else { 219 } else {
218 this->flushMiscFixedFunctionState(); 220 this->flushMiscFixedFunctionState();
219 221
220 GrBlendCoeff srcCoeff; 222 GrBlendCoeff srcCoeff = optState.getSrcBlendCoeff();
221 GrBlendCoeff dstCoeff; 223 GrBlendCoeff dstCoeff = optState.getDstBlendCoeff();
222 GrDrawState::BlendOptFlags blendOpts = drawState.getBlendOpts(false, &sr cCoeff, &dstCoeff); 224
223 if (GrDrawState::kSkipDraw_BlendOptFlag & blendOpts) { 225 // In these blend coeff's we end up drawing nothing so we can skip draw all together
226 if (kZero_GrBlendCoeff == srcCoeff && kOne_GrBlendCoeff == dstCoeff &&
227 !optState.getStencil().doesWrite()) {
224 return false; 228 return false;
225 } 229 }
226 230
227 const GrEffectStage* geometryProcessor = NULL; 231 const GrEffectStage* geometryProcessor = NULL;
228 SkSTArray<8, const GrEffectStage*, true> colorStages; 232 SkSTArray<8, const GrEffectStage*, true> colorStages;
229 SkSTArray<8, const GrEffectStage*, true> coverageStages; 233 SkSTArray<8, const GrEffectStage*, true> coverageStages;
230 GrGLProgramDesc desc; 234 GrGLProgramDesc desc;
231 if (!GrGLProgramDesc::Build(this->getDrawState(), 235 if (!GrGLProgramDesc::Build(optState,
232 type, 236 type,
233 blendOpts,
234 srcCoeff, 237 srcCoeff,
235 dstCoeff, 238 dstCoeff,
236 this, 239 this,
237 dstCopy, 240 dstCopy,
238 &geometryProcessor, 241 &geometryProcessor,
239 &colorStages, 242 &colorStages,
240 &coverageStages, 243 &coverageStages,
241 &desc)) { 244 &desc)) {
242 SkDEBUGFAIL("Failed to generate GL program descriptor"); 245 SkDEBUGFAIL("Failed to generate GL program descriptor");
243 return false; 246 return false;
(...skipping 12 matching lines...) Expand all
256 259
257 GrGLuint programID = fCurrentProgram->programID(); 260 GrGLuint programID = fCurrentProgram->programID();
258 if (fHWProgramID != programID) { 261 if (fHWProgramID != programID) {
259 GL_CALL(UseProgram(programID)); 262 GL_CALL(UseProgram(programID));
260 fHWProgramID = programID; 263 fHWProgramID = programID;
261 } 264 }
262 265
263 fCurrentProgram->overrideBlend(&srcCoeff, &dstCoeff); 266 fCurrentProgram->overrideBlend(&srcCoeff, &dstCoeff);
264 this->flushBlend(kDrawLines_DrawType == type, srcCoeff, dstCoeff); 267 this->flushBlend(kDrawLines_DrawType == type, srcCoeff, dstCoeff);
265 268
266 fCurrentProgram->setData(type, 269 fCurrentProgram->setData(optState,
267 blendOpts, 270 type,
268 geometryProcessor, 271 geometryProcessor,
269 colorStages.begin(), 272 colorStages.begin(),
270 coverageStages.begin(), 273 coverageStages.begin(),
271 dstCopy, 274 dstCopy,
272 &fSharedGLProgramState); 275 &fSharedGLProgramState);
273 } 276 }
274 277
275 GrGLRenderTarget* glRT = static_cast<GrGLRenderTarget*>(drawState.getRenderT arget()); 278 GrGLRenderTarget* glRT = static_cast<GrGLRenderTarget*>(optState.getRenderTa rget());
276 this->flushStencil(type); 279 this->flushStencil(type);
277 this->flushScissor(glRT->getViewport(), glRT->origin()); 280 this->flushScissor(glRT->getViewport(), glRT->origin());
278 this->flushAAState(type); 281 this->flushAAState(type);
279 282
280 SkIRect* devRect = NULL; 283 SkIRect* devRect = NULL;
281 SkIRect devClipBounds; 284 SkIRect devClipBounds;
282 if (drawState.isClipState()) { 285 if (optState.isClipState()) {
283 this->getClip()->getConservativeBounds(drawState.getRenderTarget(), &dev ClipBounds); 286 this->getClip()->getConservativeBounds(optState.getRenderTarget(), &devC lipBounds);
284 devRect = &devClipBounds; 287 devRect = &devClipBounds;
285 } 288 }
286 // This must come after textures are flushed because a texture may need 289 // This must come after textures are flushed because a texture may need
287 // to be msaa-resolved (which will modify bound FBO state). 290 // to be msaa-resolved (which will modify bound FBO state).
288 this->flushRenderTarget(glRT, devRect); 291 this->flushRenderTarget(glRT, devRect);
289 292
290 return true; 293 return true;
291 } 294 }
292 295
293 void GrGpuGL::setupGeometry(const DrawInfo& info, size_t* indexOffsetInBytes) { 296 void GrGpuGL::setupGeometry(const DrawInfo& info, size_t* indexOffsetInBytes) {
294 297
295 GrGLsizei stride = static_cast<GrGLsizei>(this->getDrawState().getVertexStri de()); 298 const GrOptDrawState& optState = *this->getDrawState().createOptState();
299 optState.unref();
bsalomon 2014/09/15 14:04:34 ditto
egdaniel 2014/09/15 17:51:35 Done.
300
301 GrGLsizei stride = static_cast<GrGLsizei>(optState.getVertexStride());
296 302
297 size_t vertexOffsetInBytes = stride * info.startVertex(); 303 size_t vertexOffsetInBytes = stride * info.startVertex();
298 304
299 const GeometryPoolState& geoPoolState = this->getGeomPoolState(); 305 const GeometryPoolState& geoPoolState = this->getGeomPoolState();
300 306
301 GrGLVertexBuffer* vbuf; 307 GrGLVertexBuffer* vbuf;
302 switch (this->getGeomSrc().fVertexSrc) { 308 switch (this->getGeomSrc().fVertexSrc) {
303 case kBuffer_GeometrySrcType: 309 case kBuffer_GeometrySrcType:
304 vbuf = (GrGLVertexBuffer*) this->getGeomSrc().fVertexBuffer; 310 vbuf = (GrGLVertexBuffer*) this->getGeomSrc().fVertexBuffer;
305 break; 311 break;
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
339 } 345 }
340 346
341 SkASSERT(ibuf); 347 SkASSERT(ibuf);
342 SkASSERT(!ibuf->isMapped()); 348 SkASSERT(!ibuf->isMapped());
343 *indexOffsetInBytes += ibuf->baseOffset(); 349 *indexOffsetInBytes += ibuf->baseOffset();
344 } 350 }
345 GrGLAttribArrayState* attribState = 351 GrGLAttribArrayState* attribState =
346 fHWGeometryState.bindArrayAndBuffersToDraw(this, vbuf, ibuf); 352 fHWGeometryState.bindArrayAndBuffersToDraw(this, vbuf, ibuf);
347 353
348 if (fCurrentProgram->hasVertexShader()) { 354 if (fCurrentProgram->hasVertexShader()) {
349 int vertexAttribCount = this->getDrawState().getVertexAttribCount(); 355 int vertexAttribCount = optState.getVertexAttribCount();
350 uint32_t usedAttribArraysMask = 0; 356 uint32_t usedAttribArraysMask = 0;
351 const GrVertexAttrib* vertexAttrib = this->getDrawState().getVertexAttri bs(); 357 const GrVertexAttrib* vertexAttrib = optState.getVertexAttribs();
352
353 bool canIgnoreColorAttrib = this->getDrawState().canIgnoreColorAttribute ();
354 358
355 for (int vertexAttribIndex = 0; vertexAttribIndex < vertexAttribCount; 359 for (int vertexAttribIndex = 0; vertexAttribIndex < vertexAttribCount;
356 ++vertexAttribIndex, ++vertexAttrib) { 360 ++vertexAttribIndex, ++vertexAttrib) {
357
358 if (kColor_GrVertexAttribBinding != vertexAttrib->fBinding || !canIg noreColorAttrib) {
359 usedAttribArraysMask |= (1 << vertexAttribIndex); 361 usedAttribArraysMask |= (1 << vertexAttribIndex);
360 GrVertexAttribType attribType = vertexAttrib->fType; 362 GrVertexAttribType attribType = vertexAttrib->fType;
361 attribState->set(this, 363 attribState->set(this,
362 vertexAttribIndex, 364 vertexAttribIndex,
363 vbuf, 365 vbuf,
364 GrGLAttribTypeToLayout(attribType).fCount, 366 GrGLAttribTypeToLayout(attribType).fCount,
365 GrGLAttribTypeToLayout(attribType).fType, 367 GrGLAttribTypeToLayout(attribType).fType,
366 GrGLAttribTypeToLayout(attribType).fNormalized, 368 GrGLAttribTypeToLayout(attribType).fNormalized,
367 stride, 369 stride,
368 reinterpret_cast<GrGLvoid*>( 370 reinterpret_cast<GrGLvoid*>(
369 vertexOffsetInBytes + vertexAttrib->fOffset)); 371 vertexOffsetInBytes + vertexAttrib->fOffset));
370 }
371 } 372 }
372 attribState->disableUnusedArrays(this, usedAttribArraysMask); 373 attribState->disableUnusedArrays(this, usedAttribArraysMask);
373 } 374 }
374 } 375 }
OLDNEW
« src/gpu/gl/GrGLProgramDesc.cpp ('K') | « src/gpu/gl/GrGpuGL.cpp ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698