Chromium Code Reviews| Index: cc/gl_renderer.cc |
| diff --git a/cc/gl_renderer.cc b/cc/gl_renderer.cc |
| index dcb17589b10cd210adbce327c45a6e6b2d94f365..a45a39422919d0f3a7bf3178af4871d1fde885bd 100644 |
| --- a/cc/gl_renderer.cc |
| +++ b/cc/gl_renderer.cc |
| @@ -22,6 +22,7 @@ |
| #include "cc/layer_quad.h" |
| #include "cc/math_util.h" |
| #include "cc/output_surface.h" |
| +#include "cc/picture_draw_quad.h" |
| #include "cc/priority_calculator.h" |
| #include "cc/proxy.h" |
| #include "cc/render_pass.h" |
| @@ -102,7 +103,9 @@ 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_texture_(0), |
| + on_demand_tile_raster_resource_id_(0) { |
| DCHECK(context_); |
| } |
| @@ -319,6 +322,9 @@ void GLRenderer::DoDrawQuad(DrawingFrame& frame, const DrawQuad* quad) { |
| case DrawQuad::YUV_VIDEO_CONTENT: |
| DrawYUVVideoQuad(frame, YUVVideoDrawQuad::MaterialCast(quad)); |
| break; |
| + case DrawQuad::PICTURE_CONTENT: |
|
danakj
2013/03/14 18:00:56
alphabetical please
Leandro Graciá Gil
2013/03/19 17:30:07
Done.
|
| + DrawPictureQuad(frame, PictureDrawQuad::MaterialCast(quad)); |
| + break; |
| } |
| } |
| @@ -985,8 +991,10 @@ void GLRenderer::DrawTileQuad(const DrawingFrame& frame, |
| !quad->quadTransform().IsIdentityOrIntegerTranslation()) |
| ? GL_LINEAR |
| : GL_NEAREST; |
| + ResourceProvider::ResourceId resource_id = quad->IsPictureQuad() ? |
|
danakj
2013/03/14 18:00:56
How would you ever get here with IsPictureQuad() t
danakj
2013/03/14 18:01:21
Sorry, ignore this, I answered this myself later.
enne (OOO)
2013/03/15 03:29:28
I'd prefer if you just passed drawTileQuad the res
Leandro Graciá Gil
2013/03/19 17:30:07
I agree. I'm going with the base class. Seems a cl
|
| + on_demand_tile_raster_resource_id_ : quad->resource_id; |
| 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) { |
| LayerQuad deviceLayerBounds(gfx::QuadF(device_layer_quad.BoundingBox())); |
| @@ -1205,6 +1213,44 @@ void GLRenderer::DrawStreamVideoQuad(const DrawingFrame& frame, |
| program->vertexShader().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); |
| + |
| + GLC(Context(), Context()->bindTexture( |
| + GL_TEXTURE_2D, |
| + on_demand_tile_raster_texture_)); |
| + |
| + 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())); |
| + |
| + DrawTileQuad(frame, quad); |
| +} |
| + |
| struct TextureProgramBinding { |
| template <class Program> |
| void Set(Program* program, WebKit::WebGraphicsContext3D* context) { |
| @@ -1888,6 +1934,11 @@ bool GLRenderer::InitializeSharedObjects() { |
| tile_program_ = make_scoped_ptr(new TileProgram(context_)); |
| tile_program_opaque_ = make_scoped_ptr(new TileProgramOpaque(context_)); |
| + on_demand_tile_raster_texture_ = Context()->createTexture(); |
|
vmpstr
2013/03/13 21:03:08
Should this be cleaned up in CleanupSharedObjects?
Leandro Graciá Gil
2013/03/19 17:30:07
Yes. This was accidentally missed while rebasing o
|
| + on_demand_tile_raster_resource_id_ = |
| + resource_provider_->CreateResourceFromExternalTexture( |
| + on_demand_tile_raster_texture_); |
| + |
| GLC(context_, context_->flush()); |
| return true; |