| Index: src/gpu/gl/GrGpuGL.cpp
|
| diff --git a/src/gpu/gl/GrGpuGL.cpp b/src/gpu/gl/GrGpuGL.cpp
|
| index d1a716793f7e1bcde510f1898a5b724b4f10258c..576a134d0c05f8348302a2aa45d194dcecb55449 100644
|
| --- a/src/gpu/gl/GrGpuGL.cpp
|
| +++ b/src/gpu/gl/GrGpuGL.cpp
|
| @@ -124,6 +124,7 @@ GrGpuGL::GrGpuGL(const GrGLContext& ctx, GrContext* context)
|
| fCaps.reset(SkRef(ctx.info().caps()));
|
|
|
| fHWBoundTextures.reset(ctx.info().caps()->maxFragmentTextureUnits());
|
| + fHWTexGenSettings.reset(ctx.info().caps()->maxFixedFunctionTextureCoords());
|
|
|
| fillInConfigRenderableTable();
|
|
|
| @@ -377,7 +378,13 @@ void GrGpuGL::onResetContext(uint32_t resetBits) {
|
| GL_CALL(Disable(GR_GL_TEXTURE_GEN_T));
|
| GL_CALL(Disable(GR_GL_TEXTURE_GEN_Q));
|
| GL_CALL(Disable(GR_GL_TEXTURE_GEN_R));
|
| + if (this->caps()->pathStencilingSupport()) {
|
| + GL_CALL(PathTexGen(GR_GL_TEXTURE0 + i, GR_GL_NONE, 0, NULL));
|
| + }
|
| + fHWTexGenSettings[i].fMode = GR_GL_NONE;
|
| + fHWTexGenSettings[i].fNumComponents = 0;
|
| }
|
| + fHWActiveTexGenSets = 0;
|
| }
|
|
|
| // we assume these values
|
| @@ -2112,6 +2119,124 @@ void GrGpuGL::bindTexture(int unitIdx, const GrTextureParams& params, GrGLTextur
|
| texture->setCachedTexParams(newTexParams, this->getResetTimestamp());
|
| }
|
|
|
| +void GrGpuGL::setProjectionMatrix(const SkMatrix& matrix,
|
| + const SkISize& renderTargetSize,
|
| + GrSurfaceOrigin renderTargetOrigin) {
|
| +
|
| + SkASSERT(this->glCaps().fixedFunctionSupport());
|
| +
|
| + if (renderTargetOrigin == fHWProjectionMatrixState.fRenderTargetOrigin &&
|
| + renderTargetSize == fHWProjectionMatrixState.fRenderTargetSize &&
|
| + matrix.cheapEqualTo(fHWProjectionMatrixState.fViewMatrix)) {
|
| + return;
|
| + }
|
| +
|
| + fHWProjectionMatrixState.fViewMatrix = matrix;
|
| + fHWProjectionMatrixState.fRenderTargetSize = renderTargetSize;
|
| + fHWProjectionMatrixState.fRenderTargetOrigin = renderTargetOrigin;
|
| +
|
| + GrGLfloat glMatrix[4 * 4];
|
| + fHWProjectionMatrixState.getGLMatrix<4>(glMatrix);
|
| + GL_CALL(MatrixMode(GR_GL_PROJECTION));
|
| + GL_CALL(LoadMatrixf(glMatrix));
|
| +}
|
| +
|
| +void GrGpuGL::enableTexGen(int unitIdx,
|
| + TexGenComponents components,
|
| + const GrGLfloat* coefficients) {
|
| +
|
| + SkASSERT(this->glCaps().fixedFunctionSupport());
|
| + SkASSERT(this->caps()->pathStencilingSupport());
|
| + SkASSERT(components >= kS_TexGenComponents && components <= kSTR_TexGenComponents);
|
| +
|
| + if (GR_GL_OBJECT_LINEAR == fHWTexGenSettings[unitIdx].fMode &&
|
| + components == fHWTexGenSettings[unitIdx].fNumComponents &&
|
| + !memcmp(coefficients, fHWTexGenSettings[unitIdx].fCoefficients,
|
| + 3 * components * sizeof(GrGLfloat))) {
|
| + return;
|
| + }
|
| +
|
| + this->setTextureUnit(unitIdx);
|
| +
|
| + if (GR_GL_OBJECT_LINEAR != fHWTexGenSettings[unitIdx].fMode) {
|
| + for (int i = 0; i < 4; i++) {
|
| + GL_CALL(TexGeni(GR_GL_S + i, GR_GL_TEXTURE_GEN_MODE, GR_GL_OBJECT_LINEAR));
|
| + }
|
| + fHWTexGenSettings[unitIdx].fMode = GR_GL_OBJECT_LINEAR;
|
| + }
|
| +
|
| + for (int i = fHWTexGenSettings[unitIdx].fNumComponents; i < components; i++) {
|
| + GL_CALL(Enable(GR_GL_TEXTURE_GEN_S + i));
|
| + }
|
| + for (int i = components; i < fHWTexGenSettings[unitIdx].fNumComponents; i++) {
|
| + GL_CALL(Disable(GR_GL_TEXTURE_GEN_S + i));
|
| + }
|
| + fHWTexGenSettings[unitIdx].fNumComponents = components;
|
| +
|
| + for (int i = 0; i < components; i++) {
|
| + GrGLfloat plane[] = {coefficients[0 + 3 * i],
|
| + coefficients[1 + 3 * i],
|
| + 0,
|
| + coefficients[2 + 3 * i]};
|
| + GL_CALL(TexGenfv(GR_GL_S + i, GR_GL_OBJECT_PLANE, plane));
|
| + }
|
| +
|
| + GL_CALL(PathTexGen(GR_GL_TEXTURE0 + unitIdx,
|
| + GR_GL_OBJECT_LINEAR,
|
| + components,
|
| + coefficients));
|
| +
|
| + memcpy(fHWTexGenSettings[unitIdx].fCoefficients, coefficients,
|
| + 3 * components * sizeof(GrGLfloat));
|
| +
|
| + fHWActiveTexGenSets = SkTMax(fHWActiveTexGenSets, unitIdx);
|
| +}
|
| +
|
| +void GrGpuGL::enableTexGen(int unitIdx, TexGenComponents components, const SkMatrix& matrix) {
|
| +
|
| + GrGLfloat coefficients[3 * 3];
|
| + SkASSERT(this->glCaps().fixedFunctionSupport());
|
| + SkASSERT(components >= kS_TexGenComponents && components <= kSTR_TexGenComponents);
|
| +
|
| + coefficients[0] = SkScalarToFloat(matrix[SkMatrix::kMScaleX]);
|
| + coefficients[1] = SkScalarToFloat(matrix[SkMatrix::kMSkewX]);
|
| + coefficients[2] = SkScalarToFloat(matrix[SkMatrix::kMTransX]);
|
| +
|
| + if (components >= kST_TexGenComponents) {
|
| + coefficients[3] = SkScalarToFloat(matrix[SkMatrix::kMSkewY]);
|
| + coefficients[4] = SkScalarToFloat(matrix[SkMatrix::kMScaleY]);
|
| + coefficients[5] = SkScalarToFloat(matrix[SkMatrix::kMTransY]);
|
| + }
|
| +
|
| + if (components >= kSTR_TexGenComponents) {
|
| + coefficients[6] = SkScalarToFloat(matrix[SkMatrix::kMPersp0]);
|
| + coefficients[7] = SkScalarToFloat(matrix[SkMatrix::kMPersp1]);
|
| + coefficients[8] = SkScalarToFloat(matrix[SkMatrix::kMPersp2]);
|
| + }
|
| +
|
| + enableTexGen(unitIdx, components, coefficients);
|
| +}
|
| +
|
| +void GrGpuGL::disableUnusedTexGen(int numUsedTexCoordSets) {
|
| +
|
| + SkASSERT(this->glCaps().fixedFunctionSupport());
|
| +
|
| + for (int i = numUsedTexCoordSets; i < fHWActiveTexGenSets; i++) {
|
| + if (0 == fHWTexGenSettings[i].fNumComponents) {
|
| + continue;
|
| + }
|
| +
|
| + this->setTextureUnit(i);
|
| + for (int j = 0; j < fHWTexGenSettings[i].fNumComponents; j++) {
|
| + GL_CALL(Disable(GR_GL_TEXTURE_GEN_S + j));
|
| + }
|
| + GL_CALL(PathTexGen(GR_GL_TEXTURE0 + i, GR_GL_NONE, 0, NULL));
|
| + fHWTexGenSettings[i].fNumComponents = 0;
|
| + }
|
| +
|
| + fHWActiveTexGenSets = SkTMin(fHWActiveTexGenSets, numUsedTexCoordSets);
|
| +}
|
| +
|
| void GrGpuGL::flushMiscFixedFunctionState() {
|
|
|
| const GrDrawState& drawState = this->getDrawState();
|
|
|