From c4992797c7c995c4fb40aa3fa7fe93337ad71bc9 Mon Sep 17 00:00:00 2001 From: BZLZHH Date: Sat, 1 Nov 2025 11:58:53 +0800 Subject: [PATCH] [Feat] (MG_Impl/Getter): Implement basic GetIntegerv. --- MobileGL/MG_Impl/GLImpl/Getter/GL_Getter.cpp | 743 +++++++++++++++++- .../GLState/TextureState/SamplerObject.h | 6 +- .../GLState/TextureState/TextureObject.cpp | 2 +- 3 files changed, 730 insertions(+), 21 deletions(-) diff --git a/MobileGL/MG_Impl/GLImpl/Getter/GL_Getter.cpp b/MobileGL/MG_Impl/GLImpl/Getter/GL_Getter.cpp index 15e8688f..aacb58e8 100644 --- a/MobileGL/MG_Impl/GLImpl/Getter/GL_Getter.cpp +++ b/MobileGL/MG_Impl/GLImpl/Getter/GL_Getter.cpp @@ -4,6 +4,7 @@ #include #include #include +#include #if MOBILEGL_BACKEND == MOBILEGL_BACKEND_TYPE_DIRECT_GLES #include #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(dstAlpha); + break; + } + case GL_BLEND_DST_RGB: { + BlendFactor srcRGB, dstRGB, srcAlpha, dstAlpha; + MG_State::pGLContext->GetBlendFunc(srcRGB, dstRGB, srcAlpha, dstAlpha); + *params = static_cast(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(srcAlpha); + break; + } + case GL_BLEND_SRC_RGB: { + BlendFactor srcRGB, dstRGB, srcAlpha, dstAlpha; + MG_State::pGLContext->GetBlendFunc(srcRGB, dstRGB, srcAlpha, dstAlpha); + *params = static_cast(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(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(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(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(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(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(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. diff --git a/MobileGL/MG_State/GLState/TextureState/SamplerObject.h b/MobileGL/MG_State/GLState/TextureState/SamplerObject.h index 40282da3..2cc966d0 100644 --- a/MobileGL/MG_State/GLState/TextureState/SamplerObject.h +++ b/MobileGL/MG_State/GLState/TextureState/SamplerObject.h @@ -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; diff --git a/MobileGL/MG_State/GLState/TextureState/TextureObject.cpp b/MobileGL/MG_State/GLState/TextureState/TextureObject.cpp index f76a1e1e..e607aac2 100644 --- a/MobileGL/MG_State/GLState/TextureState/TextureObject.cpp +++ b/MobileGL/MG_State/GLState/TextureState/TextureObject.cpp @@ -7,7 +7,7 @@ namespace MobileGL { // TextureObjectBase implementations TextureObjectBase::TextureObjectBase(TextureTarget target, Uint externalIndex) : m_target(target), m_externalIndex(externalIndex) { - m_sampler = MakeShared(); + m_sampler = MakeShared(0); } void TextureObjectBase::SetMipmapLevel(const MipmapLevelInput& level) {