| Index: src/gpu/gl/GrGLRenderTarget.h
|
| diff --git a/src/gpu/gl/GrGLRenderTarget.h b/src/gpu/gl/GrGLRenderTarget.h
|
| index 485ae4a7919d1d967b8600ac8c8093da80fe4af1..7e7349257f054ac44e8a32cd5626c1cf94e1041c 100644
|
| --- a/src/gpu/gl/GrGLRenderTarget.h
|
| +++ b/src/gpu/gl/GrGLRenderTarget.h
|
| @@ -15,59 +15,15 @@
|
|
|
| class GrGLGpu;
|
|
|
| -/** Represents a GL FBO object. It has a gen ID which is valid whenever the FBO ID owned by the
|
| - object is valid. The gen IDs are not recycled after FBOs are freed, unlike FBO IDs, and so
|
| - can be used to uniquely identity FBO ID instantiations. If this object owns an FBO ID, the ID
|
| - must be deleted or abandoned before this object is freed. FBO IDs should never be owned by
|
| - more than one instance. */
|
| -class GrGLFBO : public SkNVRefCnt<GrGLFBO> {
|
| -public:
|
| - SK_DECLARE_INST_COUNT(GrGLFBO);
|
| -
|
| - /** Initializes to an FBO. The FBO should already be valid in the relevant GL context. */
|
| - GrGLFBO(GrGLint id) : fID(id), fIsValid(true) {}
|
| -
|
| - /** Initializes to an FBO ID generated using the interface. */
|
| - GrGLFBO(const GrGLInterface* gl) {
|
| - GR_GL_CALL(gl, GenFramebuffers(1, &fID));
|
| - fIsValid = SkToBool(fID);
|
| - }
|
| -
|
| - ~GrGLFBO() { SkASSERT(!this->isValid()); }
|
| -
|
| - /** Has this object been released or abandoned? */
|
| - bool isValid() const { return fIsValid; }
|
| -
|
| - GrGLint fboID() const { SkASSERT(this->isValid()); return fID; }
|
| -
|
| - bool isDefaultFramebuffer() const { return fIsValid && 0 == fID; }
|
| -
|
| - /** Give up ownership of the FBO ID owned by this object without deleting it. */
|
| - void abandon();
|
| -
|
| - /** Delete and give up ownership of the the FBO ID if it is valid. */
|
| - void release(const GrGLInterface*);
|
| -
|
| -private:
|
| - static uint32_t NextGenID() {
|
| - static int32_t gGenID = SK_InvalidGenID + 1;
|
| - return static_cast<uint32_t>(sk_atomic_inc(&gGenID));
|
| - }
|
| -
|
| - GrGLuint fID;
|
| - bool fIsValid;
|
| -
|
| - typedef SkRefCnt INHERITED;
|
| -};
|
| -
|
| -//////////////////////////////////////////////////////////////////////////////
|
| -
|
| -/** GL-specific subclass of GrRenderTarget. */
|
| class GrGLRenderTarget : public GrRenderTarget {
|
| public:
|
| + // set fTexFBOID to this value to indicate that it is multisampled but
|
| + // Gr doesn't know how to resolve it.
|
| + enum { kUnresolvableFBOID = 0 };
|
| +
|
| struct IDDesc {
|
| - SkAutoTUnref<GrGLFBO> fRenderFBO;
|
| - SkAutoTUnref<GrGLFBO> fTextureFBO;
|
| + GrGLuint fRTFBOID;
|
| + GrGLuint fTexFBOID;
|
| GrGLuint fMSColorRenderbufferID;
|
| GrGpuResource::LifeCycle fLifeCycle;
|
| };
|
| @@ -77,33 +33,21 @@
|
| void setViewport(const GrGLIRect& rect) { fViewport = rect; }
|
| const GrGLIRect& getViewport() const { return fViewport; }
|
|
|
| - // For multisampled renderbuffer render targets, these will return different GrGLFBO objects. If
|
| - // the render target is not texturable, textureFBO() returns NULL. If the render target auto
|
| - // resolves to a texture, the same object is returned.
|
| -
|
| - // FBO that should be rendered into. Always non-NULL unless this resource is destroyed
|
| - // (this->wasDestroyed()).
|
| - const GrGLFBO* renderFBO() const {
|
| - SkASSERT(fRenderFBO && fRenderFBO->isValid());
|
| - return fRenderFBO;
|
| - }
|
| -
|
| - // FBO that has the target's texture ID attached. The return value may be:
|
| - // * NULL when this render target is not a texture,
|
| - // * the same as renderFBO() when this surface is not multisampled or auto-resolves,
|
| - // * or different than renderFBO() when it requires explicit resolving via
|
| - // glBlitFramebuffer.
|
| - const GrGLFBO* textureFBO() const {
|
| - SkASSERT(!fTextureFBO || fTextureFBO->isValid());
|
| - return fTextureFBO;
|
| - }
|
| + // The following two functions return the same ID when a
|
| + // texture/render target is multisampled, and different IDs when
|
| + // it is.
|
| + // FBO ID used to render into
|
| + GrGLuint renderFBOID() const { return fRTFBOID; }
|
| + // FBO ID that has texture ID attached.
|
| + GrGLuint textureFBOID() const { return fTexFBOID; }
|
|
|
| // override of GrRenderTarget
|
| ResolveType getResolveType() const SK_OVERRIDE {
|
| - if (!this->isMultisampled() || this->renderFBO() == this->textureFBO()) {
|
| + if (!this->isMultisampled() ||
|
| + fRTFBOID == fTexFBOID) {
|
| // catches FBO 0 and non MSAA case
|
| return kAutoResolves_ResolveType;
|
| - } else if (!this->textureFBO()) {
|
| + } else if (kUnresolvableFBOID == fTexFBOID) {
|
| return kCantResolve_ResolveType;
|
| } else {
|
| return kCanResolve_ResolveType;
|
| @@ -129,23 +73,23 @@
|
| size_t onGpuMemorySize() const SK_OVERRIDE;
|
|
|
| private:
|
| - SkAutoTUnref<GrGLFBO> fRenderFBO;
|
| - SkAutoTUnref<GrGLFBO> fTextureFBO;
|
| - GrGLuint fMSColorRenderbufferID;
|
| + GrGLuint fRTFBOID;
|
| + GrGLuint fTexFBOID;
|
| + GrGLuint fMSColorRenderbufferID;
|
|
|
| // We track this separately from GrGpuResource because this may be both a texture and a render
|
| // target, and the texture may be wrapped while the render target is not.
|
| - bool fIsWrapped;
|
| + bool fIsWrapped;
|
|
|
| // when we switch to this render target we want to set the viewport to
|
| // only render to content area (as opposed to the whole allocation) and
|
| // we want the rendering to be at top left (GL has origin in bottom left)
|
| - GrGLIRect fViewport;
|
| + GrGLIRect fViewport;
|
|
|
| // onGpuMemorySize() needs to know what how many color values are owned per pixel. However,
|
| // abandon and release zero out the IDs and the cache needs to know the size even after those
|
| // actions.
|
| - uint8_t fColorValuesPerPixel;
|
| + uint8_t fColorValuesPerPixel;
|
|
|
| typedef GrRenderTarget INHERITED;
|
| };
|
|
|