12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright 2010 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#ifndef CC_OUTPUT_GL_RENDERER_H_
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define CC_OUTPUT_GL_RENDERER_H_
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/cancelable_callback.h"
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/base/cc_export.h"
10c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "cc/base/scoped_ptr_vector.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/output/direct_renderer.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/output/gl_renderer_draw_cache.h"
137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "cc/output/program_binding.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/output/renderer.h"
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/quads/checkerboard_draw_quad.h"
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/quads/debug_border_draw_quad.h"
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/quads/io_surface_draw_quad.h"
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/quads/render_pass_draw_quad.h"
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/quads/solid_color_draw_quad.h"
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/quads/tile_draw_quad.h"
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/quads/yuv_video_draw_quad.h"
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/quad_f.h"
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class SkBitmap;
25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
26f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)namespace blink { class WebGraphicsContext3D; }
27eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
28a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)namespace gpu {
29a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)namespace gles2 {
30a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)class GLES2Interface;
31a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
32a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
33a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace cc {
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class GLRendererShaderTest;
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class OutputSurface;
38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class PictureDrawQuad;
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ScopedResource;
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class StreamVideoDrawQuad;
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class TextureDrawQuad;
4258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)class TextureMailboxDeleter;
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class GeometryBinding;
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ScopedEnsureFramebufferAllocation;
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Class that handles drawing of composited render layers using GL.
47eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochclass CC_EXPORT GLRenderer : public DirectRenderer {
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
4958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  static scoped_ptr<GLRenderer> Create(
5058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      RendererClient* client,
5158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      const LayerTreeSettings* settings,
5258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      OutputSurface* output_surface,
5358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      ResourceProvider* resource_provider,
5458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      TextureMailboxDeleter* texture_mailbox_deleter,
55a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      int highp_threshold_min);
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~GLRenderer();
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5987f58e12eeb69005db1f255eab8e88bab8977eecboliu@chromium.org  virtual const RendererCapabilitiesImpl& Capabilities() const OVERRIDE;
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
61f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  blink::WebGraphicsContext3D* Context();
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Waits for rendering to finish.
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void Finish() OVERRIDE;
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void DoNoOp() OVERRIDE;
67f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  virtual void SwapBuffers(const CompositorFrameMetadata& metadata) OVERRIDE;
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void GetFramebufferPixels(void* pixels, gfx::Rect rect) OVERRIDE;
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual bool IsContextLost() OVERRIDE;
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void SetVisible(bool visible) OVERRIDE;
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void SendManagedMemoryStats(size_t bytes_visible,
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                      size_t bytes_visible_and_nearby,
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                      size_t bytes_allocated) OVERRIDE;
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
79a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  static void DebugGLCall(gpu::gles2::GLES2Interface* gl,
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          const char* command,
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          const char* file,
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          int line);
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected:
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GLRenderer(RendererClient* client,
8658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)             const LayerTreeSettings* settings,
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)             OutputSurface* output_surface,
88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)             ResourceProvider* resource_provider,
8958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)             TextureMailboxDeleter* texture_mailbox_deleter,
90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)             int highp_threshold_min);
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool IsBackbufferDiscarded() const { return is_backbuffer_discarded_; }
9390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  void InitializeGrContext();
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const gfx::QuadF& SharedGeometryQuad() const { return shared_geometry_quad_; }
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const GeometryBinding* SharedGeometry() const {
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return shared_geometry_.get();
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void GetFramebufferPixelsAsync(gfx::Rect rect,
10190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                                 scoped_ptr<CopyOutputRequest> request);
1027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  void GetFramebufferTexture(unsigned texture_id,
103d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                             ResourceFormat texture_format,
1047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                             gfx::Rect device_rect);
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void ReleaseRenderPassTextures();
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
107fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch  void SetStencilEnabled(bool enabled);
108fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch  bool stencil_enabled() const { return stencil_shadow_; }
109fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch  void SetBlendEnabled(bool enabled);
110fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch  bool blend_enabled() const { return blend_shadow_; }
111fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch
112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void BindFramebufferToOutputSurface(DrawingFrame* frame) OVERRIDE;
113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual bool BindFramebufferToTexture(DrawingFrame* frame,
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                        const ScopedResource* resource,
115868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                        gfx::Rect target_rect) OVERRIDE;
116868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  virtual void SetDrawViewport(gfx::Rect window_space_viewport) OVERRIDE;
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void SetScissorTestRect(gfx::Rect scissor_rect) OVERRIDE;
11868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  virtual void DiscardPixels(bool has_external_stencil_test,
11968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                             bool draw_rect_covers_full_surface) OVERRIDE;
12068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  virtual void ClearFramebuffer(DrawingFrame* frame,
12168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                                bool has_external_stencil_test) OVERRIDE;
122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void DoDrawQuad(DrawingFrame* frame, const class DrawQuad*) OVERRIDE;
123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void BeginDrawingFrame(DrawingFrame* frame) OVERRIDE;
124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void FinishDrawingFrame(DrawingFrame* frame) OVERRIDE;
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual bool FlippedFramebuffer() const OVERRIDE;
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void EnsureScissorTestEnabled() OVERRIDE;
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void EnsureScissorTestDisabled() OVERRIDE;
128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void CopyCurrentRenderPassToBitmap(
129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      DrawingFrame* frame,
13090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      scoped_ptr<CopyOutputRequest> request) OVERRIDE;
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void FinishDrawingQuadList() OVERRIDE;
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Check if quad needs antialiasing and if so, inflate the quad and
13458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // fill edge array for fragment shader.  local_quad is set to
13558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // inflated quad if antialiasing is required, otherwise it is left
13658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // unchanged.  edge array is filled with inflated quad's edge data
13758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // if antialiasing is required, otherwise it is left unchanged.
13858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Returns true if quad requires antialiasing and false otherwise.
13958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  static bool SetupQuadForAntialiasing(const gfx::Transform& device_transform,
14058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                       const DrawQuad* quad,
14158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                       gfx::QuadF* local_quad,
14258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                       float edge[24]);
14358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
145c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  friend class GLRendererShaderPixelTest;
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  friend class GLRendererShaderTest;
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static void ToGLMatrix(float* gl_matrix, const gfx::Transform& transform);
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
150c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void DrawCheckerboardQuad(const DrawingFrame* frame,
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                            const CheckerboardDrawQuad* quad);
152c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void DrawDebugBorderQuad(const DrawingFrame* frame,
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                           const DebugBorderDrawQuad* quad);
154f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  scoped_ptr<ScopedResource> GetBackgroundWithFilters(
155c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      DrawingFrame* frame,
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const RenderPassDrawQuad* quad,
1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const gfx::Transform& contents_device_transform,
158f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      const gfx::Transform& contents_device_transformInverse,
159f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      bool* background_changed);
160c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void DrawRenderPassQuad(DrawingFrame* frame, const RenderPassDrawQuad* quad);
161c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void DrawSolidColorQuad(const DrawingFrame* frame,
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          const SolidColorDrawQuad* quad);
163c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void DrawStreamVideoQuad(const DrawingFrame* frame,
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                           const StreamVideoDrawQuad* quad);
165c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void EnqueueTextureQuad(const DrawingFrame* frame,
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          const TextureDrawQuad* quad);
1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void FlushTextureQuadCache();
168c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void DrawIOSurfaceQuad(const DrawingFrame* frame,
1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                         const IOSurfaceDrawQuad* quad);
170c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void DrawTileQuad(const DrawingFrame* frame, const TileDrawQuad* quad);
171c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void DrawContentQuad(const DrawingFrame* frame,
172c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                       const ContentDrawQuadBase* quad,
173c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                       ResourceProvider::ResourceId resource_id);
174c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void DrawYUVVideoQuad(const DrawingFrame* frame,
1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        const YUVVideoDrawQuad* quad);
176c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void DrawPictureQuad(const DrawingFrame* frame,
177c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                       const PictureDrawQuad* quad);
1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void SetShaderOpacity(float opacity, int alpha_location);
1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void SetShaderQuadF(const gfx::QuadF& quad, int quad_location);
181c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void DrawQuadGeometry(const DrawingFrame* frame,
1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        const gfx::Transform& draw_transform,
1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        const gfx::RectF& quad_rect,
1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        int matrix_location);
1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void SetUseProgram(unsigned program);
1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
187c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void CopyTextureToFramebuffer(const DrawingFrame* frame,
1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                int texture_id,
1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                gfx::Rect rect,
1907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                const gfx::Transform& draw_matrix,
1917d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                bool flip_vertically);
1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
193c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool UseScopedTexture(DrawingFrame* frame,
1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        const ScopedResource* resource,
1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        gfx::Rect viewport_rect);
1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool MakeContextCurrent();
1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
199a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  void InitializeSharedObjects();
2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void CleanupSharedObjects();
2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
20290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  typedef base::Callback<void(scoped_ptr<CopyOutputRequest> copy_request,
20390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                              bool success)>
204c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      AsyncGetFramebufferPixelsCleanupCallback;
205c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void DoGetFramebufferPixels(
206c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      uint8* pixels,
2077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      gfx::Rect window_rect,
208c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      const AsyncGetFramebufferPixelsCleanupCallback& cleanup_callback);
209c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void FinishedReadback(
210c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      const AsyncGetFramebufferPixelsCleanupCallback& cleanup_callback,
211c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      unsigned source_buffer,
212a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch      unsigned query,
213c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      uint8_t* dest_pixels,
2147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      gfx::Size size);
2157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  void PassOnSkBitmap(scoped_ptr<SkBitmap> bitmap,
2167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                      scoped_ptr<SkAutoLockPixels> lock,
2177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                      scoped_ptr<CopyOutputRequest> request,
2187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                      bool success);
219eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
22090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  void ReinitializeGLState();
22190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
222eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual void DiscardBackbuffer() OVERRIDE;
223eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual void EnsureBackbuffer() OVERRIDE;
2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void EnforceMemoryPolicy();
2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
22687f58e12eeb69005db1f255eab8e88bab8977eecboliu@chromium.org  RendererCapabilitiesImpl capabilities_;
2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  unsigned offscreen_framebuffer_id_;
2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<GeometryBinding> shared_geometry_;
2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::QuadF shared_geometry_quad_;
2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // This block of bindings defines all of the programs used by the compositor
2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // itself.  Add any new programs here to GLRendererShaderTest.
2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Tiled layer shaders.
2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  typedef ProgramBinding<VertexShaderTile, FragmentShaderRGBATexAlpha>
2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      TileProgram;
239eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  typedef ProgramBinding<VertexShaderTileAA, FragmentShaderRGBATexClampAlphaAA>
2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      TileProgramAA;
241eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  typedef ProgramBinding<VertexShaderTileAA,
2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                         FragmentShaderRGBATexClampSwizzleAlphaAA>
2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      TileProgramSwizzleAA;
2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  typedef ProgramBinding<VertexShaderTile, FragmentShaderRGBATexOpaque>
2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      TileProgramOpaque;
2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  typedef ProgramBinding<VertexShaderTile, FragmentShaderRGBATexSwizzleAlpha>
2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      TileProgramSwizzle;
2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  typedef ProgramBinding<VertexShaderTile, FragmentShaderRGBATexSwizzleOpaque>
2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      TileProgramSwizzleOpaque;
2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  typedef ProgramBinding<VertexShaderPosTex, FragmentShaderCheckerboard>
2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      TileCheckerboardProgram;
2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
253c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Texture shaders.
254c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  typedef ProgramBinding<VertexShaderPosTexTransform,
255c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         FragmentShaderRGBATexVaryingAlpha> TextureProgram;
256eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  typedef ProgramBinding<VertexShaderPosTexTransform,
257eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                         FragmentShaderRGBATexPremultiplyAlpha>
258eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      NonPremultipliedTextureProgram;
259c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  typedef ProgramBinding<VertexShaderPosTexTransform,
2607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                         FragmentShaderTexBackgroundVaryingAlpha>
2617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      TextureBackgroundProgram;
2627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  typedef ProgramBinding<VertexShaderPosTexTransform,
263a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch                         FragmentShaderTexBackgroundPremultiplyAlpha>
2647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      NonPremultipliedTextureBackgroundProgram;
265c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Render surface shaders.
2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  typedef ProgramBinding<VertexShaderPosTexTransform,
2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                         FragmentShaderRGBATexAlpha> RenderPassProgram;
2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  typedef ProgramBinding<VertexShaderPosTexTransform,
2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                         FragmentShaderRGBATexAlphaMask> RenderPassMaskProgram;
271eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  typedef ProgramBinding<VertexShaderQuadTexTransformAA,
2727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                         FragmentShaderRGBATexAlphaAA> RenderPassProgramAA;
273eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  typedef ProgramBinding<VertexShaderQuadTexTransformAA,
2747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                         FragmentShaderRGBATexAlphaMaskAA>
2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      RenderPassMaskProgramAA;
2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  typedef ProgramBinding<VertexShaderPosTexTransform,
277c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         FragmentShaderRGBATexColorMatrixAlpha>
278c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      RenderPassColorMatrixProgram;
279eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  typedef ProgramBinding<VertexShaderQuadTexTransformAA,
280c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         FragmentShaderRGBATexAlphaMaskColorMatrixAA>
281c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      RenderPassMaskColorMatrixProgramAA;
282eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  typedef ProgramBinding<VertexShaderQuadTexTransformAA,
283c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         FragmentShaderRGBATexAlphaColorMatrixAA>
284c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      RenderPassColorMatrixProgramAA;
2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  typedef ProgramBinding<VertexShaderPosTexTransform,
286c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         FragmentShaderRGBATexAlphaMaskColorMatrix>
287c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      RenderPassMaskColorMatrixProgram;
2882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Video shaders.
290f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  typedef ProgramBinding<VertexShaderVideoTransform, FragmentShaderRGBATex>
2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      VideoStreamTextureProgram;
2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  typedef ProgramBinding<VertexShaderPosTexYUVStretch, FragmentShaderYUVVideo>
2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      VideoYUVProgram;
294868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  typedef ProgramBinding<VertexShaderPosTexYUVStretch, FragmentShaderYUVAVideo>
295868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      VideoYUVAProgram;
2962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Special purpose / effects shaders.
2982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  typedef ProgramBinding<VertexShaderPos, FragmentShaderColor>
2992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      DebugBorderProgram;
3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  typedef ProgramBinding<VertexShaderQuad, FragmentShaderColor>
3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      SolidColorProgram;
302eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  typedef ProgramBinding<VertexShaderQuadAA, FragmentShaderColorAA>
3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      SolidColorProgramAA;
3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
305f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  const TileProgram* GetTileProgram(
306f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      TexCoordPrecision precision, SamplerType sampler);
307f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  const TileProgramOpaque* GetTileProgramOpaque(
308f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      TexCoordPrecision precision, SamplerType sampler);
309f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  const TileProgramAA* GetTileProgramAA(
310f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      TexCoordPrecision precision, SamplerType sampler);
311f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  const TileProgramSwizzle* GetTileProgramSwizzle(
312f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      TexCoordPrecision precision, SamplerType sampler);
313c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const TileProgramSwizzleOpaque* GetTileProgramSwizzleOpaque(
314f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      TexCoordPrecision precision, SamplerType sampler);
315c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const TileProgramSwizzleAA* GetTileProgramSwizzleAA(
316f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      TexCoordPrecision precision, SamplerType sampler);
317f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const TileCheckerboardProgram* GetTileCheckerboardProgram();
3192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
320c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const RenderPassProgram* GetRenderPassProgram(
321c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      TexCoordPrecision precision);
322c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const RenderPassProgramAA* GetRenderPassProgramAA(
323c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      TexCoordPrecision precision);
324c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const RenderPassMaskProgram* GetRenderPassMaskProgram(
325c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      TexCoordPrecision precision);
326c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const RenderPassMaskProgramAA* GetRenderPassMaskProgramAA(
327c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      TexCoordPrecision precision);
328c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const RenderPassColorMatrixProgram* GetRenderPassColorMatrixProgram(
329c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      TexCoordPrecision precision);
330c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const RenderPassColorMatrixProgramAA* GetRenderPassColorMatrixProgramAA(
331c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      TexCoordPrecision precision);
332c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const RenderPassMaskColorMatrixProgram* GetRenderPassMaskColorMatrixProgram(
333c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      TexCoordPrecision precision);
334c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const RenderPassMaskColorMatrixProgramAA*
335c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      GetRenderPassMaskColorMatrixProgramAA(TexCoordPrecision precision);
336c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
337c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const TextureProgram* GetTextureProgram(
338c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      TexCoordPrecision precision);
339eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  const NonPremultipliedTextureProgram* GetNonPremultipliedTextureProgram(
340c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      TexCoordPrecision precision);
3417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  const TextureBackgroundProgram* GetTextureBackgroundProgram(
3427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      TexCoordPrecision precision);
3437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  const NonPremultipliedTextureBackgroundProgram*
3447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      GetNonPremultipliedTextureBackgroundProgram(TexCoordPrecision precision);
345f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  const TextureProgram* GetTextureIOSurfaceProgram(
346c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      TexCoordPrecision precision);
347c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
348c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const VideoYUVProgram* GetVideoYUVProgram(
349c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      TexCoordPrecision precision);
350868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  const VideoYUVAProgram* GetVideoYUVAProgram(
351868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      TexCoordPrecision precision);
352c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const VideoStreamTextureProgram* GetVideoStreamTextureProgram(
353c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      TexCoordPrecision precision);
3542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const DebugBorderProgram* GetDebugBorderProgram();
3562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const SolidColorProgram* GetSolidColorProgram();
3572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const SolidColorProgramAA* GetSolidColorProgramAA();
3582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
359f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  TileProgram tile_program_[NumTexCoordPrecisions][NumSamplerTypes];
360f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  TileProgramOpaque
361f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      tile_program_opaque_[NumTexCoordPrecisions][NumSamplerTypes];
362f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  TileProgramAA tile_program_aa_[NumTexCoordPrecisions][NumSamplerTypes];
363f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  TileProgramSwizzle
364f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      tile_program_swizzle_[NumTexCoordPrecisions][NumSamplerTypes];
365f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  TileProgramSwizzleOpaque
366f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      tile_program_swizzle_opaque_[NumTexCoordPrecisions][NumSamplerTypes];
367f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  TileProgramSwizzleAA
368f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      tile_program_swizzle_aa_[NumTexCoordPrecisions][NumSamplerTypes];
369f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
370f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  TileCheckerboardProgram tile_checkerboard_program_;
371f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
372f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  TextureProgram texture_program_[NumTexCoordPrecisions];
373f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  NonPremultipliedTextureProgram
374f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      nonpremultiplied_texture_program_[NumTexCoordPrecisions];
375f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  TextureBackgroundProgram texture_background_program_[NumTexCoordPrecisions];
376f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  NonPremultipliedTextureBackgroundProgram
377f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      nonpremultiplied_texture_background_program_[NumTexCoordPrecisions];
378f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  TextureProgram texture_io_surface_program_[NumTexCoordPrecisions];
379f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
380f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  RenderPassProgram render_pass_program_[NumTexCoordPrecisions];
381f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  RenderPassProgramAA render_pass_program_aa_[NumTexCoordPrecisions];
382f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  RenderPassMaskProgram render_pass_mask_program_[NumTexCoordPrecisions];
383f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  RenderPassMaskProgramAA render_pass_mask_program_aa_[NumTexCoordPrecisions];
384f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  RenderPassColorMatrixProgram
385f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      render_pass_color_matrix_program_[NumTexCoordPrecisions];
386f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  RenderPassColorMatrixProgramAA
387f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      render_pass_color_matrix_program_aa_[NumTexCoordPrecisions];
388f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  RenderPassMaskColorMatrixProgram
389f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      render_pass_mask_color_matrix_program_[NumTexCoordPrecisions];
390f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  RenderPassMaskColorMatrixProgramAA
391f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      render_pass_mask_color_matrix_program_aa_[NumTexCoordPrecisions];
392f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
393f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  VideoYUVProgram video_yuv_program_[NumTexCoordPrecisions];
394f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  VideoYUVAProgram video_yuva_program_[NumTexCoordPrecisions];
395f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  VideoStreamTextureProgram
396f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      video_stream_texture_program_[NumTexCoordPrecisions];
397f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
398f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  DebugBorderProgram debug_border_program_;
399f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  SolidColorProgram solid_color_program_;
400f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  SolidColorProgramAA solid_color_program_aa_;
401f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
402f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  blink::WebGraphicsContext3D* context_;
403a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  gpu::gles2::GLES2Interface* gl_;
4048bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  gpu::ContextSupport* context_support_;
4052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
40690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  skia::RefPtr<GrContext> gr_context_;
40790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  skia::RefPtr<SkCanvas> sk_canvas_;
40890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
40958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  TextureMailboxDeleter* texture_mailbox_deleter_;
41058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
4112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Rect swap_buffer_rect_;
4122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Rect scissor_rect_;
413eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  gfx::Rect viewport_;
4142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool is_backbuffer_discarded_;
4152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool is_using_bind_uniform_;
4162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool visible_;
4172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool is_scissor_enabled_;
418f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  bool scissor_rect_needs_reset_;
419fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch  bool stencil_shadow_;
4202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool blend_shadow_;
4212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  unsigned program_shadow_;
4222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TexturedQuadDrawCache draw_cache_;
423c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  int highp_threshold_min_;
424b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  int highp_threshold_cache_;
425c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
426c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  struct PendingAsyncReadPixels;
427c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ScopedPtrVector<PendingAsyncReadPixels> pending_async_read_pixels_;
4282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<ResourceProvider::ScopedWriteLockGL> current_framebuffer_lock_;
4302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<ResourceProvider::Fence> last_swap_fence_;
4322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
433c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SkBitmap on_demand_tile_raster_bitmap_;
434c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ResourceProvider::ResourceId on_demand_tile_raster_resource_id_;
435c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
4362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(GLRenderer);
4372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
4382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Setting DEBUG_GL_CALLS to 1 will call glGetError() after almost every GL
4402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// call made by the compositor. Useful for debugging rendering issues but
4412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// will significantly degrade performance.
4422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define DEBUG_GL_CALLS 0
4432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if DEBUG_GL_CALLS && !defined(NDEBUG)
4452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define GLC(context, x)                                                        \
446c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  (x, GLRenderer::DebugGLCall(&* context, #x, __FILE__, __LINE__))
4472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else
4482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define GLC(context, x) (x)
4492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
4502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
451c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}  // namespace cc
4522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif  // CC_OUTPUT_GL_RENDERER_H_
454