Files
MobileGL/MobileGL/MG_Util/Converters/MGToGL/RenderStateEnumConverter.cpp
T
swung0x48 cf165c0db5 [Fix] (MG_Backend/DirectVulkan): support Voxy rendering
Implemented:

- Advertise Voxy-required DirectVulkan extensions without raising the reported OpenGL version.

- Add DirectVulkan compute, indirect draw count, DSA, readback, and buffer state paths needed by Voxy.

Fixed:

- Enable Vulkan shaderInt64 and drawIndirectFirstInstance so Voxy baseInstance-driven LOD draws address the correct section data.

- Fix DirectVulkan synchronization, framebuffer, texture readback, and shader interface handling used by Voxy and Minecraft screenshots.

Tests:

- Add MG_Test coverage for DirectVulkan extension advertising, DSA buffer/texture/framebuffer/vertex-array behavior, persistent mapped readback, and shader/program paths.
2026-06-09 00:37:37 +08:00

241 lines
9.2 KiB
C++

// MobileGL - MobileGL/MG_Util/Converters/MGToGL/RenderStateEnumConverter.cpp
// Copyright (c) 2025-2026 MobileGL-Dev
// Licensed under the GNU Lesser General Public License v3.0:
// https://www.gnu.org/licenses/gpl-3.0.txt
// https://www.gnu.org/licenses/lgpl-3.0.txt
// SPDX-License-Identifier: LGPL-3.0-only
// End of Source File Header
#include "RenderStateEnumConverter.h"
namespace MobileGL {
namespace MG_Util {
GLenum ConvertBlendFactorToGLEnum(BlendFactor v) {
switch (v) {
case BlendFactor::Zero:
return GL_ZERO;
case BlendFactor::One:
return GL_ONE;
case BlendFactor::SrcColor:
return GL_SRC_COLOR;
case BlendFactor::OneMinusSrcColor:
return GL_ONE_MINUS_SRC_COLOR;
case BlendFactor::DstColor:
return GL_DST_COLOR;
case BlendFactor::OneMinusDstColor:
return GL_ONE_MINUS_DST_COLOR;
case BlendFactor::SrcAlpha:
return GL_SRC_ALPHA;
case BlendFactor::OneMinusSrcAlpha:
return GL_ONE_MINUS_SRC_ALPHA;
case BlendFactor::DstAlpha:
return GL_DST_ALPHA;
case BlendFactor::OneMinusDstAlpha:
return GL_ONE_MINUS_DST_ALPHA;
case BlendFactor::ConstantColor:
return GL_CONSTANT_COLOR;
case BlendFactor::OneMinusConstantColor:
return GL_ONE_MINUS_CONSTANT_COLOR;
case BlendFactor::ConstantAlpha:
return GL_CONSTANT_ALPHA;
case BlendFactor::OneMinusConstantAlpha:
return GL_ONE_MINUS_CONSTANT_ALPHA;
default:
return GL_UNKNOWN_MGL;
}
}
GLenum ConvertBlendEquationToGLEnum(BlendEquation v) {
switch (v) {
case BlendEquation::Add:
return GL_FUNC_ADD;
case BlendEquation::Subtract:
return GL_FUNC_SUBTRACT;
case BlendEquation::ReverseSubtract:
return GL_FUNC_REVERSE_SUBTRACT;
case BlendEquation::Min:
return GL_MIN;
case BlendEquation::Max:
return GL_MAX;
default:
return GL_UNKNOWN_MGL;
}
}
GLenum ConvertDepthTestFuncToGLEnum(DepthTestFunc v) {
switch (v) {
case DepthTestFunc::Never:
return GL_NEVER;
case DepthTestFunc::Less:
return GL_LESS;
case DepthTestFunc::Equal:
return GL_EQUAL;
case DepthTestFunc::LessEqual:
return GL_LEQUAL;
case DepthTestFunc::Greater:
return GL_GREATER;
case DepthTestFunc::NotEqual:
return GL_NOTEQUAL;
case DepthTestFunc::GreaterEqual:
return GL_GEQUAL;
case DepthTestFunc::Always:
return GL_ALWAYS;
default:
return GL_UNKNOWN_MGL;
}
}
GLenum ConvertPixelStoreParamToGLEnum(PixelStoreParam v) {
switch (v) {
case PixelStoreParam::PackAlignment:
return GL_PACK_ALIGNMENT;
case PixelStoreParam::PackRowLength:
return GL_PACK_ROW_LENGTH;
case PixelStoreParam::PackImageHeight:
return GL_PACK_IMAGE_HEIGHT;
case PixelStoreParam::PackSkipRows:
return GL_PACK_SKIP_ROWS;
case PixelStoreParam::PackSkipPixels:
return GL_PACK_SKIP_PIXELS;
case PixelStoreParam::PackSkipImages:
return GL_PACK_SKIP_IMAGES;
case PixelStoreParam::PackSwapBytes:
return GL_PACK_SWAP_BYTES;
case PixelStoreParam::PackLSBFirst:
return GL_PACK_LSB_FIRST;
case PixelStoreParam::UnpackAlignment:
return GL_UNPACK_ALIGNMENT;
case PixelStoreParam::UnpackRowLength:
return GL_UNPACK_ROW_LENGTH;
case PixelStoreParam::UnpackImageHeight:
return GL_UNPACK_IMAGE_HEIGHT;
case PixelStoreParam::UnpackSkipRows:
return GL_UNPACK_SKIP_ROWS;
case PixelStoreParam::UnpackSkipPixels:
return GL_UNPACK_SKIP_PIXELS;
case PixelStoreParam::UnpackSkipImages:
return GL_UNPACK_SKIP_IMAGES;
case PixelStoreParam::UnpackSwapBytes:
return GL_UNPACK_SWAP_BYTES;
case PixelStoreParam::UnpackLSBFirst:
return GL_UNPACK_LSB_FIRST;
default:
return GL_UNKNOWN_MGL;
}
}
GLenum ConvertCullFaceModeToGLEnum(CullFaceMode v) {
switch (v) {
case CullFaceMode::Front:
return GL_FRONT;
case CullFaceMode::Back:
return GL_BACK;
case CullFaceMode::FrontAndBack:
return GL_FRONT_AND_BACK;
default:
return GL_UNKNOWN_MGL;
}
}
GLenum ConvertFrontFaceModeToGLEnum(FrontFaceMode v) {
switch (v) {
case FrontFaceMode::CounterClockwise:
return GL_CCW;
case FrontFaceMode::Clockwise:
return GL_CW;
default:
return GL_UNKNOWN_MGL;
}
}
GLenum ConvertProvokingVertexModeToGLEnum(ProvokingVertexMode v) {
switch (v) {
case ProvokingVertexMode::FirstVertex:
return GL_FIRST_VERTEX_CONVENTION;
case ProvokingVertexMode::LastVertex:
return GL_LAST_VERTEX_CONVENTION;
default:
return GL_UNKNOWN_MGL;
}
}
GLenum ConvertCapabilityInputToGLEnum(CapabilityInput v) {
switch (v) {
case CapabilityInput::Blend:
return GL_BLEND;
case CapabilityInput::ClipDistance0:
return GL_CLIP_DISTANCE0;
case CapabilityInput::ClipDistance1:
return GL_CLIP_DISTANCE1;
case CapabilityInput::ClipDistance2:
return GL_CLIP_DISTANCE2;
case CapabilityInput::ClipDistance3:
return GL_CLIP_DISTANCE3;
case CapabilityInput::ClipDistance4:
return GL_CLIP_DISTANCE4;
case CapabilityInput::ClipDistance5:
return GL_CLIP_DISTANCE5;
case CapabilityInput::ClipDistance6:
return GL_CLIP_DISTANCE6;
case CapabilityInput::ClipDistance7:
return GL_CLIP_DISTANCE7;
case CapabilityInput::ColorLogicOp:
return GL_COLOR_LOGIC_OP;
case CapabilityInput::CullFace:
return GL_CULL_FACE;
case CapabilityInput::DebugOutput:
return GL_DEBUG_OUTPUT;
case CapabilityInput::DebugOutputSynchronous:
return GL_DEBUG_OUTPUT_SYNCHRONOUS;
case CapabilityInput::DepthClamp:
return GL_DEPTH_CLAMP;
case CapabilityInput::DepthTest:
return GL_DEPTH_TEST;
case CapabilityInput::Dither:
return GL_DITHER;
case CapabilityInput::FramebufferSrgb:
return GL_FRAMEBUFFER_SRGB;
case CapabilityInput::LineSmooth:
return GL_LINE_SMOOTH;
case CapabilityInput::Multisample:
return GL_MULTISAMPLE;
case CapabilityInput::PolygonOffsetFill:
return GL_POLYGON_OFFSET_FILL;
case CapabilityInput::PolygonOffsetLine:
return GL_POLYGON_OFFSET_LINE;
case CapabilityInput::PolygonOffsetPoint:
return GL_POLYGON_OFFSET_POINT;
case CapabilityInput::PolygonSmooth:
return GL_POLYGON_SMOOTH;
case CapabilityInput::PrimitiveRestart:
return GL_PRIMITIVE_RESTART;
case CapabilityInput::PrimitiveRestartFixedIndex:
return GL_PRIMITIVE_RESTART_FIXED_INDEX;
case CapabilityInput::RasterizerDiscard:
return GL_RASTERIZER_DISCARD;
case CapabilityInput::SampleAlphaToCoverage:
return GL_SAMPLE_ALPHA_TO_COVERAGE;
case CapabilityInput::SampleAlphaToOne:
return GL_SAMPLE_ALPHA_TO_ONE;
case CapabilityInput::SampleCoverage:
return GL_SAMPLE_COVERAGE;
case CapabilityInput::SampleShading:
return GL_SAMPLE_SHADING;
case CapabilityInput::SampleMask:
return GL_SAMPLE_MASK;
case CapabilityInput::ScissorTest:
return GL_SCISSOR_TEST;
case CapabilityInput::StencilTest:
return GL_STENCIL_TEST;
case CapabilityInput::TextureCubeMapSeamless:
return GL_TEXTURE_CUBE_MAP_SEAMLESS;
case CapabilityInput::ProgramPointSize:
return GL_PROGRAM_POINT_SIZE;
default:
return GL_UNKNOWN_MGL;
}
}
} // namespace MG_Util
} // namespace MobileGL