Chromium Code Reviews| Index: src/gpu/gl/GrGpuGL.cpp |
| diff --git a/src/gpu/gl/GrGpuGL.cpp b/src/gpu/gl/GrGpuGL.cpp |
| index a2ff1fd57618af1709d989c854be164beefd3701..6311b5b90d609c03fc91070ae601069c3e5f3e7c 100644 |
| --- a/src/gpu/gl/GrGpuGL.cpp |
| +++ b/src/gpu/gl/GrGpuGL.cpp |
| @@ -284,88 +284,105 @@ 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 & GrContext::kMisc_GLBackendState) { |
| + 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 |
|
bsalomon
2013/06/26 19:03:07
Nit: can you wrap this comment to 100 col lines?
|
| + // 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 & GrContext::kAA_GLBackendState) |
| + fHWAAState.invalidate(); |
| // invalid |
| - fHWActiveTextureUnitIdx = -1; |
| - |
| - fHWBlendState.invalidate(); |
| - |
| - for (int s = 0; s < fHWBoundTextures.count(); ++s) { |
| - fHWBoundTextures[s] = NULL; |
| + if (resetBits & GrContext::kTextureBinding_GLBackendState) { |
| + fHWActiveTextureUnitIdx = -1; |
| + for (int s = 0; s < fHWBoundTextures.count(); ++s) { |
| + fHWBoundTextures[s] = NULL; |
| + } |
| } |
| - fHWScissorSettings.invalidate(); |
| + if (resetBits & GrContext::kBlend_GLBackendState) |
| + fHWBlendState.invalidate(); |
| - fHWViewport.invalidate(); |
| + if (resetBits & GrContext::kView_GLBackendState) { |
| + fHWScissorSettings.invalidate(); |
| + fHWViewport.invalidate(); |
| + } |
| - fHWStencilSettings.invalidate(); |
| - fHWStencilTestEnabled = kUnknown_TriState; |
| + if (resetBits & GrContext::kStencil_GLBackendState) { |
| + fHWStencilSettings.invalidate(); |
| + fHWStencilTestEnabled = kUnknown_TriState; |
| + } |
| - fHWGeometryState.invalidate(); |
| + // Vertex |
| + if (resetBits & GrContext::kVertex_GLBackendState) |
| + fHWGeometryState.invalidate(); |
| - fHWBoundRenderTarget = NULL; |
| + if (resetBits & GrContext::kRenderTarget_GLBackendState) |
| + 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 & GrContext::kPathStencil_GLBackendState) { |
| + 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 & GrContext::kPixelStore_GLBackendState) { |
| + 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 & GrContext::kProgram_GLBackendState) { |
| + fHWProgramID = 0; |
| + fSharedGLProgramState.invalidate(); |
| + } |
| } |
| namespace { |