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

Unified Diff: cc/output/gl_renderer.cc

Issue 12642010: Implement on demand quad rasterization for PicturePiles. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: rebase 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/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();
}

Powered by Google App Engine
This is Rietveld 408576698