blob: f8381ecc3feab149045fa132c10c6c5fd4b95d44 [file] [log] [blame]
// Copyright 2010 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_GL_RENDERER_H_
#define CC_GL_RENDERER_H_
#include "cc/cc_export.h"
#include "cc/checkerboard_draw_quad.h"
#include "cc/debug_border_draw_quad.h"
#include "cc/direct_renderer.h"
#include "cc/io_surface_draw_quad.h"
#include "cc/render_pass_draw_quad.h"
#include "cc/renderer.h"
#include "cc/solid_color_draw_quad.h"
#include "cc/tile_draw_quad.h"
#include "cc/yuv_video_draw_quad.h"
#include "ui/gfx/quad_f.h"
namespace WebKit {
class WebGraphicsContext3D;
}
namespace cc {
class ScopedResource;
class StreamVideoDrawQuad;
class TextureDrawQuad;
class GeometryBinding;
class ScopedEnsureFramebufferAllocation;
// Class that handles drawing of composited render layers using GL.
class CC_EXPORT GLRenderer : public DirectRenderer,
public NON_EXPORTED_BASE(WebKit::WebGraphicsContext3D::WebGraphicsSwapBuffersCompleteCallbackCHROMIUM),
public NON_EXPORTED_BASE(WebKit::WebGraphicsContext3D::WebGraphicsMemoryAllocationChangedCallbackCHROMIUM),
public NON_EXPORTED_BASE(WebKit::WebGraphicsContext3D::WebGraphicsContextLostCallback) {
public:
static scoped_ptr<GLRenderer> create(RendererClient*, ResourceProvider*);
virtual ~GLRenderer();
virtual const RendererCapabilities& capabilities() const OVERRIDE;
WebKit::WebGraphicsContext3D* context();
virtual void viewportChanged() OVERRIDE;
// waits for rendering to finish
virtual void finish() OVERRIDE;
virtual void doNoOp() OVERRIDE;
// puts backbuffer onscreen
virtual bool swapBuffers() OVERRIDE;
virtual void getFramebufferPixels(void *pixels, const gfx::Rect&) OVERRIDE;
virtual bool isContextLost() OVERRIDE;
virtual void setVisible(bool) OVERRIDE;
virtual void sendManagedMemoryStats(size_t bytesVisible, size_t bytesVisibleAndNearby, size_t bytesAllocated) OVERRIDE;
protected:
GLRenderer(RendererClient*, ResourceProvider*);
static void debugGLCall(WebKit::WebGraphicsContext3D*, const char* command, const char* file, int line);
bool isFramebufferDiscarded() const { return m_isFramebufferDiscarded; }
bool initialize();
const gfx::QuadF& sharedGeometryQuad() const { return m_sharedGeometryQuad; }
const GeometryBinding* sharedGeometry() const { return m_sharedGeometry.get(); }
bool getFramebufferTexture(ScopedResource*, const gfx::Rect& deviceRect);
void releaseRenderPassTextures();
virtual void bindFramebufferToOutputSurface(DrawingFrame&) OVERRIDE;
virtual bool bindFramebufferToTexture(DrawingFrame&, const ScopedResource*, const gfx::Rect& framebufferRect) OVERRIDE;
virtual void setDrawViewportSize(const gfx::Size&) OVERRIDE;
virtual void setScissorTestRect(const gfx::Rect& scissorRect) OVERRIDE;
virtual void clearFramebuffer(DrawingFrame&) OVERRIDE;
virtual void drawQuad(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:
static void toGLMatrix(float*, const gfx::Transform&);
static int priorityCutoffValue(WebKit::WebGraphicsMemoryAllocation::PriorityCutoff);
void drawCheckerboardQuad(const DrawingFrame&, const CheckerboardDrawQuad*);
void drawDebugBorderQuad(const DrawingFrame&, const DebugBorderDrawQuad*);
scoped_ptr<ScopedResource> drawBackgroundFilters(
DrawingFrame&, const RenderPassDrawQuad*, const WebKit::WebFilterOperations&,
const gfx::Transform& contentsDeviceTransform,
const gfx::Transform& contentsDeviceTransformInverse);
void drawRenderPassQuad(DrawingFrame&, const RenderPassDrawQuad*);
void drawSolidColorQuad(const DrawingFrame&, const SolidColorDrawQuad*);
void drawStreamVideoQuad(const DrawingFrame&, const StreamVideoDrawQuad*);
void drawTextureQuad(const DrawingFrame&, const TextureDrawQuad*);
void drawIOSurfaceQuad(const DrawingFrame&, const IOSurfaceDrawQuad*);
void drawTileQuad(const DrawingFrame&, const TileDrawQuad*);
void drawYUVVideoQuad(const DrawingFrame&, const YUVVideoDrawQuad*);
void setShaderOpacity(float opacity, int alphaLocation);
void setShaderQuadF(const gfx::QuadF&, int quadLocation);
void drawQuadGeometry(const DrawingFrame&, const gfx::Transform& drawTransform, const gfx::RectF& quadRect, int matrixLocation);
void copyTextureToFramebuffer(const DrawingFrame&, int textureId, const gfx::Rect&, const gfx::Transform& drawMatrix);
bool useScopedTexture(DrawingFrame&, const ScopedResource*, const gfx::Rect& viewportRect);
bool makeContextCurrent();
bool initializeSharedObjects();
void cleanupSharedObjects();
// WebKit::WebGraphicsContext3D::WebGraphicsSwapBuffersCompleteCallbackCHROMIUM implementation.
virtual void onSwapBuffersComplete() OVERRIDE;
// WebKit::WebGraphicsContext3D::WebGraphicsMemoryAllocationChangedCallbackCHROMIUM implementation.
virtual void onMemoryAllocationChanged(WebKit::WebGraphicsMemoryAllocation) OVERRIDE;
void discardFramebuffer();
void ensureFramebuffer();
void enforceMemoryPolicy();
// WebGraphicsContext3D::WebGraphicsContextLostCallback implementation.
virtual void onContextLost() OVERRIDE;
RendererCapabilities m_capabilities;
unsigned m_offscreenFramebufferId;
scoped_ptr<GeometryBinding> m_sharedGeometry;
gfx::QuadF m_sharedGeometryQuad;
// This block of bindings defines all of the programs used by the compositor itself.
// Tiled layer shaders.
typedef ProgramBinding<VertexShaderTile, FragmentShaderRGBATexAlpha> TileProgram;
typedef ProgramBinding<VertexShaderTile, FragmentShaderRGBATexClampAlphaAA> TileProgramAA;
typedef ProgramBinding<VertexShaderTile, FragmentShaderRGBATexClampSwizzleAlphaAA> TileProgramSwizzleAA;
typedef ProgramBinding<VertexShaderTile, FragmentShaderRGBATexOpaque> TileProgramOpaque;
typedef ProgramBinding<VertexShaderTile, FragmentShaderRGBATexSwizzleAlpha> TileProgramSwizzle;
typedef ProgramBinding<VertexShaderTile, FragmentShaderRGBATexSwizzleOpaque> TileProgramSwizzleOpaque;
typedef ProgramBinding<VertexShaderPosTex, FragmentShaderCheckerboard> TileCheckerboardProgram;
// Render surface shaders.
typedef ProgramBinding<VertexShaderPosTex, FragmentShaderRGBATexAlpha> RenderPassProgram;
typedef ProgramBinding<VertexShaderPosTex, FragmentShaderRGBATexAlphaMask> RenderPassMaskProgram;
typedef ProgramBinding<VertexShaderQuad, FragmentShaderRGBATexAlphaAA> RenderPassProgramAA;
typedef ProgramBinding<VertexShaderQuad, FragmentShaderRGBATexAlphaMaskAA> RenderPassMaskProgramAA;
// Texture shaders.
typedef ProgramBinding<VertexShaderPosTexTransform, FragmentShaderRGBATexAlpha> TextureProgram;
typedef ProgramBinding<VertexShaderPosTexTransform, FragmentShaderRGBATexFlipAlpha> TextureProgramFlip;
typedef ProgramBinding<VertexShaderPosTexTransform, FragmentShaderRGBATexRectAlpha> TextureIOSurfaceProgram;
// Video shaders.
typedef ProgramBinding<VertexShaderVideoTransform, FragmentShaderOESImageExternal> VideoStreamTextureProgram;
typedef ProgramBinding<VertexShaderPosTexYUVStretch, FragmentShaderYUVVideo> VideoYUVProgram;
// Special purpose / effects shaders.
typedef ProgramBinding<VertexShaderPos, FragmentShaderColor> SolidColorProgram;
const TileProgram* tileProgram();
const TileProgramOpaque* tileProgramOpaque();
const TileProgramAA* tileProgramAA();
const TileProgramSwizzle* tileProgramSwizzle();
const TileProgramSwizzleOpaque* tileProgramSwizzleOpaque();
const TileProgramSwizzleAA* tileProgramSwizzleAA();
const TileCheckerboardProgram* tileCheckerboardProgram();
const RenderPassProgram* renderPassProgram();
const RenderPassProgramAA* renderPassProgramAA();
const RenderPassMaskProgram* renderPassMaskProgram();
const RenderPassMaskProgramAA* renderPassMaskProgramAA();
const TextureProgram* textureProgram();
const TextureProgramFlip* textureProgramFlip();
const TextureIOSurfaceProgram* textureIOSurfaceProgram();
const VideoYUVProgram* videoYUVProgram();
const VideoStreamTextureProgram* videoStreamTextureProgram();
const SolidColorProgram* solidColorProgram();
scoped_ptr<TileProgram> m_tileProgram;
scoped_ptr<TileProgramOpaque> m_tileProgramOpaque;
scoped_ptr<TileProgramAA> m_tileProgramAA;
scoped_ptr<TileProgramSwizzle> m_tileProgramSwizzle;
scoped_ptr<TileProgramSwizzleOpaque> m_tileProgramSwizzleOpaque;
scoped_ptr<TileProgramSwizzleAA> m_tileProgramSwizzleAA;
scoped_ptr<TileCheckerboardProgram> m_tileCheckerboardProgram;
scoped_ptr<RenderPassProgram> m_renderPassProgram;
scoped_ptr<RenderPassProgramAA> m_renderPassProgramAA;
scoped_ptr<RenderPassMaskProgram> m_renderPassMaskProgram;
scoped_ptr<RenderPassMaskProgramAA> m_renderPassMaskProgramAA;
scoped_ptr<TextureProgram> m_textureProgram;
scoped_ptr<TextureProgramFlip> m_textureProgramFlip;
scoped_ptr<TextureIOSurfaceProgram> m_textureIOSurfaceProgram;
scoped_ptr<VideoYUVProgram> m_videoYUVProgram;
scoped_ptr<VideoStreamTextureProgram> m_videoStreamTextureProgram;
scoped_ptr<SolidColorProgram> m_solidColorProgram;
WebKit::WebGraphicsContext3D* m_context;
gfx::Rect m_swapBufferRect;
gfx::Rect m_scissorRect;
bool m_isViewportChanged;
bool m_isFramebufferDiscarded;
bool m_discardFramebufferWhenNotVisible;
bool m_isUsingBindUniform;
bool m_visible;
bool m_isScissorEnabled;
scoped_ptr<ResourceProvider::ScopedWriteLockGL> m_currentFramebufferLock;
DISALLOW_COPY_AND_ASSIGN(GLRenderer);
};
// Setting DEBUG_GL_CALLS to 1 will call glGetError() after almost every GL
// call made by the compositor. Useful for debugging rendering issues but
// will significantly degrade performance.
#define DEBUG_GL_CALLS 0
#if DEBUG_GL_CALLS && !defined(NDEBUG)
#define GLC(context, x) (x, GLRenderer::debugGLCall(&*context, #x, __FILE__, __LINE__))
#else
#define GLC(context, x) (x)
#endif
}
#endif // CC_GL_RENDERER_H_