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: Jonah Ryan-Davis <jonahr@google.com>
Reviewed-by: Jamie Madill <jmadill@chromium.org>
This commit is contained in:
Le Hoang Quyen
2020-08-08 18:23:47 +08:00
committed by Commit Bot
parent 594e0e1491
commit 85919ef772
6 changed files with 808 additions and 89 deletions

View File

@@ -4,9 +4,9 @@
"src/libANGLE/renderer/angle_format_map.json":
"aa4a0d3463b76858a75787b9cdec8e98",
"src/libANGLE/renderer/metal/gen_mtl_format_table.py":
"27769e4e9cce3b7af18b69d41351c3ed",
"91579339b484425ef81b0e900a5c04ed",
"src/libANGLE/renderer/metal/mtl_format_map.json":
"b202d7a0349006e2bbd58c603d9cdc28",
"b4f515e08814b5a0f148a049139d8392",
"src/libANGLE/renderer/metal/mtl_format_table_autogen.mm":
"7a0ee6139ca1e7ec8b8b0a7de9180ef7"
"6a8cdb5d09a6ba1521fe9dab3b887451"
}

View File

@@ -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 rx
"""
@@ -408,6 +423,46 @@ def gen_vertex_map_switch_string(vertex_table):
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():
data_source_name = 'mtl_format_map.json'
# auto_script parameters.
@@ -434,12 +489,15 @@ def main():
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(
script_name=sys.argv[0],
copyright_year=date.today().year,
data_source_name=data_source_name,
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:
out_file.write(output_cpp)
out_file.close()

View File

@@ -1,5 +1,34 @@
{
"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": {
"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": {
"NONE": "MTLPixelFormatInvalid",
"A8_UNORM": "MTLPixelFormatA8Unorm",
@@ -144,9 +173,461 @@
},
"d24s8_fallbacks_mac": {
"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": {
"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": {
"NONE": "MTLVertexFormatInvalid",
"R8_UNORM": "MTLVertexFormatUCharNormalized",

View File

@@ -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 rx

View File

@@ -140,6 +140,7 @@ class FormatTable final : angle::NonCopyable
uint32_t getMaxSamples() const { return mMaxSamples; }
private:
void initNativeFormatCapsAutogen(const DisplayMtl *display);
void initNativeFormatCaps(const DisplayMtl *display);
void setFormatCaps(MTLPixelFormat formatId,
bool filterable,

View File

@@ -262,93 +262,9 @@ void FormatTable::setCompressedFormatCaps(MTLPixelFormat formatId, bool filterab
void FormatTable::initNativeFormatCaps(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;
initNativeFormatCapsAutogen(display);
// 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
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_sRGB, true);
setCompressedFormatCaps(MTLPixelFormatBC2_RGBA, true);