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

Unified Diff: src/gpu/gl/GrGpuGL.cpp

Issue 23537028: Enable vertexless shading when path rendering is supported (Closed) Base URL: https://skia.googlecode.com/svn/trunk
Patch Set: Created 7 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 side-by-side diff with in-line comments
Download patch
Index: src/gpu/gl/GrGpuGL.cpp
diff --git a/src/gpu/gl/GrGpuGL.cpp b/src/gpu/gl/GrGpuGL.cpp
index 6f9a8ab152f04f43e192bbf2229a92c88b168f29..4f4bb0f93f51c40af99e37a361f822e2267892cf 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,10 @@ 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));
+ fHWTexGenSettings[i].fMode = GR_GL_NONE;
+ fHWTexGenSettings[i].fNumComponents = 0;
}
+ fHWActiveTexGenUnits = 0;
}
// we assume these values
@@ -2112,6 +2116,121 @@ 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);
Mark Kilgard 2013/09/10 02:13:48 glMatrixLoadfEXT opportunity
+ GL_CALL(MatrixMode(GR_GL_PROJECTION));
+ GL_CALL(LoadMatrixf(glMatrix));
+}
+
+void GrGpuGL::enableTexGen(int unitIdx, int numComponents, const GrGLfloat* coefficients) {
+
+ SkASSERT(this->glCaps().fixedFunctionSupport());
+ SkASSERT(numComponents <= 3 && numComponents > 0);
+
+ if (GR_GL_OBJECT_LINEAR == fHWTexGenSettings[unitIdx].fMode &&
+ numComponents == fHWTexGenSettings[unitIdx].fNumComponents &&
+ !memcmp(coefficients, fHWTexGenSettings[unitIdx].fCoefficients,
+ 3 * numComponents * sizeof(GrGLfloat))) {
+ return;
+ }
+
Mark Kilgard 2013/09/10 02:13:48 It would be nice if we did *either* the fixed-func
bsalomon 2013/09/10 13:51:06 seems reasonable
+ setTextureUnit(unitIdx);
bsalomon 2013/09/10 13:51:06 style nit: this->setTextureUnit(unitIdx); (we use
+
Mark Kilgard 2013/09/10 02:13:48 Instead of glActiveTexture/glTexGeni/glEnable/glDi
+ 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 < numComponents; i++) {
+ GL_CALL(Enable(GR_GL_TEXTURE_GEN_S + i));
+ }
+ for (int i = numComponents; i < fHWTexGenSettings[unitIdx].fNumComponents; i++) {
+ GL_CALL(Disable(GR_GL_TEXTURE_GEN_S + i));
+ }
+ fHWTexGenSettings[unitIdx].fNumComponents = numComponents;
+
+ for (int i = 0; i < numComponents; 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,
+ numComponents,
+ coefficients));
+
+ memcpy(fHWTexGenSettings[unitIdx].fCoefficients, coefficients,
+ 3 * numComponents * sizeof(GrGLfloat));
+
+ fHWActiveTexGenUnits = SkTMax(fHWActiveTexGenUnits, unitIdx);
+}
+
+void GrGpuGL::enableTexGen(int unitIdx, int numComponents, const SkMatrix& matrix) {
+
+ GrGLfloat coefficients[9];
+ SkASSERT(this->glCaps().fixedFunctionSupport());
+ SkASSERT(numComponents <= 3 && numComponents > 0);
+
+ coefficients[0] = SkScalarToFloat(matrix[SkMatrix::kMScaleX]);
+ coefficients[1] = SkScalarToFloat(matrix[SkMatrix::kMSkewX]);
+ coefficients[2] = SkScalarToFloat(matrix[SkMatrix::kMTransX]);
+
+ if (numComponents >= 2) {
+ coefficients[3] = SkScalarToFloat(matrix[SkMatrix::kMSkewY]);
+ coefficients[4] = SkScalarToFloat(matrix[SkMatrix::kMScaleY]);
+ coefficients[5] = SkScalarToFloat(matrix[SkMatrix::kMTransY]);
+ }
+
+ if (numComponents >= 3) {
+ coefficients[6] = SkScalarToFloat(matrix[SkMatrix::kMPersp0]);
+ coefficients[7] = SkScalarToFloat(matrix[SkMatrix::kMPersp1]);
+ coefficients[8] = SkScalarToFloat(matrix[SkMatrix::kMPersp2]);
+ }
+
+ enableTexGen(unitIdx, numComponents, coefficients);
+}
+
+void GrGpuGL::disableUnusedTexGenUnits(int numUsedUnits) {
+
+ SkASSERT(this->glCaps().fixedFunctionSupport());
+
+ for (int i = numUsedUnits; i < fHWActiveTexGenUnits; i++) {
+ if (!fHWTexGenSettings[i].fNumComponents) {
+ continue;
+ }
+
Mark Kilgard 2013/09/10 02:13:48 Again, a lot of glDisable calls or glPathTexGen.
+ 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;
+ }
+
+ fHWActiveTexGenUnits = SkTMin(fHWActiveTexGenUnits, numUsedUnits);
+}
+
void GrGpuGL::flushMiscFixedFunctionState() {
const GrDrawState& drawState = this->getDrawState();
« src/gpu/gl/GrGpuGL.h ('K') | « src/gpu/gl/GrGpuGL.h ('k') | src/gpu/gl/GrGpuGL_program.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698