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

Unified Diff: cc/output/gl_renderer.cc

Issue 2162193002: Add logic to GLRenderer to support RenderPassDrawQuad copying. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Construct the resource pool on demand. Created 4 years, 5 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
« no previous file with comments | « cc/output/gl_renderer.h ('k') | cc/output/output_surface.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: cc/output/gl_renderer.cc
diff --git a/cc/output/gl_renderer.cc b/cc/output/gl_renderer.cc
index 3ed0e6e5a1d1030f2ae41306197e9a6d0bc8561c..de3a2a4af99a8503295daa1cf42bb340997f605e 100644
--- a/cc/output/gl_renderer.cc
+++ b/cc/output/gl_renderer.cc
@@ -20,6 +20,7 @@
#include "base/strings/string_split.h"
#include "base/strings/string_util.h"
#include "base/strings/stringprintf.h"
+#include "base/threading/thread_task_runner_handle.h"
#include "base/trace_event/trace_event.h"
#include "build/build_config.h"
#include "cc/base/container_util.h"
@@ -41,6 +42,7 @@
#include "cc/quads/stream_video_draw_quad.h"
#include "cc/quads/texture_draw_quad.h"
#include "cc/raster/scoped_gpu_raster.h"
+#include "cc/resources/resource_pool.h"
#include "cc/resources/scoped_resource.h"
#include "gpu/GLES2/gl2extchromium.h"
#include "gpu/command_buffer/client/context_support.h"
@@ -3639,13 +3641,35 @@ bool GLRenderer::IsContextLost() {
void GLRenderer::ScheduleCALayers(DrawingFrame* frame) {
scoped_refptr<CALayerOverlaySharedState> shared_state;
+ size_t copied_render_pass_count = 0;
for (const CALayerOverlay& ca_layer_overlay : frame->ca_layer_overlay_list) {
+ if (!overlay_resource_pool_) {
+ overlay_resource_pool_ = ResourcePool::CreateForGpuMemoryBufferResources(
+ resource_provider_, base::ThreadTaskRunnerHandle::Get().get());
+ }
+
+ ResourceId contents_resource_id = ca_layer_overlay.contents_resource_id;
+ Resource* resource = nullptr;
+ // Some CALayers require a final round of processing.
+ if (ca_layer_overlay.render_pass_id.IsValid()) {
+ CopyRenderPassToOverlayResource(ca_layer_overlay.render_pass_id,
+ &resource);
+ contents_resource_id = resource->id();
+ ++copied_render_pass_count;
+ }
+
unsigned texture_id = 0;
- if (ca_layer_overlay.contents_resource_id) {
+ if (contents_resource_id) {
pending_overlay_resources_.push_back(
base::WrapUnique(new ResourceProvider::ScopedReadLockGL(
- resource_provider_, ca_layer_overlay.contents_resource_id)));
+ resource_provider_, contents_resource_id)));
texture_id = pending_overlay_resources_.back()->texture_id();
+
+ if (resource) {
+ // Once a resource is released, it is marked as "busy". It will be
+ // available for reuse after the ScopedReadLockGL is destroyed.
+ overlay_resource_pool_->ReleaseResource(resource);
+ }
}
GLfloat contents_rect[4] = {
ca_layer_overlay.contents_rect.x(), ca_layer_overlay.contents_rect.y(),
@@ -3698,6 +3722,13 @@ void GLRenderer::ScheduleCALayers(DrawingFrame* frame) {
texture_id, contents_rect, ca_layer_overlay.background_color,
ca_layer_overlay.edge_aa_mask, bounds_rect, filter);
}
+
+ // Take the number of copied render passes in this frame, and use 3 times that
+ // amount as the cache limit.
+ if (overlay_resource_pool_) {
+ overlay_resource_pool_->SetResourceUsageLimits(
+ std::numeric_limits<std::size_t>::max(), copied_render_pass_count * 3);
+ }
}
void GLRenderer::ScheduleOverlays(DrawingFrame* frame) {
@@ -3723,4 +3754,34 @@ void GLRenderer::ScheduleOverlays(DrawingFrame* frame) {
}
}
+void GLRenderer::CopyRenderPassToOverlayResource(
+ const RenderPassId& render_pass_id,
+ Resource** resource) {
+ ScopedResource* contents_texture =
+ render_pass_textures_[render_pass_id].get();
+ DCHECK(contents_texture);
+ DCHECK(contents_texture->id());
+ // TODO(erikchen): Fix this to allow the creation of IOSurfaces.
+ // https://crbug.com/581526.
+ *resource = overlay_resource_pool_->AcquireResource(
+ contents_texture->size(), ResourceFormat::RGBA_8888);
+ ResourceProvider::ScopedWriteLockGL destination(resource_provider_,
+ (*resource)->id(), false);
+
+ GLuint source_texture = 0;
+ std::unique_ptr<ResourceProvider::ScopedReadLockGL> source;
+ if (current_framebuffer_lock_ &&
+ current_framebuffer_lock_->texture_id() == contents_texture->id()) {
+ source_texture = current_framebuffer_lock_->texture_id();
+ } else {
+ source.reset(new ResourceProvider::ScopedReadLockGL(
+ resource_provider_, contents_texture->id()));
+ source_texture = source->texture_id();
+ }
+ gl_->CopySubTextureCHROMIUM(source_texture, destination.texture_id(), 0, 0, 0,
+ 0, contents_texture->size().width(),
+ contents_texture->size().height(), GL_TRUE,
+ GL_FALSE, GL_FALSE);
+}
+
} // namespace cc
« no previous file with comments | « cc/output/gl_renderer.h ('k') | cc/output/output_surface.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698