Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2012 The Chromium Authors. All rights reserved. | 1 // Copyright 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "cc/resources/resource_update_controller.h" | 5 #include "cc/resources/resource_update_controller.h" |
| 6 | 6 |
| 7 #include <limits> | 7 #include <limits> |
| 8 | 8 |
| 9 #include "base/debug/trace_event.h" | 9 #include "base/debug/trace_event.h" |
| 10 #include "cc/base/thread.h" | 10 #include "cc/base/thread.h" |
| (...skipping 15 matching lines...) Expand all Loading... | |
| 26 | 26 |
| 27 // Measured in seconds. | 27 // Measured in seconds. |
| 28 const double kTextureUpdateTickRate = 0.004; | 28 const double kTextureUpdateTickRate = 0.004; |
| 29 | 29 |
| 30 // Measured in seconds. | 30 // Measured in seconds. |
| 31 const double kUploaderBusyTickRate = 0.001; | 31 const double kUploaderBusyTickRate = 0.001; |
| 32 | 32 |
| 33 // Number of blocking update intervals to allow. | 33 // Number of blocking update intervals to allow. |
| 34 const size_t kMaxBlockingUpdateIntervals = 4; | 34 const size_t kMaxBlockingUpdateIntervals = 4; |
| 35 | 35 |
| 36 skia::RefPtr<SkCanvas> CreateAcceleratedCanvas( | 36 skia::RefPtr<SkCanvas> CreateAcceleratedCanvas( |
|
reveman
2013/05/28 22:40:28
please also remove this and all includes it pulls
enne (OOO)
2013/05/28 22:53:21
Done. Sorry for missing that.
| |
| 37 GrContext* gr_context, gfx::Size canvas_size, unsigned texture_id) { | 37 GrContext* gr_context, gfx::Size canvas_size, unsigned texture_id) { |
| 38 GrBackendTextureDesc texture_desc; | 38 GrBackendTextureDesc texture_desc; |
| 39 texture_desc.fFlags = kRenderTarget_GrBackendTextureFlag; | 39 texture_desc.fFlags = kRenderTarget_GrBackendTextureFlag; |
| 40 texture_desc.fWidth = canvas_size.width(); | 40 texture_desc.fWidth = canvas_size.width(); |
| 41 texture_desc.fHeight = canvas_size.height(); | 41 texture_desc.fHeight = canvas_size.height(); |
| 42 texture_desc.fConfig = kSkia8888_GrPixelConfig; | 42 texture_desc.fConfig = kSkia8888_GrPixelConfig; |
| 43 texture_desc.fTextureHandle = texture_id; | 43 texture_desc.fTextureHandle = texture_id; |
| 44 skia::RefPtr<GrTexture> target = | 44 skia::RefPtr<GrTexture> target = |
| 45 skia::AdoptRef(gr_context->wrapBackendTexture(texture_desc)); | 45 skia::AdoptRef(gr_context->wrapBackendTexture(texture_desc)); |
| 46 skia::RefPtr<SkDevice> device = | 46 skia::RefPtr<SkDevice> device = |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 104 } | 104 } |
| 105 | 105 |
| 106 first_update_attempt_ = false; | 106 first_update_attempt_ = false; |
| 107 } | 107 } |
| 108 | 108 |
| 109 void ResourceUpdateController::DiscardUploadsToEvictedResources() { | 109 void ResourceUpdateController::DiscardUploadsToEvictedResources() { |
| 110 queue_->ClearUploadsToEvictedResources(); | 110 queue_->ClearUploadsToEvictedResources(); |
| 111 } | 111 } |
| 112 | 112 |
| 113 void ResourceUpdateController::UpdateTexture(ResourceUpdate update) { | 113 void ResourceUpdateController::UpdateTexture(ResourceUpdate update) { |
| 114 if (update.picture) { | 114 update.bitmap->lockPixels(); |
| 115 PrioritizedResource* texture = update.texture; | 115 update.texture->SetPixels( |
| 116 gfx::Rect picture_rect = update.content_rect; | 116 resource_provider_, |
| 117 gfx::Rect source_rect = update.source_rect; | 117 static_cast<const uint8_t*>(update.bitmap->getPixels()), |
| 118 gfx::Vector2d dest_offset = update.dest_offset; | 118 update.content_rect, |
| 119 | 119 update.source_rect, |
| 120 texture->AcquireBackingTexture(resource_provider_); | 120 update.dest_offset); |
| 121 DCHECK(texture->have_backing_texture()); | 121 update.bitmap->unlockPixels(); |
| 122 | |
| 123 DCHECK_EQ(resource_provider_->GetResourceType(texture->resource_id()), | |
| 124 ResourceProvider::GLTexture); | |
| 125 | |
| 126 cc::ContextProvider* offscreen_contexts = | |
| 127 resource_provider_->offscreen_context_provider(); | |
| 128 | |
| 129 ResourceProvider::ScopedWriteLockGL lock( | |
| 130 resource_provider_, texture->resource_id()); | |
| 131 | |
| 132 // Flush the compositor context to ensure that textures there are available | |
| 133 // in the shared context. Do this after locking/creating the compositor | |
| 134 // texture. | |
| 135 resource_provider_->Flush(); | |
| 136 | |
| 137 // Make sure skia uses the correct GL context. | |
| 138 offscreen_contexts->Context3d()->makeContextCurrent(); | |
| 139 | |
| 140 // Create an accelerated canvas to draw on. | |
| 141 skia::RefPtr<SkCanvas> canvas = CreateAcceleratedCanvas( | |
| 142 offscreen_contexts->GrContext(), texture->size(), lock.texture_id()); | |
| 143 | |
| 144 // The compositor expects the textures to be upside-down so it can flip | |
| 145 // the final composited image. Ganesh renders the image upright so we | |
| 146 // need to do a y-flip. | |
| 147 canvas->translate(0.0, texture->size().height()); | |
| 148 canvas->scale(1.0, -1.0); | |
| 149 // Clip to the destination on the texture that must be updated. | |
| 150 canvas->clipRect(SkRect::MakeXYWH(dest_offset.x(), | |
| 151 dest_offset.y(), | |
| 152 source_rect.width(), | |
| 153 source_rect.height())); | |
| 154 // Translate the origin of picture_rect to dest_offset. | |
| 155 // Note that dest_offset is defined relative to source_rect. | |
| 156 canvas->translate( | |
| 157 picture_rect.x() - source_rect.x() + dest_offset.x(), | |
| 158 picture_rect.y() - source_rect.y() + dest_offset.y()); | |
| 159 canvas->drawPicture(*update.picture); | |
| 160 | |
| 161 // Flush skia context so that all the rendered stuff appears on the | |
| 162 // texture. | |
| 163 offscreen_contexts->GrContext()->flush(); | |
| 164 | |
| 165 // Flush the GL context so rendering results from this context are | |
| 166 // visible in the compositor's context. | |
| 167 offscreen_contexts->Context3d()->flush(); | |
| 168 | |
| 169 // Use the compositor's GL context again. | |
| 170 resource_provider_->GraphicsContext3D()->makeContextCurrent(); | |
| 171 } | |
| 172 | |
| 173 if (update.bitmap) { | |
| 174 update.bitmap->lockPixels(); | |
| 175 update.texture->SetPixels( | |
| 176 resource_provider_, | |
| 177 static_cast<const uint8_t*>(update.bitmap->getPixels()), | |
| 178 update.content_rect, | |
| 179 update.source_rect, | |
| 180 update.dest_offset); | |
| 181 update.bitmap->unlockPixels(); | |
| 182 } | |
| 183 } | 122 } |
| 184 | 123 |
| 185 void ResourceUpdateController::Finalize() { | 124 void ResourceUpdateController::Finalize() { |
| 186 while (queue_->FullUploadSize()) | 125 while (queue_->FullUploadSize()) |
| 187 UpdateTexture(queue_->TakeFirstFullUpload()); | 126 UpdateTexture(queue_->TakeFirstFullUpload()); |
| 188 | 127 |
| 189 while (queue_->PartialUploadSize()) | 128 while (queue_->PartialUploadSize()) |
| 190 UpdateTexture(queue_->TakeFirstPartialUpload()); | 129 UpdateTexture(queue_->TakeFirstPartialUpload()); |
| 191 | 130 |
| 192 resource_provider_->FlushUploads(); | 131 resource_provider_->FlushUploads(); |
| (...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 266 if (!uploads) | 205 if (!uploads) |
| 267 return; | 206 return; |
| 268 | 207 |
| 269 while (queue_->FullUploadSize() && uploads--) | 208 while (queue_->FullUploadSize() && uploads--) |
| 270 UpdateTexture(queue_->TakeFirstFullUpload()); | 209 UpdateTexture(queue_->TakeFirstFullUpload()); |
| 271 | 210 |
| 272 resource_provider_->FlushUploads(); | 211 resource_provider_->FlushUploads(); |
| 273 } | 212 } |
| 274 | 213 |
| 275 } // namespace cc | 214 } // namespace cc |
| OLD | NEW |