[Feat] (MG_Impl/Getter): Implement basic GetIntegerv.

This commit is contained in:
BZLZHH
2025-11-01 11:59:12 +08:00
parent 394cf14198
commit c4992797c7
3 changed files with 730 additions and 21 deletions
+725 -18
View File
@@ -4,6 +4,7 @@
#include <MG_Util/Converters/GLToStr/GLEnumConverter.h>
#include <MG_Util/Converters/MGToGL/ErrorCodeConverter.h>
#include <MG_Util/Converters/MGToStr/GLExtensionConverter.h>
#include <MG_Util/Converters/MGToGL/RenderStateEnumConverter.h>
#if MOBILEGL_BACKEND == MOBILEGL_BACKEND_TYPE_DIRECT_GLES
#include <MG_Backend/DirectGLES/DirectGLES.h>
#endif
@@ -108,33 +109,739 @@ namespace MobileGL {
}
switch (pname) {
// General
case GL_CONTEXT_FLAGS:
params[0] = 0;
case GL_CONTEXT_PROFILE_MASK:
params[0] = MG_Config::RendererInfoPtr->RendererGLInfo.IsCompatibilityProfile
? GL_CONTEXT_COMPATIBILITY_PROFILE_BIT
: GL_CONTEXT_CORE_PROFILE_BIT;
case GL_ACTIVE_TEXTURE:
*params = MG_State::pGLContext->GetActiveTextureUnit();
break;
case GL_NUM_EXTENSIONS:
params[0] = MG_Config::RendererInfoPtr->RendererGLInfo.Extensions.size();
case GL_ALIASED_LINE_WIDTH_RANGE:
*params = 0; // TODO
break;
case GL_ARRAY_BUFFER_BINDING: {
*params = MG_State::pGLContext->GetBufferBindingSlot(BufferTarget::Vertex)
.GetBoundObject()
->GetExternalIndex();
break;
}
case GL_BLEND:
*params = MG_State::pGLContext->IsCapabilityEnabled(CapabilityInput::Blend) ? GL_TRUE : GL_FALSE;
break;
case GL_BLEND_COLOR:
*params = 0; // TODO
break;
case GL_BLEND_DST_ALPHA: {
BlendFactor srcRGB, dstRGB, srcAlpha, dstAlpha;
MG_State::pGLContext->GetBlendFunc(srcRGB, dstRGB, srcAlpha, dstAlpha);
*params = static_cast<GLint>(dstAlpha);
break;
}
case GL_BLEND_DST_RGB: {
BlendFactor srcRGB, dstRGB, srcAlpha, dstAlpha;
MG_State::pGLContext->GetBlendFunc(srcRGB, dstRGB, srcAlpha, dstAlpha);
*params = static_cast<GLint>(dstRGB);
break;
}
case GL_BLEND_EQUATION_RGB:
*params = 0; // TODO
break;
case GL_BLEND_EQUATION_ALPHA:
*params = 0; // TODO
break;
case GL_BLEND_SRC_ALPHA: {
BlendFactor srcRGB, dstRGB, srcAlpha, dstAlpha;
MG_State::pGLContext->GetBlendFunc(srcRGB, dstRGB, srcAlpha, dstAlpha);
*params = static_cast<GLint>(srcAlpha);
break;
}
case GL_BLEND_SRC_RGB: {
BlendFactor srcRGB, dstRGB, srcAlpha, dstAlpha;
MG_State::pGLContext->GetBlendFunc(srcRGB, dstRGB, srcAlpha, dstAlpha);
*params = static_cast<GLint>(srcRGB);
break;
}
case GL_COLOR_CLEAR_VALUE:
*params = 0; // TODO
break;
case GL_COLOR_LOGIC_OP:
*params = 0; // TODO
break;
case GL_COLOR_WRITEMASK: {
BoolVec4 mask = MG_State::pGLContext->GetColorMask();
params[0] = mask.x() ? GL_TRUE : GL_FALSE;
params[1] = mask.y() ? GL_TRUE : GL_FALSE;
params[2] = mask.z() ? GL_TRUE : GL_FALSE;
params[3] = mask.w() ? GL_TRUE : GL_FALSE;
break;
}
case GL_COMPRESSED_TEXTURE_FORMATS:
*params = 0; // TODO
break;
case GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS:
*params = 0; // TODO
break;
case GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS:
*params = 0; // TODO
break;
case GL_MAX_COMPUTE_UNIFORM_BLOCKS:
*params = 0; // TODO
break;
case GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS:
*params = 0; // TODO
break;
case GL_MAX_COMPUTE_UNIFORM_COMPONENTS:
*params = 0; // TODO
break;
case GL_MAX_COMPUTE_ATOMIC_COUNTERS:
*params = 0; // TODO
break;
case GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS:
*params = 0; // TODO
break;
case GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS:
*params = 0; // TODO
break;
case GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS:
*params = 0; // TODO
break;
case GL_MAX_COMPUTE_WORK_GROUP_COUNT:
*params = 0; // TODO
break;
case GL_MAX_COMPUTE_WORK_GROUP_SIZE:
*params = 0; // TODO
break;
case GL_DISPATCH_INDIRECT_BUFFER_BINDING:
*params = 0; // TODO
break;
case GL_MAX_DEBUG_GROUP_STACK_DEPTH:
*params = 0; // TODO
break;
case GL_DEBUG_GROUP_STACK_DEPTH:
*params = 0; // TODO
break;
case GL_CONTEXT_FLAGS:
*params = 0; // TODO
break;
case GL_CULL_FACE:
*params = MG_State::pGLContext->IsCapabilityEnabled(CapabilityInput::CullFace) ? GL_TRUE : GL_FALSE;
break;
case GL_CURRENT_PROGRAM:
*params = MG_State::pGLContext->GetCurrentProgram()->GetExternalIndex();
break;
case GL_DEPTH_CLEAR_VALUE:
*params = MG_State::pGLContext->GetClearDepth();
break;
case GL_DEPTH_FUNC:
*params = MG_Util::ConvertDepthTestFuncToGLEnum(MG_State::pGLContext->GetDepthFunc());
break;
case GL_DEPTH_RANGE:
*params = 0; // TODO
break;
case GL_DEPTH_TEST:
*params = MG_State::pGLContext->IsCapabilityEnabled(CapabilityInput::DepthTest) ? GL_TRUE : GL_FALSE;
break;
case GL_DEPTH_WRITEMASK:
*params = MG_State::pGLContext->GetDepthMask() ? GL_TRUE : GL_FALSE;
break;
case GL_DITHER:
*params = MG_State::pGLContext->IsCapabilityEnabled(CapabilityInput::Dither) ? GL_TRUE : GL_FALSE;
break;
case GL_DOUBLEBUFFER:
*params = 0; // TODO
break;
case GL_DRAW_BUFFER:
*params = 0; // TODO
break;
case GL_DRAW_BUFFER0:
*params = 0; // TODO
break;
case GL_DRAW_FRAMEBUFFER_BINDING: {
*params = MG_State::pGLContext->GetFramebufferBindingSlot(FramebufferTarget::Draw)
.GetBoundObject()
->GetExternalIndex();
break;
}
case GL_READ_FRAMEBUFFER_BINDING: {
*params = MG_State::pGLContext->GetFramebufferBindingSlot(FramebufferTarget::Read)
.GetBoundObject()
->GetExternalIndex();
break;
}
case GL_ELEMENT_ARRAY_BUFFER_BINDING: {
*params = MG_State::pGLContext->GetBufferBindingSlot(BufferTarget::Index)
.GetBoundObject()
->GetExternalIndex();
break;
}
case GL_FRAGMENT_SHADER_DERIVATIVE_HINT:
*params = 0; // TODO
break;
case GL_IMPLEMENTATION_COLOR_READ_FORMAT:
*params = 0; // TODO
break;
case GL_IMPLEMENTATION_COLOR_READ_TYPE:
*params = 0; // TODO
break;
case GL_LINE_SMOOTH:
*params = 0; // TODO
break;
case GL_LINE_SMOOTH_HINT:
*params = 0; // TODO
break;
case GL_LINE_WIDTH:
*params = 0; // TODO
break;
case GL_LAYER_PROVOKING_VERTEX:
*params = 0; // TODO
break;
case GL_LOGIC_OP_MODE:
*params = 0; // TODO
break;
case GL_MAJOR_VERSION:
params[0] = MG_Config::RendererInfoPtr->RendererGLInfo.TargetGLVersion.Major;
*params = MG_Config::RendererInfoPtr->RendererGLInfo.TargetGLVersion.Major;
break;
case GL_MINOR_VERSION:
params[0] = MG_Config::RendererInfoPtr->RendererGLInfo.TargetGLVersion.Minor;
case GL_MAX_3D_TEXTURE_SIZE:
*params = 1024 * 16; // TODO
break;
case GL_MAX_ARRAY_TEXTURE_LAYERS:
*params = 2048; // TODO
break;
case GL_MAX_CLIP_DISTANCES:
*params = 8; // TODO
break;
case GL_MAX_COLOR_TEXTURE_SAMPLES:
*params = 16; // TODO
break;
case GL_MAX_COMBINED_ATOMIC_COUNTERS:
*params = 16; // TODO
break;
case GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS:
*params = 1024 * 228; // TODO
break;
case GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS:
*params = 1024 * 228; // TODO
break;
case GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS:
*params = 192; // TODO
break;
case GL_MAX_COMBINED_UNIFORM_BLOCKS:
*params = 70; // TODO
break;
case GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS:
*params = 1024 * 228; // TODO
break;
case GL_MAX_CUBE_MAP_TEXTURE_SIZE:
*params = 1024 * 16; // TODO
break;
case GL_MAX_DEPTH_TEXTURE_SAMPLES:
*params = 16; // TODO
break;
case GL_MAX_DRAW_BUFFERS:
*params = 8; // TODO
break;
case GL_MAX_DUAL_SOURCE_DRAW_BUFFERS:
*params = 1; // TODO
break;
case GL_MAX_ELEMENTS_INDICES:
*params = 1024 * 1024; // TODO
break;
case GL_MAX_ELEMENTS_VERTICES:
*params = 1024 * 1024; // TODO
break;
case GL_MAX_FRAGMENT_ATOMIC_COUNTERS:
*params = 1024 * 4; // TODO
break;
case GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS:
*params = 16; // TODO
break;
case GL_MAX_FRAGMENT_INPUT_COMPONENTS:
*params = 128; // TODO
break;
case GL_MAX_FRAGMENT_UNIFORM_COMPONENTS:
*params = 1024 * 4; // TODO
break;
case GL_MAX_FRAGMENT_UNIFORM_VECTORS:
*params = 1024; // TODO
break;
case GL_MAX_FRAGMENT_UNIFORM_BLOCKS:
*params = 14; // TODO
break;
case GL_MAX_FRAMEBUFFER_WIDTH:
*params = 1024 * 16; // TODO
break;
case GL_MAX_FRAMEBUFFER_HEIGHT:
*params = 1024 * 16; // TODO
break;
case GL_MAX_FRAMEBUFFER_LAYERS:
*params = 1024 * 2; // TODO
break;
case GL_MAX_FRAMEBUFFER_SAMPLES:
*params = 16; // TODO
break;
case GL_MAX_GEOMETRY_ATOMIC_COUNTERS:
*params = 14; // TODO
break;
case GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS:
*params = 16; // TODO
break;
case GL_MAX_GEOMETRY_INPUT_COMPONENTS:
*params = 128; // TODO
break;
case GL_MAX_GEOMETRY_OUTPUT_COMPONENTS:
*params = 128; // TODO
break;
case GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS:
*params = 8; // TODO
break;
case GL_MAX_GEOMETRY_UNIFORM_BLOCKS:
*params = 14; // TODO
break;
case GL_MAX_GEOMETRY_UNIFORM_COMPONENTS:
*params = 1024 * 4; // TODO
break;
case GL_MAX_INTEGER_SAMPLES:
*params = 16; // TODO
break;
case GL_MIN_MAP_BUFFER_ALIGNMENT:
*params = 64; // TODO
break;
case GL_MAX_LABEL_LENGTH:
*params = 256; // TODO
break;
case GL_MAX_PROGRAM_TEXEL_OFFSET:
*params = 7; // TODO
break;
case GL_MIN_PROGRAM_TEXEL_OFFSET:
*params = -8; // TODO
break;
case GL_MAX_RECTANGLE_TEXTURE_SIZE:
*params = 16 * 1024; // TODO
break;
case GL_MAX_RENDERBUFFER_SIZE:
*params = 16 * 1024; // TODO
break;
case GL_MAX_SAMPLE_MASK_WORDS:
*params = 1; // TODO
break;
case GL_MAX_SERVER_WAIT_TIMEOUT:
*params = INT_MAX; // TODO
break;
case GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS:
*params = 16; // TODO
break;
case GL_MAX_TESS_CONTROL_ATOMIC_COUNTERS:
*params = 1024 * 4; // TODO
break;
case GL_MAX_TESS_EVALUATION_ATOMIC_COUNTERS:
*params = 1024 * 4; // TODO
break;
case GL_MAX_TESS_CONTROL_SHADER_STORAGE_BLOCKS:
*params = 16; // TODO
break;
case GL_MAX_TESS_EVALUATION_SHADER_STORAGE_BLOCKS:
*params = 16; // TODO
break;
case GL_MAX_TEXTURE_BUFFER_SIZE:
*params = 1024 * 1024 * 128; // TODO
break;
case GL_MAX_TEXTURE_IMAGE_UNITS:
*params = 32; // TODO
break;
case GL_MAX_TEXTURE_LOD_BIAS:
*params = 15; // TODO
break;
case GL_MAX_TEXTURE_SIZE:
params[0] = 1024 * 64; // TODO: get from backend
*params = 1024 * 16; // TODO
break;
case GL_MAX_UNIFORM_BUFFER_BINDINGS:
*params = 84; // TODO
break;
case GL_MAX_UNIFORM_BLOCK_SIZE:
*params = 1024 * 24; // TODO
break;
case GL_MAX_UNIFORM_LOCATIONS:
*params = 1024 * 4; // TODO
break;
case GL_MAX_VARYING_COMPONENTS:
*params = 16; // TODO
break;
case GL_MAX_VARYING_VECTORS:
*params = 16; // TODO
break;
case GL_MAX_VERTEX_ATOMIC_COUNTERS:
*params = 1024 * 4; // TODO
break;
case GL_MAX_VERTEX_ATTRIBS:
*params = 16; // TODO
break;
case GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS:
*params = 16; // TODO
break;
case GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS:
*params = 32; // TODO
break;
case GL_MAX_VERTEX_UNIFORM_COMPONENTS:
*params = 1024 * 4; // TODO
break;
case GL_MAX_VERTEX_UNIFORM_VECTORS:
*params = 1024; // TODO
break;
case GL_MAX_VERTEX_OUTPUT_COMPONENTS:
*params = 128; // TODO
break;
case GL_MAX_VERTEX_UNIFORM_BLOCKS:
*params = 14; // TODO
break;
case GL_MAX_VIEWPORT_DIMS:
params[0] = 1024 * 16; // TODO
params[1] = 1024 * 16; // TODO
break;
case GL_MAX_VIEWPORTS:
*params = 16; // TODO
break;
case GL_MINOR_VERSION:
*params = MG_Config::RendererInfoPtr->RendererGLInfo.TargetGLVersion.Minor;
break;
case GL_NUM_COMPRESSED_TEXTURE_FORMATS:
*params = 18; // TODO
break;
case GL_NUM_EXTENSIONS:
*params = static_cast<GLint>(MG_Config::RendererInfoPtr->RendererGLInfo.Extensions.size());
break;
case GL_NUM_PROGRAM_BINARY_FORMATS:
*params = 2; // TODO
break;
case GL_NUM_SHADER_BINARY_FORMATS:
*params = 0; // TODO
break;
case GL_PACK_ALIGNMENT:
*params = MG_State::pGLContext->GetPixelStoreParam(PixelStoreParam::PackAlignment);
break;
case GL_PACK_IMAGE_HEIGHT:
*params = MG_State::pGLContext->GetPixelStoreParam(PixelStoreParam::PackImageHeight);
break;
case GL_PACK_LSB_FIRST:
*params = MG_State::pGLContext->GetPixelStoreParam(PixelStoreParam::PackLsbFirst);
break;
case GL_PACK_ROW_LENGTH:
*params = MG_State::pGLContext->GetPixelStoreParam(PixelStoreParam::PackRowLength);
break;
case GL_PACK_SKIP_IMAGES:
*params = MG_State::pGLContext->GetPixelStoreParam(PixelStoreParam::PackSkipImages);
break;
case GL_PACK_SKIP_PIXELS:
*params = MG_State::pGLContext->GetPixelStoreParam(PixelStoreParam::PackSkipPixels);
break;
case GL_PACK_SKIP_ROWS:
*params = MG_State::pGLContext->GetPixelStoreParam(PixelStoreParam::PackSkipRows);
break;
case GL_PACK_SWAP_BYTES:
*params = MG_State::pGLContext->GetPixelStoreParam(PixelStoreParam::PackSwapBytes);
break;
case GL_PIXEL_PACK_BUFFER_BINDING:
*params = 0; // TODO
break;
case GL_PIXEL_UNPACK_BUFFER_BINDING:
*params = 0; // TODO
break;
case GL_POINT_FADE_THRESHOLD_SIZE:
*params = 0; // TODO
break;
case GL_PRIMITIVE_RESTART_INDEX:
*params = 0; // TODO
break;
case GL_PROGRAM_BINARY_FORMATS:
*params = 0; // TODO
break;
case GL_PROGRAM_PIPELINE_BINDING:
*params = 0; // TODO
break;
case GL_PROGRAM_POINT_SIZE:
*params =
MG_State::pGLContext->IsCapabilityEnabled(CapabilityInput::ProgramPointSize) ? GL_TRUE : GL_FALSE;
break;
case GL_PROVOKING_VERTEX:
*params = 0; // TODO
break;
case GL_POINT_SIZE:
*params = 0; // TODO
break;
case GL_POINT_SIZE_GRANULARITY:
*params = 0; // TODO
break;
case GL_POINT_SIZE_RANGE:
*params = 0; // TODO
break;
case GL_POLYGON_OFFSET_FACTOR:
*params = 0; // TODO
break;
case GL_POLYGON_OFFSET_UNITS:
*params = 0; // TODO
break;
case GL_POLYGON_OFFSET_FILL:
*params =
MG_State::pGLContext->IsCapabilityEnabled(CapabilityInput::PolygonOffsetFill) ? GL_TRUE : GL_FALSE;
break;
case GL_POLYGON_OFFSET_LINE:
*params =
MG_State::pGLContext->IsCapabilityEnabled(CapabilityInput::PolygonOffsetLine) ? GL_TRUE : GL_FALSE;
break;
case GL_POLYGON_OFFSET_POINT:
*params =
MG_State::pGLContext->IsCapabilityEnabled(CapabilityInput::PolygonOffsetPoint) ? GL_TRUE : GL_FALSE;
break;
case GL_POLYGON_SMOOTH:
*params =
MG_State::pGLContext->IsCapabilityEnabled(CapabilityInput::PolygonSmooth) ? GL_TRUE : GL_FALSE;
break;
case GL_POLYGON_SMOOTH_HINT:
*params = 0; // TODO
break;
case GL_READ_BUFFER:
*params = 0; // TODO
break;
case GL_RENDERBUFFER_BINDING:
*params = 0; // TODO
break;
case GL_SAMPLE_BUFFERS:
*params = 0; // TODO
break;
case GL_SAMPLE_COVERAGE_VALUE:
*params = 0; // TODO
break;
case GL_SAMPLE_COVERAGE_INVERT:
*params = 0; // TODO
break;
case GL_SAMPLE_MASK_VALUE:
*params = 0; // TODO
break;
case GL_SAMPLER_BINDING: {
Int unit = MG_State::pGLContext->GetActiveTextureUnit();
auto& tu = MG_State::pGLContext->GetTextureUnitObject(unit);
auto sampler = tu.GetSamplerObject();
*params = sampler ? static_cast<GLint>(sampler->GetExternalIndex()) : 0;
break;
}
case GL_SAMPLES:
*params = 0; // TODO
break;
case GL_SCISSOR_BOX:
*params = 0; // TODO
break;
case GL_SCISSOR_TEST:
*params = MG_State::pGLContext->IsCapabilityEnabled(CapabilityInput::ScissorTest) ? GL_TRUE : GL_FALSE;
break;
case GL_SHADER_COMPILER:
*params = 0; // TODO
break;
case GL_SHADER_STORAGE_BUFFER_BINDING:
*params = 0; // TODO
break;
case GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT:
*params = 0; // TODO
break;
case GL_SHADER_STORAGE_BUFFER_START:
*params = 0; // TODO
break;
case GL_SHADER_STORAGE_BUFFER_SIZE:
*params = 0; // TODO
break;
case GL_SMOOTH_LINE_WIDTH_RANGE:
*params = 0; // TODO
break;
case GL_SMOOTH_LINE_WIDTH_GRANULARITY:
*params = 0; // TODO
break;
case GL_STENCIL_BACK_FAIL:
*params = 0; // TODO
break;
case GL_STENCIL_BACK_FUNC:
*params = 0; // TODO
break;
case GL_STENCIL_BACK_PASS_DEPTH_FAIL:
*params = 0; // TODO
break;
case GL_STENCIL_BACK_PASS_DEPTH_PASS:
*params = 0; // TODO
break;
case GL_STENCIL_BACK_REF:
*params = 0; // TODO
break;
case GL_STENCIL_BACK_VALUE_MASK:
*params = 0; // TODO
break;
case GL_STENCIL_BACK_WRITEMASK:
*params = 0; // TODO
break;
case GL_STENCIL_CLEAR_VALUE:
*params = 0; // TODO
break;
case GL_STENCIL_FAIL:
*params = 0; // TODO
break;
case GL_STENCIL_FUNC:
*params = 0; // TODO
break;
case GL_STENCIL_PASS_DEPTH_FAIL:
*params = 0; // TODO
break;
case GL_STENCIL_PASS_DEPTH_PASS:
*params = 0; // TODO
break;
case GL_STENCIL_REF:
*params = 0; // TODO
break;
case GL_STENCIL_TEST:
*params = MG_State::pGLContext->IsCapabilityEnabled(CapabilityInput::StencilTest) ? GL_TRUE : GL_FALSE;
break;
case GL_STENCIL_VALUE_MASK:
*params = 0; // TODO
break;
case GL_STENCIL_WRITEMASK:
*params = 0; // TODO
break;
case GL_STEREO:
*params = 0; // TODO
break;
case GL_SUBPIXEL_BITS:
*params = 0; // TODO
break;
case GL_TEXTURE_BINDING_1D:
*params = 0; // TODO
break;
case GL_TEXTURE_BINDING_1D_ARRAY:
*params = 0; // TODO
break;
case GL_TEXTURE_BINDING_2D: {
Int unit = MG_State::pGLContext->GetActiveTextureUnit();
auto& tu = MG_State::pGLContext->GetTextureUnitObject(unit);
auto& slot = tu.GetBindingSlot(TextureTarget::Texture2D);
auto obj = slot.GetBoundObject();
*params = obj ? static_cast<GLint>(obj->GetExternalIndex()) : 0;
break;
}
case GL_TEXTURE_BINDING_2D_ARRAY:
*params = 0; // TODO
break;
case GL_TEXTURE_BINDING_2D_MULTISAMPLE:
*params = 0; // TODO
break;
case GL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY:
*params = 0; // TODO
break;
case GL_TEXTURE_BINDING_3D: {
Int unit = MG_State::pGLContext->GetActiveTextureUnit();
auto& tu = MG_State::pGLContext->GetTextureUnitObject(unit);
auto& slot = tu.GetBindingSlot(TextureTarget::Texture3D);
auto obj = slot.GetBoundObject();
*params = obj ? static_cast<GLint>(obj->GetExternalIndex()) : 0;
break;
}
case GL_TEXTURE_BINDING_BUFFER:
*params = 0; // TODO
break;
case GL_TEXTURE_BINDING_CUBE_MAP: {
Int unit = MG_State::pGLContext->GetActiveTextureUnit();
auto& tu = MG_State::pGLContext->GetTextureUnitObject(unit);
auto& slot = tu.GetBindingSlot(TextureTarget::TextureCubeMap);
auto obj = slot.GetBoundObject();
*params = obj ? static_cast<GLint>(obj->GetExternalIndex()) : 0;
break;
}
case GL_TEXTURE_BINDING_RECTANGLE:
*params = 0; // TODO
break;
case GL_TEXTURE_COMPRESSION_HINT:
*params = 0; // TODO
break;
case GL_TEXTURE_BUFFER_OFFSET_ALIGNMENT:
*params = 0; // TODO
break;
case GL_TIMESTAMP:
*params = 0; // TODO
break;
case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
*params = 0; // TODO
break;
case GL_TRANSFORM_FEEDBACK_BUFFER_START:
*params = 0; // TODO
break;
case GL_TRANSFORM_FEEDBACK_BUFFER_SIZE:
*params = 0; // TODO
break;
case GL_UNIFORM_BUFFER_BINDING:
*params = 0; // TODO
break;
case GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT:
params[0] = 1; // TODO: get from backend
*params = 0; // TODO
break;
case GL_UNIFORM_BUFFER_SIZE:
*params = 0; // TODO
break;
case GL_UNIFORM_BUFFER_START:
*params = 0; // TODO
break;
case GL_UNPACK_ALIGNMENT:
*params = MG_State::pGLContext->GetPixelStoreParam(PixelStoreParam::UnpackAlignment);
break;
case GL_UNPACK_IMAGE_HEIGHT:
*params = MG_State::pGLContext->GetPixelStoreParam(PixelStoreParam::UnpackImageHeight);
break;
case GL_UNPACK_LSB_FIRST:
*params = MG_State::pGLContext->GetPixelStoreParam(PixelStoreParam::UnpackLsbFirst);
break;
case GL_UNPACK_ROW_LENGTH:
*params = MG_State::pGLContext->GetPixelStoreParam(PixelStoreParam::UnpackRowLength);
break;
case GL_UNPACK_SKIP_IMAGES:
*params = MG_State::pGLContext->GetPixelStoreParam(PixelStoreParam::UnpackSkipImages);
break;
case GL_UNPACK_SKIP_PIXELS:
*params = MG_State::pGLContext->GetPixelStoreParam(PixelStoreParam::UnpackSkipPixels);
break;
case GL_UNPACK_SKIP_ROWS:
*params = MG_State::pGLContext->GetPixelStoreParam(PixelStoreParam::UnpackSkipRows);
break;
case GL_UNPACK_SWAP_BYTES:
*params = MG_State::pGLContext->GetPixelStoreParam(PixelStoreParam::UnpackSwapBytes);
break;
case GL_VERTEX_ARRAY_BINDING: {
auto vao = MG_State::pGLContext->GetBoundVertexArray();
*params = vao ? static_cast<GLint>(vao->GetExternalIndex()) : 0;
break;
}
case GL_VERTEX_BINDING_DIVISOR:
*params = 0; // TODO
break;
case GL_VERTEX_BINDING_OFFSET:
*params = 0; // TODO
break;
case GL_VERTEX_BINDING_STRIDE:
*params = 0; // TODO
break;
case GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET:
*params = 0; // TODO
break;
case GL_MAX_VERTEX_ATTRIB_BINDINGS:
*params = 0; // TODO
break;
case GL_VIEWPORT: {
auto vp = MG_State::pGLContext->GetViewport();
params[0] = vp.x();
params[1] = vp.y();
params[2] = vp.z();
params[3] = vp.w();
break;
}
case GL_VIEWPORT_BOUNDS_RANGE:
*params = 0; // TODO
break;
case GL_VIEWPORT_INDEX_PROVOKING_VERTEX:
*params = 0; // TODO
break;
case GL_VIEWPORT_SUBPIXEL_BITS:
*params = 0; // TODO
break;
case GL_MAX_ELEMENT_INDEX:
*params = 1024 * 1024; // TODO
break;
// State
// TODO
// Others...
default:
MGLOG_E("glGetIntegerv: Invalid enum %s (0x%X)", MG_Util::ConvertGLEnumToString(pname).c_str(), pname);
// TODO: report GL_INVALID_ENUM.
@@ -50,12 +50,12 @@ namespace MobileGL {
namespace GLState {
class SamplerObject {
public:
SamplerObject()
SamplerObject(Uint externalIndex)
: m_wrapS(SamplerWrapMode::Repeat), m_wrapT(SamplerWrapMode::Repeat),
m_wrapR(SamplerWrapMode::Repeat), m_minFilter(SamplerFilterMode::Linear),
m_magFilter(SamplerFilterMode::Linear), m_mipmapMode(SamplerMipmapMode::None), m_minLod(0.0f),
m_maxLod(1000.0f), m_lodBias(0.0f), m_compareMode(SamplerCompareMode::None),
m_compareFunc(SamplerCompareFunc::Less) {}
m_compareFunc(SamplerCompareFunc::Less), m_externalIndex(externalIndex) {}
void SetWrapS(SamplerWrapMode mode) { m_wrapS = mode; }
void SetWrapT(SamplerWrapMode mode) { m_wrapT = mode; }
@@ -85,8 +85,10 @@ namespace MobileGL {
Float GetLodBias() const { return m_lodBias; }
SamplerCompareMode GetCompareMode() const { return m_compareMode; }
SamplerCompareFunc GetSamplerCompareFunc() const { return m_compareFunc; }
Uint GetExternalIndex() const { return m_externalIndex; }
private:
const Uint m_externalIndex = 0;
SamplerWrapMode m_wrapS, m_wrapT, m_wrapR;
SamplerFilterMode m_minFilter, m_magFilter;
SamplerMipmapMode m_mipmapMode;
@@ -7,7 +7,7 @@ namespace MobileGL {
// TextureObjectBase implementations
TextureObjectBase::TextureObjectBase(TextureTarget target, Uint externalIndex)
: m_target(target), m_externalIndex(externalIndex) {
m_sampler = MakeShared<SamplerObject>();
m_sampler = MakeShared<SamplerObject>(0);
}
void TextureObjectBase::SetMipmapLevel(const MipmapLevelInput& level) {