mirror of
https://github.com/MobileGL-Dev/MobileGL
synced 2026-09-10 21:28:32 +09:00
Implements GL timer queries end to end: a frontend query registry (modeled on the sync module - mutex-guarded objects wrapping opaque backend handles behind optional function pointers) serving glGenQueries/glBeginQuery/glEndQuery(GL_TIME_ELAPSED)/glQueryCounter (GL_TIMESTAMP)/glGetQueryObject*/glGetQueryiv with GL 3.3 error semantics and a graceful zero-result fallback when a backend cannot time. DirectGLES backs spans with GL_EXT_disjoint_timer_query (context- generation-stamped handles, bounded result waits). DirectVulkan gets a VkTimerQueryManager: per-frame-in-flight timestamp query pools reset at command-buffer begin (outside render passes), records harvested by frame serial before their pool recycles, elapsed = masked tick delta x timestampPeriod; handles are stamped with a renderer generation that also now guards fence syncs across renderer recreation. GL_QUERY_ COUNTER_BITS reports 0 unless the live backend can actually time (dynamic IsTimerQuerySupported hook), and a failed blocking read keeps the handle alive so the real value stays reachable once the frame submits. GL_ARB_timer_query is advertised only when the device supports timing and MOBILEGL_DISABLE_TIMERQUERY is unset - LWJGL keys Minecraft's F3 'GPU: x%' line off exactly that extension string; verified on device (Adreno 830) on both backends. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
25 lines
1.0 KiB
C++
25 lines
1.0 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 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 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 QueryCounter(GLuint id, GLenum target);
|
|
} // namespace MobileGL::MG_Impl::GLImpl
|