mirror of
https://github.com/MobileGL-Dev/MobileGL
synced 2026-09-11 21:58:31 +09:00
[Feat] (Loader): detect GL_OES_viewport_array in the GLES capability scan
This commit is contained in:
@@ -932,6 +932,9 @@ namespace MobileGL::MG_Util::BackendLoader {
|
|||||||
if (std::strcmp(extension, "GL_EXT_clip_cull_distance") == 0) {
|
if (std::strcmp(extension, "GL_EXT_clip_cull_distance") == 0) {
|
||||||
caps.SupportsClipDistance = true;
|
caps.SupportsClipDistance = true;
|
||||||
}
|
}
|
||||||
|
if (std::strcmp(extension, "GL_OES_viewport_array") == 0) {
|
||||||
|
caps.SupportsViewportArray = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// The pointer check on top of the extension check makes each flag sufficient on its own
|
// The pointer check on top of the extension check makes each flag sufficient on its own
|
||||||
@@ -989,6 +992,8 @@ namespace MobileGL::MG_Util::BackendLoader {
|
|||||||
MGLOG_I(" base instance (EXT_base_instance; emulated by attribute offsets when absent): %s",
|
MGLOG_I(" base instance (EXT_base_instance; emulated by attribute offsets when absent): %s",
|
||||||
caps.SupportsBaseInstance ? "yes" : "no");
|
caps.SupportsBaseInstance ? "yes" : "no");
|
||||||
MGLOG_I(" clip distances (EXT_clip_cull_distance): %s", caps.SupportsClipDistance ? "yes" : "no");
|
MGLOG_I(" clip distances (EXT_clip_cull_distance): %s", caps.SupportsClipDistance ? "yes" : "no");
|
||||||
|
MGLOG_I(" viewport array (OES_viewport_array; gl_ViewportIndex collapses to viewport 0 when absent): %s",
|
||||||
|
caps.SupportsViewportArray ? "yes" : "no");
|
||||||
|
|
||||||
// LOAD-BEARING STRING, not just a banner. android-plugin/trace-replay-ci.sh's
|
// LOAD-BEARING STRING, not just a banner. android-plugin/trace-replay-ci.sh's
|
||||||
// is_angle_surface_lost() greps mobilegl.log for exactly "OpenGL ES capabilities:" to
|
// is_angle_surface_lost() greps mobilegl.log for exactly "OpenGL ES capabilities:" to
|
||||||
|
|||||||
@@ -1182,6 +1182,21 @@ namespace MobileGL {
|
|||||||
// compile and the per-distance enables have nowhere to go - clipping silently never
|
// compile and the per-distance enables have nowhere to go - clipping silently never
|
||||||
// happens, which is exactly what KHR-GLxx.clip_distance.functional catches.
|
// happens, which is exactly what KHR-GLxx.clip_distance.functional catches.
|
||||||
Bool SupportsClipDistance = false;
|
Bool SupportsClipDistance = false;
|
||||||
|
// GL_OES_viewport_array is present: the driver knows gl_ViewportIndex in ESSL - and
|
||||||
|
// only then. ESSL has no core spelling for it at ANY version, while SPIRV-Cross prints
|
||||||
|
// the identifier bare and requests nothing for it (contrast gl_Layer, which it backs
|
||||||
|
// with GL_NV_viewport_array2 on ES), so the `#extension GL_OES_viewport_array :
|
||||||
|
// require` line has to be inserted into the emitted source - see
|
||||||
|
// RequestViewportArrayExtension. Without the extension the stage does not compile at
|
||||||
|
// all and the whole program becomes unusable, which on DirectGLES means every draw
|
||||||
|
// using it silently renders nothing; LowerViewportIndexPass is the fallback that
|
||||||
|
// demotes the builtin so the program still links and degrades to viewport 0.
|
||||||
|
//
|
||||||
|
// Extension string only, deliberately: DirectGLES does not call any of the indexed
|
||||||
|
// OES entry points yet, so there is no pointer to require. When that forwarding lands
|
||||||
|
// this must gain the pointer check as well - the rule everywhere else in this struct,
|
||||||
|
// because eglGetProcAddress can hand back a stub that silently drops every call.
|
||||||
|
Bool SupportsViewportArray = false;
|
||||||
// GL_RENDERER contains "ANGLE".
|
// GL_RENDERER contains "ANGLE".
|
||||||
Bool IsAngleRenderer = false;
|
Bool IsAngleRenderer = false;
|
||||||
// GL_RENDERER contains both "ANGLE" and "llvmpipe".
|
// GL_RENDERER contains both "ANGLE" and "llvmpipe".
|
||||||
|
|||||||
Reference in New Issue
Block a user