11cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 21cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger/* 31cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Copyright 2011 Google Inc. 41cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * 51cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Use of this source code is governed by a BSD-style license that can be 61cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * found in the LICENSE file. 71cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger */ 81cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 91cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 101cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#ifndef GrGLRenderTarget_DEFINED 111cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#define GrGLRenderTarget_DEFINED 121cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 131cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#include "GrGLIRect.h" 141cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#include "GrRenderTarget.h" 151cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#include "GrScalar.h" 161cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 171cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerclass GrGpuGL; 181cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerclass GrGLTexture; 191cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerclass GrGLTexID; 201cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 211cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerclass GrGLRenderTarget : public GrRenderTarget { 221cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 231cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerpublic: 241cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger // set fTexFBOID to this value to indicate that it is multisampled but 251cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger // Gr doesn't know how to resolve it. 261cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger enum { kUnresolvableFBOID = 0 }; 271cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 281cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger struct Desc { 291cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger GrGLuint fRTFBOID; 301cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger GrGLuint fTexFBOID; 311cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger GrGLuint fMSColorRenderbufferID; 321cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger bool fOwnIDs; 331cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger GrPixelConfig fConfig; 341cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger int fSampleCnt; 351cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger }; 361cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 371cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger // creates a GrGLRenderTarget associated with a texture 381cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger GrGLRenderTarget(GrGpuGL* gpu, 391cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger const Desc& desc, 401cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger const GrGLIRect& viewport, 411cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger GrGLTexID* texID, 421cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger GrGLTexture* texture); 431cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 441cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger // creates an independent GrGLRenderTarget 451cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger GrGLRenderTarget(GrGpuGL* gpu, 461cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger const Desc& desc, 471cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger const GrGLIRect& viewport); 481cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 491cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger virtual ~GrGLRenderTarget() { this->release(); } 501cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 511cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger void setViewport(const GrGLIRect& rect) { fViewport = rect; } 521cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger const GrGLIRect& getViewport() const { return fViewport; } 531cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 541cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger // The following two functions return the same ID when a 551cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger // texture-rendertarget is multisampled, and different IDs when 561cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger // it is. 571cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger // FBO ID used to render into 581cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger GrGLuint renderFBOID() const { return fRTFBOID; } 591cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger // FBO ID that has texture ID attached. 601cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger GrGLuint textureFBOID() const { return fTexFBOID; } 611cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 621cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger // override of GrRenderTarget 631cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger virtual intptr_t getRenderTargetHandle() const { 641cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger return this->renderFBOID(); 651cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger } 661cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger virtual intptr_t getRenderTargetResolvedHandle() const { 671cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger return this->textureFBOID(); 681cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger } 691cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger virtual ResolveType getResolveType() const { 701cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 711cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger if (!this->isMultisampled() || 721cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger fRTFBOID == fTexFBOID) { 731cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger // catches FBO 0 and non MSAA case 741cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger return kAutoResolves_ResolveType; 751cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger } else if (kUnresolvableFBOID == fTexFBOID) { 761cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger return kCantResolve_ResolveType; 771cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger } else { 781cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger return kCanResolve_ResolveType; 791cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger } 801cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger } 811cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 821cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerprotected: 831cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger // override of GrResource 841cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger virtual void onAbandon(); 851cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger virtual void onRelease(); 861cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 871cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerprivate: 881cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger GrGLuint fRTFBOID; 891cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger GrGLuint fTexFBOID; 901cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 911cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger GrGLuint fMSColorRenderbufferID; 921cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 931cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger // Should this object delete IDs when it is destroyed or does someone 941cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger // else own them. 951cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger bool fOwnIDs; 961cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 971cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger // when we switch to this rendertarget we want to set the viewport to 981cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger // only render to to content area (as opposed to the whole allocation) and 991cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger // we want the rendering to be at top left (GL has origin in bottom left) 1001cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger GrGLIRect fViewport; 1011cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 1021cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger // non-NULL if this RT was created by Gr with an associated GrGLTexture. 1031cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger GrGLTexID* fTexIDObj; 1041cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 1051cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger void init(const Desc& desc, const GrGLIRect& viewport, GrGLTexID* texID); 1061cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 1071cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger typedef GrRenderTarget INHERITED; 1081cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}; 1091cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 1101cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#endif 111