Index: src/gpu/gl/GrGpuGL.cpp |
diff --git a/src/gpu/gl/GrGpuGL.cpp b/src/gpu/gl/GrGpuGL.cpp |
index d96ea395e6976732411d6c630238edb478a11251..0ffcc2722203bd875dfee85efb31a117293641c7 100644 |
--- a/src/gpu/gl/GrGpuGL.cpp |
+++ b/src/gpu/gl/GrGpuGL.cpp |
@@ -153,6 +153,7 @@ GrGpuGL::GrGpuGL(const GrGLContext& ctx, GrContext* context) |
GrAssert(this->glCaps().maxVertexAttributes() >= GrDrawState::kMaxVertexAttribCnt); |
fLastSuccessfulStencilFmtIdx = 0; |
+ fHWProgramID = 0; |
} |
GrGpuGL::~GrGpuGL() { |
@@ -282,88 +283,109 @@ bool GrGpuGL::fullReadPixelsIsFasterThanPartial() const { |
return SkToBool(GR_GL_FULL_READPIXELS_FASTER_THAN_PARTIAL); |
} |
-void GrGpuGL::onResetContext() { |
- |
+void GrGpuGL::onResetContext(uint32_t resetBits) { |
// we don't use the zb at all |
- GL_CALL(Disable(GR_GL_DEPTH_TEST)); |
- GL_CALL(DepthMask(GR_GL_FALSE)); |
- |
- fHWDrawFace = GrDrawState::kInvalid_DrawFace; |
- fHWDitherEnabled = kUnknown_TriState; |
- |
- if (kDesktop_GrGLBinding == this->glBinding()) { |
- // Desktop-only state that we never change |
- if (!this->glCaps().isCoreProfile()) { |
- GL_CALL(Disable(GR_GL_POINT_SMOOTH)); |
- GL_CALL(Disable(GR_GL_LINE_SMOOTH)); |
- GL_CALL(Disable(GR_GL_POLYGON_SMOOTH)); |
- GL_CALL(Disable(GR_GL_POLYGON_STIPPLE)); |
- GL_CALL(Disable(GR_GL_COLOR_LOGIC_OP)); |
- GL_CALL(Disable(GR_GL_INDEX_LOGIC_OP)); |
- } |
- // The windows NVIDIA driver has GL_ARB_imaging in the extension string when using a core |
- // profile. This seems like a bug since the core spec removes any mention of GL_ARB_imaging. |
- if (this->glCaps().imagingSupport() && !this->glCaps().isCoreProfile()) { |
- GL_CALL(Disable(GR_GL_COLOR_TABLE)); |
+ if (resetBits & kMisc_GrGLBackendState) { |
+ GL_CALL(Disable(GR_GL_DEPTH_TEST)); |
+ GL_CALL(DepthMask(GR_GL_FALSE)); |
+ |
+ fHWDrawFace = GrDrawState::kInvalid_DrawFace; |
+ fHWDitherEnabled = kUnknown_TriState; |
+ |
+ if (kDesktop_GrGLBinding == this->glBinding()) { |
+ // Desktop-only state that we never change |
+ if (!this->glCaps().isCoreProfile()) { |
+ GL_CALL(Disable(GR_GL_POINT_SMOOTH)); |
+ GL_CALL(Disable(GR_GL_LINE_SMOOTH)); |
+ GL_CALL(Disable(GR_GL_POLYGON_SMOOTH)); |
+ GL_CALL(Disable(GR_GL_POLYGON_STIPPLE)); |
+ GL_CALL(Disable(GR_GL_COLOR_LOGIC_OP)); |
+ GL_CALL(Disable(GR_GL_INDEX_LOGIC_OP)); |
+ } |
+ // The windows NVIDIA driver has GL_ARB_imaging in the extension string when using a |
+ // core profile. This seems like a bug since the core spec removes any mention of |
+ // GL_ARB_imaging. |
+ if (this->glCaps().imagingSupport() && !this->glCaps().isCoreProfile()) { |
+ GL_CALL(Disable(GR_GL_COLOR_TABLE)); |
+ } |
+ GL_CALL(Disable(GR_GL_POLYGON_OFFSET_FILL)); |
+ // Since ES doesn't support glPointSize at all we always use the VS to |
+ // set the point size |
+ GL_CALL(Enable(GR_GL_VERTEX_PROGRAM_POINT_SIZE)); |
+ |
+ // We should set glPolygonMode(FRONT_AND_BACK,FILL) here, too. It isn't |
+ // currently part of our gl interface. There are probably others as |
+ // well. |
} |
- GL_CALL(Disable(GR_GL_POLYGON_OFFSET_FILL)); |
- // Since ES doesn't support glPointSize at all we always use the VS to |
- // set the point size |
- GL_CALL(Enable(GR_GL_VERTEX_PROGRAM_POINT_SIZE)); |
- |
- // We should set glPolygonMode(FRONT_AND_BACK,FILL) here, too. It isn't |
- // currently part of our gl interface. There are probably others as |
- // well. |
+ fHWWriteToColor = kUnknown_TriState; |
+ // we only ever use lines in hairline mode |
+ GL_CALL(LineWidth(1)); |
} |
- fHWAAState.invalidate(); |
- fHWWriteToColor = kUnknown_TriState; |
- // we only ever use lines in hairline mode |
- GL_CALL(LineWidth(1)); |
+ if (resetBits & kAA_GrGLBackendState) { |
+ fHWAAState.invalidate(); |
+ } |
// invalid |
- fHWActiveTextureUnitIdx = -1; |
- |
- fHWBlendState.invalidate(); |
- |
- for (int s = 0; s < fHWBoundTextures.count(); ++s) { |
- fHWBoundTextures[s] = NULL; |
+ if (resetBits & kTextureBinding_GrGLBackendState) { |
+ fHWActiveTextureUnitIdx = -1; |
+ for (int s = 0; s < fHWBoundTextures.count(); ++s) { |
+ fHWBoundTextures[s] = NULL; |
+ } |
} |
- fHWScissorSettings.invalidate(); |
+ if (resetBits & kBlend_GrGLBackendState) { |
+ fHWBlendState.invalidate(); |
+ } |
- fHWViewport.invalidate(); |
+ if (resetBits & kView_GrGLBackendState) { |
+ fHWScissorSettings.invalidate(); |
+ fHWViewport.invalidate(); |
+ } |
- fHWStencilSettings.invalidate(); |
- fHWStencilTestEnabled = kUnknown_TriState; |
+ if (resetBits & kStencil_GrGLBackendState) { |
+ fHWStencilSettings.invalidate(); |
+ fHWStencilTestEnabled = kUnknown_TriState; |
+ } |
- fHWGeometryState.invalidate(); |
+ // Vertex |
+ if (resetBits & kVertex_GrGLBackendState) { |
+ fHWGeometryState.invalidate(); |
+ } |
- fHWBoundRenderTarget = NULL; |
+ if (resetBits & kRenderTarget_GrGLBackendState) { |
+ fHWBoundRenderTarget = NULL; |
+ } |
- fHWPathStencilMatrixState.invalidate(); |
- if (this->caps()->pathStencilingSupport()) { |
- // we don't use the model view matrix. |
- GL_CALL(MatrixMode(GR_GL_MODELVIEW)); |
- GL_CALL(LoadIdentity()); |
+ if (resetBits & kPathStencil_GrGLBackendState) { |
+ fHWPathStencilMatrixState.invalidate(); |
+ if (this->caps()->pathStencilingSupport()) { |
+ // we don't use the model view matrix. |
+ GL_CALL(MatrixMode(GR_GL_MODELVIEW)); |
+ GL_CALL(LoadIdentity()); |
+ } |
} |
// we assume these values |
- if (this->glCaps().unpackRowLengthSupport()) { |
- GL_CALL(PixelStorei(GR_GL_UNPACK_ROW_LENGTH, 0)); |
- } |
- if (this->glCaps().packRowLengthSupport()) { |
- GL_CALL(PixelStorei(GR_GL_PACK_ROW_LENGTH, 0)); |
- } |
- if (this->glCaps().unpackFlipYSupport()) { |
- GL_CALL(PixelStorei(GR_GL_UNPACK_FLIP_Y, GR_GL_FALSE)); |
- } |
- if (this->glCaps().packFlipYSupport()) { |
- GL_CALL(PixelStorei(GR_GL_PACK_REVERSE_ROW_ORDER, GR_GL_FALSE)); |
+ if (resetBits & kPixelStore_GrGLBackendState) { |
+ if (this->glCaps().unpackRowLengthSupport()) { |
+ GL_CALL(PixelStorei(GR_GL_UNPACK_ROW_LENGTH, 0)); |
+ } |
+ if (this->glCaps().packRowLengthSupport()) { |
+ GL_CALL(PixelStorei(GR_GL_PACK_ROW_LENGTH, 0)); |
+ } |
+ if (this->glCaps().unpackFlipYSupport()) { |
+ GL_CALL(PixelStorei(GR_GL_UNPACK_FLIP_Y, GR_GL_FALSE)); |
+ } |
+ if (this->glCaps().packFlipYSupport()) { |
+ GL_CALL(PixelStorei(GR_GL_PACK_REVERSE_ROW_ORDER, GR_GL_FALSE)); |
+ } |
} |
- fHWProgramID = 0; |
- fSharedGLProgramState.invalidate(); |
+ if (resetBits & kProgram_GrGLBackendState) { |
+ fHWProgramID = 0; |
+ fSharedGLProgramState.invalidate(); |
+ } |
} |
namespace { |