Commit 935cb7c5 by Sami Väisänen Committed by Commit Bot

Support B8G8R8A8_UNORM_SRGB as D3D11 texture format

Support B8G8R8A8_UNORM_SRGB as D3D11 texture format. BUG=angleproject:2172 Change-Id: I2f15a55123601735d7fc6caa40bb056243a91b44 Reviewed-on: https://chromium-review.googlesource.com/758600Reviewed-by: 's avatarGeoff Lang <geofflang@chromium.org> Commit-Queue: Geoff Lang <geofflang@chromium.org>
parent fa125c9e
...@@ -197,6 +197,7 @@ std::string ToString(const T &value) ...@@ -197,6 +197,7 @@ std::string ToString(const T &value)
#define GL_BGR5_A1_ANGLEX 0x6ABD #define GL_BGR5_A1_ANGLEX 0x6ABD
#define GL_INT_64_ANGLEX 0x6ABE #define GL_INT_64_ANGLEX 0x6ABE
#define GL_UINT_64_ANGLEX 0x6ABF #define GL_UINT_64_ANGLEX 0x6ABF
#define GL_BGRA8_SRGB_ANGLEX 0x6AC0
// Hidden enum for the NULL D3D device type. // Hidden enum for the NULL D3D device type.
#define EGL_PLATFORM_ANGLE_DEVICE_TYPE_NULL_ANGLE 0x6AC0 #define EGL_PLATFORM_ANGLE_DEVICE_TYPE_NULL_ANGLE 0x6AC0
......
...@@ -48,6 +48,7 @@ enum class Format::ID ...@@ -48,6 +48,7 @@ enum class Format::ID
B5G5R5A1_UNORM, B5G5R5A1_UNORM,
B5G6R5_UNORM, B5G6R5_UNORM,
B8G8R8A8_UNORM, B8G8R8A8_UNORM,
B8G8R8A8_UNORM_SRGB,
B8G8R8X8_UNORM, B8G8R8X8_UNORM,
BC1_RGBA_UNORM_BLOCK, BC1_RGBA_UNORM_BLOCK,
BC1_RGBA_UNORM_SRGB_BLOCK, BC1_RGBA_UNORM_SRGB_BLOCK,
...@@ -141,6 +142,6 @@ enum class Format::ID ...@@ -141,6 +142,6 @@ enum class Format::ID
S8_UINT S8_UINT
}; };
constexpr uint32_t kNumANGLEFormats = 127; constexpr uint32_t kNumANGLEFormats = 128;
} // namespace angle } // namespace angle
...@@ -60,6 +60,7 @@ constexpr Format g_formatInfoTable[] = { ...@@ -60,6 +60,7 @@ constexpr Format g_formatInfoTable[] = {
{ Format::ID::B5G5R5A1_UNORM, GL_BGR5_A1_ANGLEX, GL_RGB5_A1, GenerateMip<A1R5G5B5>, NoCopyFunctions, ReadColor<A1R5G5B5, GLfloat>, WriteColor<A1R5G5B5, GLfloat>, GL_UNSIGNED_NORMALIZED, 5, 5, 5, 1, 0, 0 }, { Format::ID::B5G5R5A1_UNORM, GL_BGR5_A1_ANGLEX, GL_RGB5_A1, GenerateMip<A1R5G5B5>, NoCopyFunctions, ReadColor<A1R5G5B5, GLfloat>, WriteColor<A1R5G5B5, GLfloat>, GL_UNSIGNED_NORMALIZED, 5, 5, 5, 1, 0, 0 },
{ Format::ID::B5G6R5_UNORM, GL_BGR565_ANGLEX, GL_RGB565, GenerateMip<B5G6R5>, NoCopyFunctions, ReadColor<B5G6R5, GLfloat>, WriteColor<B5G6R5, GLfloat>, GL_UNSIGNED_NORMALIZED, 5, 6, 5, 0, 0, 0 }, { Format::ID::B5G6R5_UNORM, GL_BGR565_ANGLEX, GL_RGB565, GenerateMip<B5G6R5>, NoCopyFunctions, ReadColor<B5G6R5, GLfloat>, WriteColor<B5G6R5, GLfloat>, GL_UNSIGNED_NORMALIZED, 5, 6, 5, 0, 0, 0 },
{ Format::ID::B8G8R8A8_UNORM, GL_BGRA8_EXT, GL_BGRA8_EXT, GenerateMip<B8G8R8A8>, BGRACopyFunctions, ReadColor<B8G8R8A8, GLfloat>, WriteColor<B8G8R8A8, GLfloat>, GL_UNSIGNED_NORMALIZED, 8, 8, 8, 8, 0, 0 }, { Format::ID::B8G8R8A8_UNORM, GL_BGRA8_EXT, GL_BGRA8_EXT, GenerateMip<B8G8R8A8>, BGRACopyFunctions, ReadColor<B8G8R8A8, GLfloat>, WriteColor<B8G8R8A8, GLfloat>, GL_UNSIGNED_NORMALIZED, 8, 8, 8, 8, 0, 0 },
{ Format::ID::B8G8R8A8_UNORM_SRGB, GL_BGRA8_SRGB_ANGLEX, GL_BGRA8_SRGB_ANGLEX, GenerateMip<B8G8R8A8>, NoCopyFunctions, ReadColor<B8G8R8A8, GLfloat>, WriteColor<B8G8R8A8, GLfloat>, GL_UNSIGNED_NORMALIZED, 8, 8, 8, 8, 0, 0 },
{ Format::ID::B8G8R8X8_UNORM, GL_BGRA8_EXT, GL_BGRA8_EXT, GenerateMip<B8G8R8X8>, NoCopyFunctions, ReadColor<B8G8R8X8, GLfloat>, WriteColor<B8G8R8X8, GLfloat>, GL_UNSIGNED_NORMALIZED, 8, 8, 8, 0, 0, 0 }, { Format::ID::B8G8R8X8_UNORM, GL_BGRA8_EXT, GL_BGRA8_EXT, GenerateMip<B8G8R8X8>, NoCopyFunctions, ReadColor<B8G8R8X8, GLfloat>, WriteColor<B8G8R8X8, GLfloat>, GL_UNSIGNED_NORMALIZED, 8, 8, 8, 0, 0, 0 },
{ Format::ID::BC1_RGBA_UNORM_BLOCK, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, nullptr, NoCopyFunctions, nullptr, nullptr, GL_UNSIGNED_NORMALIZED, 0, 0, 0, 0, 0, 0 }, { Format::ID::BC1_RGBA_UNORM_BLOCK, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, nullptr, NoCopyFunctions, nullptr, nullptr, GL_UNSIGNED_NORMALIZED, 0, 0, 0, 0, 0, 0 },
{ Format::ID::BC1_RGBA_UNORM_SRGB_BLOCK, GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT, GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT, nullptr, NoCopyFunctions, nullptr, nullptr, GL_UNSIGNED_NORMALIZED, 0, 0, 0, 0, 0, 0 }, { Format::ID::BC1_RGBA_UNORM_SRGB_BLOCK, GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT, GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT, nullptr, NoCopyFunctions, nullptr, nullptr, GL_UNSIGNED_NORMALIZED, 0, 0, 0, 0, 0, 0 },
...@@ -321,6 +322,8 @@ Format::ID Format::InternalFormatToID(GLenum internalFormat) ...@@ -321,6 +322,8 @@ Format::ID Format::InternalFormatToID(GLenum internalFormat)
return Format::ID::ASTC_10x6_UNORM_BLOCK; return Format::ID::ASTC_10x6_UNORM_BLOCK;
case GL_COMPRESSED_SRGB8_ETC2: case GL_COMPRESSED_SRGB8_ETC2:
return Format::ID::ETC2_R8G8B8_SRGB_BLOCK; return Format::ID::ETC2_R8G8B8_SRGB_BLOCK;
case GL_BGRA8_SRGB_ANGLEX:
return Format::ID::B8G8R8A8_UNORM_SRGB;
case GL_DEPTH32F_STENCIL8: case GL_DEPTH32F_STENCIL8:
return Format::ID::D32_FLOAT_S8X24_UINT; return Format::ID::D32_FLOAT_S8X24_UINT;
case GL_COMPRESSED_RGBA_ASTC_6x6_KHR: case GL_COMPRESSED_RGBA_ASTC_6x6_KHR:
......
...@@ -6,6 +6,7 @@ ...@@ -6,6 +6,7 @@
[ "GL_BGR5_A1_ANGLEX", "B5G5R5A1_UNORM" ], [ "GL_BGR5_A1_ANGLEX", "B5G5R5A1_UNORM" ],
[ "GL_BGRA4_ANGLEX", "B4G4R4A4_UNORM" ], [ "GL_BGRA4_ANGLEX", "B4G4R4A4_UNORM" ],
[ "GL_BGRA8_EXT", "B8G8R8A8_UNORM" ], [ "GL_BGRA8_EXT", "B8G8R8A8_UNORM" ],
[ "GL_BGRA8_SRGB_ANGLEX", "B8G8R8A8_UNORM_SRGB"],
[ "GL_BGRX8_ANGLEX", "B8G8R8X8_UNORM" ], [ "GL_BGRX8_ANGLEX", "B8G8R8X8_UNORM" ],
[ "GL_COMPRESSED_R11_EAC", "EAC_R11_UNORM_BLOCK" ], [ "GL_COMPRESSED_R11_EAC", "EAC_R11_UNORM_BLOCK" ],
[ "GL_COMPRESSED_RG11_EAC", "EAC_R11G11_UNORM_BLOCK" ], [ "GL_COMPRESSED_RG11_EAC", "EAC_R11G11_UNORM_BLOCK" ],
......
...@@ -292,7 +292,7 @@ const Format &GetFormat(DXGI_FORMAT dxgiFormat) ...@@ -292,7 +292,7 @@ const Format &GetFormat(DXGI_FORMAT dxgiFormat)
case DXGI_FORMAT_B8G8R8A8_UNORM: case DXGI_FORMAT_B8G8R8A8_UNORM:
return Format::Get(Format::ID::B8G8R8A8_UNORM); return Format::Get(Format::ID::B8G8R8A8_UNORM);
case DXGI_FORMAT_B8G8R8A8_UNORM_SRGB: case DXGI_FORMAT_B8G8R8A8_UNORM_SRGB:
break; return Format::Get(Format::ID::B8G8R8A8_UNORM_SRGB);
case DXGI_FORMAT_B8G8R8X8_TYPELESS: case DXGI_FORMAT_B8G8R8X8_TYPELESS:
break; break;
case DXGI_FORMAT_B8G8R8X8_UNORM: case DXGI_FORMAT_B8G8R8X8_UNORM:
......
...@@ -56,6 +56,15 @@ ...@@ -56,6 +56,15 @@
"bits": { "red": 8, "green": 8, "blue": 8, "alpha": 8 }, "bits": { "red": 8, "green": 8, "blue": 8, "alpha": 8 },
"glInternalFormat": "GL_BGRA8_EXT" "glInternalFormat": "GL_BGRA8_EXT"
}, },
"B8G8R8A8_UNORM_SRGB": {
"texFormat": "DXGI_FORMAT_B8G8R8A8_UNORM_SRGB",
"srvFormat": "DXGI_FORMAT_B8G8R8A8_UNORM_SRGB",
"rtvFormat": "DXGI_FORMAT_B8G8R8A8_UNORM_SRGB",
"channels": "bgra",
"componentType": "unorm",
"bits": {"red": 8, "green": 8, "blue": 8,"alpha": 8},
"siwzzleFormat": "GL_RGBA8"
},
"BC1_RGBA_UNORM_BLOCK": { "BC1_RGBA_UNORM_BLOCK": {
"texFormat": "DXGI_FORMAT_BC1_UNORM", "texFormat": "DXGI_FORMAT_BC1_UNORM",
"srvFormat": "DXGI_FORMAT_BC1_UNORM", "srvFormat": "DXGI_FORMAT_BC1_UNORM",
......
...@@ -3,6 +3,7 @@ ...@@ -3,6 +3,7 @@
"GL_ALPHA32F_EXT": "R32G32B32A32_FLOAT", "GL_ALPHA32F_EXT": "R32G32B32A32_FLOAT",
"GL_BGR5_A1_ANGLEX": "B8G8R8A8_UNORM", "GL_BGR5_A1_ANGLEX": "B8G8R8A8_UNORM",
"GL_BGRA4_ANGLEX": "B8G8R8A8_UNORM", "GL_BGRA4_ANGLEX": "B8G8R8A8_UNORM",
"GL_BGRA8_SRGB_ANGLEX": "B8G8R8A8_UNORM_SRGB",
"GL_COMPRESSED_R11_EAC": "R8_UNORM", "GL_COMPRESSED_R11_EAC": "R8_UNORM",
"GL_COMPRESSED_RG11_EAC": "R8G8_UNORM", "GL_COMPRESSED_RG11_EAC": "R8G8_UNORM",
"GL_COMPRESSED_RGB8_ETC2": "R8G8B8A8_UNORM", "GL_COMPRESSED_RGB8_ETC2": "R8G8B8A8_UNORM",
......
...@@ -156,6 +156,19 @@ const Format &Format::Get(GLenum internalFormat, const Renderer11DeviceCaps &dev ...@@ -156,6 +156,19 @@ const Format &Format::Get(GLenum internalFormat, const Renderer11DeviceCaps &dev
nullptr); nullptr);
return info; return info;
} }
case GL_BGRA8_SRGB_ANGLEX:
{
static constexpr Format info(GL_BGRA8_SRGB_ANGLEX,
angle::Format::ID::B8G8R8A8_UNORM_SRGB,
DXGI_FORMAT_B8G8R8A8_UNORM_SRGB,
DXGI_FORMAT_B8G8R8A8_UNORM_SRGB,
DXGI_FORMAT_B8G8R8A8_UNORM_SRGB,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_B8G8R8A8_UNORM_SRGB,
GL_BGRA8_SRGB_ANGLEX,
nullptr);
return info;
}
case GL_COMPRESSED_R11_EAC: case GL_COMPRESSED_R11_EAC:
{ {
static constexpr Format info(GL_COMPRESSED_R11_EAC, static constexpr Format info(GL_COMPRESSED_R11_EAC,
......
...@@ -383,6 +383,10 @@ void Format::initialize(VkPhysicalDevice physicalDevice, const angle::Format &an ...@@ -383,6 +383,10 @@ void Format::initialize(VkPhysicalDevice physicalDevice, const angle::Format &an
break; break;
} }
case angle::Format::ID::B8G8R8A8_UNORM_SRGB:
// This format is not implemented in Vulkan.
break;
case angle::Format::ID::B8G8R8X8_UNORM: case angle::Format::ID::B8G8R8X8_UNORM:
// This format is not implemented in Vulkan. // This format is not implemented in Vulkan.
break; break;
......
...@@ -150,7 +150,8 @@ class D3DTextureTest : public ANGLETest ...@@ -150,7 +150,8 @@ class D3DTextureTest : public ANGLETest
EGLint eglTextureTarget, EGLint eglTextureTarget,
UINT sampleCount, UINT sampleCount,
UINT sampleQuality, UINT sampleQuality,
UINT bindFlags) UINT bindFlags,
DXGI_FORMAT format)
{ {
EGLWindow *window = getEGLWindow(); EGLWindow *window = getEGLWindow();
EGLDisplay display = window->getDisplay(); EGLDisplay display = window->getDisplay();
...@@ -163,8 +164,8 @@ class D3DTextureTest : public ANGLETest ...@@ -163,8 +164,8 @@ class D3DTextureTest : public ANGLETest
ASSERT(mD3D11Device); ASSERT(mD3D11Device);
ID3D11Texture2D *texture = nullptr; ID3D11Texture2D *texture = nullptr;
CD3D11_TEXTURE2D_DESC desc(DXGI_FORMAT_R8G8B8A8_UNORM, static_cast<UINT>(width), CD3D11_TEXTURE2D_DESC desc(format, static_cast<UINT>(width), static_cast<UINT>(height), 1,
static_cast<UINT>(height), 1, 1, bindFlags); 1, bindFlags);
desc.SampleDesc.Count = sampleCount; desc.SampleDesc.Count = sampleCount;
desc.SampleDesc.Quality = sampleQuality; desc.SampleDesc.Quality = sampleQuality;
EXPECT_TRUE(SUCCEEDED(mD3D11Device->CreateTexture2D(&desc, nullptr, &texture))); EXPECT_TRUE(SUCCEEDED(mD3D11Device->CreateTexture2D(&desc, nullptr, &texture)));
...@@ -186,9 +187,9 @@ class D3DTextureTest : public ANGLETest ...@@ -186,9 +187,9 @@ class D3DTextureTest : public ANGLETest
{ {
if (mD3D11Device) if (mD3D11Device)
{ {
return createD3D11PBuffer(width, height, eglTextureFormat, eglTextureTarget, return createD3D11PBuffer(
sampleCount, sampleQuality, width, height, eglTextureFormat, eglTextureTarget, sampleCount, sampleQuality,
D3D11_BIND_SHADER_RESOURCE | D3D11_BIND_RENDER_TARGET); D3D11_BIND_SHADER_RESOURCE | D3D11_BIND_RENDER_TARGET, DXGI_FORMAT_R8G8B8A8_UNORM);
} }
if (mD3D9Device) if (mD3D9Device)
...@@ -265,6 +266,31 @@ class D3DTextureTest : public ANGLETest ...@@ -265,6 +266,31 @@ class D3DTextureTest : public ANGLETest
IDirect3DDevice9 *mD3D9Device = nullptr; IDirect3DDevice9 *mD3D9Device = nullptr;
}; };
// Test creating pbuffer from textures with several
// different DXGI formats.
TEST_P(D3DTextureTest, TestD3D11SupportedFormats)
{
ANGLE_SKIP_TEST_IF(!valid() || !IsD3D11());
const DXGI_FORMAT formats[] = {DXGI_FORMAT_R8G8B8A8_UNORM, DXGI_FORMAT_R8G8B8A8_UNORM_SRGB,
DXGI_FORMAT_B8G8R8A8_UNORM, DXGI_FORMAT_B8G8R8A8_UNORM_SRGB};
for (size_t i = 0; i < 4; ++i)
{
EGLSurface pbuffer = createD3D11PBuffer(32, 32, EGL_TEXTURE_RGBA, EGL_TEXTURE_2D, 1, 0,
D3D11_BIND_RENDER_TARGET, formats[i]);
ASSERT_EGL_SUCCESS();
ASSERT_NE(pbuffer, EGL_NO_SURFACE);
EGLWindow *window = getEGLWindow();
EGLDisplay display = window->getDisplay();
eglMakeCurrent(display, pbuffer, pbuffer, window->getContext());
ASSERT_EGL_SUCCESS();
window->makeCurrent();
eglDestroySurface(display, pbuffer);
}
}
// Test creating a pbuffer from a d3d surface and clearing it // Test creating a pbuffer from a d3d surface and clearing it
TEST_P(D3DTextureTest, Clear) TEST_P(D3DTextureTest, Clear)
{ {
...@@ -449,8 +475,9 @@ TEST_P(D3DTextureTest, NonReadablePBuffer) ...@@ -449,8 +475,9 @@ TEST_P(D3DTextureTest, NonReadablePBuffer)
constexpr size_t bufferSize = 32; constexpr size_t bufferSize = 32;
EGLSurface pbuffer = createD3D11PBuffer(bufferSize, bufferSize, EGL_TEXTURE_RGBA, EGLSurface pbuffer =
EGL_TEXTURE_2D, 1, 0, D3D11_BIND_RENDER_TARGET); createD3D11PBuffer(bufferSize, bufferSize, EGL_TEXTURE_RGBA, EGL_TEXTURE_2D, 1, 0,
D3D11_BIND_RENDER_TARGET, DXGI_FORMAT_R8G8B8A8_UNORM);
ASSERT_EGL_SUCCESS(); ASSERT_EGL_SUCCESS();
ASSERT_NE(pbuffer, EGL_NO_SURFACE); ASSERT_NE(pbuffer, EGL_NO_SURFACE);
......
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