Merge branch 'Feat/Backend-Direct-GLES' of https://github.com/MobileGL-Dev/MobileGL into Feat/Backend-Direct-GLES

This commit is contained in:
2026-02-03 17:50:34 +08:00
2 changed files with 103 additions and 100 deletions
@@ -15,27 +15,27 @@ namespace MobileGL {
// -------------------- Rasterization -------------------- // -------------------- Rasterization --------------------
void RenderState::SetViewport(IntVec4 viewport) { void RenderState::SetViewport(IntVec4 viewport) {
m_viewport = viewport; m_parameters.Viewport = viewport;
} }
const IntVec4& RenderState::GetViewport() const { const IntVec4& RenderState::GetViewport() const {
return m_viewport; return m_parameters.Viewport;
} }
// -------------------- Capabilities -------------------- // -------------------- Capabilities --------------------
void RenderState::SetCapability(CapabilityInput cap, Bool enabled) { void RenderState::SetCapability(CapabilityInput cap, Bool enabled) {
switch (cap) { switch (cap) {
case CapabilityInput::Blend: case CapabilityInput::Blend:
m_blendEnabled = enabled; m_parameters.BlendEnabled = enabled;
break; break;
case CapabilityInput::DepthTest: case CapabilityInput::DepthTest:
m_depthTestEnabled = enabled; m_parameters.DepthTestEnabled = enabled;
break; break;
case CapabilityInput::CullFace: case CapabilityInput::CullFace:
m_cullFaceEnabled = enabled; m_parameters.CullFaceEnabled = enabled;
break; break;
case CapabilityInput::ScissorTest: case CapabilityInput::ScissorTest:
m_scissorTestEnabled = enabled; m_parameters.ScissorTestEnabled = enabled;
break; break;
default: // not supported currently default: // not supported currently
break; break;
@@ -45,13 +45,13 @@ namespace MobileGL {
Bool RenderState::IsCapabilityEnabled(CapabilityInput cap) const { Bool RenderState::IsCapabilityEnabled(CapabilityInput cap) const {
switch (cap) { switch (cap) {
case CapabilityInput::Blend: case CapabilityInput::Blend:
return m_blendEnabled; return m_parameters.BlendEnabled;
case CapabilityInput::DepthTest: case CapabilityInput::DepthTest:
return m_depthTestEnabled; return m_parameters.DepthTestEnabled;
case CapabilityInput::CullFace: case CapabilityInput::CullFace:
return m_cullFaceEnabled; return m_parameters.CullFaceEnabled;
case CapabilityInput::ScissorTest: case CapabilityInput::ScissorTest:
return m_scissorTestEnabled; return m_parameters.ScissorTestEnabled;
default: default:
return false; return false;
} }
@@ -60,114 +60,114 @@ namespace MobileGL {
// -------------------- Blending -------------------- // -------------------- Blending --------------------
void RenderState::SetBlendFunc(BlendFactor srcRGB, BlendFactor dstRGB, BlendFactor srcAlpha, void RenderState::SetBlendFunc(BlendFactor srcRGB, BlendFactor dstRGB, BlendFactor srcAlpha,
BlendFactor dstAlpha) { BlendFactor dstAlpha) {
m_srcFactorRGB = srcRGB; m_parameters.SrcFactorRGB = srcRGB;
m_dstFactorRGB = dstRGB; m_parameters.DstFactorRGB = dstRGB;
m_srcFactorAlpha = srcAlpha; m_parameters.SrcFactorAlpha = srcAlpha;
m_dstFactorAlpha = dstAlpha; m_parameters.DstFactorAlpha = dstAlpha;
} }
void RenderState::GetBlendFunc(BlendFactor& srcRGB, BlendFactor& dstRGB, BlendFactor& srcAlpha, void RenderState::GetBlendFunc(BlendFactor& srcRGB, BlendFactor& dstRGB, BlendFactor& srcAlpha,
BlendFactor& dstAlpha) const { BlendFactor& dstAlpha) const {
srcRGB = m_srcFactorRGB; srcRGB = m_parameters.SrcFactorRGB;
dstRGB = m_dstFactorRGB; dstRGB = m_parameters.DstFactorRGB;
srcAlpha = m_srcFactorAlpha; srcAlpha = m_parameters.SrcFactorAlpha;
dstAlpha = m_dstFactorAlpha; dstAlpha = m_parameters.DstFactorAlpha;
} }
// -------------------- Depth -------------------- // -------------------- Depth --------------------
void RenderState::SetDepthFunc(DepthTestFunc func) { void RenderState::SetDepthFunc(DepthTestFunc func) {
m_depthFunc = func; m_parameters.DepthFunc = func;
} }
DepthTestFunc RenderState::GetDepthFunc() const { DepthTestFunc RenderState::GetDepthFunc() const {
return m_depthFunc; return m_parameters.DepthFunc;
} }
void RenderState::SetDepthMask(Bool flag) { void RenderState::SetDepthMask(Bool flag) {
m_depthMask = flag; m_parameters.DepthMask = flag;
} }
Bool RenderState::GetDepthMask() const { Bool RenderState::GetDepthMask() const {
return m_depthMask; return m_parameters.DepthMask;
} }
// -------------------- Color Mask -------------------- // -------------------- Color Mask --------------------
void RenderState::SetColorMask(BoolVec4 mask) { void RenderState::SetColorMask(BoolVec4 mask) {
m_colorMask = mask; m_parameters.ColorMask = mask;
} }
const BoolVec4 RenderState::GetColorMask() const { const BoolVec4 RenderState::GetColorMask() const {
return m_colorMask; return m_parameters.ColorMask;
} }
// -------------------- Clear State -------------------- // -------------------- Clear State --------------------
void RenderState::SetClearColor(FloatVec4 color) { void RenderState::SetClearColor(FloatVec4 color) {
m_clearColor = color; m_parameters.ClearColor = color;
} }
const FloatVec4& RenderState::GetClearColor() const { const FloatVec4& RenderState::GetClearColor() const {
return m_clearColor; return m_parameters.ClearColor;
} }
void RenderState::SetClearDepth(Float depth) { void RenderState::SetClearDepth(Float depth) {
m_clearDepth = depth; m_parameters.ClearDepth = depth;
} }
Float RenderState::GetClearDepth() const { Float RenderState::GetClearDepth() const {
return m_clearDepth; return m_parameters.ClearDepth;
} }
// -------------------- Pixel Store -------------------- // -------------------- Pixel Store --------------------
void RenderState::SetPixelStoreParam(PixelStoreParam param, Int value) { void RenderState::SetPixelStoreParam(PixelStoreParam param, Int value) {
switch (param) { switch (param) {
case PixelStoreParam::PackAlignment: case PixelStoreParam::PackAlignment:
m_packParameters.Alignment = value; m_parameters.PackParameters.Alignment = value;
break; break;
case PixelStoreParam::PackRowLength: case PixelStoreParam::PackRowLength:
m_packParameters.RowLength = value; m_parameters.PackParameters.RowLength = value;
break; break;
case PixelStoreParam::PackImageHeight: case PixelStoreParam::PackImageHeight:
m_packParameters.ImageHeight = value; m_parameters.PackParameters.ImageHeight = value;
break; break;
case PixelStoreParam::PackSkipPixels: case PixelStoreParam::PackSkipPixels:
m_packParameters.SkipPixels = value; m_parameters.PackParameters.SkipPixels = value;
break; break;
case PixelStoreParam::PackSkipRows: case PixelStoreParam::PackSkipRows:
m_packParameters.SkipRows = value; m_parameters.PackParameters.SkipRows = value;
break; break;
case PixelStoreParam::PackSkipImages: case PixelStoreParam::PackSkipImages:
m_packParameters.SkipImages = value; m_parameters.PackParameters.SkipImages = value;
break; break;
case PixelStoreParam::PackSwapBytes: case PixelStoreParam::PackSwapBytes:
m_packParameters.SwapBytes = value != 0; m_parameters.PackParameters.SwapBytes = value != 0;
break; break;
case PixelStoreParam::PackLsbFirst: case PixelStoreParam::PackLsbFirst:
m_packParameters.LSBFirst = value != 0; m_parameters.PackParameters.LSBFirst = value != 0;
break; break;
case PixelStoreParam::UnpackAlignment: case PixelStoreParam::UnpackAlignment:
m_unpackParameters.Alignment = value; m_parameters.UnpackParameters.Alignment = value;
break; break;
case PixelStoreParam::UnpackRowLength: case PixelStoreParam::UnpackRowLength:
m_unpackParameters.RowLength = value; m_parameters.UnpackParameters.RowLength = value;
break; break;
case PixelStoreParam::UnpackImageHeight: case PixelStoreParam::UnpackImageHeight:
m_unpackParameters.ImageHeight = value; m_parameters.UnpackParameters.ImageHeight = value;
break; break;
case PixelStoreParam::UnpackSkipPixels: case PixelStoreParam::UnpackSkipPixels:
m_unpackParameters.SkipPixels = value; m_parameters.UnpackParameters.SkipPixels = value;
break; break;
case PixelStoreParam::UnpackSkipRows: case PixelStoreParam::UnpackSkipRows:
m_unpackParameters.SkipRows = value; m_parameters.UnpackParameters.SkipRows = value;
break; break;
case PixelStoreParam::UnpackSkipImages: case PixelStoreParam::UnpackSkipImages:
m_unpackParameters.SkipImages = value; m_parameters.UnpackParameters.SkipImages = value;
break; break;
case PixelStoreParam::UnpackSwapBytes: case PixelStoreParam::UnpackSwapBytes:
m_unpackParameters.SwapBytes = value != 0; m_parameters.UnpackParameters.SwapBytes = value != 0;
MGLOG_D("%s: SwapBytes = %s", __func__, value ? "true" : "false"); MGLOG_D("%s: SwapBytes = %s", __func__, value ? "true" : "false");
break; break;
case PixelStoreParam::UnpackLsbFirst: case PixelStoreParam::UnpackLsbFirst:
m_unpackParameters.LSBFirst = value != 0; m_parameters.UnpackParameters.LSBFirst = value != 0;
break; break;
default: default:
MOBILEGL_ASSERT(false, "Invalid PixelStoreParam enum: %d", static_cast<int>(param)); MOBILEGL_ASSERT(false, "Invalid PixelStoreParam enum: %d", static_cast<int>(param));
@@ -178,37 +178,37 @@ namespace MobileGL {
Int RenderState::GetPixelStoreParam(PixelStoreParam param) const { Int RenderState::GetPixelStoreParam(PixelStoreParam param) const {
switch (param) { switch (param) {
case PixelStoreParam::PackAlignment: case PixelStoreParam::PackAlignment:
return m_packParameters.Alignment; return m_parameters.PackParameters.Alignment;
case PixelStoreParam::PackRowLength: case PixelStoreParam::PackRowLength:
return m_packParameters.RowLength; return m_parameters.PackParameters.RowLength;
case PixelStoreParam::PackImageHeight: case PixelStoreParam::PackImageHeight:
return m_packParameters.ImageHeight; return m_parameters.PackParameters.ImageHeight;
case PixelStoreParam::PackSkipPixels: case PixelStoreParam::PackSkipPixels:
return m_packParameters.SkipPixels; return m_parameters.PackParameters.SkipPixels;
case PixelStoreParam::PackSkipRows: case PixelStoreParam::PackSkipRows:
return m_packParameters.SkipRows; return m_parameters.PackParameters.SkipRows;
case PixelStoreParam::PackSkipImages: case PixelStoreParam::PackSkipImages:
return m_packParameters.SkipImages; return m_parameters.PackParameters.SkipImages;
case PixelStoreParam::PackSwapBytes: case PixelStoreParam::PackSwapBytes:
return m_packParameters.SwapBytes ? 1 : 0; return m_parameters.PackParameters.SwapBytes ? 1 : 0;
case PixelStoreParam::PackLsbFirst: case PixelStoreParam::PackLsbFirst:
return m_packParameters.LSBFirst ? 1 : 0; return m_parameters.PackParameters.LSBFirst ? 1 : 0;
case PixelStoreParam::UnpackAlignment: case PixelStoreParam::UnpackAlignment:
return m_unpackParameters.Alignment; return m_parameters.UnpackParameters.Alignment;
case PixelStoreParam::UnpackRowLength: case PixelStoreParam::UnpackRowLength:
return m_unpackParameters.RowLength; return m_parameters.UnpackParameters.RowLength;
case PixelStoreParam::UnpackImageHeight: case PixelStoreParam::UnpackImageHeight:
return m_unpackParameters.ImageHeight; return m_parameters.UnpackParameters.ImageHeight;
case PixelStoreParam::UnpackSkipPixels: case PixelStoreParam::UnpackSkipPixels:
return m_unpackParameters.SkipPixels; return m_parameters.UnpackParameters.SkipPixels;
case PixelStoreParam::UnpackSkipRows: case PixelStoreParam::UnpackSkipRows:
return m_unpackParameters.SkipRows; return m_parameters.UnpackParameters.SkipRows;
case PixelStoreParam::UnpackSkipImages: case PixelStoreParam::UnpackSkipImages:
return m_unpackParameters.SkipImages; return m_parameters.UnpackParameters.SkipImages;
case PixelStoreParam::UnpackSwapBytes: case PixelStoreParam::UnpackSwapBytes:
return m_unpackParameters.SwapBytes ? 1 : 0; return m_parameters.UnpackParameters.SwapBytes ? 1 : 0;
case PixelStoreParam::UnpackLsbFirst: case PixelStoreParam::UnpackLsbFirst:
return m_unpackParameters.LSBFirst ? 1 : 0; return m_parameters.UnpackParameters.LSBFirst ? 1 : 0;
default: default:
MOBILEGL_ASSERT(false, "Invalid PixelStoreParam enum: %d", static_cast<int>(param)); MOBILEGL_ASSERT(false, "Invalid PixelStoreParam enum: %d", static_cast<int>(param));
return 0; return 0;
@@ -216,25 +216,25 @@ namespace MobileGL {
} }
PixelStoreParameters RenderState::GetPixelStoreParameters(Bool isUnpack) const { PixelStoreParameters RenderState::GetPixelStoreParameters(Bool isUnpack) const {
return isUnpack ? m_unpackParameters : m_packParameters; return isUnpack ? m_parameters.UnpackParameters : m_parameters.PackParameters;
} }
// -------------------- Cull Face -------------------- // -------------------- Cull Face --------------------
void RenderState::SetCullFaceMode(CullFaceMode mode) { void RenderState::SetCullFaceMode(CullFaceMode mode) {
m_cullFaceMode = mode; m_parameters.CullFaceModeSetting = mode;
} }
CullFaceMode RenderState::GetCullFaceMode() const { CullFaceMode RenderState::GetCullFaceMode() const {
return m_cullFaceMode; return m_parameters.CullFaceModeSetting;
} }
// --------------------- Scissor --------------------- // --------------------- Scissor ---------------------
void RenderState::SetScissorBox(IntVec4 box) { void RenderState::SetScissorBox(IntVec4 box) {
m_scissorBox = box; m_parameters.ScissorBox = box;
} }
const IntVec4& RenderState::GetScissorBox() const { const IntVec4& RenderState::GetScissorBox() const {
return m_scissorBox; return m_parameters.ScissorBox;
} }
} // namespace GLState } // namespace GLState
} // namespace MG_State } // namespace MG_State
@@ -7,9 +7,8 @@
// End of Source File Header // End of Source File Header
#pragma once #pragma once
#include "MG_Util/Math/VectorTypes.h"
#include "MG_Util/Types.h"
#include <Includes.h> #include <Includes.h>
#include <MG_Util/Math/VectorTypes.h>
namespace MobileGL { namespace MobileGL {
enum class BlendFactor { enum class BlendFactor {
@@ -128,6 +127,42 @@ namespace MobileGL {
Int Alignment = 4; Int Alignment = 4;
}; };
struct RenderStateParameters {
// Rasterization
IntVec4 Viewport = IntVec4(0, 0, 0, 0); // x, y, width, height
// Blending
Bool BlendEnabled = false;
BlendFactor SrcFactorRGB = BlendFactor::One;
BlendFactor DstFactorRGB = BlendFactor::Zero;
BlendFactor SrcFactorAlpha = BlendFactor::One;
BlendFactor DstFactorAlpha = BlendFactor::Zero;
// Depth
Bool DepthTestEnabled = false;
DepthTestFunc DepthFunc = DepthTestFunc::Less;
Bool DepthMask = true;
// Color Mask
BoolVec4 ColorMask = BoolVec4(true, true, true, true);
// Clear State
FloatVec4 ClearColor = FloatVec4(0.0f, 0.0f, 0.0f, 1.0f);
Float ClearDepth = 1.0f;
// Pixel Store
PixelStoreParameters PackParameters;
PixelStoreParameters UnpackParameters;
// Cull Face
Bool CullFaceEnabled = false;
CullFaceMode CullFaceModeSetting = CullFaceMode::Back;
// Scissor
Bool ScissorTestEnabled = false;
IntVec4 ScissorBox = IntVec4(0, 0, 0, 0); // x, y, width, height
};
namespace MG_State { namespace MG_State {
namespace GLState { namespace GLState {
class RenderState { class RenderState {
@@ -177,39 +212,7 @@ namespace MobileGL {
const IntVec4& GetScissorBox() const; // x, y, width, height const IntVec4& GetScissorBox() const; // x, y, width, height
private: private:
// Rasterization RenderStateParameters m_parameters;
IntVec4 m_viewport = IntVec4(0, 0, 0, 0); // x, y, width, height
// Blending
Bool m_blendEnabled = false;
BlendFactor m_srcFactorRGB = BlendFactor::One;
BlendFactor m_dstFactorRGB = BlendFactor::Zero;
BlendFactor m_srcFactorAlpha = BlendFactor::One;
BlendFactor m_dstFactorAlpha = BlendFactor::Zero;
// Depth
Bool m_depthTestEnabled = false;
DepthTestFunc m_depthFunc = DepthTestFunc::Less;
Bool m_depthMask = true;
// Color Mask
BoolVec4 m_colorMask = BoolVec4(true, true, true, true);
// Clear State
FloatVec4 m_clearColor = FloatVec4(0.0f, 0.0f, 0.0f, 1.0f);
Float m_clearDepth = 1.0f;
// Pixel Store
PixelStoreParameters m_packParameters;
PixelStoreParameters m_unpackParameters;
// Cull Face
Bool m_cullFaceEnabled = false;
CullFaceMode m_cullFaceMode = CullFaceMode::Back;
// Scissor
Bool m_scissorTestEnabled = false;
IntVec4 m_scissorBox = IntVec4(0, 0, 0, 0); // x, y, width, height
}; };
} // namespace GLState } // namespace GLState
} // namespace MG_State } // namespace MG_State