| OLD | NEW |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 } |
| OLD | NEW |