From a196ada4c11b59f23587596486d265124ea06a6f Mon Sep 17 00:00:00 2001 From: Swung0x48 Date: Sun, 6 Sep 2026 01:51:16 -0400 Subject: [PATCH] [Feat] (Impl): call MGP_FILL before every GLFunctionsTable entry - 83 statements over 69 verbs, a no-op in the pull build - Every call through gBackendFunctionsTable.GL in the seven MG_Impl TUs (Drawing 36, Framebuffer 11, Texture 8, Getter 3, Program 1, Query 18, Sync 6) is preceded by MGP_FILL(); placed after every early return the call sits behind - the conditional-render check, the null-entry guards, the loop bodies - so a verb whose entry is null on this backend never bumps the serial. - Seven calls sit on a continuation line of a guarded expression (GetQueryResult64 x2, BeginXfbPrimitivesQuery, BeginTimeElapsedQuery, QueryCounterTimestamp, IsTimerQuerySupported, GetSyncStatus) and two more fold the null guard into the same expression (IsQueryResultAvailable, ClientWaitSync's guarded return); there the fill precedes the statement, so a null entry bumps the serial once with nothing to read it - harmless for the poison, recorded for the record. - Each TU includes after its last MG_State/MG_Backend include; under MOBILEGL_PIPE_PUSH=OFF the macro is ((void)0) and the pull library is symbol-identical with a .text delta of zero. --- .../MG_Impl/GLImpl/Drawing/GL_Drawing.cpp | 37 +++++++++++++++++++ .../GLImpl/Framebuffer/GL_Framebuffer.cpp | 12 ++++++ MobileGL/MG_Impl/GLImpl/Getter/GL_Getter.cpp | 4 ++ .../MG_Impl/GLImpl/Program/GL_Program.cpp | 2 + MobileGL/MG_Impl/GLImpl/Query/GL_Query.cpp | 19 ++++++++++ MobileGL/MG_Impl/GLImpl/Sync/GL_Sync.cpp | 7 ++++ .../MG_Impl/GLImpl/Texture/GL_Texture.cpp | 9 +++++ 7 files changed, 90 insertions(+) diff --git a/MobileGL/MG_Impl/GLImpl/Drawing/GL_Drawing.cpp b/MobileGL/MG_Impl/GLImpl/Drawing/GL_Drawing.cpp index d76e8019..0d24554b 100644 --- a/MobileGL/MG_Impl/GLImpl/Drawing/GL_Drawing.cpp +++ b/MobileGL/MG_Impl/GLImpl/Drawing/GL_Drawing.cpp @@ -11,6 +11,7 @@ #include #include #include +#include #include "../Getter/GL_Getter.h" namespace MobileGL::MG_Impl::GLImpl { @@ -527,6 +528,7 @@ namespace MobileGL::MG_Impl::GLImpl { ZoneScopedC(TRACY_ZONECOLOR_BACKEND); #endif if (ConditionalRenderDiscardsCommand()) return; + MGP_FILL(Clear); MG_Backend::gBackendFunctionsTable.GL.Clear(mask); } @@ -535,6 +537,7 @@ namespace MobileGL::MG_Impl::GLImpl { ZoneScopedC(TRACY_ZONECOLOR_BACKEND); #endif if (ConditionalRenderDiscardsCommand()) return; + MGP_FILL(DrawElements); MG_Backend::gBackendFunctionsTable.GL.DrawElements(mode, count, type, indices); } @@ -544,6 +547,7 @@ namespace MobileGL::MG_Impl::GLImpl { ZoneScopedC(TRACY_ZONECOLOR_BACKEND); #endif if (ConditionalRenderDiscardsCommand()) return; + MGP_FILL(MultiDrawElements); MG_Backend::gBackendFunctionsTable.GL.MultiDrawElements(mode, count, type, indices, drawcount); } @@ -553,6 +557,7 @@ namespace MobileGL::MG_Impl::GLImpl { ZoneScopedC(TRACY_ZONECOLOR_BACKEND); #endif if (ConditionalRenderDiscardsCommand()) return; + MGP_FILL(MultiDrawElementsBaseVertex); MG_Backend::gBackendFunctionsTable.GL.MultiDrawElementsBaseVertex(mode, count, type, indices, drawcount, basevertex); } @@ -562,6 +567,7 @@ namespace MobileGL::MG_Impl::GLImpl { ZoneScopedC(TRACY_ZONECOLOR_BACKEND); #endif if (ConditionalRenderDiscardsCommand()) return; + MGP_FILL(DrawArrays); MG_Backend::gBackendFunctionsTable.GL.DrawArrays(mode, first, count); } @@ -570,6 +576,7 @@ namespace MobileGL::MG_Impl::GLImpl { ZoneScopedC(TRACY_ZONECOLOR_BACKEND); #endif if (ConditionalRenderDiscardsCommand()) return; + MGP_FILL(MultiDrawArrays); MG_Backend::gBackendFunctionsTable.GL.MultiDrawArrays(mode, first, count, drawcount); } @@ -579,6 +586,7 @@ namespace MobileGL::MG_Impl::GLImpl { ZoneScopedC(TRACY_ZONECOLOR_BACKEND); #endif if (ConditionalRenderDiscardsCommand()) return; + MGP_FILL(DrawElementsBaseVertex); MG_Backend::gBackendFunctionsTable.GL.DrawElementsBaseVertex(mode, count, type, indices, basevertex); } @@ -588,6 +596,7 @@ namespace MobileGL::MG_Impl::GLImpl { ZoneScopedC(TRACY_ZONECOLOR_BACKEND); #endif if (ConditionalRenderDiscardsCommand()) return; + MGP_FILL(MultiDrawElementsIndirect); MG_Backend::gBackendFunctionsTable.GL.MultiDrawElementsIndirect(mode, type, indirect, drawcount, stride); } @@ -596,6 +605,7 @@ namespace MobileGL::MG_Impl::GLImpl { ZoneScopedC(TRACY_ZONECOLOR_BACKEND); #endif if (ConditionalRenderDiscardsCommand()) return; + MGP_FILL(MultiDrawArraysIndirect); MG_Backend::gBackendFunctionsTable.GL.MultiDrawArraysIndirect(mode, indirect, drawcount, stride); } @@ -605,6 +615,7 @@ namespace MobileGL::MG_Impl::GLImpl { ZoneScopedC(TRACY_ZONECOLOR_BACKEND); #endif if (ConditionalRenderDiscardsCommand()) return; + MGP_FILL(MultiDrawElementsIndirectCount); MG_Backend::gBackendFunctionsTable.GL.MultiDrawElementsIndirectCount(mode, type, indirect, drawcount, maxdrawcount, stride); } @@ -615,6 +626,7 @@ namespace MobileGL::MG_Impl::GLImpl { ZoneScopedC(TRACY_ZONECOLOR_BACKEND); #endif if (ConditionalRenderDiscardsCommand()) return; + MGP_FILL(MultiDrawArraysIndirectCount); MG_Backend::gBackendFunctionsTable.GL.MultiDrawArraysIndirectCount(mode, indirect, drawcount, maxdrawcount, stride); } @@ -625,6 +637,7 @@ namespace MobileGL::MG_Impl::GLImpl { ZoneScopedC(TRACY_ZONECOLOR_BACKEND); #endif if (ConditionalRenderDiscardsCommand()) return; + MGP_FILL(DrawRangeElementsBaseVertex); MG_Backend::gBackendFunctionsTable.GL.DrawRangeElementsBaseVertex(mode, start, end, count, type, indices, basevertex); } @@ -635,6 +648,7 @@ namespace MobileGL::MG_Impl::GLImpl { ZoneScopedC(TRACY_ZONECOLOR_BACKEND); #endif if (ConditionalRenderDiscardsCommand()) return; + MGP_FILL(DrawRangeElements); MG_Backend::gBackendFunctionsTable.GL.DrawRangeElements(mode, start, end, count, type, indices); } @@ -645,6 +659,7 @@ namespace MobileGL::MG_Impl::GLImpl { ZoneScopedC(TRACY_ZONECOLOR_BACKEND); #endif if (ConditionalRenderDiscardsCommand()) return; + MGP_FILL(DrawElementsInstancedBaseVertexBaseInstance); MG_Backend::gBackendFunctionsTable.GL.DrawElementsInstancedBaseVertexBaseInstance( mode, count, type, indices, instancecount, basevertex, baseinstance); } @@ -655,6 +670,7 @@ namespace MobileGL::MG_Impl::GLImpl { ZoneScopedC(TRACY_ZONECOLOR_BACKEND); #endif if (ConditionalRenderDiscardsCommand()) return; + MGP_FILL(DrawElementsInstancedBaseVertex); MG_Backend::gBackendFunctionsTable.GL.DrawElementsInstancedBaseVertex(mode, count, type, indices, instancecount, basevertex); } @@ -665,6 +681,7 @@ namespace MobileGL::MG_Impl::GLImpl { ZoneScopedC(TRACY_ZONECOLOR_BACKEND); #endif if (ConditionalRenderDiscardsCommand()) return; + MGP_FILL(DrawElementsInstancedBaseInstance); MG_Backend::gBackendFunctionsTable.GL.DrawElementsInstancedBaseInstance(mode, count, type, indices, instancecount, baseinstance); } @@ -675,6 +692,7 @@ namespace MobileGL::MG_Impl::GLImpl { ZoneScopedC(TRACY_ZONECOLOR_BACKEND); #endif if (ConditionalRenderDiscardsCommand()) return; + MGP_FILL(DrawElementsInstanced); MG_Backend::gBackendFunctionsTable.GL.DrawElementsInstanced(mode, count, type, indices, instancecount); } @@ -683,6 +701,7 @@ namespace MobileGL::MG_Impl::GLImpl { ZoneScopedC(TRACY_ZONECOLOR_BACKEND); #endif if (ConditionalRenderDiscardsCommand()) return; + MGP_FILL(DrawElementsIndirect); MG_Backend::gBackendFunctionsTable.GL.DrawElementsIndirect(mode, type, indirect); } void DrawArraysInstancedBaseInstance_Backend(GLenum mode, GLint first, GLsizei count, GLsizei instancecount, @@ -691,6 +710,7 @@ namespace MobileGL::MG_Impl::GLImpl { ZoneScopedC(TRACY_ZONECOLOR_BACKEND); #endif if (ConditionalRenderDiscardsCommand()) return; + MGP_FILL(DrawArraysInstancedBaseInstance); MG_Backend::gBackendFunctionsTable.GL.DrawArraysInstancedBaseInstance(mode, first, count, instancecount, baseinstance); } @@ -700,6 +720,7 @@ namespace MobileGL::MG_Impl::GLImpl { ZoneScopedC(TRACY_ZONECOLOR_BACKEND); #endif if (ConditionalRenderDiscardsCommand()) return; + MGP_FILL(DrawArraysInstanced); MG_Backend::gBackendFunctionsTable.GL.DrawArraysInstanced(mode, first, count, instancecount); } @@ -708,6 +729,7 @@ namespace MobileGL::MG_Impl::GLImpl { ZoneScopedC(TRACY_ZONECOLOR_BACKEND); #endif if (ConditionalRenderDiscardsCommand()) return; + MGP_FILL(DrawArraysIndirect); MG_Backend::gBackendFunctionsTable.GL.DrawArraysIndirect(mode, indirect); } @@ -739,6 +761,7 @@ namespace MobileGL::MG_Impl::GLImpl { // GL 4.3 added both dispatches to the conditional-render set (GL 4.6 core 10.9), which is // exactly what KHR-GL43.compute_shader.conditional-dispatching checks. if (ConditionalRenderDiscardsCommand()) return; + MGP_FILL(DispatchCompute); dispatchCompute(numGroupsX, numGroupsY, numGroupsZ); } @@ -791,6 +814,7 @@ namespace MobileGL::MG_Impl::GLImpl { } if (!ValidateCurrentProgramForCompute(__func__)) return; if (ConditionalRenderDiscardsCommand()) return; + MGP_FILL(DispatchComputeIndirect); dispatchComputeIndirect(indirect); } @@ -812,6 +836,7 @@ namespace MobileGL::MG_Impl::GLImpl { } MG_State::pGLContext->SetPatchVertices(static_cast(value)); if (const auto patchParameteri = MG_Backend::gBackendFunctionsTable.GL.PatchParameteri) { + MGP_FILL(PatchParameteri); patchParameteri(pname, value); } } @@ -882,6 +907,7 @@ namespace MobileGL::MG_Impl::GLImpl { MakeUnique("MG_Impl/GLImpl", __func__, "Backend does not support memory barriers.")); return; } + MGP_FILL(MemoryBarrier); memoryBarrier(barriers); } @@ -903,6 +929,7 @@ namespace MobileGL::MG_Impl::GLImpl { MakeUnique("MG_Impl/GLImpl", __func__, "Backend does not support memory barriers.")); return; } + MGP_FILL(MemoryBarrier); memoryBarrier(GL_TEXTURE_FETCH_BARRIER_BIT | GL_FRAMEBUFFER_BARRIER_BIT); } @@ -916,6 +943,7 @@ namespace MobileGL::MG_Impl::GLImpl { "Backend does not support regional memory barriers.")); return; } + MGP_FILL(MemoryBarrierByRegion); memoryBarrierByRegion(barriers); } @@ -1238,6 +1266,7 @@ namespace MobileGL::MG_Impl::GLImpl { } MG_State::pGLContext->BeginTransformFeedback(primitiveMode, program); if (const auto beginXfb = MG_Backend::gBackendFunctionsTable.GL.BeginTransformFeedback) { + MGP_FILL(BeginTransformFeedback); beginXfb(primitiveMode); } } @@ -1320,6 +1349,7 @@ namespace MobileGL::MG_Impl::GLImpl { // Closed while the capture state is still active: a backend that captures // through its own driver reads the capture program and buffer bindings here. if (const auto endXfb = MG_Backend::gBackendFunctionsTable.GL.EndTransformFeedback) { + MGP_FILL(EndTransformFeedback); endXfb(); } MG_State::pGLContext->EndTransformFeedback(); @@ -1328,9 +1358,12 @@ namespace MobileGL::MG_Impl::GLImpl { // the GPU work is all that is required. auto& backendGL = MG_Backend::gBackendFunctionsTable.GL; if (backendGL.FenceSync && backendGL.ClientWaitSync) { + MGP_FILL(FenceSync); if (auto sync = backendGL.FenceSync()) { + MGP_FILL(ClientWaitSync); backendGL.ClientWaitSync(sync, GL_SYNC_FLUSH_COMMANDS_BIT, ~0ull); if (backendGL.DeleteSync) { + MGP_FILL(DeleteSync); backendGL.DeleteSync(sync); } } @@ -1349,6 +1382,7 @@ namespace MobileGL::MG_Impl::GLImpl { } MG_State::pGLContext->SetTransformFeedbackPaused(true); if (const auto pauseXfb = MG_Backend::gBackendFunctionsTable.GL.PauseTransformFeedback) { + MGP_FILL(PauseTransformFeedback); pauseXfb(); } } @@ -1363,6 +1397,7 @@ namespace MobileGL::MG_Impl::GLImpl { } MG_State::pGLContext->SetTransformFeedbackPaused(false); if (const auto resumeXfb = MG_Backend::gBackendFunctionsTable.GL.ResumeTransformFeedback) { + MGP_FILL(ResumeTransformFeedback); resumeXfb(); } } @@ -1568,6 +1603,7 @@ namespace MobileGL::MG_Impl::GLImpl { continue; } if (const auto deleteXfb = MG_Backend::gBackendFunctionsTable.GL.DeleteTransformFeedback) { + MGP_FILL(DeleteTransformFeedback); deleteXfb(id); } MG_State::pGLContext->MarkTransformFeedbackObjectForDeletion(id); @@ -1599,6 +1635,7 @@ namespace MobileGL::MG_Impl::GLImpl { } MG_State::pGLContext->BindTransformFeedbackObject(id); if (const auto bindXfb = MG_Backend::gBackendFunctionsTable.GL.BindTransformFeedback) { + MGP_FILL(BindTransformFeedback); bindXfb(id); } } diff --git a/MobileGL/MG_Impl/GLImpl/Framebuffer/GL_Framebuffer.cpp b/MobileGL/MG_Impl/GLImpl/Framebuffer/GL_Framebuffer.cpp index 6a6b7bb1..394c6cd3 100644 --- a/MobileGL/MG_Impl/GLImpl/Framebuffer/GL_Framebuffer.cpp +++ b/MobileGL/MG_Impl/GLImpl/Framebuffer/GL_Framebuffer.cpp @@ -15,6 +15,7 @@ #include #include #include +#include #include #include #include @@ -616,6 +617,7 @@ namespace MobileGL::MG_Impl::GLImpl { void BlitFramebuffer_Backend(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter) { + MGP_FILL(BlitFramebuffer); MG_Backend::gBackendFunctionsTable.GL.BlitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter); } @@ -629,6 +631,7 @@ namespace MobileGL::MG_Impl::GLImpl { MGLOG_E_ONCE("glBlitNamedFramebuffer skipped: backend does not implement explicit framebuffer blit."); return; } + MGP_FILL(BlitNamedFramebuffer); blitNamedFramebuffer(readFramebuffer, drawFramebuffer, srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter); } @@ -640,6 +643,7 @@ namespace MobileGL::MG_Impl::GLImpl { MGLOG_E_ONCE("glClearNamedFramebufferfv skipped: backend does not implement explicit framebuffer clear."); return; } + MGP_FILL(ClearNamedFramebufferfv); clearNamedFramebufferfv(framebuffer, buffer, drawbuffer, value); } @@ -650,6 +654,7 @@ namespace MobileGL::MG_Impl::GLImpl { MGLOG_E_ONCE("glClearNamedFramebufferfi skipped: backend does not implement explicit framebuffer clear."); return; } + MGP_FILL(ClearNamedFramebufferfi); clearNamedFramebufferfi(framebuffer, buffer, drawbuffer, depth, stencil); } @@ -660,6 +665,7 @@ namespace MobileGL::MG_Impl::GLImpl { MGLOG_E_ONCE("glClearNamedFramebufferiv skipped: backend does not implement explicit framebuffer clear."); return; } + MGP_FILL(ClearNamedFramebufferiv); clearNamedFramebufferiv(framebuffer, buffer, drawbuffer, value); } @@ -670,6 +676,7 @@ namespace MobileGL::MG_Impl::GLImpl { MGLOG_E_ONCE("glClearNamedFramebufferuiv skipped: backend does not implement explicit framebuffer clear."); return; } + MGP_FILL(ClearNamedFramebufferuiv); clearNamedFramebufferuiv(framebuffer, buffer, drawbuffer, value); } @@ -2729,24 +2736,28 @@ namespace MobileGL::MG_Impl::GLImpl { void ClearBufferfi_Backend(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil) { // GL 4.6 core 10.9 makes ClearBuffer* conditional alongside the drawing commands. if (MG_State::pGLContext->ConditionalRenderDiscardsCommands()) return; + MGP_FILL(ClearBufferfi); MG_Backend::gBackendFunctionsTable.GL.ClearBufferfi(buffer, drawbuffer, depth, stencil); } void ClearBufferfv_Backend(GLenum buffer, GLint drawbuffer, const GLfloat* value) { // GL 4.6 core 10.9 makes ClearBuffer* conditional alongside the drawing commands. if (MG_State::pGLContext->ConditionalRenderDiscardsCommands()) return; + MGP_FILL(ClearBufferfv); MG_Backend::gBackendFunctionsTable.GL.ClearBufferfv(buffer, drawbuffer, value); } void ClearBufferuiv_Backend(GLenum buffer, GLint drawbuffer, const GLuint* value) { // GL 4.6 core 10.9 makes ClearBuffer* conditional alongside the drawing commands. if (MG_State::pGLContext->ConditionalRenderDiscardsCommands()) return; + MGP_FILL(ClearBufferuiv); MG_Backend::gBackendFunctionsTable.GL.ClearBufferuiv(buffer, drawbuffer, value); } void ClearBufferiv_Backend(GLenum buffer, GLint drawbuffer, const GLint* value) { // GL 4.6 core 10.9 makes ClearBuffer* conditional alongside the drawing commands. if (MG_State::pGLContext->ConditionalRenderDiscardsCommands()) return; + MGP_FILL(ClearBufferiv); MG_Backend::gBackendFunctionsTable.GL.ClearBufferiv(buffer, drawbuffer, value); } @@ -2994,6 +3005,7 @@ namespace MobileGL::MG_Impl::GLImpl { } void ReadPixels_Backend(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void* pixels) { + MGP_FILL(ReadPixels); MG_Backend::gBackendFunctionsTable.GL.ReadPixels(x, y, width, height, format, type, pixels); } diff --git a/MobileGL/MG_Impl/GLImpl/Getter/GL_Getter.cpp b/MobileGL/MG_Impl/GLImpl/Getter/GL_Getter.cpp index 211f7141..7a96b6a0 100644 --- a/MobileGL/MG_Impl/GLImpl/Getter/GL_Getter.cpp +++ b/MobileGL/MG_Impl/GLImpl/Getter/GL_Getter.cpp @@ -30,6 +30,7 @@ #include #include #include +#include namespace MobileGL::MG_Impl::GLImpl { // Declared rather than #included from GL_RenderState.h on purpose: that header also declares @@ -1173,6 +1174,7 @@ namespace MobileGL::MG_Impl::GLImpl { : GetMinComputeWorkGroupSize(index); GLint backendValue = 0; if (getIntegeri) { + MGP_FILL(GetIntegeri_v); getIntegeri(target, index, &backendValue); } *data = std::max(backendValue, minimum); @@ -1353,6 +1355,7 @@ namespace MobileGL::MG_Impl::GLImpl { Int64 timestamp = 0; if (!MG_Config::Features.DisableTimerQuery) { if (const auto getGpuTimestampNs = MG_Backend::gBackendFunctionsTable.GL.GetGpuTimestampNs) { + MGP_FILL(GetGpuTimestampNs); timestamp = getGpuTimestampNs(); } } @@ -2263,6 +2266,7 @@ namespace MobileGL::MG_Impl::GLImpl { Int64 timestamp = 0; if (!MG_Config::Features.DisableTimerQuery) { if (const auto getGpuTimestampNs = MG_Backend::gBackendFunctionsTable.GL.GetGpuTimestampNs) { + MGP_FILL(GetGpuTimestampNs); timestamp = getGpuTimestampNs(); } } diff --git a/MobileGL/MG_Impl/GLImpl/Program/GL_Program.cpp b/MobileGL/MG_Impl/GLImpl/Program/GL_Program.cpp index e3bee89b..dfbe2ca4 100644 --- a/MobileGL/MG_Impl/GLImpl/Program/GL_Program.cpp +++ b/MobileGL/MG_Impl/GLImpl/Program/GL_Program.cpp @@ -21,6 +21,7 @@ #include #include #include +#include namespace MobileGL::MG_Impl::GLImpl { // The flattened uniform type these helpers used to take as a raw glslang::TType* @@ -3398,6 +3399,7 @@ namespace MobileGL::MG_Impl::GLImpl { "Backend does not support shader storage block binding.")); return; } + MGP_FILL(ShaderStorageBlockBinding); shaderStorageBlockBinding(program, blockName.c_str(), storageBlockBinding); } diff --git a/MobileGL/MG_Impl/GLImpl/Query/GL_Query.cpp b/MobileGL/MG_Impl/GLImpl/Query/GL_Query.cpp index bcdc199a..dd21c0e3 100644 --- a/MobileGL/MG_Impl/GLImpl/Query/GL_Query.cpp +++ b/MobileGL/MG_Impl/GLImpl/Query/GL_Query.cpp @@ -12,6 +12,7 @@ #include #include #include +#include namespace MobileGL::MG_Impl::GLImpl { namespace { @@ -164,6 +165,7 @@ namespace MobileGL::MG_Impl::GLImpl { void ResetQueryObjectLocked(QueryObject* queryObject) { if (queryObject->backendHandle) { if (const auto deleteBackendQuery = MG_Backend::gBackendFunctionsTable.GL.DeleteBackendQuery) { + MGP_FILL(DeleteBackendQuery); deleteBackendQuery(queryObject->backendHandle); } queryObject->backendHandle = nullptr; @@ -178,6 +180,7 @@ namespace MobileGL::MG_Impl::GLImpl { void EndTimeElapsedQueryLocked(QueryObject* queryObject) { const auto endTimeElapsedQuery = MG_Backend::gBackendFunctionsTable.GL.EndTimeElapsedQuery; if (endTimeElapsedQuery && queryObject->backendHandle) { + MGP_FILL(EndTimeElapsedQuery); endTimeElapsedQuery(queryObject->backendHandle); } queryObject->active = false; @@ -257,6 +260,7 @@ namespace MobileGL::MG_Impl::GLImpl { } Uint64 result = 0; const auto getQueryResult64 = MG_Backend::gBackendFunctionsTable.GL.GetQueryResult64; + MGP_FILL(GetQueryResult64); if (queryObject->backendHandle && getQueryResult64 && !getQueryResult64(queryObject->backendHandle, /*wait=*/false, &result)) { // Not ready. The whole point of the no-wait form is that the caller's @@ -271,6 +275,7 @@ namespace MobileGL::MG_Impl::GLImpl { } if (queryObject->backendHandle) { if (const auto deleteBackendQuery = MG_Backend::gBackendFunctionsTable.GL.DeleteBackendQuery) { + MGP_FILL(DeleteBackendQuery); deleteBackendQuery(queryObject->backendHandle); } queryObject->backendHandle = nullptr; @@ -286,6 +291,7 @@ namespace MobileGL::MG_Impl::GLImpl { return true; } const auto isQueryResultAvailable = MG_Backend::gBackendFunctionsTable.GL.IsQueryResultAvailable; + MGP_FILL(IsQueryResultAvailable); outValue = (!isQueryResultAvailable || isQueryResultAvailable(queryObject->backendHandle)) ? 1 : 0; return true; } @@ -297,6 +303,7 @@ namespace MobileGL::MG_Impl::GLImpl { Uint64 result = 0; if (queryObject->backendHandle) { const auto getQueryResult64 = MG_Backend::gBackendFunctionsTable.GL.GetQueryResult64; + MGP_FILL(GetQueryResult64); if (getQueryResult64 && !getQueryResult64(queryObject->backendHandle, /*wait=*/true, &result)) { // The backend could not produce the result YET (e.g. a @@ -317,6 +324,7 @@ namespace MobileGL::MG_Impl::GLImpl { // query degrades to a zero result); the backend handle is // consumed and the value cached for later reads. if (const auto deleteBackendQuery = MG_Backend::gBackendFunctionsTable.GL.DeleteBackendQuery) { + MGP_FILL(DeleteBackendQuery); deleteBackendQuery(queryObject->backendHandle); } queryObject->backendHandle = nullptr; @@ -422,6 +430,7 @@ namespace MobileGL::MG_Impl::GLImpl { queryObject->target == GL_ANY_SAMPLES_PASSED_CONSERVATIVE) { if (const auto endOcclusionQuery = MG_Backend::gBackendFunctionsTable.GL.EndOcclusionQuery; endOcclusionQuery && queryObject->backendHandle) { + MGP_FILL(EndOcclusionQuery); endOcclusionQuery(queryObject->backendHandle); } queryObject->active = false; @@ -441,6 +450,7 @@ namespace MobileGL::MG_Impl::GLImpl { } if (queryObject->backendHandle) { if (const auto deleteBackendQuery = MG_Backend::gBackendFunctionsTable.GL.DeleteBackendQuery) { + MGP_FILL(DeleteBackendQuery); deleteBackendQuery(queryObject->backendHandle); } queryObject->backendHandle = nullptr; @@ -519,6 +529,7 @@ namespace MobileGL::MG_Impl::GLImpl { // Prefer real GPU transform-feedback queries (exact with geometry shaders); // the CPU accounting delta stays as the fallback when the backend lacks them. const auto beginXfbPrimitivesQuery = MG_Backend::gBackendFunctionsTable.GL.BeginXfbPrimitivesQuery; + MGP_FILL(BeginXfbPrimitivesQuery); queryObject->backendHandle = beginXfbPrimitivesQuery ? beginXfbPrimitivesQuery(target == GL_PRIMITIVES_GENERATED) : nullptr; queryObject->counterSnapshot = TransformFeedbackCounterForTarget(target); @@ -527,9 +538,11 @@ namespace MobileGL::MG_Impl::GLImpl { queryObject->geometryCaptureDrawSnapshot = MG_State::pGLContext->GetTransformFeedbackGeometryCaptureDraws(); } else if (isOcclusionQuery) { + MGP_FILL(BeginOcclusionQuery); queryObject->backendHandle = MG_Backend::gBackendFunctionsTable.GL.BeginOcclusionQuery(); } else { const auto beginTimeElapsedQuery = MG_Backend::gBackendFunctionsTable.GL.BeginTimeElapsedQuery; + MGP_FILL(BeginTimeElapsedQuery); queryObject->backendHandle = (!TimerQueryDisabled() && beginTimeElapsedQuery) ? beginTimeElapsedQuery() : nullptr; } @@ -579,6 +592,7 @@ namespace MobileGL::MG_Impl::GLImpl { if (isTransformFeedbackQuery) { if (queryObject->backendHandle) { if (const auto endXfbPrimitivesQuery = MG_Backend::gBackendFunctionsTable.GL.EndXfbPrimitivesQuery) { + MGP_FILL(EndXfbPrimitivesQuery); endXfbPrimitivesQuery(queryObject->backendHandle); } } @@ -588,6 +602,7 @@ namespace MobileGL::MG_Impl::GLImpl { if (!queryObject->backendHandle || PrefersCpuTransformFeedbackResult(queryObject)) { if (queryObject->backendHandle) { if (const auto deleteBackendQuery = MG_Backend::gBackendFunctionsTable.GL.DeleteBackendQuery) { + MGP_FILL(DeleteBackendQuery); deleteBackendQuery(queryObject->backendHandle); } queryObject->backendHandle = nullptr; @@ -604,6 +619,7 @@ namespace MobileGL::MG_Impl::GLImpl { if (isOcclusionQuery) { if (const auto endOcclusionQuery = MG_Backend::gBackendFunctionsTable.GL.EndOcclusionQuery; endOcclusionQuery && queryObject->backendHandle) { + MGP_FILL(EndOcclusionQuery); endOcclusionQuery(queryObject->backendHandle); } queryObject->active = false; @@ -642,6 +658,7 @@ namespace MobileGL::MG_Impl::GLImpl { ResetQueryObjectLocked(queryObject); // discard any previous result queryObject->target = target; const auto queryCounterTimestamp = MG_Backend::gBackendFunctionsTable.GL.QueryCounterTimestamp; + MGP_FILL(QueryCounterTimestamp); queryObject->backendHandle = (!TimerQueryDisabled() && queryCounterTimestamp) ? queryCounterTimestamp() : nullptr; queryObject->ended = true; @@ -771,6 +788,7 @@ namespace MobileGL::MG_Impl::GLImpl { } const Bool timerTarget = target == GL_TIME_ELAPSED || target == GL_TIMESTAMP; const auto isTimerQuerySupported = MG_Backend::gBackendFunctionsTable.GL.IsTimerQuerySupported; + MGP_FILL(IsTimerQuerySupported); const Bool supported = timerTarget && !TimerQueryDisabled() && isTimerQuerySupported && isTimerQuerySupported(); *params = supported ? 64 : 0; @@ -912,6 +930,7 @@ namespace MobileGL::MG_Impl::GLImpl { const auto deleteBackendQuery = MG_Backend::gBackendFunctionsTable.GL.DeleteBackendQuery; for (const auto& [_, queryObject] : orphans) { if (deleteBackendQuery && queryObject->backendHandle) { + MGP_FILL(DeleteBackendQuery); deleteBackendQuery(queryObject->backendHandle); } delete queryObject; diff --git a/MobileGL/MG_Impl/GLImpl/Sync/GL_Sync.cpp b/MobileGL/MG_Impl/GLImpl/Sync/GL_Sync.cpp index 39da96d5..6a818aad 100644 --- a/MobileGL/MG_Impl/GLImpl/Sync/GL_Sync.cpp +++ b/MobileGL/MG_Impl/GLImpl/Sync/GL_Sync.cpp @@ -9,6 +9,7 @@ #include "GL_Sync.h" #include #include +#include namespace MobileGL::MG_Impl::GLImpl { namespace { @@ -56,6 +57,7 @@ namespace MobileGL::MG_Impl::GLImpl { syncObject->condition = condition; syncObject->flags = flags; if (const auto backendFenceSync = MG_Backend::gBackendFunctionsTable.GL.FenceSync) { + MGP_FILL(FenceSync); syncObject->backendHandle = backendFenceSync(); } const GLsync handle = reinterpret_cast(syncObject); @@ -94,6 +96,7 @@ namespace MobileGL::MG_Impl::GLImpl { if (!backendClientWaitSync || !syncObject->backendHandle) { return GL_ALREADY_SIGNALED; // legacy always-signaled fallback } + MGP_FILL(ClientWaitSync); return backendClientWaitSync(syncObject->backendHandle, flags, timeout); } @@ -119,6 +122,7 @@ namespace MobileGL::MG_Impl::GLImpl { } const auto backendWaitSync = MG_Backend::gBackendFunctionsTable.GL.WaitSync; if (backendWaitSync && syncObject->backendHandle) { + MGP_FILL(WaitSync); backendWaitSync(syncObject->backendHandle, flags, timeout); } } @@ -139,6 +143,7 @@ namespace MobileGL::MG_Impl::GLImpl { } const auto backendDeleteSync = MG_Backend::gBackendFunctionsTable.GL.DeleteSync; if (backendDeleteSync && syncObject->backendHandle) { + MGP_FILL(DeleteSync); backendDeleteSync(syncObject->backendHandle); } delete syncObject; @@ -174,6 +179,7 @@ namespace MobileGL::MG_Impl::GLImpl { break; case GL_SYNC_STATUS: { const auto backendGetSyncStatus = MG_Backend::gBackendFunctionsTable.GL.GetSyncStatus; + MGP_FILL(GetSyncStatus); const Bool signaled = !backendGetSyncStatus || !syncObject->backendHandle || backendGetSyncStatus(syncObject->backendHandle); value = signaled ? GL_SIGNALED : GL_UNSIGNALED; @@ -226,6 +232,7 @@ namespace MobileGL::MG_Impl::GLImpl { // the function table itself is cleared. const auto backendDeleteSync = MG_Backend::gBackendFunctionsTable.GL.DeleteSync; for (const auto& [_, syncObject] : orphans) { + MGP_FILL(DeleteSync); if (backendDeleteSync && syncObject->backendHandle) { backendDeleteSync(syncObject->backendHandle); } diff --git a/MobileGL/MG_Impl/GLImpl/Texture/GL_Texture.cpp b/MobileGL/MG_Impl/GLImpl/Texture/GL_Texture.cpp index 647f2c07..4ed5cbc7 100644 --- a/MobileGL/MG_Impl/GLImpl/Texture/GL_Texture.cpp +++ b/MobileGL/MG_Impl/GLImpl/Texture/GL_Texture.cpp @@ -30,6 +30,7 @@ #include #include #include +#include namespace MobileGL::MG_Impl::GLImpl { static SharedPtr nullTextureObject; @@ -1076,6 +1077,7 @@ namespace MobileGL::MG_Impl::GLImpl { Vector scratch(static_cast(width) * static_cast(height) * bytesPerTexel); { ScopedNeutralPackState neutralPack; + MGP_FILL(ReadPixels); MG_Backend::gBackendFunctionsTable.GL.ReadPixels(x, y, width, height, format, type, scratch.data()); } @@ -1619,6 +1621,7 @@ namespace MobileGL::MG_Impl::GLImpl { } void GenerateMipmap_Backend(GLenum target) { + MGP_FILL(GenerateMipmap); MG_Backend::gBackendFunctionsTable.GL.GenerateMipmap(target); } @@ -4024,6 +4027,7 @@ namespace MobileGL::MG_Impl::GLImpl { void CopyTexSubImage2D_Backend(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height) { + MGP_FILL(CopyTexSubImage2D); MG_Backend::gBackendFunctionsTable.GL.CopyTexSubImage2D(target, level, xoffset, yoffset, x, y, width, height); } @@ -4040,6 +4044,7 @@ namespace MobileGL::MG_Impl::GLImpl { "Backend does not support image-to-image copies.")); return; } + MGP_FILL(CopyImageSubData); copyImageSubData(src, srcTarget, srcLevel, srcX, srcY, srcZ, dst, dstTarget, dstLevel, dstX, dstY, dstZ, srcWidth, srcHeight, srcDepth); } @@ -4461,6 +4466,7 @@ namespace MobileGL::MG_Impl::GLImpl { void CopyTexImage2D_Backend(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border) { + MGP_FILL(CopyTexImage2D); MG_Backend::gBackendFunctionsTable.GL.CopyTexImage2D(target, level, internalformat, x, y, width, height, border); } @@ -5071,6 +5077,7 @@ namespace MobileGL::MG_Impl::GLImpl { } void GetTexImage_Backend(GLenum target, GLint level, GLenum format, GLenum type, GLvoid* pixels) { + MGP_FILL(GetTexImage); MG_Backend::gBackendFunctionsTable.GL.GetTexImage(target, level, format, type, pixels); } @@ -6453,6 +6460,7 @@ namespace MobileGL::MG_Impl::GLImpl { if (MG_Backend::pActiveBackendObject != nullptr && MG_Backend::pActiveBackendObject->GetBackendType() == BackendType::DirectVulkan && MG_Backend::gBackendFunctionsTable.GL.GetTextureImage != nullptr) { + MGP_FILL(GetTextureImage); MG_Backend::gBackendFunctionsTable.GL.GetTextureImage(textureObject, uploadTarget, level, format, type, bufSize, pixels); return; @@ -6657,6 +6665,7 @@ namespace MobileGL::MG_Impl::GLImpl { MG_State::pGLContext->GetImageTextureBinding(static_cast(unit)) .Bind(textureObject, level, layered, layer, access, format); MG_State::pGLContext->NoteTextureUnitTouched(static_cast(unit)); + MGP_FILL(BindImageTexture); bindImageTexture(unit, texture, level, layered, layer, access, format); }