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)
#define GL_BGR5_A1_ANGLEX 0x6ABD
#define GL_INT_64_ANGLEX 0x6ABE
#define GL_UINT_64_ANGLEX 0x6ABF
#define GL_BGRA8_SRGB_ANGLEX 0x6AC0
// Hidden enum for the NULL D3D device type.
#define EGL_PLATFORM_ANGLE_DEVICE_TYPE_NULL_ANGLE 0x6AC0
......
......@@ -48,6 +48,7 @@ enum class Format::ID
B5G5R5A1_UNORM,
B5G6R5_UNORM,
B8G8R8A8_UNORM,
B8G8R8A8_UNORM_SRGB,
B8G8R8X8_UNORM,
BC1_RGBA_UNORM_BLOCK,
BC1_RGBA_UNORM_SRGB_BLOCK,
......@@ -141,6 +142,6 @@ enum class Format::ID
S8_UINT
};
constexpr uint32_t kNumANGLEFormats = 127;
constexpr uint32_t kNumANGLEFormats = 128;
} // namespace angle
......@@ -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::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_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::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 },
......@@ -321,6 +322,8 @@ Format::ID Format::InternalFormatToID(GLenum internalFormat)
return Format::ID::ASTC_10x6_UNORM_BLOCK;
case GL_COMPRESSED_SRGB8_ETC2:
return Format::ID::ETC2_R8G8B8_SRGB_BLOCK;
case GL_BGRA8_SRGB_ANGLEX:
return Format::ID::B8G8R8A8_UNORM_SRGB;
case GL_DEPTH32F_STENCIL8:
return Format::ID::D32_FLOAT_S8X24_UINT;
case GL_COMPRESSED_RGBA_ASTC_6x6_KHR:
......
......@@ -6,6 +6,7 @@
[ "GL_BGR5_A1_ANGLEX", "B5G5R5A1_UNORM" ],
[ "GL_BGRA4_ANGLEX", "B4G4R4A4_UNORM" ],
[ "GL_BGRA8_EXT", "B8G8R8A8_UNORM" ],
[ "GL_BGRA8_SRGB_ANGLEX", "B8G8R8A8_UNORM_SRGB"],
[ "GL_BGRX8_ANGLEX", "B8G8R8X8_UNORM" ],
[ "GL_COMPRESSED_R11_EAC", "EAC_R11_UNORM_BLOCK" ],
[ "GL_COMPRESSED_RG11_EAC", "EAC_R11G11_UNORM_BLOCK" ],
......
......@@ -292,7 +292,7 @@ const Format &GetFormat(DXGI_FORMAT dxgiFormat)
case DXGI_FORMAT_B8G8R8A8_UNORM:
return Format::Get(Format::ID::B8G8R8A8_UNORM);
case DXGI_FORMAT_B8G8R8A8_UNORM_SRGB:
break;
return Format::Get(Format::ID::B8G8R8A8_UNORM_SRGB);
case DXGI_FORMAT_B8G8R8X8_TYPELESS:
break;
case DXGI_FORMAT_B8G8R8X8_UNORM:
......
......@@ -56,6 +56,15 @@
"bits": { "red": 8, "green": 8, "blue": 8, "alpha": 8 },
"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": {
"texFormat": "DXGI_FORMAT_BC1_UNORM",
"srvFormat": "DXGI_FORMAT_BC1_UNORM",
......
......@@ -3,6 +3,7 @@
"GL_ALPHA32F_EXT": "R32G32B32A32_FLOAT",
"GL_BGR5_A1_ANGLEX": "B8G8R8A8_UNORM",
"GL_BGRA4_ANGLEX": "B8G8R8A8_UNORM",
"GL_BGRA8_SRGB_ANGLEX": "B8G8R8A8_UNORM_SRGB",
"GL_COMPRESSED_R11_EAC": "R8_UNORM",
"GL_COMPRESSED_RG11_EAC": "R8G8_UNORM",
"GL_COMPRESSED_RGB8_ETC2": "R8G8B8A8_UNORM",
......
......@@ -156,6 +156,19 @@ const Format &Format::Get(GLenum internalFormat, const Renderer11DeviceCaps &dev
nullptr);
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:
{
static constexpr Format info(GL_COMPRESSED_R11_EAC,
......
......@@ -383,6 +383,10 @@ void Format::initialize(VkPhysicalDevice physicalDevice, const angle::Format &an
break;
}
case angle::Format::ID::B8G8R8A8_UNORM_SRGB:
// This format is not implemented in Vulkan.
break;
case angle::Format::ID::B8G8R8X8_UNORM:
// This format is not implemented in Vulkan.
break;
......
......@@ -150,7 +150,8 @@ class D3DTextureTest : public ANGLETest
EGLint eglTextureTarget,
UINT sampleCount,
UINT sampleQuality,
UINT bindFlags)
UINT bindFlags,
DXGI_FORMAT format)
{
EGLWindow *window = getEGLWindow();
EGLDisplay display = window->getDisplay();
......@@ -163,8 +164,8 @@ class D3DTextureTest : public ANGLETest
ASSERT(mD3D11Device);
ID3D11Texture2D *texture = nullptr;
CD3D11_TEXTURE2D_DESC desc(DXGI_FORMAT_R8G8B8A8_UNORM, static_cast<UINT>(width),
static_cast<UINT>(height), 1, 1, bindFlags);
CD3D11_TEXTURE2D_DESC desc(format, static_cast<UINT>(width), static_cast<UINT>(height), 1,
1, bindFlags);
desc.SampleDesc.Count = sampleCount;
desc.SampleDesc.Quality = sampleQuality;
EXPECT_TRUE(SUCCEEDED(mD3D11Device->CreateTexture2D(&desc, nullptr, &texture)));
......@@ -186,9 +187,9 @@ class D3DTextureTest : public ANGLETest
{
if (mD3D11Device)
{
return createD3D11PBuffer(width, height, eglTextureFormat, eglTextureTarget,
sampleCount, sampleQuality,
D3D11_BIND_SHADER_RESOURCE | D3D11_BIND_RENDER_TARGET);
return createD3D11PBuffer(
width, height, eglTextureFormat, eglTextureTarget, sampleCount, sampleQuality,
D3D11_BIND_SHADER_RESOURCE | D3D11_BIND_RENDER_TARGET, DXGI_FORMAT_R8G8B8A8_UNORM);
}
if (mD3D9Device)
......@@ -265,6 +266,31 @@ class D3DTextureTest : public ANGLETest
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_P(D3DTextureTest, Clear)
{
......@@ -449,8 +475,9 @@ TEST_P(D3DTextureTest, NonReadablePBuffer)
constexpr size_t bufferSize = 32;
EGLSurface pbuffer = createD3D11PBuffer(bufferSize, bufferSize, EGL_TEXTURE_RGBA,
EGL_TEXTURE_2D, 1, 0, D3D11_BIND_RENDER_TARGET);
EGLSurface pbuffer =
createD3D11PBuffer(bufferSize, bufferSize, EGL_TEXTURE_RGBA, EGL_TEXTURE_2D, 1, 0,
D3D11_BIND_RENDER_TARGET, DXGI_FORMAT_R8G8B8A8_UNORM);
ASSERT_EGL_SUCCESS();
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