mirror of
https://github.com/MobileGL-Dev/MobileGL
synced 2026-09-11 21:58:31 +09:00
[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(<Verb>); 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 <MG_Impl/Pipe/PipeFill.h> 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.
This commit is contained in:
@@ -11,6 +11,7 @@
|
|||||||
#include <MG_State/GLState/Core.h>
|
#include <MG_State/GLState/Core.h>
|
||||||
#include <MG_State/EGLState/Core.h>
|
#include <MG_State/EGLState/Core.h>
|
||||||
#include <MG_Backend/BackendObjects.h>
|
#include <MG_Backend/BackendObjects.h>
|
||||||
|
#include <MG_Impl/Pipe/PipeFill.h>
|
||||||
#include "../Getter/GL_Getter.h"
|
#include "../Getter/GL_Getter.h"
|
||||||
|
|
||||||
namespace MobileGL::MG_Impl::GLImpl {
|
namespace MobileGL::MG_Impl::GLImpl {
|
||||||
@@ -527,6 +528,7 @@ namespace MobileGL::MG_Impl::GLImpl {
|
|||||||
ZoneScopedC(TRACY_ZONECOLOR_BACKEND);
|
ZoneScopedC(TRACY_ZONECOLOR_BACKEND);
|
||||||
#endif
|
#endif
|
||||||
if (ConditionalRenderDiscardsCommand()) return;
|
if (ConditionalRenderDiscardsCommand()) return;
|
||||||
|
MGP_FILL(Clear);
|
||||||
MG_Backend::gBackendFunctionsTable.GL.Clear(mask);
|
MG_Backend::gBackendFunctionsTable.GL.Clear(mask);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -535,6 +537,7 @@ namespace MobileGL::MG_Impl::GLImpl {
|
|||||||
ZoneScopedC(TRACY_ZONECOLOR_BACKEND);
|
ZoneScopedC(TRACY_ZONECOLOR_BACKEND);
|
||||||
#endif
|
#endif
|
||||||
if (ConditionalRenderDiscardsCommand()) return;
|
if (ConditionalRenderDiscardsCommand()) return;
|
||||||
|
MGP_FILL(DrawElements);
|
||||||
MG_Backend::gBackendFunctionsTable.GL.DrawElements(mode, count, type, indices);
|
MG_Backend::gBackendFunctionsTable.GL.DrawElements(mode, count, type, indices);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -544,6 +547,7 @@ namespace MobileGL::MG_Impl::GLImpl {
|
|||||||
ZoneScopedC(TRACY_ZONECOLOR_BACKEND);
|
ZoneScopedC(TRACY_ZONECOLOR_BACKEND);
|
||||||
#endif
|
#endif
|
||||||
if (ConditionalRenderDiscardsCommand()) return;
|
if (ConditionalRenderDiscardsCommand()) return;
|
||||||
|
MGP_FILL(MultiDrawElements);
|
||||||
MG_Backend::gBackendFunctionsTable.GL.MultiDrawElements(mode, count, type, indices, drawcount);
|
MG_Backend::gBackendFunctionsTable.GL.MultiDrawElements(mode, count, type, indices, drawcount);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -553,6 +557,7 @@ namespace MobileGL::MG_Impl::GLImpl {
|
|||||||
ZoneScopedC(TRACY_ZONECOLOR_BACKEND);
|
ZoneScopedC(TRACY_ZONECOLOR_BACKEND);
|
||||||
#endif
|
#endif
|
||||||
if (ConditionalRenderDiscardsCommand()) return;
|
if (ConditionalRenderDiscardsCommand()) return;
|
||||||
|
MGP_FILL(MultiDrawElementsBaseVertex);
|
||||||
MG_Backend::gBackendFunctionsTable.GL.MultiDrawElementsBaseVertex(mode, count, type, indices, drawcount,
|
MG_Backend::gBackendFunctionsTable.GL.MultiDrawElementsBaseVertex(mode, count, type, indices, drawcount,
|
||||||
basevertex);
|
basevertex);
|
||||||
}
|
}
|
||||||
@@ -562,6 +567,7 @@ namespace MobileGL::MG_Impl::GLImpl {
|
|||||||
ZoneScopedC(TRACY_ZONECOLOR_BACKEND);
|
ZoneScopedC(TRACY_ZONECOLOR_BACKEND);
|
||||||
#endif
|
#endif
|
||||||
if (ConditionalRenderDiscardsCommand()) return;
|
if (ConditionalRenderDiscardsCommand()) return;
|
||||||
|
MGP_FILL(DrawArrays);
|
||||||
MG_Backend::gBackendFunctionsTable.GL.DrawArrays(mode, first, count);
|
MG_Backend::gBackendFunctionsTable.GL.DrawArrays(mode, first, count);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -570,6 +576,7 @@ namespace MobileGL::MG_Impl::GLImpl {
|
|||||||
ZoneScopedC(TRACY_ZONECOLOR_BACKEND);
|
ZoneScopedC(TRACY_ZONECOLOR_BACKEND);
|
||||||
#endif
|
#endif
|
||||||
if (ConditionalRenderDiscardsCommand()) return;
|
if (ConditionalRenderDiscardsCommand()) return;
|
||||||
|
MGP_FILL(MultiDrawArrays);
|
||||||
MG_Backend::gBackendFunctionsTable.GL.MultiDrawArrays(mode, first, count, drawcount);
|
MG_Backend::gBackendFunctionsTable.GL.MultiDrawArrays(mode, first, count, drawcount);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -579,6 +586,7 @@ namespace MobileGL::MG_Impl::GLImpl {
|
|||||||
ZoneScopedC(TRACY_ZONECOLOR_BACKEND);
|
ZoneScopedC(TRACY_ZONECOLOR_BACKEND);
|
||||||
#endif
|
#endif
|
||||||
if (ConditionalRenderDiscardsCommand()) return;
|
if (ConditionalRenderDiscardsCommand()) return;
|
||||||
|
MGP_FILL(DrawElementsBaseVertex);
|
||||||
MG_Backend::gBackendFunctionsTable.GL.DrawElementsBaseVertex(mode, count, type, indices, basevertex);
|
MG_Backend::gBackendFunctionsTable.GL.DrawElementsBaseVertex(mode, count, type, indices, basevertex);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -588,6 +596,7 @@ namespace MobileGL::MG_Impl::GLImpl {
|
|||||||
ZoneScopedC(TRACY_ZONECOLOR_BACKEND);
|
ZoneScopedC(TRACY_ZONECOLOR_BACKEND);
|
||||||
#endif
|
#endif
|
||||||
if (ConditionalRenderDiscardsCommand()) return;
|
if (ConditionalRenderDiscardsCommand()) return;
|
||||||
|
MGP_FILL(MultiDrawElementsIndirect);
|
||||||
MG_Backend::gBackendFunctionsTable.GL.MultiDrawElementsIndirect(mode, type, indirect, drawcount, stride);
|
MG_Backend::gBackendFunctionsTable.GL.MultiDrawElementsIndirect(mode, type, indirect, drawcount, stride);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -596,6 +605,7 @@ namespace MobileGL::MG_Impl::GLImpl {
|
|||||||
ZoneScopedC(TRACY_ZONECOLOR_BACKEND);
|
ZoneScopedC(TRACY_ZONECOLOR_BACKEND);
|
||||||
#endif
|
#endif
|
||||||
if (ConditionalRenderDiscardsCommand()) return;
|
if (ConditionalRenderDiscardsCommand()) return;
|
||||||
|
MGP_FILL(MultiDrawArraysIndirect);
|
||||||
MG_Backend::gBackendFunctionsTable.GL.MultiDrawArraysIndirect(mode, indirect, drawcount, stride);
|
MG_Backend::gBackendFunctionsTable.GL.MultiDrawArraysIndirect(mode, indirect, drawcount, stride);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -605,6 +615,7 @@ namespace MobileGL::MG_Impl::GLImpl {
|
|||||||
ZoneScopedC(TRACY_ZONECOLOR_BACKEND);
|
ZoneScopedC(TRACY_ZONECOLOR_BACKEND);
|
||||||
#endif
|
#endif
|
||||||
if (ConditionalRenderDiscardsCommand()) return;
|
if (ConditionalRenderDiscardsCommand()) return;
|
||||||
|
MGP_FILL(MultiDrawElementsIndirectCount);
|
||||||
MG_Backend::gBackendFunctionsTable.GL.MultiDrawElementsIndirectCount(mode, type, indirect, drawcount,
|
MG_Backend::gBackendFunctionsTable.GL.MultiDrawElementsIndirectCount(mode, type, indirect, drawcount,
|
||||||
maxdrawcount, stride);
|
maxdrawcount, stride);
|
||||||
}
|
}
|
||||||
@@ -615,6 +626,7 @@ namespace MobileGL::MG_Impl::GLImpl {
|
|||||||
ZoneScopedC(TRACY_ZONECOLOR_BACKEND);
|
ZoneScopedC(TRACY_ZONECOLOR_BACKEND);
|
||||||
#endif
|
#endif
|
||||||
if (ConditionalRenderDiscardsCommand()) return;
|
if (ConditionalRenderDiscardsCommand()) return;
|
||||||
|
MGP_FILL(MultiDrawArraysIndirectCount);
|
||||||
MG_Backend::gBackendFunctionsTable.GL.MultiDrawArraysIndirectCount(mode, indirect, drawcount, maxdrawcount,
|
MG_Backend::gBackendFunctionsTable.GL.MultiDrawArraysIndirectCount(mode, indirect, drawcount, maxdrawcount,
|
||||||
stride);
|
stride);
|
||||||
}
|
}
|
||||||
@@ -625,6 +637,7 @@ namespace MobileGL::MG_Impl::GLImpl {
|
|||||||
ZoneScopedC(TRACY_ZONECOLOR_BACKEND);
|
ZoneScopedC(TRACY_ZONECOLOR_BACKEND);
|
||||||
#endif
|
#endif
|
||||||
if (ConditionalRenderDiscardsCommand()) return;
|
if (ConditionalRenderDiscardsCommand()) return;
|
||||||
|
MGP_FILL(DrawRangeElementsBaseVertex);
|
||||||
MG_Backend::gBackendFunctionsTable.GL.DrawRangeElementsBaseVertex(mode, start, end, count, type, indices,
|
MG_Backend::gBackendFunctionsTable.GL.DrawRangeElementsBaseVertex(mode, start, end, count, type, indices,
|
||||||
basevertex);
|
basevertex);
|
||||||
}
|
}
|
||||||
@@ -635,6 +648,7 @@ namespace MobileGL::MG_Impl::GLImpl {
|
|||||||
ZoneScopedC(TRACY_ZONECOLOR_BACKEND);
|
ZoneScopedC(TRACY_ZONECOLOR_BACKEND);
|
||||||
#endif
|
#endif
|
||||||
if (ConditionalRenderDiscardsCommand()) return;
|
if (ConditionalRenderDiscardsCommand()) return;
|
||||||
|
MGP_FILL(DrawRangeElements);
|
||||||
MG_Backend::gBackendFunctionsTable.GL.DrawRangeElements(mode, start, end, count, type, indices);
|
MG_Backend::gBackendFunctionsTable.GL.DrawRangeElements(mode, start, end, count, type, indices);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -645,6 +659,7 @@ namespace MobileGL::MG_Impl::GLImpl {
|
|||||||
ZoneScopedC(TRACY_ZONECOLOR_BACKEND);
|
ZoneScopedC(TRACY_ZONECOLOR_BACKEND);
|
||||||
#endif
|
#endif
|
||||||
if (ConditionalRenderDiscardsCommand()) return;
|
if (ConditionalRenderDiscardsCommand()) return;
|
||||||
|
MGP_FILL(DrawElementsInstancedBaseVertexBaseInstance);
|
||||||
MG_Backend::gBackendFunctionsTable.GL.DrawElementsInstancedBaseVertexBaseInstance(
|
MG_Backend::gBackendFunctionsTable.GL.DrawElementsInstancedBaseVertexBaseInstance(
|
||||||
mode, count, type, indices, instancecount, basevertex, baseinstance);
|
mode, count, type, indices, instancecount, basevertex, baseinstance);
|
||||||
}
|
}
|
||||||
@@ -655,6 +670,7 @@ namespace MobileGL::MG_Impl::GLImpl {
|
|||||||
ZoneScopedC(TRACY_ZONECOLOR_BACKEND);
|
ZoneScopedC(TRACY_ZONECOLOR_BACKEND);
|
||||||
#endif
|
#endif
|
||||||
if (ConditionalRenderDiscardsCommand()) return;
|
if (ConditionalRenderDiscardsCommand()) return;
|
||||||
|
MGP_FILL(DrawElementsInstancedBaseVertex);
|
||||||
MG_Backend::gBackendFunctionsTable.GL.DrawElementsInstancedBaseVertex(mode, count, type, indices, instancecount,
|
MG_Backend::gBackendFunctionsTable.GL.DrawElementsInstancedBaseVertex(mode, count, type, indices, instancecount,
|
||||||
basevertex);
|
basevertex);
|
||||||
}
|
}
|
||||||
@@ -665,6 +681,7 @@ namespace MobileGL::MG_Impl::GLImpl {
|
|||||||
ZoneScopedC(TRACY_ZONECOLOR_BACKEND);
|
ZoneScopedC(TRACY_ZONECOLOR_BACKEND);
|
||||||
#endif
|
#endif
|
||||||
if (ConditionalRenderDiscardsCommand()) return;
|
if (ConditionalRenderDiscardsCommand()) return;
|
||||||
|
MGP_FILL(DrawElementsInstancedBaseInstance);
|
||||||
MG_Backend::gBackendFunctionsTable.GL.DrawElementsInstancedBaseInstance(mode, count, type, indices,
|
MG_Backend::gBackendFunctionsTable.GL.DrawElementsInstancedBaseInstance(mode, count, type, indices,
|
||||||
instancecount, baseinstance);
|
instancecount, baseinstance);
|
||||||
}
|
}
|
||||||
@@ -675,6 +692,7 @@ namespace MobileGL::MG_Impl::GLImpl {
|
|||||||
ZoneScopedC(TRACY_ZONECOLOR_BACKEND);
|
ZoneScopedC(TRACY_ZONECOLOR_BACKEND);
|
||||||
#endif
|
#endif
|
||||||
if (ConditionalRenderDiscardsCommand()) return;
|
if (ConditionalRenderDiscardsCommand()) return;
|
||||||
|
MGP_FILL(DrawElementsInstanced);
|
||||||
MG_Backend::gBackendFunctionsTable.GL.DrawElementsInstanced(mode, count, type, indices, instancecount);
|
MG_Backend::gBackendFunctionsTable.GL.DrawElementsInstanced(mode, count, type, indices, instancecount);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -683,6 +701,7 @@ namespace MobileGL::MG_Impl::GLImpl {
|
|||||||
ZoneScopedC(TRACY_ZONECOLOR_BACKEND);
|
ZoneScopedC(TRACY_ZONECOLOR_BACKEND);
|
||||||
#endif
|
#endif
|
||||||
if (ConditionalRenderDiscardsCommand()) return;
|
if (ConditionalRenderDiscardsCommand()) return;
|
||||||
|
MGP_FILL(DrawElementsIndirect);
|
||||||
MG_Backend::gBackendFunctionsTable.GL.DrawElementsIndirect(mode, type, indirect);
|
MG_Backend::gBackendFunctionsTable.GL.DrawElementsIndirect(mode, type, indirect);
|
||||||
}
|
}
|
||||||
void DrawArraysInstancedBaseInstance_Backend(GLenum mode, GLint first, GLsizei count, GLsizei instancecount,
|
void DrawArraysInstancedBaseInstance_Backend(GLenum mode, GLint first, GLsizei count, GLsizei instancecount,
|
||||||
@@ -691,6 +710,7 @@ namespace MobileGL::MG_Impl::GLImpl {
|
|||||||
ZoneScopedC(TRACY_ZONECOLOR_BACKEND);
|
ZoneScopedC(TRACY_ZONECOLOR_BACKEND);
|
||||||
#endif
|
#endif
|
||||||
if (ConditionalRenderDiscardsCommand()) return;
|
if (ConditionalRenderDiscardsCommand()) return;
|
||||||
|
MGP_FILL(DrawArraysInstancedBaseInstance);
|
||||||
MG_Backend::gBackendFunctionsTable.GL.DrawArraysInstancedBaseInstance(mode, first, count, instancecount,
|
MG_Backend::gBackendFunctionsTable.GL.DrawArraysInstancedBaseInstance(mode, first, count, instancecount,
|
||||||
baseinstance);
|
baseinstance);
|
||||||
}
|
}
|
||||||
@@ -700,6 +720,7 @@ namespace MobileGL::MG_Impl::GLImpl {
|
|||||||
ZoneScopedC(TRACY_ZONECOLOR_BACKEND);
|
ZoneScopedC(TRACY_ZONECOLOR_BACKEND);
|
||||||
#endif
|
#endif
|
||||||
if (ConditionalRenderDiscardsCommand()) return;
|
if (ConditionalRenderDiscardsCommand()) return;
|
||||||
|
MGP_FILL(DrawArraysInstanced);
|
||||||
MG_Backend::gBackendFunctionsTable.GL.DrawArraysInstanced(mode, first, count, instancecount);
|
MG_Backend::gBackendFunctionsTable.GL.DrawArraysInstanced(mode, first, count, instancecount);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -708,6 +729,7 @@ namespace MobileGL::MG_Impl::GLImpl {
|
|||||||
ZoneScopedC(TRACY_ZONECOLOR_BACKEND);
|
ZoneScopedC(TRACY_ZONECOLOR_BACKEND);
|
||||||
#endif
|
#endif
|
||||||
if (ConditionalRenderDiscardsCommand()) return;
|
if (ConditionalRenderDiscardsCommand()) return;
|
||||||
|
MGP_FILL(DrawArraysIndirect);
|
||||||
MG_Backend::gBackendFunctionsTable.GL.DrawArraysIndirect(mode, indirect);
|
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
|
// 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.
|
// exactly what KHR-GL43.compute_shader.conditional-dispatching checks.
|
||||||
if (ConditionalRenderDiscardsCommand()) return;
|
if (ConditionalRenderDiscardsCommand()) return;
|
||||||
|
MGP_FILL(DispatchCompute);
|
||||||
dispatchCompute(numGroupsX, numGroupsY, numGroupsZ);
|
dispatchCompute(numGroupsX, numGroupsY, numGroupsZ);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -791,6 +814,7 @@ namespace MobileGL::MG_Impl::GLImpl {
|
|||||||
}
|
}
|
||||||
if (!ValidateCurrentProgramForCompute(__func__)) return;
|
if (!ValidateCurrentProgramForCompute(__func__)) return;
|
||||||
if (ConditionalRenderDiscardsCommand()) return;
|
if (ConditionalRenderDiscardsCommand()) return;
|
||||||
|
MGP_FILL(DispatchComputeIndirect);
|
||||||
dispatchComputeIndirect(indirect);
|
dispatchComputeIndirect(indirect);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -812,6 +836,7 @@ namespace MobileGL::MG_Impl::GLImpl {
|
|||||||
}
|
}
|
||||||
MG_State::pGLContext->SetPatchVertices(static_cast<Uint>(value));
|
MG_State::pGLContext->SetPatchVertices(static_cast<Uint>(value));
|
||||||
if (const auto patchParameteri = MG_Backend::gBackendFunctionsTable.GL.PatchParameteri) {
|
if (const auto patchParameteri = MG_Backend::gBackendFunctionsTable.GL.PatchParameteri) {
|
||||||
|
MGP_FILL(PatchParameteri);
|
||||||
patchParameteri(pname, value);
|
patchParameteri(pname, value);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -882,6 +907,7 @@ namespace MobileGL::MG_Impl::GLImpl {
|
|||||||
MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", __func__, "Backend does not support memory barriers."));
|
MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", __func__, "Backend does not support memory barriers."));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
MGP_FILL(MemoryBarrier);
|
||||||
memoryBarrier(barriers);
|
memoryBarrier(barriers);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -903,6 +929,7 @@ namespace MobileGL::MG_Impl::GLImpl {
|
|||||||
MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", __func__, "Backend does not support memory barriers."));
|
MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", __func__, "Backend does not support memory barriers."));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
MGP_FILL(MemoryBarrier);
|
||||||
memoryBarrier(GL_TEXTURE_FETCH_BARRIER_BIT | GL_FRAMEBUFFER_BARRIER_BIT);
|
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."));
|
"Backend does not support regional memory barriers."));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
MGP_FILL(MemoryBarrierByRegion);
|
||||||
memoryBarrierByRegion(barriers);
|
memoryBarrierByRegion(barriers);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1238,6 +1266,7 @@ namespace MobileGL::MG_Impl::GLImpl {
|
|||||||
}
|
}
|
||||||
MG_State::pGLContext->BeginTransformFeedback(primitiveMode, program);
|
MG_State::pGLContext->BeginTransformFeedback(primitiveMode, program);
|
||||||
if (const auto beginXfb = MG_Backend::gBackendFunctionsTable.GL.BeginTransformFeedback) {
|
if (const auto beginXfb = MG_Backend::gBackendFunctionsTable.GL.BeginTransformFeedback) {
|
||||||
|
MGP_FILL(BeginTransformFeedback);
|
||||||
beginXfb(primitiveMode);
|
beginXfb(primitiveMode);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1320,6 +1349,7 @@ namespace MobileGL::MG_Impl::GLImpl {
|
|||||||
// Closed while the capture state is still active: a backend that captures
|
// Closed while the capture state is still active: a backend that captures
|
||||||
// through its own driver reads the capture program and buffer bindings here.
|
// through its own driver reads the capture program and buffer bindings here.
|
||||||
if (const auto endXfb = MG_Backend::gBackendFunctionsTable.GL.EndTransformFeedback) {
|
if (const auto endXfb = MG_Backend::gBackendFunctionsTable.GL.EndTransformFeedback) {
|
||||||
|
MGP_FILL(EndTransformFeedback);
|
||||||
endXfb();
|
endXfb();
|
||||||
}
|
}
|
||||||
MG_State::pGLContext->EndTransformFeedback();
|
MG_State::pGLContext->EndTransformFeedback();
|
||||||
@@ -1328,9 +1358,12 @@ namespace MobileGL::MG_Impl::GLImpl {
|
|||||||
// the GPU work is all that is required.
|
// the GPU work is all that is required.
|
||||||
auto& backendGL = MG_Backend::gBackendFunctionsTable.GL;
|
auto& backendGL = MG_Backend::gBackendFunctionsTable.GL;
|
||||||
if (backendGL.FenceSync && backendGL.ClientWaitSync) {
|
if (backendGL.FenceSync && backendGL.ClientWaitSync) {
|
||||||
|
MGP_FILL(FenceSync);
|
||||||
if (auto sync = backendGL.FenceSync()) {
|
if (auto sync = backendGL.FenceSync()) {
|
||||||
|
MGP_FILL(ClientWaitSync);
|
||||||
backendGL.ClientWaitSync(sync, GL_SYNC_FLUSH_COMMANDS_BIT, ~0ull);
|
backendGL.ClientWaitSync(sync, GL_SYNC_FLUSH_COMMANDS_BIT, ~0ull);
|
||||||
if (backendGL.DeleteSync) {
|
if (backendGL.DeleteSync) {
|
||||||
|
MGP_FILL(DeleteSync);
|
||||||
backendGL.DeleteSync(sync);
|
backendGL.DeleteSync(sync);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1349,6 +1382,7 @@ namespace MobileGL::MG_Impl::GLImpl {
|
|||||||
}
|
}
|
||||||
MG_State::pGLContext->SetTransformFeedbackPaused(true);
|
MG_State::pGLContext->SetTransformFeedbackPaused(true);
|
||||||
if (const auto pauseXfb = MG_Backend::gBackendFunctionsTable.GL.PauseTransformFeedback) {
|
if (const auto pauseXfb = MG_Backend::gBackendFunctionsTable.GL.PauseTransformFeedback) {
|
||||||
|
MGP_FILL(PauseTransformFeedback);
|
||||||
pauseXfb();
|
pauseXfb();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1363,6 +1397,7 @@ namespace MobileGL::MG_Impl::GLImpl {
|
|||||||
}
|
}
|
||||||
MG_State::pGLContext->SetTransformFeedbackPaused(false);
|
MG_State::pGLContext->SetTransformFeedbackPaused(false);
|
||||||
if (const auto resumeXfb = MG_Backend::gBackendFunctionsTable.GL.ResumeTransformFeedback) {
|
if (const auto resumeXfb = MG_Backend::gBackendFunctionsTable.GL.ResumeTransformFeedback) {
|
||||||
|
MGP_FILL(ResumeTransformFeedback);
|
||||||
resumeXfb();
|
resumeXfb();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1568,6 +1603,7 @@ namespace MobileGL::MG_Impl::GLImpl {
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (const auto deleteXfb = MG_Backend::gBackendFunctionsTable.GL.DeleteTransformFeedback) {
|
if (const auto deleteXfb = MG_Backend::gBackendFunctionsTable.GL.DeleteTransformFeedback) {
|
||||||
|
MGP_FILL(DeleteTransformFeedback);
|
||||||
deleteXfb(id);
|
deleteXfb(id);
|
||||||
}
|
}
|
||||||
MG_State::pGLContext->MarkTransformFeedbackObjectForDeletion(id);
|
MG_State::pGLContext->MarkTransformFeedbackObjectForDeletion(id);
|
||||||
@@ -1599,6 +1635,7 @@ namespace MobileGL::MG_Impl::GLImpl {
|
|||||||
}
|
}
|
||||||
MG_State::pGLContext->BindTransformFeedbackObject(id);
|
MG_State::pGLContext->BindTransformFeedbackObject(id);
|
||||||
if (const auto bindXfb = MG_Backend::gBackendFunctionsTable.GL.BindTransformFeedback) {
|
if (const auto bindXfb = MG_Backend::gBackendFunctionsTable.GL.BindTransformFeedback) {
|
||||||
|
MGP_FILL(BindTransformFeedback);
|
||||||
bindXfb(id);
|
bindXfb(id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -15,6 +15,7 @@
|
|||||||
#include <MG_Impl/GLImpl/Texture/Validators.h>
|
#include <MG_Impl/GLImpl/Texture/Validators.h>
|
||||||
#include <MG_Impl/GLImpl/Getter/GL_Getter.h>
|
#include <MG_Impl/GLImpl/Getter/GL_Getter.h>
|
||||||
#include <MG_State/GLState/ErrorState/Error.h>
|
#include <MG_State/GLState/ErrorState/Error.h>
|
||||||
|
#include <MG_Impl/Pipe/PipeFill.h>
|
||||||
#include <MG_Util/Converters/GLToStr/GLEnumConverter.h>
|
#include <MG_Util/Converters/GLToStr/GLEnumConverter.h>
|
||||||
#include <MG_Util/Converters/GLToMG/TextureEnumConverter.h>
|
#include <MG_Util/Converters/GLToMG/TextureEnumConverter.h>
|
||||||
#include <MG_Util/Converters/MGToMG/TextureEnumConverter.h>
|
#include <MG_Util/Converters/MGToMG/TextureEnumConverter.h>
|
||||||
@@ -616,6 +617,7 @@ namespace MobileGL::MG_Impl::GLImpl {
|
|||||||
|
|
||||||
void BlitFramebuffer_Backend(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0,
|
void BlitFramebuffer_Backend(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0,
|
||||||
GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter) {
|
GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter) {
|
||||||
|
MGP_FILL(BlitFramebuffer);
|
||||||
MG_Backend::gBackendFunctionsTable.GL.BlitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1,
|
MG_Backend::gBackendFunctionsTable.GL.BlitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1,
|
||||||
mask, filter);
|
mask, filter);
|
||||||
}
|
}
|
||||||
@@ -629,6 +631,7 @@ namespace MobileGL::MG_Impl::GLImpl {
|
|||||||
MGLOG_E_ONCE("glBlitNamedFramebuffer skipped: backend does not implement explicit framebuffer blit.");
|
MGLOG_E_ONCE("glBlitNamedFramebuffer skipped: backend does not implement explicit framebuffer blit.");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
MGP_FILL(BlitNamedFramebuffer);
|
||||||
blitNamedFramebuffer(readFramebuffer, drawFramebuffer, srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1,
|
blitNamedFramebuffer(readFramebuffer, drawFramebuffer, srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1,
|
||||||
dstY1, mask, filter);
|
dstY1, mask, filter);
|
||||||
}
|
}
|
||||||
@@ -640,6 +643,7 @@ namespace MobileGL::MG_Impl::GLImpl {
|
|||||||
MGLOG_E_ONCE("glClearNamedFramebufferfv skipped: backend does not implement explicit framebuffer clear.");
|
MGLOG_E_ONCE("glClearNamedFramebufferfv skipped: backend does not implement explicit framebuffer clear.");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
MGP_FILL(ClearNamedFramebufferfv);
|
||||||
clearNamedFramebufferfv(framebuffer, buffer, drawbuffer, value);
|
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.");
|
MGLOG_E_ONCE("glClearNamedFramebufferfi skipped: backend does not implement explicit framebuffer clear.");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
MGP_FILL(ClearNamedFramebufferfi);
|
||||||
clearNamedFramebufferfi(framebuffer, buffer, drawbuffer, depth, stencil);
|
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.");
|
MGLOG_E_ONCE("glClearNamedFramebufferiv skipped: backend does not implement explicit framebuffer clear.");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
MGP_FILL(ClearNamedFramebufferiv);
|
||||||
clearNamedFramebufferiv(framebuffer, buffer, drawbuffer, value);
|
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.");
|
MGLOG_E_ONCE("glClearNamedFramebufferuiv skipped: backend does not implement explicit framebuffer clear.");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
MGP_FILL(ClearNamedFramebufferuiv);
|
||||||
clearNamedFramebufferuiv(framebuffer, buffer, drawbuffer, value);
|
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) {
|
void ClearBufferfi_Backend(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil) {
|
||||||
// GL 4.6 core 10.9 makes ClearBuffer* conditional alongside the drawing commands.
|
// GL 4.6 core 10.9 makes ClearBuffer* conditional alongside the drawing commands.
|
||||||
if (MG_State::pGLContext->ConditionalRenderDiscardsCommands()) return;
|
if (MG_State::pGLContext->ConditionalRenderDiscardsCommands()) return;
|
||||||
|
MGP_FILL(ClearBufferfi);
|
||||||
MG_Backend::gBackendFunctionsTable.GL.ClearBufferfi(buffer, drawbuffer, depth, stencil);
|
MG_Backend::gBackendFunctionsTable.GL.ClearBufferfi(buffer, drawbuffer, depth, stencil);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ClearBufferfv_Backend(GLenum buffer, GLint drawbuffer, const GLfloat* value) {
|
void ClearBufferfv_Backend(GLenum buffer, GLint drawbuffer, const GLfloat* value) {
|
||||||
// GL 4.6 core 10.9 makes ClearBuffer* conditional alongside the drawing commands.
|
// GL 4.6 core 10.9 makes ClearBuffer* conditional alongside the drawing commands.
|
||||||
if (MG_State::pGLContext->ConditionalRenderDiscardsCommands()) return;
|
if (MG_State::pGLContext->ConditionalRenderDiscardsCommands()) return;
|
||||||
|
MGP_FILL(ClearBufferfv);
|
||||||
MG_Backend::gBackendFunctionsTable.GL.ClearBufferfv(buffer, drawbuffer, value);
|
MG_Backend::gBackendFunctionsTable.GL.ClearBufferfv(buffer, drawbuffer, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ClearBufferuiv_Backend(GLenum buffer, GLint drawbuffer, const GLuint* value) {
|
void ClearBufferuiv_Backend(GLenum buffer, GLint drawbuffer, const GLuint* value) {
|
||||||
// GL 4.6 core 10.9 makes ClearBuffer* conditional alongside the drawing commands.
|
// GL 4.6 core 10.9 makes ClearBuffer* conditional alongside the drawing commands.
|
||||||
if (MG_State::pGLContext->ConditionalRenderDiscardsCommands()) return;
|
if (MG_State::pGLContext->ConditionalRenderDiscardsCommands()) return;
|
||||||
|
MGP_FILL(ClearBufferuiv);
|
||||||
MG_Backend::gBackendFunctionsTable.GL.ClearBufferuiv(buffer, drawbuffer, value);
|
MG_Backend::gBackendFunctionsTable.GL.ClearBufferuiv(buffer, drawbuffer, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ClearBufferiv_Backend(GLenum buffer, GLint drawbuffer, const GLint* value) {
|
void ClearBufferiv_Backend(GLenum buffer, GLint drawbuffer, const GLint* value) {
|
||||||
// GL 4.6 core 10.9 makes ClearBuffer* conditional alongside the drawing commands.
|
// GL 4.6 core 10.9 makes ClearBuffer* conditional alongside the drawing commands.
|
||||||
if (MG_State::pGLContext->ConditionalRenderDiscardsCommands()) return;
|
if (MG_State::pGLContext->ConditionalRenderDiscardsCommands()) return;
|
||||||
|
MGP_FILL(ClearBufferiv);
|
||||||
MG_Backend::gBackendFunctionsTable.GL.ClearBufferiv(buffer, drawbuffer, value);
|
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) {
|
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);
|
MG_Backend::gBackendFunctionsTable.GL.ReadPixels(x, y, width, height, format, type, pixels);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -30,6 +30,7 @@
|
|||||||
#include <MG_Util/Async/ShaderCompilePool.h>
|
#include <MG_Util/Async/ShaderCompilePool.h>
|
||||||
#include <MG_Util/ShaderTranspiler/Types.h>
|
#include <MG_Util/ShaderTranspiler/Types.h>
|
||||||
#include <MG_Backend/BackendObjects.h>
|
#include <MG_Backend/BackendObjects.h>
|
||||||
|
#include <MG_Impl/Pipe/PipeFill.h>
|
||||||
|
|
||||||
namespace MobileGL::MG_Impl::GLImpl {
|
namespace MobileGL::MG_Impl::GLImpl {
|
||||||
// Declared rather than #included from GL_RenderState.h on purpose: that header also declares
|
// 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);
|
: GetMinComputeWorkGroupSize(index);
|
||||||
GLint backendValue = 0;
|
GLint backendValue = 0;
|
||||||
if (getIntegeri) {
|
if (getIntegeri) {
|
||||||
|
MGP_FILL(GetIntegeri_v);
|
||||||
getIntegeri(target, index, &backendValue);
|
getIntegeri(target, index, &backendValue);
|
||||||
}
|
}
|
||||||
*data = std::max(backendValue, minimum);
|
*data = std::max(backendValue, minimum);
|
||||||
@@ -1353,6 +1355,7 @@ namespace MobileGL::MG_Impl::GLImpl {
|
|||||||
Int64 timestamp = 0;
|
Int64 timestamp = 0;
|
||||||
if (!MG_Config::Features.DisableTimerQuery) {
|
if (!MG_Config::Features.DisableTimerQuery) {
|
||||||
if (const auto getGpuTimestampNs = MG_Backend::gBackendFunctionsTable.GL.GetGpuTimestampNs) {
|
if (const auto getGpuTimestampNs = MG_Backend::gBackendFunctionsTable.GL.GetGpuTimestampNs) {
|
||||||
|
MGP_FILL(GetGpuTimestampNs);
|
||||||
timestamp = getGpuTimestampNs();
|
timestamp = getGpuTimestampNs();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -2263,6 +2266,7 @@ namespace MobileGL::MG_Impl::GLImpl {
|
|||||||
Int64 timestamp = 0;
|
Int64 timestamp = 0;
|
||||||
if (!MG_Config::Features.DisableTimerQuery) {
|
if (!MG_Config::Features.DisableTimerQuery) {
|
||||||
if (const auto getGpuTimestampNs = MG_Backend::gBackendFunctionsTable.GL.GetGpuTimestampNs) {
|
if (const auto getGpuTimestampNs = MG_Backend::gBackendFunctionsTable.GL.GetGpuTimestampNs) {
|
||||||
|
MGP_FILL(GetGpuTimestampNs);
|
||||||
timestamp = getGpuTimestampNs();
|
timestamp = getGpuTimestampNs();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -21,6 +21,7 @@
|
|||||||
#include <MG_Util/Converters/SPIRVCrossToGL/SpvcTypeConverter.h>
|
#include <MG_Util/Converters/SPIRVCrossToGL/SpvcTypeConverter.h>
|
||||||
#include <MG_Util/Async/ShaderCompilePool.h>
|
#include <MG_Util/Async/ShaderCompilePool.h>
|
||||||
#include <MG_Backend/BackendObjects.h>
|
#include <MG_Backend/BackendObjects.h>
|
||||||
|
#include <MG_Impl/Pipe/PipeFill.h>
|
||||||
|
|
||||||
namespace MobileGL::MG_Impl::GLImpl {
|
namespace MobileGL::MG_Impl::GLImpl {
|
||||||
// The flattened uniform type these helpers used to take as a raw glslang::TType*
|
// 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."));
|
"Backend does not support shader storage block binding."));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
MGP_FILL(ShaderStorageBlockBinding);
|
||||||
shaderStorageBlockBinding(program, blockName.c_str(), storageBlockBinding);
|
shaderStorageBlockBinding(program, blockName.c_str(), storageBlockBinding);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -12,6 +12,7 @@
|
|||||||
#include <MG_Backend/BackendObjects.h>
|
#include <MG_Backend/BackendObjects.h>
|
||||||
#include <MG_State/GLState/Core.h>
|
#include <MG_State/GLState/Core.h>
|
||||||
#include <MG_State/GLState/ErrorState/ErrorInfo.h>
|
#include <MG_State/GLState/ErrorState/ErrorInfo.h>
|
||||||
|
#include <MG_Impl/Pipe/PipeFill.h>
|
||||||
|
|
||||||
namespace MobileGL::MG_Impl::GLImpl {
|
namespace MobileGL::MG_Impl::GLImpl {
|
||||||
namespace {
|
namespace {
|
||||||
@@ -164,6 +165,7 @@ namespace MobileGL::MG_Impl::GLImpl {
|
|||||||
void ResetQueryObjectLocked(QueryObject* queryObject) {
|
void ResetQueryObjectLocked(QueryObject* queryObject) {
|
||||||
if (queryObject->backendHandle) {
|
if (queryObject->backendHandle) {
|
||||||
if (const auto deleteBackendQuery = MG_Backend::gBackendFunctionsTable.GL.DeleteBackendQuery) {
|
if (const auto deleteBackendQuery = MG_Backend::gBackendFunctionsTable.GL.DeleteBackendQuery) {
|
||||||
|
MGP_FILL(DeleteBackendQuery);
|
||||||
deleteBackendQuery(queryObject->backendHandle);
|
deleteBackendQuery(queryObject->backendHandle);
|
||||||
}
|
}
|
||||||
queryObject->backendHandle = nullptr;
|
queryObject->backendHandle = nullptr;
|
||||||
@@ -178,6 +180,7 @@ namespace MobileGL::MG_Impl::GLImpl {
|
|||||||
void EndTimeElapsedQueryLocked(QueryObject* queryObject) {
|
void EndTimeElapsedQueryLocked(QueryObject* queryObject) {
|
||||||
const auto endTimeElapsedQuery = MG_Backend::gBackendFunctionsTable.GL.EndTimeElapsedQuery;
|
const auto endTimeElapsedQuery = MG_Backend::gBackendFunctionsTable.GL.EndTimeElapsedQuery;
|
||||||
if (endTimeElapsedQuery && queryObject->backendHandle) {
|
if (endTimeElapsedQuery && queryObject->backendHandle) {
|
||||||
|
MGP_FILL(EndTimeElapsedQuery);
|
||||||
endTimeElapsedQuery(queryObject->backendHandle);
|
endTimeElapsedQuery(queryObject->backendHandle);
|
||||||
}
|
}
|
||||||
queryObject->active = false;
|
queryObject->active = false;
|
||||||
@@ -257,6 +260,7 @@ namespace MobileGL::MG_Impl::GLImpl {
|
|||||||
}
|
}
|
||||||
Uint64 result = 0;
|
Uint64 result = 0;
|
||||||
const auto getQueryResult64 = MG_Backend::gBackendFunctionsTable.GL.GetQueryResult64;
|
const auto getQueryResult64 = MG_Backend::gBackendFunctionsTable.GL.GetQueryResult64;
|
||||||
|
MGP_FILL(GetQueryResult64);
|
||||||
if (queryObject->backendHandle && getQueryResult64 &&
|
if (queryObject->backendHandle && getQueryResult64 &&
|
||||||
!getQueryResult64(queryObject->backendHandle, /*wait=*/false, &result)) {
|
!getQueryResult64(queryObject->backendHandle, /*wait=*/false, &result)) {
|
||||||
// Not ready. The whole point of the no-wait form is that the caller's
|
// 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 (queryObject->backendHandle) {
|
||||||
if (const auto deleteBackendQuery = MG_Backend::gBackendFunctionsTable.GL.DeleteBackendQuery) {
|
if (const auto deleteBackendQuery = MG_Backend::gBackendFunctionsTable.GL.DeleteBackendQuery) {
|
||||||
|
MGP_FILL(DeleteBackendQuery);
|
||||||
deleteBackendQuery(queryObject->backendHandle);
|
deleteBackendQuery(queryObject->backendHandle);
|
||||||
}
|
}
|
||||||
queryObject->backendHandle = nullptr;
|
queryObject->backendHandle = nullptr;
|
||||||
@@ -286,6 +291,7 @@ namespace MobileGL::MG_Impl::GLImpl {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
const auto isQueryResultAvailable = MG_Backend::gBackendFunctionsTable.GL.IsQueryResultAvailable;
|
const auto isQueryResultAvailable = MG_Backend::gBackendFunctionsTable.GL.IsQueryResultAvailable;
|
||||||
|
MGP_FILL(IsQueryResultAvailable);
|
||||||
outValue = (!isQueryResultAvailable || isQueryResultAvailable(queryObject->backendHandle)) ? 1 : 0;
|
outValue = (!isQueryResultAvailable || isQueryResultAvailable(queryObject->backendHandle)) ? 1 : 0;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -297,6 +303,7 @@ namespace MobileGL::MG_Impl::GLImpl {
|
|||||||
Uint64 result = 0;
|
Uint64 result = 0;
|
||||||
if (queryObject->backendHandle) {
|
if (queryObject->backendHandle) {
|
||||||
const auto getQueryResult64 = MG_Backend::gBackendFunctionsTable.GL.GetQueryResult64;
|
const auto getQueryResult64 = MG_Backend::gBackendFunctionsTable.GL.GetQueryResult64;
|
||||||
|
MGP_FILL(GetQueryResult64);
|
||||||
if (getQueryResult64 &&
|
if (getQueryResult64 &&
|
||||||
!getQueryResult64(queryObject->backendHandle, /*wait=*/true, &result)) {
|
!getQueryResult64(queryObject->backendHandle, /*wait=*/true, &result)) {
|
||||||
// The backend could not produce the result YET (e.g. a
|
// 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
|
// query degrades to a zero result); the backend handle is
|
||||||
// consumed and the value cached for later reads.
|
// consumed and the value cached for later reads.
|
||||||
if (const auto deleteBackendQuery = MG_Backend::gBackendFunctionsTable.GL.DeleteBackendQuery) {
|
if (const auto deleteBackendQuery = MG_Backend::gBackendFunctionsTable.GL.DeleteBackendQuery) {
|
||||||
|
MGP_FILL(DeleteBackendQuery);
|
||||||
deleteBackendQuery(queryObject->backendHandle);
|
deleteBackendQuery(queryObject->backendHandle);
|
||||||
}
|
}
|
||||||
queryObject->backendHandle = nullptr;
|
queryObject->backendHandle = nullptr;
|
||||||
@@ -422,6 +430,7 @@ namespace MobileGL::MG_Impl::GLImpl {
|
|||||||
queryObject->target == GL_ANY_SAMPLES_PASSED_CONSERVATIVE) {
|
queryObject->target == GL_ANY_SAMPLES_PASSED_CONSERVATIVE) {
|
||||||
if (const auto endOcclusionQuery = MG_Backend::gBackendFunctionsTable.GL.EndOcclusionQuery;
|
if (const auto endOcclusionQuery = MG_Backend::gBackendFunctionsTable.GL.EndOcclusionQuery;
|
||||||
endOcclusionQuery && queryObject->backendHandle) {
|
endOcclusionQuery && queryObject->backendHandle) {
|
||||||
|
MGP_FILL(EndOcclusionQuery);
|
||||||
endOcclusionQuery(queryObject->backendHandle);
|
endOcclusionQuery(queryObject->backendHandle);
|
||||||
}
|
}
|
||||||
queryObject->active = false;
|
queryObject->active = false;
|
||||||
@@ -441,6 +450,7 @@ namespace MobileGL::MG_Impl::GLImpl {
|
|||||||
}
|
}
|
||||||
if (queryObject->backendHandle) {
|
if (queryObject->backendHandle) {
|
||||||
if (const auto deleteBackendQuery = MG_Backend::gBackendFunctionsTable.GL.DeleteBackendQuery) {
|
if (const auto deleteBackendQuery = MG_Backend::gBackendFunctionsTable.GL.DeleteBackendQuery) {
|
||||||
|
MGP_FILL(DeleteBackendQuery);
|
||||||
deleteBackendQuery(queryObject->backendHandle);
|
deleteBackendQuery(queryObject->backendHandle);
|
||||||
}
|
}
|
||||||
queryObject->backendHandle = nullptr;
|
queryObject->backendHandle = nullptr;
|
||||||
@@ -519,6 +529,7 @@ namespace MobileGL::MG_Impl::GLImpl {
|
|||||||
// Prefer real GPU transform-feedback queries (exact with geometry shaders);
|
// Prefer real GPU transform-feedback queries (exact with geometry shaders);
|
||||||
// the CPU accounting delta stays as the fallback when the backend lacks them.
|
// the CPU accounting delta stays as the fallback when the backend lacks them.
|
||||||
const auto beginXfbPrimitivesQuery = MG_Backend::gBackendFunctionsTable.GL.BeginXfbPrimitivesQuery;
|
const auto beginXfbPrimitivesQuery = MG_Backend::gBackendFunctionsTable.GL.BeginXfbPrimitivesQuery;
|
||||||
|
MGP_FILL(BeginXfbPrimitivesQuery);
|
||||||
queryObject->backendHandle =
|
queryObject->backendHandle =
|
||||||
beginXfbPrimitivesQuery ? beginXfbPrimitivesQuery(target == GL_PRIMITIVES_GENERATED) : nullptr;
|
beginXfbPrimitivesQuery ? beginXfbPrimitivesQuery(target == GL_PRIMITIVES_GENERATED) : nullptr;
|
||||||
queryObject->counterSnapshot = TransformFeedbackCounterForTarget(target);
|
queryObject->counterSnapshot = TransformFeedbackCounterForTarget(target);
|
||||||
@@ -527,9 +538,11 @@ namespace MobileGL::MG_Impl::GLImpl {
|
|||||||
queryObject->geometryCaptureDrawSnapshot =
|
queryObject->geometryCaptureDrawSnapshot =
|
||||||
MG_State::pGLContext->GetTransformFeedbackGeometryCaptureDraws();
|
MG_State::pGLContext->GetTransformFeedbackGeometryCaptureDraws();
|
||||||
} else if (isOcclusionQuery) {
|
} else if (isOcclusionQuery) {
|
||||||
|
MGP_FILL(BeginOcclusionQuery);
|
||||||
queryObject->backendHandle = MG_Backend::gBackendFunctionsTable.GL.BeginOcclusionQuery();
|
queryObject->backendHandle = MG_Backend::gBackendFunctionsTable.GL.BeginOcclusionQuery();
|
||||||
} else {
|
} else {
|
||||||
const auto beginTimeElapsedQuery = MG_Backend::gBackendFunctionsTable.GL.BeginTimeElapsedQuery;
|
const auto beginTimeElapsedQuery = MG_Backend::gBackendFunctionsTable.GL.BeginTimeElapsedQuery;
|
||||||
|
MGP_FILL(BeginTimeElapsedQuery);
|
||||||
queryObject->backendHandle =
|
queryObject->backendHandle =
|
||||||
(!TimerQueryDisabled() && beginTimeElapsedQuery) ? beginTimeElapsedQuery() : nullptr;
|
(!TimerQueryDisabled() && beginTimeElapsedQuery) ? beginTimeElapsedQuery() : nullptr;
|
||||||
}
|
}
|
||||||
@@ -579,6 +592,7 @@ namespace MobileGL::MG_Impl::GLImpl {
|
|||||||
if (isTransformFeedbackQuery) {
|
if (isTransformFeedbackQuery) {
|
||||||
if (queryObject->backendHandle) {
|
if (queryObject->backendHandle) {
|
||||||
if (const auto endXfbPrimitivesQuery = MG_Backend::gBackendFunctionsTable.GL.EndXfbPrimitivesQuery) {
|
if (const auto endXfbPrimitivesQuery = MG_Backend::gBackendFunctionsTable.GL.EndXfbPrimitivesQuery) {
|
||||||
|
MGP_FILL(EndXfbPrimitivesQuery);
|
||||||
endXfbPrimitivesQuery(queryObject->backendHandle);
|
endXfbPrimitivesQuery(queryObject->backendHandle);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -588,6 +602,7 @@ namespace MobileGL::MG_Impl::GLImpl {
|
|||||||
if (!queryObject->backendHandle || PrefersCpuTransformFeedbackResult(queryObject)) {
|
if (!queryObject->backendHandle || PrefersCpuTransformFeedbackResult(queryObject)) {
|
||||||
if (queryObject->backendHandle) {
|
if (queryObject->backendHandle) {
|
||||||
if (const auto deleteBackendQuery = MG_Backend::gBackendFunctionsTable.GL.DeleteBackendQuery) {
|
if (const auto deleteBackendQuery = MG_Backend::gBackendFunctionsTable.GL.DeleteBackendQuery) {
|
||||||
|
MGP_FILL(DeleteBackendQuery);
|
||||||
deleteBackendQuery(queryObject->backendHandle);
|
deleteBackendQuery(queryObject->backendHandle);
|
||||||
}
|
}
|
||||||
queryObject->backendHandle = nullptr;
|
queryObject->backendHandle = nullptr;
|
||||||
@@ -604,6 +619,7 @@ namespace MobileGL::MG_Impl::GLImpl {
|
|||||||
if (isOcclusionQuery) {
|
if (isOcclusionQuery) {
|
||||||
if (const auto endOcclusionQuery = MG_Backend::gBackendFunctionsTable.GL.EndOcclusionQuery;
|
if (const auto endOcclusionQuery = MG_Backend::gBackendFunctionsTable.GL.EndOcclusionQuery;
|
||||||
endOcclusionQuery && queryObject->backendHandle) {
|
endOcclusionQuery && queryObject->backendHandle) {
|
||||||
|
MGP_FILL(EndOcclusionQuery);
|
||||||
endOcclusionQuery(queryObject->backendHandle);
|
endOcclusionQuery(queryObject->backendHandle);
|
||||||
}
|
}
|
||||||
queryObject->active = false;
|
queryObject->active = false;
|
||||||
@@ -642,6 +658,7 @@ namespace MobileGL::MG_Impl::GLImpl {
|
|||||||
ResetQueryObjectLocked(queryObject); // discard any previous result
|
ResetQueryObjectLocked(queryObject); // discard any previous result
|
||||||
queryObject->target = target;
|
queryObject->target = target;
|
||||||
const auto queryCounterTimestamp = MG_Backend::gBackendFunctionsTable.GL.QueryCounterTimestamp;
|
const auto queryCounterTimestamp = MG_Backend::gBackendFunctionsTable.GL.QueryCounterTimestamp;
|
||||||
|
MGP_FILL(QueryCounterTimestamp);
|
||||||
queryObject->backendHandle =
|
queryObject->backendHandle =
|
||||||
(!TimerQueryDisabled() && queryCounterTimestamp) ? queryCounterTimestamp() : nullptr;
|
(!TimerQueryDisabled() && queryCounterTimestamp) ? queryCounterTimestamp() : nullptr;
|
||||||
queryObject->ended = true;
|
queryObject->ended = true;
|
||||||
@@ -771,6 +788,7 @@ namespace MobileGL::MG_Impl::GLImpl {
|
|||||||
}
|
}
|
||||||
const Bool timerTarget = target == GL_TIME_ELAPSED || target == GL_TIMESTAMP;
|
const Bool timerTarget = target == GL_TIME_ELAPSED || target == GL_TIMESTAMP;
|
||||||
const auto isTimerQuerySupported = MG_Backend::gBackendFunctionsTable.GL.IsTimerQuerySupported;
|
const auto isTimerQuerySupported = MG_Backend::gBackendFunctionsTable.GL.IsTimerQuerySupported;
|
||||||
|
MGP_FILL(IsTimerQuerySupported);
|
||||||
const Bool supported =
|
const Bool supported =
|
||||||
timerTarget && !TimerQueryDisabled() && isTimerQuerySupported && isTimerQuerySupported();
|
timerTarget && !TimerQueryDisabled() && isTimerQuerySupported && isTimerQuerySupported();
|
||||||
*params = supported ? 64 : 0;
|
*params = supported ? 64 : 0;
|
||||||
@@ -912,6 +930,7 @@ namespace MobileGL::MG_Impl::GLImpl {
|
|||||||
const auto deleteBackendQuery = MG_Backend::gBackendFunctionsTable.GL.DeleteBackendQuery;
|
const auto deleteBackendQuery = MG_Backend::gBackendFunctionsTable.GL.DeleteBackendQuery;
|
||||||
for (const auto& [_, queryObject] : orphans) {
|
for (const auto& [_, queryObject] : orphans) {
|
||||||
if (deleteBackendQuery && queryObject->backendHandle) {
|
if (deleteBackendQuery && queryObject->backendHandle) {
|
||||||
|
MGP_FILL(DeleteBackendQuery);
|
||||||
deleteBackendQuery(queryObject->backendHandle);
|
deleteBackendQuery(queryObject->backendHandle);
|
||||||
}
|
}
|
||||||
delete queryObject;
|
delete queryObject;
|
||||||
|
|||||||
@@ -9,6 +9,7 @@
|
|||||||
#include "GL_Sync.h"
|
#include "GL_Sync.h"
|
||||||
#include <MG_Backend/BackendObjects.h>
|
#include <MG_Backend/BackendObjects.h>
|
||||||
#include <MG_State/GLState/Core.h>
|
#include <MG_State/GLState/Core.h>
|
||||||
|
#include <MG_Impl/Pipe/PipeFill.h>
|
||||||
|
|
||||||
namespace MobileGL::MG_Impl::GLImpl {
|
namespace MobileGL::MG_Impl::GLImpl {
|
||||||
namespace {
|
namespace {
|
||||||
@@ -56,6 +57,7 @@ namespace MobileGL::MG_Impl::GLImpl {
|
|||||||
syncObject->condition = condition;
|
syncObject->condition = condition;
|
||||||
syncObject->flags = flags;
|
syncObject->flags = flags;
|
||||||
if (const auto backendFenceSync = MG_Backend::gBackendFunctionsTable.GL.FenceSync) {
|
if (const auto backendFenceSync = MG_Backend::gBackendFunctionsTable.GL.FenceSync) {
|
||||||
|
MGP_FILL(FenceSync);
|
||||||
syncObject->backendHandle = backendFenceSync();
|
syncObject->backendHandle = backendFenceSync();
|
||||||
}
|
}
|
||||||
const GLsync handle = reinterpret_cast<GLsync>(syncObject);
|
const GLsync handle = reinterpret_cast<GLsync>(syncObject);
|
||||||
@@ -94,6 +96,7 @@ namespace MobileGL::MG_Impl::GLImpl {
|
|||||||
if (!backendClientWaitSync || !syncObject->backendHandle) {
|
if (!backendClientWaitSync || !syncObject->backendHandle) {
|
||||||
return GL_ALREADY_SIGNALED; // legacy always-signaled fallback
|
return GL_ALREADY_SIGNALED; // legacy always-signaled fallback
|
||||||
}
|
}
|
||||||
|
MGP_FILL(ClientWaitSync);
|
||||||
return backendClientWaitSync(syncObject->backendHandle, flags, timeout);
|
return backendClientWaitSync(syncObject->backendHandle, flags, timeout);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -119,6 +122,7 @@ namespace MobileGL::MG_Impl::GLImpl {
|
|||||||
}
|
}
|
||||||
const auto backendWaitSync = MG_Backend::gBackendFunctionsTable.GL.WaitSync;
|
const auto backendWaitSync = MG_Backend::gBackendFunctionsTable.GL.WaitSync;
|
||||||
if (backendWaitSync && syncObject->backendHandle) {
|
if (backendWaitSync && syncObject->backendHandle) {
|
||||||
|
MGP_FILL(WaitSync);
|
||||||
backendWaitSync(syncObject->backendHandle, flags, timeout);
|
backendWaitSync(syncObject->backendHandle, flags, timeout);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -139,6 +143,7 @@ namespace MobileGL::MG_Impl::GLImpl {
|
|||||||
}
|
}
|
||||||
const auto backendDeleteSync = MG_Backend::gBackendFunctionsTable.GL.DeleteSync;
|
const auto backendDeleteSync = MG_Backend::gBackendFunctionsTable.GL.DeleteSync;
|
||||||
if (backendDeleteSync && syncObject->backendHandle) {
|
if (backendDeleteSync && syncObject->backendHandle) {
|
||||||
|
MGP_FILL(DeleteSync);
|
||||||
backendDeleteSync(syncObject->backendHandle);
|
backendDeleteSync(syncObject->backendHandle);
|
||||||
}
|
}
|
||||||
delete syncObject;
|
delete syncObject;
|
||||||
@@ -174,6 +179,7 @@ namespace MobileGL::MG_Impl::GLImpl {
|
|||||||
break;
|
break;
|
||||||
case GL_SYNC_STATUS: {
|
case GL_SYNC_STATUS: {
|
||||||
const auto backendGetSyncStatus = MG_Backend::gBackendFunctionsTable.GL.GetSyncStatus;
|
const auto backendGetSyncStatus = MG_Backend::gBackendFunctionsTable.GL.GetSyncStatus;
|
||||||
|
MGP_FILL(GetSyncStatus);
|
||||||
const Bool signaled = !backendGetSyncStatus || !syncObject->backendHandle ||
|
const Bool signaled = !backendGetSyncStatus || !syncObject->backendHandle ||
|
||||||
backendGetSyncStatus(syncObject->backendHandle);
|
backendGetSyncStatus(syncObject->backendHandle);
|
||||||
value = signaled ? GL_SIGNALED : GL_UNSIGNALED;
|
value = signaled ? GL_SIGNALED : GL_UNSIGNALED;
|
||||||
@@ -226,6 +232,7 @@ namespace MobileGL::MG_Impl::GLImpl {
|
|||||||
// the function table itself is cleared.
|
// the function table itself is cleared.
|
||||||
const auto backendDeleteSync = MG_Backend::gBackendFunctionsTable.GL.DeleteSync;
|
const auto backendDeleteSync = MG_Backend::gBackendFunctionsTable.GL.DeleteSync;
|
||||||
for (const auto& [_, syncObject] : orphans) {
|
for (const auto& [_, syncObject] : orphans) {
|
||||||
|
MGP_FILL(DeleteSync);
|
||||||
if (backendDeleteSync && syncObject->backendHandle) {
|
if (backendDeleteSync && syncObject->backendHandle) {
|
||||||
backendDeleteSync(syncObject->backendHandle);
|
backendDeleteSync(syncObject->backendHandle);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -30,6 +30,7 @@
|
|||||||
#include <MG_Impl/GLImpl/Sampler/Validators.h>
|
#include <MG_Impl/GLImpl/Sampler/Validators.h>
|
||||||
#include <MG_Util/Math/FixedPointConversion.h>
|
#include <MG_Util/Math/FixedPointConversion.h>
|
||||||
#include <MG_State/GLState/TextureState/TextureObjectBuffer.h>
|
#include <MG_State/GLState/TextureState/TextureObjectBuffer.h>
|
||||||
|
#include <MG_Impl/Pipe/PipeFill.h>
|
||||||
|
|
||||||
namespace MobileGL::MG_Impl::GLImpl {
|
namespace MobileGL::MG_Impl::GLImpl {
|
||||||
static SharedPtr<MG_State::GLState::ITextureObject> nullTextureObject;
|
static SharedPtr<MG_State::GLState::ITextureObject> nullTextureObject;
|
||||||
@@ -1076,6 +1077,7 @@ namespace MobileGL::MG_Impl::GLImpl {
|
|||||||
Vector<Uint8> scratch(static_cast<SizeT>(width) * static_cast<SizeT>(height) * bytesPerTexel);
|
Vector<Uint8> scratch(static_cast<SizeT>(width) * static_cast<SizeT>(height) * bytesPerTexel);
|
||||||
{
|
{
|
||||||
ScopedNeutralPackState neutralPack;
|
ScopedNeutralPackState neutralPack;
|
||||||
|
MGP_FILL(ReadPixels);
|
||||||
MG_Backend::gBackendFunctionsTable.GL.ReadPixels(x, y, width, height, format, type, scratch.data());
|
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) {
|
void GenerateMipmap_Backend(GLenum target) {
|
||||||
|
MGP_FILL(GenerateMipmap);
|
||||||
MG_Backend::gBackendFunctionsTable.GL.GenerateMipmap(target);
|
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,
|
void CopyTexSubImage2D_Backend(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y,
|
||||||
GLsizei width, GLsizei height) {
|
GLsizei width, GLsizei height) {
|
||||||
|
MGP_FILL(CopyTexSubImage2D);
|
||||||
MG_Backend::gBackendFunctionsTable.GL.CopyTexSubImage2D(target, level, xoffset, yoffset, x, y, width, height);
|
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."));
|
"Backend does not support image-to-image copies."));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
MGP_FILL(CopyImageSubData);
|
||||||
copyImageSubData(src, srcTarget, srcLevel, srcX, srcY, srcZ, dst, dstTarget, dstLevel, dstX,
|
copyImageSubData(src, srcTarget, srcLevel, srcX, srcY, srcZ, dst, dstTarget, dstLevel, dstX,
|
||||||
dstY, dstZ, srcWidth, srcHeight, srcDepth);
|
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,
|
void CopyTexImage2D_Backend(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width,
|
||||||
GLsizei height, GLint border) {
|
GLsizei height, GLint border) {
|
||||||
|
MGP_FILL(CopyTexImage2D);
|
||||||
MG_Backend::gBackendFunctionsTable.GL.CopyTexImage2D(target, level, internalformat, x, y, width, height,
|
MG_Backend::gBackendFunctionsTable.GL.CopyTexImage2D(target, level, internalformat, x, y, width, height,
|
||||||
border);
|
border);
|
||||||
}
|
}
|
||||||
@@ -5071,6 +5077,7 @@ namespace MobileGL::MG_Impl::GLImpl {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void GetTexImage_Backend(GLenum target, GLint level, GLenum format, GLenum type, GLvoid* pixels) {
|
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);
|
MG_Backend::gBackendFunctionsTable.GL.GetTexImage(target, level, format, type, pixels);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -6453,6 +6460,7 @@ namespace MobileGL::MG_Impl::GLImpl {
|
|||||||
if (MG_Backend::pActiveBackendObject != nullptr &&
|
if (MG_Backend::pActiveBackendObject != nullptr &&
|
||||||
MG_Backend::pActiveBackendObject->GetBackendType() == BackendType::DirectVulkan &&
|
MG_Backend::pActiveBackendObject->GetBackendType() == BackendType::DirectVulkan &&
|
||||||
MG_Backend::gBackendFunctionsTable.GL.GetTextureImage != nullptr) {
|
MG_Backend::gBackendFunctionsTable.GL.GetTextureImage != nullptr) {
|
||||||
|
MGP_FILL(GetTextureImage);
|
||||||
MG_Backend::gBackendFunctionsTable.GL.GetTextureImage(textureObject, uploadTarget, level, format, type,
|
MG_Backend::gBackendFunctionsTable.GL.GetTextureImage(textureObject, uploadTarget, level, format, type,
|
||||||
bufSize, pixels);
|
bufSize, pixels);
|
||||||
return;
|
return;
|
||||||
@@ -6657,6 +6665,7 @@ namespace MobileGL::MG_Impl::GLImpl {
|
|||||||
MG_State::pGLContext->GetImageTextureBinding(static_cast<Int>(unit))
|
MG_State::pGLContext->GetImageTextureBinding(static_cast<Int>(unit))
|
||||||
.Bind(textureObject, level, layered, layer, access, format);
|
.Bind(textureObject, level, layered, layer, access, format);
|
||||||
MG_State::pGLContext->NoteTextureUnitTouched(static_cast<Int>(unit));
|
MG_State::pGLContext->NoteTextureUnitTouched(static_cast<Int>(unit));
|
||||||
|
MGP_FILL(BindImageTexture);
|
||||||
bindImageTexture(unit, texture, level, layered, layer, access, format);
|
bindImageTexture(unit, texture, level, layered, layer, access, format);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user