| 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 16 matching lines...) Expand all Loading... |
| 27 using WebKit::WebGraphicsContext3D; | 27 using WebKit::WebGraphicsContext3D; |
| 28 | 28 |
| 29 namespace cc { | 29 namespace cc { |
| 30 | 30 |
| 31 namespace { | 31 namespace { |
| 32 | 32 |
| 33 // Measured in seconds. | 33 // Measured in seconds. |
| 34 const double kSoftwareUploadTickRate = 0.000250; | 34 const double kSoftwareUploadTickRate = 0.000250; |
| 35 const double kTextureUploadTickRate = 0.004; | 35 const double kTextureUploadTickRate = 0.004; |
| 36 | 36 |
| 37 GLenum TextureToStorageFormat(GLenum texture_format) { | 37 GLenum TextureToStorageFormat(ResourceFormat format) { |
| 38 GLenum storage_format = GL_RGBA8_OES; | 38 GLenum storage_format = GL_RGBA8_OES; |
| 39 switch (texture_format) { | 39 switch (format) { |
| 40 case GL_RGBA: | 40 case RGBA_8888: |
| 41 case RGBA_4444: |
| 42 case LUMINANCE_8: |
| 41 break; | 43 break; |
| 42 case GL_BGRA_EXT: | 44 case BGRA_8888: |
| 43 storage_format = GL_BGRA8_EXT; | 45 storage_format = GL_BGRA8_EXT; |
| 44 break; | 46 break; |
| 45 default: | |
| 46 NOTREACHED(); | |
| 47 break; | |
| 48 } | 47 } |
| 49 | 48 |
| 50 return storage_format; | 49 return storage_format; |
| 51 } | 50 } |
| 52 | 51 |
| 53 bool IsTextureFormatSupportedForStorage(GLenum format) { | 52 bool IsFormatSupportedForStorage(ResourceFormat format) { |
| 54 return (format == GL_RGBA || format == GL_BGRA_EXT); | 53 switch (format) { |
| 54 case RGBA_8888: |
| 55 case BGRA_8888: |
| 56 return true; |
| 57 case RGBA_4444: |
| 58 case LUMINANCE_8: |
| 59 return false; |
| 60 } |
| 61 return false; |
| 55 } | 62 } |
| 56 | 63 |
| 57 class ScopedSetActiveTexture { | 64 class ScopedSetActiveTexture { |
| 58 public: | 65 public: |
| 59 ScopedSetActiveTexture(WebGraphicsContext3D* context3d, GLenum unit) | 66 ScopedSetActiveTexture(WebGraphicsContext3D* context3d, GLenum unit) |
| 60 : context3d_(context3d), unit_(unit) { | 67 : context3d_(context3d), unit_(unit) { |
| 61 DCHECK_EQ(GL_TEXTURE0, ResourceProvider::GetActiveTextureUnit(context3d_)); | 68 DCHECK_EQ(GL_TEXTURE0, ResourceProvider::GetActiveTextureUnit(context3d_)); |
| 62 | 69 |
| 63 if (unit_ != GL_TEXTURE0) | 70 if (unit_ != GL_TEXTURE0) |
| 64 GLC(context3d_, context3d_->activeTexture(unit_)); | 71 GLC(context3d_, context3d_->activeTexture(unit_)); |
| (...skipping 23 matching lines...) Expand all Loading... |
| 88 exported_count(0), | 95 exported_count(0), |
| 89 locked_for_write(false), | 96 locked_for_write(false), |
| 90 external(false), | 97 external(false), |
| 91 marked_for_deletion(false), | 98 marked_for_deletion(false), |
| 92 pending_set_pixels(false), | 99 pending_set_pixels(false), |
| 93 set_pixels_completion_forced(false), | 100 set_pixels_completion_forced(false), |
| 94 allocated(false), | 101 allocated(false), |
| 95 enable_read_lock_fences(false), | 102 enable_read_lock_fences(false), |
| 96 read_lock_fence(NULL), | 103 read_lock_fence(NULL), |
| 97 size(), | 104 size(), |
| 98 format(0), | |
| 99 original_filter(0), | 105 original_filter(0), |
| 100 filter(0), | 106 filter(0), |
| 101 target(0), | 107 target(0), |
| 102 image_id(0), | 108 image_id(0), |
| 103 texture_pool(0), | 109 texture_pool(0), |
| 104 wrap_mode(0), | 110 wrap_mode(0), |
| 105 hint(TextureUsageAny), | 111 hint(TextureUsageAny), |
| 106 type(static_cast<ResourceType>(0)) {} | 112 type(static_cast<ResourceType>(0)), |
| 113 format(RGBA_8888) {} |
| 107 | 114 |
| 108 ResourceProvider::Resource::~Resource() {} | 115 ResourceProvider::Resource::~Resource() {} |
| 109 | 116 |
| 110 ResourceProvider::Resource::Resource( | 117 ResourceProvider::Resource::Resource( |
| 111 unsigned texture_id, | 118 unsigned texture_id, |
| 112 gfx::Size size, | 119 gfx::Size size, |
| 113 GLenum format, | |
| 114 GLenum filter, | 120 GLenum filter, |
| 115 GLenum texture_pool, | 121 GLenum texture_pool, |
| 116 GLint wrap_mode, | 122 GLint wrap_mode, |
| 117 TextureUsageHint hint) | 123 TextureUsageHint hint, |
| 124 ResourceFormat format) |
| 118 : gl_id(texture_id), | 125 : gl_id(texture_id), |
| 119 gl_pixel_buffer_id(0), | 126 gl_pixel_buffer_id(0), |
| 120 gl_upload_query_id(0), | 127 gl_upload_query_id(0), |
| 121 pixels(NULL), | 128 pixels(NULL), |
| 122 pixel_buffer(NULL), | 129 pixel_buffer(NULL), |
| 123 lock_for_read_count(0), | 130 lock_for_read_count(0), |
| 124 imported_count(0), | 131 imported_count(0), |
| 125 exported_count(0), | 132 exported_count(0), |
| 126 locked_for_write(false), | 133 locked_for_write(false), |
| 127 external(false), | 134 external(false), |
| 128 marked_for_deletion(false), | 135 marked_for_deletion(false), |
| 129 pending_set_pixels(false), | 136 pending_set_pixels(false), |
| 130 set_pixels_completion_forced(false), | 137 set_pixels_completion_forced(false), |
| 131 allocated(false), | 138 allocated(false), |
| 132 enable_read_lock_fences(false), | 139 enable_read_lock_fences(false), |
| 133 read_lock_fence(NULL), | 140 read_lock_fence(NULL), |
| 134 size(size), | 141 size(size), |
| 135 format(format), | |
| 136 original_filter(filter), | 142 original_filter(filter), |
| 137 filter(filter), | 143 filter(filter), |
| 138 target(0), | 144 target(0), |
| 139 image_id(0), | 145 image_id(0), |
| 140 texture_pool(texture_pool), | 146 texture_pool(texture_pool), |
| 141 wrap_mode(wrap_mode), | 147 wrap_mode(wrap_mode), |
| 142 hint(hint), | 148 hint(hint), |
| 143 type(GLTexture) { | 149 type(GLTexture), |
| 150 format(format) { |
| 144 DCHECK(wrap_mode == GL_CLAMP_TO_EDGE || wrap_mode == GL_REPEAT); | 151 DCHECK(wrap_mode == GL_CLAMP_TO_EDGE || wrap_mode == GL_REPEAT); |
| 145 } | 152 } |
| 146 | 153 |
| 147 ResourceProvider::Resource::Resource( | 154 ResourceProvider::Resource::Resource( |
| 148 uint8_t* pixels, | 155 uint8_t* pixels, |
| 149 gfx::Size size, | 156 gfx::Size size, |
| 150 GLenum format, | |
| 151 GLenum filter, | 157 GLenum filter, |
| 152 GLint wrap_mode) | 158 GLint wrap_mode) |
| 153 : gl_id(0), | 159 : gl_id(0), |
| 154 gl_pixel_buffer_id(0), | 160 gl_pixel_buffer_id(0), |
| 155 gl_upload_query_id(0), | 161 gl_upload_query_id(0), |
| 156 pixels(pixels), | 162 pixels(pixels), |
| 157 pixel_buffer(NULL), | 163 pixel_buffer(NULL), |
| 158 lock_for_read_count(0), | 164 lock_for_read_count(0), |
| 159 imported_count(0), | 165 imported_count(0), |
| 160 exported_count(0), | 166 exported_count(0), |
| 161 locked_for_write(false), | 167 locked_for_write(false), |
| 162 external(false), | 168 external(false), |
| 163 marked_for_deletion(false), | 169 marked_for_deletion(false), |
| 164 pending_set_pixels(false), | 170 pending_set_pixels(false), |
| 165 set_pixels_completion_forced(false), | 171 set_pixels_completion_forced(false), |
| 166 allocated(false), | 172 allocated(false), |
| 167 enable_read_lock_fences(false), | 173 enable_read_lock_fences(false), |
| 168 read_lock_fence(NULL), | 174 read_lock_fence(NULL), |
| 169 size(size), | 175 size(size), |
| 170 format(format), | |
| 171 original_filter(filter), | 176 original_filter(filter), |
| 172 filter(filter), | 177 filter(filter), |
| 173 target(0), | 178 target(0), |
| 174 image_id(0), | 179 image_id(0), |
| 175 texture_pool(0), | 180 texture_pool(0), |
| 176 wrap_mode(wrap_mode), | 181 wrap_mode(wrap_mode), |
| 177 hint(TextureUsageAny), | 182 hint(TextureUsageAny), |
| 178 type(Bitmap) { | 183 type(Bitmap), |
| 184 format(RGBA_8888) { |
| 179 DCHECK(wrap_mode == GL_CLAMP_TO_EDGE || wrap_mode == GL_REPEAT); | 185 DCHECK(wrap_mode == GL_CLAMP_TO_EDGE || wrap_mode == GL_REPEAT); |
| 180 } | 186 } |
| 181 | 187 |
| 182 ResourceProvider::Child::Child() {} | 188 ResourceProvider::Child::Child() {} |
| 183 | 189 |
| 184 ResourceProvider::Child::~Child() {} | 190 ResourceProvider::Child::~Child() {} |
| 185 | 191 |
| 186 scoped_ptr<ResourceProvider> ResourceProvider::Create( | 192 scoped_ptr<ResourceProvider> ResourceProvider::Create( |
| 187 OutputSurface* output_surface, | 193 OutputSurface* output_surface, |
| 188 int highp_threshold_min) { | 194 int highp_threshold_min, |
| 195 bool use_rgba_4444_texture_format) { |
| 189 scoped_ptr<ResourceProvider> resource_provider( | 196 scoped_ptr<ResourceProvider> resource_provider( |
| 190 new ResourceProvider(output_surface, highp_threshold_min)); | 197 new ResourceProvider(output_surface, |
| 198 highp_threshold_min, |
| 199 use_rgba_4444_texture_format)); |
| 191 | 200 |
| 192 bool success = false; | 201 bool success = false; |
| 193 if (resource_provider->Context3d()) { | 202 if (resource_provider->Context3d()) { |
| 194 success = resource_provider->InitializeGL(); | 203 success = resource_provider->InitializeGL(); |
| 195 } else { | 204 } else { |
| 196 resource_provider->InitializeSoftware(); | 205 resource_provider->InitializeSoftware(); |
| 197 success = true; | 206 success = true; |
| 198 } | 207 } |
| 199 | 208 |
| 200 if (!success) | 209 if (!success) |
| 201 return scoped_ptr<ResourceProvider>(); | 210 return scoped_ptr<ResourceProvider>(); |
| 202 | 211 |
| 203 DCHECK_NE(InvalidType, resource_provider->default_resource_type()); | 212 DCHECK_NE(InvalidType, resource_provider->default_resource_type()); |
| 204 return resource_provider.Pass(); | 213 return resource_provider.Pass(); |
| 205 } | 214 } |
| 206 | 215 |
| 207 ResourceProvider::~ResourceProvider() { | 216 ResourceProvider::~ResourceProvider() { |
| 208 while (!resources_.empty()) | 217 while (!resources_.empty()) |
| 209 DeleteResourceInternal(resources_.begin(), ForShutdown); | 218 DeleteResourceInternal(resources_.begin(), ForShutdown); |
| 210 | 219 |
| 211 CleanUpGLIfNeeded(); | 220 CleanUpGLIfNeeded(); |
| 212 } | 221 } |
| 213 | 222 |
| 214 bool ResourceProvider::InUseByConsumer(ResourceId id) { | 223 bool ResourceProvider::InUseByConsumer(ResourceId id) { |
| 215 Resource* resource = GetResource(id); | 224 Resource* resource = GetResource(id); |
| 216 return resource->lock_for_read_count > 0 || resource->exported_count > 0; | 225 return resource->lock_for_read_count > 0 || resource->exported_count > 0; |
| 217 } | 226 } |
| 218 | 227 |
| 219 ResourceProvider::ResourceId ResourceProvider::CreateResource( | 228 ResourceProvider::ResourceId ResourceProvider::CreateResource( |
| 220 gfx::Size size, GLenum format, GLint wrap_mode, TextureUsageHint hint) { | 229 gfx::Size size, |
| 230 GLint wrap_mode, |
| 231 TextureUsageHint hint, |
| 232 ResourceFormat format) { |
| 221 DCHECK(!size.IsEmpty()); | 233 DCHECK(!size.IsEmpty()); |
| 222 switch (default_resource_type_) { | 234 switch (default_resource_type_) { |
| 223 case GLTexture: | 235 case GLTexture: |
| 224 return CreateGLTexture(size, format, GL_TEXTURE_POOL_UNMANAGED_CHROMIUM, | 236 return CreateGLTexture(size, |
| 225 wrap_mode, hint); | 237 GL_TEXTURE_POOL_UNMANAGED_CHROMIUM, |
| 238 wrap_mode, |
| 239 hint, |
| 240 format); |
| 226 case Bitmap: | 241 case Bitmap: |
| 227 // The only wrap_mode currently implemented in software mode is | 242 DCHECK_EQ(RGBA_8888, format); |
| 228 // GL_CLAMP_TO_EDGE. | |
| 229 // http://crbug.com/284796 | |
| 230 DCHECK(format == GL_RGBA); | |
| 231 return CreateBitmap(size); | 243 return CreateBitmap(size); |
| 232 case InvalidType: | 244 case InvalidType: |
| 233 break; | 245 break; |
| 234 } | 246 } |
| 235 | 247 |
| 236 LOG(FATAL) << "Invalid default resource type."; | 248 LOG(FATAL) << "Invalid default resource type."; |
| 237 return 0; | 249 return 0; |
| 238 } | 250 } |
| 239 | 251 |
| 240 ResourceProvider::ResourceId ResourceProvider::CreateManagedResource( | 252 ResourceProvider::ResourceId ResourceProvider::CreateManagedResource( |
| 241 gfx::Size size, GLenum format, GLint wrap_mode, TextureUsageHint hint) { | 253 gfx::Size size, |
| 254 GLint wrap_mode, |
| 255 TextureUsageHint hint, |
| 256 ResourceFormat format) { |
| 242 DCHECK(!size.IsEmpty()); | 257 DCHECK(!size.IsEmpty()); |
| 243 switch (default_resource_type_) { | 258 switch (default_resource_type_) { |
| 244 case GLTexture: | 259 case GLTexture: |
| 245 return CreateGLTexture(size, format, GL_TEXTURE_POOL_MANAGED_CHROMIUM, | 260 return CreateGLTexture(size, |
| 246 wrap_mode, hint); | 261 GL_TEXTURE_POOL_MANAGED_CHROMIUM, |
| 262 wrap_mode, |
| 263 hint, |
| 264 format); |
| 247 case Bitmap: | 265 case Bitmap: |
| 248 DCHECK(format == GL_RGBA); | 266 DCHECK_EQ(RGBA_8888, format); |
| 249 return CreateBitmap(size); | 267 return CreateBitmap(size); |
| 250 case InvalidType: | 268 case InvalidType: |
| 251 break; | 269 break; |
| 252 } | 270 } |
| 253 | 271 |
| 254 LOG(FATAL) << "Invalid default resource type."; | 272 LOG(FATAL) << "Invalid default resource type."; |
| 255 return 0; | 273 return 0; |
| 256 } | 274 } |
| 257 | 275 |
| 258 ResourceProvider::ResourceId ResourceProvider::CreateGLTexture( | 276 ResourceProvider::ResourceId ResourceProvider::CreateGLTexture( |
| 259 gfx::Size size, | 277 gfx::Size size, |
| 260 GLenum format, | |
| 261 GLenum texture_pool, | 278 GLenum texture_pool, |
| 262 GLint wrap_mode, | 279 GLint wrap_mode, |
| 263 TextureUsageHint hint) { | 280 TextureUsageHint hint, |
| 281 ResourceFormat format) { |
| 264 DCHECK_LE(size.width(), max_texture_size_); | 282 DCHECK_LE(size.width(), max_texture_size_); |
| 265 DCHECK_LE(size.height(), max_texture_size_); | 283 DCHECK_LE(size.height(), max_texture_size_); |
| 266 DCHECK(thread_checker_.CalledOnValidThread()); | 284 DCHECK(thread_checker_.CalledOnValidThread()); |
| 267 | 285 |
| 268 ResourceId id = next_id_++; | 286 ResourceId id = next_id_++; |
| 269 Resource resource(0, size, format, GL_LINEAR, texture_pool, wrap_mode, hint); | 287 Resource resource(0, size, GL_LINEAR, texture_pool, wrap_mode, hint, format); |
| 270 resource.allocated = false; | 288 resource.allocated = false; |
| 271 resources_[id] = resource; | 289 resources_[id] = resource; |
| 272 return id; | 290 return id; |
| 273 } | 291 } |
| 274 | 292 |
| 275 ResourceProvider::ResourceId ResourceProvider::CreateBitmap(gfx::Size size) { | 293 ResourceProvider::ResourceId ResourceProvider::CreateBitmap(gfx::Size size) { |
| 276 DCHECK(thread_checker_.CalledOnValidThread()); | 294 DCHECK(thread_checker_.CalledOnValidThread()); |
| 277 | 295 |
| 278 uint8_t* pixels = new uint8_t[4 * size.GetArea()]; | 296 uint8_t* pixels = new uint8_t[4 * size.GetArea()]; |
| 279 | 297 |
| 280 ResourceId id = next_id_++; | 298 ResourceId id = next_id_++; |
| 281 Resource resource(pixels, size, GL_RGBA, GL_LINEAR, GL_CLAMP_TO_EDGE); | 299 Resource resource(pixels, size, GL_LINEAR, GL_CLAMP_TO_EDGE); |
| 282 resource.allocated = true; | 300 resource.allocated = true; |
| 283 resources_[id] = resource; | 301 resources_[id] = resource; |
| 284 return id; | 302 return id; |
| 285 } | 303 } |
| 286 | 304 |
| 287 ResourceProvider::ResourceId | 305 ResourceProvider::ResourceId |
| 288 ResourceProvider::CreateResourceFromExternalTexture( | 306 ResourceProvider::CreateResourceFromExternalTexture( |
| 289 unsigned texture_target, | 307 unsigned texture_target, |
| 290 unsigned texture_id) { | 308 unsigned texture_id) { |
| 291 DCHECK(thread_checker_.CalledOnValidThread()); | 309 DCHECK(thread_checker_.CalledOnValidThread()); |
| 292 | 310 |
| 293 WebGraphicsContext3D* context3d = Context3d(); | 311 WebGraphicsContext3D* context3d = Context3d(); |
| 294 DCHECK(context3d); | 312 DCHECK(context3d); |
| 295 GLC(context3d, context3d->bindTexture(texture_target, texture_id)); | 313 GLC(context3d, context3d->bindTexture(texture_target, texture_id)); |
| 296 GLC(context3d, context3d->texParameteri( | 314 GLC(context3d, context3d->texParameteri( |
| 297 texture_target, GL_TEXTURE_MIN_FILTER, GL_LINEAR)); | 315 texture_target, GL_TEXTURE_MIN_FILTER, GL_LINEAR)); |
| 298 GLC(context3d, context3d->texParameteri( | 316 GLC(context3d, context3d->texParameteri( |
| 299 texture_target, GL_TEXTURE_MAG_FILTER, GL_LINEAR)); | 317 texture_target, GL_TEXTURE_MAG_FILTER, GL_LINEAR)); |
| 300 GLC(context3d, context3d->texParameteri( | 318 GLC(context3d, context3d->texParameteri( |
| 301 texture_target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE)); | 319 texture_target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE)); |
| 302 GLC(context3d, context3d->texParameteri( | 320 GLC(context3d, context3d->texParameteri( |
| 303 texture_target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE)); | 321 texture_target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE)); |
| 304 | 322 |
| 305 ResourceId id = next_id_++; | 323 ResourceId id = next_id_++; |
| 306 Resource resource(texture_id, gfx::Size(), 0, GL_LINEAR, 0, GL_CLAMP_TO_EDGE, | 324 Resource resource(texture_id, |
| 307 TextureUsageAny); | 325 gfx::Size(), |
| 326 GL_LINEAR, |
| 327 0, |
| 328 GL_CLAMP_TO_EDGE, |
| 329 TextureUsageAny, |
| 330 RGBA_8888); |
| 308 resource.external = true; | 331 resource.external = true; |
| 309 resource.allocated = true; | 332 resource.allocated = true; |
| 310 resources_[id] = resource; | 333 resources_[id] = resource; |
| 311 return id; | 334 return id; |
| 312 } | 335 } |
| 313 | 336 |
| 314 ResourceProvider::ResourceId ResourceProvider::CreateResourceFromTextureMailbox( | 337 ResourceProvider::ResourceId ResourceProvider::CreateResourceFromTextureMailbox( |
| 315 const TextureMailbox& mailbox) { | 338 const TextureMailbox& mailbox) { |
| 316 DCHECK(thread_checker_.CalledOnValidThread()); | 339 DCHECK(thread_checker_.CalledOnValidThread()); |
| 317 // Just store the information. Mailbox will be consumed in LockForRead(). | 340 // Just store the information. Mailbox will be consumed in LockForRead(). |
| 318 ResourceId id = next_id_++; | 341 ResourceId id = next_id_++; |
| 319 DCHECK(mailbox.IsValid()); | 342 DCHECK(mailbox.IsValid()); |
| 320 Resource& resource = resources_[id]; | 343 Resource& resource = resources_[id]; |
| 321 if (mailbox.IsTexture()) { | 344 if (mailbox.IsTexture()) { |
| 322 resource = Resource(0, gfx::Size(), 0, GL_LINEAR, 0, GL_CLAMP_TO_EDGE, | 345 resource = Resource(0, |
| 323 TextureUsageAny); | 346 gfx::Size(), |
| 347 GL_LINEAR, |
| 348 0, |
| 349 GL_CLAMP_TO_EDGE, |
| 350 TextureUsageAny, |
| 351 RGBA_8888); |
| 324 } else { | 352 } else { |
| 325 DCHECK(mailbox.IsSharedMemory()); | 353 DCHECK(mailbox.IsSharedMemory()); |
| 326 base::SharedMemory* shared_memory = mailbox.shared_memory(); | 354 base::SharedMemory* shared_memory = mailbox.shared_memory(); |
| 327 DCHECK(shared_memory->memory()); | 355 DCHECK(shared_memory->memory()); |
| 328 uint8_t* pixels = reinterpret_cast<uint8_t*>(shared_memory->memory()); | 356 uint8_t* pixels = reinterpret_cast<uint8_t*>(shared_memory->memory()); |
| 329 resource = Resource(pixels, mailbox.shared_memory_size(), | 357 resource = Resource( |
| 330 GL_RGBA, GL_LINEAR, GL_CLAMP_TO_EDGE); | 358 pixels, mailbox.shared_memory_size(), GL_LINEAR, GL_CLAMP_TO_EDGE); |
| 331 } | 359 } |
| 332 resource.external = true; | 360 resource.external = true; |
| 333 resource.allocated = true; | 361 resource.allocated = true; |
| 334 resource.mailbox = mailbox; | 362 resource.mailbox = mailbox; |
| 335 return id; | 363 return id; |
| 336 } | 364 } |
| 337 | 365 |
| 338 void ResourceProvider::DeleteResource(ResourceId id) { | 366 void ResourceProvider::DeleteResource(ResourceId id) { |
| 339 DCHECK(thread_checker_.CalledOnValidThread()); | 367 DCHECK(thread_checker_.CalledOnValidThread()); |
| 340 ResourceMap::iterator it = resources_.find(id); | 368 ResourceMap::iterator it = resources_.find(id); |
| (...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 437 texture_uploader_->Upload(image, | 465 texture_uploader_->Upload(image, |
| 438 image_rect, | 466 image_rect, |
| 439 source_rect, | 467 source_rect, |
| 440 dest_offset, | 468 dest_offset, |
| 441 resource->format, | 469 resource->format, |
| 442 resource->size); | 470 resource->size); |
| 443 } | 471 } |
| 444 | 472 |
| 445 if (resource->pixels) { | 473 if (resource->pixels) { |
| 446 DCHECK(resource->allocated); | 474 DCHECK(resource->allocated); |
| 447 DCHECK(resource->format == GL_RGBA); | 475 DCHECK_EQ(RGBA_8888, resource->format); |
| 448 SkBitmap src_full; | 476 SkBitmap src_full; |
| 449 src_full.setConfig( | 477 src_full.setConfig( |
| 450 SkBitmap::kARGB_8888_Config, image_rect.width(), image_rect.height()); | 478 SkBitmap::kARGB_8888_Config, image_rect.width(), image_rect.height()); |
| 451 src_full.setPixels(const_cast<uint8_t*>(image)); | 479 src_full.setPixels(const_cast<uint8_t*>(image)); |
| 452 SkBitmap src_subset; | 480 SkBitmap src_subset; |
| 453 SkIRect sk_source_rect = SkIRect::MakeXYWH(source_rect.x(), | 481 SkIRect sk_source_rect = SkIRect::MakeXYWH(source_rect.x(), |
| 454 source_rect.y(), | 482 source_rect.y(), |
| 455 source_rect.width(), | 483 source_rect.width(), |
| 456 source_rect.height()); | 484 source_rect.height()); |
| 457 sk_source_rect.offset(-image_rect.x(), -image_rect.y()); | 485 sk_source_rect.offset(-image_rect.x(), -image_rect.y()); |
| (...skipping 203 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 661 DCHECK(texture_id_); | 689 DCHECK(texture_id_); |
| 662 } | 690 } |
| 663 | 691 |
| 664 ResourceProvider::ScopedWriteLockGL::~ScopedWriteLockGL() { | 692 ResourceProvider::ScopedWriteLockGL::~ScopedWriteLockGL() { |
| 665 resource_provider_->UnlockForWrite(resource_id_); | 693 resource_provider_->UnlockForWrite(resource_id_); |
| 666 } | 694 } |
| 667 | 695 |
| 668 void ResourceProvider::PopulateSkBitmapWithResource( | 696 void ResourceProvider::PopulateSkBitmapWithResource( |
| 669 SkBitmap* sk_bitmap, const Resource* resource) { | 697 SkBitmap* sk_bitmap, const Resource* resource) { |
| 670 DCHECK(resource->pixels); | 698 DCHECK(resource->pixels); |
| 671 DCHECK(resource->format == GL_RGBA); | 699 DCHECK_EQ(RGBA_8888, resource->format); |
| 672 sk_bitmap->setConfig(SkBitmap::kARGB_8888_Config, | 700 sk_bitmap->setConfig(SkBitmap::kARGB_8888_Config, |
| 673 resource->size.width(), | 701 resource->size.width(), |
| 674 resource->size.height()); | 702 resource->size.height()); |
| 675 sk_bitmap->setPixels(resource->pixels); | 703 sk_bitmap->setPixels(resource->pixels); |
| 676 } | 704 } |
| 677 | 705 |
| 678 ResourceProvider::ScopedReadLockSoftware::ScopedReadLockSoftware( | 706 ResourceProvider::ScopedReadLockSoftware::ScopedReadLockSoftware( |
| 679 ResourceProvider* resource_provider, | 707 ResourceProvider* resource_provider, |
| 680 ResourceProvider::ResourceId resource_id) | 708 ResourceProvider::ResourceId resource_id) |
| 681 : resource_provider_(resource_provider), | 709 : resource_provider_(resource_provider), |
| (...skipping 14 matching lines...) Expand all Loading... |
| 696 ResourceProvider::PopulateSkBitmapWithResource( | 724 ResourceProvider::PopulateSkBitmapWithResource( |
| 697 &sk_bitmap_, resource_provider->LockForWrite(resource_id)); | 725 &sk_bitmap_, resource_provider->LockForWrite(resource_id)); |
| 698 sk_canvas_.reset(new SkCanvas(sk_bitmap_)); | 726 sk_canvas_.reset(new SkCanvas(sk_bitmap_)); |
| 699 } | 727 } |
| 700 | 728 |
| 701 ResourceProvider::ScopedWriteLockSoftware::~ScopedWriteLockSoftware() { | 729 ResourceProvider::ScopedWriteLockSoftware::~ScopedWriteLockSoftware() { |
| 702 resource_provider_->UnlockForWrite(resource_id_); | 730 resource_provider_->UnlockForWrite(resource_id_); |
| 703 } | 731 } |
| 704 | 732 |
| 705 ResourceProvider::ResourceProvider(OutputSurface* output_surface, | 733 ResourceProvider::ResourceProvider(OutputSurface* output_surface, |
| 706 int highp_threshold_min) | 734 int highp_threshold_min, |
| 735 bool use_rgba_4444_texture_format) |
| 707 : output_surface_(output_surface), | 736 : output_surface_(output_surface), |
| 708 lost_output_surface_(false), | 737 lost_output_surface_(false), |
| 709 highp_threshold_min_(highp_threshold_min), | 738 highp_threshold_min_(highp_threshold_min), |
| 710 next_id_(1), | 739 next_id_(1), |
| 711 next_child_(1), | 740 next_child_(1), |
| 712 default_resource_type_(InvalidType), | 741 default_resource_type_(InvalidType), |
| 713 use_texture_storage_ext_(false), | 742 use_texture_storage_ext_(false), |
| 714 use_texture_usage_hint_(false), | 743 use_texture_usage_hint_(false), |
| 715 use_shallow_flush_(false), | 744 use_shallow_flush_(false), |
| 716 max_texture_size_(0), | 745 max_texture_size_(0), |
| 717 best_texture_format_(0) { | 746 best_texture_format_(RGBA_8888), |
| 747 use_rgba_4444_texture_format_(use_rgba_4444_texture_format) { |
| 718 DCHECK(output_surface_->HasClient()); | 748 DCHECK(output_surface_->HasClient()); |
| 719 } | 749 } |
| 720 | 750 |
| 721 void ResourceProvider::InitializeSoftware() { | 751 void ResourceProvider::InitializeSoftware() { |
| 722 DCHECK(thread_checker_.CalledOnValidThread()); | 752 DCHECK(thread_checker_.CalledOnValidThread()); |
| 723 DCHECK_NE(Bitmap, default_resource_type_); | 753 DCHECK_NE(Bitmap, default_resource_type_); |
| 724 | 754 |
| 725 CleanUpGLIfNeeded(); | 755 CleanUpGLIfNeeded(); |
| 726 | 756 |
| 727 default_resource_type_ = Bitmap; | 757 default_resource_type_ = Bitmap; |
| 728 max_texture_size_ = INT_MAX / 2; | 758 max_texture_size_ = INT_MAX / 2; |
| 729 best_texture_format_ = GL_RGBA; | 759 best_texture_format_ = RGBA_8888; |
| 730 } | 760 } |
| 731 | 761 |
| 732 bool ResourceProvider::InitializeGL() { | 762 bool ResourceProvider::InitializeGL() { |
| 733 DCHECK(thread_checker_.CalledOnValidThread()); | 763 DCHECK(thread_checker_.CalledOnValidThread()); |
| 734 DCHECK(!texture_uploader_); | 764 DCHECK(!texture_uploader_); |
| 735 DCHECK_NE(GLTexture, default_resource_type_); | 765 DCHECK_NE(GLTexture, default_resource_type_); |
| 736 | 766 |
| 737 WebGraphicsContext3D* context3d = Context3d(); | 767 WebGraphicsContext3D* context3d = Context3d(); |
| 738 DCHECK(context3d); | 768 DCHECK(context3d); |
| 739 | 769 |
| (...skipping 180 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 920 // deadlocks and/or security issues. The caller is responsible for | 950 // deadlocks and/or security issues. The caller is responsible for |
| 921 // waiting asynchronously, and resetting sync_point before calling this. | 951 // waiting asynchronously, and resetting sync_point before calling this. |
| 922 // However if the parent is a renderer (e.g. browser tag), it may be ok | 952 // However if the parent is a renderer (e.g. browser tag), it may be ok |
| 923 // (and is simpler) to wait. | 953 // (and is simpler) to wait. |
| 924 if (it->sync_point) | 954 if (it->sync_point) |
| 925 GLC(context3d, context3d->waitSyncPoint(it->sync_point)); | 955 GLC(context3d, context3d->waitSyncPoint(it->sync_point)); |
| 926 GLC(context3d, texture_id = context3d->createTexture()); | 956 GLC(context3d, texture_id = context3d->createTexture()); |
| 927 GLC(context3d, context3d->bindTexture(GL_TEXTURE_2D, texture_id)); | 957 GLC(context3d, context3d->bindTexture(GL_TEXTURE_2D, texture_id)); |
| 928 GLC(context3d, context3d->consumeTextureCHROMIUM(GL_TEXTURE_2D, | 958 GLC(context3d, context3d->consumeTextureCHROMIUM(GL_TEXTURE_2D, |
| 929 it->mailbox.name)); | 959 it->mailbox.name)); |
| 960 |
| 930 ResourceId id = next_id_++; | 961 ResourceId id = next_id_++; |
| 931 Resource resource( | 962 Resource resource( |
| 932 texture_id, it->size, it->format, it->filter, 0, GL_CLAMP_TO_EDGE, | 963 texture_id, |
| 933 TextureUsageAny); | 964 it->size, |
| 965 it->filter, |
| 966 0, |
| 967 GL_CLAMP_TO_EDGE, |
| 968 TextureUsageAny, |
| 969 it->format); |
| 934 resource.mailbox.SetName(it->mailbox); | 970 resource.mailbox.SetName(it->mailbox); |
| 935 // Don't allocate a texture for a child. | 971 // Don't allocate a texture for a child. |
| 936 resource.allocated = true; | 972 resource.allocated = true; |
| 937 resource.imported_count = 1; | 973 resource.imported_count = 1; |
| 938 resources_[id] = resource; | 974 resources_[id] = resource; |
| 939 child_info.parent_to_child_map[id] = it->id; | 975 child_info.parent_to_child_map[id] = it->id; |
| 940 child_info.child_to_parent_map[it->id] = id; | 976 child_info.child_to_parent_map[it->id] = id; |
| 941 } | 977 } |
| 942 } | 978 } |
| 943 | 979 |
| (...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1013 DCHECK(!resource->image_id); | 1049 DCHECK(!resource->image_id); |
| 1014 | 1050 |
| 1015 if (resource->type == GLTexture) { | 1051 if (resource->type == GLTexture) { |
| 1016 WebGraphicsContext3D* context3d = Context3d(); | 1052 WebGraphicsContext3D* context3d = Context3d(); |
| 1017 DCHECK(context3d); | 1053 DCHECK(context3d); |
| 1018 if (!resource->gl_pixel_buffer_id) | 1054 if (!resource->gl_pixel_buffer_id) |
| 1019 resource->gl_pixel_buffer_id = context3d->createBuffer(); | 1055 resource->gl_pixel_buffer_id = context3d->createBuffer(); |
| 1020 context3d->bindBuffer( | 1056 context3d->bindBuffer( |
| 1021 GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, | 1057 GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, |
| 1022 resource->gl_pixel_buffer_id); | 1058 resource->gl_pixel_buffer_id); |
| 1059 size_t bytes_per_pixel = BytesPerPixel(resource->format); |
| 1023 context3d->bufferData( | 1060 context3d->bufferData( |
| 1024 GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, | 1061 GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, |
| 1025 4 * resource->size.GetArea(), | 1062 bytes_per_pixel * resource->size.GetArea(), |
| 1026 NULL, | 1063 NULL, |
| 1027 GL_DYNAMIC_DRAW); | 1064 GL_DYNAMIC_DRAW); |
| 1028 context3d->bindBuffer(GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, 0); | 1065 context3d->bindBuffer(GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, 0); |
| 1029 } | 1066 } |
| 1030 | 1067 |
| 1031 if (resource->pixels) { | 1068 if (resource->pixels) { |
| 1032 if (resource->pixel_buffer) | 1069 if (resource->pixel_buffer) |
| 1033 return; | 1070 return; |
| 1034 | 1071 |
| 1035 resource->pixel_buffer = new uint8_t[4 * resource->size.GetArea()]; | 1072 resource->pixel_buffer = new uint8_t[4 * resource->size.GetArea()]; |
| (...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1190 DCHECK(resource->gl_pixel_buffer_id); | 1227 DCHECK(resource->gl_pixel_buffer_id); |
| 1191 context3d->bindTexture(GL_TEXTURE_2D, resource->gl_id); | 1228 context3d->bindTexture(GL_TEXTURE_2D, resource->gl_id); |
| 1192 context3d->bindBuffer( | 1229 context3d->bindBuffer( |
| 1193 GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, | 1230 GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, |
| 1194 resource->gl_pixel_buffer_id); | 1231 resource->gl_pixel_buffer_id); |
| 1195 if (!resource->gl_upload_query_id) | 1232 if (!resource->gl_upload_query_id) |
| 1196 resource->gl_upload_query_id = context3d->createQueryEXT(); | 1233 resource->gl_upload_query_id = context3d->createQueryEXT(); |
| 1197 context3d->beginQueryEXT( | 1234 context3d->beginQueryEXT( |
| 1198 GL_ASYNC_PIXEL_UNPACK_COMPLETED_CHROMIUM, | 1235 GL_ASYNC_PIXEL_UNPACK_COMPLETED_CHROMIUM, |
| 1199 resource->gl_upload_query_id); | 1236 resource->gl_upload_query_id); |
| 1237 DCHECK(resource->format != RGBA_4444 || |
| 1238 (resource->size.width() % 2) == 0); |
| 1200 if (allocate) { | 1239 if (allocate) { |
| 1201 context3d->asyncTexImage2DCHROMIUM(GL_TEXTURE_2D, | 1240 context3d->asyncTexImage2DCHROMIUM( |
| 1202 0, /* level */ | 1241 GL_TEXTURE_2D, |
| 1203 resource->format, | 1242 0, /* level */ |
| 1204 resource->size.width(), | 1243 GetGLInternalFormat(resource->format), |
| 1205 resource->size.height(), | 1244 resource->size.width(), |
| 1206 0, /* border */ | 1245 resource->size.height(), |
| 1207 resource->format, | 1246 0, /* border */ |
| 1208 GL_UNSIGNED_BYTE, | 1247 GetGLDataFormat(resource->format), |
| 1209 NULL); | 1248 GetGLDataType(resource->format), |
| 1249 NULL); |
| 1210 } else { | 1250 } else { |
| 1211 context3d->asyncTexSubImage2DCHROMIUM(GL_TEXTURE_2D, | 1251 context3d->asyncTexSubImage2DCHROMIUM( |
| 1212 0, /* level */ | 1252 GL_TEXTURE_2D, |
| 1213 0, /* x */ | 1253 0, /* level */ |
| 1214 0, /* y */ | 1254 0, /* x */ |
| 1215 resource->size.width(), | 1255 0, /* y */ |
| 1216 resource->size.height(), | 1256 resource->size.width(), |
| 1217 resource->format, | 1257 resource->size.height(), |
| 1218 GL_UNSIGNED_BYTE, | 1258 GetGLDataFormat(resource->format), |
| 1219 NULL); | 1259 GetGLDataType(resource->format), |
| 1260 NULL); |
| 1220 } | 1261 } |
| 1221 context3d->endQueryEXT(GL_ASYNC_PIXEL_UNPACK_COMPLETED_CHROMIUM); | 1262 context3d->endQueryEXT(GL_ASYNC_PIXEL_UNPACK_COMPLETED_CHROMIUM); |
| 1222 context3d->bindBuffer(GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, 0); | 1263 context3d->bindBuffer(GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, 0); |
| 1223 } | 1264 } |
| 1224 | 1265 |
| 1225 if (resource->pixels) { | 1266 if (resource->pixels) { |
| 1226 DCHECK(!resource->mailbox.IsValid()); | 1267 DCHECK(!resource->mailbox.IsValid()); |
| 1227 DCHECK(resource->pixel_buffer); | 1268 DCHECK(resource->pixel_buffer); |
| 1228 DCHECK(resource->format == GL_RGBA); | 1269 DCHECK_EQ(RGBA_8888, resource->format); |
| 1229 | 1270 |
| 1230 std::swap(resource->pixels, resource->pixel_buffer); | 1271 std::swap(resource->pixels, resource->pixel_buffer); |
| 1231 delete[] resource->pixel_buffer; | 1272 delete[] resource->pixel_buffer; |
| 1232 resource->pixel_buffer = NULL; | 1273 resource->pixel_buffer = NULL; |
| 1233 } | 1274 } |
| 1234 | 1275 |
| 1235 resource->pending_set_pixels = true; | 1276 resource->pending_set_pixels = true; |
| 1236 resource->set_pixels_completion_forced = false; | 1277 resource->set_pixels_completion_forced = false; |
| 1237 } | 1278 } |
| 1238 | 1279 |
| (...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1324 void ResourceProvider::LazyAllocate(Resource* resource) { | 1365 void ResourceProvider::LazyAllocate(Resource* resource) { |
| 1325 DCHECK(resource); | 1366 DCHECK(resource); |
| 1326 LazyCreate(resource); | 1367 LazyCreate(resource); |
| 1327 | 1368 |
| 1328 DCHECK(resource->gl_id || resource->allocated); | 1369 DCHECK(resource->gl_id || resource->allocated); |
| 1329 if (resource->allocated || !resource->gl_id) | 1370 if (resource->allocated || !resource->gl_id) |
| 1330 return; | 1371 return; |
| 1331 resource->allocated = true; | 1372 resource->allocated = true; |
| 1332 WebGraphicsContext3D* context3d = Context3d(); | 1373 WebGraphicsContext3D* context3d = Context3d(); |
| 1333 gfx::Size& size = resource->size; | 1374 gfx::Size& size = resource->size; |
| 1334 GLenum format = resource->format; | 1375 ResourceFormat format = resource->format; |
| 1335 GLC(context3d, context3d->bindTexture(GL_TEXTURE_2D, resource->gl_id)); | 1376 GLC(context3d, context3d->bindTexture(GL_TEXTURE_2D, resource->gl_id)); |
| 1336 if (use_texture_storage_ext_ && IsTextureFormatSupportedForStorage(format)) { | 1377 if (use_texture_storage_ext_ && IsFormatSupportedForStorage(format)) { |
| 1337 GLenum storage_format = TextureToStorageFormat(format); | 1378 GLenum storage_format = TextureToStorageFormat(format); |
| 1338 GLC(context3d, context3d->texStorage2DEXT(GL_TEXTURE_2D, | 1379 GLC(context3d, context3d->texStorage2DEXT(GL_TEXTURE_2D, |
| 1339 1, | 1380 1, |
| 1340 storage_format, | 1381 storage_format, |
| 1341 size.width(), | 1382 size.width(), |
| 1342 size.height())); | 1383 size.height())); |
| 1343 } else { | 1384 } else { |
| 1344 GLC(context3d, context3d->texImage2D(GL_TEXTURE_2D, | 1385 GLC(context3d, context3d->texImage2D(GL_TEXTURE_2D, |
| 1345 0, | 1386 0, |
| 1346 format, | 1387 GetGLInternalFormat(format), |
| 1347 size.width(), | 1388 size.width(), |
| 1348 size.height(), | 1389 size.height(), |
| 1349 0, | 1390 0, |
| 1350 format, | 1391 GetGLDataFormat(format), |
| 1351 GL_UNSIGNED_BYTE, | 1392 GetGLDataType(format), |
| 1352 NULL)); | 1393 NULL)); |
| 1353 } | 1394 } |
| 1354 } | 1395 } |
| 1355 | 1396 |
| 1356 void ResourceProvider::EnableReadLockFences(ResourceProvider::ResourceId id, | 1397 void ResourceProvider::EnableReadLockFences(ResourceProvider::ResourceId id, |
| 1357 bool enable) { | 1398 bool enable) { |
| 1358 Resource* resource = GetResource(id); | 1399 Resource* resource = GetResource(id); |
| 1359 resource->enable_read_lock_fences = enable; | 1400 resource->enable_read_lock_fences = enable; |
| 1360 } | 1401 } |
| 1361 | 1402 |
| 1362 void ResourceProvider::AcquireImage(ResourceId id) { | 1403 void ResourceProvider::AcquireImage(ResourceId id) { |
| 1363 Resource* resource = GetResource(id); | 1404 Resource* resource = GetResource(id); |
| 1364 DCHECK(!resource->external); | 1405 DCHECK(!resource->external); |
| 1365 DCHECK_EQ(resource->exported_count, 0); | 1406 DCHECK_EQ(resource->exported_count, 0); |
| 1366 | 1407 |
| 1367 if (resource->type != GLTexture) | 1408 if (resource->type != GLTexture) |
| 1368 return; | 1409 return; |
| 1369 | 1410 |
| 1370 if (resource->image_id) | 1411 if (resource->image_id) |
| 1371 return; | 1412 return; |
| 1372 | 1413 |
| 1373 resource->allocated = true; | 1414 resource->allocated = true; |
| 1374 WebGraphicsContext3D* context3d = Context3d(); | 1415 WebGraphicsContext3D* context3d = Context3d(); |
| 1375 DCHECK(context3d); | 1416 DCHECK(context3d); |
| 1376 DCHECK_EQ(static_cast<GLenum>(GL_RGBA), resource->format); | 1417 DCHECK_EQ(RGBA_8888, resource->format); |
| 1377 resource->image_id = context3d->createImageCHROMIUM( | 1418 resource->image_id = context3d->createImageCHROMIUM( |
| 1378 resource->size.width(), resource->size.height(), GL_RGBA8_OES); | 1419 resource->size.width(), resource->size.height(), GL_RGBA8_OES); |
| 1379 DCHECK(resource->image_id); | 1420 DCHECK(resource->image_id); |
| 1380 } | 1421 } |
| 1381 | 1422 |
| 1382 void ResourceProvider::ReleaseImage(ResourceId id) { | 1423 void ResourceProvider::ReleaseImage(ResourceId id) { |
| 1383 Resource* resource = GetResource(id); | 1424 Resource* resource = GetResource(id); |
| 1384 DCHECK(!resource->external); | 1425 DCHECK(!resource->external); |
| 1385 DCHECK_EQ(resource->exported_count, 0); | 1426 DCHECK_EQ(resource->exported_count, 0); |
| 1386 | 1427 |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1446 GLint active_unit = 0; | 1487 GLint active_unit = 0; |
| 1447 context->getIntegerv(GL_ACTIVE_TEXTURE, &active_unit); | 1488 context->getIntegerv(GL_ACTIVE_TEXTURE, &active_unit); |
| 1448 return active_unit; | 1489 return active_unit; |
| 1449 } | 1490 } |
| 1450 | 1491 |
| 1451 WebKit::WebGraphicsContext3D* ResourceProvider::Context3d() const { | 1492 WebKit::WebGraphicsContext3D* ResourceProvider::Context3d() const { |
| 1452 ContextProvider* context_provider = output_surface_->context_provider(); | 1493 ContextProvider* context_provider = output_surface_->context_provider(); |
| 1453 return context_provider ? context_provider->Context3d() : NULL; | 1494 return context_provider ? context_provider->Context3d() : NULL; |
| 1454 } | 1495 } |
| 1455 | 1496 |
| 1497 size_t ResourceProvider::BytesPerPixel(ResourceFormat format) { |
| 1498 size_t components_per_pixel = 0; |
| 1499 switch (format) { |
| 1500 case RGBA_8888: |
| 1501 case RGBA_4444: |
| 1502 case BGRA_8888: |
| 1503 components_per_pixel = 4; |
| 1504 break; |
| 1505 case LUMINANCE_8: |
| 1506 components_per_pixel = 1; |
| 1507 break; |
| 1508 } |
| 1509 size_t bits_per_component = 0; |
| 1510 switch (format) { |
| 1511 case RGBA_8888: |
| 1512 case BGRA_8888: |
| 1513 case LUMINANCE_8: |
| 1514 bits_per_component = 8; |
| 1515 break; |
| 1516 case RGBA_4444: |
| 1517 bits_per_component = 4; |
| 1518 break; |
| 1519 } |
| 1520 const size_t kBitsPerByte = 8; |
| 1521 return (components_per_pixel * bits_per_component) / kBitsPerByte; |
| 1522 } |
| 1523 |
| 1524 GLenum ResourceProvider::GetGLDataType(ResourceFormat format) { |
| 1525 switch (format) { |
| 1526 case RGBA_4444: |
| 1527 return GL_UNSIGNED_SHORT_4_4_4_4; |
| 1528 case RGBA_8888: |
| 1529 case BGRA_8888: |
| 1530 case LUMINANCE_8: |
| 1531 return GL_UNSIGNED_BYTE; |
| 1532 } |
| 1533 NOTREACHED(); |
| 1534 return GL_UNSIGNED_BYTE; |
| 1535 } |
| 1536 |
| 1537 GLenum ResourceProvider::GetGLDataFormat(ResourceFormat format) { |
| 1538 switch (format) { |
| 1539 case RGBA_8888: |
| 1540 case RGBA_4444: |
| 1541 return GL_RGBA; |
| 1542 case BGRA_8888: |
| 1543 return GL_BGRA_EXT; |
| 1544 case LUMINANCE_8: |
| 1545 return GL_LUMINANCE; |
| 1546 } |
| 1547 NOTREACHED(); |
| 1548 return GL_RGBA; |
| 1549 } |
| 1550 |
| 1551 GLenum ResourceProvider::GetGLInternalFormat(ResourceFormat format) { |
| 1552 return GetGLDataFormat(format); |
| 1553 } |
| 1554 |
| 1456 } // namespace cc | 1555 } // namespace cc |
| OLD | NEW |