Commit 41918387 by Luc Ferron

Vulkan: Additional texture formats support. RGB565, RGBA4444, RGBA5551

Bug:angleproject:2358 Change-Id: I4dc19f9e4cc7b51f215b57d440a108cdf17aec24 Reviewed-on: https://chromium-review.googlesource.com/960573Reviewed-by: 's avatarGeoff Lang <geofflang@chromium.org>
parent 0b0dcbc1
...@@ -191,6 +191,7 @@ std::string ToString(const T &value) ...@@ -191,6 +191,7 @@ std::string ToString(const T &value)
#define snprintf _snprintf #define snprintf _snprintf
#endif #endif
#define GL_A1RGB5_ANGLEX 0x6AC5
#define GL_BGRX8_ANGLEX 0x6ABA #define GL_BGRX8_ANGLEX 0x6ABA
#define GL_BGR565_ANGLEX 0x6ABB #define GL_BGR565_ANGLEX 0x6ABB
#define GL_BGRA4_ANGLEX 0x6ABC #define GL_BGRA4_ANGLEX 0x6ABC
......
...@@ -14,6 +14,7 @@ enum class Format::ID ...@@ -14,6 +14,7 @@ enum class Format::ID
{ {
NONE, NONE,
A16_FLOAT, A16_FLOAT,
A1R5G5B5_UNORM,
A32_FLOAT, A32_FLOAT,
A8_UNORM, A8_UNORM,
ASTC_10x10_SRGB_BLOCK, ASTC_10x10_SRGB_BLOCK,
...@@ -146,6 +147,6 @@ enum class Format::ID ...@@ -146,6 +147,6 @@ enum class Format::ID
S8_UINT S8_UINT
}; };
constexpr uint32_t kNumANGLEFormats = 132; constexpr uint32_t kNumANGLEFormats = 133;
} // namespace angle } // namespace angle
...@@ -26,6 +26,7 @@ constexpr Format g_formatInfoTable[] = { ...@@ -26,6 +26,7 @@ constexpr Format g_formatInfoTable[] = {
// clang-format off // clang-format off
{ Format::ID::NONE, GL_NONE, GL_NONE, nullptr, NoCopyFunctions, nullptr, nullptr, GL_NONE, 0, 0, 0, 0, 0, 0 }, { Format::ID::NONE, GL_NONE, GL_NONE, nullptr, NoCopyFunctions, nullptr, nullptr, GL_NONE, 0, 0, 0, 0, 0, 0 },
{ Format::ID::A16_FLOAT, GL_ALPHA16F_EXT, GL_ALPHA16F_EXT, GenerateMip<A16F>, NoCopyFunctions, ReadColor<A16F, GLfloat>, WriteColor<A16F, GLfloat>, GL_FLOAT, 0, 0, 0, 16, 0, 0 }, { Format::ID::A16_FLOAT, GL_ALPHA16F_EXT, GL_ALPHA16F_EXT, GenerateMip<A16F>, NoCopyFunctions, ReadColor<A16F, GLfloat>, WriteColor<A16F, GLfloat>, GL_FLOAT, 0, 0, 0, 16, 0, 0 },
{ Format::ID::A1R5G5B5_UNORM, GL_A1RGB5_ANGLEX, GL_A1RGB5_ANGLEX, GenerateMip<A1R5G5B5>, NoCopyFunctions, ReadColor<A1R5G5B5, GLfloat>, WriteColor<A1R5G5B5, GLfloat>, GL_UNSIGNED_NORMALIZED, 5, 5, 5, 1, 0, 0 },
{ Format::ID::A32_FLOAT, GL_ALPHA32F_EXT, GL_ALPHA32F_EXT, GenerateMip<A32F>, NoCopyFunctions, ReadColor<A32F, GLfloat>, WriteColor<A32F, GLfloat>, GL_FLOAT, 0, 0, 0, 32, 0, 0 }, { Format::ID::A32_FLOAT, GL_ALPHA32F_EXT, GL_ALPHA32F_EXT, GenerateMip<A32F>, NoCopyFunctions, ReadColor<A32F, GLfloat>, WriteColor<A32F, GLfloat>, GL_FLOAT, 0, 0, 0, 32, 0, 0 },
{ Format::ID::A8_UNORM, GL_ALPHA8_EXT, GL_ALPHA8_EXT, GenerateMip<A8>, NoCopyFunctions, ReadColor<A8, GLfloat>, WriteColor<A8, GLfloat>, GL_UNSIGNED_NORMALIZED, 0, 0, 0, 8, 0, 0 }, { Format::ID::A8_UNORM, GL_ALPHA8_EXT, GL_ALPHA8_EXT, GenerateMip<A8>, NoCopyFunctions, ReadColor<A8, GLfloat>, WriteColor<A8, GLfloat>, GL_UNSIGNED_NORMALIZED, 0, 0, 0, 8, 0, 0 },
{ Format::ID::ASTC_10x10_SRGB_BLOCK, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR, nullptr, NoCopyFunctions, nullptr, nullptr, GL_UNSIGNED_NORMALIZED, 0, 0, 0, 0, 0, 0 }, { Format::ID::ASTC_10x10_SRGB_BLOCK, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR, nullptr, NoCopyFunctions, nullptr, nullptr, GL_UNSIGNED_NORMALIZED, 0, 0, 0, 0, 0, 0 },
...@@ -164,6 +165,8 @@ Format::ID Format::InternalFormatToID(GLenum internalFormat) ...@@ -164,6 +165,8 @@ Format::ID Format::InternalFormatToID(GLenum internalFormat)
{ {
switch (internalFormat) switch (internalFormat)
{ {
case GL_A1RGB5_ANGLEX:
return Format::ID::A1R5G5B5_UNORM;
case GL_ALPHA16F_EXT: case GL_ALPHA16F_EXT:
return Format::ID::A16_FLOAT; return Format::ID::A16_FLOAT;
case GL_ALPHA32F_EXT: case GL_ALPHA32F_EXT:
......
...@@ -129,6 +129,7 @@ ...@@ -129,6 +129,7 @@
[ "GL_RG16_SNORM_EXT", "R16G16_SNORM" ], [ "GL_RG16_SNORM_EXT", "R16G16_SNORM" ],
[ "GL_RGB16_SNORM_EXT", "R16G16B16_SNORM" ], [ "GL_RGB16_SNORM_EXT", "R16G16B16_SNORM" ],
[ "GL_RGBA16_SNORM_EXT", "R16G16B16A16_SNORM" ], [ "GL_RGBA16_SNORM_EXT", "R16G16B16A16_SNORM" ],
[ "GL_A1RGB5_ANGLEX", "A1R5G5B5_UNORM" ],
[ "GL_RGBA8_TYPELESS_ANGLEX", "R8G8B8A8_TYPELESS" ], [ "GL_RGBA8_TYPELESS_ANGLEX", "R8G8B8A8_TYPELESS" ],
[ "GL_RGBA8_TYPELESS_SRGB_ANGLEX", "R8G8B8A8_TYPELESS_SRGB" ], [ "GL_RGBA8_TYPELESS_SRGB_ANGLEX", "R8G8B8A8_TYPELESS_SRGB" ],
[ "GL_BGRA8_TYPELESS_ANGLEX", "B8G8R8A8_TYPELESS" ], [ "GL_BGRA8_TYPELESS_ANGLEX", "B8G8R8A8_TYPELESS" ],
......
...@@ -132,6 +132,9 @@ ...@@ -132,6 +132,9 @@
} }
}, },
"GL_RGB5_A1": { "GL_RGB5_A1": {
"A1R5G5B5_UNORM": {
"GL_UNSIGNED_SHORT_5_5_5_1": "LoadRGB5A1ToA1RGB5"
},
"R8G8B8A8_UNORM": { "R8G8B8A8_UNORM": {
"GL_UNSIGNED_INT_2_10_10_10_REV": "LoadRGB10A2ToRGBA8", "GL_UNSIGNED_INT_2_10_10_10_REV": "LoadRGB10A2ToRGBA8",
"GL_UNSIGNED_BYTE": "LoadToNative<GLubyte, 4>", "GL_UNSIGNED_BYTE": "LoadToNative<GLubyte, 4>",
...@@ -442,6 +445,9 @@ ...@@ -442,6 +445,9 @@
} }
}, },
"GL_RGB565": { "GL_RGB565": {
"R5G6B5_UNORM" : {
"GL_UNSIGNED_SHORT_5_6_5": "LoadToNative<GLushort, 1>"
},
"R8G8B8A8_UNORM": { "R8G8B8A8_UNORM": {
"GL_UNSIGNED_BYTE": "LoadToNative3To4<GLubyte, 0xFF>", "GL_UNSIGNED_BYTE": "LoadToNative3To4<GLubyte, 0xFF>",
"GL_UNSIGNED_SHORT_5_6_5": "LoadR5G6B5ToRGBA8" "GL_UNSIGNED_SHORT_5_6_5": "LoadR5G6B5ToRGBA8"
......
...@@ -1230,6 +1230,18 @@ LoadImageFunctionInfo RGB565_to_B5G6R5_UNORM(GLenum type) ...@@ -1230,6 +1230,18 @@ LoadImageFunctionInfo RGB565_to_B5G6R5_UNORM(GLenum type)
} }
} }
LoadImageFunctionInfo RGB565_to_R5G6B5_UNORM(GLenum type)
{
switch (type)
{
case GL_UNSIGNED_SHORT_5_6_5:
return LoadImageFunctionInfo(LoadToNative<GLushort, 1>, false);
default:
UNREACHABLE();
return LoadImageFunctionInfo(UnreachableLoadFunction, true);
}
}
LoadImageFunctionInfo RGB565_to_R8G8B8A8_UNORM(GLenum type) LoadImageFunctionInfo RGB565_to_R8G8B8A8_UNORM(GLenum type)
{ {
switch (type) switch (type)
...@@ -1244,6 +1256,18 @@ LoadImageFunctionInfo RGB565_to_R8G8B8A8_UNORM(GLenum type) ...@@ -1244,6 +1256,18 @@ LoadImageFunctionInfo RGB565_to_R8G8B8A8_UNORM(GLenum type)
} }
} }
LoadImageFunctionInfo RGB5_A1_to_A1R5G5B5_UNORM(GLenum type)
{
switch (type)
{
case GL_UNSIGNED_SHORT_5_5_5_1:
return LoadImageFunctionInfo(LoadRGB5A1ToA1RGB5, true);
default:
UNREACHABLE();
return LoadImageFunctionInfo(UnreachableLoadFunction, true);
}
}
LoadImageFunctionInfo RGB5_A1_to_B5G5R5A1_UNORM(GLenum type) LoadImageFunctionInfo RGB5_A1_to_B5G5R5A1_UNORM(GLenum type)
{ {
switch (type) switch (type)
...@@ -2325,6 +2349,8 @@ LoadFunctionMap GetLoadFunctionsMap(GLenum internalFormat, Format::ID angleForma ...@@ -2325,6 +2349,8 @@ LoadFunctionMap GetLoadFunctionsMap(GLenum internalFormat, Format::ID angleForma
{ {
case Format::ID::B5G6R5_UNORM: case Format::ID::B5G6R5_UNORM:
return RGB565_to_B5G6R5_UNORM; return RGB565_to_B5G6R5_UNORM;
case Format::ID::R5G6B5_UNORM:
return RGB565_to_R5G6B5_UNORM;
case Format::ID::R8G8B8A8_UNORM: case Format::ID::R8G8B8A8_UNORM:
return RGB565_to_R8G8B8A8_UNORM; return RGB565_to_R8G8B8A8_UNORM;
default: default:
...@@ -2336,6 +2362,8 @@ LoadFunctionMap GetLoadFunctionsMap(GLenum internalFormat, Format::ID angleForma ...@@ -2336,6 +2362,8 @@ LoadFunctionMap GetLoadFunctionsMap(GLenum internalFormat, Format::ID angleForma
{ {
switch (angleFormat) switch (angleFormat)
{ {
case Format::ID::A1R5G5B5_UNORM:
return RGB5_A1_to_A1R5G5B5_UNORM;
case Format::ID::B5G5R5A1_UNORM: case Format::ID::B5G5R5A1_UNORM:
return RGB5_A1_to_B5G5R5A1_UNORM; return RGB5_A1_to_B5G5R5A1_UNORM;
case Format::ID::R8G8B8A8_UNORM: case Format::ID::R8G8B8A8_UNORM:
......
...@@ -26,13 +26,13 @@ ...@@ -26,13 +26,13 @@
], ],
"map": { "map": {
"NONE": "VK_FORMAT_UNDEFINED", "NONE": "VK_FORMAT_UNDEFINED",
"R4G4B4A4_UNORM": "VK_FORMAT_R4G4B4A4_UNORM_PACK16", "A1R5G5B5_UNORM": "VK_FORMAT_A1R5G5B5_UNORM_PACK16",
"B4G4R4A4_UNORM": "VK_FORMAT_B4G4R4A4_UNORM_PACK16", "B4G4R4A4_UNORM": "VK_FORMAT_B4G4R4A4_UNORM_PACK16",
"R4G4B4A4_UNORM": "VK_FORMAT_R4G4B4A4_UNORM_PACK16",
"R5G6B5_UNORM": "VK_FORMAT_R5G6B5_UNORM_PACK16", "R5G6B5_UNORM": "VK_FORMAT_R5G6B5_UNORM_PACK16",
"B5G6R5_UNORM": "VK_FORMAT_B5G6R5_UNORM_PACK16",
"R5G5B5A1_UNORM": "VK_FORMAT_R5G5B5A1_UNORM_PACK16", "R5G5B5A1_UNORM": "VK_FORMAT_R5G5B5A1_UNORM_PACK16",
"B5G6R5_UNORM": "VK_FORMAT_B5G6R5_UNORM_PACK16",
"B5G5R5A1_UNORM": "VK_FORMAT_B5G5R5A1_UNORM_PACK16", "B5G5R5A1_UNORM": "VK_FORMAT_B5G5R5A1_UNORM_PACK16",
"A1R5G5B5_UNORM": "VK_FORMAT_A1R5G5B5_UNORM_PACK16",
"R8_UNORM": "VK_FORMAT_R8_UNORM", "R8_UNORM": "VK_FORMAT_R8_UNORM",
"R8_SNORM": "VK_FORMAT_R8_SNORM", "R8_SNORM": "VK_FORMAT_R8_SNORM",
"R8_UINT": "VK_FORMAT_R8_UINT", "R8_UINT": "VK_FORMAT_R8_UINT",
...@@ -194,6 +194,14 @@ ...@@ -194,6 +194,14 @@
"buffer": "NONE", "buffer": "NONE",
"texture": "R8G8_UNORM" "texture": "R8G8_UNORM"
}, },
"R4G4B4A4_UNORM": {
"buffer": "NONE",
"texture": "R8G8B8A8_UNORM"
},
"R5G5B5A1_UNORM": {
"buffer": "NONE",
"texture": "A1R5G5B5_UNORM"
},
"R8G8B8_UNORM": { "R8G8B8_UNORM": {
"texture": "R8G8B8A8_UNORM" "texture": "R8G8B8A8_UNORM"
} }
......
...@@ -30,6 +30,17 @@ void Format::initialize(VkPhysicalDevice physicalDevice, const angle::Format &an ...@@ -30,6 +30,17 @@ void Format::initialize(VkPhysicalDevice physicalDevice, const angle::Format &an
// This format is not implemented in Vulkan. // This format is not implemented in Vulkan.
break; break;
case angle::Format::ID::A1R5G5B5_UNORM:
{
internalFormat = GL_A1RGB5_ANGLEX;
textureFormatID = angle::Format::ID::A1R5G5B5_UNORM;
vkTextureFormat = VK_FORMAT_A1R5G5B5_UNORM_PACK16;
bufferFormatID = angle::Format::ID::A1R5G5B5_UNORM;
vkBufferFormat = VK_FORMAT_A1R5G5B5_UNORM_PACK16;
dataInitializerFunction = nullptr;
break;
}
case angle::Format::ID::A32_FLOAT: case angle::Format::ID::A32_FLOAT:
// This format is not implemented in Vulkan. // This format is not implemented in Vulkan.
break; break;
...@@ -1044,10 +1055,10 @@ void Format::initialize(VkPhysicalDevice physicalDevice, const angle::Format &an ...@@ -1044,10 +1055,10 @@ void Format::initialize(VkPhysicalDevice physicalDevice, const angle::Format &an
case angle::Format::ID::R4G4B4A4_UNORM: case angle::Format::ID::R4G4B4A4_UNORM:
{ {
internalFormat = GL_RGBA4; internalFormat = GL_RGBA4;
textureFormatID = angle::Format::ID::R4G4B4A4_UNORM; textureFormatID = angle::Format::ID::R8G8B8A8_UNORM;
vkTextureFormat = VK_FORMAT_R4G4B4A4_UNORM_PACK16; vkTextureFormat = VK_FORMAT_R8G8B8A8_UNORM;
bufferFormatID = angle::Format::ID::R4G4B4A4_UNORM; bufferFormatID = angle::Format::ID::NONE;
vkBufferFormat = VK_FORMAT_R4G4B4A4_UNORM_PACK16; vkBufferFormat = VK_FORMAT_UNDEFINED;
dataInitializerFunction = nullptr; dataInitializerFunction = nullptr;
break; break;
} }
...@@ -1055,10 +1066,10 @@ void Format::initialize(VkPhysicalDevice physicalDevice, const angle::Format &an ...@@ -1055,10 +1066,10 @@ void Format::initialize(VkPhysicalDevice physicalDevice, const angle::Format &an
case angle::Format::ID::R5G5B5A1_UNORM: case angle::Format::ID::R5G5B5A1_UNORM:
{ {
internalFormat = GL_RGB5_A1; internalFormat = GL_RGB5_A1;
textureFormatID = angle::Format::ID::R5G5B5A1_UNORM; textureFormatID = angle::Format::ID::A1R5G5B5_UNORM;
vkTextureFormat = VK_FORMAT_R5G5B5A1_UNORM_PACK16; vkTextureFormat = VK_FORMAT_A1R5G5B5_UNORM_PACK16;
bufferFormatID = angle::Format::ID::R5G5B5A1_UNORM; bufferFormatID = angle::Format::ID::NONE;
vkBufferFormat = VK_FORMAT_R5G5B5A1_UNORM_PACK16; vkBufferFormat = VK_FORMAT_UNDEFINED;
dataInitializerFunction = nullptr; dataInitializerFunction = nullptr;
break; break;
} }
......
...@@ -192,19 +192,17 @@ ...@@ -192,19 +192,17 @@
2161 VULKAN : dEQP-GLES2.functional.texture.format.l8_cube_pot = SKIP 2161 VULKAN : dEQP-GLES2.functional.texture.format.l8_cube_pot = SKIP
2161 VULKAN : dEQP-GLES2.functional.texture.format.la88_2d_npot = SKIP 2161 VULKAN : dEQP-GLES2.functional.texture.format.la88_2d_npot = SKIP
2161 VULKAN : dEQP-GLES2.functional.texture.format.la88_cube_pot = SKIP 2161 VULKAN : dEQP-GLES2.functional.texture.format.la88_cube_pot = SKIP
2161 VULKAN : dEQP-GLES2.functional.texture.format.rgb565_* = SKIP 2161 VULKAN : dEQP-GLES2.functional.texture.format.rgb565_2d_npot = SKIP
2161 VULKAN : dEQP-GLES2.functional.texture.format.rgb565_cube_pot = SKIP
2161 VULKAN : dEQP-GLES2.functional.texture.format.rgb888_2d_npot = SKIP 2161 VULKAN : dEQP-GLES2.functional.texture.format.rgb888_2d_npot = SKIP
2161 VULKAN : dEQP-GLES2.functional.texture.format.rgb888_cube_pot = SKIP 2161 VULKAN : dEQP-GLES2.functional.texture.format.rgb888_cube_pot = SKIP
2161 VULKAN : dEQP-GLES2.functional.texture.format.rgba4444_2d_pot = SKIP
2161 VULKAN : dEQP-GLES2.functional.texture.format.rgba4444_2d_npot = SKIP 2161 VULKAN : dEQP-GLES2.functional.texture.format.rgba4444_2d_npot = SKIP
2161 VULKAN : dEQP-GLES2.functional.texture.format.rgba4444_cube_pot = SKIP 2161 VULKAN : dEQP-GLES2.functional.texture.format.rgba4444_cube_pot = SKIP
2161 VULKAN : dEQP-GLES2.functional.texture.format.rgba5551_2d_pot = SKIP
2161 VULKAN : dEQP-GLES2.functional.texture.format.rgba5551_2d_npot = SKIP 2161 VULKAN : dEQP-GLES2.functional.texture.format.rgba5551_2d_npot = SKIP
2161 VULKAN : dEQP-GLES2.functional.texture.format.rgba5551_cube_pot = SKIP 2161 VULKAN : dEQP-GLES2.functional.texture.format.rgba5551_cube_pot = SKIP
2161 VULKAN : dEQP-GLES2.functional.texture.format.rgba8888_2d_npot = SKIP 2161 VULKAN : dEQP-GLES2.functional.texture.format.rgba8888_2d_npot = SKIP
2161 VULKAN : dEQP-GLES2.functional.texture.format.rgba8888_cube_pot = SKIP 2161 VULKAN : dEQP-GLES2.functional.texture.format.rgba8888_cube_pot = SKIP
2161 VULKAN : dEQP-GLES2.functional.texture.size.2d.64x64_l8_mipmap = SKIP 2161 VULKAN : dEQP-GLES2.functional.texture.size.2d.64x64_l8_mipmap = SKIP
2161 VULKAN : dEQP-GLES2.functional.texture.size.2d.64x64_rgba4444 = SKIP
2161 VULKAN : dEQP-GLES2.functional.texture.size.2d.64x64_rgba4444_mipmap = SKIP 2161 VULKAN : dEQP-GLES2.functional.texture.size.2d.64x64_rgba4444_mipmap = SKIP
2161 VULKAN : dEQP-GLES2.functional.texture.size.2d.64x64_rgb888_mipmap = SKIP 2161 VULKAN : dEQP-GLES2.functional.texture.size.2d.64x64_rgb888_mipmap = SKIP
2161 VULKAN : dEQP-GLES2.functional.texture.size.2d.64x64_rgba8888_mipmap = SKIP 2161 VULKAN : dEQP-GLES2.functional.texture.size.2d.64x64_rgba8888_mipmap = SKIP
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment