| Index: cc/output/gl_renderer.cc
|
| diff --git a/cc/output/gl_renderer.cc b/cc/output/gl_renderer.cc
|
| index c8422279c3cd288ecb5122178ffeecfbed84e739..13e6d8a5efa8936e78d519cf52f1a2e893341f26 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;
|
| @@ -1038,6 +1043,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;
|
| @@ -1126,7 +1137,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));
|
| @@ -1282,6 +1293,41 @@ void GLRenderer::DrawStreamVideoQuad(const DrawingFrame* frame,
|
| program->vertex_shader().matrix_location());
|
| }
|
|
|
| +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();
|
| +
|
| + if (on_demand_tile_raster_resource_id_)
|
| + resource_provider_->DeleteResource(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);
|
| + }
|
| +
|
| + SkDevice device(on_demand_tile_raster_bitmap_);
|
| + SkCanvas canvas(&device);
|
| +
|
| + quad->picture_pile->Raster(&canvas, quad->content_rect, quad->contents_scale);
|
| +
|
| + resource_provider_->SetPixels(
|
| + on_demand_tile_raster_resource_id_,
|
| + reinterpret_cast<uint8_t*>(on_demand_tile_raster_bitmap_.getPixels()),
|
| + gfx::Rect(quad->texture_size),
|
| + gfx::Rect(quad->texture_size),
|
| + gfx::Vector2d());
|
| +
|
| + DrawContentQuad(frame, quad, on_demand_tile_raster_resource_id_);
|
| +}
|
| +
|
| struct TextureProgramBinding {
|
| template <class Program>
|
| void Set(Program* program, WebKit::WebGraphicsContext3D* context) {
|
| @@ -2228,6 +2274,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();
|
| }
|
|
|
|
|