mirror of
https://github.com/MobileGL-Dev/MobileGL
synced 2026-09-10 13:18:31 +09:00
[Feat] (MG_Backend/DirectGLES, MG_Util/Loader): wire glPolygonMode and glColorMaski into GLES sync
Neither entry point exists in unextended OpenGL ES core, so both are gated on optional extensions detected and cached at init, with a runtime fallback when absent. Loader: - Add glPolygonModeNV/glPolygonModeANGLE and glColorMaskiEXT/glColorMaskiOES to the GLES function table, loaded via a new INIT_GLES_FUNC_OPTIONAL macro that does not log an error when the driver lacks them. - Cache GLESCapabilities.SupportsPolygonMode and SupportsIndexedColorMask from whether the entry points loaded (glColorMaski is GLES 3.2 core with no extension string, so pointer presence is the reliable signal). Sync (SyncRenderState): - Color mask: uniform masks keep using the non-indexed glColorMask (works everywhere); divergent per-draw-buffer masks use glColorMaski (core / EXT / OES, whichever loaded) when SupportsIndexedColorMask, else fall back to broadcasting draw buffer 0. Mirrors the existing indexed-blend block's all-same-vs-per-buffer structure. - Polygon mode: new sync block calls glPolygonModeNV/ANGLE(GL_FRONT_AND_BACK, mode) when SupportsPolygonMode; without the extension the mode stays FILL and non-FILL requests are dropped. Library builds clean; full SanityTest sweep green (30/30).
This commit is contained in:
@@ -702,11 +702,47 @@ namespace MobileGL::MG_Backend::DirectGLES {
|
||||
}
|
||||
}
|
||||
|
||||
{ // Color mask. GLES core has only the non-indexed glColorMask, so sync draw buffer 0.
|
||||
if (parameters.ColorMasks[0] != g_syncedRenderStateParameters.ColorMasks[0]) {
|
||||
const BoolVec4& colorMask = parameters.ColorMasks[0];
|
||||
g_GLESFuncs.glColorMask(ToGLBoolean(colorMask.x()), ToGLBoolean(colorMask.y()),
|
||||
ToGLBoolean(colorMask.z()), ToGLBoolean(colorMask.w()));
|
||||
{ // Color mask. Uniform masks use the non-indexed glColorMask (works everywhere); divergent
|
||||
// per-draw-buffer masks use the indexed glColorMaski when draw_buffers_indexed is
|
||||
// available, otherwise fall back to broadcasting draw buffer 0. Mirrors the blend block.
|
||||
using FBO = MG_State::GLState::FramebufferObject;
|
||||
const auto& targetMasks = parameters.ColorMasks;
|
||||
const auto& syncedMasks = g_syncedRenderStateParameters.ColorMasks;
|
||||
|
||||
Bool anyDirty = false;
|
||||
Bool allSame = true;
|
||||
for (Uint i = 0; i < FBO::MAX_DRAW_BUFFERS; ++i) {
|
||||
if (targetMasks[i] != syncedMasks[i]) anyDirty = true;
|
||||
if (i > 0 && targetMasks[i] != targetMasks[0]) allSame = false;
|
||||
}
|
||||
|
||||
if (anyDirty) {
|
||||
if (allSame || !g_GLESCapabilities.SupportsIndexedColorMask) {
|
||||
const BoolVec4& m = targetMasks[0];
|
||||
g_GLESFuncs.glColorMask(ToGLBoolean(m.x()), ToGLBoolean(m.y()), ToGLBoolean(m.z()),
|
||||
ToGLBoolean(m.w()));
|
||||
} else {
|
||||
const auto colorMaskiFn = g_GLESFuncs.glColorMaski ? g_GLESFuncs.glColorMaski
|
||||
: g_GLESFuncs.glColorMaskiEXT ? g_GLESFuncs.glColorMaskiEXT
|
||||
: g_GLESFuncs.glColorMaskiOES;
|
||||
for (Uint i = 0; i < FBO::MAX_DRAW_BUFFERS; ++i) {
|
||||
if (targetMasks[i] != syncedMasks[i]) {
|
||||
const BoolVec4& m = targetMasks[i];
|
||||
colorMaskiFn(i, ToGLBoolean(m.x()), ToGLBoolean(m.y()), ToGLBoolean(m.z()),
|
||||
ToGLBoolean(m.w()));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
{ // Polygon mode. GLES core has no glPolygonMode; use NV/ANGLE_polygon_mode when present.
|
||||
// Without the extension the mode stays FILL and non-FILL requests are dropped.
|
||||
if (parameters.PolygonModeFront != g_syncedRenderStateParameters.PolygonModeFront &&
|
||||
g_GLESCapabilities.SupportsPolygonMode) {
|
||||
const auto polygonModeFn =
|
||||
g_GLESFuncs.glPolygonModeNV ? g_GLESFuncs.glPolygonModeNV : g_GLESFuncs.glPolygonModeANGLE;
|
||||
polygonModeFn(GL_FRONT_AND_BACK, parameters.PolygonModeFront);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user