mirror of
https://github.com/MobileGL-Dev/MobileGL
synced 2026-09-08 04:08:32 +09:00
Six more verified defects from the residual memo/cache mechanisms: - Program resource cache (DirectVulkan reflection): glShaderStorageBlockBinding deliberately does not bump the backend state version, and the SSO pipeline composite is unnamed so the by-name in-place patch can never reach its slot - the composite kept serving pre-rebind SSBO bindings. The cache now keys on the program's block-binding version; a binding-only change re-applies the overrides by name instead of re-running spirv-reflect. SetShaderStorageBlockBinding also gains the equality bail-out its uniform-block sibling has, so the composite mirror's replay stops churning the version every draw. - LinkProgram's allowVSOnlyPrograms function-static latch never set its own initialized flag (dead memo, re-read every call) - and completing it would have frozen a per-backend capability across re-initialization. Replaced with a fresh per-link read from the null-checked active backend. - Query object registry: drained at full library teardown (DestroyAllQueryObjects, mirroring DestroyAllSyncObjects) - undeleted queries and their backend wrappers leaked across Destroy/Initialize cycles, stale ids stayed IsQuery == GL_TRUE in the re-initialized library, and a later delete could hand the old backend's wrapper to a different backend's DeleteBackendQuery. - Converted vertex streams and the host-side EBO max-index scan now SyncGpuWrites before reading the coherent mapping: XFB/SSBO/image writes are merely recorded at that point, so the conversion read pre-write bytes (the restart-index rewrite already synced; these two host reads did not). - Zero-stride converted bindings: both converters rejected stride 0, making the factory's documented single-element conversion unreachable and silently dropping every draw using such a binding; the stride is substituted with the element size for the one-element case. - DemoteFloat64Pass block relayout: measurement queued into the module eagerly, so a mid-struct failure left a half-relaid-out block (compacted offsets before the failing member, 64-bit offsets after) while claiming the block was left alone. Decoration writes are now collected and committed only when the whole block measures successfully.
42 lines
2.3 KiB
C++
42 lines
2.3 KiB
C++
// MobileGL - MobileGL/MG_Impl/GLImpl/Query/GL_Query.h
|
|
// 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
|
|
|
|
#pragma once
|
|
#include <Includes.h>
|
|
|
|
namespace MobileGL::MG_Impl::GLImpl {
|
|
void GenQueries(GLsizei n, GLuint* ids);
|
|
void CreateQueries(GLenum target, GLsizei n, GLuint* ids);
|
|
void DeleteQueries(GLsizei n, const GLuint* ids);
|
|
GLboolean IsQuery(GLuint id);
|
|
void BeginQuery(GLenum target, GLuint id);
|
|
void EndQuery(GLenum target);
|
|
void GetQueryiv(GLenum target, GLenum pname, GLint* params);
|
|
void BeginQueryIndexed(GLenum target, GLuint index, GLuint id);
|
|
void EndQueryIndexed(GLenum target, GLuint index);
|
|
void GetQueryIndexediv(GLenum target, GLuint index, GLenum pname, GLint* params);
|
|
void GetQueryObjectiv(GLuint id, GLenum pname, GLint* params);
|
|
void GetQueryObjectuiv(GLuint id, GLenum pname, GLuint* params);
|
|
void GetQueryObjecti64v(GLuint id, GLenum pname, GLint64* params);
|
|
void GetQueryObjectui64v(GLuint id, GLenum pname, GLuint64* params);
|
|
void GetQueryBufferObjectiv(GLuint id, GLuint buffer, GLenum pname, GLintptr offset);
|
|
void GetQueryBufferObjectuiv(GLuint id, GLuint buffer, GLenum pname, GLintptr offset);
|
|
void GetQueryBufferObjecti64v(GLuint id, GLuint buffer, GLenum pname, GLintptr offset);
|
|
void GetQueryBufferObjectui64v(GLuint id, GLuint buffer, GLenum pname, GLintptr offset);
|
|
void QueryCounter(GLuint id, GLenum target);
|
|
// Destroys every still-registered query object exactly as DeleteQueries would.
|
|
// GL requires queries to die with their context; called only from full library
|
|
// teardown (DestroyImpl), where no context survives on any thread, so the
|
|
// process-global registry can be drained wholesale. Must run while the backend
|
|
// function table is still populated: each backend handle has to be released by
|
|
// the backend that created it, never by a later re-initialized one (whose
|
|
// DeleteBackendQuery would cast the wrapper to the wrong backend's type).
|
|
// Same contract as DestroyAllSyncObjects.
|
|
void DestroyAllQueryObjects();
|
|
} // namespace MobileGL::MG_Impl::GLImpl
|