Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(4020)

Unified Diff: cc/gl_renderer.cc

Issue 12642010: Implement on demand quad rasterization for PicturePiles. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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;

Powered by Google App Engine
This is Rietveld 408576698