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

Unified Diff: Source/platform/graphics/gpu/WebGLImageConversion.cpp

Issue 1189053002: Upgrade WebGLImageConversion to ES3: Part I. (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: rebased Created 5 years, 6 months 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « Source/platform/graphics/gpu/WebGLImageConversion.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: Source/platform/graphics/gpu/WebGLImageConversion.cpp
diff --git a/Source/platform/graphics/gpu/WebGLImageConversion.cpp b/Source/platform/graphics/gpu/WebGLImageConversion.cpp
index 4a802497f848ab2d071462bd5631b447029625ee..d1906366ee7d12f765ec231812eb1de147dc444f 100644
--- a/Source/platform/graphics/gpu/WebGLImageConversion.cpp
+++ b/Source/platform/graphics/gpu/WebGLImageConversion.cpp
@@ -212,6 +212,9 @@ WebGLImageConversion::DataFormat getDataFormat(GLenum destinationFormat, GLenum
case GL_UNSIGNED_SHORT_5_6_5:
dstFormat = WebGLImageConversion::DataFormatRGB565;
break;
+ case GL_UNSIGNED_INT_5_9_9_9_REV:
+ dstFormat = WebGLImageConversion::DataFormatRGB5999;
+ break;
case GL_UNSIGNED_INT_24_8:
dstFormat = WebGLImageConversion::DataFormatDS24_8;
break;
@@ -1137,7 +1140,13 @@ bool HasAlpha(int format)
|| format == WebGLImageConversion::DataFormatRGBA16F
|| format == WebGLImageConversion::DataFormatRGBA32F
|| format == WebGLImageConversion::DataFormatRGBA4444
- || format == WebGLImageConversion::DataFormatRGBA5551;
+ || format == WebGLImageConversion::DataFormatRGBA5551
+ || format == WebGLImageConversion::DataFormatRGBA8_S
+ || format == WebGLImageConversion::DataFormatRGBA16
+ || format == WebGLImageConversion::DataFormatRGBA16_S
+ || format == WebGLImageConversion::DataFormatRGBA32
+ || format == WebGLImageConversion::DataFormatRGBA32_S
+ || format == WebGLImageConversion::DataFormatRGBA2_10_10_10;
}
bool HasColor(int format)
@@ -1161,17 +1170,105 @@ bool HasColor(int format)
|| format == WebGLImageConversion::DataFormatRA8
|| format == WebGLImageConversion::DataFormatRA16F
|| format == WebGLImageConversion::DataFormatRA32F
- || format == WebGLImageConversion::DataFormatAR8;
+ || format == WebGLImageConversion::DataFormatAR8
+ || format == WebGLImageConversion::DataFormatRGBA8_S
+ || format == WebGLImageConversion::DataFormatRGBA16
+ || format == WebGLImageConversion::DataFormatRGBA16_S
+ || format == WebGLImageConversion::DataFormatRGBA32
+ || format == WebGLImageConversion::DataFormatRGBA32_S
+ || format == WebGLImageConversion::DataFormatRGBA2_10_10_10
+ || format == WebGLImageConversion::DataFormatRGB8_S
+ || format == WebGLImageConversion::DataFormatRGB16
+ || format == WebGLImageConversion::DataFormatRGB16_S
+ || format == WebGLImageConversion::DataFormatRGB32
+ || format == WebGLImageConversion::DataFormatRGB32_S
+ || format == WebGLImageConversion::DataFormatRGB10F11F11F
+ || format == WebGLImageConversion::DataFormatRGB5999
+ || format == WebGLImageConversion::DataFormatRG8
+ || format == WebGLImageConversion::DataFormatRG8_S
+ || format == WebGLImageConversion::DataFormatRG16
+ || format == WebGLImageConversion::DataFormatRG16_S
+ || format == WebGLImageConversion::DataFormatRG32
+ || format == WebGLImageConversion::DataFormatRG32_S
+ || format == WebGLImageConversion::DataFormatRG16F
+ || format == WebGLImageConversion::DataFormatRG32F
+ || format == WebGLImageConversion::DataFormatR8_S
+ || format == WebGLImageConversion::DataFormatR16
+ || format == WebGLImageConversion::DataFormatR16_S
+ || format == WebGLImageConversion::DataFormatR32
+ || format == WebGLImageConversion::DataFormatR32_S;
}
template<int Format>
+struct IsInt8Format {
+ static const bool Value =
+ Format == WebGLImageConversion::DataFormatRGBA8_S
+ || Format == WebGLImageConversion::DataFormatRGB8_S
+ || Format == WebGLImageConversion::DataFormatRG8_S
+ || Format == WebGLImageConversion::DataFormatR8_S;
+};
+
+template<int Format>
+struct IsInt16Format {
+ static const bool Value =
+ Format == WebGLImageConversion::DataFormatRGBA16_S
+ || Format == WebGLImageConversion::DataFormatRGB16_S
+ || Format == WebGLImageConversion::DataFormatRG16_S
+ || Format == WebGLImageConversion::DataFormatR16_S;
+};
+
+template<int Format>
+struct IsInt32Format {
+ static const bool Value =
+ Format == WebGLImageConversion::DataFormatRGBA32_S
+ || Format == WebGLImageConversion::DataFormatRGB32_S
+ || Format == WebGLImageConversion::DataFormatRG32_S
+ || Format == WebGLImageConversion::DataFormatR32_S;
+};
+
+template<int Format>
+struct IsUInt8Format {
+ static const bool Value =
+ Format == WebGLImageConversion::DataFormatRGBA8
+ || Format == WebGLImageConversion::DataFormatRGB8
+ || Format == WebGLImageConversion::DataFormatRG8
+ || Format == WebGLImageConversion::DataFormatR8
+ || Format == WebGLImageConversion::DataFormatBGRA8
+ || Format == WebGLImageConversion::DataFormatBGR8
+ || Format == WebGLImageConversion::DataFormatARGB8
+ || Format == WebGLImageConversion::DataFormatABGR8
+ || Format == WebGLImageConversion::DataFormatRA8
+ || Format == WebGLImageConversion::DataFormatAR8
+ || Format == WebGLImageConversion::DataFormatA8;
+};
+
+template<int Format>
+struct IsUInt16Format {
+ static const bool Value =
+ Format == WebGLImageConversion::DataFormatRGBA16
+ || Format == WebGLImageConversion::DataFormatRGB16
+ || Format == WebGLImageConversion::DataFormatRG16
+ || Format == WebGLImageConversion::DataFormatR16;
+};
+
+template<int Format>
+struct IsUInt32Format {
+ static const bool Value =
+ Format == WebGLImageConversion::DataFormatRGBA32
+ || Format == WebGLImageConversion::DataFormatRGB32
+ || Format == WebGLImageConversion::DataFormatRG32
+ || Format == WebGLImageConversion::DataFormatR32;
+};
+
+template<int Format>
struct IsFloatFormat {
static const bool Value =
Format == WebGLImageConversion::DataFormatRGBA32F
|| Format == WebGLImageConversion::DataFormatRGB32F
|| Format == WebGLImageConversion::DataFormatRA32F
|| Format == WebGLImageConversion::DataFormatR32F
- || Format == WebGLImageConversion::DataFormatA32F;
+ || Format == WebGLImageConversion::DataFormatA32F
+ || Format == WebGLImageConversion::DataFormatRG32F;
};
template<int Format>
@@ -1181,7 +1278,16 @@ struct IsHalfFloatFormat {
|| Format == WebGLImageConversion::DataFormatRGB16F
|| Format == WebGLImageConversion::DataFormatRA16F
|| Format == WebGLImageConversion::DataFormatR16F
- || Format == WebGLImageConversion::DataFormatA16F;
+ || Format == WebGLImageConversion::DataFormatA16F
+ || Format == WebGLImageConversion::DataFormatRG16F;
+};
+
+template<int Format>
+struct Is32bppFormat {
+ static const bool Value =
+ Format == WebGLImageConversion::DataFormatRGBA2_10_10_10
+ || Format == WebGLImageConversion::DataFormatRGB5999
+ || Format == WebGLImageConversion::DataFormatRGB10F11F11F;
};
template<int Format>
@@ -1192,29 +1298,89 @@ struct Is16bppFormat {
|| Format == WebGLImageConversion::DataFormatRGB565;
};
-template<int Format, bool IsFloat = IsFloatFormat<Format>::Value, bool IsHalfFloat = IsHalfFloatFormat<Format>::Value, bool Is16bpp = Is16bppFormat<Format>::Value>
+template<int Format,
+ bool IsInt8Format = IsInt8Format<Format>::Value,
+ bool IsUInt8Format = IsUInt8Format<Format>::Value,
+ bool IsInt16Format = IsInt16Format<Format>::Value,
+ bool IsUInt16Format = IsUInt16Format<Format>::Value,
+ bool IsInt32Format = IsInt32Format<Format>::Value,
+ bool IsUInt32Format = IsUInt32Format<Format>::Value,
+ bool IsFloat = IsFloatFormat<Format>::Value,
+ bool IsHalfFloat = IsHalfFloatFormat<Format>::Value,
+ bool Is16bpp = Is16bppFormat<Format>::Value,
+ bool Is32bpp = Is32bppFormat<Format>::Value>
struct DataTypeForFormat {
+ typedef double Type; // Use a type that's not used in unpack/pack.
+};
+
+template<int Format>
+struct DataTypeForFormat<Format, true, false, false, false, false, false, false, false, false, false> {
+ typedef int8_t Type;
+};
+
+template<int Format>
+struct DataTypeForFormat<Format, false, true, false, false, false, false, false, false, false, false> {
typedef uint8_t Type;
};
template<int Format>
-struct DataTypeForFormat<Format, true, false, false> {
+struct DataTypeForFormat<Format, false, false, true, false, false, false, false, false, false, false> {
+ typedef int16_t Type;
+};
+
+template<int Format>
+struct DataTypeForFormat<Format, false, false, false, true, false, false, false, false, false, false> {
+ typedef uint16_t Type;
+};
+
+template<int Format>
+struct DataTypeForFormat<Format, false, false, false, false, true, false, false, false, false, false> {
+ typedef int32_t Type;
+};
+
+template<int Format>
+struct DataTypeForFormat<Format, false, false, false, false, false, true, false, false, false, false> {
+ typedef uint32_t Type;
+};
+
+template<int Format>
+struct DataTypeForFormat<Format, false, false, false, false, false, false, true, false, false, false> {
typedef float Type;
};
template<int Format>
-struct DataTypeForFormat<Format, false, true, false> {
+struct DataTypeForFormat<Format, false, false, false, false, false, false, false, true, false, false> {
typedef uint16_t Type;
};
template<int Format>
-struct DataTypeForFormat<Format, false, false, true> {
+struct DataTypeForFormat<Format, false, false, false, false, false, false, false, false, true, false> {
typedef uint16_t Type;
};
template<int Format>
+struct DataTypeForFormat<Format, false, false, false, false, false, false, false, false, false, true> {
+ typedef uint32_t Type;
+};
+
+template<int Format>
+struct UsesFloatIntermediateFormat {
+ static const bool Value =
+ IsFloatFormat<Format>::Value
+ || IsHalfFloatFormat<Format>::Value
+ || Format == WebGLImageConversion::DataFormatRGB10F11F11F
+ || Format == WebGLImageConversion::DataFormatRGB5999;
+};
+
+template<int Format>
struct IntermediateFormat {
- static const int Value = (IsFloatFormat<Format>::Value || IsHalfFloatFormat<Format>::Value) ? WebGLImageConversion::DataFormatRGBA32F : WebGLImageConversion::DataFormatRGBA8;
+ static const int Value =
+ UsesFloatIntermediateFormat<Format>::Value ? WebGLImageConversion::DataFormatRGBA32F
+ : IsInt32Format<Format>::Value ? WebGLImageConversion::DataFormatRGBA32_S
+ : IsUInt32Format<Format>::Value ? WebGLImageConversion::DataFormatRGBA32
+ : IsInt16Format<Format>::Value ? WebGLImageConversion::DataFormatRGBA16_S
+ : (IsUInt16Format<Format>::Value || Is32bppFormat<Format>::Value) ? WebGLImageConversion::DataFormatRGBA16
+ : IsInt8Format<Format>::Value ? WebGLImageConversion::DataFormatRGBA8_S : WebGLImageConversion::DataFormatRGBA8;
};
unsigned TexelBytesForFormat(WebGLImageConversion::DataFormat format)
@@ -1425,12 +1591,12 @@ void FormatConverter::convert()
typedef typename DataTypeForFormat<SrcFormat>::Type SrcType;
typedef typename DataTypeForFormat<DstFormat>::Type DstType;
- const int IntermediateSrcFormat = IntermediateFormat<DstFormat>::Value;
- typedef typename DataTypeForFormat<IntermediateSrcFormat>::Type IntermediateSrcType;
+ const int IntermFormat = IntermediateFormat<DstFormat>::Value;
+ typedef typename DataTypeForFormat<IntermFormat>::Type IntermType;
const ptrdiff_t srcStrideInElements = m_srcStride / sizeof(SrcType);
const ptrdiff_t dstStrideInElements = m_dstStride / sizeof(DstType);
- const bool trivialUnpack = (SrcFormat == WebGLImageConversion::DataFormatRGBA8 && !IsFloatFormat<DstFormat>::Value && !IsHalfFloatFormat<DstFormat>::Value) || SrcFormat == WebGLImageConversion::DataFormatRGBA32F;
- const bool trivialPack = (DstFormat == WebGLImageConversion::DataFormatRGBA8 || DstFormat == WebGLImageConversion::DataFormatRGBA32F) && alphaOp == WebGLImageConversion::AlphaDoNothing && m_dstStride > 0;
+ const bool trivialUnpack = SrcFormat == IntermFormat;
+ const bool trivialPack = DstFormat == IntermFormat && alphaOp == WebGLImageConversion::AlphaDoNothing && m_dstStride > 0;
ASSERT(!trivialUnpack || !trivialPack);
const SrcType *srcRowStart = static_cast<const SrcType*>(m_srcStart);
@@ -1449,8 +1615,8 @@ void FormatConverter::convert()
}
} else {
for (size_t i = 0; i < m_height; ++i) {
- unpack<SrcFormat>(srcRowStart, reinterpret_cast<IntermediateSrcType*>(m_unpackedIntermediateSrcData.get()), m_width);
- pack<DstFormat, alphaOp>(reinterpret_cast<IntermediateSrcType*>(m_unpackedIntermediateSrcData.get()), dstRowStart, m_width);
+ unpack<SrcFormat>(srcRowStart, reinterpret_cast<IntermType*>(m_unpackedIntermediateSrcData.get()), m_width);
+ pack<DstFormat, alphaOp>(reinterpret_cast<IntermType*>(m_unpackedIntermediateSrcData.get()), dstRowStart, m_width);
srcRowStart += srcStrideInElements;
dstRowStart += dstStrideInElements;
}
« no previous file with comments | « Source/platform/graphics/gpu/WebGLImageConversion.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698