180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/* 280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Copyright 2011 Google Inc. 380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * 480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Use of this source code is governed by a BSD-style license that can be 580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * found in the LICENSE file. 680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */ 780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#ifndef GrGLRenderTarget_DEFINED 1080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#define GrGLRenderTarget_DEFINED 1180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 1280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "GrGLIRect.h" 1380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "GrRenderTarget.h" 14363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger#include "SkScalar.h" 1580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 1680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruclass GrGpuGL; 1780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruclass GrGLTexture; 1880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruclass GrGLTexID; 1980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 2080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruclass GrGLRenderTarget : public GrRenderTarget { 2180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 2280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querupublic: 2380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru // set fTexFBOID to this value to indicate that it is multisampled but 2480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru // Gr doesn't know how to resolve it. 2580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru enum { kUnresolvableFBOID = 0 }; 2680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 2780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru struct Desc { 28096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger GrGLuint fRTFBOID; 29096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger GrGLuint fTexFBOID; 30096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger GrGLuint fMSColorRenderbufferID; 31096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger bool fIsWrapped; 32096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger GrPixelConfig fConfig; 33096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger int fSampleCnt; 34096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger GrSurfaceOrigin fOrigin; 3558190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger bool fCheckAllocation; 3680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru }; 3780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 3880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru // creates a GrGLRenderTarget associated with a texture 3980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru GrGLRenderTarget(GrGpuGL* gpu, 4080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru const Desc& desc, 4180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru const GrGLIRect& viewport, 4280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru GrGLTexID* texID, 4380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru GrGLTexture* texture); 4480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 4580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru // creates an independent GrGLRenderTarget 4680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru GrGLRenderTarget(GrGpuGL* gpu, 4780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru const Desc& desc, 4880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru const GrGLIRect& viewport); 4980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 5080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru virtual ~GrGLRenderTarget() { this->release(); } 5180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 5280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru void setViewport(const GrGLIRect& rect) { fViewport = rect; } 5380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru const GrGLIRect& getViewport() const { return fViewport; } 5480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 5580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru // The following two functions return the same ID when a 56363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger // texture/render target is multisampled, and different IDs when 5780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru // it is. 5880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru // FBO ID used to render into 5980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru GrGLuint renderFBOID() const { return fRTFBOID; } 6080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru // FBO ID that has texture ID attached. 6180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru GrGLuint textureFBOID() const { return fTexFBOID; } 6280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 6380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru // override of GrRenderTarget 64363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger virtual GrBackendObject getRenderTargetHandle() const { 6580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return this->renderFBOID(); 6680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 67363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger virtual GrBackendObject getRenderTargetResolvedHandle() const { 6880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return this->textureFBOID(); 6980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 7080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru virtual ResolveType getResolveType() const { 7180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 7280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru if (!this->isMultisampled() || 7380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru fRTFBOID == fTexFBOID) { 7480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru // catches FBO 0 and non MSAA case 7580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return kAutoResolves_ResolveType; 7680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } else if (kUnresolvableFBOID == fTexFBOID) { 7780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return kCantResolve_ResolveType; 7880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } else { 7980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return kCanResolve_ResolveType; 8080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 8180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 8280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 8380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruprotected: 8480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru // override of GrResource 8580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru virtual void onAbandon() SK_OVERRIDE; 8680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru virtual void onRelease() SK_OVERRIDE; 8780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 8880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruprivate: 8980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru GrGLuint fRTFBOID; 9080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru GrGLuint fTexFBOID; 9180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 9280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru GrGLuint fMSColorRenderbufferID; 9380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 94363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger // when we switch to this render target we want to set the viewport to 9580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru // only render to to content area (as opposed to the whole allocation) and 9680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru // we want the rendering to be at top left (GL has origin in bottom left) 9780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru GrGLIRect fViewport; 9880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 9980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru // non-NULL if this RT was created by Gr with an associated GrGLTexture. 10058190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger SkAutoTUnref<GrGLTexID> fTexIDObj; 10180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 10280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru void init(const Desc& desc, const GrGLIRect& viewport, GrGLTexID* texID); 10380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 10480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru typedef GrRenderTarget INHERITED; 10580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}; 10680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 10780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#endif 108