blob: da87d2ad6982ef9e2678a026ee41eb64b7260f38 [file] [log] [blame]
// Copyright 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CC_SOFTWARE_RENDERER_H_
#define CC_SOFTWARE_RENDERER_H_
#include "base/basictypes.h"
#include "cc/cc_export.h"
#include "cc/compositor_frame.h"
#include "cc/direct_renderer.h"
namespace cc {
class OutputSurface;
class SoftwareOutputDevice;
class DebugBorderDrawQuad;
class RendererClient;
class RenderPassDrawQuad;
class ResourceProvider;
class SolidColorDrawQuad;
class TextureDrawQuad;
class TileDrawQuad;
class CC_EXPORT SoftwareRenderer : public DirectRenderer {
public:
static scoped_ptr<SoftwareRenderer> create(RendererClient*, OutputSurface*, ResourceProvider*);
virtual ~SoftwareRenderer();
virtual const RendererCapabilities& Capabilities() const OVERRIDE;
virtual void ViewportChanged() OVERRIDE;
virtual void Finish() OVERRIDE;
virtual bool SwapBuffers() OVERRIDE;
virtual void GetFramebufferPixels(void* pixels, gfx::Rect rect) OVERRIDE;
virtual void SetVisible(bool) OVERRIDE;
virtual void SendManagedMemoryStats(size_t bytesVisible, size_t bytesVisibleAndNearby, size_t bytesAllocated) OVERRIDE { }
virtual void ReceiveCompositorFrameAck(const CompositorFrameAck&) OVERRIDE;
protected:
virtual void BindFramebufferToOutputSurface(DrawingFrame&) OVERRIDE;
virtual bool BindFramebufferToTexture(DrawingFrame&, const ScopedResource*, gfx::Rect framebufferRect) OVERRIDE;
virtual void SetDrawViewportSize(gfx::Size viewportSize) OVERRIDE;
virtual void SetScissorTestRect(gfx::Rect scissorRect) OVERRIDE;
virtual void ClearFramebuffer(DrawingFrame&) OVERRIDE;
virtual void DoDrawQuad(DrawingFrame&, const DrawQuad*) OVERRIDE;
virtual void BeginDrawingFrame(DrawingFrame&) OVERRIDE;
virtual void FinishDrawingFrame(DrawingFrame&) OVERRIDE;
virtual bool FlippedFramebuffer() const OVERRIDE;
virtual void EnsureScissorTestEnabled() OVERRIDE;
virtual void EnsureScissorTestDisabled() OVERRIDE;
private:
SoftwareRenderer(RendererClient*, OutputSurface*, ResourceProvider*);
void clearCanvas(SkColor color);
void setClipRect(const gfx::Rect& rect);
bool isSoftwareResource(ResourceProvider::ResourceId) const;
void drawDebugBorderQuad(const DrawingFrame&, const DebugBorderDrawQuad*);
void drawSolidColorQuad(const DrawingFrame&, const SolidColorDrawQuad*);
void drawTextureQuad(const DrawingFrame&, const TextureDrawQuad*);
void drawTileQuad(const DrawingFrame&, const TileDrawQuad*);
void drawRenderPassQuad(const DrawingFrame& frame, const RenderPassDrawQuad*);
void drawUnsupportedQuad(const DrawingFrame&, const DrawQuad*);
RendererCapabilities m_capabilities;
bool m_visible;
bool m_isScissorEnabled;
gfx::Rect m_scissorRect;
OutputSurface* m_outputSurface;
SoftwareOutputDevice* m_outputDevice;
SkCanvas* m_skRootCanvas;
SkCanvas* m_skCurrentCanvas;
SkPaint m_skCurrentPaint;
scoped_ptr<ResourceProvider::ScopedWriteLockSoftware> m_currentFramebufferLock;
CompositorFrame m_compositorFrame;
DISALLOW_COPY_AND_ASSIGN(SoftwareRenderer);
};
}
#endif // CC_SOFTWARE_RENDERER_H_