mirror of
https://github.com/godotengine/godot-angle-static.git
synced 2026-01-06 02:09:55 +03:00
GL: Protect against drivers returning 0 max clip distances.
Some Android devices in the wild were hitting the assert that maxClipDistances must be greater than 0 if ANGLE_clip_cull_distance is exposed. Protect against this by disabling various clip/cull extensions if they don't meet the requirements for number of distances. Bug: angleproject:7904 Change-Id: Ic6a5e959437fa7aad5302a12cf8c92d1d18024b2 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/4706684 Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org> Commit-Queue: Geoff Lang <geofflang@chromium.org>
This commit is contained in:
committed by
Angle LUCI CQ
parent
82d68c577b
commit
085f25bbb1
@@ -2020,6 +2020,10 @@ void GenerateCaps(const FunctionsGL *functions,
|
||||
functions->hasGLESExtension("GL_EXT_clip_control");
|
||||
}
|
||||
|
||||
constexpr uint32_t kRequiredClipDistances = 8;
|
||||
constexpr uint32_t kRequiredCullDistances = 8;
|
||||
constexpr uint32_t kRequiredCombinedClipAndCullDistances = 8;
|
||||
|
||||
// GL_APPLE_clip_distance cannot be implemented on top of GL_EXT_clip_cull_distance,
|
||||
// so require either native support or desktop GL.
|
||||
extensions->clipDistanceAPPLE = functions->isAtLeastGL(gl::Version(3, 0)) ||
|
||||
@@ -2027,6 +2031,13 @@ void GenerateCaps(const FunctionsGL *functions,
|
||||
if (extensions->clipDistanceAPPLE)
|
||||
{
|
||||
caps->maxClipDistances = QuerySingleGLInt(functions, GL_MAX_CLIP_DISTANCES_APPLE);
|
||||
|
||||
if (caps->maxClipDistances < kRequiredClipDistances)
|
||||
{
|
||||
WARN() << "Disabling GL_APPLE_clip_distance because only " << caps->maxClipDistances
|
||||
<< " clip distances are supported by the driver.";
|
||||
extensions->clipDistanceAPPLE = false;
|
||||
}
|
||||
}
|
||||
|
||||
// GL_EXT_clip_cull_distance spec requires shader interface blocks to support
|
||||
@@ -2042,11 +2053,23 @@ void GenerateCaps(const FunctionsGL *functions,
|
||||
caps->maxCullDistances = QuerySingleGLInt(functions, GL_MAX_CULL_DISTANCES_EXT);
|
||||
caps->maxCombinedClipAndCullDistances =
|
||||
QuerySingleGLInt(functions, GL_MAX_COMBINED_CLIP_AND_CULL_DISTANCES_EXT);
|
||||
|
||||
if (caps->maxClipDistances < kRequiredClipDistances ||
|
||||
caps->maxCullDistances < kRequiredCullDistances ||
|
||||
caps->maxCombinedClipAndCullDistances < kRequiredCombinedClipAndCullDistances)
|
||||
{
|
||||
WARN() << "Disabling GL_EXT_clip_cull_distance because only " << caps->maxClipDistances
|
||||
<< " clip distances, " << caps->maxCullDistances << " cull distances and "
|
||||
<< caps->maxCombinedClipAndCullDistances
|
||||
<< " combined clip/cull distances are supported by the driver.";
|
||||
extensions->clipCullDistanceEXT = false;
|
||||
}
|
||||
}
|
||||
|
||||
// Same as GL_EXT_clip_cull_distance but with cull distance support being optional.
|
||||
extensions->clipCullDistanceANGLE =
|
||||
functions->isAtLeastGL(gl::Version(3, 0)) || extensions->clipCullDistanceEXT;
|
||||
(functions->isAtLeastGL(gl::Version(3, 0)) || extensions->clipCullDistanceEXT) &&
|
||||
caps->maxClipDistances >= kRequiredClipDistances;
|
||||
ASSERT(!extensions->clipCullDistanceANGLE || caps->maxClipDistances > 0);
|
||||
|
||||
// GL_OES_shader_image_atomic
|
||||
|
||||
Reference in New Issue
Block a user