| Index: cc/output/gl_renderer.cc
|
| diff --git a/cc/output/gl_renderer.cc b/cc/output/gl_renderer.cc
|
| index dffc72a478c893068ee474d9f7a8bc8f35c14b4c..4a5fe75a4cfdbb011dbeea85bc188e4c5fa587db 100644
|
| --- a/cc/output/gl_renderer.cc
|
| +++ b/cc/output/gl_renderer.cc
|
| @@ -22,6 +22,7 @@
|
| #include "cc/output/gl_frame_data.h"
|
| #include "cc/output/output_surface.h"
|
| #include "cc/output/render_surface_filters.h"
|
| +#include "cc/quads/picture_draw_quad.h"
|
| #include "cc/quads/render_pass.h"
|
| #include "cc/quads/stream_video_draw_quad.h"
|
| #include "cc/quads/texture_draw_quad.h"
|
| @@ -104,7 +105,8 @@ GLRenderer::GLRenderer(RendererClient* client,
|
| discard_backbuffer_when_not_visible_(false),
|
| is_using_bind_uniform_(false),
|
| visible_(true),
|
| - is_scissor_enabled_(false) {
|
| + is_scissor_enabled_(false),
|
| + on_demand_tile_raster_resource_id_(0) {
|
| DCHECK(context_);
|
| }
|
|
|
| @@ -303,6 +305,9 @@ void GLRenderer::DoDrawQuad(DrawingFrame& frame, const DrawQuad* quad) {
|
| case DrawQuad::IO_SURFACE_CONTENT:
|
| DrawIOSurfaceQuad(frame, IOSurfaceDrawQuad::MaterialCast(quad));
|
| break;
|
| + case DrawQuad::PICTURE_CONTENT:
|
| + DrawPictureQuad(frame, PictureDrawQuad::MaterialCast(quad));
|
| + break;
|
| case DrawQuad::RENDER_PASS:
|
| DrawRenderPassQuad(frame, RenderPassDrawQuad::MaterialCast(quad));
|
| break;
|
| @@ -1037,6 +1042,12 @@ static void TileUniformLocation(T program, TileProgramUniforms* uniforms) {
|
|
|
| void GLRenderer::DrawTileQuad(const DrawingFrame& frame,
|
| const TileDrawQuad* quad) {
|
| + DrawContentQuad(frame, quad, quad->resource_id);
|
| +}
|
| +
|
| +void GLRenderer::DrawContentQuad(const DrawingFrame& frame,
|
| + const ContentDrawQuadBase* quad,
|
| + ResourceProvider::ResourceId resource_id) {
|
| gfx::Rect tile_rect = quad->visible_rect;
|
|
|
| gfx::RectF tex_coord_rect = quad->tex_coord_rect;
|
| @@ -1125,7 +1136,7 @@ void GLRenderer::DrawTileQuad(const DrawingFrame& frame,
|
| ? GL_LINEAR
|
| : GL_NEAREST;
|
| ResourceProvider::ScopedSamplerGL quad_resource_lock(
|
| - resource_provider_, quad->resource_id, GL_TEXTURE_2D, filter);
|
| + resource_provider_, resource_id, GL_TEXTURE_2D, filter);
|
|
|
| if (use_aa) {
|
| GLC(Context(), Context()->uniform3fv(uniforms.edge_location, 8, edge));
|
| @@ -1279,6 +1290,58 @@ void GLRenderer::DrawStreamVideoQuad(const DrawingFrame& frame,
|
| program->vertex_shader().matrixLocation());
|
| }
|
|
|
| +void GLRenderer::DrawPictureQuad(const DrawingFrame& frame,
|
| + const PictureDrawQuad* quad) {
|
| + if (on_demand_tile_raster_bitmap_.width() != quad->texture_size.width() ||
|
| + on_demand_tile_raster_bitmap_.height() != quad->texture_size.height()) {
|
| + on_demand_tile_raster_bitmap_.setConfig(
|
| + SkBitmap::kARGB_8888_Config,
|
| + quad->texture_size.width(),
|
| + quad->texture_size.height());
|
| + on_demand_tile_raster_bitmap_.allocPixels();
|
| + }
|
| +
|
| + SkDevice device(on_demand_tile_raster_bitmap_);
|
| + SkCanvas canvas(&device);
|
| +
|
| + int64 total_pixels_rasterized = 0;
|
| + quad->picture_pile->Raster(
|
| + &canvas,
|
| + quad->content_rect,
|
| + quad->contents_scale,
|
| + &total_pixels_rasterized);
|
| +
|
| + if (!on_demand_tile_raster_resource_id_) {
|
| + on_demand_tile_raster_resource_id_ = resource_provider_->CreateGLTexture(
|
| + quad->texture_size,
|
| + GL_RGBA,
|
| + GL_TEXTURE_POOL_UNMANAGED_CHROMIUM,
|
| + ResourceProvider::TextureUsageAny);
|
| + }
|
| +
|
| + resource_provider_->ResizeResource(on_demand_tile_raster_resource_id_,
|
| + quad->texture_size);
|
| +
|
| + {
|
| + ResourceProvider::ScopedWriteLockGL lock(
|
| + resource_provider_,
|
| + on_demand_tile_raster_resource_id_);
|
| +
|
| + GLC(Context(), Context()->texImage2D(
|
| + GL_TEXTURE_2D,
|
| + 0,
|
| + GL_RGBA,
|
| + quad->texture_size.width(),
|
| + quad->texture_size.height(),
|
| + 0,
|
| + GL_RGBA,
|
| + GL_UNSIGNED_BYTE,
|
| + on_demand_tile_raster_bitmap_.getPixels()));
|
| + }
|
| +
|
| + DrawContentQuad(frame, quad, on_demand_tile_raster_resource_id_);
|
| +}
|
| +
|
| struct TextureProgramBinding {
|
| template <class Program>
|
| void Set(Program* program, WebKit::WebGraphicsContext3D* context) {
|
| @@ -2224,6 +2287,9 @@ void GLRenderer::CleanupSharedObjects() {
|
| if (offscreen_framebuffer_id_)
|
| GLC(context_, context_->deleteFramebuffer(offscreen_framebuffer_id_));
|
|
|
| + if (on_demand_tile_raster_resource_id_)
|
| + resource_provider_->DeleteResource(on_demand_tile_raster_resource_id_);
|
| +
|
| ReleaseRenderPassTextures();
|
| }
|
|
|
|
|