OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 "ui/gl/gl_image_memory.h" | 5 #include "ui/gl/gl_image_memory.h" |
6 | 6 |
7 #include "base/logging.h" | 7 #include "base/logging.h" |
8 #include "base/trace_event/trace_event.h" | 8 #include "base/trace_event/trace_event.h" |
9 #include "ui/gl/gl_bindings.h" | 9 #include "ui/gl/gl_bindings.h" |
10 #include "ui/gl/scoped_binders.h" | 10 #include "ui/gl/scoped_binders.h" |
(...skipping 246 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
257 // Defer DoBindTexImage if not currently in use. | 257 // Defer DoBindTexImage if not currently in use. |
258 if (!in_use_) { | 258 if (!in_use_) { |
259 need_do_bind_tex_image_ = true; | 259 need_do_bind_tex_image_ = true; |
260 return true; | 260 return true; |
261 } | 261 } |
262 | 262 |
263 DoBindTexImage(target); | 263 DoBindTexImage(target); |
264 return true; | 264 return true; |
265 } | 265 } |
266 | 266 |
267 bool GLImageMemory::CopyTexImage(unsigned target) { | 267 bool GLImageMemory::CopyTexSubImage(unsigned target, |
268 TRACE_EVENT0("gpu", "GLImageMemory::CopyTexImage"); | 268 const Point& offset, |
| 269 const Rect& rect) { |
| 270 TRACE_EVENT2("gpu", "GLImageMemory::CopyTexSubImage", "width", rect.width(), |
| 271 "height", rect.height()); |
269 | 272 |
270 // GL_TEXTURE_EXTERNAL_OES is not a supported CopyTexImage target. | 273 // GL_TEXTURE_EXTERNAL_OES is not a supported CopyTexSubImage target. |
271 if (target == GL_TEXTURE_EXTERNAL_OES) | 274 if (target == GL_TEXTURE_EXTERNAL_OES) |
272 return false; | 275 return false; |
273 | 276 |
| 277 // Sub width is not supported. |
| 278 if (rect.width() != size_.width()) |
| 279 return false; |
| 280 |
| 281 // Height must be a multiple of 4 if compressed. |
| 282 if (IsCompressedFormat(format_) && rect.height() % 4) |
| 283 return false; |
| 284 |
| 285 size_t stride_in_bytes = 0; |
| 286 bool rv = StrideInBytes(size_.width(), format_, &stride_in_bytes); |
| 287 DCHECK(rv); |
274 DCHECK(memory_); | 288 DCHECK(memory_); |
| 289 const unsigned char* data = memory_ + rect.y() * stride_in_bytes; |
275 if (IsCompressedFormat(format_)) { | 290 if (IsCompressedFormat(format_)) { |
276 glCompressedTexSubImage2D(target, | 291 glCompressedTexSubImage2D(target, |
277 0, // level | 292 0, // level |
278 0, // x-offset | 293 offset.x(), offset.y(), rect.width(), |
279 0, // y-offset | 294 rect.height(), DataFormat(format_), |
280 size_.width(), size_.height(), | 295 SizeInBytes(rect.size(), format_), data); |
281 DataFormat(format_), SizeInBytes(size_, format_), | |
282 memory_); | |
283 } else { | 296 } else { |
284 glTexSubImage2D(target, 0, // level | 297 glTexSubImage2D(target, 0, // level |
285 0, // x | 298 offset.x(), offset.y(), rect.width(), rect.height(), |
286 0, // y | 299 DataFormat(format_), DataType(format_), data); |
287 size_.width(), size_.height(), DataFormat(format_), | |
288 DataType(format_), memory_); | |
289 } | 300 } |
290 | 301 |
291 return true; | 302 return true; |
292 } | 303 } |
293 | 304 |
294 void GLImageMemory::WillUseTexImage() { | 305 void GLImageMemory::WillUseTexImage() { |
295 DCHECK(!in_use_); | 306 DCHECK(!in_use_); |
296 in_use_ = true; | 307 in_use_ = true; |
297 | 308 |
298 if (!need_do_bind_tex_image_) | 309 if (!need_do_bind_tex_image_) |
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
411 size_.width(), | 422 size_.width(), |
412 size_.height(), | 423 size_.height(), |
413 0, // border | 424 0, // border |
414 DataFormat(format_), | 425 DataFormat(format_), |
415 DataType(format_), | 426 DataType(format_), |
416 memory_); | 427 memory_); |
417 } | 428 } |
418 } | 429 } |
419 | 430 |
420 } // namespace gfx | 431 } // namespace gfx |
OLD | NEW |