Index: gpu/command_buffer/common/gles2_cmd_utils.cc |
diff --git a/gpu/command_buffer/common/gles2_cmd_utils.cc b/gpu/command_buffer/common/gles2_cmd_utils.cc |
index 3a43215e3e5910d528dce4e27fcacfcc13a19f9c..5f75c7eae4618da49a6ebd89940fe2c687f1d73c 100644 |
--- a/gpu/command_buffer/common/gles2_cmd_utils.cc |
+++ b/gpu/command_buffer/common/gles2_cmd_utils.cc |
@@ -1189,6 +1189,361 @@ uint32_t GLES2Util::GetChannelsForFormat(int format) { |
} |
} |
+bool GLES2Util::IsSizedColorFormat(uint32_t internal_format) { |
+ switch (internal_format) { |
+ case GL_ALPHA16F_EXT: |
+ case GL_ALPHA32F_EXT: |
+ case GL_RGB8: |
+ case GL_RGB565: |
+ case GL_RGB16F: |
+ case GL_RGB32F: |
+ case GL_SRGB8: |
+ case GL_RGB8_SNORM: |
+ case GL_R11F_G11F_B10F: |
+ case GL_RGB9_E5: |
+ case GL_RGB8UI: |
+ case GL_RGB8I: |
+ case GL_RGB16UI: |
+ case GL_RGB16I: |
+ case GL_RGB32UI: |
+ case GL_RGB32I: |
+ case GL_BGRA8_EXT: |
+ case GL_RGBA16F: |
+ case GL_RGBA32F: |
+ case GL_RGBA8_OES: |
+ case GL_RGBA4: |
+ case GL_RGB5_A1: |
+ case GL_SRGB8_ALPHA8: |
+ case GL_RGBA8_SNORM: |
+ case GL_RGB10_A2: |
+ case GL_RGBA8UI: |
+ case GL_RGBA8I: |
+ case GL_RGB10_A2UI: |
+ case GL_RGBA16UI: |
+ case GL_RGBA16I: |
+ case GL_RGBA32UI: |
+ case GL_RGBA32I: |
+ case GL_R8: |
+ case GL_R8_SNORM: |
+ case GL_R16F: |
+ case GL_R32F: |
+ case GL_R8UI: |
+ case GL_R8I: |
+ case GL_R16UI: |
+ case GL_R16I: |
+ case GL_R32UI: |
+ case GL_R32I: |
+ case GL_RG8: |
+ case GL_RG8_SNORM: |
+ case GL_RG16F: |
+ case GL_RG32F: |
+ case GL_RG8UI: |
+ case GL_RG8I: |
+ case GL_RG16UI: |
+ case GL_RG16I: |
+ case GL_RG32UI: |
+ case GL_RG32I: |
+ return true; |
+ default: |
+ return false; |
+ } |
+} |
+ |
+void GLES2Util::GetColorFormatComponentSizes( |
+ uint32_t internal_format, uint32_t type, int* r, int* g, int* b, int* a) { |
+ DCHECK(r && g && b && a); |
+ *r = 0; |
+ *g = 0; |
+ *b = 0; |
+ *a = 0; |
+ |
+ // Unsized formats. |
+ switch (internal_format) { |
+ case GL_RGB: |
+ switch (type) { |
+ case GL_UNSIGNED_BYTE: |
+ internal_format = GL_RGB8; |
+ break; |
+ case GL_UNSIGNED_SHORT_5_6_5: |
+ internal_format = GL_RGB565; |
+ break; |
+ case GL_HALF_FLOAT_OES: |
+ internal_format = GL_RGB16F; |
+ break; |
+ case GL_FLOAT: |
+ internal_format = GL_RGB32F; |
+ return; |
+ default: |
+ NOTREACHED(); |
+ break; |
+ } |
+ break; |
+ case GL_RGBA: |
+ switch (type) { |
+ case GL_UNSIGNED_BYTE: |
+ internal_format = GL_RGBA8; |
+ break; |
+ case GL_UNSIGNED_SHORT_4_4_4_4: |
+ internal_format = GL_RGBA4; |
+ break; |
+ case GL_UNSIGNED_SHORT_5_5_5_1: |
+ internal_format = GL_RGB5_A1; |
+ break; |
+ case GL_HALF_FLOAT_OES: |
+ internal_format = GL_RGBA16F; |
+ break; |
+ case GL_FLOAT: |
+ internal_format = GL_RGBA32F; |
+ return; |
+ default: |
+ NOTREACHED(); |
+ break; |
+ } |
+ break; |
+ case GL_ALPHA: |
+ switch (type) { |
+ case GL_UNSIGNED_BYTE: |
+ *a = 8; |
+ return; |
+ case GL_HALF_FLOAT_OES: |
+ *a = 16; |
+ return; |
+ case GL_FLOAT: |
+ *a = 32; |
+ return; |
+ default: |
+ NOTREACHED(); |
+ break; |
+ } |
+ break; |
+ case GL_LUMINANCE: |
+ switch (type) { |
+ case GL_UNSIGNED_BYTE: |
+ // It can be RGBA8, RGB8, RG8, or R8. |
+ // Here we only require R8, which is good enough for validation. |
+ // Same for other types. |
+ internal_format = GL_R8; |
+ break; |
+ case GL_HALF_FLOAT_OES: |
+ internal_format = GL_R16F; |
+ break; |
+ case GL_FLOAT: |
+ internal_format = GL_R32F; |
+ return; |
+ default: |
+ NOTREACHED(); |
+ break; |
+ } |
+ break; |
+ case GL_LUMINANCE_ALPHA: |
+ switch (type) { |
+ case GL_UNSIGNED_BYTE: |
+ internal_format = GL_RGBA8; |
+ break; |
+ case GL_HALF_FLOAT_OES: |
+ internal_format = GL_RGBA16F; |
+ break; |
+ case GL_FLOAT: |
+ internal_format = GL_RGBA32F; |
+ return; |
+ default: |
+ NOTREACHED(); |
+ break; |
+ } |
+ break; |
+ case GL_RED: |
+ switch (type) { |
+ case GL_UNSIGNED_BYTE: |
+ internal_format = GL_R8; |
+ break; |
+ case GL_HALF_FLOAT_OES: |
+ internal_format = GL_R16F; |
+ break; |
+ case GL_FLOAT: |
+ internal_format = GL_R32F; |
+ return; |
+ default: |
+ NOTREACHED(); |
+ break; |
+ } |
+ break; |
+ case GL_RG: |
+ switch (type) { |
+ case GL_UNSIGNED_BYTE: |
+ internal_format = GL_RG8; |
+ break; |
+ case GL_HALF_FLOAT_OES: |
+ internal_format = GL_RG16F; |
+ break; |
+ case GL_FLOAT: |
+ internal_format = GL_RG32F; |
+ return; |
+ default: |
+ NOTREACHED(); |
+ break; |
+ } |
+ break; |
+ case GL_SRGB_EXT: |
+ switch (type) { |
+ case GL_UNSIGNED_BYTE: |
+ internal_format = GL_SRGB8; |
+ break; |
+ default: |
+ NOTREACHED(); |
+ break; |
+ } |
+ break; |
+ case GL_SRGB_ALPHA_EXT: |
+ switch (type) { |
+ case GL_UNSIGNED_BYTE: |
+ internal_format = GL_SRGB8_ALPHA8; |
+ break; |
+ default: |
+ NOTREACHED(); |
+ break; |
+ } |
+ break; |
+ case GL_BGRA_EXT: |
+ switch (type) { |
+ case GL_UNSIGNED_BYTE: |
+ internal_format = GL_BGRA8_EXT; |
+ break; |
+ default: |
+ NOTREACHED(); |
+ break; |
+ } |
+ break; |
+ default: |
+ break; |
+ } |
+ |
+ // Sized formats. |
+ switch (internal_format) { |
+ case GL_RGB8_OES: |
+ case GL_SRGB8: |
+ case GL_RGB8_SNORM: |
+ case GL_RGB8UI: |
+ case GL_RGB8I: |
+ *r = 8; |
+ *g = 8; |
+ *b = 8; |
+ break; |
+ case GL_RGB565: |
+ *r = 5; |
+ *g = 6; |
+ *b = 5; |
+ break; |
+ case GL_RGB16F: |
+ case GL_RGB16UI: |
+ case GL_RGB16I: |
+ *r = 16; |
+ *g = 16; |
+ *b = 16; |
+ break; |
+ case GL_RGB32F: |
+ case GL_RGB32UI: |
+ case GL_RGB32I: |
+ *r = 32; |
+ *g = 32; |
+ *b = 32; |
+ break; |
+ case GL_R11F_G11F_B10F: |
+ *r = 11; |
+ *g = 11; |
+ *b = 10; |
+ break; |
+ case GL_RGB9_E5: |
+ *r = 9; |
+ *g = 9; |
+ *b = 9; |
+ break; |
+ case GL_BGRA8_EXT: |
+ case GL_RGBA8: |
+ case GL_SRGB8_ALPHA8: |
+ case GL_RGBA8_SNORM: |
+ case GL_RGBA8UI: |
+ case GL_RGBA8I: |
+ *r = 8; |
+ *g = 8; |
+ *b = 8; |
+ *a = 8; |
+ break; |
+ case GL_RGBA16F_EXT: |
+ case GL_RGBA16UI: |
+ case GL_RGBA16I: |
+ *r = 16; |
+ *g = 16; |
+ *b = 16; |
+ *a = 16; |
+ break; |
+ case GL_RGBA32F_EXT: |
+ case GL_RGBA32UI: |
+ case GL_RGBA32I: |
+ *r = 32; |
+ *g = 32; |
+ *b = 32; |
+ *a = 32; |
+ break; |
+ case GL_RGBA4: |
+ *r = 4; |
+ *g = 4; |
+ *b = 4; |
+ *a = 4; |
+ break; |
+ case GL_RGB5_A1: |
+ *r = 5; |
+ *g = 5; |
+ *b = 5; |
+ *a = 1; |
+ break; |
+ case GL_RGB10_A2: |
+ case GL_RGB10_A2UI: |
+ *r = 10; |
+ *g = 10; |
+ *b = 10; |
+ *a = 2; |
+ break; |
+ case GL_R8: |
+ case GL_R8_SNORM: |
+ case GL_R8UI: |
+ case GL_R8I: |
+ *r = 8; |
+ break; |
+ case GL_R16F: |
+ case GL_R16UI: |
+ case GL_R16I: |
+ *r = 16; |
+ break; |
+ case GL_R32F: |
+ case GL_R32UI: |
+ case GL_R32I: |
+ *r = 32; |
+ break; |
+ case GL_RG8: |
+ case GL_RG8_SNORM: |
+ case GL_RG8UI: |
+ case GL_RG8I: |
+ *r = 8; |
+ *g = 8; |
+ break; |
+ case GL_RG16F: |
+ case GL_RG16UI: |
+ case GL_RG16I: |
+ *r = 16; |
+ *g = 16; |
+ break; |
+ case GL_RG32F: |
+ case GL_RG32UI: |
+ case GL_RG32I: |
+ *r = 32; |
+ *g = 32; |
+ break; |
+ default: |
+ NOTREACHED(); |
+ break; |
+ } |
+} |
+ |
uint32_t GLES2Util::GetChannelsNeededForAttachmentType( |
int type, |
uint32_t max_color_attachments) { |