13f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com/* 23f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com * Copyright 2011 Google Inc. 33f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com * 43f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com * Use of this source code is governed by a BSD-style license that can be 53f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com * found in the LICENSE file. 63f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com */ 73f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com 83f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com 93f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com#ifndef GrGLRenderTarget_DEFINED 103f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com#define GrGLRenderTarget_DEFINED 113f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com 123f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com#include "GrGLIRect.h" 133f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com#include "GrRenderTarget.h" 143a729be1ae6a0bdfb6a8745f1859e8cb7f23baddbsalomon@google.com#include "SkScalar.h" 153f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com 163f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.comclass GrGpuGL; 173f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.comclass GrGLTexture; 183f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.comclass GrGLTexID; 193f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com 203f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.comclass GrGLRenderTarget : public GrRenderTarget { 213f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com 223f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.compublic: 233f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com // set fTexFBOID to this value to indicate that it is multisampled but 243f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com // Gr doesn't know how to resolve it. 253f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com enum { kUnresolvableFBOID = 0 }; 263f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com 273f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com struct Desc { 28e86e1ce3df0f3ded2567eabd487d53ad4e6d6692senorblanco@chromium.org GrGLuint fRTFBOID; 29e86e1ce3df0f3ded2567eabd487d53ad4e6d6692senorblanco@chromium.org GrGLuint fTexFBOID; 30e86e1ce3df0f3ded2567eabd487d53ad4e6d6692senorblanco@chromium.org GrGLuint fMSColorRenderbufferID; 31e86e1ce3df0f3ded2567eabd487d53ad4e6d6692senorblanco@chromium.org bool fIsWrapped; 32e86e1ce3df0f3ded2567eabd487d53ad4e6d6692senorblanco@chromium.org GrPixelConfig fConfig; 33e86e1ce3df0f3ded2567eabd487d53ad4e6d6692senorblanco@chromium.org int fSampleCnt; 34e86e1ce3df0f3ded2567eabd487d53ad4e6d6692senorblanco@chromium.org GrSurfaceOrigin fOrigin; 35cdd5aef1b8933a3c8d96845a33555da863d8aef5senorblanco@chromium.org bool fCheckAllocation; 363f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com }; 373f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com 383f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com // creates a GrGLRenderTarget associated with a texture 393f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com GrGLRenderTarget(GrGpuGL* gpu, 403f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com const Desc& desc, 413f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com const GrGLIRect& viewport, 423f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com GrGLTexID* texID, 433f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com GrGLTexture* texture); 443f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com 453f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com // creates an independent GrGLRenderTarget 463f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com GrGLRenderTarget(GrGpuGL* gpu, 473f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com const Desc& desc, 483f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com const GrGLIRect& viewport); 493f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com 503f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com virtual ~GrGLRenderTarget() { this->release(); } 513f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com 523f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com void setViewport(const GrGLIRect& rect) { fViewport = rect; } 533f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com const GrGLIRect& getViewport() const { return fViewport; } 543f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com 55935e9f4fafdfc64130e6be9ea2bb30e3bafd852armistry@google.com // The following two functions return the same ID when a 568780f037626b5196962a39ab76afd51f094a7765bsalomon@google.com // texture/render target is multisampled, and different IDs when 573f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com // it is. 583f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com // FBO ID used to render into 593f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com GrGLuint renderFBOID() const { return fRTFBOID; } 603f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com // FBO ID that has texture ID attached. 613f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com GrGLuint textureFBOID() const { return fTexFBOID; } 623f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com 63935e9f4fafdfc64130e6be9ea2bb30e3bafd852armistry@google.com // override of GrRenderTarget 64e0abdaaf1026d10f2b0c1f3ae3865dfb2861aa00bsalomon@google.com virtual GrBackendObject getRenderTargetHandle() const { 65935e9f4fafdfc64130e6be9ea2bb30e3bafd852armistry@google.com return this->renderFBOID(); 663f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com } 67e0abdaaf1026d10f2b0c1f3ae3865dfb2861aa00bsalomon@google.com virtual GrBackendObject getRenderTargetResolvedHandle() const { 683f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com return this->textureFBOID(); 693f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com } 703f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com virtual ResolveType getResolveType() const { 71015266273f0c3be52f93983d714cb3cd35756b8bbsalomon@google.com 72015266273f0c3be52f93983d714cb3cd35756b8bbsalomon@google.com if (!this->isMultisampled() || 73015266273f0c3be52f93983d714cb3cd35756b8bbsalomon@google.com fRTFBOID == fTexFBOID) { 743f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com // catches FBO 0 and non MSAA case 753f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com return kAutoResolves_ResolveType; 763f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com } else if (kUnresolvableFBOID == fTexFBOID) { 773f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com return kCantResolve_ResolveType; 783f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com } else { 793f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com return kCanResolve_ResolveType; 803f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com } 813f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com } 823f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com 833f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.comprotected: 843f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com // override of GrResource 8577edb42a16492674ebc3fd2d3985c82941217083robertphillips@google.com virtual void onAbandon() SK_OVERRIDE; 8677edb42a16492674ebc3fd2d3985c82941217083robertphillips@google.com virtual void onRelease() SK_OVERRIDE; 873f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com 883f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.comprivate: 893f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com GrGLuint fRTFBOID; 903f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com GrGLuint fTexFBOID; 913f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com 923f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com GrGLuint fMSColorRenderbufferID; 933f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com 948780f037626b5196962a39ab76afd51f094a7765bsalomon@google.com // when we switch to this render target we want to set the viewport to 953f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com // only render to to content area (as opposed to the whole allocation) and 963f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com // we want the rendering to be at top left (GL has origin in bottom left) 973f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com GrGLIRect fViewport; 983f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com 993f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com // non-NULL if this RT was created by Gr with an associated GrGLTexture. 10060c9e304561e251321bbb01365b2448a33e53d44commit-bot@chromium.org SkAutoTUnref<GrGLTexID> fTexIDObj; 1013f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com 1023f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com void init(const Desc& desc, const GrGLIRect& viewport, GrGLTexID* texID); 1033f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com 1043f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com typedef GrRenderTarget INHERITED; 1053f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com}; 1063f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com 1073f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com#endif 108