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

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

Issue 367643004: Implement NVPR on GLES (Closed) Base URL: https://skia.googlesource.com/skia.git@02-path-program-fragment
Patch Set: address review comments (rebase to separated patches) Created 6 years, 4 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
OLDNEW
1 /* 1 /*
2 * Copyright 2014 Google Inc. 2 * Copyright 2014 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/GrGLPathRendering.h" 8 #include "gl/GrGLPathRendering.h"
9 #include "gl/GrGLInterface.h" 9 #include "gl/GrGLInterface.h"
10 #include "gl/GrGLNameAllocator.h" 10 #include "gl/GrGLNameAllocator.h"
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
48 48
49 GrGLPathRendering::GrGLPathRendering(GrGpuGL* gpu, const GrGLInterface* glInterf ace) 49 GrGLPathRendering::GrGLPathRendering(GrGpuGL* gpu, const GrGLInterface* glInterf ace)
50 : fGpu(gpu), 50 : fGpu(gpu),
51 fGLInterface(SkRef(glInterface)) { 51 fGLInterface(SkRef(glInterface)) {
52 fCaps.thenFunctionsSupport = 52 fCaps.thenFunctionsSupport =
53 NULL != glInterface->fFunctions.fStencilThenCoverFillPath && 53 NULL != glInterface->fFunctions.fStencilThenCoverFillPath &&
54 NULL != glInterface->fFunctions.fStencilThenCoverStrokePath && 54 NULL != glInterface->fFunctions.fStencilThenCoverStrokePath &&
55 NULL != glInterface->fFunctions.fStencilThenCoverFillPathInstanced && 55 NULL != glInterface->fFunctions.fStencilThenCoverFillPathInstanced &&
56 NULL != glInterface->fFunctions.fStencilThenCoverStrokePathInstanced; 56 NULL != glInterface->fFunctions.fStencilThenCoverStrokePathInstanced;
57 fCaps.fragmentInputGenSupport = 57 fCaps.fragmentInputGenSupport =
58 kGLES_GrGLStandard == glInterface->fStandard &&
58 NULL != glInterface->fFunctions.fProgramPathFragmentInputGen; 59 NULL != glInterface->fFunctions.fProgramPathFragmentInputGen;
59 fHWPathTexGenSettings.reset(fGpu->glCaps().maxFixedFunctionTextureCoords()); 60
61 if (!fCaps.fragmentInputGenSupport) {
62 fHWPathTexGenSettings.reset(fGpu->glCaps().maxFixedFunctionTextureCoords ());
63 }
60 } 64 }
61 65
62 GrGLPathRendering::~GrGLPathRendering() { 66 GrGLPathRendering::~GrGLPathRendering() {
63 } 67 }
64 68
65 void GrGLPathRendering::abandonGpuResources() { 69 void GrGLPathRendering::abandonGpuResources() {
66 fPathNameAllocator.reset(NULL); 70 fPathNameAllocator.reset(NULL);
67 } 71 }
68 72
69 void GrGLPathRendering::onResetContext() { 73 void GrGLPathRendering::onResetContext() {
70 fHWProjectionMatrixState.invalidate(); 74 fHWProjectionMatrixState.invalidate();
71 // we don't use the model view matrix. 75 // we don't use the model view matrix.
72 GL_CALL(MatrixLoadIdentity(GR_GL_MODELVIEW)); 76 GrGLenum matrixMode =
77 fGpu->glStandard() == kGLES_GrGLStandard ? GR_GL_PATH_MODELVIEW : GR_GL_ MODELVIEW;
78 GL_CALL(MatrixLoadIdentity(matrixMode));
73 79
74 for (int i = 0; i < fGpu->glCaps().maxFixedFunctionTextureCoords(); ++i) { 80 if (!caps().fragmentInputGenSupport) {
75 GL_CALL(PathTexGen(GR_GL_TEXTURE0 + i, GR_GL_NONE, 0, NULL)); 81 for (int i = 0; i < fGpu->glCaps().maxFixedFunctionTextureCoords(); ++i) {
76 fHWPathTexGenSettings[i].fMode = GR_GL_NONE; 82 GL_CALL(PathTexGen(GR_GL_TEXTURE0 + i, GR_GL_NONE, 0, NULL));
77 fHWPathTexGenSettings[i].fNumComponents = 0; 83 fHWPathTexGenSettings[i].fMode = GR_GL_NONE;
84 fHWPathTexGenSettings[i].fNumComponents = 0;
85 }
86 fHWActivePathTexGenSets = 0;
78 } 87 }
79 fHWActivePathTexGenSets = 0;
80 fHWPathStencilSettings.invalidate(); 88 fHWPathStencilSettings.invalidate();
81 } 89 }
82 90
83 GrPath* GrGLPathRendering::createPath(const SkPath& inPath, const SkStrokeRec& s troke) { 91 GrPath* GrGLPathRendering::createPath(const SkPath& inPath, const SkStrokeRec& s troke) {
84 return SkNEW_ARGS(GrGLPath, (fGpu, inPath, stroke)); 92 return SkNEW_ARGS(GrGLPath, (fGpu, inPath, stroke));
85 } 93 }
86 94
87 GrPathRange* GrGLPathRendering::createPathRange(size_t size, const SkStrokeRec& stroke) { 95 GrPathRange* GrGLPathRendering::createPathRange(size_t size, const SkStrokeRec& stroke) {
88 return SkNEW_ARGS(GrGLPathRange, (fGpu, size, stroke)); 96 return SkNEW_ARGS(GrGLPathRange, (fGpu, size, stroke));
89 } 97 }
90 98
91 void GrGLPathRendering::stencilPath(const GrPath* path, SkPath::FillType fill) { 99 void GrGLPathRendering::stencilPath(const GrPath* path, SkPath::FillType fill) {
92 GrGLuint id = static_cast<const GrGLPath*>(path)->pathID(); 100 GrGLuint id = static_cast<const GrGLPath*>(path)->pathID();
93 SkASSERT(NULL != fGpu->drawState()->getRenderTarget()); 101 SkASSERT(NULL != fGpu->drawState()->getRenderTarget());
94 SkASSERT(NULL != fGpu->drawState()->getRenderTarget()->getStencilBuffer()); 102 SkASSERT(NULL != fGpu->drawState()->getRenderTarget()->getStencilBuffer());
95 103
96 this->flushPathStencilSettings(fill); 104 this->flushPathStencilSettings(fill);
97 105
98 GrGLenum fillMode = 106 GrGLenum fillMode =
99 gr_stencil_op_to_gl_path_rendering_fill_mode(fHWPathStencilSettings.pass Op(GrStencilSettings::kFront_Face)); 107 gr_stencil_op_to_gl_path_rendering_fill_mode(fHWPathStencilSettings.pass Op(GrStencilSettings::kFront_Face));
100 GrGLint writeMask = fHWPathStencilSettings.writeMask(GrStencilSettings::kFro nt_Face); 108 GrGLint writeMask = fHWPathStencilSettings.writeMask(GrStencilSettings::kFro nt_Face);
101 GL_CALL(StencilFillPath(id, fillMode, writeMask)); 109 GL_CALL(StencilFillPath(id, fillMode, writeMask));
102 } 110 }
103 111
104 void GrGLPathRendering::drawPath(const GrPath* path, SkPath::FillType fill) { 112 void GrGLPathRendering::drawPath(const GrPath* path, SkPath::FillType fill) {
105 GrGLuint id = static_cast<const GrGLPath*>(path)->pathID(); 113 GrGLuint id = static_cast<const GrGLPath*>(path)->pathID();
106 SkASSERT(NULL != fGpu->drawState()->getRenderTarget()); 114 SkASSERT(NULL != fGpu->drawState()->getRenderTarget());
107 SkASSERT(NULL != fGpu->drawState()->getRenderTarget()->getStencilBuffer()); 115 SkASSERT(NULL != fGpu->drawState()->getRenderTarget()->getStencilBuffer());
108 SkASSERT(!fGpu->fCurrentProgram->hasVertexShader());
109 116
110 this->flushPathStencilSettings(fill); 117 this->flushPathStencilSettings(fill);
111 const SkStrokeRec& stroke = path->getStroke(); 118 const SkStrokeRec& stroke = path->getStroke();
112 119
113 SkPath::FillType nonInvertedFill = SkPath::ConvertToNonInverseFillType(fill) ; 120 SkPath::FillType nonInvertedFill = SkPath::ConvertToNonInverseFillType(fill) ;
114 SkASSERT(!fHWPathStencilSettings.isTwoSided()); 121 SkASSERT(!fHWPathStencilSettings.isTwoSided());
115 GrGLenum fillMode = 122 GrGLenum fillMode =
116 gr_stencil_op_to_gl_path_rendering_fill_mode(fHWPathStencilSettings.pass Op(GrStencilSettings::kFront_Face)); 123 gr_stencil_op_to_gl_path_rendering_fill_mode(fHWPathStencilSettings.pass Op(GrStencilSettings::kFront_Face));
117 GrGLint writeMask = fHWPathStencilSettings.writeMask(GrStencilSettings::kFro nt_Face); 124 GrGLint writeMask = fHWPathStencilSettings.writeMask(GrStencilSettings::kFro nt_Face);
118 125
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
153 fGpu->drawSimpleRect(bounds); 160 fGpu->drawSimpleRect(bounds);
154 } 161 }
155 } 162 }
156 163
157 void GrGLPathRendering::drawPaths(const GrPathRange* pathRange, const uint32_t i ndices[], int count, 164 void GrGLPathRendering::drawPaths(const GrPathRange* pathRange, const uint32_t i ndices[], int count,
158 const float transforms[], PathTransformType tr ansformsType, 165 const float transforms[], PathTransformType tr ansformsType,
159 SkPath::FillType fill) { 166 SkPath::FillType fill) {
160 SkASSERT(fGpu->caps()->pathRenderingSupport()); 167 SkASSERT(fGpu->caps()->pathRenderingSupport());
161 SkASSERT(NULL != fGpu->drawState()->getRenderTarget()); 168 SkASSERT(NULL != fGpu->drawState()->getRenderTarget());
162 SkASSERT(NULL != fGpu->drawState()->getRenderTarget()->getStencilBuffer()); 169 SkASSERT(NULL != fGpu->drawState()->getRenderTarget()->getStencilBuffer());
163 SkASSERT(!fGpu->fCurrentProgram->hasVertexShader());
164 170
165 GrGLuint baseID = static_cast<const GrGLPathRange*>(pathRange)->basePathID() ; 171 GrGLuint baseID = static_cast<const GrGLPathRange*>(pathRange)->basePathID() ;
166 172
167 this->flushPathStencilSettings(fill); 173 this->flushPathStencilSettings(fill);
168 const SkStrokeRec& stroke = pathRange->getStroke(); 174 const SkStrokeRec& stroke = pathRange->getStroke();
169 175
170 SkPath::FillType nonInvertedFill = 176 SkPath::FillType nonInvertedFill =
171 SkPath::ConvertToNonInverseFillType(fill); 177 SkPath::ConvertToNonInverseFillType(fill);
172 178
173 SkASSERT(!fHWPathStencilSettings.isTwoSided()); 179 SkASSERT(!fHWPathStencilSettings.isTwoSided());
(...skipping 163 matching lines...) Expand 10 before | Expand all | Expand 10 after
337 matrix.cheapEqualTo(fHWProjectionMatrixState.fViewMatrix)) { 343 matrix.cheapEqualTo(fHWProjectionMatrixState.fViewMatrix)) {
338 return; 344 return;
339 } 345 }
340 346
341 fHWProjectionMatrixState.fViewMatrix = matrix; 347 fHWProjectionMatrixState.fViewMatrix = matrix;
342 fHWProjectionMatrixState.fRenderTargetSize = renderTargetSize; 348 fHWProjectionMatrixState.fRenderTargetSize = renderTargetSize;
343 fHWProjectionMatrixState.fRenderTargetOrigin = renderTargetOrigin; 349 fHWProjectionMatrixState.fRenderTargetOrigin = renderTargetOrigin;
344 350
345 GrGLfloat glMatrix[4 * 4]; 351 GrGLfloat glMatrix[4 * 4];
346 fHWProjectionMatrixState.getRTAdjustedGLMatrix<4>(glMatrix); 352 fHWProjectionMatrixState.getRTAdjustedGLMatrix<4>(glMatrix);
347 GL_CALL(MatrixLoadf(GR_GL_PROJECTION, glMatrix)); 353 GrGLenum matrixMode =
354 fGpu->glStandard() == kGLES_GrGLStandard ? GR_GL_PATH_PROJECTION : GR_G L_PROJECTION;
355 GL_CALL(MatrixLoadf(matrixMode, glMatrix));
348 } 356 }
349 357
350 GrGLuint GrGLPathRendering::genPaths(GrGLsizei range) { 358 GrGLuint GrGLPathRendering::genPaths(GrGLsizei range) {
351 if (range > 1) { 359 if (range > 1) {
352 GrGLuint name; 360 GrGLuint name;
353 GL_CALL_RET(name, GenPaths(range)); 361 GL_CALL_RET(name, GenPaths(range));
354 return name; 362 return name;
355 } 363 }
356 364
357 if (NULL == fPathNameAllocator.get()) { 365 if (NULL == fPathNameAllocator.get()) {
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after
457 reference, mask, coverMode, transformType, 465 reference, mask, coverMode, transformType,
458 transformValues)); 466 transformValues));
459 return; 467 return;
460 } 468 }
461 469
462 GL_CALL(StencilStrokePathInstanced(numPaths, pathNameType, paths, pathBase, 470 GL_CALL(StencilStrokePathInstanced(numPaths, pathNameType, paths, pathBase,
463 reference, mask, transformType, transform Values)); 471 reference, mask, transformType, transform Values));
464 GL_CALL(CoverStrokePathInstanced(numPaths, pathNameType, paths, pathBase, 472 GL_CALL(CoverStrokePathInstanced(numPaths, pathNameType, paths, pathBase,
465 coverMode, transformType, transformValues)) ; 473 coverMode, transformType, transformValues)) ;
466 } 474 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698