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_provider.h" | 5 #include "cc/resources/resource_provider.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <limits> | 8 #include <limits> |
| 9 | 9 |
| 10 #include "base/containers/hash_tables.h" | 10 #include "base/containers/hash_tables.h" |
| 11 #include "base/debug/trace_event.h" | 11 #include "base/debug/trace_event.h" |
| 12 #include "base/stl_util.h" | 12 #include "base/stl_util.h" |
| 13 #include "base/strings/string_split.h" | 13 #include "base/strings/string_split.h" |
| 14 #include "base/strings/string_util.h" | 14 #include "base/strings/string_util.h" |
| 15 #include "cc/base/switches.h" | |
| 15 #include "cc/base/util.h" | 16 #include "cc/base/util.h" |
| 16 #include "cc/output/gl_renderer.h" // For the GLC() macro. | 17 #include "cc/output/gl_renderer.h" // For the GLC() macro. |
| 17 #include "cc/resources/platform_color.h" | 18 #include "cc/resources/platform_color.h" |
| 18 #include "cc/resources/returned_resource.h" | 19 #include "cc/resources/returned_resource.h" |
| 19 #include "cc/resources/shared_bitmap_manager.h" | 20 #include "cc/resources/shared_bitmap_manager.h" |
| 20 #include "cc/resources/texture_uploader.h" | 21 #include "cc/resources/texture_uploader.h" |
| 21 #include "cc/resources/transferable_resource.h" | 22 #include "cc/resources/transferable_resource.h" |
| 22 #include "gpu/GLES2/gl2extchromium.h" | 23 #include "gpu/GLES2/gl2extchromium.h" |
| 23 #include "gpu/command_buffer/client/gles2_interface.h" | 24 #include "gpu/command_buffer/client/gles2_interface.h" |
| 24 #include "third_party/khronos/GLES2/gl2.h" | 25 #include "third_party/khronos/GLES2/gl2.h" |
| (...skipping 380 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 405 ResourceProvider::DirectRasterBuffer::~DirectRasterBuffer() {} | 406 ResourceProvider::DirectRasterBuffer::~DirectRasterBuffer() {} |
| 406 | 407 |
| 407 SkCanvas* ResourceProvider::DirectRasterBuffer::DoLockForWrite() { | 408 SkCanvas* ResourceProvider::DirectRasterBuffer::DoLockForWrite() { |
| 408 if (!surface_) | 409 if (!surface_) |
| 409 surface_ = CreateSurface(); | 410 surface_ = CreateSurface(); |
| 410 surface_generation_id_ = surface_ ? surface_->generationID() : 0u; | 411 surface_generation_id_ = surface_ ? surface_->generationID() : 0u; |
| 411 return surface_ ? surface_->getCanvas() : NULL; | 412 return surface_ ? surface_->getCanvas() : NULL; |
| 412 } | 413 } |
| 413 | 414 |
| 414 bool ResourceProvider::DirectRasterBuffer::DoUnlockForWrite() { | 415 bool ResourceProvider::DirectRasterBuffer::DoUnlockForWrite() { |
| 415 // generationID returns a non-zero, unique value corresponding to the content | 416 if (surface_) { |
| 416 // of surface. Hence, a change since DoLockForWrite was called means the | 417 // generationID returns a non-zero, unique value corresponding to the |
| 417 // surface has changed. | 418 // content of surface. Hence, a change since DoLockForWrite was called |
| 418 return surface_ ? surface_generation_id_ != surface_->generationID() : false; | 419 // means the surface has changed. |
| 420 if (surface_generation_id_ != surface_->generationID()) { | |
| 421 // Flush any pending or deferred work canvas or device might have. This | |
| 422 // also resolves the potential MSAA. | |
| 423 surface_->getCanvas()->flush(); | |
| 424 return true; | |
| 425 } | |
| 426 } | |
| 427 return false; | |
| 419 } | 428 } |
| 420 | 429 |
| 421 skia::RefPtr<SkSurface> ResourceProvider::DirectRasterBuffer::CreateSurface() { | 430 skia::RefPtr<SkSurface> ResourceProvider::DirectRasterBuffer::CreateSurface() { |
| 422 skia::RefPtr<SkSurface> surface; | 431 skia::RefPtr<SkSurface> surface; |
| 423 switch (resource()->type) { | 432 switch (resource()->type) { |
| 424 case GLTexture: { | 433 case GLTexture: { |
| 425 DCHECK(resource()->gl_id); | 434 DCHECK(resource()->gl_id); |
| 426 class GrContext* gr_context = resource_provider()->GrContext(); | 435 class GrContext* gr_context = resource_provider()->GrContext(); |
| 427 if (gr_context) { | 436 if (gr_context) { |
| 428 GrBackendTextureDesc desc; | 437 GrBackendTextureDesc desc; |
| 429 desc.fFlags = kRenderTarget_GrBackendTextureFlag; | 438 desc.fFlags = kRenderTarget_GrBackendTextureFlag; |
| 430 desc.fWidth = resource()->size.width(); | 439 desc.fWidth = resource()->size.width(); |
| 431 desc.fHeight = resource()->size.height(); | 440 desc.fHeight = resource()->size.height(); |
| 432 desc.fConfig = ToGrPixelConfig(resource()->format); | 441 desc.fConfig = ToGrPixelConfig(resource()->format); |
| 433 desc.fOrigin = kTopLeft_GrSurfaceOrigin; | 442 desc.fOrigin = kTopLeft_GrSurfaceOrigin; |
| 434 desc.fTextureHandle = resource()->gl_id; | 443 desc.fTextureHandle = resource()->gl_id; |
| 444 desc.fSampleCnt = resource_provider()->num_gpu_rasterization_samples(); | |
|
nduca
2014/03/01 22:02:28
i think it woudl be better if you obtained this fr
| |
| 435 skia::RefPtr<GrTexture> gr_texture = | 445 skia::RefPtr<GrTexture> gr_texture = |
| 436 skia::AdoptRef(gr_context->wrapBackendTexture(desc)); | 446 skia::AdoptRef(gr_context->wrapBackendTexture(desc)); |
| 437 surface = skia::AdoptRef( | 447 surface = skia::AdoptRef( |
| 438 SkSurface::NewRenderTargetDirect(gr_texture->asRenderTarget())); | 448 SkSurface::NewRenderTargetDirect(gr_texture->asRenderTarget())); |
| 439 } | 449 } |
| 440 break; | 450 break; |
| 441 } | 451 } |
| 442 case Bitmap: { | 452 case Bitmap: { |
| 443 DCHECK(resource()->pixels); | 453 DCHECK(resource()->pixels); |
| 444 DCHECK_EQ(RGBA_8888, resource()->format); | 454 DCHECK_EQ(RGBA_8888, resource()->format); |
| (...skipping 765 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1210 lost_output_surface_(false), | 1220 lost_output_surface_(false), |
| 1211 highp_threshold_min_(highp_threshold_min), | 1221 highp_threshold_min_(highp_threshold_min), |
| 1212 next_id_(1), | 1222 next_id_(1), |
| 1213 next_child_(1), | 1223 next_child_(1), |
| 1214 default_resource_type_(InvalidType), | 1224 default_resource_type_(InvalidType), |
| 1215 use_texture_storage_ext_(false), | 1225 use_texture_storage_ext_(false), |
| 1216 use_texture_usage_hint_(false), | 1226 use_texture_usage_hint_(false), |
| 1217 use_compressed_texture_etc1_(false), | 1227 use_compressed_texture_etc1_(false), |
| 1218 max_texture_size_(0), | 1228 max_texture_size_(0), |
| 1219 best_texture_format_(RGBA_8888), | 1229 best_texture_format_(RGBA_8888), |
| 1230 num_gpu_rasterization_samples_(0), | |
| 1220 use_rgba_4444_texture_format_(use_rgba_4444_texture_format), | 1231 use_rgba_4444_texture_format_(use_rgba_4444_texture_format), |
| 1221 id_allocation_chunk_size_(id_allocation_chunk_size) { | 1232 id_allocation_chunk_size_(id_allocation_chunk_size) { |
| 1222 DCHECK(output_surface_->HasClient()); | 1233 DCHECK(output_surface_->HasClient()); |
| 1223 DCHECK(id_allocation_chunk_size_); | 1234 DCHECK(id_allocation_chunk_size_); |
| 1224 } | 1235 } |
| 1225 | 1236 |
| 1226 void ResourceProvider::InitializeSoftware() { | 1237 void ResourceProvider::InitializeSoftware() { |
| 1227 DCHECK(thread_checker_.CalledOnValidThread()); | 1238 DCHECK(thread_checker_.CalledOnValidThread()); |
| 1228 DCHECK_NE(Bitmap, default_resource_type_); | 1239 DCHECK_NE(Bitmap, default_resource_type_); |
| 1229 | 1240 |
| (...skipping 23 matching lines...) Expand all Loading... | |
| 1253 use_compressed_texture_etc1_ = caps.gpu.texture_format_etc1; | 1264 use_compressed_texture_etc1_ = caps.gpu.texture_format_etc1; |
| 1254 | 1265 |
| 1255 GLES2Interface* gl = ContextGL(); | 1266 GLES2Interface* gl = ContextGL(); |
| 1256 DCHECK(gl); | 1267 DCHECK(gl); |
| 1257 | 1268 |
| 1258 texture_uploader_ = TextureUploader::Create(gl); | 1269 texture_uploader_ = TextureUploader::Create(gl); |
| 1259 max_texture_size_ = 0; // Context expects cleared value. | 1270 max_texture_size_ = 0; // Context expects cleared value. |
| 1260 GLC(gl, gl->GetIntegerv(GL_MAX_TEXTURE_SIZE, &max_texture_size_)); | 1271 GLC(gl, gl->GetIntegerv(GL_MAX_TEXTURE_SIZE, &max_texture_size_)); |
| 1261 best_texture_format_ = PlatformColor::BestTextureFormat(use_bgra); | 1272 best_texture_format_ = PlatformColor::BestTextureFormat(use_bgra); |
| 1262 | 1273 |
| 1274 switch (switches::GetGpuRasterizationType()) { | |
| 1275 default: | |
| 1276 NOTREACHED(); | |
| 1277 case switches::GpuRasterizationGpu: | |
| 1278 num_gpu_rasterization_samples_ = 0; | |
| 1279 break; | |
| 1280 case switches::GpuRasterizationMsaa4: | |
| 1281 num_gpu_rasterization_samples_ = 4; | |
| 1282 break; | |
| 1283 case switches::GpuRasterizationMsaa16: | |
| 1284 num_gpu_rasterization_samples_ = 16; | |
| 1285 break; | |
| 1286 } | |
| 1287 | |
| 1263 texture_id_allocator_.reset( | 1288 texture_id_allocator_.reset( |
| 1264 new TextureIdAllocator(gl, id_allocation_chunk_size_)); | 1289 new TextureIdAllocator(gl, id_allocation_chunk_size_)); |
| 1265 buffer_id_allocator_.reset( | 1290 buffer_id_allocator_.reset( |
| 1266 new BufferIdAllocator(gl, id_allocation_chunk_size_)); | 1291 new BufferIdAllocator(gl, id_allocation_chunk_size_)); |
| 1267 | 1292 |
| 1268 return true; | 1293 return true; |
| 1269 } | 1294 } |
| 1270 | 1295 |
| 1271 void ResourceProvider::CleanUpGLIfNeeded() { | 1296 void ResourceProvider::CleanUpGLIfNeeded() { |
| 1272 GLES2Interface* gl = ContextGL(); | 1297 GLES2Interface* gl = ContextGL(); |
| (...skipping 908 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2181 ContextProvider* context_provider = output_surface_->context_provider(); | 2206 ContextProvider* context_provider = output_surface_->context_provider(); |
| 2182 return context_provider ? context_provider->ContextGL() : NULL; | 2207 return context_provider ? context_provider->ContextGL() : NULL; |
| 2183 } | 2208 } |
| 2184 | 2209 |
| 2185 class GrContext* ResourceProvider::GrContext() const { | 2210 class GrContext* ResourceProvider::GrContext() const { |
| 2186 ContextProvider* context_provider = output_surface_->context_provider(); | 2211 ContextProvider* context_provider = output_surface_->context_provider(); |
| 2187 return context_provider ? context_provider->GrContext() : NULL; | 2212 return context_provider ? context_provider->GrContext() : NULL; |
| 2188 } | 2213 } |
| 2189 | 2214 |
| 2190 } // namespace cc | 2215 } // namespace cc |
| OLD | NEW |