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

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: Cleanup. 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
Index: cc/output/gl_renderer.cc
diff --git a/cc/output/gl_renderer.cc b/cc/output/gl_renderer.cc
index 9456c005c2e19dd4f111a81a4984a05e9d31dc65..ef273737c32a0cd09ff04033b77247ce6313dd2e 100644
--- a/cc/output/gl_renderer.cc
+++ b/cc/output/gl_renderer.cc
@@ -41,6 +41,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"
@@ -371,6 +372,11 @@ GLRenderer::GLRenderer(RendererClient* client,
context_caps.blend_equation_advanced_coherent;
InitializeSharedObjects();
+
+ // TODO(erikchen): Fix this to allow the creation of IOSurfaces.
+ // https://crbug.com/581526.
+ overlay_resource_pool_ = ResourcePool::CreateForGpuMemoryBufferResources(
+ resource_provider_, nullptr);
}
GLRenderer::~GLRenderer() {
@@ -2796,7 +2802,7 @@ void GLRenderer::DidReceiveTextureInUseResponses(
DCHECK(settings_->release_overlay_resources_after_gpu_query);
for (const gpu::TextureInUseResponse& response : responses) {
if (!response.in_use) {
- swapped_and_acked_overlay_resources_.erase(response.texture);
+ OverlayResourceNoLongerInUse(response.texture);
}
}
}
@@ -3631,12 +3637,23 @@ bool GLRenderer::IsContextLost() {
}
void GLRenderer::ScheduleCALayers(DrawingFrame* frame) {
+ size_t copied_render_pass_count = 0;
for (const CALayerOverlay& ca_layer_overlay : frame->ca_layer_overlay_list) {
ccameron 2016/07/21 05:31:16 Resource* overlay_resource = nullptr;
+ ResourceId contents_resource_id = ca_layer_overlay.contents_resource_id;
+ // Some CALayers require a final round of processing.
+ if (ca_layer_overlay.render_pass_id.IsValid()) {
+ ResourceId resource_id;
+ CopyRenderPassToOverlayResource(ca_layer_overlay.render_pass_id,
+ &resource_id);
ccameron 2016/07/21 05:31:16 CopyRenderPassToOverlayResource now takes a Resour
+ 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();
}
ccameron 2016/07/21 05:31:16 At this point it's safe to if (overlay_resource)
GLfloat contents_rect[4] = {
@@ -3665,6 +3682,11 @@ void GLRenderer::ScheduleCALayers(DrawingFrame* frame) {
bounds_rect, is_clipped, clip_rect, sorting_context_id, transform,
filter);
}
+
+ // Take the number of copied render passes in this frame, and use 3 times that
+ // amount as the cache limit.
+ overlay_resource_pool_->SetResourceUsageLimits(
+ std::numeric_limits<std::size_t>::max(), copied_render_pass_count * 3);
}
void GLRenderer::ScheduleOverlays(DrawingFrame* frame) {
@@ -3690,4 +3712,41 @@ void GLRenderer::ScheduleOverlays(DrawingFrame* frame) {
}
}
+void GLRenderer::OverlayResourceNoLongerInUse(GLuint texture) {
+ auto it = swapped_and_acked_overlay_resources_.find(texture);
+ if (it != swapped_and_acked_overlay_resources_.end()) {
+ overlay_resource_pool_->ReleaseResourceIfFound(it->second->resource_id());
+ swapped_and_acked_overlay_resources_.erase(it);
ccameron 2016/07/20 22:13:53 (from gl_renderer.h) ... We can just check for r
erikchen 2016/07/20 23:40:39 I don't think that's a great idea. We'd be maintai
ccameron 2016/07/21 05:31:16 This would now no longer need to do the release.
+ }
+}
+
+void GLRenderer::CopyRenderPassToOverlayResource(
+ const RenderPassId& render_pass_id,
+ ResourceId* resource_id) {
+ ScopedResource* contents_texture =
+ render_pass_textures_[render_pass_id].get();
+ DCHECK(contents_texture);
+ DCHECK(contents_texture->id());
+ Resource* resource = overlay_resource_pool_->AcquireResource(
+ contents_texture->size(), ResourceFormat::RGBA_8888);
+ *resource_id = resource->id();
+ 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

Powered by Google App Engine
This is Rietveld 408576698