Skip to content

Commit f9c3eaf

Browse files
jonahryandavisCommit Bot
authored andcommitted
Add ability to disable all ANGLE features
Chrome has a --disable-gpu-driver-bug-workarounds flag that needs to be able to be forwarded to ANGLE Bug: 1016377 Change-Id: Ied6c8656742e25c32d508b8bfe76a902d82bcf93 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/1925249 Commit-Queue: Jonah Ryan-Davis <[email protected]> Reviewed-by: Geoff Lang <[email protected]>
1 parent 8392b11 commit f9c3eaf

File tree

9 files changed

+37
-7
lines changed

9 files changed

+37
-7
lines changed

extensions/EGL_ANGLE_feature_control.txt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,15 +85,22 @@ New Tokens
8585

8686
EGL_FEATURE_OVERRIDES_ENABLED_ANGLE 0x3466
8787
EGL_FEATURE_OVERRIDES_DISABLED_ANGLE 0x3467
88+
EGL_FEATURE_ALL_DISABLED_ANGLE 0x3469
8889

8990
New Behavior
9091

92+
EGLDisplay eglGetPlatformDisplay(EGLenum platform, void
93+
*native_display, const EGLAttrib *attrib_list);
94+
9195
The attribute following EGL_FEATURE_OVERRIDES_ENABLED_ANGLE or
9296
EGL_FEATURE_OVERRIDES_DISABLED_ANGLE should be of type char**,
9397
which should contain a null-terminated array of C strings naming
9498
the features to be enabled or disabled upon display creation.
9599
Any features unspecified in one of these arrays will be
96100
initialized with an internal heuristic.
101+
The attribute following EGL_FEATURE_ALL_DISABLED_ANGLE should be
102+
either EGL_TRUE to disable all features that are not overridden,
103+
or EGL_FALSE to let ANGLE determine which features to enable.
97104

98105
Add the following to the end of section 3.3 "EGL Queries":
99106

include/EGL/eglext_angle.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -235,6 +235,7 @@ EGLAPI EGLBoolean EGLAPIENTRY eglGetSyncValuesCHROMIUM(EGLDisplay dpy,
235235
#define EGL_FEATURE_OVERRIDES_ENABLED_ANGLE 0x3466
236236
#define EGL_FEATURE_OVERRIDES_DISABLED_ANGLE 0x3467
237237
#define EGL_FEATURE_CONDITION_ANGLE 0x3468
238+
#define EGL_FEATURE_ALL_DISABLED_ANGLE 0x3469
238239
typedef const char *(EGLAPIENTRYP PFNEGLQUERYSTRINGIANGLEPROC) (EGLDisplay dpy, EGLint name, EGLint index);
239240
typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYDISPLAYATTRIBANGLEPROC) (EGLDisplay dpy, EGLint attribute, EGLAttrib *value);
240241
#ifdef EGL_EGLEXT_PROTOTYPES

src/libANGLE/Display.cpp

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -365,7 +365,7 @@ void ANGLESetDefaultDisplayPlatform(angle::EGLDisplayType display)
365365

366366
} // anonymous namespace
367367

368-
DisplayState::DisplayState() : label(nullptr) {}
368+
DisplayState::DisplayState() : label(nullptr), featuresAllDisabled(false) {}
369369

370370
DisplayState::~DisplayState() {}
371371

@@ -565,6 +565,8 @@ void Display::setAttributes(rx::DisplayImpl *impl, const AttributeMap &attribMap
565565
reinterpret_cast<const char **>(mAttributeMap.get(EGL_FEATURE_OVERRIDES_DISABLED_ANGLE, 0));
566566
mState.featureOverridesEnabled = EGLStringArrayToStringVector(featuresForceEnabled);
567567
mState.featureOverridesDisabled = EGLStringArrayToStringVector(featuresForceDisabled);
568+
mState.featuresAllDisabled =
569+
static_cast<bool>(mAttributeMap.get(EGL_FEATURE_ALL_DISABLED_ANGLE, 0));
568570
}
569571

570572
Error Display::initialize()
@@ -610,7 +612,10 @@ Error Display::initialize()
610612
config.second.renderableType |= EGL_OPENGL_ES_BIT;
611613
}
612614

613-
initializeFrontendFeatures();
615+
if (!mState.featuresAllDisabled)
616+
{
617+
initializeFrontendFeatures();
618+
}
614619

615620
mFeatures.clear();
616621
mFrontendFeatures.populateFeatureList(&mFeatures);

src/libANGLE/Display.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ struct DisplayState final : private angle::NonCopyable
5757
SurfaceSet surfaceSet;
5858
std::vector<std::string> featureOverridesEnabled;
5959
std::vector<std::string> featureOverridesDisabled;
60+
bool featuresAllDisabled;
6061
};
6162

6263
// Constant coded here as a sanity limit.

src/libANGLE/renderer/d3d/d3d11/Renderer11.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3840,7 +3840,10 @@ void Renderer11::generateCaps(gl::Caps *outCaps,
38403840

38413841
void Renderer11::initializeFeatures(angle::FeaturesD3D *features) const
38423842
{
3843-
d3d11::InitializeFeatures(mRenderer11DeviceCaps, mAdapterDescription, features);
3843+
if (!mDisplay->getState().featuresAllDisabled)
3844+
{
3845+
d3d11::InitializeFeatures(mRenderer11DeviceCaps, mAdapterDescription, features);
3846+
}
38443847
OverrideFeaturesWithDisplayState(features, mDisplay->getState());
38453848
}
38463849

src/libANGLE/renderer/d3d/d3d9/Renderer9.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3009,7 +3009,10 @@ void Renderer9::generateCaps(gl::Caps *outCaps,
30093009

30103010
void Renderer9::initializeFeatures(angle::FeaturesD3D *features) const
30113011
{
3012-
d3d9::InitializeFeatures(features);
3012+
if (!mDisplay->getState().featuresAllDisabled)
3013+
{
3014+
d3d9::InitializeFeatures(features);
3015+
}
30133016
OverrideFeaturesWithDisplayState(features, mDisplay->getState());
30143017
}
30153018

src/libANGLE/renderer/gl/RendererGL.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -219,7 +219,10 @@ RendererGL::RendererGL(std::unique_ptr<FunctionsGL> functions,
219219
mNativeParallelCompileEnabled(false)
220220
{
221221
ASSERT(mFunctions);
222-
nativegl_gl::InitializeFeatures(mFunctions.get(), &mFeatures);
222+
if (!display->getState().featuresAllDisabled)
223+
{
224+
nativegl_gl::InitializeFeatures(mFunctions.get(), &mFeatures);
225+
}
223226
OverrideFeaturesWithDisplayState(&mFeatures, display->getState());
224227
mStateManager =
225228
new StateManagerGL(mFunctions.get(), getNativeCaps(), getNativeExtensions(), mFeatures);

src/libANGLE/renderer/metal/DisplayMtl.mm

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,11 @@ bool IsMetalDisplayAvailable()
6868
mCapsInitialized = false;
6969

7070
GlslangInitialize();
71-
initializeFeatures();
71+
72+
if (!mState.featuresAllDisabled)
73+
{
74+
initializeFeatures();
75+
}
7276

7377
ANGLE_TRY(mFormatTable.initialize(this));
7478

src/libANGLE/renderer/vulkan/RendererVk.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1006,7 +1006,10 @@ angle::Result RendererVk::initializeDevice(DisplayVk *displayVk, uint32_t queueF
10061006
&mProvokingVertexFeatures);
10071007
}
10081008

1009-
initFeatures(deviceExtensionNames);
1009+
if (!displayVk->getState().featuresAllDisabled)
1010+
{
1011+
initFeatures(deviceExtensionNames);
1012+
}
10101013
OverrideFeaturesWithDisplayState(&mFeatures, displayVk->getState());
10111014
mFeaturesInitialized = true;
10121015

0 commit comments

Comments
 (0)