mirror of
https://github.com/MobileGL-Dev/MobileGL
synced 2026-09-12 06:08:30 +09:00
[Fix] (MG_State): allocate program and shader names from one shared name space
GL 3.3 core 2.11 puts program and shader names in one name space: a shader name passed where a program is expected must fail with INVALID_OPERATION, and vice versa. Two independent IndexGenerators handed out colliding names (shader 2 and program 2 could coexist), so CheckProgramNameValidity resolved a shader handle to an unrelated linked program and the error checks in KHR-GL30.get_uniform_tests.get_uniform were silently swallowed - the case only ever passed because the collided program happened to reject the queried location. One shared generator keeps the names disjoint; the per-kind object tables are unchanged.
This commit is contained in:
@@ -11,7 +11,7 @@
|
|||||||
namespace MobileGL::MG_State::GLState {
|
namespace MobileGL::MG_State::GLState {
|
||||||
Uint ProgramState::CreateProgram() {
|
Uint ProgramState::CreateProgram() {
|
||||||
Uint programId = 0;
|
Uint programId = 0;
|
||||||
m_programIndexGenerator.Generate(1, &programId);
|
m_programShaderNameGenerator.Generate(1, &programId);
|
||||||
EnsureIndexAvail(programId, m_programObjects);
|
EnsureIndexAvail(programId, m_programObjects);
|
||||||
auto programObject = MakeShared<ProgramObject>(programId);
|
auto programObject = MakeShared<ProgramObject>(programId);
|
||||||
if (programObject == nullptr) return 0;
|
if (programObject == nullptr) return 0;
|
||||||
@@ -43,7 +43,7 @@ namespace MobileGL::MG_State::GLState {
|
|||||||
// that were flagged with glDeleteShader while still attached.
|
// that were flagged with glDeleteShader while still attached.
|
||||||
const Vector<SharedPtr<ShaderObject>> attachedShaders = programObject->GetAttachedShaders();
|
const Vector<SharedPtr<ShaderObject>> attachedShaders = programObject->GetAttachedShaders();
|
||||||
programObject.reset();
|
programObject.reset();
|
||||||
m_programIndexGenerator.Delete(program);
|
m_programShaderNameGenerator.Delete(program);
|
||||||
for (const auto& shader : attachedShaders) {
|
for (const auto& shader : attachedShaders) {
|
||||||
const Uint shaderName = shader->GetExternalIndex();
|
const Uint shaderName = shader->GetExternalIndex();
|
||||||
if (CheckIndexAvail(shaderName, m_shaderObjects) && m_shaderObjects[shaderName] == shader) {
|
if (CheckIndexAvail(shaderName, m_shaderObjects) && m_shaderObjects[shaderName] == shader) {
|
||||||
@@ -77,7 +77,7 @@ namespace MobileGL::MG_State::GLState {
|
|||||||
|
|
||||||
Uint ProgramState::CreateShader(ShaderStage stage) {
|
Uint ProgramState::CreateShader(ShaderStage stage) {
|
||||||
Uint shaderId = 0;
|
Uint shaderId = 0;
|
||||||
m_shaderIndexGenerator.Generate(1, &shaderId);
|
m_programShaderNameGenerator.Generate(1, &shaderId);
|
||||||
EnsureIndexAvail(shaderId, m_shaderObjects);
|
EnsureIndexAvail(shaderId, m_shaderObjects);
|
||||||
auto shaderObject = MakeShared<ShaderObject>(stage, shaderId);
|
auto shaderObject = MakeShared<ShaderObject>(stage, shaderId);
|
||||||
if (shaderObject == nullptr) return 0;
|
if (shaderObject == nullptr) return 0;
|
||||||
@@ -121,7 +121,7 @@ namespace MobileGL::MG_State::GLState {
|
|||||||
if (shaderObject == nullptr || !shaderObject->GetDeleteStatus()) return;
|
if (shaderObject == nullptr || !shaderObject->GetDeleteStatus()) return;
|
||||||
if (ShaderHasGLVisibleAttachment(shaderObject)) return;
|
if (ShaderHasGLVisibleAttachment(shaderObject)) return;
|
||||||
shaderObject.reset();
|
shaderObject.reset();
|
||||||
m_shaderIndexGenerator.Delete(shader);
|
m_programShaderNameGenerator.Delete(shader);
|
||||||
}
|
}
|
||||||
|
|
||||||
Bool ProgramState::ValidateShaderObject(Uint shader) const {
|
Bool ProgramState::ValidateShaderObject(Uint shader) const {
|
||||||
|
|||||||
@@ -52,10 +52,12 @@ namespace MobileGL::MG_State::GLState {
|
|||||||
vec.resize(idx + 1);
|
vec.resize(idx + 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
IndexGenerator<Uint> m_programIndexGenerator;
|
// Programs and shaders share one GL name space (GL 3.3 core 2.11: a shader
|
||||||
|
// name passed where a program is expected must be recognized as a shader and
|
||||||
|
// rejected with INVALID_OPERATION, and vice versa). One generator for both
|
||||||
|
// object kinds keeps the names disjoint; the object tables stay separate.
|
||||||
|
IndexGenerator<Uint> m_programShaderNameGenerator;
|
||||||
Vector<SharedPtr<ProgramObject>> m_programObjects;
|
Vector<SharedPtr<ProgramObject>> m_programObjects;
|
||||||
|
|
||||||
IndexGenerator<Uint> m_shaderIndexGenerator;
|
|
||||||
Vector<SharedPtr<ShaderObject>> m_shaderObjects;
|
Vector<SharedPtr<ShaderObject>> m_shaderObjects;
|
||||||
|
|
||||||
SharedPtr<ProgramObject> m_currentProgram;
|
SharedPtr<ProgramObject> m_currentProgram;
|
||||||
|
|||||||
Reference in New Issue
Block a user