Commit 85919ef7 by Le Hoang Quyen Committed by Commit Bot

Metal: autogen format caps from json

Bug: angleproject:4940 Bug: angleproject:2634 Change-Id: I1e107e856a50a7eaf685296dd7464af9ad5bcec4 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/2342522 Commit-Queue: Jamie Madill <jmadill@chromium.org> Reviewed-by: 's avatarJonah Ryan-Davis <jonahr@google.com> Reviewed-by: 's avatarJamie Madill <jmadill@chromium.org>
parent 594e0e14
...@@ -4,9 +4,9 @@ ...@@ -4,9 +4,9 @@
"src/libANGLE/renderer/angle_format_map.json": "src/libANGLE/renderer/angle_format_map.json":
"aa4a0d3463b76858a75787b9cdec8e98", "aa4a0d3463b76858a75787b9cdec8e98",
"src/libANGLE/renderer/metal/gen_mtl_format_table.py": "src/libANGLE/renderer/metal/gen_mtl_format_table.py":
"27769e4e9cce3b7af18b69d41351c3ed", "91579339b484425ef81b0e900a5c04ed",
"src/libANGLE/renderer/metal/mtl_format_map.json": "src/libANGLE/renderer/metal/mtl_format_map.json":
"b202d7a0349006e2bbd58c603d9cdc28", "b4f515e08814b5a0f148a049139d8392",
"src/libANGLE/renderer/metal/mtl_format_table_autogen.mm": "src/libANGLE/renderer/metal/mtl_format_table_autogen.mm":
"7a0ee6139ca1e7ec8b8b0a7de9180ef7" "6a8cdb5d09a6ba1521fe9dab3b887451"
} }
\ No newline at end of file
...@@ -69,6 +69,21 @@ void VertexFormat::init(angle::FormatID angleFormatId, bool tightlyPacked) ...@@ -69,6 +69,21 @@ void VertexFormat::init(angle::FormatID angleFormatId, bool tightlyPacked)
}} }}
}} }}
void FormatTable::initNativeFormatCapsAutogen(const DisplayMtl *display)
{{
const angle::FeaturesMtl &featuresMtl = display->getFeatures();
// Skip auto resolve if either hasDepth/StencilAutoResolve or allowMultisampleStoreAndResolve
// feature are disabled.
bool supportDepthAutoResolve = featuresMtl.hasDepthAutoResolve.enabled &&
featuresMtl.allowMultisampleStoreAndResolve.enabled;
bool supportStencilAutoResolve = featuresMtl.hasStencilAutoResolve.enabled &&
featuresMtl.allowMultisampleStoreAndResolve.enabled;
bool supportDepthStencilAutoResolve = supportDepthAutoResolve && supportStencilAutoResolve;
// Source: https://developer.apple.com/metal/Metal-Feature-Set-Tables.pdf
{metal_format_caps}
}}
}} // namespace mtl }} // namespace mtl
}} // namespace rx }} // namespace rx
""" """
...@@ -408,6 +423,46 @@ def gen_vertex_map_switch_string(vertex_table): ...@@ -408,6 +423,46 @@ def gen_vertex_map_switch_string(vertex_table):
return switch_data return switch_data
def gen_mtl_format_caps_init_string(map_image):
caps = map_image['caps']
mac_caps = map_image['caps_mac']
ios_caps = map_image['caps_ios']
caps_init_str = ''
def cap_to_param(caps, key):
return '/** ' + key + '*/ ' + caps.get(key, 'false')
def caps_to_cpp(caps_table):
init_str = ''
for mtl_format in sorted(caps_table.keys()):
caps = caps_table[mtl_format]
filterable = cap_to_param(caps, 'filterable')
writable = cap_to_param(caps, 'writable')
colorRenderable = cap_to_param(caps, 'colorRenderable')
depthRenderable = cap_to_param(caps, 'depthRenderable')
blendable = cap_to_param(caps, 'blendable')
multisample = cap_to_param(caps, 'multisample')
resolve = cap_to_param(caps, 'resolve')
init_str += " setFormatCaps({0}, {1}, {2}, {3}, {4}, {5}, {6}, {7});\n\n".format(
mtl_format, filterable, writable, blendable, multisample, resolve, colorRenderable,
depthRenderable)
return init_str
caps_init_str += caps_to_cpp(caps)
caps_init_str += "#if TARGET_OS_OSX || TARGET_OS_MACCATALYST\n"
caps_init_str += caps_to_cpp(mac_caps)
caps_init_str += "#elif TARGET_OS_IOS || TARGET_OS_TV // TARGET_OS_OSX || TARGET_OS_MACCATALYST\n"
caps_init_str += caps_to_cpp(ios_caps)
caps_init_str += "#endif // TARGET_OS_OSX || TARGET_OS_MACCATALYST\n"
return caps_init_str
def main(): def main():
data_source_name = 'mtl_format_map.json' data_source_name = 'mtl_format_map.json'
# auto_script parameters. # auto_script parameters.
...@@ -434,12 +489,15 @@ def main(): ...@@ -434,12 +489,15 @@ def main():
vertex_switch_data = gen_vertex_map_switch_string(map_vertex) vertex_switch_data = gen_vertex_map_switch_string(map_vertex)
caps_init_str = gen_mtl_format_caps_init_string(map_image)
output_cpp = template_autogen_inl.format( output_cpp = template_autogen_inl.format(
script_name=sys.argv[0], script_name=sys.argv[0],
copyright_year=date.today().year, copyright_year=date.today().year,
data_source_name=data_source_name, data_source_name=data_source_name,
angle_image_format_switch=image_switch_data, angle_image_format_switch=image_switch_data,
angle_vertex_format_switch=vertex_switch_data) angle_vertex_format_switch=vertex_switch_data,
metal_format_caps=caps_init_str)
with open('mtl_format_table_autogen.mm', 'wt') as out_file: with open('mtl_format_table_autogen.mm', 'wt') as out_file:
out_file.write(output_cpp) out_file.write(output_cpp)
out_file.close() out_file.close()
......
{ {
"description": [
"Copyright 2019 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.",
"",
"mtl_format_map.json: Format mapping between OpenGL and Metal.",
"",
"Also see gen_mtl_format_table.py for the code generation step."
],
"image": { "image": {
"description": [
"- The image's map is a dictionary where the key of each entry is the",
"ANGLE format ID, and the value is the Metal format enum. Note some formats",
"are missing from the map, these formats are either unsupported or emulated",
"on Metal.",
"map_mac is Mac specific mapping, similarly map_ios is iOS specific mapping.",
"",
"- override is emulation of unsupported formats on Metal by converting them to",
"supported formats. For example, converting R8G8B8 to R8G8B8A8",
"override_mac & override_ios are platform specific emulations.",
"",
"- d24s8_fallbacks_mac is Mac specific emulation when native Metal device doesn't",
"support D24_UNORM_S8_UINT format.",
"",
"- caps is a table containing native Metal format's specific capabilities such as",
"supporting filtering, blending and so on. Unlike the above tables, this table's keys",
"are Metal native format enums. This table's source is",
"https://developer.apple.com/metal/Metal-Feature-Set-Tables.pdf",
"Platform specific tables are caps_mac & caps_ios."
],
"map": { "map": {
"NONE": "MTLPixelFormatInvalid", "NONE": "MTLPixelFormatInvalid",
"A8_UNORM": "MTLPixelFormatA8Unorm", "A8_UNORM": "MTLPixelFormatA8Unorm",
...@@ -144,9 +173,461 @@ ...@@ -144,9 +173,461 @@
}, },
"d24s8_fallbacks_mac": { "d24s8_fallbacks_mac": {
"D24_UNORM_S8_UINT": "D32_FLOAT_S8X24_UINT" "D24_UNORM_S8_UINT": "D32_FLOAT_S8X24_UINT"
},
"caps": {
"MTLPixelFormatA8Unorm":{
"filterable": "true",
"writable": "false",
"blendable": "false",
"multisample": "false",
"resolve": "false",
"colorRenderable": "false"
},
"MTLPixelFormatR8Unorm":{
"filterable": "true",
"writable": "true",
"blendable": "true",
"multisample": "true",
"resolve": "true",
"colorRenderable": "true"
},
"MTLPixelFormatR8Snorm":{
"filterable": "true",
"writable": "true",
"blendable": "true",
"multisample": "true",
"resolve": "display->supportsEitherGPUFamily(2, 1)",
"colorRenderable": "true"
},
"MTLPixelFormatR16Unorm":{
"filterable": "true",
"writable": "true",
"blendable": "true",
"multisample": "true",
"resolve": "display->supportsMacGPUFamily(1)",
"colorRenderable": "true"
},
"MTLPixelFormatR16Snorm":{
"filterable": "true",
"writable": "true",
"blendable": "true",
"multisample": "true",
"resolve": "display->supportsMacGPUFamily(1)",
"colorRenderable": "true"
},
"MTLPixelFormatRG8Unorm":{
"filterable": "true",
"writable": "true",
"blendable": "true",
"multisample": "true",
"resolve": "true",
"colorRenderable": "true"
},
"MTLPixelFormatRG8Snorm":{
"filterable": "true",
"writable": "true",
"blendable": "true",
"multisample": "true",
"resolve": "display->supportsEitherGPUFamily(2, 1)",
"colorRenderable": "true"
},
"MTLPixelFormatRG16Unorm":{
"filterable": "true",
"writable": "true",
"blendable": "true",
"multisample": "true",
"resolve": "display->supportsMacGPUFamily(1)",
"colorRenderable": "true"
},
"MTLPixelFormatRG16Snorm":{
"filterable": "true",
"writable": "true",
"blendable": "true",
"multisample": "true",
"resolve": "display->supportsMacGPUFamily(1)",
"colorRenderable": "true"
},
"MTLPixelFormatRGBA16Unorm":{
"filterable": "true",
"writable": "true",
"blendable": "true",
"multisample": "true",
"resolve": "display->supportsMacGPUFamily(1)",
"colorRenderable": "true"
},
"MTLPixelFormatRGBA16Snorm":{
"filterable": "true",
"writable": "true",
"blendable": "true",
"multisample": "true",
"resolve": "display->supportsMacGPUFamily(1)",
"colorRenderable": "true"
},
"MTLPixelFormatRGBA16Float":{
"filterable": "true",
"writable": "true",
"blendable": "true",
"multisample": "true",
"resolve": "true",
"colorRenderable": "true"
},
"MTLPixelFormatRGBA8Unorm":{
"filterable": "true",
"writable": "true",
"blendable": "true",
"multisample": "true",
"resolve": "true",
"colorRenderable": "true"
},
"MTLPixelFormatRGBA8Unorm_sRGB":{
"filterable": "true",
"writable": "display->supportsIOSGPUFamily(2)",
"blendable": "true",
"multisample": "true",
"resolve": "true",
"colorRenderable": "true"
},
"MTLPixelFormatRGBA8Snorm":{
"filterable": "true",
"writable": "true",
"blendable": "true",
"multisample": "true",
"resolve": "display->supportsEitherGPUFamily(2, 1)",
"colorRenderable": "true"
},
"MTLPixelFormatBGRA8Unorm":{
"filterable": "true",
"writable": "true",
"blendable": "true",
"multisample": "true",
"resolve": "true",
"colorRenderable": "true"
},
"MTLPixelFormatBGRA8Unorm_sRGB":{
"filterable": "true",
"writable": "display->supportsIOSGPUFamily(2)",
"blendable": "true",
"multisample": "true",
"resolve": "true",
"colorRenderable": "true"
},
"MTLPixelFormatR16Float":{
"filterable": "true",
"writable": "true",
"blendable": "true",
"multisample": "true",
"resolve": "true",
"colorRenderable": "true"
},
"MTLPixelFormatRG16Float":{
"filterable": "true",
"writable": "true",
"blendable": "true",
"multisample": "true",
"resolve": "true",
"colorRenderable": "true"
},
"MTLPixelFormatR32Float":{
"filterable": "display->supportsMacGPUFamily(1)",
"writable": "true",
"blendable": "true",
"multisample": "true",
"resolve": "display->supportsMacGPUFamily(1)",
"colorRenderable": "true"
},
"MTLPixelFormatBGR10A2Unorm":{
"filterable": "true",
"writable": "display->supportsEitherGPUFamily(3, 1)",
"blendable": "true",
"multisample": "true",
"resolve": "true",
"colorRenderable": "true"
},
"MTLPixelFormatRGB10A2Unorm":{
"filterable": "true",
"writable": "display->supportsEitherGPUFamily(3, 1)",
"blendable": "true",
"multisample": "true",
"resolve": "true",
"colorRenderable": "true"
},
"MTLPixelFormatRGB10A2Uint":{
"filterable": "false",
"writable": "display->supportsEitherGPUFamily(3, 1)",
"blendable": "false",
"multisample": "true",
"resolve": "false",
"colorRenderable": "true"
},
"MTLPixelFormatRG11B10Float":{
"filterable": "true",
"writable": "display->supportsEitherGPUFamily(3, 1)",
"blendable": "true",
"multisample": "true",
"resolve": "true",
"colorRenderable": "true"
},
"MTLPixelFormatRGB9E5Float":{
"filterable": "true",
"writable": "display->supportsIOSGPUFamily(3)",
"blendable": "display->supportsIOSGPUFamily(1)",
"multisample": "display->supportsIOSGPUFamily(1)",
"resolve": "display->supportsIOSGPUFamily(1)",
"colorRenderable": "display->supportsIOSGPUFamily(1)"
},
"MTLPixelFormatR8Uint":{
"filterable": "false",
"writable": "true",
"blendable": "false",
"multisample": "true",
"resolve": "false",
"colorRenderable": "true"
},
"MTLPixelFormatR8Sint":{
"filterable": "false",
"writable": "true",
"blendable": "false",
"multisample": "true",
"resolve": "false",
"colorRenderable": "true"
},
"MTLPixelFormatR16Uint":{
"filterable": "false",
"writable": "true",
"blendable": "false",
"multisample": "true",
"resolve": "false",
"colorRenderable": "true"
},
"MTLPixelFormatR16Sint":{
"filterable": "false",
"writable": "true",
"blendable": "false",
"multisample": "true",
"resolve": "false",
"colorRenderable": "true"
},
"MTLPixelFormatRG8Uint":{
"filterable": "false",
"writable": "true",
"blendable": "false",
"multisample": "true",
"resolve": "false",
"colorRenderable": "true"
},
"MTLPixelFormatRG8Sint":{
"filterable": "false",
"writable": "true",
"blendable": "false",
"multisample": "true",
"resolve": "false",
"colorRenderable": "true"
},
"MTLPixelFormatR32Uint":{
"filterable": "false",
"writable": "true",
"blendable": "false",
"multisample": "display->supportsMacGPUFamily(1)",
"resolve": "false",
"colorRenderable": "true"
},
"MTLPixelFormatR32Sint":{
"filterable": "false",
"writable": "true",
"blendable": "false",
"multisample": "display->supportsMacGPUFamily(1)",
"resolve": "false",
"colorRenderable": "true"
},
"MTLPixelFormatRG16Uint":{
"filterable": "false",
"writable": "true",
"blendable": "false",
"multisample": "true",
"resolve": "false",
"colorRenderable": "true"
},
"MTLPixelFormatRG16Sint":{
"filterable": "false",
"writable": "true",
"blendable": "false",
"multisample": "true",
"resolve": "false",
"colorRenderable": "true"
},
"MTLPixelFormatRGBA8Uint":{
"filterable": "false",
"writable": "true",
"blendable": "false",
"multisample": "true",
"resolve": "false",
"colorRenderable": "true"
},
"MTLPixelFormatRGBA8Sint":{
"filterable": "false",
"writable": "true",
"blendable": "false",
"multisample": "true",
"resolve": "false",
"colorRenderable": "true"
},
"MTLPixelFormatRG32Uint":{
"filterable": "false",
"writable": "true",
"blendable": "false",
"multisample": "display->supportsMacGPUFamily(1)",
"resolve": "false",
"colorRenderable": "true"
},
"MTLPixelFormatRG32Sint":{
"filterable": "false",
"writable": "true",
"blendable": "false",
"multisample": "display->supportsMacGPUFamily(1)",
"resolve": "false",
"colorRenderable": "true"
},
"MTLPixelFormatRGBA16Uint":{
"filterable": "false",
"writable": "true",
"blendable": "false",
"multisample": "true",
"resolve": "false",
"colorRenderable": "true"
},
"MTLPixelFormatRGBA16Sint":{
"filterable": "false",
"writable": "true",
"blendable": "false",
"multisample": "true",
"resolve": "false",
"colorRenderable": "true"
},
"MTLPixelFormatRGBA32Uint":{
"filterable": "false",
"writable": "true",
"blendable": "false",
"multisample": "display->supportsMacGPUFamily(1)",
"resolve": "false",
"colorRenderable": "true"
},
"MTLPixelFormatRGBA32Sint":{
"filterable": "false",
"writable": "true",
"blendable": "false",
"multisample": "display->supportsMacGPUFamily(1)",
"resolve": "false",
"colorRenderable": "true"
},
"MTLPixelFormatRG32Float":{
"filterable": "display->supportsMacGPUFamily(1)",
"writable": "true",
"blendable": "true",
"multisample": "display->supportsMacGPUFamily(1)",
"resolve": "display->supportsMacGPUFamily(1)",
"colorRenderable": "true"
},
"MTLPixelFormatRGBA32Float":{
"filterable": "display->supportsMacGPUFamily(1)",
"writable": "true",
"blendable": "display->supportsMacGPUFamily(1)",
"multisample": "display->supportsMacGPUFamily(1)",
"resolve": "display->supportsMacGPUFamily(1)",
"colorRenderable": "true"
},
"MTLPixelFormatDepth32Float":{
"filterable": "display->supportsMacGPUFamily(1)",
"writable": "false",
"blendable": "false",
"multisample": "true",
"resolve": "supportDepthAutoResolve",
"colorRenderable": "false",
"depthRenderable": "true"
},
"MTLPixelFormatStencil8":{
"filterable": "false",
"writable": "false",
"blendable": "false",
"multisample": "true",
"resolve": "false",
"colorRenderable": "false",
"depthRenderable": "true"
},
"MTLPixelFormatDepth32Float_Stencil8":{
"filterable": "display->supportsMacGPUFamily(1)",
"writable": "false",
"blendable": "false",
"multisample": "true",
"resolve": "supportDepthStencilAutoResolve",
"colorRenderable": "false",
"depthRenderable": "true"
}
},
"caps_mac": {
"MTLPixelFormatDepth16Unorm":{
"filterable": "true",
"writable": "false",
"blendable": "false",
"multisample": "true",
"resolve": "supportDepthAutoResolve",
"colorRenderable": "false",
"depthRenderable": "true"
},
"MTLPixelFormatDepth24Unorm_Stencil8":{
"filterable": "display->supportsMacGPUFamily(1)",
"writable": "false",
"blendable": "false",
"multisample": "true",
"resolve": "supportDepthStencilAutoResolve",
"colorRenderable": "false",
"depthRenderable": "display->supportsMacGPUFamily(1)"
}
},
"caps_ios": {
"MTLPixelFormatB5G6R5Unorm":{
"filterable": "true",
"writable": "false",
"blendable": "true",
"multisample": "true",
"resolve": "true",
"colorRenderable": "true"
},
"MTLPixelFormatABGR4Unorm":{
"filterable": "true",
"writable": "false",
"blendable": "true",
"multisample": "true",
"resolve": "true",
"colorRenderable": "true"
},
"MTLPixelFormatBGR5A1Unorm":{
"filterable": "true",
"writable": "false",
"blendable": "true",
"multisample": "true",
"resolve": "true",
"colorRenderable": "true"
},
"MTLPixelFormatA1BGR5Unorm":{
"filterable": "true",
"writable": "false",
"blendable": "true",
"multisample": "true",
"resolve": "true",
"colorRenderable": "true"
}
} }
}, },
"vertex": { "vertex": {
"description": [
"- This section contains vertex format mapping between OpenGL and Metal similar to",
"image formats above",
"- override_tightly_packed is special emulation for those formats whose sizes",
"are not multiples of 4 bytes. They will be converted to appropriate 4 bytes aligned",
"formats.",
"This emulation is useful for the cases in which the stride of a vertex attribute",
"is required to be multiples of 4."
],
"map": { "map": {
"NONE": "MTLVertexFormatInvalid", "NONE": "MTLVertexFormatInvalid",
"R8_UNORM": "MTLVertexFormatUCharNormalized", "R8_UNORM": "MTLVertexFormatUCharNormalized",
......
...@@ -2308,5 +2308,268 @@ void VertexFormat::init(angle::FormatID angleFormatId, bool tightlyPacked) ...@@ -2308,5 +2308,268 @@ void VertexFormat::init(angle::FormatID angleFormatId, bool tightlyPacked)
} }
} }
void FormatTable::initNativeFormatCapsAutogen(const DisplayMtl *display)
{
const angle::FeaturesMtl &featuresMtl = display->getFeatures();
// Skip auto resolve if either hasDepth/StencilAutoResolve or allowMultisampleStoreAndResolve
// feature are disabled.
bool supportDepthAutoResolve = featuresMtl.hasDepthAutoResolve.enabled &&
featuresMtl.allowMultisampleStoreAndResolve.enabled;
bool supportStencilAutoResolve = featuresMtl.hasStencilAutoResolve.enabled &&
featuresMtl.allowMultisampleStoreAndResolve.enabled;
bool supportDepthStencilAutoResolve = supportDepthAutoResolve && supportStencilAutoResolve;
// Source: https://developer.apple.com/metal/Metal-Feature-Set-Tables.pdf
setFormatCaps(MTLPixelFormatA8Unorm, /** filterable*/ true, /** writable*/ false,
/** blendable*/ false, /** multisample*/ false, /** resolve*/ false,
/** colorRenderable*/ false, /** depthRenderable*/ false);
setFormatCaps(MTLPixelFormatBGR10A2Unorm, /** filterable*/ true,
/** writable*/ display->supportsEitherGPUFamily(3, 1), /** blendable*/ true,
/** multisample*/ true, /** resolve*/ true, /** colorRenderable*/ true,
/** depthRenderable*/ false);
setFormatCaps(MTLPixelFormatBGRA8Unorm, /** filterable*/ true, /** writable*/ true,
/** blendable*/ true, /** multisample*/ true, /** resolve*/ true,
/** colorRenderable*/ true, /** depthRenderable*/ false);
setFormatCaps(MTLPixelFormatBGRA8Unorm_sRGB, /** filterable*/ true,
/** writable*/ display->supportsIOSGPUFamily(2), /** blendable*/ true,
/** multisample*/ true, /** resolve*/ true, /** colorRenderable*/ true,
/** depthRenderable*/ false);
setFormatCaps(MTLPixelFormatDepth32Float, /** filterable*/ display->supportsMacGPUFamily(1),
/** writable*/ false, /** blendable*/ false, /** multisample*/ true,
/** resolve*/ supportDepthAutoResolve, /** colorRenderable*/ false,
/** depthRenderable*/ true);
setFormatCaps(MTLPixelFormatDepth32Float_Stencil8,
/** filterable*/ display->supportsMacGPUFamily(1), /** writable*/ false,
/** blendable*/ false, /** multisample*/ true,
/** resolve*/ supportDepthStencilAutoResolve, /** colorRenderable*/ false,
/** depthRenderable*/ true);
setFormatCaps(MTLPixelFormatR16Float, /** filterable*/ true, /** writable*/ true,
/** blendable*/ true, /** multisample*/ true, /** resolve*/ true,
/** colorRenderable*/ true, /** depthRenderable*/ false);
setFormatCaps(MTLPixelFormatR16Sint, /** filterable*/ false, /** writable*/ true,
/** blendable*/ false, /** multisample*/ true, /** resolve*/ false,
/** colorRenderable*/ true, /** depthRenderable*/ false);
setFormatCaps(MTLPixelFormatR16Snorm, /** filterable*/ true, /** writable*/ true,
/** blendable*/ true, /** multisample*/ true,
/** resolve*/ display->supportsMacGPUFamily(1), /** colorRenderable*/ true,
/** depthRenderable*/ false);
setFormatCaps(MTLPixelFormatR16Uint, /** filterable*/ false, /** writable*/ true,
/** blendable*/ false, /** multisample*/ true, /** resolve*/ false,
/** colorRenderable*/ true, /** depthRenderable*/ false);
setFormatCaps(MTLPixelFormatR16Unorm, /** filterable*/ true, /** writable*/ true,
/** blendable*/ true, /** multisample*/ true,
/** resolve*/ display->supportsMacGPUFamily(1), /** colorRenderable*/ true,
/** depthRenderable*/ false);
setFormatCaps(MTLPixelFormatR32Float, /** filterable*/ display->supportsMacGPUFamily(1),
/** writable*/ true, /** blendable*/ true, /** multisample*/ true,
/** resolve*/ display->supportsMacGPUFamily(1), /** colorRenderable*/ true,
/** depthRenderable*/ false);
setFormatCaps(MTLPixelFormatR32Sint, /** filterable*/ false, /** writable*/ true,
/** blendable*/ false, /** multisample*/ display->supportsMacGPUFamily(1),
/** resolve*/ false, /** colorRenderable*/ true, /** depthRenderable*/ false);
setFormatCaps(MTLPixelFormatR32Uint, /** filterable*/ false, /** writable*/ true,
/** blendable*/ false, /** multisample*/ display->supportsMacGPUFamily(1),
/** resolve*/ false, /** colorRenderable*/ true, /** depthRenderable*/ false);
setFormatCaps(MTLPixelFormatR8Sint, /** filterable*/ false, /** writable*/ true,
/** blendable*/ false, /** multisample*/ true, /** resolve*/ false,
/** colorRenderable*/ true, /** depthRenderable*/ false);
setFormatCaps(MTLPixelFormatR8Snorm, /** filterable*/ true, /** writable*/ true,
/** blendable*/ true, /** multisample*/ true,
/** resolve*/ display->supportsEitherGPUFamily(2, 1), /** colorRenderable*/ true,
/** depthRenderable*/ false);
setFormatCaps(MTLPixelFormatR8Uint, /** filterable*/ false, /** writable*/ true,
/** blendable*/ false, /** multisample*/ true, /** resolve*/ false,
/** colorRenderable*/ true, /** depthRenderable*/ false);
setFormatCaps(MTLPixelFormatR8Unorm, /** filterable*/ true, /** writable*/ true,
/** blendable*/ true, /** multisample*/ true, /** resolve*/ true,
/** colorRenderable*/ true, /** depthRenderable*/ false);
setFormatCaps(MTLPixelFormatRG11B10Float, /** filterable*/ true,
/** writable*/ display->supportsEitherGPUFamily(3, 1), /** blendable*/ true,
/** multisample*/ true, /** resolve*/ true, /** colorRenderable*/ true,
/** depthRenderable*/ false);
setFormatCaps(MTLPixelFormatRG16Float, /** filterable*/ true, /** writable*/ true,
/** blendable*/ true, /** multisample*/ true, /** resolve*/ true,
/** colorRenderable*/ true, /** depthRenderable*/ false);
setFormatCaps(MTLPixelFormatRG16Sint, /** filterable*/ false, /** writable*/ true,
/** blendable*/ false, /** multisample*/ true, /** resolve*/ false,
/** colorRenderable*/ true, /** depthRenderable*/ false);
setFormatCaps(MTLPixelFormatRG16Snorm, /** filterable*/ true, /** writable*/ true,
/** blendable*/ true, /** multisample*/ true,
/** resolve*/ display->supportsMacGPUFamily(1), /** colorRenderable*/ true,
/** depthRenderable*/ false);
setFormatCaps(MTLPixelFormatRG16Uint, /** filterable*/ false, /** writable*/ true,
/** blendable*/ false, /** multisample*/ true, /** resolve*/ false,
/** colorRenderable*/ true, /** depthRenderable*/ false);
setFormatCaps(MTLPixelFormatRG16Unorm, /** filterable*/ true, /** writable*/ true,
/** blendable*/ true, /** multisample*/ true,
/** resolve*/ display->supportsMacGPUFamily(1), /** colorRenderable*/ true,
/** depthRenderable*/ false);
setFormatCaps(MTLPixelFormatRG32Float, /** filterable*/ display->supportsMacGPUFamily(1),
/** writable*/ true, /** blendable*/ true,
/** multisample*/ display->supportsMacGPUFamily(1),
/** resolve*/ display->supportsMacGPUFamily(1), /** colorRenderable*/ true,
/** depthRenderable*/ false);
setFormatCaps(MTLPixelFormatRG32Sint, /** filterable*/ false, /** writable*/ true,
/** blendable*/ false, /** multisample*/ display->supportsMacGPUFamily(1),
/** resolve*/ false, /** colorRenderable*/ true, /** depthRenderable*/ false);
setFormatCaps(MTLPixelFormatRG32Uint, /** filterable*/ false, /** writable*/ true,
/** blendable*/ false, /** multisample*/ display->supportsMacGPUFamily(1),
/** resolve*/ false, /** colorRenderable*/ true, /** depthRenderable*/ false);
setFormatCaps(MTLPixelFormatRG8Sint, /** filterable*/ false, /** writable*/ true,
/** blendable*/ false, /** multisample*/ true, /** resolve*/ false,
/** colorRenderable*/ true, /** depthRenderable*/ false);
setFormatCaps(MTLPixelFormatRG8Snorm, /** filterable*/ true, /** writable*/ true,
/** blendable*/ true, /** multisample*/ true,
/** resolve*/ display->supportsEitherGPUFamily(2, 1), /** colorRenderable*/ true,
/** depthRenderable*/ false);
setFormatCaps(MTLPixelFormatRG8Uint, /** filterable*/ false, /** writable*/ true,
/** blendable*/ false, /** multisample*/ true, /** resolve*/ false,
/** colorRenderable*/ true, /** depthRenderable*/ false);
setFormatCaps(MTLPixelFormatRG8Unorm, /** filterable*/ true, /** writable*/ true,
/** blendable*/ true, /** multisample*/ true, /** resolve*/ true,
/** colorRenderable*/ true, /** depthRenderable*/ false);
setFormatCaps(MTLPixelFormatRGB10A2Uint, /** filterable*/ false,
/** writable*/ display->supportsEitherGPUFamily(3, 1), /** blendable*/ false,
/** multisample*/ true, /** resolve*/ false, /** colorRenderable*/ true,
/** depthRenderable*/ false);
setFormatCaps(MTLPixelFormatRGB10A2Unorm, /** filterable*/ true,
/** writable*/ display->supportsEitherGPUFamily(3, 1), /** blendable*/ true,
/** multisample*/ true, /** resolve*/ true, /** colorRenderable*/ true,
/** depthRenderable*/ false);
setFormatCaps(MTLPixelFormatRGB9E5Float, /** filterable*/ true,
/** writable*/ display->supportsIOSGPUFamily(3),
/** blendable*/ display->supportsIOSGPUFamily(1),
/** multisample*/ display->supportsIOSGPUFamily(1),
/** resolve*/ display->supportsIOSGPUFamily(1),
/** colorRenderable*/ display->supportsIOSGPUFamily(1),
/** depthRenderable*/ false);
setFormatCaps(MTLPixelFormatRGBA16Float, /** filterable*/ true, /** writable*/ true,
/** blendable*/ true, /** multisample*/ true, /** resolve*/ true,
/** colorRenderable*/ true, /** depthRenderable*/ false);
setFormatCaps(MTLPixelFormatRGBA16Sint, /** filterable*/ false, /** writable*/ true,
/** blendable*/ false, /** multisample*/ true, /** resolve*/ false,
/** colorRenderable*/ true, /** depthRenderable*/ false);
setFormatCaps(MTLPixelFormatRGBA16Snorm, /** filterable*/ true, /** writable*/ true,
/** blendable*/ true, /** multisample*/ true,
/** resolve*/ display->supportsMacGPUFamily(1), /** colorRenderable*/ true,
/** depthRenderable*/ false);
setFormatCaps(MTLPixelFormatRGBA16Uint, /** filterable*/ false, /** writable*/ true,
/** blendable*/ false, /** multisample*/ true, /** resolve*/ false,
/** colorRenderable*/ true, /** depthRenderable*/ false);
setFormatCaps(MTLPixelFormatRGBA16Unorm, /** filterable*/ true, /** writable*/ true,
/** blendable*/ true, /** multisample*/ true,
/** resolve*/ display->supportsMacGPUFamily(1), /** colorRenderable*/ true,
/** depthRenderable*/ false);
setFormatCaps(MTLPixelFormatRGBA32Float, /** filterable*/ display->supportsMacGPUFamily(1),
/** writable*/ true, /** blendable*/ display->supportsMacGPUFamily(1),
/** multisample*/ display->supportsMacGPUFamily(1),
/** resolve*/ display->supportsMacGPUFamily(1), /** colorRenderable*/ true,
/** depthRenderable*/ false);
setFormatCaps(MTLPixelFormatRGBA32Sint, /** filterable*/ false, /** writable*/ true,
/** blendable*/ false, /** multisample*/ display->supportsMacGPUFamily(1),
/** resolve*/ false, /** colorRenderable*/ true, /** depthRenderable*/ false);
setFormatCaps(MTLPixelFormatRGBA32Uint, /** filterable*/ false, /** writable*/ true,
/** blendable*/ false, /** multisample*/ display->supportsMacGPUFamily(1),
/** resolve*/ false, /** colorRenderable*/ true, /** depthRenderable*/ false);
setFormatCaps(MTLPixelFormatRGBA8Sint, /** filterable*/ false, /** writable*/ true,
/** blendable*/ false, /** multisample*/ true, /** resolve*/ false,
/** colorRenderable*/ true, /** depthRenderable*/ false);
setFormatCaps(MTLPixelFormatRGBA8Snorm, /** filterable*/ true, /** writable*/ true,
/** blendable*/ true, /** multisample*/ true,
/** resolve*/ display->supportsEitherGPUFamily(2, 1), /** colorRenderable*/ true,
/** depthRenderable*/ false);
setFormatCaps(MTLPixelFormatRGBA8Uint, /** filterable*/ false, /** writable*/ true,
/** blendable*/ false, /** multisample*/ true, /** resolve*/ false,
/** colorRenderable*/ true, /** depthRenderable*/ false);
setFormatCaps(MTLPixelFormatRGBA8Unorm, /** filterable*/ true, /** writable*/ true,
/** blendable*/ true, /** multisample*/ true, /** resolve*/ true,
/** colorRenderable*/ true, /** depthRenderable*/ false);
setFormatCaps(MTLPixelFormatRGBA8Unorm_sRGB, /** filterable*/ true,
/** writable*/ display->supportsIOSGPUFamily(2), /** blendable*/ true,
/** multisample*/ true, /** resolve*/ true, /** colorRenderable*/ true,
/** depthRenderable*/ false);
setFormatCaps(MTLPixelFormatStencil8, /** filterable*/ false, /** writable*/ false,
/** blendable*/ false, /** multisample*/ true, /** resolve*/ false,
/** colorRenderable*/ false, /** depthRenderable*/ true);
#if TARGET_OS_OSX || TARGET_OS_MACCATALYST
setFormatCaps(MTLPixelFormatDepth16Unorm, /** filterable*/ true, /** writable*/ false,
/** blendable*/ false, /** multisample*/ true,
/** resolve*/ supportDepthAutoResolve, /** colorRenderable*/ false,
/** depthRenderable*/ true);
setFormatCaps(MTLPixelFormatDepth24Unorm_Stencil8,
/** filterable*/ display->supportsMacGPUFamily(1), /** writable*/ false,
/** blendable*/ false, /** multisample*/ true,
/** resolve*/ supportDepthStencilAutoResolve, /** colorRenderable*/ false,
/** depthRenderable*/ display->supportsMacGPUFamily(1));
#elif TARGET_OS_IOS || TARGET_OS_TV // TARGET_OS_OSX || TARGET_OS_MACCATALYST
setFormatCaps(MTLPixelFormatA1BGR5Unorm, /** filterable*/ true, /** writable*/ false,
/** blendable*/ true, /** multisample*/ true, /** resolve*/ true,
/** colorRenderable*/ true, /** depthRenderable*/ false);
setFormatCaps(MTLPixelFormatABGR4Unorm, /** filterable*/ true, /** writable*/ false,
/** blendable*/ true, /** multisample*/ true, /** resolve*/ true,
/** colorRenderable*/ true, /** depthRenderable*/ false);
setFormatCaps(MTLPixelFormatB5G6R5Unorm, /** filterable*/ true, /** writable*/ false,
/** blendable*/ true, /** multisample*/ true, /** resolve*/ true,
/** colorRenderable*/ true, /** depthRenderable*/ false);
setFormatCaps(MTLPixelFormatBGR5A1Unorm, /** filterable*/ true, /** writable*/ false,
/** blendable*/ true, /** multisample*/ true, /** resolve*/ true,
/** colorRenderable*/ true, /** depthRenderable*/ false);
#endif // TARGET_OS_OSX || TARGET_OS_MACCATALYST
}
} // namespace mtl } // namespace mtl
} // namespace rx } // namespace rx
...@@ -140,6 +140,7 @@ class FormatTable final : angle::NonCopyable ...@@ -140,6 +140,7 @@ class FormatTable final : angle::NonCopyable
uint32_t getMaxSamples() const { return mMaxSamples; } uint32_t getMaxSamples() const { return mMaxSamples; }
private: private:
void initNativeFormatCapsAutogen(const DisplayMtl *display);
void initNativeFormatCaps(const DisplayMtl *display); void initNativeFormatCaps(const DisplayMtl *display);
void setFormatCaps(MTLPixelFormat formatId, void setFormatCaps(MTLPixelFormat formatId,
bool filterable, bool filterable,
......
...@@ -262,93 +262,9 @@ void FormatTable::setCompressedFormatCaps(MTLPixelFormat formatId, bool filterab ...@@ -262,93 +262,9 @@ void FormatTable::setCompressedFormatCaps(MTLPixelFormat formatId, bool filterab
void FormatTable::initNativeFormatCaps(const DisplayMtl *display) void FormatTable::initNativeFormatCaps(const DisplayMtl *display)
{ {
const angle::FeaturesMtl &featuresMtl = display->getFeatures(); initNativeFormatCapsAutogen(display);
// Skip auto resolve if either hasDepth/StencilAutoResolve or allowMultisampleStoreAndResolve
// feature are disabled.
bool supportDepthAutoResolve = featuresMtl.hasDepthAutoResolve.enabled &&
featuresMtl.allowMultisampleStoreAndResolve.enabled;
bool supportStencilAutoResolve = featuresMtl.hasStencilAutoResolve.enabled &&
featuresMtl.allowMultisampleStoreAndResolve.enabled;
bool supportDepthStencilAutoResolve = supportDepthAutoResolve && supportStencilAutoResolve;
// Source: https://developer.apple.com/metal/Metal-Feature-Set-Tables.pdf
// clang-format off
// | formatId | filterable | writable | blendable | multisample | resolve | colorRenderable |
setFormatCaps(MTLPixelFormatA8Unorm, true, false, false, false, false, false);
setFormatCaps(MTLPixelFormatR8Unorm, true, true, true, true, true, true);
setFormatCaps(MTLPixelFormatR8Snorm, true, true, true, true, display->supportsEitherGPUFamily(2, 1), true);
setFormatCaps(MTLPixelFormatR16Unorm, true, true, true, true, display->supportsMacGPUFamily(1), true);
setFormatCaps(MTLPixelFormatR16Snorm, true, true, true, true, display->supportsMacGPUFamily(1), true);
setFormatCaps(MTLPixelFormatRG8Unorm, true, true, true, true, true, true);
setFormatCaps(MTLPixelFormatRG8Snorm, true, true, true, true, display->supportsEitherGPUFamily(2, 1), true);
setFormatCaps(MTLPixelFormatRG16Unorm, true, true, true, true, display->supportsMacGPUFamily(1), true);
setFormatCaps(MTLPixelFormatRG16Snorm, true, true, true, true, display->supportsMacGPUFamily(1), true);
setFormatCaps(MTLPixelFormatRGBA16Unorm, true, true, true, true, display->supportsMacGPUFamily(1), true);
setFormatCaps(MTLPixelFormatRGBA16Snorm, true, true, true, true, display->supportsMacGPUFamily(1), true);
setFormatCaps(MTLPixelFormatRGBA16Float, true, true, true, true, true, true);
// | formatId | filterable | writable | blendable | multisample | resolve | colorRenderable |
setFormatCaps(MTLPixelFormatRGBA8Unorm, true, true, true, true, true, true);
setFormatCaps(MTLPixelFormatRGBA8Unorm_sRGB, true, display->supportsIOSGPUFamily(2), true, true, true, true);
setFormatCaps(MTLPixelFormatRGBA8Snorm, true, true, true, true, display->supportsEitherGPUFamily(2, 1), true);
setFormatCaps(MTLPixelFormatBGRA8Unorm, true, true, true, true, true, true);
setFormatCaps(MTLPixelFormatBGRA8Unorm_sRGB, true, display->supportsIOSGPUFamily(2), true, true, true, true);
// | formatId | filterable | writable | blendable | multisample | resolve | colorRenderable |
setFormatCaps(MTLPixelFormatR16Float, true, true, true, true, true, true);
setFormatCaps(MTLPixelFormatRG16Float, true, true, true, true, true, true);
setFormatCaps(MTLPixelFormatR32Float, display->supportsMacGPUFamily(1), true, true, true, display->supportsMacGPUFamily(1), true);
#if TARGET_OS_IOS && !TARGET_OS_MACCATALYST
// | formatId | filterable | writable | blendable | multisample | resolve | colorRenderable |
setFormatCaps(MTLPixelFormatB5G6R5Unorm, true, false, true, true, true, true);
setFormatCaps(MTLPixelFormatABGR4Unorm, true, false, true, true, true, true);
setFormatCaps(MTLPixelFormatBGR5A1Unorm, true, false, true, true, true, true);
setFormatCaps(MTLPixelFormatA1BGR5Unorm, true, false, true, true, true, true);
#endif
// | formatId | filterable | writable | blendable | multisample | resolve | colorRenderable |
setFormatCaps(MTLPixelFormatBGR10A2Unorm, true, display->supportsEitherGPUFamily(3, 1), true, true, true, true);
setFormatCaps(MTLPixelFormatRGB10A2Unorm, true, display->supportsEitherGPUFamily(3, 1), true, true, true, true);
setFormatCaps(MTLPixelFormatRGB10A2Uint, false, display->supportsEitherGPUFamily(3, 1), false, true, false, true);
setFormatCaps(MTLPixelFormatRG11B10Float, true, display->supportsEitherGPUFamily(3, 1), true, true, true, true);
// | formatId | filterable | writable | blendable | multisample | resolve | colorRenderable |
setFormatCaps(MTLPixelFormatRGB9E5Float, true, display->supportsIOSGPUFamily(3), display->supportsIOSGPUFamily(1), display->supportsIOSGPUFamily(1), display->supportsIOSGPUFamily(1), display->supportsIOSGPUFamily(1));
// | formatId | filterable | writable | blendable | multisample | resolve | colorRenderable |
setFormatCaps(MTLPixelFormatR8Uint, false, true, false, true, false, true);
setFormatCaps(MTLPixelFormatR8Sint, false, true, false, true, false, true);
setFormatCaps(MTLPixelFormatR16Uint, false, true, false, true, false, true);
setFormatCaps(MTLPixelFormatR16Sint, false, true, false, true, false, true);
setFormatCaps(MTLPixelFormatRG8Uint, false, true, false, true, false, true);
setFormatCaps(MTLPixelFormatRG8Sint, false, true, false, true, false, true);
setFormatCaps(MTLPixelFormatR32Uint, false, true, false, display->supportsMacGPUFamily(1), false, true);
setFormatCaps(MTLPixelFormatR32Sint, false, true, false, display->supportsMacGPUFamily(1), false, true);
setFormatCaps(MTLPixelFormatRG16Uint, false, true, false, true, false, true);
setFormatCaps(MTLPixelFormatRG16Sint, false, true, false, true, false, true);
setFormatCaps(MTLPixelFormatRGBA8Uint, false, true, false, true, false, true);
setFormatCaps(MTLPixelFormatRGBA8Sint, false, true, false, true, false, true);
setFormatCaps(MTLPixelFormatRG32Uint, false, true, false, display->supportsMacGPUFamily(1), false, true);
setFormatCaps(MTLPixelFormatRG32Sint, false, true, false, display->supportsMacGPUFamily(1), false, true);
setFormatCaps(MTLPixelFormatRGBA16Uint, false, true, false, true, false, true);
setFormatCaps(MTLPixelFormatRGBA16Sint, false, true, false, true, false, true);
setFormatCaps(MTLPixelFormatRGBA32Uint, false, true, false, display->supportsMacGPUFamily(1), false, true);
setFormatCaps(MTLPixelFormatRGBA32Sint, false, true, false, display->supportsMacGPUFamily(1), false, true);
// | formatId | filterable | writable | blendable | multisample | resolve | colorRenderable |
setFormatCaps(MTLPixelFormatRG32Float, display->supportsMacGPUFamily(1), true, true, display->supportsMacGPUFamily(1), display->supportsMacGPUFamily(1), true);
setFormatCaps(MTLPixelFormatRGBA32Float, display->supportsMacGPUFamily(1), true, display->supportsMacGPUFamily(1), display->supportsMacGPUFamily(1), display->supportsMacGPUFamily(1), true);
// | formatId | filterable | writable | blendable | multisample | resolve | colorRenderable | depthRenderable |
setFormatCaps(MTLPixelFormatDepth32Float, display->supportsMacGPUFamily(1), false, false, true, supportDepthAutoResolve, false, true);
setFormatCaps(MTLPixelFormatStencil8, false, false, false, true, false, false, true);
setFormatCaps(MTLPixelFormatDepth32Float_Stencil8, display->supportsMacGPUFamily(1), false, false, true, supportDepthStencilAutoResolve, false, true);
#if TARGET_OS_OSX || TARGET_OS_MACCATALYST #if TARGET_OS_OSX || TARGET_OS_MACCATALYST
setFormatCaps(MTLPixelFormatDepth16Unorm, true, false, false, true, supportDepthAutoResolve, false, true);
setFormatCaps(MTLPixelFormatDepth24Unorm_Stencil8, display->supportsMacGPUFamily(1), false, false, true, supportDepthStencilAutoResolve, false, display->supportsMacGPUFamily(1));
setCompressedFormatCaps(MTLPixelFormatBC1_RGBA, true); setCompressedFormatCaps(MTLPixelFormatBC1_RGBA, true);
setCompressedFormatCaps(MTLPixelFormatBC1_RGBA_sRGB, true); setCompressedFormatCaps(MTLPixelFormatBC1_RGBA_sRGB, true);
setCompressedFormatCaps(MTLPixelFormatBC2_RGBA, true); setCompressedFormatCaps(MTLPixelFormatBC2_RGBA, true);
......
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