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

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

Issue 1147123006: Upgrade WebGLImageConversion to support WebGL 2 formats and types. (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: fix 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 ca7095409cf148299a17292567a32a86cb475506..8443e4c6f2b7d6a9e95a276364448295bb44ead3 100644
--- a/Source/platform/graphics/gpu/WebGLImageConversion.cpp
+++ b/Source/platform/graphics/gpu/WebGLImageConversion.cpp
@@ -20,13 +20,37 @@ WebGLImageConversion::DataFormat getDataFormat(GLenum destinationFormat, GLenum
{
WebGLImageConversion::DataFormat dstFormat = WebGLImageConversion::DataFormatRGBA8;
switch (destinationType) {
+ case GL_BYTE:
+ switch (destinationFormat) {
+ case GL_RED:
+ case GL_RED_INTEGER:
+ dstFormat = WebGLImageConversion::DataFormatR8_S;
+ break;
+ case GL_RG:
+ case GL_RG_INTEGER:
+ dstFormat = WebGLImageConversion::DataFormatRG8_S;
+ break;
+ case GL_RGB:
+ case GL_RGB_INTEGER:
+ dstFormat = WebGLImageConversion::DataFormatRGB8_S;
+ break;
+ case GL_RGBA:
+ case GL_RGBA_INTEGER:
+ dstFormat = WebGLImageConversion::DataFormatRGBA8_S;
+ break;
+ default:
+ ASSERT_NOT_REACHED();
+ }
+ break;
case GL_UNSIGNED_BYTE:
switch (destinationFormat) {
case GL_RGB:
+ case GL_RGB_INTEGER:
case GL_SRGB_EXT:
dstFormat = WebGLImageConversion::DataFormatRGB8;
break;
case GL_RGBA:
+ case GL_RGBA_INTEGER:
case GL_SRGB_ALPHA_EXT:
dstFormat = WebGLImageConversion::DataFormatRGBA8;
break;
@@ -34,8 +58,14 @@ WebGLImageConversion::DataFormat getDataFormat(GLenum destinationFormat, GLenum
dstFormat = WebGLImageConversion::DataFormatA8;
break;
case GL_LUMINANCE:
+ case GL_RED:
+ case GL_RED_INTEGER:
dstFormat = WebGLImageConversion::DataFormatR8;
break;
+ case GL_RG:
+ case GL_RG_INTEGER:
+ dstFormat = WebGLImageConversion::DataFormatRG8;
+ break;
case GL_LUMINANCE_ALPHA:
dstFormat = WebGLImageConversion::DataFormatRA8;
break;
@@ -43,27 +73,99 @@ WebGLImageConversion::DataFormat getDataFormat(GLenum destinationFormat, GLenum
ASSERT_NOT_REACHED();
}
break;
- case GL_UNSIGNED_SHORT_4_4_4_4:
- dstFormat = WebGLImageConversion::DataFormatRGBA4444;
+ case GL_SHORT:
+ switch (destinationFormat) {
+ case GL_RED_INTEGER:
+ dstFormat = WebGLImageConversion::DataFormatR16_S;
+ break;
+ case GL_RG_INTEGER:
+ dstFormat = WebGLImageConversion::DataFormatRG16_S;
+ break;
+ case GL_RGB_INTEGER:
+ dstFormat = WebGLImageConversion::DataFormatRGB16_S;
+ case GL_RGBA_INTEGER:
+ dstFormat = WebGLImageConversion::DataFormatRGBA16_S;
+ default:
+ ASSERT_NOT_REACHED();
+ }
break;
- case GL_UNSIGNED_SHORT_5_5_5_1:
- dstFormat = WebGLImageConversion::DataFormatRGBA5551;
+ case GL_UNSIGNED_SHORT:
+ switch (destinationFormat) {
+ case GL_RED_INTEGER:
+ dstFormat = WebGLImageConversion::DataFormatR16;
+ break;
+ case GL_DEPTH_COMPONENT:
+ dstFormat = WebGLImageConversion::DataFormatD16;
+ break;
+ case GL_RG_INTEGER:
+ dstFormat = WebGLImageConversion::DataFormatRG16;
+ break;
+ case GL_RGB_INTEGER:
+ dstFormat = WebGLImageConversion::DataFormatRGB16;
+ break;
+ case GL_RGBA_INTEGER:
+ dstFormat = WebGLImageConversion::DataFormatRGBA16;
+ break;
+ default:
+ ASSERT_NOT_REACHED();
+ }
break;
- case GL_UNSIGNED_SHORT_5_6_5:
- dstFormat = WebGLImageConversion::DataFormatRGB565;
+ case GL_INT:
+ switch (destinationFormat) {
+ case GL_RED_INTEGER:
+ dstFormat = WebGLImageConversion::DataFormatR32_S;
+ break;
+ case GL_RG_INTEGER:
+ dstFormat = WebGLImageConversion::DataFormatRG32_S;
+ break;
+ case GL_RGB_INTEGER:
+ dstFormat = WebGLImageConversion::DataFormatRGB32_S;
+ break;
+ case GL_RGBA_INTEGER:
+ dstFormat = WebGLImageConversion::DataFormatRGBA32_S;
+ break;
+ default:
+ ASSERT_NOT_REACHED();
+ }
+ break;
+ case GL_UNSIGNED_INT:
+ switch (destinationFormat) {
+ case GL_RED_INTEGER:
+ dstFormat = WebGLImageConversion::DataFormatR32;
+ break;
+ case GL_DEPTH_COMPONENT:
+ dstFormat = WebGLImageConversion::DataFormatD32;
+ break;
+ case GL_RG_INTEGER:
+ dstFormat = WebGLImageConversion::DataFormatRG32;
+ break;
+ case GL_RGB_INTEGER:
+ dstFormat = WebGLImageConversion::DataFormatRGB32;
+ break;
+ case GL_RGBA_INTEGER:
+ dstFormat = WebGLImageConversion::DataFormatRGBA32;
+ break;
+ default:
+ ASSERT_NOT_REACHED();
+ }
break;
case GL_HALF_FLOAT_OES: // OES_texture_half_float
+ case GL_HALF_FLOAT:
switch (destinationFormat) {
+ case GL_RGBA:
+ dstFormat = WebGLImageConversion::DataFormatRGBA16F;
+ break;
case GL_RGB:
dstFormat = WebGLImageConversion::DataFormatRGB16F;
break;
- case GL_RGBA:
- dstFormat = WebGLImageConversion::DataFormatRGBA16F;
+ case GL_RG:
+ dstFormat = WebGLImageConversion::DataFormatRG16F;
break;
case GL_ALPHA:
dstFormat = WebGLImageConversion::DataFormatA16F;
break;
case GL_LUMINANCE:
+ case GL_RED:
dstFormat = WebGLImageConversion::DataFormatR16F;
break;
case GL_LUMINANCE_ALPHA:
@@ -75,18 +177,25 @@ WebGLImageConversion::DataFormat getDataFormat(GLenum destinationFormat, GLenum
break;
case GL_FLOAT: // OES_texture_float
switch (destinationFormat) {
+ case GL_RGBA:
+ dstFormat = WebGLImageConversion::DataFormatRGBA32F;
+ break;
case GL_RGB:
dstFormat = WebGLImageConversion::DataFormatRGB32F;
break;
- case GL_RGBA:
- dstFormat = WebGLImageConversion::DataFormatRGBA32F;
+ case GL_RG:
+ dstFormat = WebGLImageConversion::DataFormatRG32F;
break;
case GL_ALPHA:
dstFormat = WebGLImageConversion::DataFormatA32F;
break;
case GL_LUMINANCE:
+ case GL_RED:
dstFormat = WebGLImageConversion::DataFormatR32F;
break;
+ case GL_DEPTH_COMPONENT:
+ dstFormat = WebGLImageConversion::DataFormatD32F;
+ break;
case GL_LUMINANCE_ALPHA:
dstFormat = WebGLImageConversion::DataFormatRA32F;
break;
@@ -94,6 +203,24 @@ WebGLImageConversion::DataFormat getDataFormat(GLenum destinationFormat, GLenum
ASSERT_NOT_REACHED();
}
break;
+ case GL_UNSIGNED_SHORT_4_4_4_4:
+ dstFormat = WebGLImageConversion::DataFormatRGBA4444;
+ break;
+ case GL_UNSIGNED_SHORT_5_5_5_1:
+ dstFormat = WebGLImageConversion::DataFormatRGBA5551;
+ break;
+ case GL_UNSIGNED_SHORT_5_6_5:
+ dstFormat = WebGLImageConversion::DataFormatRGB565;
+ break;
+ case GL_UNSIGNED_INT_24_8:
+ dstFormat = WebGLImageConversion::DataFormatDS24_8;
+ break;
+ case GL_UNSIGNED_INT_10F_11F_11F_REV:
+ dstFormat = WebGLImageConversion::DataFormatRGB10F11F11F;
+ break;
+ case GL_UNSIGNED_INT_2_10_10_10_REV:
+ dstFormat = WebGLImageConversion::DataFormatRGBA2_10_10_10;
+ break;
default:
ASSERT_NOT_REACHED();
}
@@ -1223,34 +1350,63 @@ unsigned TexelBytesForFormat(WebGLImageConversion::DataFormat format)
{
switch (format) {
case WebGLImageConversion::DataFormatR8:
+ case WebGLImageConversion::DataFormatR8_S:
case WebGLImageConversion::DataFormatA8:
return 1;
+ case WebGLImageConversion::DataFormatRG8:
+ case WebGLImageConversion::DataFormatRG8_S:
case WebGLImageConversion::DataFormatRA8:
case WebGLImageConversion::DataFormatAR8:
case WebGLImageConversion::DataFormatRGBA5551:
case WebGLImageConversion::DataFormatRGBA4444:
case WebGLImageConversion::DataFormatRGB565:
case WebGLImageConversion::DataFormatA16F:
+ case WebGLImageConversion::DataFormatR16:
+ case WebGLImageConversion::DataFormatR16_S:
case WebGLImageConversion::DataFormatR16F:
+ case WebGLImageConversion::DataFormatD16:
return 2;
case WebGLImageConversion::DataFormatRGB8:
+ case WebGLImageConversion::DataFormatRGB8_S:
case WebGLImageConversion::DataFormatBGR8:
return 3;
case WebGLImageConversion::DataFormatRGBA8:
+ case WebGLImageConversion::DataFormatRGBA8_S:
case WebGLImageConversion::DataFormatARGB8:
case WebGLImageConversion::DataFormatABGR8:
case WebGLImageConversion::DataFormatBGRA8:
+ case WebGLImageConversion::DataFormatR32:
+ case WebGLImageConversion::DataFormatR32_S:
case WebGLImageConversion::DataFormatR32F:
case WebGLImageConversion::DataFormatA32F:
case WebGLImageConversion::DataFormatRA16F:
+ case WebGLImageConversion::DataFormatRGBA2_10_10_10:
+ case WebGLImageConversion::DataFormatRGB10F11F11F:
+ case WebGLImageConversion::DataFormatRG16:
+ case WebGLImageConversion::DataFormatRG16_S:
+ case WebGLImageConversion::DataFormatRG16F:
+ case WebGLImageConversion::DataFormatD32:
+ case WebGLImageConversion::DataFormatD32F:
+ case WebGLImageConversion::DataFormatDS24_8:
return 4;
+ case WebGLImageConversion::DataFormatRGB16:
+ case WebGLImageConversion::DataFormatRGB16_S:
case WebGLImageConversion::DataFormatRGB16F:
return 6;
+ case WebGLImageConversion::DataFormatRGBA16:
+ case WebGLImageConversion::DataFormatRGBA16_S:
case WebGLImageConversion::DataFormatRA32F:
case WebGLImageConversion::DataFormatRGBA16F:
+ case WebGLImageConversion::DataFormatRG32:
+ case WebGLImageConversion::DataFormatRG32_S:
+ case WebGLImageConversion::DataFormatRG32F:
return 8;
+ case WebGLImageConversion::DataFormatRGB32:
+ case WebGLImageConversion::DataFormatRGB32_S:
case WebGLImageConversion::DataFormatRGB32F:
return 12;
+ case WebGLImageConversion::DataFormatRGBA32:
+ case WebGLImageConversion::DataFormatRGBA32_S:
case WebGLImageConversion::DataFormatRGBA32F:
return 16;
default:
@@ -1447,18 +1603,24 @@ bool WebGLImageConversion::computeFormatAndTypeParameters(GLenum format, GLenum
switch (format) {
case GL_ALPHA:
case GL_LUMINANCE:
+ case GL_RED:
+ case GL_RED_INTEGER:
case GL_DEPTH_COMPONENT:
- case GL_DEPTH_STENCIL_OES:
+ case GL_DEPTH_STENCIL: // Treat it as one component.
*componentsPerPixel = 1;
break;
case GL_LUMINANCE_ALPHA:
+ case GL_RG:
+ case GL_RG_INTEGER:
*componentsPerPixel = 2;
break;
case GL_RGB:
+ case GL_RGB_INTEGER:
case GL_SRGB_EXT: // GL_EXT_sRGB
*componentsPerPixel = 3;
break;
case GL_RGBA:
+ case GL_RGBA_INTEGER:
case GL_BGRA_EXT: // GL_EXT_texture_format_BGRA8888
case GL_SRGB_ALPHA_EXT: // GL_EXT_sRGB
*componentsPerPixel = 4;
@@ -1467,9 +1629,15 @@ bool WebGLImageConversion::computeFormatAndTypeParameters(GLenum format, GLenum
return false;
}
switch (type) {
+ case GL_BYTE:
+ *bytesPerComponent = sizeof(GLbyte);
+ break;
case GL_UNSIGNED_BYTE:
*bytesPerComponent = sizeof(GLubyte);
break;
+ case GL_SHORT:
+ *bytesPerComponent = sizeof(GLshort);
+ break;
case GL_UNSIGNED_SHORT:
*bytesPerComponent = sizeof(GLushort);
break;
@@ -1479,13 +1647,23 @@ bool WebGLImageConversion::computeFormatAndTypeParameters(GLenum format, GLenum
*componentsPerPixel = 1;
*bytesPerComponent = sizeof(GLushort);
break;
- case GL_UNSIGNED_INT_24_8_OES:
+ case GL_INT:
+ *bytesPerComponent = sizeof(GLint);
+ break;
case GL_UNSIGNED_INT:
*bytesPerComponent = sizeof(GLuint);
break;
+ case GL_UNSIGNED_INT_24_8_OES:
+ case GL_UNSIGNED_INT_10F_11F_11F_REV:
+ case GL_UNSIGNED_INT_5_9_9_9_REV:
+ case GL_UNSIGNED_INT_2_10_10_10_REV:
+ *componentsPerPixel = 1;
+ *bytesPerComponent = sizeof(GLuint);
+ break;
case GL_FLOAT: // OES_texture_float
*bytesPerComponent = sizeof(GLfloat);
break;
+ case GL_HALF_FLOAT:
case GL_HALF_FLOAT_OES: // OES_texture_half_float
*bytesPerComponent = sizeof(GLushort);
break;
@@ -1603,57 +1781,90 @@ bool WebGLImageConversion::ImageExtractor::extractImage(bool premultiplyAlpha, b
return true;
}
-unsigned WebGLImageConversion::getClearBitsByFormat(GLenum format)
-{
- switch (format) {
- case GL_ALPHA:
- case GL_LUMINANCE:
- case GL_LUMINANCE_ALPHA:
- case GL_RGB:
- case GL_RGB565:
- case GL_RGBA:
- case GL_RGBA4:
- case GL_RGB5_A1:
- case GL_SRGB_EXT:
- case GL_SRGB_ALPHA_EXT:
- return GL_COLOR_BUFFER_BIT;
- case GL_DEPTH_COMPONENT16:
- case GL_DEPTH_COMPONENT:
- return GL_DEPTH_BUFFER_BIT;
- case GL_STENCIL_INDEX8:
- return GL_STENCIL_BUFFER_BIT;
- case GL_DEPTH_STENCIL_OES:
- return GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT;
- default:
- return 0;
- }
-}
-
unsigned WebGLImageConversion::getChannelBitsByFormat(GLenum format)
{
switch (format) {
case GL_ALPHA:
return ChannelAlpha;
+ case GL_RED:
+ case GL_RED_INTEGER:
+ case GL_R8:
+ case GL_R8_SNORM:
+ case GL_R8UI:
+ case GL_R8I:
+ case GL_R16UI:
+ case GL_R16I:
+ case GL_R32UI:
+ case GL_R32I:
+ case GL_R16F:
+ case GL_R32F:
+ return ChannelRed;
+ case GL_RG:
+ case GL_RG_INTEGER:
+ case GL_RG8:
+ case GL_RG8_SNORM:
+ case GL_RG8UI:
+ case GL_RG8I:
+ case GL_RG16UI:
+ case GL_RG16I:
+ case GL_RG32UI:
+ case GL_RG32I:
+ case GL_RG16F:
+ case GL_RG32F:
+ return ChannelRG;
case GL_LUMINANCE:
return ChannelRGB;
case GL_LUMINANCE_ALPHA:
return ChannelRGBA;
case GL_RGB:
+ case GL_RGB_INTEGER:
+ case GL_RGB8:
+ case GL_RGB8_SNORM:
+ case GL_RGB8UI:
+ case GL_RGB8I:
+ case GL_RGB16UI:
+ case GL_RGB16I:
+ case GL_RGB32UI:
+ case GL_RGB32I:
+ case GL_RGB16F:
+ case GL_RGB32F:
case GL_RGB565:
+ case GL_R11F_G11F_B10F:
+ case GL_RGB9_E5:
case GL_SRGB_EXT:
+ case GL_SRGB8:
return ChannelRGB;
case GL_RGBA:
+ case GL_RGBA_INTEGER:
+ case GL_RGBA8:
+ case GL_RGBA8_SNORM:
+ case GL_RGBA8UI:
+ case GL_RGBA8I:
+ case GL_RGBA16UI:
+ case GL_RGBA16I:
+ case GL_RGBA32UI:
+ case GL_RGBA32I:
+ case GL_RGBA16F:
+ case GL_RGBA32F:
case GL_RGBA4:
case GL_RGB5_A1:
+ case GL_RGB10_A2:
+ case GL_RGB10_A2UI:
case GL_SRGB_ALPHA_EXT:
+ case GL_SRGB8_ALPHA8:
return ChannelRGBA;
- case GL_DEPTH_COMPONENT16:
case GL_DEPTH_COMPONENT:
+ case GL_DEPTH_COMPONENT16:
+ case GL_DEPTH_COMPONENT24:
+ case GL_DEPTH_COMPONENT32F:
return ChannelDepth;
+ case GL_STENCIL:
case GL_STENCIL_INDEX8:
return ChannelStencil;
- case GL_DEPTH_STENCIL_OES:
- return ChannelDepth | ChannelStencil;
+ case GL_DEPTH_STENCIL:
+ case GL_DEPTH24_STENCIL8:
+ case GL_DEPTH32F_STENCIL8:
+ return ChannelDepthStencil;
default:
return 0;
}
« 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