mirror of
https://github.com/MobileGL-Dev/MobileGL
synced 2026-09-13 22:58:30 +09:00
- The verify retrace aborted four cases with Fatal{UnmigratedPipeInput,
"IsCapabilityEnabled@GenerateMipmap"} (x3) and "@DispatchCompute" (x1):
Magma materialises a texture's queued clear inside both verbs
(GenerateMipmap -> MaterializePendingClearForTexture,
DispatchCompute -> PrepareStorageImageTextures -> the same), and the clear
pre-compensates its colour against GL_FRAMEBUFFER_SRGB in
VkClearManager::PreCompensateSrgbClearColor. Neither class named the field.
- Audited every class the same way rather than stopping at those two rows. Two
more helper-program draws sit inside verbs whose class did not name what they
read: GenerateMipmap takes GenerateDepthMipmapWithShader for a depth texture
and BlitFramebuffer takes TryBlitToDefaultFramebufferWithShader for the
default framebuffer. Both bind their helper's descriptors through
BindProgramUniformBuffers, whose sampler resolver reads the draw framebuffer
for its feedback-loop check and whose buffer-block resolvers read the frontend
binding points; the blit additionally sets the dynamic viewport through
ApplyGLViewportState -> ComputeGLViewport and picks its pipeline's provoking
vertex through GetOrCreateBlitPipeline -> SelectProvokingVertexMode.
- kTextureOp gains IsCapabilityEnabled, GetFramebufferBindingSlot and
GetBufferBindingPoint; kDispatch gains IsCapabilityEnabled; kBlitOrCopy gains
GetViewportIndexed, GetDepthRangeIndexed, GetProvokingVertexMode and
GetBufferBindingPoint. Every row carries the path it was derived from.
- Also unfolds the kReadback transform-feedback rows 9087f133 landed on one
1200-column line back into the file's one-row-per-line shape; no row changes.
301 lines
10 KiB
C++
301 lines
10 KiB
C++
// MobileGL - MobileGL/MG_Pipe/generated/PipeFillPoints.inc
|
|
// 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
|
|
|
|
// G5b: the verb enum, the verb classes and their may-read field masks.
|
|
//
|
|
// GENERATED by scripts/gen_pipe.py from FillPoints.def, Coverage.def and MG_Backend/BackendObject.h - DO NOT EDIT.
|
|
// Regenerate with `python3 scripts/gen_pipe.py`; CI runs it and diffs the result.
|
|
// This file is included from MG_Pipe/MGPipe.h inside namespace MobileGL::MG_Pipe.
|
|
|
|
// One verb per function-pointer member of MG_Backend::GLFunctionsTable, in declaration
|
|
// order, so the enum IS the table's member list. MG_Impl spells MGP_FILL(Verb) before every
|
|
// call through the table; MGPipeFillForVerb fills exactly the fields of the verb's class
|
|
// (plus the sticky fields, OR'ed into every mask) and stamps them with the new serial. A
|
|
// read of any other field is Fatal{UnmigratedPipeInput, "Field@Verb"} in a poison build.
|
|
|
|
enum class MGPipeVerb : Uint8 {
|
|
DrawArrays,
|
|
DrawElements,
|
|
DrawElementsBaseVertex,
|
|
MultiDrawArrays,
|
|
MultiDrawElements,
|
|
MultiDrawElementsBaseVertex,
|
|
MultiDrawElementsIndirect,
|
|
MultiDrawArraysIndirect,
|
|
MultiDrawElementsIndirectCount,
|
|
MultiDrawArraysIndirectCount,
|
|
DrawRangeElementsBaseVertex,
|
|
DrawRangeElements,
|
|
DrawElementsInstancedBaseVertexBaseInstance,
|
|
DrawElementsInstancedBaseVertex,
|
|
DrawElementsInstancedBaseInstance,
|
|
DrawElementsInstanced,
|
|
DrawArraysInstancedBaseInstance,
|
|
DrawArraysInstanced,
|
|
DrawElementsIndirect,
|
|
DrawArraysIndirect,
|
|
Clear,
|
|
ClearBufferfi,
|
|
ClearBufferfv,
|
|
ClearBufferuiv,
|
|
ClearBufferiv,
|
|
ClearNamedFramebufferfv,
|
|
ClearNamedFramebufferfi,
|
|
ClearNamedFramebufferiv,
|
|
ClearNamedFramebufferuiv,
|
|
BlitFramebuffer,
|
|
BlitNamedFramebuffer,
|
|
CopyTexImage2D,
|
|
CopyTexSubImage2D,
|
|
CopyImageSubData,
|
|
GenerateMipmap,
|
|
ReadPixels,
|
|
GetTexImage,
|
|
GetTextureImage,
|
|
DispatchCompute,
|
|
DispatchComputeIndirect,
|
|
MemoryBarrier,
|
|
MemoryBarrierByRegion,
|
|
BindImageTexture,
|
|
GetIntegeri_v,
|
|
ShaderStorageBlockBinding,
|
|
FenceSync,
|
|
ClientWaitSync,
|
|
WaitSync,
|
|
DeleteSync,
|
|
GetSyncStatus,
|
|
IsTimerQuerySupported,
|
|
BeginTimeElapsedQuery,
|
|
EndTimeElapsedQuery,
|
|
QueryCounterTimestamp,
|
|
IsQueryResultAvailable,
|
|
GetQueryResult64,
|
|
DeleteBackendQuery,
|
|
BeginOcclusionQuery,
|
|
EndOcclusionQuery,
|
|
BeginXfbPrimitivesQuery,
|
|
EndXfbPrimitivesQuery,
|
|
PatchParameteri,
|
|
BeginTransformFeedback,
|
|
EndTransformFeedback,
|
|
PauseTransformFeedback,
|
|
ResumeTransformFeedback,
|
|
BindTransformFeedback,
|
|
DeleteTransformFeedback,
|
|
GetGpuTimestampNs,
|
|
kVerbCount,
|
|
};
|
|
|
|
inline constexpr SizeT kMGPipeVerbCount = static_cast<SizeT>(MGPipeVerb::kVerbCount);
|
|
static_assert(kMGPipeVerbCount == 69, "the GLFunctionsTable verb set moved");
|
|
|
|
inline constexpr const char* kMGPipeVerbNames[kMGPipeVerbCount] = {
|
|
"DrawArrays",
|
|
"DrawElements",
|
|
"DrawElementsBaseVertex",
|
|
"MultiDrawArrays",
|
|
"MultiDrawElements",
|
|
"MultiDrawElementsBaseVertex",
|
|
"MultiDrawElementsIndirect",
|
|
"MultiDrawArraysIndirect",
|
|
"MultiDrawElementsIndirectCount",
|
|
"MultiDrawArraysIndirectCount",
|
|
"DrawRangeElementsBaseVertex",
|
|
"DrawRangeElements",
|
|
"DrawElementsInstancedBaseVertexBaseInstance",
|
|
"DrawElementsInstancedBaseVertex",
|
|
"DrawElementsInstancedBaseInstance",
|
|
"DrawElementsInstanced",
|
|
"DrawArraysInstancedBaseInstance",
|
|
"DrawArraysInstanced",
|
|
"DrawElementsIndirect",
|
|
"DrawArraysIndirect",
|
|
"Clear",
|
|
"ClearBufferfi",
|
|
"ClearBufferfv",
|
|
"ClearBufferuiv",
|
|
"ClearBufferiv",
|
|
"ClearNamedFramebufferfv",
|
|
"ClearNamedFramebufferfi",
|
|
"ClearNamedFramebufferiv",
|
|
"ClearNamedFramebufferuiv",
|
|
"BlitFramebuffer",
|
|
"BlitNamedFramebuffer",
|
|
"CopyTexImage2D",
|
|
"CopyTexSubImage2D",
|
|
"CopyImageSubData",
|
|
"GenerateMipmap",
|
|
"ReadPixels",
|
|
"GetTexImage",
|
|
"GetTextureImage",
|
|
"DispatchCompute",
|
|
"DispatchComputeIndirect",
|
|
"MemoryBarrier",
|
|
"MemoryBarrierByRegion",
|
|
"BindImageTexture",
|
|
"GetIntegeri_v",
|
|
"ShaderStorageBlockBinding",
|
|
"FenceSync",
|
|
"ClientWaitSync",
|
|
"WaitSync",
|
|
"DeleteSync",
|
|
"GetSyncStatus",
|
|
"IsTimerQuerySupported",
|
|
"BeginTimeElapsedQuery",
|
|
"EndTimeElapsedQuery",
|
|
"QueryCounterTimestamp",
|
|
"IsQueryResultAvailable",
|
|
"GetQueryResult64",
|
|
"DeleteBackendQuery",
|
|
"BeginOcclusionQuery",
|
|
"EndOcclusionQuery",
|
|
"BeginXfbPrimitivesQuery",
|
|
"EndXfbPrimitivesQuery",
|
|
"PatchParameteri",
|
|
"BeginTransformFeedback",
|
|
"EndTransformFeedback",
|
|
"PauseTransformFeedback",
|
|
"ResumeTransformFeedback",
|
|
"BindTransformFeedback",
|
|
"DeleteTransformFeedback",
|
|
"GetGpuTimestampNs",
|
|
};
|
|
|
|
enum class MGPipeVerbClass : Uint8 {
|
|
kDraw,
|
|
kDispatch,
|
|
kClear,
|
|
kBlitOrCopy,
|
|
kTextureOp,
|
|
kReadback,
|
|
kXfbSpan,
|
|
kProgramOp,
|
|
kQuery,
|
|
kClassCount,
|
|
};
|
|
|
|
inline constexpr SizeT kMGPipeVerbClassCount = static_cast<SizeT>(MGPipeVerbClass::kClassCount);
|
|
static_assert(kMGPipeVerbClassCount == 9, "the verb class set moved");
|
|
|
|
inline constexpr const char* kMGPipeVerbClassNames[kMGPipeVerbClassCount] = {
|
|
"kDraw",
|
|
"kDispatch",
|
|
"kClear",
|
|
"kBlitOrCopy",
|
|
"kTextureOp",
|
|
"kReadback",
|
|
"kXfbSpan",
|
|
"kProgramOp",
|
|
"kQuery",
|
|
};
|
|
|
|
inline constexpr MGPipeVerbClass kMGPipeVerbClass[kMGPipeVerbCount] = {
|
|
MGPipeVerbClass::kDraw, // DrawArrays
|
|
MGPipeVerbClass::kDraw, // DrawElements
|
|
MGPipeVerbClass::kDraw, // DrawElementsBaseVertex
|
|
MGPipeVerbClass::kDraw, // MultiDrawArrays
|
|
MGPipeVerbClass::kDraw, // MultiDrawElements
|
|
MGPipeVerbClass::kDraw, // MultiDrawElementsBaseVertex
|
|
MGPipeVerbClass::kDraw, // MultiDrawElementsIndirect
|
|
MGPipeVerbClass::kDraw, // MultiDrawArraysIndirect
|
|
MGPipeVerbClass::kDraw, // MultiDrawElementsIndirectCount
|
|
MGPipeVerbClass::kDraw, // MultiDrawArraysIndirectCount
|
|
MGPipeVerbClass::kDraw, // DrawRangeElementsBaseVertex
|
|
MGPipeVerbClass::kDraw, // DrawRangeElements
|
|
MGPipeVerbClass::kDraw, // DrawElementsInstancedBaseVertexBaseInstance
|
|
MGPipeVerbClass::kDraw, // DrawElementsInstancedBaseVertex
|
|
MGPipeVerbClass::kDraw, // DrawElementsInstancedBaseInstance
|
|
MGPipeVerbClass::kDraw, // DrawElementsInstanced
|
|
MGPipeVerbClass::kDraw, // DrawArraysInstancedBaseInstance
|
|
MGPipeVerbClass::kDraw, // DrawArraysInstanced
|
|
MGPipeVerbClass::kDraw, // DrawElementsIndirect
|
|
MGPipeVerbClass::kDraw, // DrawArraysIndirect
|
|
MGPipeVerbClass::kClear, // Clear
|
|
MGPipeVerbClass::kClear, // ClearBufferfi
|
|
MGPipeVerbClass::kClear, // ClearBufferfv
|
|
MGPipeVerbClass::kClear, // ClearBufferuiv
|
|
MGPipeVerbClass::kClear, // ClearBufferiv
|
|
MGPipeVerbClass::kClear, // ClearNamedFramebufferfv
|
|
MGPipeVerbClass::kClear, // ClearNamedFramebufferfi
|
|
MGPipeVerbClass::kClear, // ClearNamedFramebufferiv
|
|
MGPipeVerbClass::kClear, // ClearNamedFramebufferuiv
|
|
MGPipeVerbClass::kBlitOrCopy, // BlitFramebuffer
|
|
MGPipeVerbClass::kBlitOrCopy, // BlitNamedFramebuffer
|
|
MGPipeVerbClass::kBlitOrCopy, // CopyTexImage2D
|
|
MGPipeVerbClass::kBlitOrCopy, // CopyTexSubImage2D
|
|
MGPipeVerbClass::kBlitOrCopy, // CopyImageSubData
|
|
MGPipeVerbClass::kTextureOp, // GenerateMipmap
|
|
MGPipeVerbClass::kReadback, // ReadPixels
|
|
MGPipeVerbClass::kReadback, // GetTexImage
|
|
MGPipeVerbClass::kReadback, // GetTextureImage
|
|
MGPipeVerbClass::kDispatch, // DispatchCompute
|
|
MGPipeVerbClass::kDispatch, // DispatchComputeIndirect
|
|
MGPipeVerbClass::kQuery, // MemoryBarrier
|
|
MGPipeVerbClass::kQuery, // MemoryBarrierByRegion
|
|
MGPipeVerbClass::kTextureOp, // BindImageTexture
|
|
MGPipeVerbClass::kQuery, // GetIntegeri_v
|
|
MGPipeVerbClass::kProgramOp, // ShaderStorageBlockBinding
|
|
MGPipeVerbClass::kQuery, // FenceSync
|
|
MGPipeVerbClass::kQuery, // ClientWaitSync
|
|
MGPipeVerbClass::kQuery, // WaitSync
|
|
MGPipeVerbClass::kQuery, // DeleteSync
|
|
MGPipeVerbClass::kQuery, // GetSyncStatus
|
|
MGPipeVerbClass::kQuery, // IsTimerQuerySupported
|
|
MGPipeVerbClass::kQuery, // BeginTimeElapsedQuery
|
|
MGPipeVerbClass::kQuery, // EndTimeElapsedQuery
|
|
MGPipeVerbClass::kQuery, // QueryCounterTimestamp
|
|
MGPipeVerbClass::kQuery, // IsQueryResultAvailable
|
|
MGPipeVerbClass::kQuery, // GetQueryResult64
|
|
MGPipeVerbClass::kQuery, // DeleteBackendQuery
|
|
MGPipeVerbClass::kQuery, // BeginOcclusionQuery
|
|
MGPipeVerbClass::kQuery, // EndOcclusionQuery
|
|
MGPipeVerbClass::kQuery, // BeginXfbPrimitivesQuery
|
|
MGPipeVerbClass::kQuery, // EndXfbPrimitivesQuery
|
|
MGPipeVerbClass::kQuery, // PatchParameteri
|
|
MGPipeVerbClass::kXfbSpan, // BeginTransformFeedback
|
|
MGPipeVerbClass::kXfbSpan, // EndTransformFeedback
|
|
MGPipeVerbClass::kXfbSpan, // PauseTransformFeedback
|
|
MGPipeVerbClass::kXfbSpan, // ResumeTransformFeedback
|
|
MGPipeVerbClass::kXfbSpan, // BindTransformFeedback
|
|
MGPipeVerbClass::kXfbSpan, // DeleteTransformFeedback
|
|
MGPipeVerbClass::kQuery, // GetGpuTimestampNs
|
|
};
|
|
|
|
// One bit per MGPipeInputField. The 7 sticky fields are OR'ed into every class.
|
|
struct MGPipeFieldMask {
|
|
Uint64 Words[2];
|
|
};
|
|
|
|
inline constexpr Bool MGPipeFieldMaskHas(const MGPipeFieldMask& mask, MGPipeInputField field) {
|
|
const SizeT index = static_cast<SizeT>(field);
|
|
return (mask.Words[index / 64] >> (index % 64)) & 1u;
|
|
}
|
|
|
|
inline constexpr MGPipeFieldMask kMGPipeClassFieldMask[kMGPipeVerbClassCount] = {
|
|
// kDraw: 54 fields (47 own + 7 sticky)
|
|
{{0x7ffbfff7bfffc3eeull, 0x0000000000000000ull}},
|
|
// kDispatch: 22 fields (15 own + 7 sticky)
|
|
{{0x5c40f2281d3003c0ull, 0x0000000000000000ull}},
|
|
// kClear: 25 fields (18 own + 7 sticky)
|
|
{{0x5c50ffa001347900ull, 0x0000000000000000ull}},
|
|
// kBlitOrCopy: 29 fields (22 own + 7 sticky)
|
|
{{0x5f70ffe0013c4181ull, 0x0000000000000000ull}},
|
|
// kTextureOp: 17 fields (10 own + 7 sticky)
|
|
{{0x5c40f22001300181ull, 0x0000000000000000ull}},
|
|
// kReadback: 24 fields (17 own + 7 sticky)
|
|
{{0x5f50f3a041300541ull, 0x0000000000000000ull}},
|
|
// kXfbSpan: 15 fields (8 own + 7 sticky)
|
|
{{0x7f0b402000000380ull, 0x0000000000000000ull}},
|
|
// kProgramOp: 18 fields (11 own + 7 sticky)
|
|
{{0x5c50f3a001300100ull, 0x0000000000000000ull}},
|
|
// kQuery: 8 fields (1 own + 7 sticky)
|
|
{{0x5c04402000000100ull, 0x0000000000000000ull}},
|
|
};
|
|
|
|
static_assert(kMGPipeInputFieldCount <= 2 * 64, "MGPipeFieldMask needs another word");
|