blob: 564db80ed7038ef5b9f1ba31ece6452a0f33bb5c [file] [edit]
diff --git a/doc/ExtensionSupport.md b/doc/ExtensionSupport.md
index bb7e1359c7a48a1cd1001515eb046e5c33e922d7..1967ac6ae373966acef3963984d7e23bb1c8b8a9 100644
--- a/doc/ExtensionSupport.md
+++ b/doc/ExtensionSupport.md
@@ -258,6 +258,7 @@ using data from registry_xml.py and gl.xml.
| [GL_ANGLE_texture_external_update](https://chromium.googlesource.com/angle/angle/+/refs/heads/main/extensions/ANGLE_texture_external_update.txt) | | | | | | | |
| [GL_ANGLE_texture_multisample](https://chromium.googlesource.com/angle/angle/+/refs/heads/main/extensions/ANGLE_texture_multisample.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
| [GL_ANGLE_texture_rectangle](https://chromium.googlesource.com/angle/angle/+/refs/heads/main/extensions/ANGLE_texture_rectangle.txt) | | | | | | | |
+| [GL_ANGLE_variable_rasterization_rate_metal](https://chromium.googlesource.com/angle/angle/+/refs/heads/main/extensions/ANGLE_variable_rasterization_rate_metal.txt) | | | | | | | |
| [GL_ANGLE_vulkan_image](https://chromium.googlesource.com/angle/angle/+/refs/heads/main/extensions/ANGLE_vulkan_image.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
| [GL_ANGLE_webgl_compatibility](https://chromium.googlesource.com/angle/angle/+/refs/heads/main/extensions/ANGLE_webgl_compatibility.txt) | | | | | | | |
| [GL_ANGLE_yuv_internal_format](https://chromium.googlesource.com/angle/angle/+/refs/heads/main/extensions/ANGLE_yuv_internal_format.txt) | ✔ | | ✔ | ✔ | ✔ | ✔ | ✔ |
diff --git a/include/GLES2/gl2ext_angle.h b/include/GLES2/gl2ext_angle.h
index 7952b50a5b8637eaf53d7d9611225a12c80cdcdd..c96853fafa1f23467ef659546aa4279735d0288c 100644
--- a/include/GLES2/gl2ext_angle.h
+++ b/include/GLES2/gl2ext_angle.h
@@ -736,4 +736,16 @@ GL_APICALL void GL_APIENTRY glLogicOpANGLE (GLenum);
#define GL_PROGRAM_BINARY_READY_ANGLE 0x96BE
#endif /* GL_ANGLE_program_binary_readiness_query */
+#ifndef GL_ANGLE_variable_rasterization_rate_metal
+#define GL_ANGLE_variable_rasterization_rate_metal 1
+
+#define GL_VARIABLE_RASTERIZATION_RATE_ANGLE 0x96BC
+#define GL_METAL_RASTERIZATION_RATE_MAP_BINDING_ANGLE 0x96BD
+typedef void *GLMTLRasterizationRateMapANGLE;
+typedef void (GL_APIENTRYP PFNGLBINDMETALRASTERIZATIONRATEMAPANGLEPROC) (GLuint, GLMTLRasterizationRateMapANGLE);
+#ifdef GL_GLEXT_PROTOTYPES
+GL_APICALL void GL_APIENTRY glBindMetalRasterizationRateMapANGLE(GLuint framebuffer, GLMTLRasterizationRateMapANGLE map);
+#endif
+#endif /* GL_ANGLE_variable_rasterization_rate_metal */
+
#endif // INCLUDE_GLES2_GL2EXT_ANGLE_H_
diff --git a/include/platform/autogen/FeaturesMtl_autogen.h b/include/platform/autogen/FeaturesMtl_autogen.h
index 28e27213619de12f342cdced7abe175d5a82555a..ff048aa260513b2c1536f0b858803328a8e96499 100644
--- a/include/platform/autogen/FeaturesMtl_autogen.h
+++ b/include/platform/autogen/FeaturesMtl_autogen.h
@@ -83,6 +83,13 @@ struct FeaturesMtl : FeatureSetBase
&members,
};
+ FeatureInfo hasVariableRasterizationRate = {
+ "hasVariableRasterizationRate",
+ FeatureCategory::MetalFeatures,
+ "The renderer supports variable rasterization rate",
+ &members,
+ };
+
FeatureInfo allowInlineConstVertexData = {
"allowInlineConstVertexData",
FeatureCategory::MetalFeatures,
diff --git a/include/platform/mtl_features.json b/include/platform/mtl_features.json
index 8aabccca1e1edee5fae5e28ff6bf9ab6f8967f73..bf2798455b282be6ff38a5f049e0a14a0022473e 100644
--- a/include/platform/mtl_features.json
+++ b/include/platform/mtl_features.json
@@ -70,6 +70,13 @@
"The renderer supports MTL(Shared)Event"
]
},
+ {
+ "name": "has_variable_rasterization_rate",
+ "category": "Features",
+ "description": [
+ "The renderer supports variable rasterization rate"
+ ]
+ },
{
"name": "allow_inline_const_vertex_data",
"category": "Features",
diff --git a/scripts/generate_entry_points.py b/scripts/generate_entry_points.py
index b65053ff19bf323c618a64db6c296f1b5af15bb3..f5e05c1870a2aed854e3d6bbec1730aeb0d50a85 100755
--- a/scripts/generate_entry_points.py
+++ b/scripts/generate_entry_points.py
@@ -1010,6 +1010,7 @@ FORMAT_DICT = {
"GLfloat": "%f",
"GLint": "%d",
"GLintptr": UNSIGNED_LONG_LONG_FORMAT,
+ "GLMTLRasterizationRateMapANGLE": POINTER_FORMAT,
"GLshort": "%d",
"GLsizei": "%d",
"GLsizeiptr": UNSIGNED_LONG_LONG_FORMAT,
diff --git a/scripts/gl_angle_ext.xml b/scripts/gl_angle_ext.xml
index 466387f2a92f2bda5884e6cde7910678690fe58d..835cc7d42424dfc18067140a8c9d12369a4c7f7b 100644
--- a/scripts/gl_angle_ext.xml
+++ b/scripts/gl_angle_ext.xml
@@ -9,6 +9,11 @@
Includes data used to auto-generate ANGLE classes.
</comment>
+ <!-- SECTION: GL type definitions. -->
+ <types>
+ <type>typedef void *<name>GLMTLRasterizationRateMapANGLE</name>;</type>
+ </types>
+
<!-- SECTION: GL parameter class type definitions. -->
<groups>
<group name="CreateFlagMask">
@@ -1048,6 +1053,11 @@
<param group="LogicOp"><ptype>GLenum</ptype> <name>opcode</name></param>
<alias name="glLogicOp"/>
</command>
+ <command>
+ <proto>void <name>glBindMetalRasterizationRateMapANGLE</name></proto>
+ <param><ptype>GLuint</ptype> <name>framebuffer</name></param>
+ <param><ptype>GLMTLRasterizationRateMapANGLE</ptype> <name>map</name></param>
+ </command>
</commands>
<!-- SECTION: ANGLE extension interface definitions -->
@@ -1449,6 +1459,11 @@
<extension name="GL_ANGLE_shader_binary" supported='gles2'>
<require>
<enum name="GL_SHADER_BINARY_ANGLE"/>
+ <extension name="GL_ANGLE_variable_rasterization_rate_metal" supported="gles2">
+ <require>
+ <enum name="GL_VARIABLE_RASTERIZATION_RATE_ANGLE"/>
+ <enum name="GL_METAL_RASTERIZATION_RATE_MAP_BINDING_ANGLE"/>
+ <command name="glBindMetalRasterizationRateMapANGLE"/>
</require>
</extension>
</extensions>
@@ -1630,4 +1645,9 @@
<enums namespace="GL" start="0x0BF2" end="0x0BF2" vendor="ANGLE">
<enum value="0x0BF2" name="GL_COLOR_LOGIC_OP_ANGLE"/>
</enums>
+
+ <enums namespace="GL" start="0x96BC" end="0x96BD" vendor="ANGLE">
+ <enum value="0x96BC" name="GL_VARIABLE_RASTERIZATION_RATE_ANGLE"/>
+ <enum value="0x96BD" name="GL_METAL_RASTERIZATION_RATE_MAP_BINDING_ANGLE"/>
+ </enums>
</registry>
diff --git a/scripts/registry_xml.py b/scripts/registry_xml.py
index 4e428eac9e30e27598fcd2c3bf9d1b0a3a7fc6d0..9454ed3a9f1d116b3b99a74d63072d196c34dd66 100644
--- a/scripts/registry_xml.py
+++ b/scripts/registry_xml.py
@@ -73,6 +73,7 @@ angle_requestable_extensions = [
"GL_ANGLE_texture_compression_dxt5",
"GL_ANGLE_texture_external_update",
"GL_ANGLE_texture_multisample",
+ "GL_ANGLE_variable_rasterization_rate_metal",
"GL_ANGLE_vulkan_image",
"GL_ANGLE_yuv_internal_format",
"GL_CHROMIUM_color_buffer_float_rgb",
diff --git a/src/common/entry_points_enum_autogen.cpp b/src/common/entry_points_enum_autogen.cpp
index 8266c3561d4af4f06a2dab192500026802ab5e9c..c8391669fd518ff06082a83ad68429513e873757 100644
--- a/src/common/entry_points_enum_autogen.cpp
+++ b/src/common/entry_points_enum_autogen.cpp
@@ -540,6 +540,8 @@ const char *GetEntryPointName(EntryPoint ep)
return "glBindImageTexture";
case EntryPoint::GLBindImageTextures:
return "glBindImageTextures";
+ case EntryPoint::GLBindMetalRasterizationRateMapANGLE:
+ return "glBindMetalRasterizationRateMapANGLE";
case EntryPoint::GLBindProgramPipeline:
return "glBindProgramPipeline";
case EntryPoint::GLBindProgramPipelineEXT:
diff --git a/src/common/entry_points_enum_autogen.h b/src/common/entry_points_enum_autogen.h
index e45604ba4ee4eb8ebffbd506dc34c71f635f3618..441a69f7325f69d88e708647c2b5dfacdceede5f 100644
--- a/src/common/entry_points_enum_autogen.h
+++ b/src/common/entry_points_enum_autogen.h
@@ -276,6 +276,7 @@ enum class EntryPoint
GLBindFramebufferOES,
GLBindImageTexture,
GLBindImageTextures,
+ GLBindMetalRasterizationRateMapANGLE,
GLBindProgramPipeline,
GLBindProgramPipelineEXT,
GLBindRenderbuffer,
diff --git a/src/common/frame_capture_utils_autogen.cpp b/src/common/frame_capture_utils_autogen.cpp
index f356982285bc9bed6469571d6c2f0ef9ea7cc940..9f601fc824eae7e78da8e8f9b3fe6576b0d7e76c 100644
--- a/src/common/frame_capture_utils_autogen.cpp
+++ b/src/common/frame_capture_utils_autogen.cpp
@@ -222,6 +222,10 @@ void WriteParamCaptureReplay(std::ostream &os, const CallCapture &call, const Pa
WriteParamValueReplay<ParamType::TGLDEBUGPROCKHR>(os, call,
param.value.GLDEBUGPROCKHRVal);
break;
+ case ParamType::TGLMTLRasterizationRateMapANGLE:
+ WriteParamValueReplay<ParamType::TGLMTLRasterizationRateMapANGLE>(
+ os, call, param.value.GLMTLRasterizationRateMapANGLEVal);
+ break;
case ParamType::TGLbitfield:
WriteParamValueReplay<ParamType::TGLbitfield>(os, call, param.value.GLbitfieldVal);
break;
@@ -768,6 +772,8 @@ const char *ParamTypeToString(ParamType paramType)
return "GLDEBUGPROC";
case ParamType::TGLDEBUGPROCKHR:
return "GLDEBUGPROCKHR";
+ case ParamType::TGLMTLRasterizationRateMapANGLE:
+ return "GLMTLRasterizationRateMapANGLE";
case ParamType::TGLbitfield:
return "GLbitfield";
case ParamType::TGLboolean:
diff --git a/src/common/frame_capture_utils_autogen.h b/src/common/frame_capture_utils_autogen.h
index e68affb0e0773ce2c83439ca9c188066cc225d34..88a18830e8037a5cf2c23d60b94f2910c6edf136 100644
--- a/src/common/frame_capture_utils_autogen.h
+++ b/src/common/frame_capture_utils_autogen.h
@@ -74,6 +74,7 @@ enum class ParamType
TFramebufferIDPointer,
TGLDEBUGPROC,
TGLDEBUGPROCKHR,
+ TGLMTLRasterizationRateMapANGLE,
TGLbitfield,
TGLboolean,
TGLbooleanConstPointer,
@@ -191,7 +192,7 @@ enum class ParamType
TvoidPointerPointer,
};
-constexpr uint32_t kParamTypeCount = 172;
+constexpr uint32_t kParamTypeCount = 173;
union ParamValue
{
@@ -252,6 +253,7 @@ union ParamValue
gl::FramebufferID *FramebufferIDPointerVal;
GLDEBUGPROC GLDEBUGPROCVal;
GLDEBUGPROCKHR GLDEBUGPROCKHRVal;
+ GLMTLRasterizationRateMapANGLE GLMTLRasterizationRateMapANGLEVal;
GLbitfield GLbitfieldVal;
GLboolean GLbooleanVal;
const GLboolean *GLbooleanConstPointerVal;
@@ -745,6 +747,14 @@ inline GLDEBUGPROCKHR GetParamVal<ParamType::TGLDEBUGPROCKHR, GLDEBUGPROCKHR>(
return value.GLDEBUGPROCKHRVal;
}
+template <>
+inline GLMTLRasterizationRateMapANGLE
+GetParamVal<ParamType::TGLMTLRasterizationRateMapANGLE, GLMTLRasterizationRateMapANGLE>(
+ const ParamValue &value)
+{
+ return value.GLMTLRasterizationRateMapANGLEVal;
+}
+
template <>
inline GLbitfield GetParamVal<ParamType::TGLbitfield, GLbitfield>(const ParamValue &value)
{
@@ -1629,6 +1639,8 @@ T AccessParamValue(ParamType paramType, const ParamValue &value)
return GetParamVal<ParamType::TGLDEBUGPROC, T>(value);
case ParamType::TGLDEBUGPROCKHR:
return GetParamVal<ParamType::TGLDEBUGPROCKHR, T>(value);
+ case ParamType::TGLMTLRasterizationRateMapANGLE:
+ return GetParamVal<ParamType::TGLMTLRasterizationRateMapANGLE, T>(value);
case ParamType::TGLbitfield:
return GetParamVal<ParamType::TGLbitfield, T>(value);
case ParamType::TGLboolean:
@@ -2227,6 +2239,14 @@ inline void SetParamVal<ParamType::TGLDEBUGPROCKHR>(GLDEBUGPROCKHR valueIn, Para
valueOut->GLDEBUGPROCKHRVal = valueIn;
}
+template <>
+inline void SetParamVal<ParamType::TGLMTLRasterizationRateMapANGLE>(
+ GLMTLRasterizationRateMapANGLE valueIn,
+ ParamValue *valueOut)
+{
+ valueOut->GLMTLRasterizationRateMapANGLEVal = valueIn;
+}
+
template <>
inline void SetParamVal<ParamType::TGLbitfield>(GLbitfield valueIn, ParamValue *valueOut)
{
@@ -3149,6 +3169,9 @@ void InitParamValue(ParamType paramType, T valueIn, ParamValue *valueOut)
case ParamType::TGLDEBUGPROCKHR:
SetParamVal<ParamType::TGLDEBUGPROCKHR>(valueIn, valueOut);
break;
+ case ParamType::TGLMTLRasterizationRateMapANGLE:
+ SetParamVal<ParamType::TGLMTLRasterizationRateMapANGLE>(valueIn, valueOut);
+ break;
case ParamType::TGLbitfield:
SetParamVal<ParamType::TGLbitfield>(valueIn, valueOut);
break;
diff --git a/src/common/gl_enum_utils_autogen.cpp b/src/common/gl_enum_utils_autogen.cpp
index 40f19699fbf375c7531b7da2e020dde7003f7ace..af39593acdc3dcbd39043ad1bfcbcbceb0e487b6 100644
--- a/src/common/gl_enum_utils_autogen.cpp
+++ b/src/common/gl_enum_utils_autogen.cpp
@@ -2814,6 +2814,10 @@ const char *GLenumToString(GLESEnum enumGroup, unsigned int value)
return "GL_RGBX8_ANGLE";
case 0x96BB:
return "GL_SHADER_BINARY_ANGLE";
+ case 0x96BC:
+ return "GL_VARIABLE_RASTERIZATION_RATE_ANGLE";
+ case 0x96BD:
+ return "GL_METAL_RASTERIZATION_RATE_MAP_BINDING_ANGLE";
case 0x96BE:
return "GL_PROGRAM_BINARY_READY_ANGLE";
case 0x96E0:
@@ -22190,6 +22194,7 @@ static StringEnumEntry g_stringEnumTable[] = {
{"GL_MESH_SUBROUTINE_UNIFORM_NV", 0x957E},
{"GL_MESH_VERTICES_OUT_NV", 0x9579},
{"GL_MESH_WORK_GROUP_SIZE_NV", 0x953E},
+ {"GL_METAL_RASTERIZATION_RATE_MAP_BINDING_ANGLE", 0x96BD},
{"GL_MIN", 0x8007},
{"GL_MINMAX", 0x802E},
{"GL_MINMAX_EXT", 0x802E},
@@ -24841,6 +24846,7 @@ static StringEnumEntry g_stringEnumTable[] = {
{"GL_VARIABLE_E_NV", 0x8527},
{"GL_VARIABLE_F_NV", 0x8528},
{"GL_VARIABLE_G_NV", 0x8529},
+ {"GL_VARIABLE_RASTERIZATION_RATE_ANGLE", 0x96BC},
{"GL_VARIANT_ARRAY_EXT", 0x87E8},
{"GL_VARIANT_ARRAY_POINTER_EXT", 0x87E9},
{"GL_VARIANT_ARRAY_STRIDE_EXT", 0x87E6},
diff --git a/src/common/utilities.cpp b/src/common/utilities.cpp
index 34826b47554d0d89e8b9619d46828177b2c1b873..2e03a110de26a7cb888d8e9a5997deaf3745c12c 100644
--- a/src/common/utilities.cpp
+++ b/src/common/utilities.cpp
@@ -6,6 +6,12 @@
// utilities.cpp: Conversion functions and other utility routines.
+// Older clang versions have a false positive on this warning here.
+// TODO(dino): Is this still necessary?
+#if defined(__clang__)
+# pragma clang diagnostic ignored "-Wglobal-constructors"
+#endif
+
#include "common/utilities.h"
#include "GLES3/gl3.h"
#include "common/mathutil.h"
diff --git a/src/compiler/fuzz/translator_fuzzer.cpp b/src/compiler/fuzz/translator_fuzzer.cpp
index f55eddef30336ffe712d1a88bb8894e6e347734f..203cba54333499fe4a794ac790143b82c880e135 100644
--- a/src/compiler/fuzz/translator_fuzzer.cpp
+++ b/src/compiler/fuzz/translator_fuzzer.cpp
@@ -139,6 +139,7 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
static_cast<uint32_t>(ShFragmentSynchronizationType::InvalidEnum));
std::vector<uint32_t> validOutputs;
+#ifndef ANGLE_TRANSLATOR_FUZZER_METAL_ONLY
validOutputs.push_back(SH_ESSL_OUTPUT);
validOutputs.push_back(SH_GLSL_COMPATIBILITY_OUTPUT);
validOutputs.push_back(SH_GLSL_130_OUTPUT);
@@ -155,6 +156,10 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
validOutputs.push_back(SH_HLSL_3_0_OUTPUT);
validOutputs.push_back(SH_HLSL_4_1_OUTPUT);
validOutputs.push_back(SH_HLSL_4_0_FL9_3_OUTPUT);
+#endif
+#ifdef ANGLE_ENABLE_METAL
+ validOutputs.push_back(SH_MSL_METAL_OUTPUT);
+#endif
bool found = false;
for (auto valid : validOutputs)
{
@@ -186,6 +191,7 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
if (translator == nullptr)
{
+ sh::Finalize();
return 0;
}
@@ -219,6 +225,7 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
if (!translator->Init(resources))
{
+ sh::Finalize();
return 0;
}
@@ -231,5 +238,6 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
const char *shaderStrings[] = {reinterpret_cast<const char *>(data)};
translator->compile(shaderStrings, 1, options);
+ sh::Finalize();
return 0;
}
diff --git a/src/compiler/preprocessor/preprocessor_tab_autogen.cpp b/src/compiler/preprocessor/preprocessor_tab_autogen.cpp
index a7607c9e529ce7a57bdc6c3c82134b144eb67130..c9ec1adec020589bd4fcfe226721042a8f2c6cf5 100644
--- a/src/compiler/preprocessor/preprocessor_tab_autogen.cpp
+++ b/src/compiler/preprocessor/preprocessor_tab_autogen.cpp
@@ -1,5 +1,8 @@
/* A Bison parser, made by GNU Bison 3.8.2. */
+/* Apple Note: For the avoidance of doubt, Apple elects to distribute this file under the terms of
+ * the BSD license. */
+
/* Bison implementation for Yacc-like parsers in C
Copyright (C) 1984, 1989-1990, 2000-2015, 2018-2021 Free Software Foundation,
diff --git a/src/compiler/translator/glslang_tab_autogen.cpp b/src/compiler/translator/glslang_tab_autogen.cpp
index acde76f0189b7dc474f54c3df7e0514a8529c162..2e95ee0da27b547c5258c8d88c8ef8d461f3943e 100644
--- a/src/compiler/translator/glslang_tab_autogen.cpp
+++ b/src/compiler/translator/glslang_tab_autogen.cpp
@@ -1,5 +1,8 @@
/* A Bison parser, made by GNU Bison 3.8.2. */
+/* Apple Note: For the avoidance of doubt, Apple elects to distribute this file under the terms of
+ * the BSD license. */
+
/* Bison implementation for Yacc-like parsers in C
Copyright (C) 1984, 1989-1990, 2000-2015, 2018-2021 Free Software Foundation,
diff --git a/src/compiler/translator/glslang_tab_autogen.h b/src/compiler/translator/glslang_tab_autogen.h
index d5a48edd40f382359db76acf1a1ce75b6a6dc6d5..907c62e0bb659292b3912707904981863429478a 100644
--- a/src/compiler/translator/glslang_tab_autogen.h
+++ b/src/compiler/translator/glslang_tab_autogen.h
@@ -1,5 +1,8 @@
/* A Bison parser, made by GNU Bison 3.8.2. */
+/* Apple Note: For the avoidance of doubt, Apple elects to distribute this file under the terms of
+ * the BSD license. */
+
/* Bison interface for Yacc-like parsers in C
Copyright (C) 1984, 1989-1990, 2000-2015, 2018-2021 Free Software Foundation,
diff --git a/src/libANGLE/Context.cpp b/src/libANGLE/Context.cpp
index 8d05364ff463c426453332264fb0836611865c23..da8ae7bbc72c5b818917048f4058bb3c96698090 100644
--- a/src/libANGLE/Context.cpp
+++ b/src/libANGLE/Context.cpp
@@ -10018,6 +10018,14 @@ void Context::clearTexSubImage(TextureID texturePacked,
static_cast<const uint8_t *>(data)));
}
+void Context::bindMetalRasterizationRateMap(GLuint renderbufferHandle, GLMTLRasterizationRateMapANGLE map)
+{
+ Renderbuffer *renderbuffer = getRenderbuffer({renderbufferHandle});
+ rx::RenderbufferImpl *renderbufferImpl = renderbuffer ? renderbuffer->getImplementation() : nullptr;
+ ANGLE_CONTEXT_TRY(mImplementation->bindMetalRasterizationRateMap(this, renderbufferImpl, map));
+ getMutablePrivateState()->setVariableRasterizationRateMap(map);
+}
+
// ErrorSet implementation.
ErrorSet::ErrorSet(Debug *debug,
const angle::FrontendFeatures &frontendFeatures,
diff --git a/src/libANGLE/Context_gles_ext_autogen.h b/src/libANGLE/Context_gles_ext_autogen.h
index 364ea21366fc5a76de2b3e596b7039370e911bde..06916ba9627e4913cc54267792739d560fecdfbc 100644
--- a/src/libANGLE/Context_gles_ext_autogen.h
+++ b/src/libANGLE/Context_gles_ext_autogen.h
@@ -631,6 +631,8 @@
void invalidateTexture(TextureType targetPacked); \
/* GL_ANGLE_texture_multisample */ \
/* GL_ANGLE_texture_rectangle */ \
+ /* GL_ANGLE_variable_rasterization_rate_metal */ \
+ void bindMetalRasterizationRateMap(GLuint renderbuffer, GLMTLRasterizationRateMapANGLE map); \
/* GL_ANGLE_vulkan_image */ \
void acquireTextures(GLuint numTextures, const TextureID *texturesPacked, \
const GLenum *layouts); \
diff --git a/src/libANGLE/Framebuffer.cpp b/src/libANGLE/Framebuffer.cpp
index a7a1cc00168789858d23f9799317c293bda6b077..833aa8c98ad0363b94fe179451664e214a4091ef 100644
--- a/src/libANGLE/Framebuffer.cpp
+++ b/src/libANGLE/Framebuffer.cpp
@@ -1680,6 +1680,8 @@ angle::Result Framebuffer::discard(const Context *context, size_t count, const G
// Back-ends might make the contents of the FBO undefined. In WebGL 2.0, invalidate operations
// can be no-ops, so we should probably do that to ensure consistency.
// TODO(jmadill): WebGL behaviour, and robust resource init behaviour without WebGL.
+ if (context->isRobustResourceInitEnabled())
+ markDrawAttachmentsNeedInit(count, attachments);
return mImpl->discard(context, count, attachments);
}
@@ -1691,6 +1693,8 @@ angle::Result Framebuffer::invalidate(const Context *context,
// Back-ends might make the contents of the FBO undefined. In WebGL 2.0, invalidate operations
// can be no-ops, so we should probably do that to ensure consistency.
// TODO(jmadill): WebGL behaviour, and robust resource init behaviour without WebGL.
+ if (context->isRobustResourceInitEnabled())
+ markDrawAttachmentsNeedInit(count, attachments);
return mImpl->invalidate(context, count, attachments);
}
@@ -2839,4 +2843,56 @@ angle::Result Framebuffer::syncAttachmentState(const Context *context,
return angle::Result::Continue;
}
+
+void Framebuffer::markDrawAttachmentsNeedInit(size_t count, const GLenum *attachments)
+{
+ bool stateChanged = false;
+ for (size_t attachmentIdx = 0; attachmentIdx < count; attachmentIdx++)
+ {
+ GLenum attachmentBindPoint = attachments[attachmentIdx];
+ switch (attachmentBindPoint)
+ {
+ case GL_DEPTH_ATTACHMENT:
+ case GL_DEPTH_EXT:
+ if (mState.mDepthAttachment.isAttached())
+ {
+ mDirtyBits.set(DIRTY_BIT_DEPTH_ATTACHMENT);
+ mState.mResourceNeedsInit.set(DIRTY_BIT_DEPTH_ATTACHMENT);
+ mState.mDepthAttachment.setInitState(InitState::MayNeedInit);
+ stateChanged = true;
+ }
+ break;
+ case GL_STENCIL_ATTACHMENT:
+ case GL_STENCIL_EXT:
+ if (mState.mStencilAttachment.isAttached())
+ {
+ mDirtyBits.set(DIRTY_BIT_STENCIL_ATTACHMENT);
+ mState.mResourceNeedsInit.set(DIRTY_BIT_STENCIL_ATTACHMENT);
+ mState.mStencilAttachment.setInitState(InitState::MayNeedInit);
+ stateChanged = true;
+ }
+ break;
+ default:
+ if (attachmentBindPoint == GL_COLOR_EXT)
+ {
+ attachmentBindPoint = GL_COLOR_ATTACHMENT0;
+ }
+ int colorDirtyBit = attachmentBindPoint - GL_COLOR_ATTACHMENT0;
+ if (colorDirtyBit >= 0 && colorDirtyBit < IMPLEMENTATION_MAX_DRAW_BUFFERS &&
+ mState.mColorAttachments[colorDirtyBit].isAttached())
+ {
+ mDirtyBits.set(colorDirtyBit);
+ mState.mResourceNeedsInit.set(colorDirtyBit);
+ mState.mColorAttachments[colorDirtyBit].setInitState(InitState::MayNeedInit);
+ stateChanged = true;
+ }
+ break;
+ }
+ }
+
+ if (stateChanged)
+ {
+ onStateChange(angle::SubjectMessage::DirtyBitsFlagged);
+ }
+}
} // namespace gl
diff --git a/src/libANGLE/Framebuffer.h b/src/libANGLE/Framebuffer.h
index f690cf4932b165ff099b1ea1c80002023f559dd5..41cc590b8a636af5508fd3b4735486eec29a1fa7 100644
--- a/src/libANGLE/Framebuffer.h
+++ b/src/libANGLE/Framebuffer.h
@@ -545,6 +545,8 @@ class Framebuffer final : public angle::ObserverInterface,
Command command,
const FramebufferAttachment *attachment) const;
+ void markDrawAttachmentsNeedInit(size_t count, const GLenum *attachments);
+
FramebufferState mState;
rx::FramebufferImpl *mImpl;
diff --git a/src/libANGLE/State.cpp b/src/libANGLE/State.cpp
index f280a5b1630e36f9d85fa5fc75b38f6aba8dd37b..1c65fd4628421efe5e317b0036c9c34a3b5a1fa9 100644
--- a/src/libANGLE/State.cpp
+++ b/src/libANGLE/State.cpp
@@ -6,6 +6,9 @@
// State.cpp: Implements the State class, encapsulating raw GL state.
+// Older clang versions have a false positive on this warning here.
+#pragma clang diagnostic ignored "-Wglobal-constructors"
+
#include "libANGLE/State.h"
#include <string.h>
@@ -369,6 +372,8 @@ PrivateState::PrivateState(const EGLenum clientType,
mLogicOp(LogicalOperation::Copy),
mPatchVertices(3),
mPixelLocalStorageActivePlanes(0),
+ mVariableRasterizationRateEnabled(false),
+ mVariableRasterizationRateMap(nullptr),
mNoSimultaneousConstantColorAndAlphaBlendFunc(false),
mSetBlendIndexedInvoked(false),
mSetBlendFactorsIndexedInvoked(false),
@@ -1247,6 +1252,26 @@ void PrivateState::setLogicOp(LogicalOperation opcode)
}
}
+void PrivateState::setVariableRasterizationRateEnabled(bool enabled)
+{
+ if (mVariableRasterizationRateEnabled != enabled)
+ {
+ mVariableRasterizationRateEnabled = enabled;
+ mDirtyBits.set(state::DIRTY_BIT_EXTENDED);
+ mExtendedDirtyBits.set(state::EXTENDED_DIRTY_BIT_VARIABLE_RASTERIZATION_RATE);
+ }
+}
+
+void PrivateState::setVariableRasterizationRateMap(GLMTLRasterizationRateMapANGLE map)
+{
+ if (mVariableRasterizationRateMap != map)
+ {
+ mVariableRasterizationRateMap = map;
+ mDirtyBits.set(state::DIRTY_BIT_EXTENDED);
+ mExtendedDirtyBits.set(state::EXTENDED_DIRTY_BIT_VARIABLE_RASTERIZATION_RATE);
+ }
+}
+
void PrivateState::setVertexAttribf(GLuint index, const GLfloat values[4])
{
ASSERT(static_cast<size_t>(index) < mVertexAttribCurrentValues.size());
@@ -1379,6 +1404,9 @@ void PrivateState::setEnableFeature(GLenum feature, bool enabled)
case GL_FETCH_PER_SAMPLE_ARM:
mFetchPerSample = enabled;
return;
+ case GL_VARIABLE_RASTERIZATION_RATE_ANGLE:
+ setVariableRasterizationRateEnabled(enabled);
+ return;
default:
break;
}
@@ -1545,6 +1573,8 @@ bool PrivateState::getEnableFeature(GLenum feature) const
return mShadingRatePreserveAspectRatio;
case GL_FETCH_PER_SAMPLE_ARM:
return mFetchPerSample;
+ case GL_VARIABLE_RASTERIZATION_RATE_ANGLE:
+ return mVariableRasterizationRateEnabled;
}
ASSERT(mClientVersion.major == 1);
@@ -3426,6 +3456,9 @@ void State::getPointerv(const Context *context, GLenum pname, void **params) con
context->vertexArrayIndex(ParamToVertexArrayType(pname))),
GL_VERTEX_ATTRIB_ARRAY_POINTER, params);
return;
+ case GL_METAL_RASTERIZATION_RATE_MAP_BINDING_ANGLE:
+ *params = privateState().getVariableRasterizationRateMap();
+ break;
default:
UNREACHABLE();
break;
diff --git a/src/libANGLE/State.h b/src/libANGLE/State.h
index a1ac0dd3075d43422336e74317c93c0106cb448f..f7bc28d978000abedfe9f71058dcc8d122d16106 100644
--- a/src/libANGLE/State.h
+++ b/src/libANGLE/State.h
@@ -180,6 +180,7 @@ enum ExtendedDirtyBitType
EXTENDED_DIRTY_BIT_LOGIC_OP_ENABLED, // ANGLE_logic_op
EXTENDED_DIRTY_BIT_LOGIC_OP, // ANGLE_logic_op
EXTENDED_DIRTY_BIT_BLEND_ADVANCED_COHERENT, // KHR_blend_operation_advanced_coherent
+ EXTENDED_DIRTY_BIT_VARIABLE_RASTERIZATION_RATE, // ANGLE_variable_rasterization_rate_metal
EXTENDED_DIRTY_BIT_INVALID,
EXTENDED_DIRTY_BIT_MAX = EXTENDED_DIRTY_BIT_INVALID,
@@ -475,6 +476,15 @@ class PrivateState : angle::NonCopyable
void setPixelLocalStorageActivePlanes(GLsizei n);
GLsizei getPixelLocalStorageActivePlanes() const { return mPixelLocalStorageActivePlanes; }
+ // GL_ANGLE_variable_rasterization_rate_metal
+ void setVariableRasterizationRateEnabled(bool enabled);
+ bool isVariableRasterizationRateEnabled() const { return mVariableRasterizationRateEnabled; }
+ void setVariableRasterizationRateMap(GLMTLRasterizationRateMapANGLE map);
+ GLMTLRasterizationRateMapANGLE getVariableRasterizationRateMap() const
+ {
+ return mVariableRasterizationRateMap;
+ }
+
// Line width state setter
void setLineWidth(GLfloat width);
float getLineWidth() const { return mLineWidth; }
@@ -702,6 +712,10 @@ class PrivateState : angle::NonCopyable
// GL_ANGLE_shader_pixel_local_storage
GLsizei mPixelLocalStorageActivePlanes;
+ // GL_ANGLE_variable_rasterization_rate_metal
+ bool mVariableRasterizationRateEnabled;
+ GLMTLRasterizationRateMapANGLE mVariableRasterizationRateMap;
+
// GLES1 emulation: state specific to GLES1
GLES1State mGLES1State;
diff --git a/src/libANGLE/capture/capture_gles_ext_autogen.cpp b/src/libANGLE/capture/capture_gles_ext_autogen.cpp
index 8fd39cbd8e1e15cd8b7142bf31b64719d0079c7e..de5bee2e6af92a11b68a9a60ac84f5bcf3f278a8 100644
--- a/src/libANGLE/capture/capture_gles_ext_autogen.cpp
+++ b/src/libANGLE/capture/capture_gles_ext_autogen.cpp
@@ -5164,6 +5164,18 @@ CallCapture CaptureGetTranslatedShaderSourceANGLE(const State &glState,
return CallCapture(angle::EntryPoint::GLGetTranslatedShaderSourceANGLE, std::move(paramBuffer));
}
+CallCapture CaptureBindMetalRasterizationRateMapANGLE(const State &glState,
+ bool isCallValid,
+ GLMTLRasterizationRateMapANGLE map)
+{
+ ParamBuffer paramBuffer;
+
+ paramBuffer.addValueParam("map", ParamType::TGLMTLRasterizationRateMapANGLE, map);
+
+ return CallCapture(angle::EntryPoint::GLBindMetalRasterizationRateMapANGLE,
+ std::move(paramBuffer));
+}
+
CallCapture CaptureAcquireTexturesANGLE(const State &glState,
bool isCallValid,
GLuint numTextures,
diff --git a/src/libANGLE/capture/capture_gles_ext_autogen.h b/src/libANGLE/capture/capture_gles_ext_autogen.h
index e06b394709e2e712312c3596cd51f1465f705c07..14a484d89f89e79a03d18b463082ce069fa39cdc 100644
--- a/src/libANGLE/capture/capture_gles_ext_autogen.h
+++ b/src/libANGLE/capture/capture_gles_ext_autogen.h
@@ -993,6 +993,11 @@ angle::CallCapture CaptureGetTranslatedShaderSourceANGLE(const State &glState,
GLsizei *length,
GLchar *source);
+// GL_ANGLE_variable_rasterization_rate_metal
+angle::CallCapture CaptureBindMetalRasterizationRateMapANGLE(const State &glState,
+ bool isCallValid,
+ GLMTLRasterizationRateMapANGLE map);
+
// GL_ANGLE_vulkan_image
angle::CallCapture CaptureAcquireTexturesANGLE(const State &glState,
bool isCallValid,
diff --git a/src/libANGLE/features.h b/src/libANGLE/features.h
index a6fe076c72d043dba3fc347bf020ebf8ec895f51..add46e99c91d19bbd790d2de0d8768b8953d633e 100644
--- a/src/libANGLE/features.h
+++ b/src/libANGLE/features.h
@@ -44,4 +44,11 @@
# define ANGLE_PROGRAM_LINK_VALIDATE_UNIFORM_PRECISION 1
#endif
+// Lose context on Metal command queue error
+// ENABLED check Metal command buffer status on completion for error and lose context on error.
+// DISABLED Metal backed contexts are never lost.
+#if !defined(ANGLE_METAL_LOSE_CONTEXT_ON_ERROR)
+# define ANGLE_METAL_LOSE_CONTEXT_ON_ERROR ANGLE_ENABLED
+#endif
+
#endif // LIBANGLE_FEATURES_H_
diff --git a/src/libANGLE/formatutils.cpp b/src/libANGLE/formatutils.cpp
index 8068c7dd1fbc62d2177b771b583f24a3d81084b3..9de76b5ee42b6026cec4662daff6e35445477735 100644
--- a/src/libANGLE/formatutils.cpp
+++ b/src/libANGLE/formatutils.cpp
@@ -592,7 +592,8 @@ static GLenum EquivalentBlitInternalFormat(GLenum internalformat)
// sized, even if there is a swizzle (for example, blitting from a
// multisampled RGBA8 renderbuffer to a BGRA8 texture). This could
// be expanded and/or autogenerated if that is found necessary.
- if (internalformat == GL_BGRA8_EXT || internalformat == GL_BGRA8_SRGB_ANGLEX)
+ if (internalformat == GL_SRGB8_ALPHA8_EXT || internalformat == GL_BGRA8_EXT ||
+ internalformat == GL_BGRA8_SRGB_ANGLEX)
{
return GL_RGBA8;
}
diff --git a/src/libANGLE/gles_extensions_autogen.cpp b/src/libANGLE/gles_extensions_autogen.cpp
index 08d6416ee0ff64ae1db4bd0b61df3fe48856df20..56138198776d6dac1139f69a05c161629a11b80b 100644
--- a/src/libANGLE/gles_extensions_autogen.cpp
+++ b/src/libANGLE/gles_extensions_autogen.cpp
@@ -270,6 +270,7 @@ const ExtensionInfoMap &GetExtensionInfoMap()
map["GL_ANGLE_texture_external_update"] = enableableExtension(&Extensions::textureExternalUpdateANGLE);
map["GL_ANGLE_texture_multisample"] = enableableExtension(&Extensions::textureMultisampleANGLE);
map["GL_ANGLE_texture_rectangle"] = enableableDisablableExtension(&Extensions::textureRectangleANGLE);
+ map["GL_ANGLE_variable_rasterization_rate_metal"] = enableableExtension(&Extensions::variableRasterizationRateMetalANGLE);
map["GL_ANGLE_vulkan_image"] = enableableExtension(&Extensions::vulkanImageANGLE);
map["GL_ANGLE_webgl_compatibility"] = esOnlyExtension(&Extensions::webglCompatibilityANGLE);
map["GL_ANGLE_yuv_internal_format"] = enableableExtension(&Extensions::yuvInternalFormatANGLE);
diff --git a/src/libANGLE/gles_extensions_autogen.h b/src/libANGLE/gles_extensions_autogen.h
index d3f6ae8aefceec8ff7db974ad0dbdb817bb8d8ed..b4e6567fbcd47295c30ee84a1696667a5ee05af7 100644
--- a/src/libANGLE/gles_extensions_autogen.h
+++ b/src/libANGLE/gles_extensions_autogen.h
@@ -770,6 +770,9 @@ struct Extensions
// GL_ANGLE_texture_rectangle
bool textureRectangleANGLE = false;
+ // GL_ANGLE_variable_rasterization_rate_metal
+ bool variableRasterizationRateMetalANGLE = false;
+
// GL_ANGLE_vulkan_image
bool vulkanImageANGLE = false;
diff --git a/src/libANGLE/renderer/ContextImpl.cpp b/src/libANGLE/renderer/ContextImpl.cpp
index dea6f2f500ee89410847e205d2b86eae4a5a2f1f..23d5d18b7c00186a7bf5a6a657c87f3494f3038a 100644
--- a/src/libANGLE/renderer/ContextImpl.cpp
+++ b/src/libANGLE/renderer/ContextImpl.cpp
@@ -124,4 +124,13 @@ angle::Result ContextImpl::drawPixelLocalStorageEXTDisable(gl::Context *,
UNREACHABLE();
return angle::Result::Stop;
}
+
+angle::Result ContextImpl::bindMetalRasterizationRateMap(gl::Context *,
+ RenderbufferImpl *renderbuffer,
+ GLMTLRasterizationRateMapANGLE map)
+{
+ UNREACHABLE();
+ return angle::Result::Stop;
+}
+
} // namespace rx
diff --git a/src/libANGLE/renderer/ContextImpl.h b/src/libANGLE/renderer/ContextImpl.h
index ec84d044755d61e14353fb32735a7d13a60d19dd..c3f918bb49ca3d10bcd767079e8c6f7e77dbc042 100644
--- a/src/libANGLE/renderer/ContextImpl.h
+++ b/src/libANGLE/renderer/ContextImpl.h
@@ -298,6 +298,11 @@ class ContextImpl : public GLImplFactory
const gl::PixelLocalStoragePlane[],
const GLenum storeops[]);
+ // GL_ANGLE_variable_rasterization_rate_metal
+ virtual angle::Result bindMetalRasterizationRateMap(gl::Context *,
+ RenderbufferImpl *renderbuffer,
+ GLMTLRasterizationRateMapANGLE map);
+
protected:
const gl::State &mState;
gl::MemoryProgramCache *mMemoryProgramCache;
diff --git a/src/libANGLE/renderer/gl/FunctionsGL.cpp b/src/libANGLE/renderer/gl/FunctionsGL.cpp
index 9d8c7a4f4be3f1afd54163e2aacb12b9a832664e..9c3661be5fb3f51c15404bad23a1942a9eb2a6a4 100644
--- a/src/libANGLE/renderer/gl/FunctionsGL.cpp
+++ b/src/libANGLE/renderer/gl/FunctionsGL.cpp
@@ -53,7 +53,8 @@ static std::vector<std::string> GetIndexedExtensions(PFNGLGETINTEGERVPROC getInt
for (GLint i = 0; i < numExtensions; i++)
{
- result.push_back(reinterpret_cast<const char *>(getStringIFunction(GL_EXTENSIONS, i)));
+ if (const char* extensionString = reinterpret_cast<const char *>(getStringIFunction(GL_EXTENSIONS, i)))
+ result.push_back(extensionString);
}
return result;
diff --git a/src/libANGLE/renderer/gl/StateManagerGL.cpp b/src/libANGLE/renderer/gl/StateManagerGL.cpp
index af3dbcec1bc5b30dde37e666446ca9cec2301239..fd82127caebb53e95be778518dbc748be917f6bc 100644
--- a/src/libANGLE/renderer/gl/StateManagerGL.cpp
+++ b/src/libANGLE/renderer/gl/StateManagerGL.cpp
@@ -2492,6 +2492,8 @@ angle::Result StateManagerGL::syncState(const gl::Context *context,
break;
case gl::state::EXTENDED_DIRTY_BIT_BLEND_ADVANCED_COHERENT:
setBlendAdvancedCoherent(state.isBlendAdvancedCoherentEnabled());
+ case gl::state::EXTENDED_DIRTY_BIT_VARIABLE_RASTERIZATION_RATE:
+ // Unimplemented extensions.
break;
default:
UNREACHABLE();
diff --git a/src/libANGLE/renderer/metal/BufferMtl.mm b/src/libANGLE/renderer/metal/BufferMtl.mm
index 398e6d3e3809da8b0d7ed81458a8f5b752433b16..4689f7484593f8654680d2650d8903324771ecb3 100644
--- a/src/libANGLE/renderer/metal/BufferMtl.mm
+++ b/src/libANGLE/renderer/metal/BufferMtl.mm
@@ -390,7 +390,7 @@ ConversionBufferMtl *BufferMtl::getUniformConversionBuffer(ContextMtl *context,
{
if (buffer.offset.second <= offset.second &&
(offset.second - buffer.offset.second) % buffer.uniformBufferBlockSize == 0)
- return &buffer;
+ return static_cast<ConversionBufferMtl *>(&buffer);
}
}
diff --git a/src/libANGLE/renderer/metal/ContextMtl.h b/src/libANGLE/renderer/metal/ContextMtl.h
index acdd008c5424d3ab67df0ffe384bb459143348a1..7283095e00b5c260f276c497de5d53d1de27d2b9 100644
--- a/src/libANGLE/renderer/metal/ContextMtl.h
+++ b/src/libANGLE/renderer/metal/ContextMtl.h
@@ -272,6 +272,10 @@ class ContextMtl : public ContextImpl, public mtl::Context
angle::Result memoryBarrier(const gl::Context *context, GLbitfield barriers) override;
angle::Result memoryBarrierByRegion(const gl::Context *context, GLbitfield barriers) override;
+ angle::Result bindMetalRasterizationRateMap(gl::Context *context,
+ RenderbufferImpl *renderbuffer,
+ GLMTLRasterizationRateMapANGLE map) override;
+
// override mtl::ErrorHandler
void handleError(GLenum error,
const char *message,
@@ -555,6 +559,7 @@ class ContextMtl : public ContextImpl, public mtl::Context
DIRTY_BIT_RENDER_PIPELINE,
DIRTY_BIT_UNIFORM_BUFFERS_BINDING,
DIRTY_BIT_RASTERIZER_DISCARD,
+ DIRTY_BIT_VARIABLE_RASTERIZATION_RATE,
DIRTY_BIT_INVALID,
DIRTY_BIT_MAX = DIRTY_BIT_INVALID,
@@ -649,6 +654,9 @@ class ContextMtl : public ContextImpl, public mtl::Context
IncompleteTextureSet mIncompleteTextures;
ProvokingVertexHelper mProvokingVertexHelper;
+ mtl::RasterizationRateMapRef mRasterizationRateMap;
+ id<MTLTexture> mRasterizationRateMapTexture;
+
mtl::ContextDevice mContextDevice;
};
diff --git a/src/libANGLE/renderer/metal/ContextMtl.mm b/src/libANGLE/renderer/metal/ContextMtl.mm
index 62a9482ecc478b65431fe323e0e219b0d90fe101..3b53d1e9e38e74c28f66ecd67f4233eebb0a8ab4 100644
--- a/src/libANGLE/renderer/metal/ContextMtl.mm
+++ b/src/libANGLE/renderer/metal/ContextMtl.mm
@@ -263,6 +263,8 @@ void ContextMtl::onDestroy(const gl::Context *context)
mIncompleteTextures.onDestroy(context);
mProvokingVertexHelper.onDestroy(this);
mDummyXFBRenderTexture = nullptr;
+ mRasterizationRateMap.reset();
+ mRasterizationRateMapTexture = nil;
mContextDevice.reset();
}
@@ -1084,6 +1086,13 @@ angle::Result ContextMtl::multiDrawElementsInstancedBaseVertexBaseInstance(
// Device loss
gl::GraphicsResetStatus ContextMtl::getResetStatus()
{
+#if ANGLE_METAL_LOSE_CONTEXT_ON_ERROR == ANGLE_ENABLED
+ if (cmdQueue().isDeviceLost())
+ {
+ return gl::GraphicsResetStatus::UnknownContextReset;
+ }
+#endif
+
return gl::GraphicsResetStatus::NoError;
}
@@ -1425,6 +1434,9 @@ void ContextMtl::updateExtendedState(const gl::State &glState,
case gl::state::EXTENDED_DIRTY_BIT_POLYGON_OFFSET_LINE_ENABLED:
mDirtyBits.set(DIRTY_BIT_DEPTH_BIAS);
break;
+ case gl::state::EXTENDED_DIRTY_BIT_VARIABLE_RASTERIZATION_RATE:
+ mDirtyBits.set(DIRTY_BIT_VARIABLE_RASTERIZATION_RATE);
+ break;
default:
break;
}
@@ -1675,6 +1687,36 @@ angle::Result ContextMtl::memoryBarrierByRegion(const gl::Context *context, GLbi
return angle::Result::Stop;
}
+angle::Result ContextMtl::bindMetalRasterizationRateMap(gl::Context *context,
+ RenderbufferImpl *renderbuffer,
+ GLMTLRasterizationRateMapANGLE map)
+{
+ id<MTLRasterizationRateMap> rateMap = (__bridge id<MTLRasterizationRateMap>)(map);
+ if (rateMap && rateMap.device != mContextDevice.get())
+ {
+ return angle::Result::Stop;
+ }
+
+ if (auto *metalRenderbuffer = static_cast<RenderbufferMtl*>(renderbuffer))
+ {
+ FramebufferAttachmentRenderTarget *rtOut = nullptr;
+ gl::ImageIndex index;
+ GLenum binding = 0;
+ if (angle::Result::Continue == metalRenderbuffer->getAttachmentRenderTarget(context, binding, index, 1, &rtOut))
+ {
+ if (auto *renderTargetMetal = static_cast<RenderTargetMtl*>(rtOut))
+ {
+ mtl::RenderPassAttachmentDesc desc;
+ renderTargetMetal->toRenderPassAttachmentDesc(&desc);
+ mRasterizationRateMapTexture = desc.hasImplicitMSTexture() ? desc.implicitMSTexture.get()->get() : desc.texture.get()->get();
+ }
+ }
+ }
+
+ mRasterizationRateMap = std::move(rateMap);
+ return angle::Result::Continue;
+}
+
// override mtl::ErrorHandler
void ContextMtl::handleError(GLenum glErrorCode,
const char *message,
@@ -2531,8 +2573,22 @@ angle::Result ContextMtl::setupDraw(const gl::Context *context,
return angle::Result::Continue;
}
// Setup with flushed state should either produce a working encoder or fail with an error
- // result.
- ASSERT(mRenderEncoder.valid());
+ // result. if that's not the case, something's gone seriously wrong. Try to
+ // recover from the error by bailing out of the draw call, and finishing the command buffer.
+ // This will result in an unfinished / corrupted draw, but will avoid a browser/GPU process
+ // crash.
+ if (ANGLE_UNLIKELY(!mRenderEncoder.valid() || !mRenderEncoder.hasPipelineState()))
+ {
+ // Completely flush the command buffer, waiting synchronously.
+ flushCommandBuffer(mtl::WaitUntilFinished);
+ // Invalidate all state
+ invalidateState(context);
+ // Return fail, and drop the draw call. This is
+ // a worst case scenario. If in a debug roots situation,
+ // we should try to catch the call stack.
+ ERR() << "Draw call is unusable - please report a bug on bugs.webkit.org";
+ return angle::Result::Stop;
+ }
}
return angle::Result::Continue;
}
@@ -2641,10 +2697,10 @@ angle::Result ContextMtl::setupDrawImpl(const gl::Context *context,
mState.getBlendColor().blue, mState.getBlendColor().alpha);
break;
case DIRTY_BIT_VIEWPORT:
- mRenderEncoder.setViewport(mViewport);
+ mRenderEncoder.setViewport(mViewport, mRenderEncoder.rasterizationRateMapForPass(mRasterizationRateMap, mRasterizationRateMapTexture));
break;
case DIRTY_BIT_SCISSOR:
- mRenderEncoder.setScissorRect(mScissorRect);
+ mRenderEncoder.setScissorRect(mScissorRect, mRenderEncoder.rasterizationRateMapForPass(mRasterizationRateMap, mRasterizationRateMapTexture));
break;
case DIRTY_BIT_DRAW_FRAMEBUFFER:
// Already handled.
@@ -2669,6 +2725,12 @@ angle::Result ContextMtl::setupDrawImpl(const gl::Context *context,
case DIRTY_BIT_RASTERIZER_DISCARD:
// Already handled.
break;
+ case DIRTY_BIT_VARIABLE_RASTERIZATION_RATE:
+ if (getState().privateState().isVariableRasterizationRateEnabled() && mRasterizationRateMap)
+ {
+ mRenderEncoder.setRasterizationRateMap(mRenderEncoder.rasterizationRateMapForPass(mRasterizationRateMap, mRasterizationRateMapTexture));
+ }
+ break;
default:
UNREACHABLE();
break;
diff --git a/src/libANGLE/renderer/metal/DisplayMtl.h b/src/libANGLE/renderer/metal/DisplayMtl.h
index 16ae6340e37283bcd49e8ea926f75a1f6f17f1d6..34aadf0c7e20c05ab4c6791ba412ae2ab120b14a 100644
--- a/src/libANGLE/renderer/metal/DisplayMtl.h
+++ b/src/libANGLE/renderer/metal/DisplayMtl.h
@@ -142,6 +142,7 @@ class DisplayMtl : public DisplayImpl
bool supportsMetal2_2() const;
bool supportsDepth24Stencil8PixelFormat() const;
bool supports32BitFloatFiltering() const;
+ bool supportsVariableRasterizationRate() const;
bool isAMD() const;
bool isAMDBronzeDriver() const;
bool isAMDFireProDevice() const;
diff --git a/src/libANGLE/renderer/metal/DisplayMtl.mm b/src/libANGLE/renderer/metal/DisplayMtl.mm
index 7a7e4c63faf11767e36ef22168c355a94e5145d6..16e834f2a09b3487e7c68ba19f1324b07621e34e 100644
--- a/src/libANGLE/renderer/metal/DisplayMtl.mm
+++ b/src/libANGLE/renderer/metal/DisplayMtl.mm
@@ -184,12 +184,22 @@ void DisplayMtl::terminate()
bool DisplayMtl::testDeviceLost()
{
+#if ANGLE_METAL_LOSE_CONTEXT_ON_ERROR == ANGLE_ENABLED
+ return mCmdQueue.isDeviceLost();
+#else
return false;
+#endif
}
egl::Error DisplayMtl::restoreLostDevice(const egl::Display *display)
{
+#if ANGLE_METAL_LOSE_CONTEXT_ON_ERROR == ANGLE_ENABLED
+ // A Metal device cannot be restored, the entire context would have to be
+ // re-created along with any other EGL objects that reference it.
+ return egl::EglBadDisplay();
+#else
return egl::NoError();
+#endif
}
std::string DisplayMtl::getRendererDescription()
@@ -1179,6 +1189,10 @@ void DisplayMtl::initializeExtensions() const
mNativeCaps.maxImageUnits = gl::IMPLEMENTATION_MAX_PIXEL_LOCAL_STORAGE_PLANES;
}
}
+
+ // GL_ANGLE_variable_rasterization_rate_metal
+ mNativeExtensions.variableRasterizationRateMetalANGLE = mFeatures.hasVariableRasterizationRate.enabled;
+
// "The GPUs in Apple3 through Apple8 families only support memory barriers for compute command
// encoders, and for vertex-to-vertex and vertex-to-fragment stages of render command encoders."
mHasFragmentMemoryBarriers = !supportsAppleGPUFamily(3);
@@ -1251,6 +1265,8 @@ void DisplayMtl::initializeFeatures()
supportsMetal2_1() && (isOSX || isCatalyst) && !isARM);
ANGLE_FEATURE_CONDITION((&mFeatures), hasDepthAutoResolve, supportsEitherGPUFamily(3, 2));
ANGLE_FEATURE_CONDITION((&mFeatures), hasStencilAutoResolve, supportsEitherGPUFamily(5, 2));
+ ANGLE_FEATURE_CONDITION((&mFeatures), hasVariableRasterizationRate,
+ supportsVariableRasterizationRate());
ANGLE_FEATURE_CONDITION((&mFeatures), allowMultisampleStoreAndResolve,
supportsEitherGPUFamily(3, 1));
@@ -1441,8 +1457,7 @@ bool DisplayMtl::supportsMetal2_2() const
bool DisplayMtl::supports32BitFloatFiltering() const
{
#if (defined(__MAC_11_0) && __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_11_0) || \
- (defined(__IPHONE_14_0) && __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_14_0) || \
- (defined(__TVOS_14_0) && __TV_OS_VERSION_MIN_REQUIRED >= __TVOS_14_0)
+ (defined(__IPHONE_14_0) && __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_14_0)
if (@available(ios 14.0, macOS 11.0, *))
{
return [mMetalDevice supports32BitFloatFiltering];
@@ -1462,6 +1477,17 @@ bool DisplayMtl::supportsDepth24Stencil8PixelFormat() const
return false;
#endif
}
+
+bool DisplayMtl::supportsVariableRasterizationRate() const
+{
+ if (@available(ios 13.0, macOS 10.15.4, macCatalyst 13.4, tvOS 16.0, *))
+ {
+ return [mMetalDevice supportsRasterizationRateMapWithLayerCount:1];
+ }
+
+ return false;
+}
+
bool DisplayMtl::isAMD() const
{
return angle::IsAMD(mMetalDeviceVendorId);
diff --git a/src/libANGLE/renderer/metal/FrameBufferMtl.mm b/src/libANGLE/renderer/metal/FrameBufferMtl.mm
index b58d7f9d67932bb582c149623aca5054c53333e7..c61d5f65d4e9b6cc85eae02d42f751813e7f796a 100644
--- a/src/libANGLE/renderer/metal/FrameBufferMtl.mm
+++ b/src/libANGLE/renderer/metal/FrameBufferMtl.mm
@@ -1685,8 +1685,13 @@ angle::Result FramebufferMtl::readPixelsToPBO(const gl::Context *context,
ContextMtl *contextMtl = mtl::GetImpl(context);
- ANGLE_MTL_CHECK(contextMtl, packPixelsParams.offset <= std::numeric_limits<uint32_t>::max(),
+ if constexpr (sizeof(packPixelsParams.offset) > sizeof(uint32_t))
+ {
+ ANGLE_MTL_CHECK(contextMtl,
+ static_cast<std::make_unsigned_t<decltype(packPixelsParams.offset)>>(
+ packPixelsParams.offset) <= std::numeric_limits<uint32_t>::max(),
GL_INVALID_OPERATION);
+ }
uint32_t offset = static_cast<uint32_t>(packPixelsParams.offset);
BufferMtl *packBufferMtl = mtl::GetImpl(packPixelsParams.packBuffer);
diff --git a/src/libANGLE/renderer/metal/ImageMtl.mm b/src/libANGLE/renderer/metal/ImageMtl.mm
index a4a809fabe7572c1d212ff8fb4da35b1f67b6a01..eb2bd204b9edda65ba372b8fcb24f8092b9f4f65 100644
--- a/src/libANGLE/renderer/metal/ImageMtl.mm
+++ b/src/libANGLE/renderer/metal/ImageMtl.mm
@@ -86,7 +86,9 @@ egl::Error TextureImageSiblingMtl::ValidateClientBuffer(const DisplayMtl *displa
return egl::EglBadAttribute() << "Unrecognized format";
}
- if (format.metalFormat != texture.pixelFormat)
+ angle::FormatID srcAngleFormatId = mtl::Format::MetalToAngleFormatID(texture.pixelFormat);
+ const mtl::Format &srcFormat = display->getPixelFormat(srcAngleFormatId);
+ if (!format.isViewCompatible(srcFormat))
{
return egl::EglBadAttribute() << "Incompatible format";
}
@@ -120,18 +122,21 @@ angle::Result TextureImageSiblingMtl::initImpl(DisplayMtl *displayMtl)
{
mNativeTexture = mtl::Texture::MakeFromMetal((__bridge id<MTLTexture>)(mBuffer));
- if (mNativeTexture->textureType() == MTLTextureType2DArray)
+ angle::FormatID angleFormatId = intendedFormatForMTLTexture(mNativeTexture->get(), mAttribs);
+ mFormat = displayMtl->getPixelFormat(angleFormatId);
+
+ if (mNativeTexture->textureType() == MTLTextureType2DArray ||
+ mNativeTexture->pixelFormat() != mFormat.metalFormat)
{
mtl::TextureRef baseTexture = std::move(mNativeTexture);
unsigned textureArraySlice =
static_cast<unsigned>(mAttribs.getAsInt(EGL_METAL_TEXTURE_ARRAY_SLICE_ANGLE, 0));
mNativeTexture =
- baseTexture->createSliceMipView(textureArraySlice, mtl::kZeroNativeMipLevel);
+ baseTexture->createSliceMipViewWithCompatibleFormat(textureArraySlice,
+ mtl::kZeroNativeMipLevel,
+ mFormat.metalFormat);
}
- angle::FormatID angleFormatId = intendedFormatForMTLTexture(mNativeTexture->get(), mAttribs);
- mFormat = displayMtl->getPixelFormat(angleFormatId);
-
if (mNativeTexture)
{
size_t resourceSize = EstimateTextureSizeInBytes(
diff --git a/src/libANGLE/renderer/metal/ProgramExecutableMtl.mm b/src/libANGLE/renderer/metal/ProgramExecutableMtl.mm
index d86b83a770764255b12733bf52505db510dac5ac..1fb577f4777bbd6c78046ab64461a99437fb32fa 100644
--- a/src/libANGLE/renderer/metal/ProgramExecutableMtl.mm
+++ b/src/libANGLE/renderer/metal/ProgramExecutableMtl.mm
@@ -897,7 +897,7 @@ angle::Result ProgramExecutableMtl::setupDraw(const gl::Context *glContext,
{
ContextMtl *context = mtl::GetImpl(glContext);
- if (pipelineDescChanged)
+ if (pipelineDescChanged || !cmdEncoder->hasPipelineState())
{
id<MTLFunction> vertexShader = nil;
ANGLE_TRY(
diff --git a/src/libANGLE/renderer/metal/SurfaceMtl.mm b/src/libANGLE/renderer/metal/SurfaceMtl.mm
index 1089fb59517f0c50d055275a66992dda7f380e5f..1c1e2b823d9a4c1340fabb9dff87e8b60993e015 100644
--- a/src/libANGLE/renderer/metal/SurfaceMtl.mm
+++ b/src/libANGLE/renderer/metal/SurfaceMtl.mm
@@ -686,8 +686,7 @@ angle::Result WindowSurfaceMtl::obtainNextDrawable(const gl::Context *context)
mColorTexture->set(mCurrentDrawable.get().texture);
}
- ANGLE_MTL_LOG("Current metal drawable size=%d,%d", mColorTexture->width(),
- mColorTexture->height());
+ ANGLE_MTL_LOG("Current metal drawable size=%d,%d", mColorTexture->width(mtl::MipmapNativeLevel(0)), mColorTexture->height(mtl::MipmapNativeLevel(0)));
// Now we have to resize depth stencil buffers if required.
ANGLE_TRY(ensureCompanionTexturesSizeCorrect(context));
diff --git a/src/libANGLE/renderer/metal/VertexArrayMtl.mm b/src/libANGLE/renderer/metal/VertexArrayMtl.mm
index d93f10afc07d12b88cd234e569fa658a1fbf6ad2..24fc07ff9b0e8294d972e7623173b9d47ff49679 100644
--- a/src/libANGLE/renderer/metal/VertexArrayMtl.mm
+++ b/src/libANGLE/renderer/metal/VertexArrayMtl.mm
@@ -1084,16 +1084,23 @@ angle::Result VertexArrayMtl::convertVertexBufferGPU(const gl::Context *glContex
ANGLE_TRY(conversion->data.allocate(contextMtl, numVertices * targetStride, nullptr, &newBuffer,
&newBufferOffset));
- ANGLE_CHECK_GL_MATH(contextMtl, binding.getOffset() <= std::numeric_limits<uint32_t>::max());
+ GLintptr bindingOffset = binding.getOffset();
+
+ if constexpr (sizeof(bindingOffset) > sizeof(uint32_t))
+ ANGLE_CHECK_GL_MATH(contextMtl, static_cast<std::make_unsigned_t<decltype(bindingOffset)>>(
+ bindingOffset) <= std::numeric_limits<uint32_t>::max());
ANGLE_CHECK_GL_MATH(contextMtl, newBufferOffset <= std::numeric_limits<uint32_t>::max());
ANGLE_CHECK_GL_MATH(contextMtl, numVertices <= std::numeric_limits<uint32_t>::max());
mtl::VertexFormatConvertParams params;
VertexConversionBufferMtl *vertexConversion =
static_cast<VertexConversionBufferMtl *>(conversion);
+ if constexpr (sizeof(vertexConversion->offset) > sizeof(uint32_t))
+ ANGLE_CHECK_GL_MATH(contextMtl,
+ vertexConversion->offset <= std::numeric_limits<uint32_t>::max());
params.srcBuffer = srcBuffer->getCurrentBuffer();
- params.srcBufferStartOffset = static_cast<uint32_t>(
- MIN(static_cast<GLintptr>(vertexConversion->offset), binding.getOffset()));
+ params.srcBufferStartOffset = std::min(static_cast<uint32_t>(vertexConversion->offset),
+ static_cast<uint32_t>(bindingOffset));
params.srcStride = binding.getStride();
params.srcDefaultAlphaData = convertedFormat.defaultAlpha;
diff --git a/src/libANGLE/renderer/metal/mtl_command_buffer.h b/src/libANGLE/renderer/metal/mtl_command_buffer.h
index 7cf68b2d13a8b04fffc57d6223a8b60c7c0df010..0bbd15bd77be43272d8b8542a76926e544af59e8 100644
--- a/src/libANGLE/renderer/metal/mtl_command_buffer.h
+++ b/src/libANGLE/renderer/metal/mtl_command_buffer.h
@@ -104,6 +104,8 @@ class CommandQueue final : public WrappedObject<id<MTLCommandQueue>>, angle::Non
bool isTimeElapsedEntryComplete(uint64_t id);
double getTimeElapsedEntryInSeconds(uint64_t id);
+ bool isDeviceLost() const { return mIsDeviceLost; }
+
private:
void onCommandBufferCompleted(id<MTLCommandBuffer> buf,
uint64_t serial,
@@ -146,6 +148,8 @@ class CommandQueue final : public WrappedObject<id<MTLCommandQueue>>, angle::Non
void recordCommandBufferTimeElapsed(std::lock_guard<std::mutex> &lg,
uint64_t id,
double seconds);
+
+ std::atomic_bool mIsDeviceLost = false;
};
class CommandBuffer final : public WrappedObject<id<MTLCommandBuffer>>, angle::NonCopyable
@@ -426,8 +430,10 @@ class RenderCommandEncoder final : public CommandEncoder
RenderCommandEncoder &setStencilRefVals(uint32_t frontRef, uint32_t backRef);
RenderCommandEncoder &setStencilRefVal(uint32_t ref);
- RenderCommandEncoder &setViewport(const MTLViewport &viewport);
- RenderCommandEncoder &setScissorRect(const MTLScissorRect &rect);
+ RenderCommandEncoder &setViewport(const MTLViewport &viewport,
+ id<MTLRasterizationRateMap> map);
+ RenderCommandEncoder &setScissorRect(const MTLScissorRect &rect,
+ id<MTLRasterizationRateMap> map);
RenderCommandEncoder &setBlendColor(float r, float g, float b, float a);
@@ -576,6 +582,8 @@ class RenderCommandEncoder final : public CommandEncoder
RenderCommandEncoder &setDepthLoadAction(MTLLoadAction action, double clearValue);
RenderCommandEncoder &setStencilLoadAction(MTLLoadAction action, uint32_t clearValue);
+ RenderCommandEncoder &setRasterizationRateMap(id<MTLRasterizationRateMap> map);
+
void setLabel(NSString *label);
void pushDebugGroup(NSString *label) override;
@@ -583,8 +591,11 @@ class RenderCommandEncoder final : public CommandEncoder
const RenderPassDesc &renderPassDesc() const { return mRenderPassDesc; }
bool hasDrawCalls() const { return mHasDrawCalls; }
+ bool hasPipelineState() const { return mPipelineStateSet; }
uint64_t getSerial() const { return mSerial; }
+ id<MTLRasterizationRateMap> rasterizationRateMapForPass(id<MTLRasterizationRateMap> map,
+ id<MTLTexture> colorTexture) const;
private:
// Override CommandEncoder
diff --git a/src/libANGLE/renderer/metal/mtl_command_buffer.mm b/src/libANGLE/renderer/metal/mtl_command_buffer.mm
index 8399d093b04c1d70276219097c0f38a77f17ac0f..1d08dff9d8d2f0f2dd567145a1a5ea095f41760d 100644
--- a/src/libANGLE/renderer/metal/mtl_command_buffer.mm
+++ b/src/libANGLE/renderer/metal/mtl_command_buffer.mm
@@ -373,12 +373,20 @@ inline void SetVisibilityResultModeCmd(id<MTLRenderCommandEncoder> encoder,
[encoder setVisibilityResultMode:mode offset:offset];
}
+#if (defined(__MAC_13_0) && __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_13_0) || \
+ (defined(__IPHONE_16_0) && __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_16_0)
+# define ANGLE_MTL_USE_RESOURCE_USAGE_DEPRECATED 1
+#endif
+
inline void UseResourceCmd(id<MTLRenderCommandEncoder> encoder, IntermediateCommandStream *stream)
{
id<MTLResource> resource = stream->fetch<id<MTLResource>>();
MTLResourceUsage usage = stream->fetch<MTLResourceUsage>();
mtl::RenderStages stages = stream->fetch<mtl::RenderStages>();
ANGLE_UNUSED_VARIABLE(stages);
+#if ANGLE_MTL_USE_RESOURCE_USAGE_DEPRECATED
+ [encoder useResource:resource usage:usage stages:stages];
+#else
#if defined(__IPHONE_13_0) || defined(__MAC_10_15)
if (ANGLE_APPLE_AVAILABLE_XCI(10.15, 13.1, 13.0))
{
@@ -391,6 +399,7 @@ inline void UseResourceCmd(id<MTLRenderCommandEncoder> encoder, IntermediateComm
[encoder useResource:resource usage:usage];
ANGLE_APPLE_ALLOW_DEPRECATED_END
}
+#endif
[resource ANGLE_MTL_RELEASE];
}
@@ -644,6 +653,20 @@ void CommandQueue::onCommandBufferCompleted(id<MTLCommandBuffer> buf,
ANGLE_MTL_LOG("Completed MTLCommandBuffer %llu:%p", serial, buf);
+ MTLCommandBufferStatus status = buf.status;
+ if (status != MTLCommandBufferStatusCompleted)
+ {
+ NSError *error = buf.error;
+ // MTLCommandBufferErrorNotPermitted is non-fatal, all other errors
+ // result in device lost.
+ // TODO(djg): Should this also check error.domain for MTLCommandBufferErrorDomain?
+ mIsDeviceLost = !error || error.code != MTLCommandBufferErrorNotPermitted;
+ if (mIsDeviceLost)
+ {
+ return;
+ }
+ }
+
if (timeElapsedEntry != 0)
{
// Record this command buffer's elapsed time.
@@ -1362,6 +1385,7 @@ void RenderCommandEncoder::reset()
CommandEncoder::reset();
mRecording = false;
mPipelineStateSet = false;
+ setRasterizationRateMap(nil);
mCommands.clear();
}
@@ -1776,7 +1800,8 @@ RenderCommandEncoder &RenderCommandEncoder::setStencilRefVal(uint32_t ref)
return setStencilRefVals(ref, ref);
}
-RenderCommandEncoder &RenderCommandEncoder::setViewport(const MTLViewport &viewport)
+RenderCommandEncoder &RenderCommandEncoder::setViewport(const MTLViewport &viewport,
+ id<MTLRasterizationRateMap> map)
{
if (mStateCache.viewport.valid() && mStateCache.viewport.value() == viewport)
{
@@ -1789,12 +1814,22 @@ RenderCommandEncoder &RenderCommandEncoder::setViewport(const MTLViewport &viewp
return *this;
}
-RenderCommandEncoder &RenderCommandEncoder::setScissorRect(const MTLScissorRect &rect)
+RenderCommandEncoder &RenderCommandEncoder::setScissorRect(const MTLScissorRect &rect, id<MTLRasterizationRateMap> map)
{
+ auto maxScissorRect =
+ MTLCoordinate2DMake(mRenderPassMaxScissorRect.width, mRenderPassMaxScissorRect.height);
+
+ if (map)
+ {
+ maxScissorRect = [map mapPhysicalToScreenCoordinates:maxScissorRect forLayer:0];
+ if (!(rect.width * rect.height))
+ return *this;
+ }
+
NSUInteger clampedWidth =
- rect.x > mRenderPassMaxScissorRect.width ? 0 : mRenderPassMaxScissorRect.width - rect.x;
+ rect.x > maxScissorRect.x ? 0 : (NSUInteger)ceilf(maxScissorRect.x) - rect.x;
NSUInteger clampedHeight =
- rect.y > mRenderPassMaxScissorRect.height ? 0 : mRenderPassMaxScissorRect.height - rect.y;
+ rect.y > maxScissorRect.y ? 0 : (NSUInteger)ceilf(maxScissorRect.y) - rect.y;
MTLScissorRect clampedRect = {rect.x, rect.y, std::min(rect.width, clampedWidth),
std::min(rect.height, clampedHeight)};
@@ -1806,6 +1841,23 @@ RenderCommandEncoder &RenderCommandEncoder::setScissorRect(const MTLScissorRect
mStateCache.scissorRect = clampedRect;
+ if (map)
+ {
+ auto adjustedOrigin =
+ [map mapPhysicalToScreenCoordinates:MTLCoordinate2DMake(clampedRect.x, clampedRect.y)
+ forLayer:0];
+ auto adjustedSize =
+ [map mapPhysicalToScreenCoordinates:MTLCoordinate2DMake(clampedRect.width,
+ clampedRect.height)
+ forLayer:0];
+
+ clampedRect.x = (NSUInteger)roundf(adjustedOrigin.x);
+ clampedRect.y = (NSUInteger)roundf(adjustedOrigin.y);
+ MTLSize screenSize = [map screenSize];
+ clampedRect.width = std::min<NSUInteger>(screenSize.width, roundf(adjustedSize.x));
+ clampedRect.height = std::min<NSUInteger>(screenSize.height, roundf(adjustedSize.y));
+ }
+
mCommands.push(CmdType::SetScissorRect).push(clampedRect);
return *this;
@@ -2211,6 +2263,17 @@ void RenderCommandEncoder::popDebugGroup()
mCommands.push(CmdType::PopDebugGroup);
}
+id<MTLRasterizationRateMap> RenderCommandEncoder::rasterizationRateMapForPass(id<MTLRasterizationRateMap> map,
+ id<MTLTexture> texture) const
+{
+ if (!mCachedRenderPassDescObjC.get())
+ return nil;
+
+ MTLSize size = [map physicalSizeForLayer:0];
+ id<MTLTexture> t = mCachedRenderPassDescObjC.get().colorAttachments[0].texture;
+ return t.width == size.width && t.height == size.height ? map : nil;
+}
+
RenderCommandEncoder &RenderCommandEncoder::setColorStoreAction(MTLStoreAction action,
uint32_t colorAttachmentIndex)
{
@@ -2306,6 +2369,16 @@ RenderCommandEncoder &RenderCommandEncoder::setStencilLoadAction(MTLLoadAction a
return *this;
}
+RenderCommandEncoder &RenderCommandEncoder::setRasterizationRateMap(id<MTLRasterizationRateMap> map)
+{
+ if (map != mCachedRenderPassDescObjC.get().rasterizationRateMap)
+ {
+ mCachedRenderPassDescObjC.get().rasterizationRateMap = map;
+ }
+
+ return *this;
+}
+
void RenderCommandEncoder::setLabel(NSString *label)
{
mLabel.retainAssign(label);
diff --git a/src/libANGLE/renderer/metal/mtl_common.h b/src/libANGLE/renderer/metal/mtl_common.h
index b430aa0263545ce6d35ae410e62b035cd41b6c23..96438f09f8b4f576ee2280206b3bdbf461c7618e 100644
--- a/src/libANGLE/renderer/metal/mtl_common.h
+++ b/src/libANGLE/renderer/metal/mtl_common.h
@@ -407,6 +407,8 @@ inline AutoObjCObj<U> adoptObjCObj(U *NS_RELEASES_ARGUMENT src)
# define ANGLE_MTL_EVENT_AVAILABLE 0
#endif
+using RasterizationRateMapRef = AutoObjCPtr<id<MTLRasterizationRateMap>>;
+
// The native image index used by Metal back-end, the image index uses native mipmap level instead
// of "virtual" level modified by OpenGL's base level.
using MipmapNativeLevel = gl::LevelIndexWrapper<uint32_t>;
diff --git a/src/libANGLE/renderer/metal/mtl_format_utils.h b/src/libANGLE/renderer/metal/mtl_format_utils.h
index db95298598177500cebd0eb81cfcb845656031b2..8cbd1014b7dd9c2886272df3ae0923ccec49b512 100644
--- a/src/libANGLE/renderer/metal/mtl_format_utils.h
+++ b/src/libANGLE/renderer/metal/mtl_format_utils.h
@@ -89,6 +89,10 @@ struct Format : public FormatBase
// Need conversion between source format and this format?
bool needConversion(angle::FormatID srcFormatId) const;
+ // Are the formats view compatible without requiring
+ // MTLTextureUsagePixelFormatView?
+ bool isViewCompatible(const Format &srcFormat) const;
+
MTLPixelFormat metalFormat = MTLPixelFormatInvalid;
LoadFunctionMap textureLoadFunctions = nullptr;
diff --git a/src/libANGLE/renderer/metal/mtl_format_utils.mm b/src/libANGLE/renderer/metal/mtl_format_utils.mm
index 42ea015fdd35d71234acd7b64db032ba2831fb9b..047c119251175ca9a3b5bbafb84d6f686b0b22dd 100644
--- a/src/libANGLE/renderer/metal/mtl_format_utils.mm
+++ b/src/libANGLE/renderer/metal/mtl_format_utils.mm
@@ -161,6 +161,26 @@ bool Format::needConversion(angle::FormatID srcFormatId) const
return srcFormatId != actualFormatId;
}
+bool Format::isViewCompatible(const Format &srcFormat) const
+{
+ if (srcFormat.metalFormat == metalFormat)
+ return true;
+
+ // The pixel layout is considered different if the number of components differs,
+ if (srcFormat.caps.channels != caps.channels)
+ return false;
+
+ // ... or if their size or order is different from the components in the original pixel format.
+ if (srcFormat.caps.pixelBytes != caps.pixelBytes)
+ return false;
+
+ // This is overly conservative but reject compressed formats
+ if (srcFormat.caps.compressed || caps.compressed)
+ return false;
+
+ return true;
+}
+
bool Format::isPVRTC() const
{
switch (metalFormat)
diff --git a/src/libANGLE/renderer/metal/mtl_render_utils.mm b/src/libANGLE/renderer/metal/mtl_render_utils.mm
index 9e5487d393a0a2bd64106fc70e7b3f73626e2490..956808f2cd03665bd09d95cf4af90e2eeacdd0ef 100644
--- a/src/libANGLE/renderer/metal/mtl_render_utils.mm
+++ b/src/libANGLE/renderer/metal/mtl_render_utils.mm
@@ -607,7 +607,8 @@ void DispatchCompute(ContextMtl *contextMtl,
id<MTLComputePipelineState> pipelineState,
size_t numThreads)
{
- NSUInteger w = std::min<NSUInteger>(pipelineState.threadExecutionWidth, numThreads);
+ ASSERT(numThreads != 0);
+ NSUInteger w = std::clamp<NSUInteger>(numThreads, 1u, pipelineState.threadExecutionWidth);
MTLSize threadsPerThreadgroup = MTLSizeMake(w, 1, 1);
if (contextMtl->getDisplay()->getFeatures().hasNonUniformDispatch.enabled)
@@ -687,8 +688,9 @@ void SetupCommonBlitWithDrawStates(const gl::Context *context,
GetViewport(params.dstRect, params.dstTextureSize.height, params.dstFlipY);
MTLScissorRect scissorRectMtl =
GetScissorRect(params.dstScissorRect, params.dstTextureSize.height, params.dstFlipY);
- cmdEncoder->setViewport(viewportMtl);
- cmdEncoder->setScissorRect(scissorRectMtl);
+
+ cmdEncoder->setViewport(viewportMtl, nil);
+ cmdEncoder->setScissorRect(scissorRectMtl, nil);
if (params.src)
{
@@ -1222,8 +1224,8 @@ angle::Result ClearUtils::setupClearWithDraw(const gl::Context *context,
scissorRect = GetScissorRect(params.clearArea, params.dstTextureSize.height, params.flipY);
- cmdEncoder->setViewport(viewport);
- cmdEncoder->setScissorRect(scissorRect);
+ cmdEncoder->setViewport(viewport, nil);
+ cmdEncoder->setScissorRect(scissorRect, nil);
// uniform
ClearParamsUniform uniformParams;
diff --git a/src/libANGLE/renderer/metal/mtl_resource_spi.h b/src/libANGLE/renderer/metal/mtl_resource_spi.h
index 3eaa9a64e79af26faa786102ece3f0bdea84d090..7ecb6db9d993df8985fcb6f701dfe7ca75857cae 100644
--- a/src/libANGLE/renderer/metal/mtl_resource_spi.h
+++ b/src/libANGLE/renderer/metal/mtl_resource_spi.h
@@ -1,9 +1,63 @@
-//
-// Copyright 2021 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.
+/*
+ * Copyright (C) 2021 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
//
// mtl_resource_spi.h:
-// Used to set Metal resource ownership identity with SPI.
-// Purposefully empty header file. Actual implementation will be hosted in WebKit.
+// Used to set Metal resource ownership identity with SPI
//
+
+#ifndef LIBANGLE_RENDERER_METAL_RESOURCE_SPI_H_
+#define LIBANGLE_RENDERER_METAL_RESOURCE_SPI_H_
+
+#import "common/apple/apple_platform.h"
+
+#if ANGLE_USE_METAL_OWNERSHIP_IDENTITY
+
+# import <Metal/MTLResource_Private.h>
+# import <Metal/Metal.h>
+# import <mach/mach_types.h>
+
+namespace rx
+{
+namespace mtl
+{
+inline void setOwnerWithIdentity(id<MTLResource> resource, task_id_token_t identityToken)
+{
+ if (identityToken != TASK_ID_TOKEN_NULL)
+ {
+ kern_return_t kr = [(id<MTLResourceSPI>)resource setOwnerWithIdentity:identityToken];
+ if (ANGLE_UNLIKELY(kr != KERN_SUCCESS))
+ {
+ ERR() << "setOwnerWithIdentity failed with: %s (%x)" << mach_error_string(kr) << kr;
+ ASSERT(false);
+ }
+ }
+ return;
+}
+} // namespace mtl
+} // namespace rx
+#endif
+
+#endif /* LIBANGLE_RENDERER_METAL_RESOURCE_SPI_H_ */
diff --git a/src/libANGLE/renderer/metal/mtl_resources.h b/src/libANGLE/renderer/metal/mtl_resources.h
index 081c46ef66b3e24f228cd8ee4db46f68abfbcd35..dcd2aee71eb386f3c8d4e8ee773863b048aac379 100644
--- a/src/libANGLE/renderer/metal/mtl_resources.h
+++ b/src/libANGLE/renderer/metal/mtl_resources.h
@@ -227,6 +227,11 @@ class Texture final : public Resource,
TextureRef createCubeFaceView(uint32_t face);
// Create a view of one slice at a level.
TextureRef createSliceMipView(uint32_t slice, const MipmapNativeLevel &level);
+ // Same as createSliceMipView but the target format must be compatible, for example sRGB to linear. In this
+ // case texture doesn't need format view usage flag.
+ TextureRef createSliceMipViewWithCompatibleFormat(uint32_t slice,
+ const MipmapNativeLevel &level,
+ MTLPixelFormat format);
// Create a levels range view
TextureRef createMipsView(const MipmapNativeLevel &baseLevel, uint32_t levels);
// Create a view of a level.
diff --git a/src/libANGLE/renderer/metal/mtl_resources.mm b/src/libANGLE/renderer/metal/mtl_resources.mm
index 50873854b075ce7327e2ecff25a2c37ba707eb88..d9a21b6ec4f1928acace805e61254c20d0f80cda 100644
--- a/src/libANGLE/renderer/metal/mtl_resources.mm
+++ b/src/libANGLE/renderer/metal/mtl_resources.mm
@@ -78,12 +78,10 @@ MTLResourceOptions resourceOptionsForStorageMode(MTLStorageMode storageMode)
return MTLResourceStorageModePrivate;
case MTLStorageModeMemoryless:
return MTLResourceStorageModeMemoryless;
-#if TARGET_OS_SIMULATOR
default:
// TODO(http://anglebug.com/42266474): Remove me once hacked SDKs are fixed.
UNREACHABLE();
return MTLResourceStorageModeShared;
-#endif
}
}
@@ -704,7 +702,9 @@ TextureRef Texture::createCubeFaceView(uint32_t face)
}
}
-TextureRef Texture::createSliceMipView(uint32_t slice, const MipmapNativeLevel &level)
+TextureRef Texture::createSliceMipViewWithCompatibleFormat(uint32_t slice,
+ const MipmapNativeLevel &level,
+ MTLPixelFormat format)
{
ANGLE_MTL_OBJC_SCOPE
{
@@ -713,7 +713,7 @@ TextureRef Texture::createSliceMipView(uint32_t slice, const MipmapNativeLevel &
case MTLTextureTypeCube:
case MTLTextureType2D:
case MTLTextureType2DArray:
- return TextureRef(new Texture(this, pixelFormat(), MTLTextureType2D,
+ return TextureRef(new Texture(this, format, MTLTextureType2D,
NSMakeRange(level.get(), 1), NSMakeRange(slice, 1)));
default:
UNREACHABLE();
@@ -722,6 +722,11 @@ TextureRef Texture::createSliceMipView(uint32_t slice, const MipmapNativeLevel &
}
}
+TextureRef Texture::createSliceMipView(uint32_t slice, const MipmapNativeLevel &level)
+{
+ return createSliceMipViewWithCompatibleFormat(slice, level, pixelFormat());
+}
+
TextureRef Texture::createMipView(const MipmapNativeLevel &level)
{
ANGLE_MTL_OBJC_SCOPE
diff --git a/src/libANGLE/renderer/metal/mtl_state_cache.mm b/src/libANGLE/renderer/metal/mtl_state_cache.mm
index 8534c5c32fbc218da6c00ed95804026ccab508ef..7b2e9926b29407d7870b0da20a6591d0982146e7 100644
--- a/src/libANGLE/renderer/metal/mtl_state_cache.mm
+++ b/src/libANGLE/renderer/metal/mtl_state_cache.mm
@@ -21,9 +21,16 @@
#define ANGLE_OBJC_CP_PROPERTY(DST, SRC, PROPERTY) \
(DST).PROPERTY = static_cast<__typeof__((DST).PROPERTY)>(ToObjC((SRC).PROPERTY))
+#define ANGLE_OBJC_CP_PROPERTY2(DST, SRC, PROPERTY, DST_PROPERTY) \
+ (DST).DST_PROPERTY = static_cast<__typeof__((DST).DST_PROPERTY)>(ToObjC((SRC).PROPERTY))
#define ANGLE_PROP_EQ(LHS, RHS, PROP) ((LHS).PROP == (RHS).PROP)
+#if (defined(__MAC_13_0) && __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_13_0) || \
+ (defined(__IPHONE_16_0) && __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_16_0)
+# define ANGLE_MTL_RENDER_PIPELINE_DESC_RASTER_SAMPLE_COUNT_AVAILABLE 1
+#endif
+
namespace rx
{
namespace mtl
diff --git a/src/libANGLE/renderer/metal/mtl_utils.mm b/src/libANGLE/renderer/metal/mtl_utils.mm
index 538a50893839c8a905744524d85e513c9914de0d..e403f8b6c795e5268d45677868c6adf30dda8b9e 100644
--- a/src/libANGLE/renderer/metal/mtl_utils.mm
+++ b/src/libANGLE/renderer/metal/mtl_utils.mm
@@ -1557,6 +1557,24 @@ bool SupportsAppleGPUFamily(id<MTLDevice> device, uint8_t appleFamily)
#endif // TARGET_OS_IOS || TARGET_OS_TV
}
+#if (defined(__MAC_13_0) && __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_13_0) || \
+ (defined(__IPHONE_16_0) && __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_16_0) || \
+ (defined(__TVOS_16_0) && __TV_OS_VERSION_MIN_REQUIRED >= __TVOS_16_0)
+# define ANGLE_MTL_FEATURE_SET_DEPRECATED 1
+# define ANGLE_MTL_GPU_FAMILY_MAC1_DEPRECATED 1
+#endif
+
+#if ANGLE_MTL_GPU_FAMILY_MAC1_DEPRECATED
+# define ANGLE_MTL_GPU_FAMILY_MAC1 MTLGPUFamilyMac2
+# define ANGLE_MTL_GPU_FAMILY_MAC2 MTLGPUFamilyMac2
+#elif TARGET_OS_MACCATALYST
+# define ANGLE_MTL_GPU_FAMILY_MAC1 MTLGPUFamilyMacCatalyst1
+# define ANGLE_MTL_GPU_FAMILY_MAC2 MTLGPUFamilyMacCatalyst2
+#else // !ANGLE_MTL_GPU_FAMILY_MAC1_DEPRECATED && !TARGET_OS_MACCATALYST
+# define ANGLE_MTL_GPU_FAMILY_MAC1 MTLGPUFamilyMac1
+# define ANGLE_MTL_GPU_FAMILY_MAC2 MTLGPUFamilyMac2
+#endif
+
bool SupportsMacGPUFamily(id<MTLDevice> device, uint8_t macFamily)
{
#if TARGET_OS_OSX || TARGET_OS_MACCATALYST
@@ -1571,10 +1589,10 @@ bool SupportsMacGPUFamily(id<MTLDevice> device, uint8_t macFamily)
# if TARGET_OS_MACCATALYST
ANGLE_APPLE_ALLOW_DEPRECATED_BEGIN
case 1:
- family = MTLGPUFamilyMacCatalyst1;
+ family = ANGLE_MTL_GPU_FAMILY_MAC1;
break;
case 2:
- family = MTLGPUFamilyMacCatalyst2;
+ family = ANGLE_MTL_GPU_FAMILY_MAC2;
break;
ANGLE_APPLE_ALLOW_DEPRECATED_END
# else // TARGET_OS_MACCATALYST
@@ -1597,7 +1615,7 @@ bool SupportsMacGPUFamily(id<MTLDevice> device, uint8_t macFamily)
// If device doesn't support [MTLDevice supportsFamily:], then use
// [MTLDevice supportsFeatureSet:].
-# if TARGET_OS_MACCATALYST
+# if TARGET_OS_MACCATALYST || ANGLE_MTL_FEATURE_SET_DEPRECATED
UNREACHABLE();
return false;
# else
diff --git a/src/libANGLE/renderer/metal/shaders/create_mtl_internal_shaders.py b/src/libANGLE/renderer/metal/shaders/create_mtl_internal_shaders.py
new file mode 100644
index 0000000000000000000000000000000000000000..23e8295bcc16412d3aef3fc8e85748fa4ad77a70
--- /dev/null
+++ b/src/libANGLE/renderer/metal/shaders/create_mtl_internal_shaders.py
@@ -0,0 +1,65 @@
+#!/usr/bin/python3
+# Copyright 2021 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.
+#
+# create_mtl_internal_shaders.py:
+# Script to compile a metalLib into NSData, for including the compilded
+# library in the ANGLE dylib.
+
+import os
+import sys
+import json
+from datetime import datetime
+
+sys.path.append('../..')
+
+template_header_boilerplate = """// GENERATED FILE - DO NOT EDIT.
+// Generated by {script_name}
+//
+// Copyright {copyright_year} 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.
+//
+"""
+
+
+# Convert content of a file to byte array and store in a header file.
+# variable_name: name of C++ variable that will hold the file content as byte array.
+# filename: the file whose content will be converted to C++ byte array.
+# dest_src_file: destination header file that will contain the byte array.
+def append_file_as_byte_array_string(variable_name, filename, dest_src_file):
+ string = '// Generated from {0}:\n'.format(filename)
+ string += 'constexpr uint8_t {0}[]={{\n'.format(variable_name)
+ bytes_ = open(filename, "rb").read()
+ for byte in bytes_:
+ string += '0x{:02x}'.format(byte) + ", "
+ string += "\n};\n"
+ with open(dest_src_file, "a") as out_file:
+ out_file.write(string)
+
+
+def main():
+ input_file = sys.argv[1]
+ output_file = sys.argv[2]
+ os.chdir(sys.path[0])
+
+ boilerplate_code = template_header_boilerplate.format(
+ script_name=os.path.basename(sys.argv[0]), copyright_year=datetime.today().year)
+
+ # -------- Compile shaders -----------
+ # boiler plate code
+ os.system("echo \"{0}\" > \"{1}\"".format(boilerplate_code, output_file))
+ os.system(
+ 'echo "// Compiled binary for Metal default shaders.\n\n" >> \"{0}\"'.format(output_file))
+ os.system('echo "#include <TargetConditionals.h>\n\n" >> \"{0}\"'.format(output_file))
+
+ os.system('echo "// clang-format off" >> \"{0}\"'.format(output_file))
+
+ append_file_as_byte_array_string('gDefaultMetallib', input_file, output_file)
+
+ os.system('echo "// clang-format on" >> \"{0}\"'.format(output_file))
+
+
+if __name__ == '__main__':
+ sys.exit(main())
diff --git a/src/libANGLE/renderer/vulkan/ContextVk.cpp b/src/libANGLE/renderer/vulkan/ContextVk.cpp
index 9ffb67631de977b6e92d1112a2464b317f89bf92..d7f77cf43b7b4523f86b5b7062509b65a204bc9c 100644
--- a/src/libANGLE/renderer/vulkan/ContextVk.cpp
+++ b/src/libANGLE/renderer/vulkan/ContextVk.cpp
@@ -5920,6 +5920,10 @@ angle::Result ContextVk::syncState(const gl::Context *context,
break;
case gl::state::EXTENDED_DIRTY_BIT_BLEND_ADVANCED_COHERENT:
break;
+ case gl::state::EXTENDED_DIRTY_BIT_VARIABLE_RASTERIZATION_RATE:
+ // Noop until addition of backend support for
+ // ANGLE_variable_rasterization_rate_metal extension
+ break;
default:
UNREACHABLE();
}
diff --git a/src/libANGLE/validationES2.cpp b/src/libANGLE/validationES2.cpp
index eee496a8bb604930b3336b35126c400e52704d5f..a68767be82a7e7a337169782c98c5baae485f89f 100644
--- a/src/libANGLE/validationES2.cpp
+++ b/src/libANGLE/validationES2.cpp
@@ -691,6 +691,9 @@ bool ValidCap(const PrivateState &state, ErrorSet *errors, GLenum cap, bool quer
return state.getClientVersion() >= Version(2, 0) &&
state.getExtensions().blendEquationAdvancedCoherentKHR;
+ case GL_VARIABLE_RASTERIZATION_RATE_ANGLE:
+ return state.getExtensions().variableRasterizationRateMetalANGLE;
+
default:
break;
}
@@ -6344,6 +6347,18 @@ bool ValidateMaxShaderCompilerThreadsKHR(const Context *context,
return true;
}
+bool ValidateBindMetalRasterizationRateMapANGLE(const Context *context,
+ angle::EntryPoint entryPoint,
+ GLMTLRasterizationRateMapANGLE map)
+{
+ if (!context->getExtensions().variableRasterizationRateMetalANGLE)
+ {
+ ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kExtensionNotEnabled);
+ return false;
+ }
+ return true;
+}
+
bool ValidateMultiDrawArraysANGLE(const Context *context,
angle::EntryPoint entryPoint,
PrimitiveMode mode,
diff --git a/src/libANGLE/validationES32.cpp b/src/libANGLE/validationES32.cpp
index f170fc4d8bac3b766bd80083641622fe3571dd6e..4a9c9053385b54ec158d6934e4349d60cd84646e 100644
--- a/src/libANGLE/validationES32.cpp
+++ b/src/libANGLE/validationES32.cpp
@@ -469,6 +469,9 @@ bool ValidateGetPointerv(const Context *context,
case GL_DEBUG_CALLBACK_FUNCTION:
case GL_DEBUG_CALLBACK_USER_PARAM:
return true;
+ // GL_ANGLE_variable_rasterization_rate_metal
+ case GL_METAL_RASTERIZATION_RATE_MAP_BINDING_ANGLE:
+ return context->getExtensions().variableRasterizationRateMetalANGLE;
default:
ANGLE_VALIDATION_ERROR(GL_INVALID_ENUM, kInvalidPointerQuery);
return false;
@@ -476,9 +479,16 @@ bool ValidateGetPointerv(const Context *context,
}
else
{
+ switch (pname)
+ {
+ // GL_ANGLE_variable_rasterization_rate_metal
+ case GL_METAL_RASTERIZATION_RATE_MAP_BINDING_ANGLE:
+ return context->getExtensions().variableRasterizationRateMetalANGLE;
+ default:
ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kES1or32Required);
return false;
}
+ }
}
bool ValidateGetSamplerParameterIiv(const Context *context,
diff --git a/src/libANGLE/validationESEXT_autogen.h b/src/libANGLE/validationESEXT_autogen.h
index de36b7a9d310208e2a600c895b253003c0a11484..41bd167ae5c715a32107b1c9a037d3740cc26b15 100644
--- a/src/libANGLE/validationESEXT_autogen.h
+++ b/src/libANGLE/validationESEXT_autogen.h
@@ -995,6 +995,11 @@ bool ValidateGetTranslatedShaderSourceANGLE(const Context *context,
const GLsizei *length,
const GLchar *source);
+// GL_ANGLE_variable_rasterization_rate_metal
+bool ValidateBindMetalRasterizationRateMapANGLE(const Context *context,
+ angle::EntryPoint entryPoint,
+ GLMTLRasterizationRateMapANGLE map);
+
// GL_ANGLE_vulkan_image
bool ValidateAcquireTexturesANGLE(const Context *context,
angle::EntryPoint entryPoint,
diff --git a/src/libGLESv2/entry_points_gles_ext_autogen.cpp b/src/libGLESv2/entry_points_gles_ext_autogen.cpp
index cb14151bfad4eade0972bec0dc9c1bb51b27f3e4..60a78aa6e35d9b36b1d75dd23a17de6f4028bc96 100644
--- a/src/libGLESv2/entry_points_gles_ext_autogen.cpp
+++ b/src/libGLESv2/entry_points_gles_ext_autogen.cpp
@@ -4638,6 +4638,36 @@ void GL_APIENTRY GL_GetTranslatedShaderSourceANGLE(GLuint shader,
ASSERT(!egl::Display::GetCurrentThreadUnlockedTailCall()->any());
}
+// GL_ANGLE_variable_rasterization_rate_metal
+void GL_APIENTRY GL_BindMetalRasterizationRateMapANGLE(GLuint renderbuffer, GLMTLRasterizationRateMapANGLE map)
+{
+ Context *context = GetValidGlobalContext();
+ EVENT(context, GLBindMetalRasterizationRateMapANGLE, "context = %d, map = 0x%016" PRIxPTR "",
+ CID(context), (uintptr_t)map);
+
+ if (context)
+ {
+ SCOPED_SHARE_CONTEXT_LOCK(context);
+ bool isCallValid =
+ (context->skipValidation() ||
+ (ValidatePixelLocalStorageInactive(
+ context->getPrivateState(), context->getMutableErrorSetForValidation(),
+ angle::EntryPoint::GLBindMetalRasterizationRateMapANGLE) &&
+ ValidateBindMetalRasterizationRateMapANGLE(
+ context, angle::EntryPoint::GLBindMetalRasterizationRateMapANGLE, map)));
+ if (isCallValid)
+ {
+ context->bindMetalRasterizationRateMap(renderbuffer, map);
+ }
+ ANGLE_CAPTURE_GL(BindMetalRasterizationRateMapANGLE, isCallValid, context, map);
+ }
+ else
+ {
+ GenerateContextLostErrorOnCurrentGlobalContext();
+ }
+ ASSERT(!egl::Display::GetCurrentThreadUnlockedTailCall()->any());
+}
+
// GL_ANGLE_vulkan_image
void GL_APIENTRY GL_AcquireTexturesANGLE(GLuint numTextures,
const GLuint *textures,
diff --git a/src/libGLESv2/entry_points_gles_ext_autogen.h b/src/libGLESv2/entry_points_gles_ext_autogen.h
index e389d4728c4f16da54842c71e13e6857ed81daa2..0260d8adc5541ca8e12086207c382784fa9766eb 100644
--- a/src/libGLESv2/entry_points_gles_ext_autogen.h
+++ b/src/libGLESv2/entry_points_gles_ext_autogen.h
@@ -738,6 +738,10 @@ ANGLE_EXPORT void GL_APIENTRY GL_GetTranslatedShaderSourceANGLE(GLuint shader,
GLsizei *length,
GLchar *source);
+// GL_ANGLE_variable_rasterization_rate_metal
+ANGLE_EXPORT void GL_APIENTRY
+GL_BindMetalRasterizationRateMapANGLE(GLuint framebuffer, GLMTLRasterizationRateMapANGLE map);
+
// GL_ANGLE_vulkan_image
ANGLE_EXPORT void GL_APIENTRY GL_AcquireTexturesANGLE(GLuint numTextures,
const GLuint *textures,
diff --git a/src/libGLESv2/libGLESv2_autogen.cpp b/src/libGLESv2/libGLESv2_autogen.cpp
index 5cc6a38217e8074633a63afd66c8ac7519c75f43..213539b2cefb4e794b47c01396c804c8414ad233 100644
--- a/src/libGLESv2/libGLESv2_autogen.cpp
+++ b/src/libGLESv2/libGLESv2_autogen.cpp
@@ -3942,6 +3942,12 @@ void GL_APIENTRY glGetTranslatedShaderSourceANGLE(GLuint shader,
return GL_GetTranslatedShaderSourceANGLE(shader, bufSize, length, source);
}
+// GL_ANGLE_variable_rasterization_rate_metal
+void GL_APIENTRY glBindMetalRasterizationRateMapANGLE(GLuint renderbuffer, GLMTLRasterizationRateMapANGLE map)
+{
+ return GL_BindMetalRasterizationRateMapANGLE(renderbuffer, map);
+}
+
// GL_ANGLE_vulkan_image
void GL_APIENTRY glAcquireTexturesANGLE(GLuint numTextures,
const GLuint *textures,
diff --git a/src/libGLESv2/libGLESv2_autogen.def b/src/libGLESv2/libGLESv2_autogen.def
index 8117e28d0ec91924ece75f22a64c87e6573f70a4..200c7110e26346d3172542a1a598324322df10ab 100644
--- a/src/libGLESv2/libGLESv2_autogen.def
+++ b/src/libGLESv2/libGLESv2_autogen.def
@@ -668,6 +668,9 @@ EXPORTS
; GL_ANGLE_translated_shader_source
glGetTranslatedShaderSourceANGLE
+ ; GL_ANGLE_variable_rasterization_rate_metal
+ glBindMetalRasterizationRateMapANGLE
+
; GL_ANGLE_vulkan_image
glAcquireTexturesANGLE
glReleaseTexturesANGLE
diff --git a/src/libGLESv2/libGLESv2_no_capture_autogen.def b/src/libGLESv2/libGLESv2_no_capture_autogen.def
index 57875834664dc72e867fd161b0f0b27d683affd4..dfcc2c424ee4a976782f01add8a3051435db8906 100644
--- a/src/libGLESv2/libGLESv2_no_capture_autogen.def
+++ b/src/libGLESv2/libGLESv2_no_capture_autogen.def
@@ -668,6 +668,9 @@ EXPORTS
; GL_ANGLE_translated_shader_source
glGetTranslatedShaderSourceANGLE
+ ; GL_ANGLE_variable_rasterization_rate_metal
+ glBindMetalRasterizationRateMapANGLE
+
; GL_ANGLE_vulkan_image
glAcquireTexturesANGLE
glReleaseTexturesANGLE
diff --git a/src/libGLESv2/libGLESv2_vulkan_secondaries_autogen.def b/src/libGLESv2/libGLESv2_vulkan_secondaries_autogen.def
index ba0237ae105122f6e8f6349a2f0f294b5de30375..7efab9e284c4da08a95d01917ad59ca7410ba189 100644
--- a/src/libGLESv2/libGLESv2_vulkan_secondaries_autogen.def
+++ b/src/libGLESv2/libGLESv2_vulkan_secondaries_autogen.def
@@ -668,6 +668,9 @@ EXPORTS
; GL_ANGLE_translated_shader_source
glGetTranslatedShaderSourceANGLE
+ ; GL_ANGLE_variable_rasterization_rate_metal
+ glBindMetalRasterizationRateMapANGLE
+
; GL_ANGLE_vulkan_image
glAcquireTexturesANGLE
glReleaseTexturesANGLE
diff --git a/src/libGLESv2/libGLESv2_with_capture_autogen.def b/src/libGLESv2/libGLESv2_with_capture_autogen.def
index a242e6df2f07d273730e8fead7b1a7e5086a08a8..2559cd521aab1e6066559a44c7ecda1f98f8bd22 100644
--- a/src/libGLESv2/libGLESv2_with_capture_autogen.def
+++ b/src/libGLESv2/libGLESv2_with_capture_autogen.def
@@ -668,6 +668,9 @@ EXPORTS
; GL_ANGLE_translated_shader_source
glGetTranslatedShaderSourceANGLE
+ ; GL_ANGLE_variable_rasterization_rate_metal
+ glBindMetalRasterizationRateMapANGLE
+
; GL_ANGLE_vulkan_image
glAcquireTexturesANGLE
glReleaseTexturesANGLE
diff --git a/src/libGLESv2/opengl32_autogen.def b/src/libGLESv2/opengl32_autogen.def
index 782e627b9e2270d8cbb335fee5f191e15cbd98c7..910c861ae5917b8c6048e7519d03dec28e7d52a9 100644
--- a/src/libGLESv2/opengl32_autogen.def
+++ b/src/libGLESv2/opengl32_autogen.def
@@ -668,6 +668,9 @@ EXPORTS
; GL_ANGLE_translated_shader_source
glGetTranslatedShaderSourceANGLE
+ ; GL_ANGLE_variable_rasterization_rate_metal
+ glBindMetalRasterizationRateMapANGLE
+
; GL_ANGLE_vulkan_image
glAcquireTexturesANGLE
glReleaseTexturesANGLE
diff --git a/src/libGLESv2/opengl32_with_wgl_autogen.def b/src/libGLESv2/opengl32_with_wgl_autogen.def
index 30763ef3b30b4184d92008adea49e0eb3d6d1f9c..f1ba5c64dfaeb7350ef31c033e54a87696985ab4 100644
--- a/src/libGLESv2/opengl32_with_wgl_autogen.def
+++ b/src/libGLESv2/opengl32_with_wgl_autogen.def
@@ -668,6 +668,9 @@ EXPORTS
; GL_ANGLE_translated_shader_source
glGetTranslatedShaderSourceANGLE
+ ; GL_ANGLE_variable_rasterization_rate_metal
+ glBindMetalRasterizationRateMapANGLE
+
; GL_ANGLE_vulkan_image
glAcquireTexturesANGLE
glReleaseTexturesANGLE
diff --git a/src/libGLESv2/proc_table_egl_autogen.cpp b/src/libGLESv2/proc_table_egl_autogen.cpp
index 4669eb7255e7c5d2f38415717e41f9a52978c446..b4ebf9cce3da85b54d2793485dbb9aad21e2a1f9 100644
--- a/src/libGLESv2/proc_table_egl_autogen.cpp
+++ b/src/libGLESv2/proc_table_egl_autogen.cpp
@@ -190,6 +190,7 @@ const ProcEntry g_procTable[] = {
{"glBindFramebufferOES", P(GL_BindFramebufferOES)},
{"glBindImageTexture", P(GL_BindImageTexture)},
DESKTOP_ONLY("glBindImageTextures", GL_BindImageTextures)
+ {"glBindMetalRasterizationRateMapANGLE", P(GL_BindMetalRasterizationRateMapANGLE)},
{"glBindProgramPipeline", P(GL_BindProgramPipeline)},
{"glBindProgramPipelineEXT", P(GL_BindProgramPipelineEXT)},
{"glBindRenderbuffer", P(GL_BindRenderbuffer)},
diff --git a/src/libGLESv2/proc_table_glx_autogen.cpp b/src/libGLESv2/proc_table_glx_autogen.cpp
index 413a54610cfc5a2404c5b703e638e003041e3668..e7b49f3f4a63d09a81282d10efad58ffd1b4f7da 100644
--- a/src/libGLESv2/proc_table_glx_autogen.cpp
+++ b/src/libGLESv2/proc_table_glx_autogen.cpp
@@ -67,6 +67,7 @@ const ProcEntry g_procTable[] = {
{"glBindFramebufferOES", P(GL_BindFramebufferOES)},
{"glBindImageTexture", P(GL_BindImageTexture)},
{"glBindImageTextures", P(GL_BindImageTextures)},
+ {"glBindMetalRasterizationRateMapANGLE", P(GL_BindMetalRasterizationRateMapANGLE)},
{"glBindProgramPipeline", P(GL_BindProgramPipeline)},
{"glBindProgramPipelineEXT", P(GL_BindProgramPipelineEXT)},
{"glBindRenderbuffer", P(GL_BindRenderbuffer)},
diff --git a/src/libGLESv2/proc_table_wgl_autogen.cpp b/src/libGLESv2/proc_table_wgl_autogen.cpp
index 4cfd778a60259c742692602a6a0d9f10bdab5806..63fc1cb00b9b5f36a4ded5b55c6f993c1febe84d 100644
--- a/src/libGLESv2/proc_table_wgl_autogen.cpp
+++ b/src/libGLESv2/proc_table_wgl_autogen.cpp
@@ -67,6 +67,7 @@ const ProcEntry g_procTable[] = {
{"glBindFramebufferOES", P(GL_BindFramebufferOES)},
{"glBindImageTexture", P(GL_BindImageTexture)},
{"glBindImageTextures", P(GL_BindImageTextures)},
+ {"glBindMetalRasterizationRateMapANGLE", P(GL_BindMetalRasterizationRateMapANGLE)},
{"glBindProgramPipeline", P(GL_BindProgramPipeline)},
{"glBindProgramPipelineEXT", P(GL_BindProgramPipelineEXT)},
{"glBindRenderbuffer", P(GL_BindRenderbuffer)},
diff --git a/src/tests/angle_end2end_tests.gni b/src/tests/angle_end2end_tests.gni
index 879a6de5c94c64e6a676fe177df432a1cdc7f680..8af0ba1aa72a6d46a72f43ef3f4c76193b8460f2 100644
--- a/src/tests/angle_end2end_tests.gni
+++ b/src/tests/angle_end2end_tests.gni
@@ -226,6 +226,7 @@ angle_end2end_tests_mac_sources = [
"egl_tests/EGLSyncTestMetalSharedEvent.mm",
"egl_tests/EGLWaitUntilWorkScheduledTest.cpp",
"gl_tests/ImageTestMetal.mm",
+ "gl_tests/VariableRasterizationRateTestMetal.mm",
]
angle_end2end_tests_win_sources = [
"egl_tests/EGLDeviceTest.cpp",
diff --git a/src/tests/gl_tests/PbufferTest.cpp b/src/tests/gl_tests/PbufferTest.cpp
index 969cd2f96d302d74dd3515ac842b93eb51387cd2..730d0ffa536caf536ec750e2bac82c8187cda8ce 100644
--- a/src/tests/gl_tests/PbufferTest.cpp
+++ b/src/tests/gl_tests/PbufferTest.cpp
@@ -302,7 +302,6 @@ TEST_P(PbufferTest, BindTexImageOverwrite)
// Test skipped because Pbuffers are not supported or Pbuffer does not support binding to RGBA
// textures.
ANGLE_SKIP_TEST_IF(!mSupportsPbuffers || !mSupportsBindTexImage);
-
EGLWindow *window = getEGLWindow();
window->makeCurrent();
@@ -532,7 +531,6 @@ TEST_P(PbufferTest, BindTexImageOverwriteReleasesOrphanedPbuffer)
// Test skipped because Pbuffers are not supported or Pbuffer does not support binding to RGBA
// textures.
ANGLE_SKIP_TEST_IF(!mSupportsPbuffers || !mSupportsBindTexImage);
-
EGLWindow *window = getEGLWindow();
window->makeCurrent();
diff --git a/util/autogen/angle_features_autogen.cpp b/util/autogen/angle_features_autogen.cpp
index f4c6e4a8b7492243252413a5e17f1a35d9ee9fef..28ab6adc31f6fbb4fdf824f31812fd9679c100ec 100644
--- a/util/autogen/angle_features_autogen.cpp
+++ b/util/autogen/angle_features_autogen.cpp
@@ -200,6 +200,7 @@ constexpr PackedEnumMap<Feature, const char *> kFeatureNames = {{
{Feature::HasShaderStencilOutput, "hasShaderStencilOutput"},
{Feature::HasStencilAutoResolve, "hasStencilAutoResolve"},
{Feature::HasTextureSwizzle, "hasTextureSwizzle"},
+ {Feature::HasVariableRasterizationRate, "hasVariableRasterizationRate"},
{Feature::InitFragmentOutputVariables, "initFragmentOutputVariables"},
{Feature::InitializeCurrentVertexAttributes, "initializeCurrentVertexAttributes"},
{Feature::InjectAsmStatementIntoLoopBodies, "injectAsmStatementIntoLoopBodies"},
diff --git a/util/autogen/angle_features_autogen.h b/util/autogen/angle_features_autogen.h
index fc9632144674ae1b27ce8f1a961de3b2225f4666..a93eb665f2ee9fae1ad08abcf37926b4b71c79e6 100644
--- a/util/autogen/angle_features_autogen.h
+++ b/util/autogen/angle_features_autogen.h
@@ -200,6 +200,7 @@ enum class Feature
HasShaderStencilOutput,
HasStencilAutoResolve,
HasTextureSwizzle,
+ HasVariableRasterizationRate,
InitFragmentOutputVariables,
InitializeCurrentVertexAttributes,
InjectAsmStatementIntoLoopBodies,
diff --git a/util/capture/frame_capture_replay_autogen.cpp b/util/capture/frame_capture_replay_autogen.cpp
index 0356ae084c4e6394c3de340273b2426f9d8c2497..05684ff50b97458433160bb08ee573c6cf64898d 100644
--- a/util/capture/frame_capture_replay_autogen.cpp
+++ b/util/capture/frame_capture_replay_autogen.cpp
@@ -105,6 +105,10 @@ void ReplayTraceFunctionCall(const CallCapture &call, const TraceFunctionMap &cu
captures[3].value.GLbooleanVal, captures[4].value.GLintVal,
captures[5].value.GLenumVal, captures[6].value.GLenumVal);
break;
+ case angle::EntryPoint::GLBindMetalRasterizationRateMapANGLE:
+ glBindMetalRasterizationRateMapANGLE(
+ captures[0].value.GLMTLRasterizationRateMapANGLEVal);
+ break;
case angle::EntryPoint::GLBindProgramPipeline:
glBindProgramPipeline(gProgramPipelineMap[captures[0].value.GLuintVal]);
break;
diff --git a/util/capture/trace_gles_loader_autogen.cpp b/util/capture/trace_gles_loader_autogen.cpp
index 2a2450169abf46c88371eb7cfc3c4f5755db5a84..ba7cd722020ac6fbd156af9ff8fcb034351a57c2 100644
--- a/util/capture/trace_gles_loader_autogen.cpp
+++ b/util/capture/trace_gles_loader_autogen.cpp
@@ -630,6 +630,8 @@ ANGLE_TRACE_LOADER_EXPORT PFNGLSAMPLEMASKIANGLEPROC t_glSampleMaskiANGLE;
ANGLE_TRACE_LOADER_EXPORT PFNGLTEXSTORAGE2DMULTISAMPLEANGLEPROC t_glTexStorage2DMultisampleANGLE;
ANGLE_TRACE_LOADER_EXPORT PFNGLGETTRANSLATEDSHADERSOURCEANGLEPROC
t_glGetTranslatedShaderSourceANGLE;
+ANGLE_TRACE_LOADER_EXPORT PFNGLBINDMETALRASTERIZATIONRATEMAPANGLEPROC
+ t_glBindMetalRasterizationRateMapANGLE;
ANGLE_TRACE_LOADER_EXPORT PFNGLACQUIRETEXTURESANGLEPROC t_glAcquireTexturesANGLE;
ANGLE_TRACE_LOADER_EXPORT PFNGLRELEASETEXTURESANGLEPROC t_glReleaseTexturesANGLE;
ANGLE_TRACE_LOADER_EXPORT PFNGLBINDUNIFORMLOCATIONCHROMIUMPROC t_glBindUniformLocationCHROMIUM;
@@ -1845,6 +1847,9 @@ void LoadTraceGLES(LoadProc loadProc)
loadProc("glTexStorage2DMultisampleANGLE"));
t_glGetTranslatedShaderSourceANGLE = reinterpret_cast<PFNGLGETTRANSLATEDSHADERSOURCEANGLEPROC>(
loadProc("glGetTranslatedShaderSourceANGLE"));
+ t_glBindMetalRasterizationRateMapANGLE =
+ reinterpret_cast<PFNGLBINDMETALRASTERIZATIONRATEMAPANGLEPROC>(
+ loadProc("glBindMetalRasterizationRateMapANGLE"));
t_glAcquireTexturesANGLE =
reinterpret_cast<PFNGLACQUIRETEXTURESANGLEPROC>(loadProc("glAcquireTexturesANGLE"));
t_glReleaseTexturesANGLE =
diff --git a/util/capture/trace_gles_loader_autogen.h b/util/capture/trace_gles_loader_autogen.h
index c1e82cb5725914d533051df5e521b01e2fb872ff..c72acd9c43d3a326ff42652fdf8597fd5d8bbd99 100644
--- a/util/capture/trace_gles_loader_autogen.h
+++ b/util/capture/trace_gles_loader_autogen.h
@@ -595,6 +595,7 @@
#define glSampleMaskiANGLE t_glSampleMaskiANGLE
#define glTexStorage2DMultisampleANGLE t_glTexStorage2DMultisampleANGLE
#define glGetTranslatedShaderSourceANGLE t_glGetTranslatedShaderSourceANGLE
+#define glBindMetalRasterizationRateMapANGLE t_glBindMetalRasterizationRateMapANGLE
#define glAcquireTexturesANGLE t_glAcquireTexturesANGLE
#define glReleaseTexturesANGLE t_glReleaseTexturesANGLE
#define glBindUniformLocationCHROMIUM t_glBindUniformLocationCHROMIUM
@@ -1515,6 +1516,8 @@ ANGLE_TRACE_LOADER_EXPORT extern PFNGLTEXSTORAGE2DMULTISAMPLEANGLEPROC
t_glTexStorage2DMultisampleANGLE;
ANGLE_TRACE_LOADER_EXPORT extern PFNGLGETTRANSLATEDSHADERSOURCEANGLEPROC
t_glGetTranslatedShaderSourceANGLE;
+ANGLE_TRACE_LOADER_EXPORT extern PFNGLBINDMETALRASTERIZATIONRATEMAPANGLEPROC
+ t_glBindMetalRasterizationRateMapANGLE;
ANGLE_TRACE_LOADER_EXPORT extern PFNGLACQUIRETEXTURESANGLEPROC t_glAcquireTexturesANGLE;
ANGLE_TRACE_LOADER_EXPORT extern PFNGLRELEASETEXTURESANGLEPROC t_glReleaseTexturesANGLE;
ANGLE_TRACE_LOADER_EXPORT extern PFNGLBINDUNIFORMLOCATIONCHROMIUMPROC
diff --git a/util/capture/trace_interpreter_autogen.cpp b/util/capture/trace_interpreter_autogen.cpp
index 7e73814693678a881dd1f461afa8b8d0c4e33606..505f51c431db7d6ebf33f28e846c018ed1b181ac 100644
--- a/util/capture/trace_interpreter_autogen.cpp
+++ b/util/capture/trace_interpreter_autogen.cpp
@@ -896,6 +896,13 @@ CallCapture ParseCallCapture(const Token &nameToken,
paramTokens, strings);
return CallCapture(EntryPoint::GLBindImageTexture, std::move(params));
}
+ if (strcmp(nameToken, "glBindMetalRasterizationRateMapANGLE") == 0)
+ {
+ ParamBuffer params =
+ ParseParameters<std::remove_pointer<PFNGLBINDMETALRASTERIZATIONRATEMAPANGLEPROC>::type>(
+ paramTokens, strings);
+ return CallCapture(EntryPoint::GLBindMetalRasterizationRateMapANGLE, std::move(params));
+ }
if (strcmp(nameToken, "glBindProgramPipeline") == 0)
{
ParamBuffer params =
diff --git a/util/gles_loader_autogen.cpp b/util/gles_loader_autogen.cpp
index 65c2f5ab70c3a73d292c4225b83d2ce9403eeef0..ea62bf6a6df341f02daaeab91d1cf6a422719cb9 100644
--- a/util/gles_loader_autogen.cpp
+++ b/util/gles_loader_autogen.cpp
@@ -607,6 +607,8 @@ ANGLE_UTIL_EXPORT PFNGLGETMULTISAMPLEFVANGLEPROC l_glGetMultisamplefvANGLE;
ANGLE_UTIL_EXPORT PFNGLSAMPLEMASKIANGLEPROC l_glSampleMaskiANGLE;
ANGLE_UTIL_EXPORT PFNGLTEXSTORAGE2DMULTISAMPLEANGLEPROC l_glTexStorage2DMultisampleANGLE;
ANGLE_UTIL_EXPORT PFNGLGETTRANSLATEDSHADERSOURCEANGLEPROC l_glGetTranslatedShaderSourceANGLE;
+ANGLE_UTIL_EXPORT PFNGLBINDMETALRASTERIZATIONRATEMAPANGLEPROC
+ l_glBindMetalRasterizationRateMapANGLE;
ANGLE_UTIL_EXPORT PFNGLACQUIRETEXTURESANGLEPROC l_glAcquireTexturesANGLE;
ANGLE_UTIL_EXPORT PFNGLRELEASETEXTURESANGLEPROC l_glReleaseTexturesANGLE;
ANGLE_UTIL_EXPORT PFNGLBINDUNIFORMLOCATIONCHROMIUMPROC l_glBindUniformLocationCHROMIUM;
@@ -1812,6 +1814,9 @@ void LoadUtilGLES(LoadProc loadProc)
loadProc("glTexStorage2DMultisampleANGLE"));
l_glGetTranslatedShaderSourceANGLE = reinterpret_cast<PFNGLGETTRANSLATEDSHADERSOURCEANGLEPROC>(
loadProc("glGetTranslatedShaderSourceANGLE"));
+ l_glBindMetalRasterizationRateMapANGLE =
+ reinterpret_cast<PFNGLBINDMETALRASTERIZATIONRATEMAPANGLEPROC>(
+ loadProc("glBindMetalRasterizationRateMapANGLE"));
l_glAcquireTexturesANGLE =
reinterpret_cast<PFNGLACQUIRETEXTURESANGLEPROC>(loadProc("glAcquireTexturesANGLE"));
l_glReleaseTexturesANGLE =
diff --git a/util/gles_loader_autogen.h b/util/gles_loader_autogen.h
index 2ffeb4c8deebff80248ffc9c07230322c1a5e956..4369b668525fc6540e97cedfcc0e39cb7292ab2d 100644
--- a/util/gles_loader_autogen.h
+++ b/util/gles_loader_autogen.h
@@ -595,6 +595,7 @@
#define glSampleMaskiANGLE l_glSampleMaskiANGLE
#define glTexStorage2DMultisampleANGLE l_glTexStorage2DMultisampleANGLE
#define glGetTranslatedShaderSourceANGLE l_glGetTranslatedShaderSourceANGLE
+#define glBindMetalRasterizationRateMapANGLE l_glBindMetalRasterizationRateMapANGLE
#define glAcquireTexturesANGLE l_glAcquireTexturesANGLE
#define glReleaseTexturesANGLE l_glReleaseTexturesANGLE
#define glBindUniformLocationCHROMIUM l_glBindUniformLocationCHROMIUM
@@ -1480,6 +1481,8 @@ ANGLE_UTIL_EXPORT extern PFNGLGETMULTISAMPLEFVANGLEPROC l_glGetMultisamplefvANGL
ANGLE_UTIL_EXPORT extern PFNGLSAMPLEMASKIANGLEPROC l_glSampleMaskiANGLE;
ANGLE_UTIL_EXPORT extern PFNGLTEXSTORAGE2DMULTISAMPLEANGLEPROC l_glTexStorage2DMultisampleANGLE;
ANGLE_UTIL_EXPORT extern PFNGLGETTRANSLATEDSHADERSOURCEANGLEPROC l_glGetTranslatedShaderSourceANGLE;
+ANGLE_UTIL_EXPORT extern PFNGLBINDMETALRASTERIZATIONRATEMAPANGLEPROC
+ l_glBindMetalRasterizationRateMapANGLE;
ANGLE_UTIL_EXPORT extern PFNGLACQUIRETEXTURESANGLEPROC l_glAcquireTexturesANGLE;
ANGLE_UTIL_EXPORT extern PFNGLRELEASETEXTURESANGLEPROC l_glReleaseTexturesANGLE;
ANGLE_UTIL_EXPORT extern PFNGLBINDUNIFORMLOCATIONCHROMIUMPROC l_glBindUniformLocationCHROMIUM;