diff options
author | 2013-06-28 14:32:08 +0000 | |
---|---|---|
committer | 2013-06-28 14:32:08 +0000 | |
commit | cad107bbe723e5e71e625dccb5d7bcfe20c55c58 (patch) | |
tree | c2feb1cd3aad87deefcdf9eed5bf80eb03ac5eed /src/gpu | |
parent | 6bf19415c3a3ac25a8fccb66ab5cc55d046bd042 (diff) |
Add flag bits for partial GrContext reset
BUG=248728
R=bsalomon@google.com
Review URL: https://codereview.chromium.org/17027003
git-svn-id: http://skia.googlecode.com/svn/trunk@9802 2bbb7eff-a529-9590-31e7-b0007b416f81
Diffstat (limited to 'src/gpu')
-rw-r--r-- | src/gpu/GrContext.cpp | 4 | ||||
-rw-r--r-- | src/gpu/GrGpu.h | 11 | ||||
-rw-r--r-- | src/gpu/gl/GrGpuGL.cpp | 148 | ||||
-rw-r--r-- | src/gpu/gl/GrGpuGL.h | 2 |
4 files changed, 96 insertions, 69 deletions
diff --git a/src/gpu/GrContext.cpp b/src/gpu/GrContext.cpp index c94c1a925b..fe8f4fdedd 100644 --- a/src/gpu/GrContext.cpp +++ b/src/gpu/GrContext.cpp @@ -204,8 +204,8 @@ void GrContext::contextDestroyed() { fGpu->markContextDirty(); } -void GrContext::resetContext() { - fGpu->markContextDirty(); +void GrContext::resetContext(uint32_t state) { + fGpu->markContextDirty(state); } void GrContext::freeGpuResources() { diff --git a/src/gpu/GrGpu.h b/src/gpu/GrGpu.h index 3acfac2703..6b4cb53825 100644 --- a/src/gpu/GrGpu.h +++ b/src/gpu/GrGpu.h @@ -66,7 +66,10 @@ public: * the GrGpu that the state was modified and it shouldn't make assumptions * about the state. */ - void markContextDirty() { fContextIsDirty = true; } + void markContextDirty(uint32_t state = kALL_GrGLBackendState) { + fContextIsDirty = true; + fResetBits |= state; + } void unimpl(const char[]); @@ -426,7 +429,7 @@ private: // called when the 3D context state is unknown. Subclass should emit any // assumed 3D context state and dirty any state cache. - virtual void onResetContext() = 0; + virtual void onResetContext(uint32_t resetBits) = 0; // overridden by backend-specific derived class to create objects. virtual GrTexture* onCreateTexture(const GrTextureDesc& desc, @@ -507,7 +510,8 @@ private: // stencil buffer. Perhaps we should detect whether it is a // internally created stencil buffer and if so skip the invalidate. fClipMaskManager.invalidateStencilMask(); - this->onResetContext(); + this->onResetContext(fResetBits); + fResetBits = 0; ++fResetTimestamp; } @@ -532,6 +536,7 @@ private: // these are mutable so they can be created on-demand mutable GrIndexBuffer* fQuadIndexBuffer; bool fContextIsDirty; + uint32_t fResetBits; // Used to abandon/release all resources created by this GrGpu. TODO: Move this // functionality to GrResourceCache. ResourceList fResourceList; diff --git a/src/gpu/gl/GrGpuGL.cpp b/src/gpu/gl/GrGpuGL.cpp index d96ea395e6..51e3717664 100644 --- a/src/gpu/gl/GrGpuGL.cpp +++ b/src/gpu/gl/GrGpuGL.cpp @@ -282,88 +282,110 @@ 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 { diff --git a/src/gpu/gl/GrGpuGL.h b/src/gpu/gl/GrGpuGL.h index c644fbbac8..38e5842dce 100644 --- a/src/gpu/gl/GrGpuGL.h +++ b/src/gpu/gl/GrGpuGL.h @@ -102,7 +102,7 @@ protected: private: // GrGpu overrides - virtual void onResetContext() SK_OVERRIDE; + virtual void onResetContext(uint32_t resetBits) SK_OVERRIDE; virtual GrTexture* onCreateTexture(const GrTextureDesc& desc, const void* srcData, |