// Copyright 2013 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "cc/resources/resource_format.h" #include "third_party/khronos/GLES2/gl2.h" #include "third_party/khronos/GLES2/gl2ext.h" #include "ui/gfx/gpu_memory_buffer.h" namespace cc { int BitsPerPixel(ResourceFormat format) { switch (format) { case RGBA_F16: return 64; case BGRA_8888: case RGBA_8888: return 32; case RGBA_4444: case RGB_565: case LUMINANCE_F16: return 16; case ALPHA_8: case LUMINANCE_8: case RED_8: return 8; case ETC1: return 4; } NOTREACHED(); return 0; } GLenum GLDataType(ResourceFormat format) { DCHECK_LE(format, RESOURCE_FORMAT_MAX); static const GLenum format_gl_data_type[] = { GL_UNSIGNED_BYTE, // RGBA_8888 GL_UNSIGNED_SHORT_4_4_4_4, // RGBA_4444 GL_UNSIGNED_BYTE, // BGRA_8888 GL_UNSIGNED_BYTE, // ALPHA_8 GL_UNSIGNED_BYTE, // LUMINANCE_8 GL_UNSIGNED_SHORT_5_6_5, // RGB_565, GL_UNSIGNED_BYTE, // ETC1 GL_UNSIGNED_BYTE, // RED_8 GL_HALF_FLOAT_OES, // LUMINANCE_F16 GL_HALF_FLOAT_OES, // RGBA_F16 }; static_assert(arraysize(format_gl_data_type) == (RESOURCE_FORMAT_MAX + 1), "format_gl_data_type does not handle all cases."); return format_gl_data_type[format]; } GLenum GLDataFormat(ResourceFormat format) { DCHECK_LE(format, RESOURCE_FORMAT_MAX); static const GLenum format_gl_data_format[] = { GL_RGBA, // RGBA_8888 GL_RGBA, // RGBA_4444 GL_BGRA_EXT, // BGRA_8888 GL_ALPHA, // ALPHA_8 GL_LUMINANCE, // LUMINANCE_8 GL_RGB, // RGB_565 GL_ETC1_RGB8_OES, // ETC1 GL_RED_EXT, // RED_8 GL_LUMINANCE, // LUMINANCE_F16 GL_RGBA, // RGBA_F16 }; static_assert(arraysize(format_gl_data_format) == (RESOURCE_FORMAT_MAX + 1), "format_gl_data_format does not handle all cases."); return format_gl_data_format[format]; } GLenum GLInternalFormat(ResourceFormat format) { // In GLES2, the internal format must match the texture format. (It no longer // is true in GLES3, however it still holds for the BGRA extension.) return GLDataFormat(format); } GLenum GLCopyTextureInternalFormat(ResourceFormat format) { // In GLES2, valid formats for glCopyTexImage2D are: GL_ALPHA, GL_LUMINANCE, // GL_LUMINANCE_ALPHA, GL_RGB, or GL_RGBA. // Extensions typically used for glTexImage2D do not also work for // glCopyTexImage2D. For instance GL_BGRA_EXT may not be used for // anything but gl(Sub)TexImage2D: // https://www.khronos.org/registry/gles/extensions/EXT/EXT_texture_format_BGRA8888.txt DCHECK_LE(format, RESOURCE_FORMAT_MAX); static const GLenum format_gl_data_format[] = { GL_RGBA, // RGBA_8888 GL_RGBA, // RGBA_4444 GL_RGBA, // BGRA_8888 GL_ALPHA, // ALPHA_8 GL_LUMINANCE, // LUMINANCE_8 GL_RGB, // RGB_565 GL_RGB, // ETC1 GL_LUMINANCE, // RED_8 GL_LUMINANCE, // LUMINANCE_F16 GL_RGBA, // RGBA_F16 }; static_assert(arraysize(format_gl_data_format) == (RESOURCE_FORMAT_MAX + 1), "format_gl_data_format does not handle all cases."); return format_gl_data_format[format]; } gfx::BufferFormat BufferFormat(ResourceFormat format) { switch (format) { case BGRA_8888: return gfx::BufferFormat::BGRA_8888; case RED_8: return gfx::BufferFormat::R_8; case RGBA_4444: return gfx::BufferFormat::RGBA_4444; case RGBA_8888: return gfx::BufferFormat::RGBA_8888; case ETC1: return gfx::BufferFormat::ETC1; case RGBA_F16: return gfx::BufferFormat::RGBA_F16; case ALPHA_8: case LUMINANCE_8: case RGB_565: case LUMINANCE_F16: break; } NOTREACHED(); return gfx::BufferFormat::RGBA_8888; } bool IsResourceFormatCompressed(ResourceFormat format) { return format == ETC1; } bool DoesResourceFormatSupportAlpha(ResourceFormat format) { switch (format) { case RGBA_4444: case RGBA_8888: case BGRA_8888: case ALPHA_8: case RGBA_F16: return true; case LUMINANCE_8: case RGB_565: case ETC1: case RED_8: case LUMINANCE_F16: return false; } NOTREACHED(); return false; } } // namespace cc