From 72056ee9e3da722a0e21b87681b754945a8e3aec Mon Sep 17 00:00:00 2001 From: Romain Guy Date: Mon, 6 Apr 2020 12:01:41 -0700 Subject: [PATCH] Fix support for 565 textures (#2347) * Fix support for 565 textures This requires exposing a new USHORT_565 pixel data type. * Update JS bindings --- .../filament-android/src/main/cpp/Texture.cpp | 1 + .../com/google/android/filament/Texture.java | 25 ++++++++++--------- .../android/filament/utils/TextureLoader.kt | 4 +-- .../backend/include/backend/DriverEnums.h | 21 ++++++++-------- .../include/backend/PixelBufferDescriptor.h | 1 + filament/backend/src/opengl/GLUtils.h | 21 ++++++++-------- web/filament-js/filament.d.ts | 2 ++ web/filament-js/jsenums.cpp | 4 ++- 8 files changed, 44 insertions(+), 35 deletions(-) diff --git a/android/filament-android/src/main/cpp/Texture.cpp b/android/filament-android/src/main/cpp/Texture.cpp index 845d1dc58a..8b53491962 100644 --- a/android/filament-android/src/main/cpp/Texture.cpp +++ b/android/filament-android/src/main/cpp/Texture.cpp @@ -430,6 +430,7 @@ public: PixelDataType getType(int format) const noexcept { switch (format) { + case BITMAP_CONFIG_RGB_565: return PixelDataType::USHORT_565; case BITMAP_CONFIG_RGBA_F16: return PixelDataType::HALF; default: return PixelDataType::UBYTE; } diff --git a/android/filament-android/src/main/java/com/google/android/filament/Texture.java b/android/filament-android/src/main/java/com/google/android/filament/Texture.java index 1f7e46bcda..fe8e074de1 100644 --- a/android/filament-android/src/main/java/com/google/android/filament/Texture.java +++ b/android/filament-android/src/main/java/com/google/android/filament/Texture.java @@ -273,26 +273,28 @@ public class Texture { * Pixel data type */ public enum Type { - /** unsigned byte, 8-bits */ + /** unsigned byte, 8-bit */ UBYTE, - /** signed byte, 8-bits */ + /** signed byte, 8-bit */ BYTE, - /** unsigned short, 16-bits */ + /** unsigned short, 16-bits*/ USHORT, - /** signed short, 16-bits */ + /** signed short, 16-bit */ SHORT, - /** unsigned int, 32-bits */ + /** unsigned int, 32-bit */ UINT, - /** signed int, 32-bits */ + /** signed int, 32-bit */ INT, - /** half-float, 16-bits float with 10 bits mantissa */ + /** half-float, 16-bit float with 10 bits mantissa */ HALF, - /** float, 32-bits float, with 24 bits mantissa */ + /** float, 32-bit float, with 24 bits mantissa */ FLOAT, - /** a compessed type */ + /** a compressed type */ COMPRESSED, - /** unsigned 5.6 (5.5 for blue) float packed in 32-bits */ - UINT_10F_11F_11F_REV + /** unsigned 5.6 (5.5 for blue) float packed in a 32-bit integer. */ + UINT_10F_11F_11F_REV, + /** unsigned 5/6 bit integers packed in a 16-bit short. */ + USHORT_565, } /** @@ -343,7 +345,6 @@ public class Texture { */ @Nullable public Runnable callback; - /** * Creates a PixelBufferDescriptor * diff --git a/android/filament-utils-android/src/main/java/com/google/android/filament/utils/TextureLoader.kt b/android/filament-utils-android/src/main/java/com/google/android/filament/utils/TextureLoader.kt index 1306e6fb1b..5d9dc297a7 100644 --- a/android/filament-utils-android/src/main/java/com/google/android/filament/utils/TextureLoader.kt +++ b/android/filament-utils-android/src/main/java/com/google/android/filament/utils/TextureLoader.kt @@ -90,8 +90,8 @@ private fun format(bitmap: Bitmap) = when (bitmap.config.name) { // Not required when SKIP_BITMAP_COPY is true private fun type(bitmap: Bitmap) = when (bitmap.config.name) { - "ALPHA_8" -> Texture.Type.UBYTE - "RGB_565" -> Texture.Type.UBYTE + "ALPHA_8" -> Texture.Type.USHORT + "RGB_565" -> Texture.Type.USHORT_565 "ARGB_8888" -> Texture.Type.UBYTE "RGBA_F16" -> Texture.Type.HALF else -> throw IllegalArgumentException("Unsupported bitmap configuration") diff --git a/filament/backend/include/backend/DriverEnums.h b/filament/backend/include/backend/DriverEnums.h index 39662df161..b07b1438c8 100644 --- a/filament/backend/include/backend/DriverEnums.h +++ b/filament/backend/include/backend/DriverEnums.h @@ -248,16 +248,17 @@ enum class PixelDataFormat : uint8_t { //! Pixel Data Type enum class PixelDataType : uint8_t { - UBYTE, //!< unsigned byte - BYTE, //!< signed byte - USHORT, //!< unsigned short (16-bits) - SHORT, //!< signed short (16-bits) - UINT, //!< unsigned int (32-bits) - INT, //!< signed int (32-bits) - HALF, //!< half-float (16-bits float) - FLOAT, //!< float (32-bits float) - COMPRESSED, //!< compressed pixels, @see CompressedPixelDataType - UINT_10F_11F_11F_REV //!< three low precision floating-point numbers + UBYTE, //!< unsigned byte + BYTE, //!< signed byte + USHORT, //!< unsigned short (16-bit) + SHORT, //!< signed short (16-bit) + UINT, //!< unsigned int (16-bit) + INT, //!< signed int (32-bit) + HALF, //!< half-float (16-bit float) + FLOAT, //!< float (32-bits float) + COMPRESSED, //!< compressed pixels, @see CompressedPixelDataType + UINT_10F_11F_11F_REV, //!< three low precision floating-point numbers + USHORT_565 //!< unsigned int (16-bit), encodes 3 RGB channels }; //! Compressed pixel data types diff --git a/filament/backend/include/backend/PixelBufferDescriptor.h b/filament/backend/include/backend/PixelBufferDescriptor.h index 1f26435d0a..eac1b23d19 100644 --- a/filament/backend/include/backend/PixelBufferDescriptor.h +++ b/filament/backend/include/backend/PixelBufferDescriptor.h @@ -154,6 +154,7 @@ public: case PixelDataType::BYTE: // nothing to do break; + case PixelDataType::USHORT_565: case PixelDataType::USHORT: case PixelDataType::SHORT: case PixelDataType::HALF: diff --git a/filament/backend/src/opengl/GLUtils.h b/filament/backend/src/opengl/GLUtils.h index 7f66fcad6f..3af7321606 100644 --- a/filament/backend/src/opengl/GLUtils.h +++ b/filament/backend/src/opengl/GLUtils.h @@ -260,16 +260,17 @@ constexpr inline GLenum getFormat(backend::PixelDataFormat format) noexcept { constexpr inline GLenum getType(backend::PixelDataType type) noexcept { using PixelDataType = backend::PixelDataType; switch (type) { - case PixelDataType::UBYTE: return GL_UNSIGNED_BYTE; - case PixelDataType::BYTE: return GL_BYTE; - case PixelDataType::USHORT: return GL_UNSIGNED_SHORT; - case PixelDataType::SHORT: return GL_SHORT; - case PixelDataType::UINT: return GL_UNSIGNED_INT; - case PixelDataType::INT: return GL_INT; - case PixelDataType::HALF: return GL_HALF_FLOAT; - case PixelDataType::FLOAT: return GL_FLOAT; - case PixelDataType::UINT_10F_11F_11F_REV: return GL_UNSIGNED_INT_10F_11F_11F_REV; - case PixelDataType::COMPRESSED: return 0; // should never happen + case PixelDataType::UBYTE: return GL_UNSIGNED_BYTE; + case PixelDataType::BYTE: return GL_BYTE; + case PixelDataType::USHORT: return GL_UNSIGNED_SHORT; + case PixelDataType::SHORT: return GL_SHORT; + case PixelDataType::UINT: return GL_UNSIGNED_INT; + case PixelDataType::INT: return GL_INT; + case PixelDataType::HALF: return GL_HALF_FLOAT; + case PixelDataType::FLOAT: return GL_FLOAT; + case PixelDataType::UINT_10F_11F_11F_REV: return GL_UNSIGNED_INT_10F_11F_11F_REV; + case PixelDataType::USHORT_565: return GL_UNSIGNED_SHORT_5_6_5; + case PixelDataType::COMPRESSED: return 0; // should never happen } } diff --git a/web/filament-js/filament.d.ts b/web/filament-js/filament.d.ts index 6aa0e651fd..f335c65191 100644 --- a/web/filament-js/filament.d.ts +++ b/web/filament-js/filament.d.ts @@ -562,6 +562,8 @@ export enum PixelDataType { INT, HALF, FLOAT, + UINT_10F_11F_11F_REV, + USHORT_565, } export enum RenderableManager$PrimitiveType { diff --git a/web/filament-js/jsenums.cpp b/web/filament-js/jsenums.cpp index 31deb74e2f..84ae408aaa 100644 --- a/web/filament-js/jsenums.cpp +++ b/web/filament-js/jsenums.cpp @@ -292,7 +292,9 @@ enum_("PixelDataType") .value("UINT", backend::PixelDataType::UINT) .value("INT", backend::PixelDataType::INT) .value("HALF", backend::PixelDataType::HALF) - .value("FLOAT", backend::PixelDataType::FLOAT); + .value("FLOAT", backend::PixelDataType::FLOAT) + .value("UINT_10F_11F_11F_REV", backend::PixelDataType::UINT_10F_11F_11F_REV) + .value("USHORT_565", backend::PixelDataType::USHORT_565); enum_("CompressedPixelDataType") .value("EAC_R11", backend::CompressedPixelDataType::EAC_R11)