aboutsummaryrefslogtreecommitdiffhomepage
path: root/gpu/src/GrGpuGLShaders.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'gpu/src/GrGpuGLShaders.cpp')
-rw-r--r--gpu/src/GrGpuGLShaders.cpp166
1 files changed, 89 insertions, 77 deletions
diff --git a/gpu/src/GrGpuGLShaders.cpp b/gpu/src/GrGpuGLShaders.cpp
index b9db90c657..2ace2ad240 100644
--- a/gpu/src/GrGpuGLShaders.cpp
+++ b/gpu/src/GrGpuGLShaders.cpp
@@ -512,8 +512,9 @@ GrGpuGLShaders::GrGpuGLShaders() {
&fPrograms[p]);
GR_DEBUGASSERT(result);
- for (int m = 0; m < kMatrixModeCount; ++m) {
- fPrograms[p].fMatrixModeCache[m].setScale(GR_ScalarMax,
+ fPrograms[p].fViewMatrix.setScale(GR_ScalarMax, GR_ScalarMax);
+ for (int s = 0; s < kNumStages; ++s) {
+ fPrograms[p].fTextureMatrices[s].setScale(GR_ScalarMax,
GR_ScalarMax); // illegal
};
fPrograms[p].fColor = GrColor_ILLEGAL;
@@ -559,7 +560,7 @@ void GrGpuGLShaders::flushMatrix(GLint location) {
GrIntToScalar(2) / fCurrDrawState.fRenderTarget->width(), 0, -GR_Scalar1,
0,-GrIntToScalar(2) / fCurrDrawState.fRenderTarget->height(), GR_Scalar1,
0, 0, GrMatrix::I()[8]);
- m.setConcat(m, fCurrDrawState.fMatrixModeCache[kModelView_MatrixMode]);
+ m.setConcat(m, fCurrDrawState.fViewMatrix);
// ES doesn't allow you to pass true to the transpose param,
// so do our own transpose
@@ -593,11 +594,11 @@ void GrGpuGLShaders::flushTexMatrix(GLint location,
0, -GR_Scalar1, GR_Scalar1,
0, 0, GrMatrix::I()[8]
);
- temp.preConcat(fCurrDrawState.fMatrixModeCache[kTexture_MatrixMode]);
+ temp.preConcat(fCurrDrawState.fTextureMatrices[0]);
m = &temp;
} else {
GrAssert(GrGLTexture::kTopDown_Orientation == orientation);
- m = &fCurrDrawState.fMatrixModeCache[kTexture_MatrixMode];
+ m = &fCurrDrawState.fTextureMatrices[0];
}
// ES doesn't allow you to pass true to the transpose param,
@@ -644,74 +645,77 @@ void GrGpuGLShaders::flushProgram(PrimitiveType type) {
Programs nextProgram = kNoTexture_Program;
- if (!VertexHasTexCoords(fGeometrySrc.fVertexLayout)) {
+ GrTexture* texture = fCurrDrawState.fTextures[0];
+ bool posAsTex =
+ StagePosAsTexCoordVertexLayoutBit(0) & fGeometrySrc.fVertexLayout;
+
+ if (!VertexUsesStage(0, fGeometrySrc.fVertexLayout)) {
goto HAVE_NEXT_PROGRAM;
}
- GrAssert(fCurrDrawState.fTexture);
+ GrAssert(NULL != texture);
- switch (fCurrDrawState.fSamplerState.getSampleMode()) {
+ switch (fCurrDrawState.fSamplerStates[0].getSampleMode()) {
case GrSamplerState::kRadial_SampleMode:
- GrAssert(!fCurrDrawState.fMatrixModeCache[kTexture_MatrixMode].hasPerspective());
- if (fGeometrySrc.fVertexLayout & kPositionAsTexCoord_VertexLayoutBit) {
+ GrAssert(!fCurrDrawState.fTextureMatrices[0].hasPerspective());
+ GrAssert(GrTexture::kAlpha_8_PixelConfig != texture->config());
+ if (posAsTex) {
nextProgram = kRadialTextureVertCoords_Program;
} else {
nextProgram = kRadialTextureTexCoords_Program;
}
break;
case GrSamplerState::kSweep_SampleMode:
- GrAssert(!fCurrDrawState.fMatrixModeCache[kTexture_MatrixMode].hasPerspective());
- if (fGeometrySrc.fVertexLayout & kPositionAsTexCoord_VertexLayoutBit) {
+ GrAssert(!fCurrDrawState.fTextureMatrices[0].hasPerspective());
+ GrAssert(GrTexture::kAlpha_8_PixelConfig != texture->config());
+ if (posAsTex) {
nextProgram = kSweepTextureVertCoords_Program;
} else {
nextProgram = kSweepTextureTexCoords_Program;
}
break;
case GrSamplerState::kRadial2_SampleMode:
- GrAssert(!fCurrDrawState.fMatrixModeCache[kTexture_MatrixMode].hasPerspective());
- if (fGeometrySrc.fVertexLayout & kPositionAsTexCoord_VertexLayoutBit) {
+ GrAssert(!fCurrDrawState.fTextureMatrices[0].hasPerspective());
+ GrAssert(GrTexture::kAlpha_8_PixelConfig != texture->config());
+ if (posAsTex) {
nextProgram = kTwoPointRadialTextureVertCoords_Program;
} else {
nextProgram = kTwoPointRadialTextureTexCoords_Program;
}
break;
- case GrSamplerState::kAlphaMod_SampleMode:
- GrAssert(((GrGLTexture*)fCurrDrawState.fTexture)->orientation() ==
- GrGLTexture::kTopDown_Orientation);
- (((GrGLTexture*)fCurrDrawState.fTexture)->uploadFormat() == GL_ALPHA);
-
- nextProgram = kText_Program;
- break;
- case GrSamplerState::kNormal_SampleMode: {
- GR_DEBUGCODE(GrGLTexture* tex = (GrGLTexture*)fCurrDrawState.fTexture;)
- GrAssert(tex);
-
- bool persp = fCurrDrawState.fMatrixModeCache[kTexture_MatrixMode].hasPerspective();
-
- if (fGeometrySrc.fVertexLayout & kPositionAsTexCoord_VertexLayoutBit) {
- nextProgram = persp ? kTextureVertCoordsProj_Program :
- kTextureVertCoords_Program;
+ case GrSamplerState::kNormal_SampleMode:
+ if (GrTexture::kAlpha_8_PixelConfig == texture->config()) {
+ GrAssert(((GrGLTexture*)texture)->orientation() ==
+ GrGLTexture::kTopDown_Orientation);
+ GrAssert(!posAsTex);
+ nextProgram = kText_Program;
} else {
- nextProgram = persp ? kTextureTexCoordsProj_Program :
- kTextureTexCoords_Program;
- }
- // check for case when frag shader can skip the color modulation
- if (!persp && !(fGeometrySrc.fVertexLayout
- & kColor_VertexLayoutBit) &&
- 0xffffffff == fCurrDrawState.fColor) {
- switch (nextProgram) {
- case kTextureVertCoords_Program:
- nextProgram = kTextureVertCoordsNoColor_Program;
- break;
- case kTextureTexCoords_Program:
- nextProgram = kTextureTexCoordsNoColor_Program;
- break;
- default:
- GrAssert("Unexpected");
- break;
+ bool persp = fCurrDrawState.fTextureMatrices[0].hasPerspective();
+ if (posAsTex) {
+ nextProgram = persp ? kTextureVertCoordsProj_Program :
+ kTextureVertCoords_Program;
+ } else {
+ nextProgram = persp ? kTextureTexCoordsProj_Program :
+ kTextureTexCoords_Program;
+ }
+ // check for case when frag shader can skip the color modulation
+ if (!persp && !(fGeometrySrc.fVertexLayout
+ & kColor_VertexLayoutBit) &&
+ 0xffffffff == fCurrDrawState.fColor) {
+ switch (nextProgram) {
+ case kTextureVertCoords_Program:
+ nextProgram = kTextureVertCoordsNoColor_Program;
+ break;
+ case kTextureTexCoords_Program:
+ nextProgram = kTextureTexCoordsNoColor_Program;
+ break;
+ default:
+ GrAssert("Unexpected");
+ break;
+ }
}
}
- } break;
+ break;
default:
GrAssert(!"Unknown samplemode");
break;
@@ -729,20 +733,26 @@ HAVE_NEXT_PROGRAM:
bool GrGpuGLShaders::flushGraphicsState(PrimitiveType type) {
+ for (int s = 1; s < kNumStages; ++s) {
+ if (VertexUsesStage(s, fGeometrySrc.fVertexLayout)) {
+ unimpl("the hard-coded shaders used by this "
+ "class only support 1 stage");
+ return false;
+ }
+ }
+
flushGLStateCommon(type);
if (fRenderTargetChanged) {
// our coords are in pixel space and the GL matrices map to NDC
// so if the viewport changed, our matrix is now wrong.
#if ATTRIBUTE_MATRIX
- fHWDrawState.fMatrixModeCache[kModelView_MatrixMode].setScale(GR_ScalarMax,
- GR_ScalarMax);
+ fHWDrawState.fViewMatrix.setScale(GR_ScalarMax, GR_ScalarMax);
#else
// we assume all shader matrices may be wrong after viewport changes
for (int p = 0; p < kProgramCount; ++p) {
// set to illegal matrix
- fPrograms[p].fMatrixModeCache[kModelView_MatrixMode].setScale(GR_ScalarMax,
- GR_ScalarMax);
+ fPrograms[p].fViewMatrix.setScale(GR_ScalarMax, GR_ScalarMax);
}
#endif
fRenderTargetChanged = false;
@@ -783,36 +793,35 @@ bool GrGpuGLShaders::flushGraphicsState(PrimitiveType type) {
}
#if ATTRIBUTE_MATRIX
- GrMatrix* currentMats = fHWDrawState.fMatrixModeCache;
+ GrMatrix& currentViewMatrix = fHWDrawState.fViewMatrix;
+ GrMatrix& currentTexMatrix = fHWDrawState.fTextureMatrices[0];
GrGLTexture::Orientation& orientation = fTextureOrientation;
#else
- GrMatrix* currentMats = fPrograms[fHWProgram].fMatrixModeCache;
+ GrMatrix& currentViewMatrix = fPrograms[fHWProgram].fViewMatrix;
+ GrMatrix& currentTexMatrix = fPrograms[fHWProgram].fTextureMatrices[0];
GrGLTexture::Orientation& orientation =
fPrograms[fHWProgram].fTextureOrientation;
#endif
- if (currentMats[kModelView_MatrixMode] !=
- fCurrDrawState.fMatrixModeCache[kModelView_MatrixMode]) {
+ if (currentViewMatrix !=
+ fCurrDrawState.fViewMatrix) {
flushMatrix(fPrograms[fHWProgram].fMatrixLocation);
- currentMats[kModelView_MatrixMode] =
- fCurrDrawState.fMatrixModeCache[kModelView_MatrixMode];
+ currentViewMatrix = fCurrDrawState.fViewMatrix;
}
- GrGLTexture* texture = (GrGLTexture*) fCurrDrawState.fTexture;
+ GrGLTexture* texture = (GrGLTexture*) fCurrDrawState.fTextures[0];
if (NULL != texture) {
if (-1 != fPrograms[fHWProgram].fTexMatrixLocation &&
- (currentMats[kTexture_MatrixMode] !=
- fCurrDrawState.fMatrixModeCache[kTexture_MatrixMode] ||
+ (currentTexMatrix != fCurrDrawState.fTextureMatrices[0] ||
orientation != texture->orientation())) {
flushTexMatrix(fPrograms[fHWProgram].fTexMatrixLocation,
texture->orientation());
- currentMats[kTexture_MatrixMode] =
- fCurrDrawState.fMatrixModeCache[kTexture_MatrixMode];
+ currentTexMatrix = fCurrDrawState.fTextureMatrices[0];
orientation = texture->orientation();
}
}
- const GrSamplerState& sampler = fCurrDrawState.fSamplerState;
+ const GrSamplerState& sampler = fCurrDrawState.fSamplerStates[0];
if (-1 != fPrograms[fHWProgram].fTwoPointParamsLocation &&
(fPrograms[fHWProgram].fRadial2CenterX1 != sampler.getRadial2CenterX1() ||
fPrograms[fHWProgram].fRadial2Radius0 != sampler.getRadial2Radius0() ||
@@ -833,15 +842,17 @@ void GrGpuGLShaders::setupGeometry(uint32_t startVertex,
uint32_t vertexCount,
uint32_t indexCount) {
- int newColorOffset, newTexCoordOffset;
+ int newColorOffset;
+ int newTexCoordOffsets[kNumStages];
- GLsizei newStride = VertexSizeAndOffsets(fGeometrySrc.fVertexLayout,
- &newTexCoordOffset,
- &newColorOffset);
- int oldColorOffset, oldTexCoordOffset;
- GLsizei oldStride = VertexSizeAndOffsets(fHWGeometryState.fVertexLayout,
- &oldTexCoordOffset,
- &oldColorOffset);
+ GLsizei newStride = VertexSizeAndOffsetsByStage(fGeometrySrc.fVertexLayout,
+ newTexCoordOffsets,
+ &newColorOffset);
+ int oldColorOffset;
+ int oldTexCoordOffsets[kNumStages];
+ GLsizei oldStride = VertexSizeAndOffsetsByStage(fHWGeometryState.fVertexLayout,
+ oldTexCoordOffsets,
+ &oldColorOffset);
const GLvoid* posPtr = (GLvoid*)(newStride * startVertex);
@@ -906,16 +917,17 @@ void GrGpuGLShaders::setupGeometry(uint32_t startVertex,
fHWGeometryState.fPositionPtr = posPtr;
}
- if (newTexCoordOffset > 0) {
- GLvoid* texCoordPtr = (int8_t*)posPtr + newTexCoordOffset;
- if (oldTexCoordOffset <= 0) {
+ // this class only supports one stage.
+ if (newTexCoordOffsets[0] > 0) {
+ GLvoid* texCoordPtr = (int8_t*)posPtr + newTexCoordOffsets[0];
+ if (oldTexCoordOffsets[0] <= 0) {
GR_GL(EnableVertexAttribArray(GR_GL_TEX_ATTR_LOCATION));
}
- if (posChange || newTexCoordOffset != oldTexCoordOffset) {
+ if (posChange || newTexCoordOffsets[0] != oldTexCoordOffsets[0]) {
GR_GL(VertexAttribPointer(GR_GL_TEX_ATTR_LOCATION, 2, scalarType,
texCoordNorm, newStride, texCoordPtr));
}
- } else if (oldTexCoordOffset > 0) {
+ } else if (oldTexCoordOffsets[0] > 0) {
GR_GL(DisableVertexAttribArray(GR_GL_TEX_ATTR_LOCATION));
}