diff options
Diffstat (limited to 'src/gpu/gl/GrGLGpu.h')
-rw-r--r-- | src/gpu/gl/GrGLGpu.h | 49 |
1 files changed, 34 insertions, 15 deletions
diff --git a/src/gpu/gl/GrGLGpu.h b/src/gpu/gl/GrGLGpu.h index b93080b700..0ec69c0660 100644 --- a/src/gpu/gl/GrGLGpu.h +++ b/src/gpu/gl/GrGLGpu.h @@ -246,9 +246,25 @@ private: // ensures that such operations don't negatively interact with tracking bound textures. void setScratchTextureUnit(); - // bounds is region that may be modified and therefore has to be resolved. - // NULL means whole target. Can be an empty rect. - void flushRenderTarget(GrGLRenderTarget*, const SkIRect* bounds); + // Binds the render target, sets the viewport, tracks dirty are for resolve, and tracks whether + // mip maps need rebuilding. bounds is region that may be modified by the draw. NULL means whole + // target. Can be an empty rect. + void prepareToDrawToRenderTarget(GrGLRenderTarget*, const SkIRect* bounds); + + // On older GLs there may not be separate FBO bindings for draw and read. In that case these + // alias each other. + enum FBOBinding { + kDraw_FBOBinding, // drawing or dst of blit + kRead_FBOBinding, // src of blit, read pixels. + + kLast_FBOBinding = kRead_FBOBinding + }; + static const int kFBOBindingCnt = kLast_FBOBinding + 1; + + // binds the FBO and returns the GL enum of the framebuffer target it was bound to. + GrGLenum bindFBO(FBOBinding, const GrGLFBO*); + + void setViewport(const GrGLIRect& viewport); void flushStencil(const GrStencilSettings&); void flushHWAAState(GrRenderTarget* rt, bool useHWAA, bool isLineDraw); @@ -281,15 +297,14 @@ private: bool createRenderTargetObjects(const GrSurfaceDesc&, bool budgeted, GrGLuint texID, GrGLRenderTarget::IDDesc*); - enum TempFBOTarget { - kSrc_TempFBOTarget, - kDst_TempFBOTarget - }; + static const FBOBinding kInvalidFBOBinding = static_cast<FBOBinding>(-1); - GrGLuint bindSurfaceAsFBO(GrSurface* surface, GrGLenum fboTarget, GrGLIRect* viewport, - TempFBOTarget tempFBOTarget); + // Binds a surface as an FBO. A temporary FBO ID may be used if the surface is not already + // a render target. Afterwards unbindSurfaceAsFBOForCopy must be called with the value returned. + FBOBinding bindSurfaceAsFBOForCopy(GrSurface*, FBOBinding, GrGLIRect* viewport); - void unbindTextureFromFBO(GrGLenum fboTarget); + // Must be matched with bindSurfaceAsFBOForCopy. + void unbindSurfaceAsFBOForCopy(FBOBinding); GrGLContext fGLContext; @@ -309,10 +324,9 @@ private: kUnknown_TriState }; - GrGLuint fTempSrcFBOID; - GrGLuint fTempDstFBOID; - - GrGLuint fStencilClearFBOID; + SkAutoTUnref<GrGLFBO> fTempSrcFBO; + SkAutoTUnref<GrGLFBO> fTempDstFBO; + SkAutoTUnref<GrGLFBO> fStencilClearFBO; // last scissor / viewport scissor state seen by the GL. struct { @@ -458,9 +472,14 @@ private: GrPipelineBuilder::DrawFace fHWDrawFace; TriState fHWWriteToColor; TriState fHWDitherEnabled; - uint32_t fHWBoundRenderTargetUniqueID; SkTArray<uint32_t, true> fHWBoundTextureUniqueIDs; + // Track fbo binding state. + struct HWFBOBinding { + SkAutoTUnref<const GrGLFBO> fFBO; + void invalidate() { fFBO.reset(NULL); } + } fHWFBOBinding[kFBOBindingCnt]; + ///@} // we record what stencil format worked last time to hopefully exit early |