Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(421)

Side by Side Diff: Source/platform/graphics/gpu/WebGLImageConversion.cpp

Issue 604373003: [WIP] Supporting arm_neon_optional flag for blink platform. Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Created 6 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « Source/platform/graphics/gpu/WebGLImageConversion.h ('k') | Source/wtf/CPU.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 "config.h" 5 #include "config.h"
6 #include "platform/graphics/gpu/WebGLImageConversion.h" 6 #include "platform/graphics/gpu/WebGLImageConversion.h"
7 7
8 #include "platform/CheckedInt.h" 8 #include "platform/CheckedInt.h"
9 #include "platform/graphics/ImageObserver.h" 9 #include "platform/graphics/ImageObserver.h"
10 #include "platform/graphics/cpu/arm/WebGLImageConversionNEON.h" 10 #if HAVE(ARM_NEON_INTRINSICS)
11 #include "platform/graphics/cpu/arm/gpu/WebGLImageConversionNEON.h"
12 #endif
11 #include "platform/image-decoders/ImageDecoder.h" 13 #include "platform/image-decoders/ImageDecoder.h"
12 #include "wtf/OwnPtr.h" 14 #include "wtf/OwnPtr.h"
13 #include "wtf/PassOwnPtr.h" 15 #include "wtf/PassOwnPtr.h"
14 16
15 namespace blink { 17 namespace blink {
16 18
17 namespace { 19 namespace {
18 20
19 WebGLImageConversion::DataFormat getDataFormat(GLenum destinationFormat, GLenum destinationType) 21 WebGLImageConversion::DataFormat getDataFormat(GLenum destinationFormat, GLenum destinationType)
20 { 22 {
(...skipping 275 matching lines...) Expand 10 before | Expand all | Expand 10 after
296 uint32_t brMask = 0x00ff00ff; 298 uint32_t brMask = 0x00ff00ff;
297 uint32_t gaMask = 0xff00ff00; 299 uint32_t gaMask = 0xff00ff00;
298 #endif 300 #endif
299 uint32_t rgba = (((bgra >> 16) | (bgra << 16)) & brMask) | (bgra & gaMas k); 301 uint32_t rgba = (((bgra >> 16) | (bgra << 16)) & brMask) | (bgra & gaMas k);
300 destination32[i] = rgba; 302 destination32[i] = rgba;
301 } 303 }
302 } 304 }
303 305
304 template<> void unpack<WebGLImageConversion::DataFormatRGBA5551, uint16_t, uint8 _t>(const uint16_t* source, uint8_t* destination, unsigned pixelsPerRow) 306 template<> void unpack<WebGLImageConversion::DataFormatRGBA5551, uint16_t, uint8 _t>(const uint16_t* source, uint8_t* destination, unsigned pixelsPerRow)
305 { 307 {
306 #if HAVE(ARM_NEON_INTRINSICS) 308 WTF_CPU_ARM_NEON_WRAP(SIMD::unpackOneRowOfRGBA5551ToRGBA8)(source, destinati on, pixelsPerRow);
307 SIMD::unpackOneRowOfRGBA5551ToRGBA8(source, destination, pixelsPerRow);
308 #endif
309 for (unsigned i = 0; i < pixelsPerRow; ++i) { 309 for (unsigned i = 0; i < pixelsPerRow; ++i) {
310 uint16_t packedValue = source[0]; 310 uint16_t packedValue = source[0];
311 uint8_t r = packedValue >> 11; 311 uint8_t r = packedValue >> 11;
312 uint8_t g = (packedValue >> 6) & 0x1F; 312 uint8_t g = (packedValue >> 6) & 0x1F;
313 uint8_t b = (packedValue >> 1) & 0x1F; 313 uint8_t b = (packedValue >> 1) & 0x1F;
314 destination[0] = (r << 3) | (r & 0x7); 314 destination[0] = (r << 3) | (r & 0x7);
315 destination[1] = (g << 3) | (g & 0x7); 315 destination[1] = (g << 3) | (g & 0x7);
316 destination[2] = (b << 3) | (b & 0x7); 316 destination[2] = (b << 3) | (b & 0x7);
317 destination[3] = (packedValue & 0x1) ? 0xFF : 0x0; 317 destination[3] = (packedValue & 0x1) ? 0xFF : 0x0;
318 source += 1; 318 source += 1;
319 destination += 4; 319 destination += 4;
320 } 320 }
321 } 321 }
322 322
323 template<> void unpack<WebGLImageConversion::DataFormatRGBA4444, uint16_t, uint8 _t>(const uint16_t* source, uint8_t* destination, unsigned pixelsPerRow) 323 template<> void unpack<WebGLImageConversion::DataFormatRGBA4444, uint16_t, uint8 _t>(const uint16_t* source, uint8_t* destination, unsigned pixelsPerRow)
324 { 324 {
325 #if HAVE(ARM_NEON_INTRINSICS) 325 WTF_CPU_ARM_NEON_WRAP(SIMD::unpackOneRowOfRGBA4444ToRGBA8)(source, destinati on, pixelsPerRow);
326 SIMD::unpackOneRowOfRGBA4444ToRGBA8(source, destination, pixelsPerRow);
327 #endif
328 for (unsigned i = 0; i < pixelsPerRow; ++i) { 326 for (unsigned i = 0; i < pixelsPerRow; ++i) {
329 uint16_t packedValue = source[0]; 327 uint16_t packedValue = source[0];
330 uint8_t r = packedValue >> 12; 328 uint8_t r = packedValue >> 12;
331 uint8_t g = (packedValue >> 8) & 0x0F; 329 uint8_t g = (packedValue >> 8) & 0x0F;
332 uint8_t b = (packedValue >> 4) & 0x0F; 330 uint8_t b = (packedValue >> 4) & 0x0F;
333 uint8_t a = packedValue & 0x0F; 331 uint8_t a = packedValue & 0x0F;
334 destination[0] = r << 4 | r; 332 destination[0] = r << 4 | r;
335 destination[1] = g << 4 | g; 333 destination[1] = g << 4 | g;
336 destination[2] = b << 4 | b; 334 destination[2] = b << 4 | b;
337 destination[3] = a << 4 | a; 335 destination[3] = a << 4 | a;
338 source += 1; 336 source += 1;
339 destination += 4; 337 destination += 4;
340 } 338 }
341 } 339 }
342 340
343 template<> void unpack<WebGLImageConversion::DataFormatRGB565, uint16_t, uint8_t >(const uint16_t* source, uint8_t* destination, unsigned pixelsPerRow) 341 template<> void unpack<WebGLImageConversion::DataFormatRGB565, uint16_t, uint8_t >(const uint16_t* source, uint8_t* destination, unsigned pixelsPerRow)
344 { 342 {
345 #if HAVE(ARM_NEON_INTRINSICS) 343 WTF_CPU_ARM_NEON_WRAP(SIMD::unpackOneRowOfRGB565ToRGBA8)(source, destination , pixelsPerRow);
346 SIMD::unpackOneRowOfRGB565ToRGBA8(source, destination, pixelsPerRow);
347 #endif
348 for (unsigned i = 0; i < pixelsPerRow; ++i) { 344 for (unsigned i = 0; i < pixelsPerRow; ++i) {
349 uint16_t packedValue = source[0]; 345 uint16_t packedValue = source[0];
350 uint8_t r = packedValue >> 11; 346 uint8_t r = packedValue >> 11;
351 uint8_t g = (packedValue >> 5) & 0x3F; 347 uint8_t g = (packedValue >> 5) & 0x3F;
352 uint8_t b = packedValue & 0x1F; 348 uint8_t b = packedValue & 0x1F;
353 destination[0] = (r << 3) | (r & 0x7); 349 destination[0] = (r << 3) | (r & 0x7);
354 destination[1] = (g << 2) | (g & 0x3); 350 destination[1] = (g << 2) | (g & 0x3);
355 destination[2] = (b << 3) | (b & 0x7); 351 destination[2] = (b << 3) | (b & 0x7);
356 destination[3] = 0xFF; 352 destination[3] = 0xFF;
357 source += 1; 353 source += 1;
(...skipping 337 matching lines...) Expand 10 before | Expand all | Expand 10 after
695 destination[1] = sourceG; 691 destination[1] = sourceG;
696 destination[2] = sourceB; 692 destination[2] = sourceB;
697 destination[3] = source[3]; 693 destination[3] = source[3];
698 source += 4; 694 source += 4;
699 destination += 4; 695 destination += 4;
700 } 696 }
701 } 697 }
702 698
703 template<> void pack<WebGLImageConversion::DataFormatRGBA4444, WebGLImageConvers ion::AlphaDoNothing, uint8_t, uint16_t>(const uint8_t* source, uint16_t* destina tion, unsigned pixelsPerRow) 699 template<> void pack<WebGLImageConversion::DataFormatRGBA4444, WebGLImageConvers ion::AlphaDoNothing, uint8_t, uint16_t>(const uint8_t* source, uint16_t* destina tion, unsigned pixelsPerRow)
704 { 700 {
705 #if HAVE(ARM_NEON_INTRINSICS) 701 WTF_CPU_ARM_NEON_WRAP(SIMD::packOneRowOfRGBA8ToUnsignedShort4444)(source, de stination, pixelsPerRow);
706 SIMD::packOneRowOfRGBA8ToUnsignedShort4444(source, destination, pixelsPerRow );
707 #endif
708 for (unsigned i = 0; i < pixelsPerRow; ++i) { 702 for (unsigned i = 0; i < pixelsPerRow; ++i) {
709 *destination = (((source[0] & 0xF0) << 8) 703 *destination = (((source[0] & 0xF0) << 8)
710 | ((source[1] & 0xF0) << 4) 704 | ((source[1] & 0xF0) << 4)
711 | (source[2] & 0xF0) 705 | (source[2] & 0xF0)
712 | (source[3] >> 4)); 706 | (source[3] >> 4));
713 source += 4; 707 source += 4;
714 destination += 1; 708 destination += 1;
715 } 709 }
716 } 710 }
717 711
(...skipping 25 matching lines...) Expand all
743 | ((sourceG & 0xF0) << 4) 737 | ((sourceG & 0xF0) << 4)
744 | (sourceB & 0xF0) 738 | (sourceB & 0xF0)
745 | (source[3] >> 4)); 739 | (source[3] >> 4));
746 source += 4; 740 source += 4;
747 destination += 1; 741 destination += 1;
748 } 742 }
749 } 743 }
750 744
751 template<> void pack<WebGLImageConversion::DataFormatRGBA5551, WebGLImageConvers ion::AlphaDoNothing, uint8_t, uint16_t>(const uint8_t* source, uint16_t* destina tion, unsigned pixelsPerRow) 745 template<> void pack<WebGLImageConversion::DataFormatRGBA5551, WebGLImageConvers ion::AlphaDoNothing, uint8_t, uint16_t>(const uint8_t* source, uint16_t* destina tion, unsigned pixelsPerRow)
752 { 746 {
753 #if HAVE(ARM_NEON_INTRINSICS) 747 WTF_CPU_ARM_NEON_WRAP(SIMD::packOneRowOfRGBA8ToUnsignedShort5551)(source, de stination, pixelsPerRow);
754 SIMD::packOneRowOfRGBA8ToUnsignedShort5551(source, destination, pixelsPerRow );
755 #endif
756 for (unsigned i = 0; i < pixelsPerRow; ++i) { 748 for (unsigned i = 0; i < pixelsPerRow; ++i) {
757 *destination = (((source[0] & 0xF8) << 8) 749 *destination = (((source[0] & 0xF8) << 8)
758 | ((source[1] & 0xF8) << 3) 750 | ((source[1] & 0xF8) << 3)
759 | ((source[2] & 0xF8) >> 2) 751 | ((source[2] & 0xF8) >> 2)
760 | (source[3] >> 7)); 752 | (source[3] >> 7));
761 source += 4; 753 source += 4;
762 destination += 1; 754 destination += 1;
763 } 755 }
764 } 756 }
765 757
(...skipping 25 matching lines...) Expand all
791 | ((sourceG & 0xF8) << 3) 783 | ((sourceG & 0xF8) << 3)
792 | ((sourceB & 0xF8) >> 2) 784 | ((sourceB & 0xF8) >> 2)
793 | (source[3] >> 7)); 785 | (source[3] >> 7));
794 source += 4; 786 source += 4;
795 destination += 1; 787 destination += 1;
796 } 788 }
797 } 789 }
798 790
799 template<> void pack<WebGLImageConversion::DataFormatRGB565, WebGLImageConversio n::AlphaDoNothing, uint8_t, uint16_t>(const uint8_t* source, uint16_t* destinati on, unsigned pixelsPerRow) 791 template<> void pack<WebGLImageConversion::DataFormatRGB565, WebGLImageConversio n::AlphaDoNothing, uint8_t, uint16_t>(const uint8_t* source, uint16_t* destinati on, unsigned pixelsPerRow)
800 { 792 {
801 #if HAVE(ARM_NEON_INTRINSICS) 793 WTF_CPU_ARM_NEON_WRAP(SIMD::packOneRowOfRGBA8ToUnsignedShort565)(source, des tination, pixelsPerRow);
802 SIMD::packOneRowOfRGBA8ToUnsignedShort565(source, destination, pixelsPerRow) ;
803 #endif
804 for (unsigned i = 0; i < pixelsPerRow; ++i) { 794 for (unsigned i = 0; i < pixelsPerRow; ++i) {
805 *destination = (((source[0] & 0xF8) << 8) 795 *destination = (((source[0] & 0xF8) << 8)
806 | ((source[1] & 0xFC) << 3) 796 | ((source[1] & 0xFC) << 3)
807 | ((source[2] & 0xF8) >> 3)); 797 | ((source[2] & 0xF8) >> 3));
808 source += 4; 798 source += 4;
809 destination += 1; 799 destination += 1;
810 } 800 }
811 } 801 }
812 802
813 template<> void pack<WebGLImageConversion::DataFormatRGB565, WebGLImageConversio n::AlphaDoPremultiply, uint8_t, uint16_t>(const uint8_t* source, uint16_t* desti nation, unsigned pixelsPerRow) 803 template<> void pack<WebGLImageConversion::DataFormatRGB565, WebGLImageConversio n::AlphaDoPremultiply, uint8_t, uint16_t>(const uint8_t* source, uint16_t* desti nation, unsigned pixelsPerRow)
(...skipping 956 matching lines...) Expand 10 before | Expand all | Expand 10 after
1770 } 1760 }
1771 1761
1772 FormatConverter converter(width, height, sourceData, destinationData, srcStr ide, dstStride); 1762 FormatConverter converter(width, height, sourceData, destinationData, srcStr ide, dstStride);
1773 converter.convert(sourceDataFormat, dstDataFormat, alphaOp); 1763 converter.convert(sourceDataFormat, dstDataFormat, alphaOp);
1774 if (!converter.Success()) 1764 if (!converter.Success())
1775 return false; 1765 return false;
1776 return true; 1766 return true;
1777 } 1767 }
1778 1768
1779 } // namespace blink 1769 } // namespace blink
OLDNEW
« no previous file with comments | « Source/platform/graphics/gpu/WebGLImageConversion.h ('k') | Source/wtf/CPU.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698