Make GrGLInterface a per-GrContext refcounted object rather than a global
Review URL: http://codereview.appspot.com/4901046/
git-svn-id: http://skia.googlecode.com/svn/trunk@2140 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/gpu/src/GrGpuGLFixed.cpp b/gpu/src/GrGpuGLFixed.cpp
index b955eeb..87b051b 100644
--- a/gpu/src/GrGpuGLFixed.cpp
+++ b/gpu/src/GrGpuGLFixed.cpp
@@ -46,9 +46,22 @@
GR_GL_MODELVIEW, GR_GL_TEXTURE
};
+#define GL_CALL(X) GR_GL_CALL(this->glInterface(), X)
///////////////////////////////////////////////////////////////////////////////
-GrGpuGLFixed::GrGpuGLFixed() {
+namespace {
+GrGLBinding get_binding_in_use(const GrGLInterface* gl) {
+ if (gl->supportsDesktop()) {
+ return kDesktop_GrGLBinding;
+ } else {
+ GrAssert(gl->supportsES1());
+ return kES1_GrGLBinding;
+ }
+}
+}
+
+GrGpuGLFixed::GrGpuGLFixed(const GrGLInterface* gl)
+ : GrGpuGL(gl, get_binding_in_use(gl)) {
f4X4DownsampleFilterSupport = false;
fDualSourceBlendingSupport = false;
}
@@ -59,22 +72,42 @@
void GrGpuGLFixed::resetContext() {
INHERITED::resetContext();
- GR_GL(Disable(GR_GL_TEXTURE_2D));
+ GL_CALL(Disable(GR_GL_TEXTURE_2D));
for (int s = 0; s < kNumStages; ++s) {
setTextureUnit(s);
- GR_GL(EnableClientState(GR_GL_VERTEX_ARRAY));
- GR_GL(TexEnvi(GR_GL_TEXTURE_ENV, GR_GL_TEXTURE_ENV_MODE, GR_GL_COMBINE));
- GR_GL(TexEnvi(GR_GL_TEXTURE_ENV, GR_GL_COMBINE_RGB, GR_GL_MODULATE));
- GR_GL(TexEnvi(GR_GL_TEXTURE_ENV, GR_GL_SRC0_RGB, GR_GL_TEXTURE0+s));
- GR_GL(TexEnvi(GR_GL_TEXTURE_ENV, GR_GL_SRC1_RGB, GR_GL_PREVIOUS));
- GR_GL(TexEnvi(GR_GL_TEXTURE_ENV, GR_GL_OPERAND1_RGB, GR_GL_SRC_COLOR));
+ GL_CALL(EnableClientState(GR_GL_VERTEX_ARRAY));
+ GL_CALL(TexEnvi(GR_GL_TEXTURE_ENV,
+ GR_GL_TEXTURE_ENV_MODE,
+ GR_GL_COMBINE));
+ GL_CALL(TexEnvi(GR_GL_TEXTURE_ENV,
+ GR_GL_COMBINE_RGB,
+ GR_GL_MODULATE));
+ GL_CALL(TexEnvi(GR_GL_TEXTURE_ENV,
+ GR_GL_SRC0_RGB,
+ GR_GL_TEXTURE0+s));
+ GL_CALL(TexEnvi(GR_GL_TEXTURE_ENV,
+ GR_GL_SRC1_RGB,
+ GR_GL_PREVIOUS));
+ GL_CALL(TexEnvi(GR_GL_TEXTURE_ENV,
+ GR_GL_OPERAND1_RGB,
+ GR_GL_SRC_COLOR));
- GR_GL(TexEnvi(GR_GL_TEXTURE_ENV, GR_GL_COMBINE_ALPHA, GR_GL_MODULATE));
- GR_GL(TexEnvi(GR_GL_TEXTURE_ENV, GR_GL_SRC0_ALPHA, GR_GL_TEXTURE0+s));
- GR_GL(TexEnvi(GR_GL_TEXTURE_ENV, GR_GL_OPERAND0_ALPHA, GR_GL_SRC_ALPHA));
- GR_GL(TexEnvi(GR_GL_TEXTURE_ENV, GR_GL_SRC1_ALPHA, GR_GL_PREVIOUS));
- GR_GL(TexEnvi(GR_GL_TEXTURE_ENV, GR_GL_OPERAND1_ALPHA, GR_GL_SRC_ALPHA));
+ GL_CALL(TexEnvi(GR_GL_TEXTURE_ENV,
+ GR_GL_COMBINE_ALPHA,
+ GR_GL_MODULATE));
+ GL_CALL(TexEnvi(GR_GL_TEXTURE_ENV,
+ GR_GL_SRC0_ALPHA,
+ GR_GL_TEXTURE0+s));
+ GL_CALL(TexEnvi(GR_GL_TEXTURE_ENV,
+ GR_GL_OPERAND0_ALPHA,
+ GR_GL_SRC_ALPHA));
+ GL_CALL(TexEnvi(GR_GL_TEXTURE_ENV,
+ GR_GL_SRC1_ALPHA,
+ GR_GL_PREVIOUS));
+ GL_CALL(TexEnvi(GR_GL_TEXTURE_ENV,
+ GR_GL_OPERAND1_ALPHA,
+ GR_GL_SRC_ALPHA));
// color oprand0 changes between GL_SRC_COLR and GL_SRC_ALPHA depending
// upon whether we have a (premultiplied) RGBA texture or just an ALPHA
@@ -85,14 +118,14 @@
fHWGeometryState.fVertexLayout = 0;
fHWGeometryState.fVertexOffset = ~0;
- GR_GL(EnableClientState(GR_GL_VERTEX_ARRAY));
- GR_GL(DisableClientState(GR_GL_TEXTURE_COORD_ARRAY));
- GR_GL(ShadeModel(GR_GL_FLAT));
- GR_GL(DisableClientState(GR_GL_COLOR_ARRAY));
+ GL_CALL(EnableClientState(GR_GL_VERTEX_ARRAY));
+ GL_CALL(DisableClientState(GR_GL_TEXTURE_COORD_ARRAY));
+ GL_CALL(ShadeModel(GR_GL_FLAT));
+ GL_CALL(DisableClientState(GR_GL_COLOR_ARRAY));
- GR_GL(PointSize(1.f));
+ GL_CALL(PointSize(1.f));
- GrGLClearErr();
+ GrGLClearErr(this->glInterface());
fTextVerts = false;
fBaseVertex = 0xffffffff;
@@ -113,8 +146,8 @@
mat[12] = -1.f;
mat[13] = 1.f;
- GR_GL(MatrixMode(GR_GL_PROJECTION));
- GR_GL(LoadMatrixf(mat));
+ GL_CALL(MatrixMode(GR_GL_PROJECTION));
+ GL_CALL(LoadMatrixf(mat));
}
bool GrGpuGLFixed::flushGraphicsState(GrPrimitiveType type) {
@@ -129,7 +162,7 @@
}
}
- if (GR_GL_SUPPORT_ES1) {
+ if (kES1_GrGLBinding == this->glBinding()) {
if (BlendCoeffReferencesConstant(fCurrDrawState.fSrcBlend) ||
BlendCoeffReferencesConstant(fCurrDrawState.fDstBlend)) {
unimpl("ES1 doesn't support blend constant");
@@ -152,9 +185,9 @@
if (usingTextures[s] != wasUsingTexture) {
setTextureUnit(s);
if (usingTextures[s]) {
- GR_GL(Enable(GR_GL_TEXTURE_2D));
+ GL_CALL(Enable(GR_GL_TEXTURE_2D));
} else {
- GR_GL(Disable(GR_GL_TEXTURE_2D));
+ GL_CALL(Disable(GR_GL_TEXTURE_2D));
}
}
}
@@ -165,17 +198,17 @@
if (vertColor != prevVertColor) {
if (vertColor) {
- GR_GL(ShadeModel(GR_GL_SMOOTH));
+ GL_CALL(ShadeModel(GR_GL_SMOOTH));
// invalidate the immediate mode color
fHWDrawState.fColor = GrColor_ILLEGAL;
} else {
- GR_GL(ShadeModel(GR_GL_FLAT));
+ GL_CALL(ShadeModel(GR_GL_FLAT));
}
}
if (!vertColor && fHWDrawState.fColor != fCurrDrawState.fColor) {
- GR_GL(Color4ub(GrColorUnpackR(fCurrDrawState.fColor),
+ GL_CALL(Color4ub(GrColorUnpackR(fCurrDrawState.fColor),
GrColorUnpackG(fCurrDrawState.fColor),
GrColorUnpackB(fCurrDrawState.fColor),
GrColorUnpackA(fCurrDrawState.fColor)));
@@ -193,7 +226,7 @@
kColor_TextureEnvRGBOperand;
if (fHWRGBOperand0[s] != nextRGBOperand0) {
setTextureUnit(s);
- GR_GL(TexEnvi(GR_GL_TEXTURE_ENV,
+ GL_CALL(TexEnvi(GR_GL_TEXTURE_ENV,
GR_GL_OPERAND0_RGB,
(nextRGBOperand0==kAlpha_TextureEnvRGBOperand) ?
GR_GL_SRC_ALPHA :
@@ -212,8 +245,8 @@
GrGpuMatrix glm;
glm.set(texMat);
setTextureUnit(s);
- GR_GL(MatrixMode(GR_GL_TEXTURE));
- GR_GL(LoadMatrixf(glm.fMat));
+ GL_CALL(MatrixMode(GR_GL_TEXTURE));
+ GL_CALL(LoadMatrixf(glm.fMat));
recordHWSamplerMatrix(s, getSamplerMatrix(s));
}
} else {
@@ -226,8 +259,8 @@
if (fHWDrawState.fViewMatrix != fCurrDrawState.fViewMatrix) {
GrGpuMatrix glm;
glm.set(fCurrDrawState.fViewMatrix);
- GR_GL(MatrixMode(GR_GL_MODELVIEW));
- GR_GL(LoadMatrixf(glm.fMat));
+ GL_CALL(MatrixMode(GR_GL_MODELVIEW));
+ GL_CALL(LoadMatrixf(glm.fMat));
fHWDrawState.fViewMatrix =
fCurrDrawState.fViewMatrix;
}
@@ -285,7 +318,8 @@
this->getGeomSrc().fVertexLayout)));
if (posAndTexChange) {
- GR_GL(VertexPointer(2, scalarType, newStride, (GrGLvoid*)vertexOffset));
+ GL_CALL(VertexPointer(2, scalarType,
+ newStride, (GrGLvoid*)vertexOffset));
fHWGeometryState.fVertexOffset = vertexOffset;
}
@@ -293,32 +327,37 @@
// need to enable array if tex coord offset is 0
// (using positions as coords)
if (newTexCoordOffsets[s] >= 0) {
- GrGLvoid* texCoordOffset = (GrGLvoid*)(vertexOffset + newTexCoordOffsets[s]);
+ GrGLvoid* texCoordOffset = (GrGLvoid*)(vertexOffset +
+ newTexCoordOffsets[s]);
if (oldTexCoordOffsets[s] < 0) {
- GR_GL(ClientActiveTexture(GR_GL_TEXTURE0+s));
- GR_GL(EnableClientState(GR_GL_TEXTURE_COORD_ARRAY));
- GR_GL(TexCoordPointer(2, scalarType, newStride, texCoordOffset));
+ GL_CALL(ClientActiveTexture(GR_GL_TEXTURE0+s));
+ GL_CALL(EnableClientState(GR_GL_TEXTURE_COORD_ARRAY));
+ GL_CALL(TexCoordPointer(2, scalarType,
+ newStride, texCoordOffset));
} else if (posAndTexChange ||
newTexCoordOffsets[s] != oldTexCoordOffsets[s]) {
- GR_GL(ClientActiveTexture(GR_GL_TEXTURE0+s));
- GR_GL(TexCoordPointer(2, scalarType, newStride, texCoordOffset));
+ GL_CALL(ClientActiveTexture(GR_GL_TEXTURE0+s));
+ GL_CALL(TexCoordPointer(2, scalarType,
+ newStride, texCoordOffset));
}
} else if (oldTexCoordOffsets[s] >= 0) {
- GR_GL(ClientActiveTexture(GR_GL_TEXTURE0+s));
- GR_GL(DisableClientState(GR_GL_TEXTURE_COORD_ARRAY));
+ GL_CALL(ClientActiveTexture(GR_GL_TEXTURE0+s));
+ GL_CALL(DisableClientState(GR_GL_TEXTURE_COORD_ARRAY));
}
}
if (newColorOffset > 0) {
GrGLvoid* colorOffset = (GrGLvoid*)(vertexOffset + newColorOffset);
if (oldColorOffset <= 0) {
- GR_GL(EnableClientState(GR_GL_COLOR_ARRAY));
- GR_GL(ColorPointer(4, GR_GL_UNSIGNED_BYTE, newStride, colorOffset));
+ GL_CALL(EnableClientState(GR_GL_COLOR_ARRAY));
+ GL_CALL(ColorPointer(4, GR_GL_UNSIGNED_BYTE,
+ newStride, colorOffset));
} else if (allOffsetsChange || newColorOffset != oldColorOffset) {
- GR_GL(ColorPointer(4, GR_GL_UNSIGNED_BYTE, newStride, colorOffset));
+ GL_CALL(ColorPointer(4, GR_GL_UNSIGNED_BYTE,
+ newStride, colorOffset));
}
} else if (oldColorOffset > 0) {
- GR_GL(DisableClientState(GR_GL_COLOR_ARRAY));
+ GL_CALL(DisableClientState(GR_GL_COLOR_ARRAY));
}
fHWGeometryState.fVertexLayout = this->getGeomSrc().fVertexLayout;