X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=src%2Fcc%2Fresources%2Fresource_provider.cc;h=30d5849ef415c4ee4a6911bcf7652fb16e293a90;hb=4a1a0bdd01eef90b0826a0e761d3379d3715c10f;hp=e3c21ff7c6b225ef2d207437a0748c465c37fe81;hpb=b1be5ca53587d23e7aeb77b26861fdc0a181ffd8;p=platform%2Fframework%2Fweb%2Fcrosswalk.git diff --git a/src/cc/resources/resource_provider.cc b/src/cc/resources/resource_provider.cc index e3c21ff..30d5849 100644 --- a/src/cc/resources/resource_provider.cc +++ b/src/cc/resources/resource_provider.cc @@ -70,6 +70,7 @@ GLenum TextureToStorageFormat(ResourceFormat format) { storage_format = GL_BGRA8_EXT; break; case RGBA_4444: + case ALPHA_8: case LUMINANCE_8: case RGB_565: case ETC1: @@ -86,6 +87,7 @@ bool IsFormatSupportedForStorage(ResourceFormat format) { case BGRA_8888: return true; case RGBA_4444: + case ALPHA_8: case LUMINANCE_8: case RGB_565: case ETC1: @@ -206,6 +208,7 @@ class QueryFence : public ResourceProvider::Fence { : gl_(gl), query_id_(query_id) {} // Overridden from ResourceProvider::Fence: + virtual void Set() OVERRIDE {} virtual bool HasPassed() OVERRIDE { unsigned available = 1; gl_->GetQueryObjectuivEXT( @@ -241,7 +244,7 @@ ResourceProvider::Resource::Resource() pending_set_pixels(false), set_pixels_completion_forced(false), allocated(false), - enable_read_lock_fences(false), + read_lock_fences_enabled(false), has_shared_bitmap_id(false), allow_overlay(false), read_lock_fence(NULL), @@ -257,7 +260,8 @@ ResourceProvider::Resource::Resource() hint(TextureUsageAny), type(InvalidType), format(RGBA_8888), - shared_bitmap(NULL) {} + shared_bitmap(NULL) { +} ResourceProvider::Resource::~Resource() {} @@ -286,7 +290,7 @@ ResourceProvider::Resource::Resource(GLuint texture_id, pending_set_pixels(false), set_pixels_completion_forced(false), allocated(false), - enable_read_lock_fences(false), + read_lock_fences_enabled(false), has_shared_bitmap_id(false), allow_overlay(false), read_lock_fence(NULL), @@ -329,7 +333,7 @@ ResourceProvider::Resource::Resource(uint8_t* pixels, pending_set_pixels(false), set_pixels_completion_forced(false), allocated(false), - enable_read_lock_fences(false), + read_lock_fences_enabled(false), has_shared_bitmap_id(!!bitmap), allow_overlay(false), read_lock_fence(NULL), @@ -373,7 +377,7 @@ ResourceProvider::Resource::Resource(const SharedBitmapId& bitmap_id, pending_set_pixels(false), set_pixels_completion_forced(false), allocated(false), - enable_read_lock_fences(false), + read_lock_fences_enabled(false), has_shared_bitmap_id(true), allow_overlay(false), read_lock_fence(NULL), @@ -429,67 +433,55 @@ bool ResourceProvider::RasterBuffer::UnlockForWrite() { return DoUnlockForWrite(); } -ResourceProvider::DirectRasterBuffer::DirectRasterBuffer( +ResourceProvider::GpuRasterBuffer::GpuRasterBuffer( const Resource* resource, ResourceProvider* resource_provider, - bool use_distance_field_text ) + bool use_distance_field_text) : RasterBuffer(resource, resource_provider), surface_generation_id_(0u), - use_distance_field_text_(use_distance_field_text) {} + use_distance_field_text_(use_distance_field_text) { +} -ResourceProvider::DirectRasterBuffer::~DirectRasterBuffer() {} +ResourceProvider::GpuRasterBuffer::~GpuRasterBuffer() { +} -SkCanvas* ResourceProvider::DirectRasterBuffer::DoLockForWrite() { +SkCanvas* ResourceProvider::GpuRasterBuffer::DoLockForWrite() { if (!surface_) surface_ = CreateSurface(); surface_generation_id_ = surface_ ? surface_->generationID() : 0u; return surface_ ? surface_->getCanvas() : NULL; } -bool ResourceProvider::DirectRasterBuffer::DoUnlockForWrite() { +bool ResourceProvider::GpuRasterBuffer::DoUnlockForWrite() { // generationID returns a non-zero, unique value corresponding to the content // of surface. Hence, a change since DoLockForWrite was called means the // surface has changed. return surface_ ? surface_generation_id_ != surface_->generationID() : false; } -skia::RefPtr ResourceProvider::DirectRasterBuffer::CreateSurface() { - skia::RefPtr surface; - switch (resource()->type) { - case GLTexture: { - DCHECK(resource()->gl_id); - class GrContext* gr_context = resource_provider()->GrContext(); - if (gr_context) { - GrBackendTextureDesc desc; - desc.fFlags = kRenderTarget_GrBackendTextureFlag; - desc.fWidth = resource()->size.width(); - desc.fHeight = resource()->size.height(); - desc.fConfig = ToGrPixelConfig(resource()->format); - desc.fOrigin = kTopLeft_GrSurfaceOrigin; - desc.fTextureHandle = resource()->gl_id; - skia::RefPtr gr_texture = - skia::AdoptRef(gr_context->wrapBackendTexture(desc)); - SkSurface::TextRenderMode text_render_mode = - use_distance_field_text_ ? SkSurface::kDistanceField_TextRenderMode - : SkSurface::kStandard_TextRenderMode; - surface = skia::AdoptRef(SkSurface::NewRenderTargetDirect( - gr_texture->asRenderTarget(), text_render_mode)); - } - break; - } - case Bitmap: { - DCHECK(resource()->pixels); - DCHECK_EQ(RGBA_8888, resource()->format); - SkImageInfo image_info = SkImageInfo::MakeN32Premul( - resource()->size.width(), resource()->size.height()); - surface = skia::AdoptRef(SkSurface::NewRasterDirect( - image_info, resource()->pixels, image_info.minRowBytes())); - break; - } - default: - NOTREACHED(); - } - return surface; +skia::RefPtr ResourceProvider::GpuRasterBuffer::CreateSurface() { + DCHECK_EQ(GLTexture, resource()->type); + DCHECK(resource()->gl_id); + + class GrContext* gr_context = resource_provider()->GrContext(); + // TODO(alokp): Implement TestContextProvider::GrContext(). + if (!gr_context) + return skia::RefPtr(); + + GrBackendTextureDesc desc; + desc.fFlags = kRenderTarget_GrBackendTextureFlag; + desc.fWidth = resource()->size.width(); + desc.fHeight = resource()->size.height(); + desc.fConfig = ToGrPixelConfig(resource()->format); + desc.fOrigin = kTopLeft_GrSurfaceOrigin; + desc.fTextureHandle = resource()->gl_id; + skia::RefPtr gr_texture = + skia::AdoptRef(gr_context->wrapBackendTexture(desc)); + SkSurface::TextRenderMode text_render_mode = + use_distance_field_text_ ? SkSurface::kDistanceField_TextRenderMode + : SkSurface::kStandard_TextRenderMode; + return skia::AdoptRef(SkSurface::NewRenderTargetDirect( + gr_texture->asRenderTarget(), text_render_mode)); } ResourceProvider::BitmapRasterBuffer::BitmapRasterBuffer( @@ -526,6 +518,7 @@ SkCanvas* ResourceProvider::BitmapRasterBuffer::DoLockForWrite() { raster_bitmap_.installPixels(info, mapped_buffer_, stride); break; } + case ALPHA_8: case LUMINANCE_8: case RGB_565: case ETC1: @@ -842,7 +835,7 @@ void ResourceProvider::DeleteResourceInternal(ResourceMap::iterator it, if (style == ForShutdown && resource->exported_count > 0) lost_resource = true; - resource->direct_raster_buffer.reset(); + resource->gpu_raster_buffer.reset(); resource->image_raster_buffer.reset(); resource->pixel_raster_buffer.reset(); @@ -1027,30 +1020,6 @@ base::TimeTicks ResourceProvider::EstimatedUploadCompletionTime( return gfx::FrameTime::Now() + upload_one_texture_time * total_uploads; } -void ResourceProvider::Flush() { - DCHECK(thread_checker_.CalledOnValidThread()); - GLES2Interface* gl = ContextGL(); - if (gl) - gl->Flush(); -} - -void ResourceProvider::Finish() { - DCHECK(thread_checker_.CalledOnValidThread()); - GLES2Interface* gl = ContextGL(); - if (gl) - gl->Finish(); -} - -bool ResourceProvider::ShallowFlushIfSupported() { - DCHECK(thread_checker_.CalledOnValidThread()); - GLES2Interface* gl = ContextGL(); - if (!gl) - return false; - - gl->ShallowFlushCHROMIUM(); - return true; -} - ResourceProvider::Resource* ResourceProvider::GetResource(ResourceId id) { DCHECK(thread_checker_.CalledOnValidThread()); ResourceMap::iterator it = resources_.find(id); @@ -1098,8 +1067,11 @@ const ResourceProvider::Resource* ResourceProvider::LockForRead(ResourceId id) { } resource->lock_for_read_count++; - if (resource->enable_read_lock_fences) + if (resource->read_lock_fences_enabled) { + if (current_read_lock_fence_) + current_read_lock_fence_->Set(); resource->read_lock_fence = current_read_lock_fence_; + } return resource; } @@ -1333,7 +1305,7 @@ void ResourceProvider::CleanUpGLIfNeeded() { texture_uploader_.reset(); texture_id_allocator_.reset(); buffer_id_allocator_.reset(); - Finish(); + gl->Finish(); } int ResourceProvider::CreateChild(const ReturnCallback& return_callback) { @@ -1464,6 +1436,7 @@ void ResourceProvider::ReceiveFromChild( // Don't allocate a texture for a child. resource.allocated = true; resource.imported_count = 1; + resource.allow_overlay = it->allow_overlay; child_info.parent_to_child_map[local_id] = it->id; child_info.child_to_parent_map[it->id] = local_id; } @@ -1558,8 +1531,11 @@ void ResourceProvider::ReceiveReturnsFromParent( // Need to wait for the current read lock fence to pass before we can // recycle this resource. - if (resource->enable_read_lock_fences) + if (resource->read_lock_fences_enabled) { + if (current_read_lock_fence_) + current_read_lock_fence_->Set(); resource->read_lock_fence = current_read_lock_fence_; + } if (returned.sync_point) { DCHECK(!resource->has_shared_bitmap_id); @@ -1621,6 +1597,7 @@ void ResourceProvider::TransferResource(GLES2Interface* gl, resource->filter = source->filter; resource->size = source->size; resource->is_repeated = (source->wrap_mode == GL_REPEAT); + resource->allow_overlay = source->allow_overlay; if (source->type == Bitmap) { resource->mailbox_holder.mailbox = source->shared_bitmap_id; @@ -1753,22 +1730,22 @@ void ResourceProvider::DeleteAndReturnUnusedResourcesToChild( } } -SkCanvas* ResourceProvider::MapDirectRasterBuffer(ResourceId id) { - // Resource needs to be locked for write since DirectRasterBuffer writes +SkCanvas* ResourceProvider::MapGpuRasterBuffer(ResourceId id) { + // Resource needs to be locked for write since GpuRasterBuffer writes // directly to it. LockForWrite(id); Resource* resource = GetResource(id); - if (!resource->direct_raster_buffer.get()) { - resource->direct_raster_buffer.reset( - new DirectRasterBuffer(resource, this, use_distance_field_text_)); + if (!resource->gpu_raster_buffer.get()) { + resource->gpu_raster_buffer.reset( + new GpuRasterBuffer(resource, this, use_distance_field_text_)); } - return resource->direct_raster_buffer->LockForWrite(); + return resource->gpu_raster_buffer->LockForWrite(); } -void ResourceProvider::UnmapDirectRasterBuffer(ResourceId id) { +void ResourceProvider::UnmapGpuRasterBuffer(ResourceId id) { Resource* resource = GetResource(id); - DCHECK(resource->direct_raster_buffer.get()); - resource->direct_raster_buffer->UnlockForWrite(); + DCHECK(resource->gpu_raster_buffer.get()); + resource->gpu_raster_buffer->UnlockForWrite(); UnlockForWrite(id); } @@ -2138,10 +2115,9 @@ void ResourceProvider::BindImageForSampling(Resource* resource) { resource->dirty_image = false; } -void ResourceProvider::EnableReadLockFences(ResourceProvider::ResourceId id, - bool enable) { +void ResourceProvider::EnableReadLockFences(ResourceProvider::ResourceId id) { Resource* resource = GetResource(id); - resource->enable_read_lock_fences = enable; + resource->read_lock_fences_enabled = true; } void ResourceProvider::AcquireImage(Resource* resource) {