[Fix] (MG_Impl/Getter): Fix crashing when object is nullptr in GetIntegerv.

This commit is contained in:
BZLZHH
2025-11-01 12:24:07 +08:00
parent 7abd9af8b6
commit 3858e8ebda
5 changed files with 44 additions and 25 deletions
+32 -22
View File
@@ -1,4 +1,5 @@
#include "GL_Getter.h" #include "GL_Getter.h"
#include "MG_State/GLState/ErrorState/ErrorInfo.h"
#include <Config.h> #include <Config.h>
#include <MG_State/GLState/Core.h> #include <MG_State/GLState/Core.h>
#include <MG_Util/Converters/GLToStr/GLEnumConverter.h> #include <MG_Util/Converters/GLToStr/GLEnumConverter.h>
@@ -222,9 +223,11 @@ namespace MobileGL {
case GL_CULL_FACE: case GL_CULL_FACE:
*params = MG_State::pGLContext->IsCapabilityEnabled(CapabilityInput::CullFace) ? GL_TRUE : GL_FALSE; *params = MG_State::pGLContext->IsCapabilityEnabled(CapabilityInput::CullFace) ? GL_TRUE : GL_FALSE;
break; break;
case GL_CURRENT_PROGRAM: case GL_CURRENT_PROGRAM: {
*params = MG_State::pGLContext->GetCurrentProgram()->GetExternalIndex(); const auto& currentProgram = MG_State::pGLContext->GetCurrentProgram();
*params = currentProgram ? currentProgram->GetExternalIndex() : 0;
break; break;
}
case GL_DEPTH_CLEAR_VALUE: case GL_DEPTH_CLEAR_VALUE:
*params = MG_State::pGLContext->GetClearDepth(); *params = MG_State::pGLContext->GetClearDepth();
break; break;
@@ -253,21 +256,25 @@ namespace MobileGL {
*params = 0; // TODO *params = 0; // TODO
break; break;
case GL_DRAW_FRAMEBUFFER_BINDING: { case GL_DRAW_FRAMEBUFFER_BINDING: {
*params = MG_State::pGLContext->GetFramebufferBindingSlot(FramebufferTarget::Draw) const auto& FBO =
.GetBoundObject() MG_State::pGLContext->GetFramebufferBindingSlot(FramebufferTarget::Draw).GetBoundObject();
->GetExternalIndex(); *params = FBO ? FBO->GetExternalIndex() : 0;
break; break;
} }
case GL_READ_FRAMEBUFFER_BINDING: { case GL_READ_FRAMEBUFFER_BINDING: {
*params = MG_State::pGLContext->GetFramebufferBindingSlot(FramebufferTarget::Read) const auto& FBO =
.GetBoundObject() MG_State::pGLContext->GetFramebufferBindingSlot(FramebufferTarget::Read).GetBoundObject();
->GetExternalIndex(); *params = FBO ? FBO->GetExternalIndex() : 0;
break; break;
} }
case GL_ELEMENT_ARRAY_BUFFER_BINDING: { case GL_ELEMENT_ARRAY_BUFFER_BINDING: {
*params = MG_State::pGLContext->GetBufferBindingSlot(BufferTarget::Index) if (!MG_State::pGLContext->GetBoundVertexArray()) {
.GetBoundObject() *params = 0;
->GetExternalIndex(); break;
}
const auto& bufferObject =
MG_State::pGLContext->GetBufferBindingSlot(BufferTarget::Index).GetBoundObject();
*params = bufferObject ? bufferObject->GetExternalIndex() : 0;
break; break;
} }
case GL_FRAGMENT_SHADER_DERIVATIVE_HINT: case GL_FRAGMENT_SHADER_DERIVATIVE_HINT:
@@ -614,8 +621,8 @@ namespace MobileGL {
break; break;
case GL_SAMPLER_BINDING: { case GL_SAMPLER_BINDING: {
Int unit = MG_State::pGLContext->GetActiveTextureUnit(); Int unit = MG_State::pGLContext->GetActiveTextureUnit();
auto& tu = MG_State::pGLContext->GetTextureUnitObject(unit); const auto& tu = MG_State::pGLContext->GetTextureUnitObject(unit);
auto sampler = tu.GetSamplerObject(); const auto& sampler = tu.GetSamplerObject();
*params = sampler ? static_cast<GLint>(sampler->GetExternalIndex()) : 0; *params = sampler ? static_cast<GLint>(sampler->GetExternalIndex()) : 0;
break; break;
} }
@@ -712,8 +719,8 @@ namespace MobileGL {
case GL_TEXTURE_BINDING_2D: { case GL_TEXTURE_BINDING_2D: {
Int unit = MG_State::pGLContext->GetActiveTextureUnit(); Int unit = MG_State::pGLContext->GetActiveTextureUnit();
auto& tu = MG_State::pGLContext->GetTextureUnitObject(unit); auto& tu = MG_State::pGLContext->GetTextureUnitObject(unit);
auto& slot = tu.GetBindingSlot(TextureTarget::Texture2D); const auto& slot = tu.GetBindingSlot(TextureTarget::Texture2D);
auto obj = slot.GetBoundObject(); const auto& obj = slot.GetBoundObject();
*params = obj ? static_cast<GLint>(obj->GetExternalIndex()) : 0; *params = obj ? static_cast<GLint>(obj->GetExternalIndex()) : 0;
break; break;
} }
@@ -729,8 +736,8 @@ namespace MobileGL {
case GL_TEXTURE_BINDING_3D: { case GL_TEXTURE_BINDING_3D: {
Int unit = MG_State::pGLContext->GetActiveTextureUnit(); Int unit = MG_State::pGLContext->GetActiveTextureUnit();
auto& tu = MG_State::pGLContext->GetTextureUnitObject(unit); auto& tu = MG_State::pGLContext->GetTextureUnitObject(unit);
auto& slot = tu.GetBindingSlot(TextureTarget::Texture3D); const auto& slot = tu.GetBindingSlot(TextureTarget::Texture3D);
auto obj = slot.GetBoundObject(); const auto& obj = slot.GetBoundObject();
*params = obj ? static_cast<GLint>(obj->GetExternalIndex()) : 0; *params = obj ? static_cast<GLint>(obj->GetExternalIndex()) : 0;
break; break;
} }
@@ -740,8 +747,8 @@ namespace MobileGL {
case GL_TEXTURE_BINDING_CUBE_MAP: { case GL_TEXTURE_BINDING_CUBE_MAP: {
Int unit = MG_State::pGLContext->GetActiveTextureUnit(); Int unit = MG_State::pGLContext->GetActiveTextureUnit();
auto& tu = MG_State::pGLContext->GetTextureUnitObject(unit); auto& tu = MG_State::pGLContext->GetTextureUnitObject(unit);
auto& slot = tu.GetBindingSlot(TextureTarget::TextureCubeMap); const auto& slot = tu.GetBindingSlot(TextureTarget::TextureCubeMap);
auto obj = slot.GetBoundObject(); const auto& obj = slot.GetBoundObject();
*params = obj ? static_cast<GLint>(obj->GetExternalIndex()) : 0; *params = obj ? static_cast<GLint>(obj->GetExternalIndex()) : 0;
break; break;
} }
@@ -803,7 +810,7 @@ namespace MobileGL {
*params = MG_State::pGLContext->GetPixelStoreParam(PixelStoreParam::UnpackSwapBytes); *params = MG_State::pGLContext->GetPixelStoreParam(PixelStoreParam::UnpackSwapBytes);
break; break;
case GL_VERTEX_ARRAY_BINDING: { case GL_VERTEX_ARRAY_BINDING: {
auto vao = MG_State::pGLContext->GetBoundVertexArray(); const auto& vao = MG_State::pGLContext->GetBoundVertexArray();
*params = vao ? static_cast<GLint>(vao->GetExternalIndex()) : 0; *params = vao ? static_cast<GLint>(vao->GetExternalIndex()) : 0;
break; break;
} }
@@ -823,7 +830,7 @@ namespace MobileGL {
*params = 0; // TODO *params = 0; // TODO
break; break;
case GL_VIEWPORT: { case GL_VIEWPORT: {
auto vp = MG_State::pGLContext->GetViewport(); const auto& vp = MG_State::pGLContext->GetViewport();
params[0] = vp.x(); params[0] = vp.x();
params[1] = vp.y(); params[1] = vp.y();
params[2] = vp.z(); params[2] = vp.z();
@@ -844,7 +851,10 @@ namespace MobileGL {
break; break;
default: default:
MGLOG_E("glGetIntegerv: Invalid enum %s (0x%X)", MG_Util::ConvertGLEnumToString(pname).c_str(), pname); MGLOG_E("glGetIntegerv: Invalid enum %s (0x%X)", MG_Util::ConvertGLEnumToString(pname).c_str(), pname);
// TODO: report GL_INVALID_ENUM. MG_State::pGLContext->RecordError(
ErrorCode::InvalidEnum, MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", "GetIntegerv",
std::format("Invalid enum: 0x{:X}", pname)));
break; break;
} }
} }
@@ -443,6 +443,8 @@ namespace MobileGL {
} }
void UseProgram_State(GLint program) { void UseProgram_State(GLint program) {
MGLOG_D("UseProgram_State: program=%u", program);
if (program == 0) { if (program == 0) {
MG_State::pGLContext->UseProgram(0); MG_State::pGLContext->UseProgram(0);
return; return;
+8 -1
View File
@@ -52,7 +52,14 @@ namespace MobileGL {
BindingSlot<BufferObject>& GLContext::GetBufferBindingSlot(BufferTarget target) { BindingSlot<BufferObject>& GLContext::GetBufferBindingSlot(BufferTarget target) {
if (target == BufferTarget::Index) { if (target == BufferTarget::Index) {
return m_vertexArrayState.GetBoundVertexArray()->GetIndexBufferBindingSlot(); const auto& vao = m_vertexArrayState.GetBoundVertexArray();
if (vao) {
return vao->GetIndexBufferBindingSlot();
} else {
assert(false);
static BindingSlot<BufferObject> defaultSlot(BufferTarget::Index);
return defaultSlot;
}
} }
return m_bufferState.GetBindingSlot(target); return m_bufferState.GetBindingSlot(target);
@@ -9,7 +9,7 @@ namespace MobileGL {
namespace GLState { namespace GLState {
class ProgramObject { class ProgramObject {
public: public:
ProgramObject(const Uint externalIndex) : m_externalIndex(externalIndex) {} ProgramObject(Uint externalIndex) : m_externalIndex(externalIndex) {}
bool ShaderIsAttached(SharedPtr<ShaderObject> shader); bool ShaderIsAttached(SharedPtr<ShaderObject> shader);
bool AttachShader(SharedPtr<ShaderObject> shader); bool AttachShader(SharedPtr<ShaderObject> shader);
SizeT DetachShader(SharedPtr<ShaderObject> shader); SizeT DetachShader(SharedPtr<ShaderObject> shader);
@@ -16,7 +16,7 @@ namespace MobileGL {
namespace GLState { namespace GLState {
class ShaderObject { class ShaderObject {
public: public:
ShaderObject(const ShaderStage stage, const Uint externalIndex) ShaderObject(const ShaderStage stage, Uint externalIndex)
: m_stage(stage), m_externalIndex(externalIndex) {} : m_stage(stage), m_externalIndex(externalIndex) {}
void SetShaderSource(const String& source); void SetShaderSource(const String& source);
void SetShaderSource(String&& source); void SetShaderSource(String&& source);