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" |
| (...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 127 src.copyTo(&dst_bitmap, dst_colorType, &allocator); | 127 src.copyTo(&dst_bitmap, dst_colorType, &allocator); |
| 128 // TODO(kaanb): The GL pipeline assumes a 4-byte alignment for the | 128 // TODO(kaanb): The GL pipeline assumes a 4-byte alignment for the |
| 129 // bitmap data. This check will be removed once crbug.com/293728 is fixed. | 129 // bitmap data. This check will be removed once crbug.com/293728 is fixed. |
| 130 CHECK_EQ(0u, dst_bitmap.rowBytes() % 4); | 130 CHECK_EQ(0u, dst_bitmap.rowBytes() % 4); |
| 131 } | 131 } |
| 132 | 132 |
| 133 class ScopedSetActiveTexture { | 133 class ScopedSetActiveTexture { |
| 134 public: | 134 public: |
| 135 ScopedSetActiveTexture(GLES2Interface* gl, GLenum unit) | 135 ScopedSetActiveTexture(GLES2Interface* gl, GLenum unit) |
| 136 : gl_(gl), unit_(unit) { | 136 : gl_(gl), unit_(unit) { |
| 137 DCHECK_EQ(GL_TEXTURE0, ResourceProvider::GetActiveTextureUnit(gl_)); | 137 DCHECK_EQ(GL_TEXTURE0, ResourceHelper::GetActiveTextureUnit(gl_)); |
| 138 | 138 |
| 139 if (unit_ != GL_TEXTURE0) | 139 if (unit_ != GL_TEXTURE0) |
| 140 GLC(gl_, gl_->ActiveTexture(unit_)); | 140 GLC(gl_, gl_->ActiveTexture(unit_)); |
| 141 } | 141 } |
| 142 | 142 |
| 143 ~ScopedSetActiveTexture() { | 143 ~ScopedSetActiveTexture() { |
| 144 // Active unit being GL_TEXTURE0 is effectively the ground state. | 144 // Active unit being GL_TEXTURE0 is effectively the ground state. |
| 145 if (unit_ != GL_TEXTURE0) | 145 if (unit_ != GL_TEXTURE0) |
| 146 GLC(gl_, gl_->ActiveTexture(GL_TEXTURE0)); | 146 GLC(gl_, gl_->ActiveTexture(GL_TEXTURE0)); |
| 147 } | 147 } |
| (...skipping 304 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 452 // generationID returns a non-zero, unique value corresponding to the content | 452 // generationID returns a non-zero, unique value corresponding to the content |
| 453 // of surface. Hence, a change since DoLockForWrite was called means the | 453 // of surface. Hence, a change since DoLockForWrite was called means the |
| 454 // surface has changed. | 454 // surface has changed. |
| 455 return surface_ ? surface_generation_id_ != surface_->generationID() : false; | 455 return surface_ ? surface_generation_id_ != surface_->generationID() : false; |
| 456 } | 456 } |
| 457 | 457 |
| 458 skia::RefPtr<SkSurface> ResourceProvider::GpuRasterBuffer::CreateSurface() { | 458 skia::RefPtr<SkSurface> ResourceProvider::GpuRasterBuffer::CreateSurface() { |
| 459 DCHECK_EQ(GLTexture, resource()->type); | 459 DCHECK_EQ(GLTexture, resource()->type); |
| 460 DCHECK(resource()->gl_id); | 460 DCHECK(resource()->gl_id); |
| 461 | 461 |
| 462 class GrContext* gr_context = resource_provider()->GrContext(); | 462 class GrContext* gr_context = |
| 463 resource_provider()->GetResourceHelper()->GrContext(); | |
| 463 // TODO(alokp): Implement TestContextProvider::GrContext(). | 464 // TODO(alokp): Implement TestContextProvider::GrContext(). |
| 464 if (!gr_context) | 465 if (!gr_context) |
| 465 return skia::RefPtr<SkSurface>(); | 466 return skia::RefPtr<SkSurface>(); |
| 466 | 467 |
| 467 GrBackendTextureDesc desc; | 468 GrBackendTextureDesc desc; |
| 468 desc.fFlags = kRenderTarget_GrBackendTextureFlag; | 469 desc.fFlags = kRenderTarget_GrBackendTextureFlag; |
| 469 desc.fWidth = resource()->size.width(); | 470 desc.fWidth = resource()->size.width(); |
| 470 desc.fHeight = resource()->size.height(); | 471 desc.fHeight = resource()->size.height(); |
| 471 desc.fConfig = ToGrPixelConfig(resource()->format); | 472 desc.fConfig = ToGrPixelConfig(resource()->format); |
| 472 desc.fOrigin = kTopLeft_GrSurfaceOrigin; | 473 desc.fOrigin = kTopLeft_GrSurfaceOrigin; |
| (...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 589 size_t id_allocation_chunk_size, | 590 size_t id_allocation_chunk_size, |
| 590 bool use_distance_field_text) { | 591 bool use_distance_field_text) { |
| 591 scoped_ptr<ResourceProvider> resource_provider( | 592 scoped_ptr<ResourceProvider> resource_provider( |
| 592 new ResourceProvider(output_surface, | 593 new ResourceProvider(output_surface, |
| 593 shared_bitmap_manager, | 594 shared_bitmap_manager, |
| 594 highp_threshold_min, | 595 highp_threshold_min, |
| 595 use_rgba_4444_texture_format, | 596 use_rgba_4444_texture_format, |
| 596 id_allocation_chunk_size, | 597 id_allocation_chunk_size, |
| 597 use_distance_field_text)); | 598 use_distance_field_text)); |
| 598 | 599 |
| 599 if (resource_provider->ContextGL()) | 600 if (resource_provider->GetResourceHelper()->ContextGL()) |
| 600 resource_provider->InitializeGL(); | 601 resource_provider->InitializeGL(); |
| 601 else | 602 else |
| 602 resource_provider->InitializeSoftware(); | 603 resource_provider->InitializeSoftware(); |
| 603 | 604 |
| 604 DCHECK_NE(InvalidType, resource_provider->default_resource_type()); | 605 DCHECK_NE(InvalidType, resource_provider->default_resource_type()); |
| 605 return resource_provider.Pass(); | 606 return resource_provider.Pass(); |
| 606 } | 607 } |
| 607 | 608 |
| 608 ResourceProvider::~ResourceProvider() { | 609 ResourceProvider::~ResourceProvider() { |
| 609 while (!children_.empty()) | 610 while (!children_.empty()) |
| (...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 741 Resource resource(0, | 742 Resource resource(0, |
| 742 gfx::Size(), | 743 gfx::Size(), |
| 743 Resource::Internal, | 744 Resource::Internal, |
| 744 GL_TEXTURE_RECTANGLE_ARB, | 745 GL_TEXTURE_RECTANGLE_ARB, |
| 745 GL_LINEAR, | 746 GL_LINEAR, |
| 746 GL_TEXTURE_POOL_UNMANAGED_CHROMIUM, | 747 GL_TEXTURE_POOL_UNMANAGED_CHROMIUM, |
| 747 GL_CLAMP_TO_EDGE, | 748 GL_CLAMP_TO_EDGE, |
| 748 TextureUsageAny, | 749 TextureUsageAny, |
| 749 RGBA_8888); | 750 RGBA_8888); |
| 750 LazyCreate(&resource); | 751 LazyCreate(&resource); |
| 751 GLES2Interface* gl = ContextGL(); | 752 GLES2Interface* gl = resource_helper_->ContextGL(); |
| 752 DCHECK(gl); | 753 DCHECK(gl); |
| 753 gl->BindTexture(GL_TEXTURE_RECTANGLE_ARB, resource.gl_id); | 754 gl->BindTexture(GL_TEXTURE_RECTANGLE_ARB, resource.gl_id); |
| 754 gl->TexImageIOSurface2DCHROMIUM( | 755 gl->TexImageIOSurface2DCHROMIUM( |
| 755 GL_TEXTURE_RECTANGLE_ARB, size.width(), size.height(), io_surface_id, 0); | 756 GL_TEXTURE_RECTANGLE_ARB, size.width(), size.height(), io_surface_id, 0); |
| 756 resource.allocated = true; | 757 resource.allocated = true; |
| 757 resources_[id] = resource; | 758 resources_[id] = resource; |
| 758 return id; | 759 return id; |
| 759 } | 760 } |
| 760 | 761 |
| 761 ResourceProvider::ResourceId ResourceProvider::CreateResourceFromTextureMailbox( | 762 ResourceProvider::ResourceId ResourceProvider::CreateResourceFromTextureMailbox( |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 829 DCHECK(resource->exported_count == 0 || style != Normal); | 830 DCHECK(resource->exported_count == 0 || style != Normal); |
| 830 if (style == ForShutdown && resource->exported_count > 0) | 831 if (style == ForShutdown && resource->exported_count > 0) |
| 831 lost_resource = true; | 832 lost_resource = true; |
| 832 | 833 |
| 833 resource->gpu_raster_buffer.reset(); | 834 resource->gpu_raster_buffer.reset(); |
| 834 resource->image_raster_buffer.reset(); | 835 resource->image_raster_buffer.reset(); |
| 835 resource->pixel_raster_buffer.reset(); | 836 resource->pixel_raster_buffer.reset(); |
| 836 | 837 |
| 837 if (resource->image_id) { | 838 if (resource->image_id) { |
| 838 DCHECK(resource->origin == Resource::Internal); | 839 DCHECK(resource->origin == Resource::Internal); |
| 839 GLES2Interface* gl = ContextGL(); | 840 GLES2Interface* gl = resource_helper_->ContextGL(); |
| 840 DCHECK(gl); | 841 DCHECK(gl); |
| 841 GLC(gl, gl->DestroyImageCHROMIUM(resource->image_id)); | 842 GLC(gl, gl->DestroyImageCHROMIUM(resource->image_id)); |
| 842 } | 843 } |
| 843 if (resource->gl_upload_query_id) { | 844 if (resource->gl_upload_query_id) { |
| 844 DCHECK(resource->origin == Resource::Internal); | 845 DCHECK(resource->origin == Resource::Internal); |
| 845 GLES2Interface* gl = ContextGL(); | 846 GLES2Interface* gl = resource_helper_->ContextGL(); |
| 846 DCHECK(gl); | 847 DCHECK(gl); |
| 847 GLC(gl, gl->DeleteQueriesEXT(1, &resource->gl_upload_query_id)); | 848 GLC(gl, gl->DeleteQueriesEXT(1, &resource->gl_upload_query_id)); |
| 848 } | 849 } |
| 849 if (resource->gl_read_lock_query_id) { | 850 if (resource->gl_read_lock_query_id) { |
| 850 DCHECK(resource->origin == Resource::Internal); | 851 DCHECK(resource->origin == Resource::Internal); |
| 851 GLES2Interface* gl = ContextGL(); | 852 GLES2Interface* gl = resource_helper_->ContextGL(); |
| 852 DCHECK(gl); | 853 DCHECK(gl); |
| 853 GLC(gl, gl->DeleteQueriesEXT(1, &resource->gl_read_lock_query_id)); | 854 GLC(gl, gl->DeleteQueriesEXT(1, &resource->gl_read_lock_query_id)); |
| 854 } | 855 } |
| 855 if (resource->gl_pixel_buffer_id) { | 856 if (resource->gl_pixel_buffer_id) { |
| 856 DCHECK(resource->origin == Resource::Internal); | 857 DCHECK(resource->origin == Resource::Internal); |
| 857 GLES2Interface* gl = ContextGL(); | 858 GLES2Interface* gl = resource_helper_->ContextGL(); |
| 858 DCHECK(gl); | 859 DCHECK(gl); |
| 859 GLC(gl, gl->DeleteBuffers(1, &resource->gl_pixel_buffer_id)); | 860 GLC(gl, gl->DeleteBuffers(1, &resource->gl_pixel_buffer_id)); |
| 860 } | 861 } |
| 861 if (resource->origin == Resource::External) { | 862 if (resource->origin == Resource::External) { |
| 862 DCHECK(resource->mailbox.IsValid()); | 863 DCHECK(resource->mailbox.IsValid()); |
| 863 GLuint sync_point = resource->mailbox.sync_point(); | 864 GLuint sync_point = resource->mailbox.sync_point(); |
| 864 if (resource->type == GLTexture) { | 865 if (resource->type == GLTexture) { |
| 865 DCHECK(resource->mailbox.IsTexture()); | 866 DCHECK(resource->mailbox.IsTexture()); |
| 866 lost_resource |= lost_output_surface_; | 867 lost_resource |= lost_output_surface_; |
| 867 GLES2Interface* gl = ContextGL(); | 868 GLES2Interface* gl = resource_helper_->ContextGL(); |
| 868 DCHECK(gl); | 869 DCHECK(gl); |
| 869 if (resource->gl_id) { | 870 if (resource->gl_id) { |
| 870 GLC(gl, gl->DeleteTextures(1, &resource->gl_id)); | 871 GLC(gl, gl->DeleteTextures(1, &resource->gl_id)); |
| 871 resource->gl_id = 0; | 872 resource->gl_id = 0; |
| 872 if (!lost_resource) | 873 if (!lost_resource) |
| 873 sync_point = gl->InsertSyncPointCHROMIUM(); | 874 sync_point = gl->InsertSyncPointCHROMIUM(); |
| 874 } | 875 } |
| 875 } else { | 876 } else { |
| 876 DCHECK(resource->mailbox.IsSharedMemory()); | 877 DCHECK(resource->mailbox.IsSharedMemory()); |
| 877 base::SharedMemory* shared_memory = resource->mailbox.shared_memory(); | 878 base::SharedMemory* shared_memory = resource->mailbox.shared_memory(); |
| 878 if (resource->pixels && shared_memory) { | 879 if (resource->pixels && shared_memory) { |
| 879 DCHECK(shared_memory->memory() == resource->pixels); | 880 DCHECK(shared_memory->memory() == resource->pixels); |
| 880 resource->pixels = NULL; | 881 resource->pixels = NULL; |
| 881 delete resource->shared_bitmap; | 882 delete resource->shared_bitmap; |
| 882 resource->shared_bitmap = NULL; | 883 resource->shared_bitmap = NULL; |
| 883 } | 884 } |
| 884 } | 885 } |
| 885 resource->release_callback.Run(sync_point, lost_resource); | 886 resource->release_callback.Run(sync_point, lost_resource); |
| 886 } | 887 } |
| 887 if (resource->gl_id) { | 888 if (resource->gl_id) { |
| 888 GLES2Interface* gl = ContextGL(); | 889 GLES2Interface* gl = resource_helper_->ContextGL(); |
| 889 DCHECK(gl); | 890 DCHECK(gl); |
| 890 GLC(gl, gl->DeleteTextures(1, &resource->gl_id)); | 891 GLC(gl, gl->DeleteTextures(1, &resource->gl_id)); |
| 891 resource->gl_id = 0; | 892 resource->gl_id = 0; |
| 892 } | 893 } |
| 893 if (resource->shared_bitmap) { | 894 if (resource->shared_bitmap) { |
| 894 DCHECK(resource->origin != Resource::External); | 895 DCHECK(resource->origin != Resource::External); |
| 895 DCHECK_EQ(Bitmap, resource->type); | 896 DCHECK_EQ(Bitmap, resource->type); |
| 896 delete resource->shared_bitmap; | 897 delete resource->shared_bitmap; |
| 897 resource->pixels = NULL; | 898 resource->pixels = NULL; |
| 898 } | 899 } |
| (...skipping 19 matching lines...) Expand all Loading... | |
| 918 DCHECK(!resource->lock_for_read_count); | 919 DCHECK(!resource->lock_for_read_count); |
| 919 DCHECK(resource->origin == Resource::Internal); | 920 DCHECK(resource->origin == Resource::Internal); |
| 920 DCHECK_EQ(resource->exported_count, 0); | 921 DCHECK_EQ(resource->exported_count, 0); |
| 921 DCHECK(ReadLockFenceHasPassed(resource)); | 922 DCHECK(ReadLockFenceHasPassed(resource)); |
| 922 LazyAllocate(resource); | 923 LazyAllocate(resource); |
| 923 | 924 |
| 924 if (resource->type == GLTexture) { | 925 if (resource->type == GLTexture) { |
| 925 DCHECK(resource->gl_id); | 926 DCHECK(resource->gl_id); |
| 926 DCHECK(!resource->pending_set_pixels); | 927 DCHECK(!resource->pending_set_pixels); |
| 927 DCHECK_EQ(resource->target, static_cast<GLenum>(GL_TEXTURE_2D)); | 928 DCHECK_EQ(resource->target, static_cast<GLenum>(GL_TEXTURE_2D)); |
| 928 GLES2Interface* gl = ContextGL(); | 929 GLES2Interface* gl = resource_helper_->ContextGL(); |
| 929 DCHECK(gl); | 930 DCHECK(gl); |
| 930 DCHECK(texture_uploader_.get()); | 931 DCHECK(texture_uploader_.get()); |
| 931 gl->BindTexture(GL_TEXTURE_2D, resource->gl_id); | 932 gl->BindTexture(GL_TEXTURE_2D, resource->gl_id); |
| 932 texture_uploader_->Upload(image, | 933 texture_uploader_->Upload(image, |
| 933 image_rect, | 934 image_rect, |
| 934 source_rect, | 935 source_rect, |
| 935 dest_offset, | 936 dest_offset, |
| 936 resource->format, | 937 resource->format, |
| 937 resource->size); | 938 resource->size); |
| 938 } else { | 939 } else { |
| (...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1008 | 1009 |
| 1009 base::TimeDelta upload_one_texture_time = | 1010 base::TimeDelta upload_one_texture_time = |
| 1010 base::TimeDelta::FromMicroseconds( | 1011 base::TimeDelta::FromMicroseconds( |
| 1011 base::Time::kMicrosecondsPerSecond * kTextureUploadTickRate) / | 1012 base::Time::kMicrosecondsPerSecond * kTextureUploadTickRate) / |
| 1012 uploads_per_tick; | 1013 uploads_per_tick; |
| 1013 | 1014 |
| 1014 size_t total_uploads = NumBlockingUploads() + uploads_per_tick; | 1015 size_t total_uploads = NumBlockingUploads() + uploads_per_tick; |
| 1015 return gfx::FrameTime::Now() + upload_one_texture_time * total_uploads; | 1016 return gfx::FrameTime::Now() + upload_one_texture_time * total_uploads; |
| 1016 } | 1017 } |
| 1017 | 1018 |
| 1018 void ResourceProvider::Flush() { | |
| 1019 DCHECK(thread_checker_.CalledOnValidThread()); | |
| 1020 GLES2Interface* gl = ContextGL(); | |
| 1021 if (gl) | |
| 1022 gl->Flush(); | |
| 1023 } | |
| 1024 | |
| 1025 void ResourceProvider::Finish() { | |
| 1026 DCHECK(thread_checker_.CalledOnValidThread()); | |
| 1027 GLES2Interface* gl = ContextGL(); | |
| 1028 if (gl) | |
| 1029 gl->Finish(); | |
| 1030 } | |
| 1031 | |
| 1032 bool ResourceProvider::ShallowFlushIfSupported() { | |
| 1033 DCHECK(thread_checker_.CalledOnValidThread()); | |
| 1034 GLES2Interface* gl = ContextGL(); | |
| 1035 if (!gl) | |
| 1036 return false; | |
| 1037 | |
| 1038 gl->ShallowFlushCHROMIUM(); | |
| 1039 return true; | |
| 1040 } | |
| 1041 | |
| 1042 ResourceProvider::Resource* ResourceProvider::GetResource(ResourceId id) { | 1019 ResourceProvider::Resource* ResourceProvider::GetResource(ResourceId id) { |
| 1043 DCHECK(thread_checker_.CalledOnValidThread()); | 1020 DCHECK(thread_checker_.CalledOnValidThread()); |
| 1044 ResourceMap::iterator it = resources_.find(id); | 1021 ResourceMap::iterator it = resources_.find(id); |
| 1045 CHECK(it != resources_.end()); | 1022 CHECK(it != resources_.end()); |
| 1046 return &it->second; | 1023 return &it->second; |
| 1047 } | 1024 } |
| 1048 | 1025 |
| 1049 const ResourceProvider::Resource* ResourceProvider::LockForRead(ResourceId id) { | 1026 const ResourceProvider::Resource* ResourceProvider::LockForRead(ResourceId id) { |
| 1050 Resource* resource = GetResource(id); | 1027 Resource* resource = GetResource(id); |
| 1051 DCHECK(!resource->locked_for_write || | 1028 DCHECK(!resource->locked_for_write || |
| 1052 resource->set_pixels_completion_forced) << | 1029 resource->set_pixels_completion_forced) << |
| 1053 "locked for write: " << resource->locked_for_write << | 1030 "locked for write: " << resource->locked_for_write << |
| 1054 " pixels completion forced: " << resource->set_pixels_completion_forced; | 1031 " pixels completion forced: " << resource->set_pixels_completion_forced; |
| 1055 DCHECK_EQ(resource->exported_count, 0); | 1032 DCHECK_EQ(resource->exported_count, 0); |
| 1056 // Uninitialized! Call SetPixels or LockForWrite first. | 1033 // Uninitialized! Call SetPixels or LockForWrite first. |
| 1057 DCHECK(resource->allocated); | 1034 DCHECK(resource->allocated); |
| 1058 | 1035 |
| 1059 LazyCreate(resource); | 1036 LazyCreate(resource); |
| 1060 | 1037 |
| 1061 if (resource->type == GLTexture && !resource->gl_id) { | 1038 if (resource->type == GLTexture && !resource->gl_id) { |
| 1062 DCHECK(resource->origin != Resource::Internal); | 1039 DCHECK(resource->origin != Resource::Internal); |
| 1063 DCHECK(resource->mailbox.IsTexture()); | 1040 DCHECK(resource->mailbox.IsTexture()); |
| 1064 GLES2Interface* gl = ContextGL(); | 1041 GLES2Interface* gl = resource_helper_->ContextGL(); |
| 1065 DCHECK(gl); | 1042 DCHECK(gl); |
| 1066 if (resource->mailbox.sync_point()) { | 1043 if (resource->mailbox.sync_point()) { |
| 1067 GLC(gl, gl->WaitSyncPointCHROMIUM(resource->mailbox.sync_point())); | 1044 GLC(gl, gl->WaitSyncPointCHROMIUM(resource->mailbox.sync_point())); |
| 1068 resource->mailbox.set_sync_point(0); | 1045 resource->mailbox.set_sync_point(0); |
| 1069 } | 1046 } |
| 1070 resource->gl_id = texture_id_allocator_->NextId(); | 1047 resource->gl_id = texture_id_allocator_->NextId(); |
| 1071 GLC(gl, gl->BindTexture(resource->target, resource->gl_id)); | 1048 GLC(gl, gl->BindTexture(resource->target, resource->gl_id)); |
| 1072 GLC(gl, | 1049 GLC(gl, |
| 1073 gl->ConsumeTextureCHROMIUM(resource->mailbox.target(), | 1050 gl->ConsumeTextureCHROMIUM(resource->mailbox.target(), |
| 1074 resource->mailbox.name())); | 1051 resource->mailbox.name())); |
| (...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1222 ResourceProvider::PopulateSkBitmapWithResource( | 1199 ResourceProvider::PopulateSkBitmapWithResource( |
| 1223 &sk_bitmap_, resource_provider->LockForWrite(resource_id)); | 1200 &sk_bitmap_, resource_provider->LockForWrite(resource_id)); |
| 1224 DCHECK(valid()); | 1201 DCHECK(valid()); |
| 1225 sk_canvas_.reset(new SkCanvas(sk_bitmap_)); | 1202 sk_canvas_.reset(new SkCanvas(sk_bitmap_)); |
| 1226 } | 1203 } |
| 1227 | 1204 |
| 1228 ResourceProvider::ScopedWriteLockSoftware::~ScopedWriteLockSoftware() { | 1205 ResourceProvider::ScopedWriteLockSoftware::~ScopedWriteLockSoftware() { |
| 1229 resource_provider_->UnlockForWrite(resource_id_); | 1206 resource_provider_->UnlockForWrite(resource_id_); |
| 1230 } | 1207 } |
| 1231 | 1208 |
| 1232 ResourceProvider::ScopedGpuRaster::ScopedGpuRaster( | |
| 1233 ResourceProvider* resource_provider) | |
| 1234 : resource_provider_(resource_provider) { | |
| 1235 resource_provider_->BeginGpuRaster(); | |
| 1236 } | |
| 1237 | |
| 1238 ResourceProvider::ScopedGpuRaster::~ScopedGpuRaster() { | |
| 1239 resource_provider_->EndGpuRaster(); | |
| 1240 } | |
| 1241 | |
| 1242 ResourceProvider::ResourceProvider(OutputSurface* output_surface, | 1209 ResourceProvider::ResourceProvider(OutputSurface* output_surface, |
| 1243 SharedBitmapManager* shared_bitmap_manager, | 1210 SharedBitmapManager* shared_bitmap_manager, |
| 1244 int highp_threshold_min, | 1211 int highp_threshold_min, |
| 1245 bool use_rgba_4444_texture_format, | 1212 bool use_rgba_4444_texture_format, |
| 1246 size_t id_allocation_chunk_size, | 1213 size_t id_allocation_chunk_size, |
| 1247 bool use_distance_field_text) | 1214 bool use_distance_field_text) |
| 1248 : output_surface_(output_surface), | 1215 : output_surface_(output_surface), |
| 1249 shared_bitmap_manager_(shared_bitmap_manager), | 1216 shared_bitmap_manager_(shared_bitmap_manager), |
| 1250 lost_output_surface_(false), | 1217 lost_output_surface_(false), |
| 1251 highp_threshold_min_(highp_threshold_min), | 1218 highp_threshold_min_(highp_threshold_min), |
| 1252 next_id_(1), | 1219 next_id_(1), |
| 1253 next_child_(1), | 1220 next_child_(1), |
| 1254 default_resource_type_(InvalidType), | 1221 default_resource_type_(InvalidType), |
| 1255 use_texture_storage_ext_(false), | 1222 use_texture_storage_ext_(false), |
| 1256 use_texture_usage_hint_(false), | 1223 use_texture_usage_hint_(false), |
| 1257 use_compressed_texture_etc1_(false), | 1224 use_compressed_texture_etc1_(false), |
| 1258 max_texture_size_(0), | 1225 max_texture_size_(0), |
| 1259 best_texture_format_(RGBA_8888), | 1226 best_texture_format_(RGBA_8888), |
| 1260 use_rgba_4444_texture_format_(use_rgba_4444_texture_format), | 1227 use_rgba_4444_texture_format_(use_rgba_4444_texture_format), |
| 1261 id_allocation_chunk_size_(id_allocation_chunk_size), | 1228 id_allocation_chunk_size_(id_allocation_chunk_size), |
| 1262 use_sync_query_(false), | 1229 use_sync_query_(false), |
| 1263 use_distance_field_text_(use_distance_field_text) { | 1230 use_distance_field_text_(use_distance_field_text), |
| 1231 resource_helper_(new ResourceHelper(output_surface)) { | |
| 1264 DCHECK(output_surface_->HasClient()); | 1232 DCHECK(output_surface_->HasClient()); |
| 1265 DCHECK(id_allocation_chunk_size_); | 1233 DCHECK(id_allocation_chunk_size_); |
| 1266 } | 1234 } |
| 1267 | 1235 |
| 1268 void ResourceProvider::InitializeSoftware() { | 1236 void ResourceProvider::InitializeSoftware() { |
| 1269 DCHECK(thread_checker_.CalledOnValidThread()); | 1237 DCHECK(thread_checker_.CalledOnValidThread()); |
| 1270 DCHECK_NE(Bitmap, default_resource_type_); | 1238 DCHECK_NE(Bitmap, default_resource_type_); |
| 1271 | 1239 |
| 1272 CleanUpGLIfNeeded(); | 1240 CleanUpGLIfNeeded(); |
| 1273 | 1241 |
| (...skipping 14 matching lines...) Expand all Loading... | |
| 1288 | 1256 |
| 1289 const ContextProvider::Capabilities& caps = | 1257 const ContextProvider::Capabilities& caps = |
| 1290 output_surface_->context_provider()->ContextCapabilities(); | 1258 output_surface_->context_provider()->ContextCapabilities(); |
| 1291 | 1259 |
| 1292 bool use_bgra = caps.gpu.texture_format_bgra8888; | 1260 bool use_bgra = caps.gpu.texture_format_bgra8888; |
| 1293 use_texture_storage_ext_ = caps.gpu.texture_storage; | 1261 use_texture_storage_ext_ = caps.gpu.texture_storage; |
| 1294 use_texture_usage_hint_ = caps.gpu.texture_usage; | 1262 use_texture_usage_hint_ = caps.gpu.texture_usage; |
| 1295 use_compressed_texture_etc1_ = caps.gpu.texture_format_etc1; | 1263 use_compressed_texture_etc1_ = caps.gpu.texture_format_etc1; |
| 1296 use_sync_query_ = caps.gpu.sync_query; | 1264 use_sync_query_ = caps.gpu.sync_query; |
| 1297 | 1265 |
| 1298 GLES2Interface* gl = ContextGL(); | 1266 GLES2Interface* gl = resource_helper_->ContextGL(); |
| 1299 DCHECK(gl); | 1267 DCHECK(gl); |
| 1300 | 1268 |
| 1301 texture_uploader_ = TextureUploader::Create(gl); | 1269 texture_uploader_ = TextureUploader::Create(gl); |
| 1302 max_texture_size_ = 0; // Context expects cleared value. | 1270 max_texture_size_ = 0; // Context expects cleared value. |
| 1303 GLC(gl, gl->GetIntegerv(GL_MAX_TEXTURE_SIZE, &max_texture_size_)); | 1271 GLC(gl, gl->GetIntegerv(GL_MAX_TEXTURE_SIZE, &max_texture_size_)); |
| 1304 best_texture_format_ = PlatformColor::BestTextureFormat(use_bgra); | 1272 best_texture_format_ = PlatformColor::BestTextureFormat(use_bgra); |
| 1305 | 1273 |
| 1306 texture_id_allocator_.reset( | 1274 texture_id_allocator_.reset( |
| 1307 new TextureIdAllocator(gl, id_allocation_chunk_size_)); | 1275 new TextureIdAllocator(gl, id_allocation_chunk_size_)); |
| 1308 buffer_id_allocator_.reset( | 1276 buffer_id_allocator_.reset( |
| 1309 new BufferIdAllocator(gl, id_allocation_chunk_size_)); | 1277 new BufferIdAllocator(gl, id_allocation_chunk_size_)); |
| 1310 } | 1278 } |
| 1311 | 1279 |
| 1312 void ResourceProvider::CleanUpGLIfNeeded() { | 1280 void ResourceProvider::CleanUpGLIfNeeded() { |
| 1313 GLES2Interface* gl = ContextGL(); | 1281 GLES2Interface* gl = resource_helper_->ContextGL(); |
| 1314 if (default_resource_type_ != GLTexture) { | 1282 if (default_resource_type_ != GLTexture) { |
| 1315 // We are not in GL mode, but double check before returning. | 1283 // We are not in GL mode, but double check before returning. |
| 1316 DCHECK(!gl); | 1284 DCHECK(!gl); |
| 1317 DCHECK(!texture_uploader_); | 1285 DCHECK(!texture_uploader_); |
| 1318 return; | 1286 return; |
| 1319 } | 1287 } |
| 1320 | 1288 |
| 1321 DCHECK(gl); | 1289 DCHECK(gl); |
| 1322 #if DCHECK_IS_ON | 1290 #if DCHECK_IS_ON |
| 1323 // Check that all GL resources has been deleted. | 1291 // Check that all GL resources has been deleted. |
| 1324 for (ResourceMap::const_iterator itr = resources_.begin(); | 1292 for (ResourceMap::const_iterator itr = resources_.begin(); |
| 1325 itr != resources_.end(); | 1293 itr != resources_.end(); |
| 1326 ++itr) { | 1294 ++itr) { |
| 1327 DCHECK_NE(GLTexture, itr->second.type); | 1295 DCHECK_NE(GLTexture, itr->second.type); |
| 1328 } | 1296 } |
| 1329 #endif // DCHECK_IS_ON | 1297 #endif // DCHECK_IS_ON |
| 1330 | 1298 |
| 1331 texture_uploader_.reset(); | 1299 texture_uploader_.reset(); |
| 1332 texture_id_allocator_.reset(); | 1300 texture_id_allocator_.reset(); |
| 1333 buffer_id_allocator_.reset(); | 1301 buffer_id_allocator_.reset(); |
| 1334 Finish(); | 1302 GetResourceHelper()->Finish(); |
|
danakj
2014/07/09 16:01:33
can we just call gl->Finish() directly?
sohanjg
2014/07/10 15:11:06
Done.
| |
| 1335 } | 1303 } |
| 1336 | 1304 |
| 1337 int ResourceProvider::CreateChild(const ReturnCallback& return_callback) { | 1305 int ResourceProvider::CreateChild(const ReturnCallback& return_callback) { |
| 1338 DCHECK(thread_checker_.CalledOnValidThread()); | 1306 DCHECK(thread_checker_.CalledOnValidThread()); |
| 1339 | 1307 |
| 1340 Child child_info; | 1308 Child child_info; |
| 1341 child_info.return_callback = return_callback; | 1309 child_info.return_callback = return_callback; |
| 1342 | 1310 |
| 1343 int child = next_child_++; | 1311 int child = next_child_++; |
| 1344 children_[child] = child_info; | 1312 children_[child] = child_info; |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1379 DCHECK(thread_checker_.CalledOnValidThread()); | 1347 DCHECK(thread_checker_.CalledOnValidThread()); |
| 1380 ChildMap::const_iterator it = children_.find(child); | 1348 ChildMap::const_iterator it = children_.find(child); |
| 1381 DCHECK(it != children_.end()); | 1349 DCHECK(it != children_.end()); |
| 1382 DCHECK(!it->second.marked_for_deletion); | 1350 DCHECK(!it->second.marked_for_deletion); |
| 1383 return it->second.child_to_parent_map; | 1351 return it->second.child_to_parent_map; |
| 1384 } | 1352 } |
| 1385 | 1353 |
| 1386 void ResourceProvider::PrepareSendToParent(const ResourceIdArray& resources, | 1354 void ResourceProvider::PrepareSendToParent(const ResourceIdArray& resources, |
| 1387 TransferableResourceArray* list) { | 1355 TransferableResourceArray* list) { |
| 1388 DCHECK(thread_checker_.CalledOnValidThread()); | 1356 DCHECK(thread_checker_.CalledOnValidThread()); |
| 1389 GLES2Interface* gl = ContextGL(); | 1357 GLES2Interface* gl = resource_helper_->ContextGL(); |
| 1390 bool need_sync_point = false; | 1358 bool need_sync_point = false; |
| 1391 for (ResourceIdArray::const_iterator it = resources.begin(); | 1359 for (ResourceIdArray::const_iterator it = resources.begin(); |
| 1392 it != resources.end(); | 1360 it != resources.end(); |
| 1393 ++it) { | 1361 ++it) { |
| 1394 TransferableResource resource; | 1362 TransferableResource resource; |
| 1395 TransferResource(gl, *it, &resource); | 1363 TransferResource(gl, *it, &resource); |
| 1396 if (!resource.mailbox_holder.sync_point && !resource.is_software) | 1364 if (!resource.mailbox_holder.sync_point && !resource.is_software) |
| 1397 need_sync_point = true; | 1365 need_sync_point = true; |
| 1398 ++resources_.find(*it)->second.exported_count; | 1366 ++resources_.find(*it)->second.exported_count; |
| 1399 list->push_back(resource); | 1367 list->push_back(resource); |
| 1400 } | 1368 } |
| 1401 if (need_sync_point) { | 1369 if (need_sync_point) { |
| 1402 GLuint sync_point = gl->InsertSyncPointCHROMIUM(); | 1370 GLuint sync_point = gl->InsertSyncPointCHROMIUM(); |
| 1403 for (TransferableResourceArray::iterator it = list->begin(); | 1371 for (TransferableResourceArray::iterator it = list->begin(); |
| 1404 it != list->end(); | 1372 it != list->end(); |
| 1405 ++it) { | 1373 ++it) { |
| 1406 if (!it->mailbox_holder.sync_point) | 1374 if (!it->mailbox_holder.sync_point) |
| 1407 it->mailbox_holder.sync_point = sync_point; | 1375 it->mailbox_holder.sync_point = sync_point; |
| 1408 } | 1376 } |
| 1409 } | 1377 } |
| 1410 } | 1378 } |
| 1411 | 1379 |
| 1412 void ResourceProvider::ReceiveFromChild( | 1380 void ResourceProvider::ReceiveFromChild( |
| 1413 int child, const TransferableResourceArray& resources) { | 1381 int child, const TransferableResourceArray& resources) { |
| 1414 DCHECK(thread_checker_.CalledOnValidThread()); | 1382 DCHECK(thread_checker_.CalledOnValidThread()); |
| 1415 GLES2Interface* gl = ContextGL(); | 1383 GLES2Interface* gl = resource_helper_->ContextGL(); |
| 1416 Child& child_info = children_.find(child)->second; | 1384 Child& child_info = children_.find(child)->second; |
| 1417 DCHECK(!child_info.marked_for_deletion); | 1385 DCHECK(!child_info.marked_for_deletion); |
| 1418 for (TransferableResourceArray::const_iterator it = resources.begin(); | 1386 for (TransferableResourceArray::const_iterator it = resources.begin(); |
| 1419 it != resources.end(); | 1387 it != resources.end(); |
| 1420 ++it) { | 1388 ++it) { |
| 1421 ResourceIdMap::iterator resource_in_map_it = | 1389 ResourceIdMap::iterator resource_in_map_it = |
| 1422 child_info.child_to_parent_map.find(it->id); | 1390 child_info.child_to_parent_map.find(it->id); |
| 1423 if (resource_in_map_it != child_info.child_to_parent_map.end()) { | 1391 if (resource_in_map_it != child_info.child_to_parent_map.end()) { |
| 1424 Resource& resource = resources_[resource_in_map_it->second]; | 1392 Resource& resource = resources_[resource_in_map_it->second]; |
| 1425 resource.marked_for_deletion = false; | 1393 resource.marked_for_deletion = false; |
| (...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1507 const ResourceMap::iterator& a_it = a.second; | 1475 const ResourceMap::iterator& a_it = a.second; |
| 1508 const ResourceMap::iterator& b_it = b.second; | 1476 const ResourceMap::iterator& b_it = b.second; |
| 1509 const Resource& a_resource = a_it->second; | 1477 const Resource& a_resource = a_it->second; |
| 1510 const Resource& b_resource = b_it->second; | 1478 const Resource& b_resource = b_it->second; |
| 1511 return a_resource.child_id < b_resource.child_id; | 1479 return a_resource.child_id < b_resource.child_id; |
| 1512 } | 1480 } |
| 1513 | 1481 |
| 1514 void ResourceProvider::ReceiveReturnsFromParent( | 1482 void ResourceProvider::ReceiveReturnsFromParent( |
| 1515 const ReturnedResourceArray& resources) { | 1483 const ReturnedResourceArray& resources) { |
| 1516 DCHECK(thread_checker_.CalledOnValidThread()); | 1484 DCHECK(thread_checker_.CalledOnValidThread()); |
| 1517 GLES2Interface* gl = ContextGL(); | 1485 GLES2Interface* gl = resource_helper_->ContextGL(); |
| 1518 | 1486 |
| 1519 int child_id = 0; | 1487 int child_id = 0; |
| 1520 ResourceIdArray resources_for_child; | 1488 ResourceIdArray resources_for_child; |
| 1521 | 1489 |
| 1522 std::vector<std::pair<ReturnedResource, ResourceMap::iterator> > | 1490 std::vector<std::pair<ReturnedResource, ResourceMap::iterator> > |
| 1523 sorted_resources; | 1491 sorted_resources; |
| 1524 | 1492 |
| 1525 for (ReturnedResourceArray::const_iterator it = resources.begin(); | 1493 for (ReturnedResourceArray::const_iterator it = resources.begin(); |
| 1526 it != resources.end(); | 1494 it != resources.end(); |
| 1527 ++it) { | 1495 ++it) { |
| (...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1666 const ResourceIdArray& unused) { | 1634 const ResourceIdArray& unused) { |
| 1667 DCHECK(thread_checker_.CalledOnValidThread()); | 1635 DCHECK(thread_checker_.CalledOnValidThread()); |
| 1668 DCHECK(child_it != children_.end()); | 1636 DCHECK(child_it != children_.end()); |
| 1669 Child* child_info = &child_it->second; | 1637 Child* child_info = &child_it->second; |
| 1670 | 1638 |
| 1671 if (unused.empty() && !child_info->marked_for_deletion) | 1639 if (unused.empty() && !child_info->marked_for_deletion) |
| 1672 return; | 1640 return; |
| 1673 | 1641 |
| 1674 ReturnedResourceArray to_return; | 1642 ReturnedResourceArray to_return; |
| 1675 | 1643 |
| 1676 GLES2Interface* gl = ContextGL(); | 1644 GLES2Interface* gl = resource_helper_->ContextGL(); |
| 1677 bool need_sync_point = false; | 1645 bool need_sync_point = false; |
| 1678 for (size_t i = 0; i < unused.size(); ++i) { | 1646 for (size_t i = 0; i < unused.size(); ++i) { |
| 1679 ResourceId local_id = unused[i]; | 1647 ResourceId local_id = unused[i]; |
| 1680 | 1648 |
| 1681 ResourceMap::iterator it = resources_.find(local_id); | 1649 ResourceMap::iterator it = resources_.find(local_id); |
| 1682 CHECK(it != resources_.end()); | 1650 CHECK(it != resources_.end()); |
| 1683 Resource& resource = it->second; | 1651 Resource& resource = it->second; |
| 1684 | 1652 |
| 1685 DCHECK(!resource.locked_for_write); | 1653 DCHECK(!resource.locked_for_write); |
| 1686 DCHECK_EQ(0u, child_info->in_use_resources.count(local_id)); | 1654 DCHECK_EQ(0u, child_info->in_use_resources.count(local_id)); |
| (...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1811 void ResourceProvider::AcquirePixelBuffer(Resource* resource) { | 1779 void ResourceProvider::AcquirePixelBuffer(Resource* resource) { |
| 1812 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"), | 1780 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"), |
| 1813 "ResourceProvider::AcquirePixelBuffer"); | 1781 "ResourceProvider::AcquirePixelBuffer"); |
| 1814 | 1782 |
| 1815 DCHECK(resource->origin == Resource::Internal); | 1783 DCHECK(resource->origin == Resource::Internal); |
| 1816 DCHECK_EQ(resource->exported_count, 0); | 1784 DCHECK_EQ(resource->exported_count, 0); |
| 1817 DCHECK(!resource->image_id); | 1785 DCHECK(!resource->image_id); |
| 1818 DCHECK_NE(ETC1, resource->format); | 1786 DCHECK_NE(ETC1, resource->format); |
| 1819 | 1787 |
| 1820 DCHECK_EQ(GLTexture, resource->type); | 1788 DCHECK_EQ(GLTexture, resource->type); |
| 1821 GLES2Interface* gl = ContextGL(); | 1789 GLES2Interface* gl = resource_helper_->ContextGL(); |
| 1822 DCHECK(gl); | 1790 DCHECK(gl); |
| 1823 if (!resource->gl_pixel_buffer_id) | 1791 if (!resource->gl_pixel_buffer_id) |
| 1824 resource->gl_pixel_buffer_id = buffer_id_allocator_->NextId(); | 1792 resource->gl_pixel_buffer_id = buffer_id_allocator_->NextId(); |
| 1825 gl->BindBuffer(GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, | 1793 gl->BindBuffer(GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, |
| 1826 resource->gl_pixel_buffer_id); | 1794 resource->gl_pixel_buffer_id); |
| 1827 unsigned bytes_per_pixel = BitsPerPixel(resource->format) / 8; | 1795 unsigned bytes_per_pixel = BitsPerPixel(resource->format) / 8; |
| 1828 gl->BufferData(GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, | 1796 gl->BufferData(GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, |
| 1829 resource->size.height() * | 1797 resource->size.height() * |
| 1830 RoundUp(bytes_per_pixel * resource->size.width(), 4u), | 1798 RoundUp(bytes_per_pixel * resource->size.width(), 4u), |
| 1831 NULL, | 1799 NULL, |
| (...skipping 17 matching lines...) Expand all Loading... | |
| 1849 // as each new query has a unique submit count. | 1817 // as each new query has a unique submit count. |
| 1850 if (resource->pending_set_pixels) { | 1818 if (resource->pending_set_pixels) { |
| 1851 DCHECK(resource->set_pixels_completion_forced); | 1819 DCHECK(resource->set_pixels_completion_forced); |
| 1852 resource->pending_set_pixels = false; | 1820 resource->pending_set_pixels = false; |
| 1853 resource->locked_for_write = false; | 1821 resource->locked_for_write = false; |
| 1854 } | 1822 } |
| 1855 | 1823 |
| 1856 DCHECK_EQ(GLTexture, resource->type); | 1824 DCHECK_EQ(GLTexture, resource->type); |
| 1857 if (!resource->gl_pixel_buffer_id) | 1825 if (!resource->gl_pixel_buffer_id) |
| 1858 return; | 1826 return; |
| 1859 GLES2Interface* gl = ContextGL(); | 1827 GLES2Interface* gl = resource_helper_->ContextGL(); |
| 1860 DCHECK(gl); | 1828 DCHECK(gl); |
| 1861 gl->BindBuffer(GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, | 1829 gl->BindBuffer(GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, |
| 1862 resource->gl_pixel_buffer_id); | 1830 resource->gl_pixel_buffer_id); |
| 1863 gl->BufferData( | 1831 gl->BufferData( |
| 1864 GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, 0, NULL, GL_DYNAMIC_DRAW); | 1832 GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, 0, NULL, GL_DYNAMIC_DRAW); |
| 1865 gl->BindBuffer(GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, 0); | 1833 gl->BindBuffer(GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, 0); |
| 1866 } | 1834 } |
| 1867 | 1835 |
| 1868 uint8_t* ResourceProvider::MapPixelBuffer(const Resource* resource, | 1836 uint8_t* ResourceProvider::MapPixelBuffer(const Resource* resource, |
| 1869 int* stride) { | 1837 int* stride) { |
| 1870 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"), | 1838 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"), |
| 1871 "ResourceProvider::MapPixelBuffer"); | 1839 "ResourceProvider::MapPixelBuffer"); |
| 1872 | 1840 |
| 1873 DCHECK(resource->origin == Resource::Internal); | 1841 DCHECK(resource->origin == Resource::Internal); |
| 1874 DCHECK_EQ(resource->exported_count, 0); | 1842 DCHECK_EQ(resource->exported_count, 0); |
| 1875 DCHECK(!resource->image_id); | 1843 DCHECK(!resource->image_id); |
| 1876 | 1844 |
| 1877 *stride = 0; | 1845 *stride = 0; |
| 1878 DCHECK_EQ(GLTexture, resource->type); | 1846 DCHECK_EQ(GLTexture, resource->type); |
| 1879 GLES2Interface* gl = ContextGL(); | 1847 GLES2Interface* gl = resource_helper_->ContextGL(); |
| 1880 DCHECK(gl); | 1848 DCHECK(gl); |
| 1881 DCHECK(resource->gl_pixel_buffer_id); | 1849 DCHECK(resource->gl_pixel_buffer_id); |
| 1882 gl->BindBuffer(GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, | 1850 gl->BindBuffer(GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, |
| 1883 resource->gl_pixel_buffer_id); | 1851 resource->gl_pixel_buffer_id); |
| 1884 uint8_t* image = static_cast<uint8_t*>(gl->MapBufferCHROMIUM( | 1852 uint8_t* image = static_cast<uint8_t*>(gl->MapBufferCHROMIUM( |
| 1885 GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, GL_WRITE_ONLY)); | 1853 GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, GL_WRITE_ONLY)); |
| 1886 gl->BindBuffer(GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, 0); | 1854 gl->BindBuffer(GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, 0); |
| 1887 // Buffer is required to be 4-byte aligned. | 1855 // Buffer is required to be 4-byte aligned. |
| 1888 CHECK(!(reinterpret_cast<intptr_t>(image) & 3)); | 1856 CHECK(!(reinterpret_cast<intptr_t>(image) & 3)); |
| 1889 return image; | 1857 return image; |
| 1890 } | 1858 } |
| 1891 | 1859 |
| 1892 void ResourceProvider::UnmapPixelBuffer(const Resource* resource) { | 1860 void ResourceProvider::UnmapPixelBuffer(const Resource* resource) { |
| 1893 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"), | 1861 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"), |
| 1894 "ResourceProvider::UnmapPixelBuffer"); | 1862 "ResourceProvider::UnmapPixelBuffer"); |
| 1895 | 1863 |
| 1896 DCHECK(resource->origin == Resource::Internal); | 1864 DCHECK(resource->origin == Resource::Internal); |
| 1897 DCHECK_EQ(resource->exported_count, 0); | 1865 DCHECK_EQ(resource->exported_count, 0); |
| 1898 DCHECK(!resource->image_id); | 1866 DCHECK(!resource->image_id); |
| 1899 | 1867 |
| 1900 DCHECK_EQ(GLTexture, resource->type); | 1868 DCHECK_EQ(GLTexture, resource->type); |
| 1901 GLES2Interface* gl = ContextGL(); | 1869 GLES2Interface* gl = resource_helper_->ContextGL(); |
| 1902 DCHECK(gl); | 1870 DCHECK(gl); |
| 1903 DCHECK(resource->gl_pixel_buffer_id); | 1871 DCHECK(resource->gl_pixel_buffer_id); |
| 1904 gl->BindBuffer(GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, | 1872 gl->BindBuffer(GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, |
| 1905 resource->gl_pixel_buffer_id); | 1873 resource->gl_pixel_buffer_id); |
| 1906 gl->UnmapBufferCHROMIUM(GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM); | 1874 gl->UnmapBufferCHROMIUM(GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM); |
| 1907 gl->BindBuffer(GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, 0); | 1875 gl->BindBuffer(GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, 0); |
| 1908 } | 1876 } |
| 1909 | 1877 |
| 1910 GLenum ResourceProvider::BindForSampling( | 1878 GLenum ResourceProvider::BindForSampling( |
| 1911 ResourceProvider::ResourceId resource_id, | 1879 ResourceProvider::ResourceId resource_id, |
| 1912 GLenum unit, | 1880 GLenum unit, |
| 1913 GLenum filter) { | 1881 GLenum filter) { |
| 1914 DCHECK(thread_checker_.CalledOnValidThread()); | 1882 DCHECK(thread_checker_.CalledOnValidThread()); |
| 1915 GLES2Interface* gl = ContextGL(); | 1883 GLES2Interface* gl = resource_helper_->ContextGL(); |
| 1916 ResourceMap::iterator it = resources_.find(resource_id); | 1884 ResourceMap::iterator it = resources_.find(resource_id); |
| 1917 DCHECK(it != resources_.end()); | 1885 DCHECK(it != resources_.end()); |
| 1918 Resource* resource = &it->second; | 1886 Resource* resource = &it->second; |
| 1919 DCHECK(resource->lock_for_read_count); | 1887 DCHECK(resource->lock_for_read_count); |
| 1920 DCHECK(!resource->locked_for_write || resource->set_pixels_completion_forced); | 1888 DCHECK(!resource->locked_for_write || resource->set_pixels_completion_forced); |
| 1921 | 1889 |
| 1922 ScopedSetActiveTexture scoped_active_tex(gl, unit); | 1890 ScopedSetActiveTexture scoped_active_tex(gl, unit); |
| 1923 GLenum target = resource->target; | 1891 GLenum target = resource->target; |
| 1924 GLC(gl, gl->BindTexture(target, resource->gl_id)); | 1892 GLC(gl, gl->BindTexture(target, resource->gl_id)); |
| 1925 if (filter != resource->filter) { | 1893 if (filter != resource->filter) { |
| (...skipping 20 matching lines...) Expand all Loading... | |
| 1946 DCHECK(resource->gl_id || resource->allocated); | 1914 DCHECK(resource->gl_id || resource->allocated); |
| 1947 DCHECK(ReadLockFenceHasPassed(resource)); | 1915 DCHECK(ReadLockFenceHasPassed(resource)); |
| 1948 DCHECK(!resource->image_id); | 1916 DCHECK(!resource->image_id); |
| 1949 | 1917 |
| 1950 bool allocate = !resource->allocated; | 1918 bool allocate = !resource->allocated; |
| 1951 resource->allocated = true; | 1919 resource->allocated = true; |
| 1952 LockForWrite(id); | 1920 LockForWrite(id); |
| 1953 | 1921 |
| 1954 DCHECK_EQ(GLTexture, resource->type); | 1922 DCHECK_EQ(GLTexture, resource->type); |
| 1955 DCHECK(resource->gl_id); | 1923 DCHECK(resource->gl_id); |
| 1956 GLES2Interface* gl = ContextGL(); | 1924 GLES2Interface* gl = resource_helper_->ContextGL(); |
| 1957 DCHECK(gl); | 1925 DCHECK(gl); |
| 1958 DCHECK(resource->gl_pixel_buffer_id); | 1926 DCHECK(resource->gl_pixel_buffer_id); |
| 1959 DCHECK_EQ(resource->target, static_cast<GLenum>(GL_TEXTURE_2D)); | 1927 DCHECK_EQ(resource->target, static_cast<GLenum>(GL_TEXTURE_2D)); |
| 1960 gl->BindTexture(GL_TEXTURE_2D, resource->gl_id); | 1928 gl->BindTexture(GL_TEXTURE_2D, resource->gl_id); |
| 1961 gl->BindBuffer(GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, | 1929 gl->BindBuffer(GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, |
| 1962 resource->gl_pixel_buffer_id); | 1930 resource->gl_pixel_buffer_id); |
| 1963 if (!resource->gl_upload_query_id) | 1931 if (!resource->gl_upload_query_id) |
| 1964 gl->GenQueriesEXT(1, &resource->gl_upload_query_id); | 1932 gl->GenQueriesEXT(1, &resource->gl_upload_query_id); |
| 1965 gl->BeginQueryEXT(GL_ASYNC_PIXEL_UNPACK_COMPLETED_CHROMIUM, | 1933 gl->BeginQueryEXT(GL_ASYNC_PIXEL_UNPACK_COMPLETED_CHROMIUM, |
| 1966 resource->gl_upload_query_id); | 1934 resource->gl_upload_query_id); |
| (...skipping 28 matching lines...) Expand all Loading... | |
| 1995 void ResourceProvider::ForceSetPixelsToComplete(ResourceId id) { | 1963 void ResourceProvider::ForceSetPixelsToComplete(ResourceId id) { |
| 1996 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"), | 1964 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"), |
| 1997 "ResourceProvider::ForceSetPixelsToComplete"); | 1965 "ResourceProvider::ForceSetPixelsToComplete"); |
| 1998 | 1966 |
| 1999 Resource* resource = GetResource(id); | 1967 Resource* resource = GetResource(id); |
| 2000 DCHECK(resource->locked_for_write); | 1968 DCHECK(resource->locked_for_write); |
| 2001 DCHECK(resource->pending_set_pixels); | 1969 DCHECK(resource->pending_set_pixels); |
| 2002 DCHECK(!resource->set_pixels_completion_forced); | 1970 DCHECK(!resource->set_pixels_completion_forced); |
| 2003 | 1971 |
| 2004 if (resource->gl_id) { | 1972 if (resource->gl_id) { |
| 2005 GLES2Interface* gl = ContextGL(); | 1973 GLES2Interface* gl = resource_helper_->ContextGL(); |
| 2006 GLC(gl, gl->BindTexture(GL_TEXTURE_2D, resource->gl_id)); | 1974 GLC(gl, gl->BindTexture(GL_TEXTURE_2D, resource->gl_id)); |
| 2007 GLC(gl, gl->WaitAsyncTexImage2DCHROMIUM(GL_TEXTURE_2D)); | 1975 GLC(gl, gl->WaitAsyncTexImage2DCHROMIUM(GL_TEXTURE_2D)); |
| 2008 GLC(gl, gl->BindTexture(GL_TEXTURE_2D, 0)); | 1976 GLC(gl, gl->BindTexture(GL_TEXTURE_2D, 0)); |
| 2009 } | 1977 } |
| 2010 | 1978 |
| 2011 resource->set_pixels_completion_forced = true; | 1979 resource->set_pixels_completion_forced = true; |
| 2012 } | 1980 } |
| 2013 | 1981 |
| 2014 bool ResourceProvider::DidSetPixelsComplete(ResourceId id) { | 1982 bool ResourceProvider::DidSetPixelsComplete(ResourceId id) { |
| 2015 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"), | 1983 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"), |
| 2016 "ResourceProvider::DidSetPixelsComplete"); | 1984 "ResourceProvider::DidSetPixelsComplete"); |
| 2017 | 1985 |
| 2018 Resource* resource = GetResource(id); | 1986 Resource* resource = GetResource(id); |
| 2019 DCHECK(resource->locked_for_write); | 1987 DCHECK(resource->locked_for_write); |
| 2020 DCHECK(resource->pending_set_pixels); | 1988 DCHECK(resource->pending_set_pixels); |
| 2021 | 1989 |
| 2022 if (resource->gl_id) { | 1990 if (resource->gl_id) { |
| 2023 GLES2Interface* gl = ContextGL(); | 1991 GLES2Interface* gl = resource_helper_->ContextGL(); |
| 2024 DCHECK(gl); | 1992 DCHECK(gl); |
| 2025 DCHECK(resource->gl_upload_query_id); | 1993 DCHECK(resource->gl_upload_query_id); |
| 2026 GLuint complete = 1; | 1994 GLuint complete = 1; |
| 2027 gl->GetQueryObjectuivEXT( | 1995 gl->GetQueryObjectuivEXT( |
| 2028 resource->gl_upload_query_id, GL_QUERY_RESULT_AVAILABLE_EXT, &complete); | 1996 resource->gl_upload_query_id, GL_QUERY_RESULT_AVAILABLE_EXT, &complete); |
| 2029 if (!complete) | 1997 if (!complete) |
| 2030 return false; | 1998 return false; |
| 2031 } | 1999 } |
| 2032 | 2000 |
| 2033 resource->pending_set_pixels = false; | 2001 resource->pending_set_pixels = false; |
| (...skipping 16 matching lines...) Expand all Loading... | |
| 2050 return; | 2018 return; |
| 2051 | 2019 |
| 2052 if (resource->gl_id) | 2020 if (resource->gl_id) |
| 2053 return; | 2021 return; |
| 2054 | 2022 |
| 2055 DCHECK(resource->texture_pool); | 2023 DCHECK(resource->texture_pool); |
| 2056 DCHECK(resource->origin == Resource::Internal); | 2024 DCHECK(resource->origin == Resource::Internal); |
| 2057 DCHECK(!resource->mailbox.IsValid()); | 2025 DCHECK(!resource->mailbox.IsValid()); |
| 2058 resource->gl_id = texture_id_allocator_->NextId(); | 2026 resource->gl_id = texture_id_allocator_->NextId(); |
| 2059 | 2027 |
| 2060 GLES2Interface* gl = ContextGL(); | 2028 GLES2Interface* gl = resource_helper_->ContextGL(); |
| 2061 DCHECK(gl); | 2029 DCHECK(gl); |
| 2062 | 2030 |
| 2063 // Create and set texture properties. Allocation is delayed until needed. | 2031 // Create and set texture properties. Allocation is delayed until needed. |
| 2064 GLC(gl, gl->BindTexture(resource->target, resource->gl_id)); | 2032 GLC(gl, gl->BindTexture(resource->target, resource->gl_id)); |
| 2065 GLC(gl, | 2033 GLC(gl, |
| 2066 gl->TexParameteri(resource->target, GL_TEXTURE_MIN_FILTER, GL_LINEAR)); | 2034 gl->TexParameteri(resource->target, GL_TEXTURE_MIN_FILTER, GL_LINEAR)); |
| 2067 GLC(gl, | 2035 GLC(gl, |
| 2068 gl->TexParameteri(resource->target, GL_TEXTURE_MAG_FILTER, GL_LINEAR)); | 2036 gl->TexParameteri(resource->target, GL_TEXTURE_MAG_FILTER, GL_LINEAR)); |
| 2069 GLC(gl, | 2037 GLC(gl, |
| 2070 gl->TexParameteri( | 2038 gl->TexParameteri( |
| (...skipping 17 matching lines...) Expand all Loading... | |
| 2088 } | 2056 } |
| 2089 | 2057 |
| 2090 void ResourceProvider::LazyAllocate(Resource* resource) { | 2058 void ResourceProvider::LazyAllocate(Resource* resource) { |
| 2091 DCHECK(resource); | 2059 DCHECK(resource); |
| 2092 LazyCreate(resource); | 2060 LazyCreate(resource); |
| 2093 | 2061 |
| 2094 DCHECK(resource->gl_id || resource->allocated); | 2062 DCHECK(resource->gl_id || resource->allocated); |
| 2095 if (resource->allocated || !resource->gl_id) | 2063 if (resource->allocated || !resource->gl_id) |
| 2096 return; | 2064 return; |
| 2097 resource->allocated = true; | 2065 resource->allocated = true; |
| 2098 GLES2Interface* gl = ContextGL(); | 2066 GLES2Interface* gl = resource_helper_->ContextGL(); |
| 2099 gfx::Size& size = resource->size; | 2067 gfx::Size& size = resource->size; |
| 2100 DCHECK_EQ(resource->target, static_cast<GLenum>(GL_TEXTURE_2D)); | 2068 DCHECK_EQ(resource->target, static_cast<GLenum>(GL_TEXTURE_2D)); |
| 2101 ResourceFormat format = resource->format; | 2069 ResourceFormat format = resource->format; |
| 2102 GLC(gl, gl->BindTexture(GL_TEXTURE_2D, resource->gl_id)); | 2070 GLC(gl, gl->BindTexture(GL_TEXTURE_2D, resource->gl_id)); |
| 2103 if (use_texture_storage_ext_ && IsFormatSupportedForStorage(format) && | 2071 if (use_texture_storage_ext_ && IsFormatSupportedForStorage(format) && |
| 2104 resource->hint != TextureUsageFramebuffer) { | 2072 resource->hint != TextureUsageFramebuffer) { |
| 2105 GLenum storage_format = TextureToStorageFormat(format); | 2073 GLenum storage_format = TextureToStorageFormat(format); |
| 2106 GLC(gl, | 2074 GLC(gl, |
| 2107 gl->TexStorage2DEXT( | 2075 gl->TexStorage2DEXT( |
| 2108 GL_TEXTURE_2D, 1, storage_format, size.width(), size.height())); | 2076 GL_TEXTURE_2D, 1, storage_format, size.width(), size.height())); |
| 2109 } else { | 2077 } else { |
| 2110 // ETC1 does not support preallocation. | 2078 // ETC1 does not support preallocation. |
| 2111 if (format != ETC1) { | 2079 if (format != ETC1) { |
| 2112 GLC(gl, | 2080 GLC(gl, |
| 2113 gl->TexImage2D(GL_TEXTURE_2D, | 2081 gl->TexImage2D(GL_TEXTURE_2D, |
| 2114 0, | 2082 0, |
| 2115 GLInternalFormat(format), | 2083 GLInternalFormat(format), |
| 2116 size.width(), | 2084 size.width(), |
| 2117 size.height(), | 2085 size.height(), |
| 2118 0, | 2086 0, |
| 2119 GLDataFormat(format), | 2087 GLDataFormat(format), |
| 2120 GLDataType(format), | 2088 GLDataType(format), |
| 2121 NULL)); | 2089 NULL)); |
| 2122 } | 2090 } |
| 2123 } | 2091 } |
| 2124 } | 2092 } |
| 2125 | 2093 |
| 2126 void ResourceProvider::BindImageForSampling(Resource* resource) { | 2094 void ResourceProvider::BindImageForSampling(Resource* resource) { |
| 2127 GLES2Interface* gl = ContextGL(); | 2095 GLES2Interface* gl = resource_helper_->ContextGL(); |
| 2128 DCHECK(resource->gl_id); | 2096 DCHECK(resource->gl_id); |
| 2129 DCHECK(resource->image_id); | 2097 DCHECK(resource->image_id); |
| 2130 | 2098 |
| 2131 // Release image currently bound to texture. | 2099 // Release image currently bound to texture. |
| 2132 if (resource->bound_image_id) | 2100 if (resource->bound_image_id) |
| 2133 gl->ReleaseTexImage2DCHROMIUM(resource->target, resource->bound_image_id); | 2101 gl->ReleaseTexImage2DCHROMIUM(resource->target, resource->bound_image_id); |
| 2134 gl->BindTexImage2DCHROMIUM(resource->target, resource->image_id); | 2102 gl->BindTexImage2DCHROMIUM(resource->target, resource->image_id); |
| 2135 resource->bound_image_id = resource->image_id; | 2103 resource->bound_image_id = resource->image_id; |
| 2136 resource->dirty_image = false; | 2104 resource->dirty_image = false; |
| 2137 } | 2105 } |
| 2138 | 2106 |
| 2139 void ResourceProvider::EnableReadLockFences(ResourceProvider::ResourceId id, | 2107 void ResourceProvider::EnableReadLockFences(ResourceProvider::ResourceId id, |
| 2140 bool enable) { | 2108 bool enable) { |
| 2141 Resource* resource = GetResource(id); | 2109 Resource* resource = GetResource(id); |
| 2142 resource->enable_read_lock_fences = enable; | 2110 resource->enable_read_lock_fences = enable; |
| 2143 } | 2111 } |
| 2144 | 2112 |
| 2145 void ResourceProvider::AcquireImage(Resource* resource) { | 2113 void ResourceProvider::AcquireImage(Resource* resource) { |
| 2146 DCHECK(resource->origin == Resource::Internal); | 2114 DCHECK(resource->origin == Resource::Internal); |
| 2147 DCHECK_EQ(resource->exported_count, 0); | 2115 DCHECK_EQ(resource->exported_count, 0); |
| 2148 | 2116 |
| 2149 if (resource->type != GLTexture) | 2117 if (resource->type != GLTexture) |
| 2150 return; | 2118 return; |
| 2151 | 2119 |
| 2152 if (resource->image_id) | 2120 if (resource->image_id) |
| 2153 return; | 2121 return; |
| 2154 | 2122 |
| 2155 resource->allocated = true; | 2123 resource->allocated = true; |
| 2156 GLES2Interface* gl = ContextGL(); | 2124 GLES2Interface* gl = resource_helper_->ContextGL(); |
| 2157 DCHECK(gl); | 2125 DCHECK(gl); |
| 2158 resource->image_id = | 2126 resource->image_id = |
| 2159 gl->CreateImageCHROMIUM(resource->size.width(), | 2127 gl->CreateImageCHROMIUM(resource->size.width(), |
| 2160 resource->size.height(), | 2128 resource->size.height(), |
| 2161 TextureToStorageFormat(resource->format), | 2129 TextureToStorageFormat(resource->format), |
| 2162 GL_IMAGE_MAP_CHROMIUM); | 2130 GL_IMAGE_MAP_CHROMIUM); |
| 2163 DCHECK(resource->image_id); | 2131 DCHECK(resource->image_id); |
| 2164 } | 2132 } |
| 2165 | 2133 |
| 2166 void ResourceProvider::ReleaseImage(Resource* resource) { | 2134 void ResourceProvider::ReleaseImage(Resource* resource) { |
| 2167 DCHECK(resource->origin == Resource::Internal); | 2135 DCHECK(resource->origin == Resource::Internal); |
| 2168 DCHECK_EQ(resource->exported_count, 0); | 2136 DCHECK_EQ(resource->exported_count, 0); |
| 2169 | 2137 |
| 2170 if (!resource->image_id) | 2138 if (!resource->image_id) |
| 2171 return; | 2139 return; |
| 2172 | 2140 |
| 2173 GLES2Interface* gl = ContextGL(); | 2141 GLES2Interface* gl = resource_helper_->ContextGL(); |
| 2174 DCHECK(gl); | 2142 DCHECK(gl); |
| 2175 gl->DestroyImageCHROMIUM(resource->image_id); | 2143 gl->DestroyImageCHROMIUM(resource->image_id); |
| 2176 resource->image_id = 0; | 2144 resource->image_id = 0; |
| 2177 resource->bound_image_id = 0; | 2145 resource->bound_image_id = 0; |
| 2178 resource->dirty_image = false; | 2146 resource->dirty_image = false; |
| 2179 resource->allocated = false; | 2147 resource->allocated = false; |
| 2180 } | 2148 } |
| 2181 | 2149 |
| 2182 uint8_t* ResourceProvider::MapImage(const Resource* resource, int* stride) { | 2150 uint8_t* ResourceProvider::MapImage(const Resource* resource, int* stride) { |
| 2183 DCHECK(ReadLockFenceHasPassed(resource)); | 2151 DCHECK(ReadLockFenceHasPassed(resource)); |
| 2184 DCHECK(resource->origin == Resource::Internal); | 2152 DCHECK(resource->origin == Resource::Internal); |
| 2185 DCHECK_EQ(resource->exported_count, 0); | 2153 DCHECK_EQ(resource->exported_count, 0); |
| 2186 | 2154 |
| 2187 if (resource->type == GLTexture) { | 2155 if (resource->type == GLTexture) { |
| 2188 DCHECK(resource->image_id); | 2156 DCHECK(resource->image_id); |
| 2189 GLES2Interface* gl = ContextGL(); | 2157 GLES2Interface* gl = resource_helper_->ContextGL(); |
| 2190 DCHECK(gl); | 2158 DCHECK(gl); |
| 2191 // MapImageCHROMIUM should be called prior to GetImageParameterivCHROMIUM. | 2159 // MapImageCHROMIUM should be called prior to GetImageParameterivCHROMIUM. |
| 2192 uint8_t* pixels = | 2160 uint8_t* pixels = |
| 2193 static_cast<uint8_t*>(gl->MapImageCHROMIUM(resource->image_id)); | 2161 static_cast<uint8_t*>(gl->MapImageCHROMIUM(resource->image_id)); |
| 2194 gl->GetImageParameterivCHROMIUM( | 2162 gl->GetImageParameterivCHROMIUM( |
| 2195 resource->image_id, GL_IMAGE_ROWBYTES_CHROMIUM, stride); | 2163 resource->image_id, GL_IMAGE_ROWBYTES_CHROMIUM, stride); |
| 2196 return pixels; | 2164 return pixels; |
| 2197 } | 2165 } |
| 2198 DCHECK_EQ(Bitmap, resource->type); | 2166 DCHECK_EQ(Bitmap, resource->type); |
| 2199 *stride = 0; | 2167 *stride = 0; |
| 2200 return resource->pixels; | 2168 return resource->pixels; |
| 2201 } | 2169 } |
| 2202 | 2170 |
| 2203 void ResourceProvider::UnmapImage(const Resource* resource) { | 2171 void ResourceProvider::UnmapImage(const Resource* resource) { |
| 2204 DCHECK(resource->origin == Resource::Internal); | 2172 DCHECK(resource->origin == Resource::Internal); |
| 2205 DCHECK_EQ(resource->exported_count, 0); | 2173 DCHECK_EQ(resource->exported_count, 0); |
| 2206 | 2174 |
| 2207 if (resource->image_id) { | 2175 if (resource->image_id) { |
| 2208 GLES2Interface* gl = ContextGL(); | 2176 GLES2Interface* gl = resource_helper_->ContextGL(); |
| 2209 DCHECK(gl); | 2177 DCHECK(gl); |
| 2210 gl->UnmapImageCHROMIUM(resource->image_id); | 2178 gl->UnmapImageCHROMIUM(resource->image_id); |
| 2211 } | 2179 } |
| 2212 } | 2180 } |
| 2213 | 2181 |
| 2214 void ResourceProvider::CopyResource(ResourceId source_id, ResourceId dest_id) { | 2182 void ResourceProvider::CopyResource(ResourceId source_id, ResourceId dest_id) { |
| 2215 TRACE_EVENT0("cc", "ResourceProvider::CopyResource"); | 2183 TRACE_EVENT0("cc", "ResourceProvider::CopyResource"); |
| 2216 | 2184 |
| 2217 Resource* source_resource = GetResource(source_id); | 2185 Resource* source_resource = GetResource(source_id); |
| 2218 DCHECK(!source_resource->lock_for_read_count); | 2186 DCHECK(!source_resource->lock_for_read_count); |
| 2219 DCHECK(source_resource->origin == Resource::Internal); | 2187 DCHECK(source_resource->origin == Resource::Internal); |
| 2220 DCHECK_EQ(source_resource->exported_count, 0); | 2188 DCHECK_EQ(source_resource->exported_count, 0); |
| 2221 DCHECK(source_resource->allocated); | 2189 DCHECK(source_resource->allocated); |
| 2222 LazyCreate(source_resource); | 2190 LazyCreate(source_resource); |
| 2223 | 2191 |
| 2224 Resource* dest_resource = GetResource(dest_id); | 2192 Resource* dest_resource = GetResource(dest_id); |
| 2225 DCHECK(!dest_resource->locked_for_write); | 2193 DCHECK(!dest_resource->locked_for_write); |
| 2226 DCHECK(!dest_resource->lock_for_read_count); | 2194 DCHECK(!dest_resource->lock_for_read_count); |
| 2227 DCHECK(dest_resource->origin == Resource::Internal); | 2195 DCHECK(dest_resource->origin == Resource::Internal); |
| 2228 DCHECK_EQ(dest_resource->exported_count, 0); | 2196 DCHECK_EQ(dest_resource->exported_count, 0); |
| 2229 LazyCreate(dest_resource); | 2197 LazyCreate(dest_resource); |
| 2230 | 2198 |
| 2231 DCHECK_EQ(source_resource->type, dest_resource->type); | 2199 DCHECK_EQ(source_resource->type, dest_resource->type); |
| 2232 DCHECK_EQ(source_resource->format, dest_resource->format); | 2200 DCHECK_EQ(source_resource->format, dest_resource->format); |
| 2233 DCHECK(source_resource->size == dest_resource->size); | 2201 DCHECK(source_resource->size == dest_resource->size); |
| 2234 | 2202 |
| 2235 if (source_resource->type == GLTexture) { | 2203 if (source_resource->type == GLTexture) { |
| 2236 GLES2Interface* gl = ContextGL(); | 2204 GLES2Interface* gl = resource_helper_->ContextGL(); |
| 2237 DCHECK(gl); | 2205 DCHECK(gl); |
| 2238 if (source_resource->image_id && source_resource->dirty_image) { | 2206 if (source_resource->image_id && source_resource->dirty_image) { |
| 2239 gl->BindTexture(source_resource->target, source_resource->gl_id); | 2207 gl->BindTexture(source_resource->target, source_resource->gl_id); |
| 2240 BindImageForSampling(source_resource); | 2208 BindImageForSampling(source_resource); |
| 2241 } | 2209 } |
| 2242 DCHECK(use_sync_query_) << "CHROMIUM_sync_query extension missing"; | 2210 DCHECK(use_sync_query_) << "CHROMIUM_sync_query extension missing"; |
| 2243 if (!source_resource->gl_read_lock_query_id) | 2211 if (!source_resource->gl_read_lock_query_id) |
| 2244 gl->GenQueriesEXT(1, &source_resource->gl_read_lock_query_id); | 2212 gl->GenQueriesEXT(1, &source_resource->gl_read_lock_query_id); |
| 2245 gl->BeginQueryEXT(GL_COMMANDS_COMPLETED_CHROMIUM, | 2213 gl->BeginQueryEXT(GL_COMMANDS_COMPLETED_CHROMIUM, |
| 2246 source_resource->gl_read_lock_query_id); | 2214 source_resource->gl_read_lock_query_id); |
| (...skipping 13 matching lines...) Expand all Loading... | |
| 2260 } else { | 2228 } else { |
| 2261 DCHECK_EQ(Bitmap, source_resource->type); | 2229 DCHECK_EQ(Bitmap, source_resource->type); |
| 2262 DCHECK_EQ(RGBA_8888, source_resource->format); | 2230 DCHECK_EQ(RGBA_8888, source_resource->format); |
| 2263 LazyAllocate(dest_resource); | 2231 LazyAllocate(dest_resource); |
| 2264 | 2232 |
| 2265 size_t bytes = SharedBitmap::CheckedSizeInBytes(source_resource->size); | 2233 size_t bytes = SharedBitmap::CheckedSizeInBytes(source_resource->size); |
| 2266 memcpy(dest_resource->pixels, source_resource->pixels, bytes); | 2234 memcpy(dest_resource->pixels, source_resource->pixels, bytes); |
| 2267 } | 2235 } |
| 2268 } | 2236 } |
| 2269 | 2237 |
| 2270 GLint ResourceProvider::GetActiveTextureUnit(GLES2Interface* gl) { | |
| 2271 GLint active_unit = 0; | |
| 2272 gl->GetIntegerv(GL_ACTIVE_TEXTURE, &active_unit); | |
| 2273 return active_unit; | |
| 2274 } | |
| 2275 | |
| 2276 GLES2Interface* ResourceProvider::ContextGL() const { | |
| 2277 ContextProvider* context_provider = output_surface_->context_provider(); | |
| 2278 return context_provider ? context_provider->ContextGL() : NULL; | |
| 2279 } | |
| 2280 | |
| 2281 class GrContext* ResourceProvider::GrContext() const { | |
| 2282 ContextProvider* context_provider = output_surface_->context_provider(); | |
| 2283 return context_provider ? context_provider->GrContext() : NULL; | |
| 2284 } | |
| 2285 | |
| 2286 void ResourceProvider::BeginGpuRaster() { | |
| 2287 GLES2Interface* gl = ContextGL(); | |
| 2288 DCHECK(gl); | |
| 2289 | |
| 2290 // TODO(alokp): Use a trace macro to push/pop markers. | |
| 2291 // Using push/pop functions directly incurs cost to evaluate function | |
| 2292 // arguments even when tracing is disabled. | |
| 2293 gl->PushGroupMarkerEXT(0, "GpuRasterization"); | |
| 2294 | |
| 2295 class GrContext* gr_context = GrContext(); | |
| 2296 if (gr_context) | |
| 2297 gr_context->resetContext(); | |
| 2298 } | |
| 2299 | |
| 2300 void ResourceProvider::EndGpuRaster() { | |
| 2301 GLES2Interface* gl = ContextGL(); | |
| 2302 DCHECK(gl); | |
| 2303 | |
| 2304 class GrContext* gr_context = GrContext(); | |
| 2305 if (gr_context) | |
| 2306 gr_context->flush(); | |
| 2307 | |
| 2308 // TODO(alokp): Use a trace macro to push/pop markers. | |
| 2309 // Using push/pop functions directly incurs cost to evaluate function | |
| 2310 // arguments even when tracing is disabled. | |
| 2311 gl->PopGroupMarkerEXT(); | |
| 2312 } | |
| 2313 | |
| 2314 } // namespace cc | 2238 } // namespace cc |
| OLD | NEW |