Chromium Code Reviews| Index: cc/output/gl_renderer.cc |
| diff --git a/cc/output/gl_renderer.cc b/cc/output/gl_renderer.cc |
| index 4d630a1b71f27b8349de886d1b7897bcc80a2b4d..323da21860f35a2acb01f34f140a79ef2df7ce35 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,55 @@ 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_ = 0; |
| + } |
| + } |
| + |
| + SkDevice device(on_demand_tile_raster_bitmap_); |
| + SkCanvas canvas(&device); |
| + |
| + quad->picture_pile->Raster(&canvas, quad->content_rect, quad->contents_scale); |
| + |
| + 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); |
|
piman
2013/03/26 17:19:30
nit: you could move this in the if block above, af
Leandro Graciá Gil
2013/03/26 18:05:02
Done.
|
| + } |
| + |
| + { |
| + 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())); |
|
piman
2013/03/26 17:19:30
You should be able to just use ResourceProvider::S
Leandro Graciá Gil
2013/03/26 18:05:02
We want this to happen synchronously for this spec
piman
2013/03/26 18:22:39
SetPixels is synchronous.
|
| + } |
| + |
| + DrawContentQuad(frame, quad, on_demand_tile_raster_resource_id_); |
| +} |
| + |
| struct TextureProgramBinding { |
| template <class Program> |
| void Set(Program* program, WebKit::WebGraphicsContext3D* context) { |
| @@ -2228,6 +2288,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(); |
| } |