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/atomic_sequence_num.h" | 10 #include "base/atomic_sequence_num.h" |
(...skipping 15 matching lines...) Expand all Loading... |
26 #include "gpu/GLES2/gl2extchromium.h" | 26 #include "gpu/GLES2/gl2extchromium.h" |
27 #include "gpu/command_buffer/client/gles2_interface.h" | 27 #include "gpu/command_buffer/client/gles2_interface.h" |
28 #include "gpu/command_buffer/client/gpu_memory_buffer_manager.h" | 28 #include "gpu/command_buffer/client/gpu_memory_buffer_manager.h" |
29 #include "third_party/khronos/GLES2/gl2.h" | 29 #include "third_party/khronos/GLES2/gl2.h" |
30 #include "third_party/khronos/GLES2/gl2ext.h" | 30 #include "third_party/khronos/GLES2/gl2ext.h" |
31 #include "third_party/skia/include/core/SkSurface.h" | 31 #include "third_party/skia/include/core/SkSurface.h" |
32 #include "third_party/skia/include/gpu/GrContext.h" | 32 #include "third_party/skia/include/gpu/GrContext.h" |
33 #include "third_party/skia/include/gpu/GrTextureProvider.h" | 33 #include "third_party/skia/include/gpu/GrTextureProvider.h" |
34 #include "ui/gfx/geometry/rect.h" | 34 #include "ui/gfx/geometry/rect.h" |
35 #include "ui/gfx/geometry/vector2d.h" | 35 #include "ui/gfx/geometry/vector2d.h" |
36 #include "ui/gfx/gpu_memory_buffer.h" | |
37 #include "ui/gl/trace_util.h" | 36 #include "ui/gl/trace_util.h" |
38 | 37 |
39 using gpu::gles2::GLES2Interface; | 38 using gpu::gles2::GLES2Interface; |
40 | 39 |
41 namespace cc { | 40 namespace cc { |
42 | 41 |
43 class IdAllocator { | 42 class IdAllocator { |
44 public: | 43 public: |
45 virtual ~IdAllocator() {} | 44 virtual ~IdAllocator() {} |
46 | 45 |
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
111 return kBGRA_8888_GrPixelConfig; | 110 return kBGRA_8888_GrPixelConfig; |
112 case RGBA_4444: | 111 case RGBA_4444: |
113 return kRGBA_4444_GrPixelConfig; | 112 return kRGBA_4444_GrPixelConfig; |
114 default: | 113 default: |
115 break; | 114 break; |
116 } | 115 } |
117 DCHECK(false) << "Unsupported resource format."; | 116 DCHECK(false) << "Unsupported resource format."; |
118 return kSkia8888_GrPixelConfig; | 117 return kSkia8888_GrPixelConfig; |
119 } | 118 } |
120 | 119 |
121 gfx::BufferFormat ToGpuMemoryBufferFormat(ResourceFormat format) { | |
122 switch (format) { | |
123 case RGBA_8888: | |
124 return gfx::BufferFormat::RGBA_8888; | |
125 case BGRA_8888: | |
126 return gfx::BufferFormat::BGRA_8888; | |
127 case RGBA_4444: | |
128 return gfx::BufferFormat::RGBA_4444; | |
129 case ALPHA_8: | |
130 case LUMINANCE_8: | |
131 case RGB_565: | |
132 case ETC1: | |
133 case RED_8: | |
134 break; | |
135 } | |
136 NOTREACHED(); | |
137 return gfx::BufferFormat::RGBA_8888; | |
138 } | |
139 | |
140 class ScopedSetActiveTexture { | 120 class ScopedSetActiveTexture { |
141 public: | 121 public: |
142 ScopedSetActiveTexture(GLES2Interface* gl, GLenum unit) | 122 ScopedSetActiveTexture(GLES2Interface* gl, GLenum unit) |
143 : gl_(gl), unit_(unit) { | 123 : gl_(gl), unit_(unit) { |
144 DCHECK_EQ(GL_TEXTURE0, ResourceProvider::GetActiveTextureUnit(gl_)); | 124 DCHECK_EQ(GL_TEXTURE0, ResourceProvider::GetActiveTextureUnit(gl_)); |
145 | 125 |
146 if (unit_ != GL_TEXTURE0) | 126 if (unit_ != GL_TEXTURE0) |
147 gl_->ActiveTexture(unit_); | 127 gl_->ActiveTexture(unit_); |
148 } | 128 } |
149 | 129 |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
200 next_id_index_ = 0; | 180 next_id_index_ = 0; |
201 } | 181 } |
202 | 182 |
203 return ids_[next_id_index_++]; | 183 return ids_[next_id_index_++]; |
204 } | 184 } |
205 | 185 |
206 private: | 186 private: |
207 DISALLOW_COPY_AND_ASSIGN(BufferIdAllocator); | 187 DISALLOW_COPY_AND_ASSIGN(BufferIdAllocator); |
208 }; | 188 }; |
209 | 189 |
210 // Query object based fence implementation used to detect completion of copy | |
211 // texture operations. Fence has passed when query result is available. | |
212 class CopyTextureFence : public ResourceProvider::Fence { | |
213 public: | |
214 CopyTextureFence(gpu::gles2::GLES2Interface* gl, unsigned query_id) | |
215 : gl_(gl), query_id_(query_id) {} | |
216 | |
217 // Overridden from ResourceProvider::Fence: | |
218 void Set() override {} | |
219 bool HasPassed() override { | |
220 unsigned available = 1; | |
221 gl_->GetQueryObjectuivEXT( | |
222 query_id_, GL_QUERY_RESULT_AVAILABLE_EXT, &available); | |
223 if (!available) | |
224 return false; | |
225 | |
226 ProcessResult(); | |
227 return true; | |
228 } | |
229 void Wait() override { | |
230 // ProcessResult() will wait for result to become available. | |
231 ProcessResult(); | |
232 } | |
233 | |
234 private: | |
235 ~CopyTextureFence() override {} | |
236 | |
237 void ProcessResult() { | |
238 unsigned time_elapsed_us = 0; | |
239 gl_->GetQueryObjectuivEXT(query_id_, GL_QUERY_RESULT_EXT, &time_elapsed_us); | |
240 UMA_HISTOGRAM_CUSTOM_COUNTS("Renderer4.CopyTextureLatency", time_elapsed_us, | |
241 0, 256000, 50); | |
242 } | |
243 | |
244 gpu::gles2::GLES2Interface* gl_; | |
245 unsigned query_id_; | |
246 | |
247 DISALLOW_COPY_AND_ASSIGN(CopyTextureFence); | |
248 }; | |
249 | |
250 // Generates process-unique IDs to use for tracing a ResourceProvider's | 190 // Generates process-unique IDs to use for tracing a ResourceProvider's |
251 // resources. | 191 // resources. |
252 base::StaticAtomicSequenceNumber g_next_resource_provider_tracing_id; | 192 base::StaticAtomicSequenceNumber g_next_resource_provider_tracing_id; |
253 | 193 |
254 } // namespace | 194 } // namespace |
255 | 195 |
256 ResourceProvider::Resource::~Resource() {} | 196 ResourceProvider::Resource::~Resource() {} |
257 | 197 |
258 ResourceProvider::Resource::Resource(GLuint texture_id, | 198 ResourceProvider::Resource::Resource(GLuint texture_id, |
259 const gfx::Size& size, | 199 const gfx::Size& size, |
(...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
395 ResourceProvider::Child::~Child() {} | 335 ResourceProvider::Child::~Child() {} |
396 | 336 |
397 scoped_ptr<ResourceProvider> ResourceProvider::Create( | 337 scoped_ptr<ResourceProvider> ResourceProvider::Create( |
398 OutputSurface* output_surface, | 338 OutputSurface* output_surface, |
399 SharedBitmapManager* shared_bitmap_manager, | 339 SharedBitmapManager* shared_bitmap_manager, |
400 gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager, | 340 gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager, |
401 BlockingTaskRunner* blocking_main_thread_task_runner, | 341 BlockingTaskRunner* blocking_main_thread_task_runner, |
402 int highp_threshold_min, | 342 int highp_threshold_min, |
403 bool use_rgba_4444_texture_format, | 343 bool use_rgba_4444_texture_format, |
404 size_t id_allocation_chunk_size, | 344 size_t id_allocation_chunk_size, |
405 bool use_persistent_map_for_gpu_memory_buffers, | |
406 const std::vector<unsigned>& use_image_texture_targets) { | 345 const std::vector<unsigned>& use_image_texture_targets) { |
407 scoped_ptr<ResourceProvider> resource_provider(new ResourceProvider( | 346 scoped_ptr<ResourceProvider> resource_provider(new ResourceProvider( |
408 output_surface, shared_bitmap_manager, gpu_memory_buffer_manager, | 347 output_surface, shared_bitmap_manager, gpu_memory_buffer_manager, |
409 blocking_main_thread_task_runner, highp_threshold_min, | 348 blocking_main_thread_task_runner, highp_threshold_min, |
410 use_rgba_4444_texture_format, id_allocation_chunk_size, | 349 use_rgba_4444_texture_format, id_allocation_chunk_size, |
411 use_persistent_map_for_gpu_memory_buffers, use_image_texture_targets)); | 350 use_image_texture_targets)); |
412 resource_provider->Initialize(); | 351 resource_provider->Initialize(); |
413 return resource_provider; | 352 return resource_provider; |
414 } | 353 } |
415 | 354 |
416 ResourceProvider::~ResourceProvider() { | 355 ResourceProvider::~ResourceProvider() { |
417 base::trace_event::MemoryDumpManager::GetInstance()->UnregisterDumpProvider( | 356 base::trace_event::MemoryDumpManager::GetInstance()->UnregisterDumpProvider( |
418 this); | 357 this); |
419 | 358 |
420 while (!children_.empty()) | 359 while (!children_.empty()) |
421 DestroyChildInternal(children_.begin(), FOR_SHUTDOWN); | 360 DestroyChildInternal(children_.begin(), FOR_SHUTDOWN); |
(...skipping 570 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
992 // GpuMemoryBuffer provides direct access to the memory used by the GPU. | 931 // GpuMemoryBuffer provides direct access to the memory used by the GPU. |
993 // Read lock fences are required to ensure that we're not trying to map a | 932 // Read lock fences are required to ensure that we're not trying to map a |
994 // buffer that is currently in-use by the GPU. | 933 // buffer that is currently in-use by the GPU. |
995 resource_->read_lock_fences_enabled = true; | 934 resource_->read_lock_fences_enabled = true; |
996 } | 935 } |
997 | 936 |
998 gfx::GpuMemoryBuffer* | 937 gfx::GpuMemoryBuffer* |
999 ResourceProvider::ScopedWriteLockGpuMemoryBuffer::GetGpuMemoryBuffer() { | 938 ResourceProvider::ScopedWriteLockGpuMemoryBuffer::GetGpuMemoryBuffer() { |
1000 if (gpu_memory_buffer_) | 939 if (gpu_memory_buffer_) |
1001 return gpu_memory_buffer_; | 940 return gpu_memory_buffer_; |
1002 gfx::BufferUsage usage = | |
1003 resource_provider_->use_persistent_map_for_gpu_memory_buffers() | |
1004 ? gfx::BufferUsage::PERSISTENT_MAP | |
1005 : gfx::BufferUsage::MAP; | |
1006 scoped_ptr<gfx::GpuMemoryBuffer> gpu_memory_buffer = | 941 scoped_ptr<gfx::GpuMemoryBuffer> gpu_memory_buffer = |
1007 gpu_memory_buffer_manager_->AllocateGpuMemoryBuffer( | 942 gpu_memory_buffer_manager_->AllocateGpuMemoryBuffer( |
1008 size_, ToGpuMemoryBufferFormat(format_), usage); | 943 size_, BufferFormat(format_), gfx::BufferUsage::MAP); |
1009 gpu_memory_buffer_ = gpu_memory_buffer.release(); | 944 gpu_memory_buffer_ = gpu_memory_buffer.release(); |
1010 return gpu_memory_buffer_; | 945 return gpu_memory_buffer_; |
1011 } | 946 } |
1012 | 947 |
1013 ResourceProvider::ScopedWriteLockGr::ScopedWriteLockGr( | 948 ResourceProvider::ScopedWriteLockGr::ScopedWriteLockGr( |
1014 ResourceProvider* resource_provider, | 949 ResourceProvider* resource_provider, |
1015 ResourceId resource_id) | 950 ResourceId resource_id) |
1016 : resource_provider_(resource_provider), | 951 : resource_provider_(resource_provider), |
1017 resource_(resource_provider->LockForWrite(resource_id)) { | 952 resource_(resource_provider->LockForWrite(resource_id)) { |
1018 DCHECK(thread_checker_.CalledOnValidThread()); | 953 DCHECK(thread_checker_.CalledOnValidThread()); |
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1090 } | 1025 } |
1091 | 1026 |
1092 ResourceProvider::ResourceProvider( | 1027 ResourceProvider::ResourceProvider( |
1093 OutputSurface* output_surface, | 1028 OutputSurface* output_surface, |
1094 SharedBitmapManager* shared_bitmap_manager, | 1029 SharedBitmapManager* shared_bitmap_manager, |
1095 gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager, | 1030 gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager, |
1096 BlockingTaskRunner* blocking_main_thread_task_runner, | 1031 BlockingTaskRunner* blocking_main_thread_task_runner, |
1097 int highp_threshold_min, | 1032 int highp_threshold_min, |
1098 bool use_rgba_4444_texture_format, | 1033 bool use_rgba_4444_texture_format, |
1099 size_t id_allocation_chunk_size, | 1034 size_t id_allocation_chunk_size, |
1100 bool use_persistent_map_for_gpu_memory_buffers, | |
1101 const std::vector<unsigned>& use_image_texture_targets) | 1035 const std::vector<unsigned>& use_image_texture_targets) |
1102 : output_surface_(output_surface), | 1036 : output_surface_(output_surface), |
1103 shared_bitmap_manager_(shared_bitmap_manager), | 1037 shared_bitmap_manager_(shared_bitmap_manager), |
1104 gpu_memory_buffer_manager_(gpu_memory_buffer_manager), | 1038 gpu_memory_buffer_manager_(gpu_memory_buffer_manager), |
1105 blocking_main_thread_task_runner_(blocking_main_thread_task_runner), | 1039 blocking_main_thread_task_runner_(blocking_main_thread_task_runner), |
1106 lost_output_surface_(false), | 1040 lost_output_surface_(false), |
1107 highp_threshold_min_(highp_threshold_min), | 1041 highp_threshold_min_(highp_threshold_min), |
1108 next_id_(1), | 1042 next_id_(1), |
1109 next_child_(1), | 1043 next_child_(1), |
1110 default_resource_type_(RESOURCE_TYPE_BITMAP), | 1044 default_resource_type_(RESOURCE_TYPE_BITMAP), |
1111 use_texture_storage_ext_(false), | 1045 use_texture_storage_ext_(false), |
1112 use_texture_format_bgra_(false), | 1046 use_texture_format_bgra_(false), |
1113 use_texture_usage_hint_(false), | 1047 use_texture_usage_hint_(false), |
1114 use_compressed_texture_etc1_(false), | 1048 use_compressed_texture_etc1_(false), |
1115 yuv_resource_format_(LUMINANCE_8), | 1049 yuv_resource_format_(LUMINANCE_8), |
1116 max_texture_size_(0), | 1050 max_texture_size_(0), |
1117 best_texture_format_(RGBA_8888), | 1051 best_texture_format_(RGBA_8888), |
1118 best_render_buffer_format_(RGBA_8888), | 1052 best_render_buffer_format_(RGBA_8888), |
1119 use_rgba_4444_texture_format_(use_rgba_4444_texture_format), | 1053 use_rgba_4444_texture_format_(use_rgba_4444_texture_format), |
1120 id_allocation_chunk_size_(id_allocation_chunk_size), | 1054 id_allocation_chunk_size_(id_allocation_chunk_size), |
1121 use_sync_query_(false), | 1055 use_sync_query_(false), |
1122 use_persistent_map_for_gpu_memory_buffers_( | |
1123 use_persistent_map_for_gpu_memory_buffers), | |
1124 use_image_texture_targets_(use_image_texture_targets), | 1056 use_image_texture_targets_(use_image_texture_targets), |
1125 tracing_id_(g_next_resource_provider_tracing_id.GetNext()) { | 1057 tracing_id_(g_next_resource_provider_tracing_id.GetNext()) { |
1126 DCHECK(output_surface_->HasClient()); | 1058 DCHECK(output_surface_->HasClient()); |
1127 DCHECK(id_allocation_chunk_size_); | 1059 DCHECK(id_allocation_chunk_size_); |
1128 } | 1060 } |
1129 | 1061 |
1130 void ResourceProvider::Initialize() { | 1062 void ResourceProvider::Initialize() { |
1131 DCHECK(thread_checker_.CalledOnValidThread()); | 1063 DCHECK(thread_checker_.CalledOnValidThread()); |
1132 | 1064 |
1133 // In certain cases, ThreadTaskRunnerHandle isn't set (Android Webview). | 1065 // In certain cases, ThreadTaskRunnerHandle isn't set (Android Webview). |
(...skipping 715 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1849 DCHECK(resource->image_id); | 1781 DCHECK(resource->image_id); |
1850 | 1782 |
1851 // Release image currently bound to texture. | 1783 // Release image currently bound to texture. |
1852 if (resource->bound_image_id) | 1784 if (resource->bound_image_id) |
1853 gl->ReleaseTexImage2DCHROMIUM(resource->target, resource->bound_image_id); | 1785 gl->ReleaseTexImage2DCHROMIUM(resource->target, resource->bound_image_id); |
1854 gl->BindTexImage2DCHROMIUM(resource->target, resource->image_id); | 1786 gl->BindTexImage2DCHROMIUM(resource->target, resource->image_id); |
1855 resource->bound_image_id = resource->image_id; | 1787 resource->bound_image_id = resource->image_id; |
1856 resource->dirty_image = false; | 1788 resource->dirty_image = false; |
1857 } | 1789 } |
1858 | 1790 |
1859 void ResourceProvider::CopyResource(ResourceId source_id, | |
1860 ResourceId dest_id, | |
1861 const gfx::Rect& rect) { | |
1862 TRACE_EVENT0("cc", "ResourceProvider::CopyResource"); | |
1863 | |
1864 Resource* source_resource = GetResource(source_id); | |
1865 DCHECK(!source_resource->lock_for_read_count); | |
1866 DCHECK(source_resource->origin == Resource::INTERNAL); | |
1867 DCHECK_EQ(source_resource->exported_count, 0); | |
1868 DCHECK_EQ(RESOURCE_TYPE_GL_TEXTURE, source_resource->type); | |
1869 LazyAllocate(source_resource); | |
1870 | |
1871 Resource* dest_resource = GetResource(dest_id); | |
1872 DCHECK(!dest_resource->locked_for_write); | |
1873 DCHECK(!dest_resource->lock_for_read_count); | |
1874 DCHECK(dest_resource->origin == Resource::INTERNAL); | |
1875 DCHECK_EQ(dest_resource->exported_count, 0); | |
1876 DCHECK_EQ(RESOURCE_TYPE_GL_TEXTURE, dest_resource->type); | |
1877 LazyAllocate(dest_resource); | |
1878 | |
1879 DCHECK_EQ(source_resource->type, dest_resource->type); | |
1880 DCHECK_EQ(source_resource->format, dest_resource->format); | |
1881 DCHECK(source_resource->size == dest_resource->size); | |
1882 DCHECK(gfx::Rect(dest_resource->size).Contains(rect)); | |
1883 | |
1884 GLES2Interface* gl = ContextGL(); | |
1885 DCHECK(gl); | |
1886 if (source_resource->image_id && source_resource->dirty_image) { | |
1887 gl->BindTexture(source_resource->target, source_resource->gl_id); | |
1888 BindImageForSampling(source_resource); | |
1889 } | |
1890 if (use_sync_query_) { | |
1891 if (!source_resource->gl_read_lock_query_id) | |
1892 gl->GenQueriesEXT(1, &source_resource->gl_read_lock_query_id); | |
1893 #if defined(OS_CHROMEOS) | |
1894 // TODO(reveman): This avoids a performance problem on some ChromeOS | |
1895 // devices. This needs to be removed to support native GpuMemoryBuffer | |
1896 // implementations. crbug.com/436314 | |
1897 gl->BeginQueryEXT(GL_COMMANDS_ISSUED_CHROMIUM, | |
1898 source_resource->gl_read_lock_query_id); | |
1899 #else | |
1900 gl->BeginQueryEXT(GL_COMMANDS_COMPLETED_CHROMIUM, | |
1901 source_resource->gl_read_lock_query_id); | |
1902 #endif | |
1903 } | |
1904 DCHECK(!dest_resource->image_id); | |
1905 dest_resource->allocated = true; | |
1906 gl->CopySubTextureCHROMIUM(dest_resource->target, source_resource->gl_id, | |
1907 dest_resource->gl_id, rect.x(), rect.y(), rect.x(), | |
1908 rect.y(), rect.width(), rect.height(), | |
1909 false, false, false); | |
1910 if (source_resource->gl_read_lock_query_id) { | |
1911 // End query and create a read lock fence that will prevent access to | |
1912 // source resource until CopySubTextureCHROMIUM command has completed. | |
1913 #if defined(OS_CHROMEOS) | |
1914 gl->EndQueryEXT(GL_COMMANDS_ISSUED_CHROMIUM); | |
1915 #else | |
1916 gl->EndQueryEXT(GL_COMMANDS_COMPLETED_CHROMIUM); | |
1917 #endif | |
1918 source_resource->read_lock_fence = make_scoped_refptr( | |
1919 new CopyTextureFence(gl, source_resource->gl_read_lock_query_id)); | |
1920 } else { | |
1921 // Create a SynchronousFence when CHROMIUM_sync_query extension is missing. | |
1922 // Try to use one synchronous fence for as many CopyResource operations as | |
1923 // possible as that reduce the number of times we have to synchronize with | |
1924 // the GL. | |
1925 if (!synchronous_fence_.get() || synchronous_fence_->has_synchronized()) | |
1926 synchronous_fence_ = make_scoped_refptr(new SynchronousFence(gl)); | |
1927 source_resource->read_lock_fence = synchronous_fence_; | |
1928 source_resource->read_lock_fence->Set(); | |
1929 } | |
1930 } | |
1931 | |
1932 void ResourceProvider::WaitSyncPointIfNeeded(ResourceId id) { | 1791 void ResourceProvider::WaitSyncPointIfNeeded(ResourceId id) { |
1933 Resource* resource = GetResource(id); | 1792 Resource* resource = GetResource(id); |
1934 DCHECK_EQ(resource->exported_count, 0); | 1793 DCHECK_EQ(resource->exported_count, 0); |
1935 DCHECK(resource->allocated); | 1794 DCHECK(resource->allocated); |
1936 if (resource->type != RESOURCE_TYPE_GL_TEXTURE || resource->gl_id) | 1795 if (resource->type != RESOURCE_TYPE_GL_TEXTURE || resource->gl_id) |
1937 return; | 1796 return; |
1938 if (!resource->mailbox.sync_point()) | 1797 if (!resource->mailbox.sync_point()) |
1939 return; | 1798 return; |
1940 DCHECK(resource->mailbox.IsValid()); | 1799 DCHECK(resource->mailbox.IsValid()); |
1941 GLES2Interface* gl = ContextGL(); | 1800 GLES2Interface* gl = ContextGL(); |
1942 DCHECK(gl); | 1801 DCHECK(gl); |
1943 gl->WaitSyncPointCHROMIUM(resource->mailbox.sync_point()); | 1802 gl->WaitSyncPointCHROMIUM(resource->mailbox.sync_point()); |
1944 resource->mailbox.set_sync_point(0); | 1803 resource->mailbox.set_sync_point(0); |
1945 } | 1804 } |
1946 | 1805 |
1947 void ResourceProvider::WaitReadLockIfNeeded(ResourceId id) { | |
1948 Resource* resource = GetResource(id); | |
1949 DCHECK_EQ(resource->exported_count, 0); | |
1950 if (!resource->read_lock_fence.get()) | |
1951 return; | |
1952 | |
1953 resource->read_lock_fence->Wait(); | |
1954 } | |
1955 | |
1956 GLint ResourceProvider::GetActiveTextureUnit(GLES2Interface* gl) { | 1806 GLint ResourceProvider::GetActiveTextureUnit(GLES2Interface* gl) { |
1957 GLint active_unit = 0; | 1807 GLint active_unit = 0; |
1958 gl->GetIntegerv(GL_ACTIVE_TEXTURE, &active_unit); | 1808 gl->GetIntegerv(GL_ACTIVE_TEXTURE, &active_unit); |
1959 return active_unit; | 1809 return active_unit; |
1960 } | 1810 } |
1961 | 1811 |
1962 GLenum ResourceProvider::GetImageTextureTarget(ResourceFormat format) { | 1812 GLenum ResourceProvider::GetImageTextureTarget(ResourceFormat format) { |
1963 gfx::BufferFormat buffer_format = ToGpuMemoryBufferFormat(format); | 1813 gfx::BufferFormat buffer_format = BufferFormat(format); |
1964 DCHECK_GT(use_image_texture_targets_.size(), | 1814 DCHECK_GT(use_image_texture_targets_.size(), |
1965 static_cast<size_t>(buffer_format)); | 1815 static_cast<size_t>(buffer_format)); |
1966 return use_image_texture_targets_[static_cast<size_t>(buffer_format)]; | 1816 return use_image_texture_targets_[static_cast<size_t>(buffer_format)]; |
1967 } | 1817 } |
1968 | 1818 |
1969 void ResourceProvider::ValidateResource(ResourceId id) const { | 1819 void ResourceProvider::ValidateResource(ResourceId id) const { |
1970 DCHECK(thread_checker_.CalledOnValidThread()); | 1820 DCHECK(thread_checker_.CalledOnValidThread()); |
1971 DCHECK(id); | 1821 DCHECK(id); |
1972 DCHECK(resources_.find(id) != resources_.end()); | 1822 DCHECK(resources_.find(id) != resources_.end()); |
1973 } | 1823 } |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2028 const int kImportance = 2; | 1878 const int kImportance = 2; |
2029 pmd->CreateSharedGlobalAllocatorDump(guid); | 1879 pmd->CreateSharedGlobalAllocatorDump(guid); |
2030 pmd->AddOwnershipEdge(dump->guid(), guid, kImportance); | 1880 pmd->AddOwnershipEdge(dump->guid(), guid, kImportance); |
2031 } | 1881 } |
2032 } | 1882 } |
2033 | 1883 |
2034 return true; | 1884 return true; |
2035 } | 1885 } |
2036 | 1886 |
2037 } // namespace cc | 1887 } // namespace cc |
OLD | NEW |