1 // Copyright 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #ifndef CC_DIRECT_RENDERER_H_
6 #define CC_DIRECT_RENDERER_H_
8 #include "base/basictypes.h"
9 #include "cc/cc_export.h"
10 #include "cc/renderer.h"
11 #include "cc/resource_provider.h"
12 #include "cc/scoped_resource.h"
16 class ResourceProvider
;
18 // This is the base class for code shared between the GL and software
19 // renderer implementations. "Direct" refers to the fact that it does not
20 // delegate rendering to another compositor.
21 class CC_EXPORT DirectRenderer
: public Renderer
{
23 virtual ~DirectRenderer();
25 ResourceProvider
* resourceProvider() const { return m_resourceProvider
; }
27 virtual void decideRenderPassAllocationsForFrame(const RenderPassList
& renderPassesInDrawOrder
) OVERRIDE
;
28 virtual bool haveCachedResourcesForRenderPassId(RenderPass::Id
) const OVERRIDE
;
29 virtual void drawFrame(RenderPassList
& renderPassesInDrawOrder
) OVERRIDE
;
31 struct CC_EXPORT DrawingFrame
{
35 const RenderPass
* rootRenderPass
;
36 const RenderPass
* currentRenderPass
;
37 const ScopedResource
* currentTexture
;
39 gfx::RectF rootDamageRect
;
41 gfx::Transform projectionMatrix
;
42 gfx::Transform windowMatrix
;
46 void setEnlargePassTextureAmountForTesting(gfx::Vector2d amount
);
49 DirectRenderer(RendererClient
* client
, ResourceProvider
* resourceProvider
);
51 class CachedResource
: public ScopedResource
{
53 static scoped_ptr
<CachedResource
> create(ResourceProvider
* resourceProvider
) {
54 return make_scoped_ptr(new CachedResource(resourceProvider
));
56 virtual ~CachedResource() {}
58 bool isComplete() const { return m_isComplete
; }
59 void setIsComplete(bool isComplete
) { m_isComplete
= isComplete
; }
62 explicit CachedResource(ResourceProvider
* resourceProvider
)
63 : ScopedResource(resourceProvider
)
71 DISALLOW_COPY_AND_ASSIGN(CachedResource
);
74 static gfx::RectF
quadVertexRect();
75 static void quadRectTransform(gfx::Transform
* quadRectTransform
, const gfx::Transform
& quadTransform
, const gfx::RectF
& quadRect
);
76 static void initializeMatrices(DrawingFrame
&, const gfx::Rect
& drawRect
, bool flipY
);
77 static gfx::Rect
moveScissorToWindowSpace(const DrawingFrame
&, gfx::RectF scissorRect
);
78 static gfx::RectF
computeScissorRectForRenderPass(const DrawingFrame
& frame
);
79 void setScissorStateForQuad(const DrawingFrame
& frame
, const DrawQuad
& quad
);
80 void setScissorStateForQuadWithRenderPassScissor(const DrawingFrame
& frame
, const DrawQuad
& quad
, const gfx::RectF
& renderPassScissor
, bool* shouldSkipQuad
);
82 bool haveCachedResources(RenderPass::Id
) const;
83 static gfx::Size
renderPassTextureSize(const RenderPass
*);
84 static GLenum
renderPassTextureFormat(const RenderPass
*);
86 void drawRenderPass(DrawingFrame
&, const RenderPass
*);
87 bool useRenderPass(DrawingFrame
&, const RenderPass
*);
89 virtual void bindFramebufferToOutputSurface(DrawingFrame
&) = 0;
90 virtual bool bindFramebufferToTexture(DrawingFrame
&, const ScopedResource
*, const gfx::Rect
& framebufferRect
) = 0;
91 virtual void setDrawViewportSize(const gfx::Size
&) = 0;
92 virtual void setScissorTestRect(const gfx::Rect
& scissorRect
) = 0;
93 virtual void clearFramebuffer(DrawingFrame
&) = 0;
94 virtual void drawQuad(DrawingFrame
&, const DrawQuad
*) = 0;
95 virtual void beginDrawingFrame(DrawingFrame
&) = 0;
96 virtual void finishDrawingFrame(DrawingFrame
&) = 0;
97 virtual void finishDrawingQuadList();
98 virtual bool flippedFramebuffer() const = 0;
99 virtual void ensureScissorTestEnabled() = 0;
100 virtual void ensureScissorTestDisabled() = 0;
102 ScopedPtrHashMap
<RenderPass::Id
, CachedResource
> m_renderPassTextures
;
103 ResourceProvider
* m_resourceProvider
;
107 gfx::Vector2d m_enlargePassTextureAmount
;
109 DISALLOW_COPY_AND_ASSIGN(DirectRenderer
);
114 #endif // CC_DIRECT_RENDERER_H_