[Fix] (MG_State/RenderState): track front face mode

This commit is contained in:
2026-06-06 08:46:43 +08:00
parent 5cfe9c8998
commit dd2bd267c1
13 changed files with 88 additions and 3 deletions
@@ -530,6 +530,10 @@ namespace MobileGL::MG_Backend::DirectGLES {
const CullFaceMode& cfm = parameters.CullFaceModeSetting; const CullFaceMode& cfm = parameters.CullFaceModeSetting;
g_GLESFuncs.glCullFace(MG_Util::ConvertCullFaceModeToGLEnum(cfm)); g_GLESFuncs.glCullFace(MG_Util::ConvertCullFaceModeToGLEnum(cfm));
} }
if (parameters.FrontFaceModeSetting != g_syncedRenderStateParameters.FrontFaceModeSetting) {
const FrontFaceMode& ffm = parameters.FrontFaceModeSetting;
g_GLESFuncs.glFrontFace(MG_Util::ConvertFrontFaceModeToGLEnum(ffm));
}
} }
{ // Scissor box { // Scissor box
@@ -305,6 +305,9 @@ namespace MobileGL::MG_Impl::GLImpl {
case GL_CULL_FACE_MODE: case GL_CULL_FACE_MODE:
*params = static_cast<GLint>(MG_Util::ConvertCullFaceModeToGLEnum(MG_State::pGLContext->GetCullFaceMode())); *params = static_cast<GLint>(MG_Util::ConvertCullFaceModeToGLEnum(MG_State::pGLContext->GetCullFaceMode()));
break; break;
case GL_FRONT_FACE:
*params = static_cast<GLint>(MG_Util::ConvertFrontFaceModeToGLEnum(MG_State::pGLContext->GetFrontFaceMode()));
break;
case GL_CURRENT_PROGRAM: { case GL_CURRENT_PROGRAM: {
const auto& currentProgram = MG_State::pGLContext->GetCurrentProgram(); const auto& currentProgram = MG_State::pGLContext->GetCurrentProgram();
*params = currentProgram ? (GLint)currentProgram->GetExternalIndex() : 0; *params = currentProgram ? (GLint)currentProgram->GetExternalIndex() : 0;
@@ -154,7 +154,18 @@ namespace MobileGL::MG_Impl::GLImpl {
} }
void FrontFace_State(GLenum mode) { void FrontFace_State(GLenum mode) {
// TODO: implement FrontFaceMode frontFaceMode = MG_Util::ConvertGLEnumToFrontFaceMode(mode);
if (frontFaceMode == FrontFaceMode::Unknown) {
MG_State::pGLContext->RecordError(
ErrorCode::InvalidEnum,
MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", "FrontFace_State",
"Front face mode enum " +
MG_Util::ConvertFrontFaceModeToString(frontFaceMode) + "(" +
MG_Util::ConvertGLEnumToString(mode) + ") is not supported."));
return;
}
MG_State::pGLContext->SetFrontFaceMode(frontFaceMode);
} }
void Enable_State(GLenum cap) { void Enable_State(GLenum cap) {
+8
View File
@@ -405,6 +405,14 @@ namespace MobileGL::MG_State {
return m_renderState.GetCullFaceMode(); return m_renderState.GetCullFaceMode();
} }
void GLContext::SetFrontFaceMode(FrontFaceMode mode) {
m_renderState.SetFrontFaceMode(mode);
}
FrontFaceMode GLContext::GetFrontFaceMode() const {
return m_renderState.GetFrontFaceMode();
}
void GLContext::SetScissorBox(IntVec4 box) { void GLContext::SetScissorBox(IntVec4 box) {
m_renderState.SetScissorBox(box); m_renderState.SetScissorBox(box);
} }
+2
View File
@@ -134,6 +134,8 @@ namespace MobileGL {
PixelStoreParameters GetPixelStoreParameters(Bool isUnpack) const; PixelStoreParameters GetPixelStoreParameters(Bool isUnpack) const;
void SetCullFaceMode(CullFaceMode mode); void SetCullFaceMode(CullFaceMode mode);
CullFaceMode GetCullFaceMode() const; CullFaceMode GetCullFaceMode() const;
void SetFrontFaceMode(FrontFaceMode mode);
FrontFaceMode GetFrontFaceMode() const;
void SetScissorBox(IntVec4 box); // x, y, width, height void SetScissorBox(IntVec4 box); // x, y, width, height
const IntVec4& GetScissorBox() const; // x, y, width, height const IntVec4& GetScissorBox() const; // x, y, width, height
@@ -349,6 +349,17 @@ namespace MobileGL {
return m_parameters.CullFaceModeSetting; return m_parameters.CullFaceModeSetting;
} }
void RenderState::SetFrontFaceMode(FrontFaceMode mode) {
if (m_parameters.FrontFaceModeSetting == mode) return;
m_parameters.FrontFaceModeSetting = mode;
++m_version;
}
FrontFaceMode RenderState::GetFrontFaceMode() const {
return m_parameters.FrontFaceModeSetting;
}
// --------------------- Scissor --------------------- // --------------------- Scissor ---------------------
void RenderState::SetScissorBox(IntVec4 box) { void RenderState::SetScissorBox(IntVec4 box) {
if (m_parameters.ScissorBox == box) return; if (m_parameters.ScissorBox == box) return;
@@ -87,6 +87,13 @@ namespace MobileGL {
Unknown = -1 Unknown = -1
}; };
enum class FrontFaceMode {
CounterClockwise,
Clockwise,
FrontFaceModeCount,
Unknown = -1
};
enum class CapabilityInput { enum class CapabilityInput {
Blend, Blend,
ClipDistance0, ClipDistance0,
@@ -171,6 +178,7 @@ namespace MobileGL {
// Cull Face // Cull Face
Bool CullFaceEnabled = false; Bool CullFaceEnabled = false;
CullFaceMode CullFaceModeSetting = CullFaceMode::Back; CullFaceMode CullFaceModeSetting = CullFaceMode::Back;
FrontFaceMode FrontFaceModeSetting = FrontFaceMode::CounterClockwise;
// Scissor // Scissor
Bool ScissorTestEnabled = false; Bool ScissorTestEnabled = false;
@@ -235,6 +243,8 @@ namespace MobileGL {
// Cull Face // Cull Face
void SetCullFaceMode(CullFaceMode mode); void SetCullFaceMode(CullFaceMode mode);
CullFaceMode GetCullFaceMode() const; CullFaceMode GetCullFaceMode() const;
void SetFrontFaceMode(FrontFaceMode mode);
FrontFaceMode GetFrontFaceMode() const;
// Scissor // Scissor
void SetScissorBox(IntVec4 box); // x, y, width, height void SetScissorBox(IntVec4 box); // x, y, width, height
@@ -137,6 +137,17 @@ namespace MobileGL {
} }
} }
FrontFaceMode ConvertGLEnumToFrontFaceMode(GLenum v) {
switch (v) {
case GL_CCW:
return FrontFaceMode::CounterClockwise;
case GL_CW:
return FrontFaceMode::Clockwise;
default:
return FrontFaceMode::Unknown;
}
}
CapabilityInput ConvertGLEnumToCapabilityInput(GLenum v) { CapabilityInput ConvertGLEnumToCapabilityInput(GLenum v) {
switch (v) { switch (v) {
case GL_BLEND: case GL_BLEND:
@@ -17,6 +17,7 @@ namespace MobileGL {
DepthTestFunc ConvertGLEnumToDepthTestFunc(GLenum value); DepthTestFunc ConvertGLEnumToDepthTestFunc(GLenum value);
PixelStoreParam ConvertGLEnumToPixelStoreParam(GLenum value); PixelStoreParam ConvertGLEnumToPixelStoreParam(GLenum value);
CullFaceMode ConvertGLEnumToCullFaceMode(GLenum value); CullFaceMode ConvertGLEnumToCullFaceMode(GLenum value);
FrontFaceMode ConvertGLEnumToFrontFaceMode(GLenum value);
CapabilityInput ConvertGLEnumToCapabilityInput(GLenum value); CapabilityInput ConvertGLEnumToCapabilityInput(GLenum value);
} // namespace MG_Util } // namespace MG_Util
} // namespace MobileGL } // namespace MobileGL
@@ -138,6 +138,17 @@ namespace MobileGL {
} }
} }
GLenum ConvertFrontFaceModeToGLEnum(FrontFaceMode v) {
switch (v) {
case FrontFaceMode::CounterClockwise:
return GL_CCW;
case FrontFaceMode::Clockwise:
return GL_CW;
default:
return GL_UNKNOWN_MGL;
}
}
GLenum ConvertCapabilityInputToGLEnum(CapabilityInput v) { GLenum ConvertCapabilityInputToGLEnum(CapabilityInput v) {
switch (v) { switch (v) {
case CapabilityInput::Blend: case CapabilityInput::Blend:
@@ -17,6 +17,7 @@ namespace MobileGL {
GLenum ConvertDepthTestFuncToGLEnum(DepthTestFunc value); GLenum ConvertDepthTestFuncToGLEnum(DepthTestFunc value);
GLenum ConvertPixelStoreParamToGLEnum(PixelStoreParam value); GLenum ConvertPixelStoreParamToGLEnum(PixelStoreParam value);
GLenum ConvertCullFaceModeToGLEnum(CullFaceMode value); GLenum ConvertCullFaceModeToGLEnum(CullFaceMode value);
GLenum ConvertFrontFaceModeToGLEnum(FrontFaceMode value);
GLenum ConvertCapabilityInputToGLEnum(CapabilityInput value); GLenum ConvertCapabilityInputToGLEnum(CapabilityInput value);
} // namespace MG_Util } // namespace MG_Util
} // namespace MobileGL } // namespace MobileGL
@@ -120,6 +120,17 @@ namespace MobileGL {
} }
} }
String ConvertFrontFaceModeToString(FrontFaceMode v) {
switch (v) {
case FrontFaceMode::CounterClockwise:
return "CounterClockwise";
case FrontFaceMode::Clockwise:
return "Clockwise";
default:
return "Unknown";
}
}
String ConvertCapabilityInputToString(CapabilityInput v) { String ConvertCapabilityInputToString(CapabilityInput v) {
switch (v) { switch (v) {
case CapabilityInput::Blend: case CapabilityInput::Blend:
@@ -16,6 +16,7 @@ namespace MobileGL {
String ConvertDepthTestFuncToString(DepthTestFunc value); String ConvertDepthTestFuncToString(DepthTestFunc value);
String ConvertPixelStoreParamToString(PixelStoreParam value); String ConvertPixelStoreParamToString(PixelStoreParam value);
String ConvertCullFaceModeToString(CullFaceMode value); String ConvertCullFaceModeToString(CullFaceMode value);
String ConvertFrontFaceModeToString(FrontFaceMode value);
String ConvertCapabilityInputToString(CapabilityInput value); String ConvertCapabilityInputToString(CapabilityInput value);
} // namespace MG_Util } // namespace MG_Util
} // namespace MobileGL } // namespace MobileGL