blob: 09de571b9d3bc31b55f82efb489e5200570a8932 [file] [log] [blame]
bsalomon@google.comaa5b6732011-07-29 15:13:20 +00001/*
2 * Copyright 2011 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
8
9#ifndef GrGLRenderTarget_DEFINED
10#define GrGLRenderTarget_DEFINED
11
12#include "GrGLIRect.h"
13#include "GrRenderTarget.h"
bsalomon@google.com81712882012-11-01 17:12:34 +000014#include "SkScalar.h"
bsalomon@google.comaa5b6732011-07-29 15:13:20 +000015
bsalomon861e1032014-12-16 07:33:49 -080016class GrGLGpu;
bsalomon@google.comaa5b6732011-07-29 15:13:20 +000017
18class GrGLRenderTarget : public GrRenderTarget {
bsalomon@google.comaa5b6732011-07-29 15:13:20 +000019public:
20 // set fTexFBOID to this value to indicate that it is multisampled but
21 // Gr doesn't know how to resolve it.
22 enum { kUnresolvableFBOID = 0 };
23
bsalomonb15b4c12014-10-29 12:41:57 -070024 struct IDDesc {
senorblanco@chromium.org3cb406b2013-02-05 19:50:46 +000025 GrGLuint fRTFBOID;
26 GrGLuint fTexFBOID;
27 GrGLuint fMSColorRenderbufferID;
28 bool fIsWrapped;
bsalomon@google.comaa5b6732011-07-29 15:13:20 +000029 };
30
bsalomon861e1032014-12-16 07:33:49 -080031 GrGLRenderTarget(GrGLGpu*, const GrSurfaceDesc&, const IDDesc&);
bsalomon@google.comaa5b6732011-07-29 15:13:20 +000032
bsalomon@google.comaa5b6732011-07-29 15:13:20 +000033 void setViewport(const GrGLIRect& rect) { fViewport = rect; }
34 const GrGLIRect& getViewport() const { return fViewport; }
35
rmistry@google.comfbfcd562012-08-23 18:09:54 +000036 // The following two functions return the same ID when a
bsalomon@google.com2d0bade2012-10-26 19:01:17 +000037 // texture/render target is multisampled, and different IDs when
bsalomon@google.comaa5b6732011-07-29 15:13:20 +000038 // it is.
39 // FBO ID used to render into
40 GrGLuint renderFBOID() const { return fRTFBOID; }
41 // FBO ID that has texture ID attached.
42 GrGLuint textureFBOID() const { return fTexFBOID; }
43
rmistry@google.comfbfcd562012-08-23 18:09:54 +000044 // override of GrRenderTarget
mtklein72c9faa2015-01-09 10:06:39 -080045 GrBackendObject getRenderTargetHandle() const SK_OVERRIDE { return this->renderFBOID(); }
46 GrBackendObject getRenderTargetResolvedHandle() const SK_OVERRIDE { return this->textureFBOID(); }
47 ResolveType getResolveType() const SK_OVERRIDE {
bsalomon@google.come269f212011-11-07 13:29:52 +000048 if (!this->isMultisampled() ||
49 fRTFBOID == fTexFBOID) {
bsalomon@google.comaa5b6732011-07-29 15:13:20 +000050 // catches FBO 0 and non MSAA case
51 return kAutoResolves_ResolveType;
52 } else if (kUnresolvableFBOID == fTexFBOID) {
53 return kCantResolve_ResolveType;
54 } else {
55 return kCanResolve_ResolveType;
56 }
57 }
58
59protected:
bsalomon37dd3312014-11-03 08:47:23 -080060 // The public constructor registers this object with the cache. However, only the most derived
61 // class should register with the cache. This constructor does not do the registration and
62 // rather moves that burden onto the derived class.
63 enum Derived { kDerived };
bsalomon861e1032014-12-16 07:33:49 -080064 GrGLRenderTarget(GrGLGpu*, const GrSurfaceDesc&, const IDDesc&, Derived);
bsalomon37dd3312014-11-03 08:47:23 -080065
66 void init(const GrSurfaceDesc&, const IDDesc&);
67
mtklein72c9faa2015-01-09 10:06:39 -080068 void onAbandon() SK_OVERRIDE;
69 void onRelease() SK_OVERRIDE;
bsalomon@google.comaa5b6732011-07-29 15:13:20 +000070
bsalomon69ed47f2014-11-12 11:13:39 -080071 // In protected because subclass GrGLTextureRenderTarget calls this version.
mtklein72c9faa2015-01-09 10:06:39 -080072 size_t onGpuMemorySize() const SK_OVERRIDE;
bsalomon69ed47f2014-11-12 11:13:39 -080073
bsalomon@google.comaa5b6732011-07-29 15:13:20 +000074private:
75 GrGLuint fRTFBOID;
76 GrGLuint fTexFBOID;
bsalomon@google.comaa5b6732011-07-29 15:13:20 +000077 GrGLuint fMSColorRenderbufferID;
78
hendrikw9a0c7ab2014-12-09 14:26:47 -080079 // We track this separately from GrGpuResource because this may be both a texture and a render
80 // target, and the texture may be wrapped while the render target is not.
81 bool fIsWrapped;
82
bsalomon@google.com2d0bade2012-10-26 19:01:17 +000083 // when we switch to this render target we want to set the viewport to
bsalomon37dd3312014-11-03 08:47:23 -080084 // only render to content area (as opposed to the whole allocation) and
bsalomon@google.comaa5b6732011-07-29 15:13:20 +000085 // we want the rendering to be at top left (GL has origin in bottom left)
86 GrGLIRect fViewport;
87
bsalomon69ed47f2014-11-12 11:13:39 -080088 // onGpuMemorySize() needs to know what how many color values are owned per pixel. However,
bsalomon37dd3312014-11-03 08:47:23 -080089 // abandon and release zero out the IDs and the cache needs to know the size even after those
90 // actions.
91 uint8_t fColorValuesPerPixel;
bsalomon@google.com5bfc2172011-07-29 20:29:05 +000092
bsalomon@google.comaa5b6732011-07-29 15:13:20 +000093 typedef GrRenderTarget INHERITED;
94};
95
96#endif