Commit bc49758c by Olli Etuaho

Choose D3D11 swizzle formats in gen_texture_format_table.py

Making swizzle format data come from the ANGLE format table will make it easier to make changes that affect both swizzle formats and regular texture formats. Swizzle format is now specified manually for some tricky formats, but for most it can be determined automatically from the ANGLE texture format info. The ANGLE texture format info in texture_format_table.json is changed to facilitate this. The componentType field now captures only whether the data is normalized, int or float and its signedness, but not the width of the data type. Bit widths of the individual channels are recorded in a separate "bits" object for each ANGLE format entry. Also, a new 16-bit RGBA UNORM ANGLE format is added to support swizzling 16-bit normalized depth formats. This change is mostly just refactoring, but it fixes swizzling for formats which have less bits for alpha than other channels: - RGB10_A2 - RGB10_A2UI - RGB5_A1 BUG=angleproject:1322 BUG=angleproject:1244 TEST=angle_end2end_tests, dEQP-GLES3.functional.texture.swizzle.* (all pass) Change-Id: I87d8a9cc0b6569191f50c41754d77b20ca6afef9 Reviewed-on: https://chromium-review.googlesource.com/329074Reviewed-by: 's avatarJamie Madill <jmadill@chromium.org> Commit-Queue: Olli Etuaho <oetuaho@nvidia.com>
parent 9062b3b7
......@@ -104,8 +104,8 @@ class TextureStorage11 : public TextureStorage
unsigned int mMipLevels;
GLenum mInternalFormat;
d3d11::DXGIFormatSet mTextureFormatSet;
d3d11::DXGIFormatSet mSwizzleFormatSet;
d3d11::ANGLEFormatSet mTextureFormatSet;
d3d11::ANGLEFormatSet mSwizzleFormatSet;
unsigned int mTextureWidth;
unsigned int mTextureHeight;
unsigned int mTextureDepth;
......
#!/usr/bin/python
# Copyright 2015 The ANGLE Project Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
#
# gen_swizzle_format_table.py:
# Code generation for the swizzle format table used for texture formats
#
import json
import pprint
template = """// GENERATED FILE - DO NOT EDIT
// Generated by gen_swizzle_format_table.py using data from swizzle_format_data.json
//
// Copyright 2015 The ANGLE Project Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//
// swizzle_format_info:
// Provides information for swizzle format and a map from type->formatinfo
//
#include "libANGLE/renderer/d3d/d3d11/swizzle_format_info.h"
#include <GLES3/gl3.h>
namespace rx
{{
namespace d3d11
{{
SwizzleSizeType::SwizzleSizeType() : maxComponentSize(0), componentType(GL_NONE)
{{
}}
SwizzleSizeType::SwizzleSizeType(size_t maxComponentSize, GLenum componentType)
: maxComponentSize(maxComponentSize), componentType(componentType)
{{
}}
bool SwizzleSizeType::operator<(const SwizzleSizeType &other) const
{{
return (maxComponentSize != other.maxComponentSize)
? (maxComponentSize < other.maxComponentSize)
: (componentType < other.componentType);
}}
SwizzleFormatInfo::SwizzleFormatInfo()
: mTexFormat(DXGI_FORMAT_UNKNOWN),
mSRVFormat(DXGI_FORMAT_UNKNOWN),
mRTVFormat(DXGI_FORMAT_UNKNOWN)
{{
}}
SwizzleFormatInfo::SwizzleFormatInfo(DXGI_FORMAT texFormat,
DXGI_FORMAT srvFormat,
DXGI_FORMAT rtvFormat)
: mTexFormat(texFormat), mSRVFormat(srvFormat), mRTVFormat(rtvFormat)
{{
}}
const SwizzleFormatInfo &GetSwizzleFormatInfo(GLuint maxBits, GLenum componentType)
{{
// clang-format off
switch ({component_type_param})
{{
{data}
default:
{{
static const SwizzleFormatInfo defaultInfo(DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_UNKNOWN);
return defaultInfo;
}}
}}
// clang-format on
}} // GetSwizzleFormatInfo
}} // namespace d3d11
}} // namespace rx
"""
max_bits_param = 'maxBits'
component_type_param = 'componentType'
tex_format_key = 'texFormat'
srv_format_key = 'srvFormat'
rtv_format_key = 'rtvFormat'
def parse_json_into_switch_string(json_data):
table_data = ''
for component_type in sorted(json_data.iteritems()):
type_str = component_type[0]
table_data += ' case ' + type_str + ':\n'
table_data += ' {\n'
table_data += ' switch (' + max_bits_param + ')\n'
table_data += ' {\n'
for max_width_item in sorted(json_data[type_str].iteritems()):
max_width = max_width_item[0]
table_data += ' case ' + max_width + ':\n'
table_data += ' {\n'
table_data += ' static const SwizzleFormatInfo formatInfo(' + json_data[type_str][max_width][tex_format_key] + ',\n'
table_data += ' ' + json_data[type_str][max_width][srv_format_key] + ',\n'
table_data += ' ' + json_data[type_str][max_width][rtv_format_key] + ');\n'
table_data += ' return formatInfo;\n'
table_data += ' }\n'
table_data += ' default:\n'
table_data += ' break;\n'
table_data += ' }\n'
table_data += ' }\n'
return table_data
with open('swizzle_format_data.json') as functions_json_file:
functions_data = functions_json_file.read();
functions_json_file.close()
json_data = json.loads(functions_data)
table_data = parse_json_into_switch_string(json_data)
output = template.format(component_type_param=component_type_param,
data=table_data)
with open('swizzle_format_info_autogen.cpp', 'wt') as out_file:
out_file.write(output)
out_file.close()
{
"GL_UNSIGNED_NORMALIZED": {
"8": {
"texFormat": "DXGI_FORMAT_R8G8B8A8_UNORM",
"srvFormat": "DXGI_FORMAT_R8G8B8A8_UNORM",
"rtvFormat": "DXGI_FORMAT_R8G8B8A8_UNORM"
},
"16": {
"texFormat": "DXGI_FORMAT_R16G16B16A16_UNORM",
"srvFormat": "DXGI_FORMAT_R16G16B16A16_UNORM",
"rtvFormat": "DXGI_FORMAT_R16G16B16A16_UNORM"
},
"24": {
"texFormat": "DXGI_FORMAT_R32G32B32A32_FLOAT",
"srvFormat": "DXGI_FORMAT_R32G32B32A32_FLOAT",
"rtvFormat": "DXGI_FORMAT_R32G32B32A32_FLOAT"
},
"32": {
"texFormat": "DXGI_FORMAT_R32G32B32A32_FLOAT",
"srvFormat": "DXGI_FORMAT_R32G32B32A32_FLOAT",
"rtvFormat": "DXGI_FORMAT_R32G32B32A32_FLOAT"
}
},
"GL_SIGNED_NORMALIZED": {
"8": {
"texFormat": "DXGI_FORMAT_R8G8B8A8_SNORM",
"srvFormat": "DXGI_FORMAT_R8G8B8A8_SNORM",
"rtvFormat": "DXGI_FORMAT_R8G8B8A8_SNORM"
}
},
"GL_FLOAT": {
"16": {
"texFormat": "DXGI_FORMAT_R16G16B16A16_FLOAT",
"srvFormat": "DXGI_FORMAT_R16G16B16A16_FLOAT",
"rtvFormat": "DXGI_FORMAT_R16G16B16A16_FLOAT"
},
"32": {
"texFormat": "DXGI_FORMAT_R32G32B32A32_FLOAT",
"srvFormat": "DXGI_FORMAT_R32G32B32A32_FLOAT",
"rtvFormat": "DXGI_FORMAT_R32G32B32A32_FLOAT"
}
},
"GL_UNSIGNED_INT": {
"8": {
"texFormat": "DXGI_FORMAT_R8G8B8A8_UINT",
"srvFormat": "DXGI_FORMAT_R8G8B8A8_UINT",
"rtvFormat": "DXGI_FORMAT_R8G8B8A8_UINT"
},
"16": {
"texFormat": "DXGI_FORMAT_R16G16B16A16_UINT",
"srvFormat": "DXGI_FORMAT_R16G16B16A16_UINT",
"rtvFormat": "DXGI_FORMAT_R16G16B16A16_UINT"
},
"32": {
"texFormat": "DXGI_FORMAT_R32G32B32A32_UINT",
"srvFormat": "DXGI_FORMAT_R32G32B32A32_UINT",
"rtvFormat": "DXGI_FORMAT_R32G32B32A32_UINT"
}
},
"GL_INT": {
"8": {
"texFormat": "DXGI_FORMAT_R8G8B8A8_SINT",
"srvFormat": "DXGI_FORMAT_R8G8B8A8_SINT",
"rtvFormat": "DXGI_FORMAT_R8G8B8A8_SINT"
},
"16": {
"texFormat": "DXGI_FORMAT_R16G16B16A16_SINT",
"srvFormat": "DXGI_FORMAT_R16G16B16A16_SINT",
"rtvFormat": "DXGI_FORMAT_R16G16B16A16_SINT"
},
"32": {
"texFormat": "DXGI_FORMAT_R32G32B32A32_SINT",
"srvFormat": "DXGI_FORMAT_R32G32B32A32_SINT",
"rtvFormat": "DXGI_FORMAT_R32G32B32A32_SINT"
}
}
}
\ No newline at end of file
//
// Copyright 2015 The ANGLE Project Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//
// swizzle_format_info:
// Provides information for swizzle format and a map from type->formatinfo
//
#ifndef LIBANGLE_RENDERER_D3D_D3D11_SWIZZLEFORMATINFO_H_
#define LIBANGLE_RENDERER_D3D_D3D11_SWIZZLEFORMATINFO_H_
#include <GLES2/gl2.h>
#include <map>
#include "common/platform.h"
namespace rx
{
namespace d3d11
{
struct SwizzleSizeType
{
size_t maxComponentSize;
GLenum componentType;
SwizzleSizeType();
SwizzleSizeType(size_t maxComponentSize, GLenum componentType);
bool operator<(const SwizzleSizeType &other) const;
};
struct SwizzleFormatInfo
{
DXGI_FORMAT mTexFormat;
DXGI_FORMAT mSRVFormat;
DXGI_FORMAT mRTVFormat;
SwizzleFormatInfo();
SwizzleFormatInfo(DXGI_FORMAT texFormat, DXGI_FORMAT srvFormat, DXGI_FORMAT rtvFormat);
};
const SwizzleFormatInfo &GetSwizzleFormatInfo(GLuint maxBits, GLenum componentType);
} // namespace d3d11
} // namespace rx
#endif // LIBANGLE_RENDERER_D3D_D3D11_SWIZZLEFORMATINFO_H_
// GENERATED FILE - DO NOT EDIT
// Generated by gen_swizzle_format_table.py using data from swizzle_format_data.json
//
// Copyright 2015 The ANGLE Project Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//
// swizzle_format_info:
// Provides information for swizzle format and a map from type->formatinfo
//
#include "libANGLE/renderer/d3d/d3d11/swizzle_format_info.h"
#include <GLES3/gl3.h>
namespace rx
{
namespace d3d11
{
SwizzleSizeType::SwizzleSizeType() : maxComponentSize(0), componentType(GL_NONE)
{
}
SwizzleSizeType::SwizzleSizeType(size_t maxComponentSize, GLenum componentType)
: maxComponentSize(maxComponentSize), componentType(componentType)
{
}
bool SwizzleSizeType::operator<(const SwizzleSizeType &other) const
{
return (maxComponentSize != other.maxComponentSize)
? (maxComponentSize < other.maxComponentSize)
: (componentType < other.componentType);
}
SwizzleFormatInfo::SwizzleFormatInfo()
: mTexFormat(DXGI_FORMAT_UNKNOWN),
mSRVFormat(DXGI_FORMAT_UNKNOWN),
mRTVFormat(DXGI_FORMAT_UNKNOWN)
{
}
SwizzleFormatInfo::SwizzleFormatInfo(DXGI_FORMAT texFormat,
DXGI_FORMAT srvFormat,
DXGI_FORMAT rtvFormat)
: mTexFormat(texFormat), mSRVFormat(srvFormat), mRTVFormat(rtvFormat)
{
}
const SwizzleFormatInfo &GetSwizzleFormatInfo(GLuint maxBits, GLenum componentType)
{
// clang-format off
switch (componentType)
{
case GL_FLOAT:
{
switch (maxBits)
{
case 16:
{
static const SwizzleFormatInfo formatInfo(DXGI_FORMAT_R16G16B16A16_FLOAT,
DXGI_FORMAT_R16G16B16A16_FLOAT,
DXGI_FORMAT_R16G16B16A16_FLOAT);
return formatInfo;
}
case 32:
{
static const SwizzleFormatInfo formatInfo(DXGI_FORMAT_R32G32B32A32_FLOAT,
DXGI_FORMAT_R32G32B32A32_FLOAT,
DXGI_FORMAT_R32G32B32A32_FLOAT);
return formatInfo;
}
default:
break;
}
}
case GL_INT:
{
switch (maxBits)
{
case 16:
{
static const SwizzleFormatInfo formatInfo(DXGI_FORMAT_R16G16B16A16_SINT,
DXGI_FORMAT_R16G16B16A16_SINT,
DXGI_FORMAT_R16G16B16A16_SINT);
return formatInfo;
}
case 32:
{
static const SwizzleFormatInfo formatInfo(DXGI_FORMAT_R32G32B32A32_SINT,
DXGI_FORMAT_R32G32B32A32_SINT,
DXGI_FORMAT_R32G32B32A32_SINT);
return formatInfo;
}
case 8:
{
static const SwizzleFormatInfo formatInfo(DXGI_FORMAT_R8G8B8A8_SINT,
DXGI_FORMAT_R8G8B8A8_SINT,
DXGI_FORMAT_R8G8B8A8_SINT);
return formatInfo;
}
default:
break;
}
}
case GL_SIGNED_NORMALIZED:
{
switch (maxBits)
{
case 8:
{
static const SwizzleFormatInfo formatInfo(DXGI_FORMAT_R8G8B8A8_SNORM,
DXGI_FORMAT_R8G8B8A8_SNORM,
DXGI_FORMAT_R8G8B8A8_SNORM);
return formatInfo;
}
default:
break;
}
}
case GL_UNSIGNED_INT:
{
switch (maxBits)
{
case 16:
{
static const SwizzleFormatInfo formatInfo(DXGI_FORMAT_R16G16B16A16_UINT,
DXGI_FORMAT_R16G16B16A16_UINT,
DXGI_FORMAT_R16G16B16A16_UINT);
return formatInfo;
}
case 32:
{
static const SwizzleFormatInfo formatInfo(DXGI_FORMAT_R32G32B32A32_UINT,
DXGI_FORMAT_R32G32B32A32_UINT,
DXGI_FORMAT_R32G32B32A32_UINT);
return formatInfo;
}
case 8:
{
static const SwizzleFormatInfo formatInfo(DXGI_FORMAT_R8G8B8A8_UINT,
DXGI_FORMAT_R8G8B8A8_UINT,
DXGI_FORMAT_R8G8B8A8_UINT);
return formatInfo;
}
default:
break;
}
}
case GL_UNSIGNED_NORMALIZED:
{
switch (maxBits)
{
case 16:
{
static const SwizzleFormatInfo formatInfo(DXGI_FORMAT_R16G16B16A16_UNORM,
DXGI_FORMAT_R16G16B16A16_UNORM,
DXGI_FORMAT_R16G16B16A16_UNORM);
return formatInfo;
}
case 24:
{
static const SwizzleFormatInfo formatInfo(DXGI_FORMAT_R32G32B32A32_FLOAT,
DXGI_FORMAT_R32G32B32A32_FLOAT,
DXGI_FORMAT_R32G32B32A32_FLOAT);
return formatInfo;
}
case 32:
{
static const SwizzleFormatInfo formatInfo(DXGI_FORMAT_R32G32B32A32_FLOAT,
DXGI_FORMAT_R32G32B32A32_FLOAT,
DXGI_FORMAT_R32G32B32A32_FLOAT);
return formatInfo;
}
case 8:
{
static const SwizzleFormatInfo formatInfo(DXGI_FORMAT_R8G8B8A8_UNORM,
DXGI_FORMAT_R8G8B8A8_UNORM,
DXGI_FORMAT_R8G8B8A8_UNORM);
return formatInfo;
}
default:
break;
}
}
default:
{
static const SwizzleFormatInfo defaultInfo(DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_UNKNOWN,
DXGI_FORMAT_UNKNOWN);
return defaultInfo;
}
}
// clang-format on
} // GetSwizzleFormatInfo
} // namespace d3d11
} // namespace rx
......@@ -35,30 +35,33 @@ struct LoadImageFunctionInfo
bool requiresConversion;
};
struct DXGIFormatSet
struct ANGLEFormatSet
{
DXGIFormatSet();
DXGIFormatSet(DXGI_FORMAT texFormat,
DXGI_FORMAT srvFormat,
DXGI_FORMAT rtvFormat,
DXGI_FORMAT dsvFormat);
DXGIFormatSet(const DXGIFormatSet &) = default;
DXGIFormatSet &operator=(const DXGIFormatSet &) = default;
ANGLEFormatSet();
ANGLEFormatSet(DXGI_FORMAT texFormat,
DXGI_FORMAT srvFormat,
DXGI_FORMAT rtvFormat,
DXGI_FORMAT dsvFormat,
ANGLEFormat swizzleFormat);
ANGLEFormatSet(const ANGLEFormatSet &) = default;
ANGLEFormatSet &operator=(const ANGLEFormatSet &) = default;
DXGI_FORMAT texFormat;
DXGI_FORMAT srvFormat;
DXGI_FORMAT rtvFormat;
DXGI_FORMAT dsvFormat;
ANGLEFormat swizzleFormat;
};
struct TextureFormat : public angle::NonCopyable
{
TextureFormat(GLenum internalFormat,
const DXGIFormatSet &formatSet,
const ANGLEFormatSet &formatSet,
InitializeTextureDataFunction internalFormatInitializer);
DXGIFormatSet formatSet;
DXGIFormatSet swizzleFormatSet;
ANGLEFormatSet formatSet;
ANGLEFormatSet swizzleFormatSet;
InitializeTextureDataFunction dataInitializerFunction;
typedef std::map<GLenum, LoadImageFunctionInfo> LoadFunctionMap;
......@@ -66,7 +69,7 @@ struct TextureFormat : public angle::NonCopyable
LoadFunctionMap loadFunctions;
};
const DXGIFormatSet &GetANGLEFormatSet(ANGLEFormat angleFormat);
const ANGLEFormatSet &GetANGLEFormatSet(ANGLEFormat angleFormat);
const TextureFormat &GetTextureFormatInfo(GLenum internalformat,
const Renderer11DeviceCaps &renderer11DeviceCaps);
......
......@@ -35,6 +35,7 @@ enum ANGLEFormat
ANGLE_FORMAT_R16G16B16A16_FLOAT,
ANGLE_FORMAT_R16G16B16A16_SINT,
ANGLE_FORMAT_R16G16B16A16_UINT,
ANGLE_FORMAT_R16G16B16A16_UNORM,
ANGLE_FORMAT_R16G16_FLOAT,
ANGLE_FORMAT_R16G16_SINT,
ANGLE_FORMAT_R16G16_UINT,
......
......@@ -380,8 +380,6 @@
'libANGLE/renderer/d3d/d3d11/StateManager11.h',
'libANGLE/renderer/d3d/d3d11/SwapChain11.cpp',
'libANGLE/renderer/d3d/d3d11/SwapChain11.h',
'libANGLE/renderer/d3d/d3d11/swizzle_format_info.h',
'libANGLE/renderer/d3d/d3d11/swizzle_format_info_autogen.cpp',
'libANGLE/renderer/d3d/d3d11/TextureStorage11.cpp',
'libANGLE/renderer/d3d/d3d11/TextureStorage11.h',
'libANGLE/renderer/d3d/d3d11/Trim11.cpp',
......
......@@ -230,6 +230,13 @@ TEST_P(SwizzleTest, R8_2D)
runTest2D();
}
TEST_P(SwizzleTest, RGB10_A2_2D)
{
GLuint data[] = {20u | (40u << 10) | (60u << 20) | (2u << 30)};
init2DTexture(GL_RGB10_A2, GL_RGBA, GL_UNSIGNED_INT_2_10_10_10_REV, data);
runTest2D();
}
TEST_P(SwizzleTest, RGBA32F_2D)
{
GLfloat data[] = { 0.25f, 0.5f, 0.75f, 0.8f };
......
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