mirror of
https://github.com/MobileGL-Dev/MobileGL
synced 2026-09-17 00:28:31 +09:00
304 lines
16 KiB
C++
304 lines
16 KiB
C++
// MobileGL - MobileGL/MG_Pipe/generated/PipeFieldOwnership.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
|
|
|
|
// TABLE 2: PipeInputs field ownership (CONTRACT-P5.md section 3, R-7).
|
|
//
|
|
// GENERATED by scripts/gen_pipe_field_ownership.py from Coverage.def, FieldOwnership.def and
|
|
// MG_Impl/Pipe/PipeFill.cpp - DO NOT EDIT. Regenerate with
|
|
// `python3 scripts/gen_pipe_field_ownership.py`; CI runs it and diffs the result.
|
|
//
|
|
// Included from MG_Backend/MGPipe/PipeInputs.h inside namespace MobileGL::MG_Pipe, which is
|
|
// the one header that both the poison check and the server's verb stamp already see. It is
|
|
// NOT included from MG_Pipe/MGPipe.h with the other seven generated files, on purpose: that
|
|
// header is in the PULL build's include closure and G1 admits no symbol motion there.
|
|
|
|
|
|
// The four classes. kUnclassified exists so the static_assert below has something to refuse;
|
|
// the generator never emits it, which is what makes "a field in no class fails the build"
|
|
// true at two independent points rather than one.
|
|
enum class MGPipeFieldOwnership : Uint8 {
|
|
kUnclassified = 0,
|
|
kRecordSupplied, // a pushed record supplies the WHOLE field
|
|
kApplierDerived, // the applier writes it out of records it already applies
|
|
kBarrierPulled, // P5's debt: read out of the client's residual fill under the verb barrier
|
|
kFatal, // no carrier and the reduced path never reads it
|
|
};
|
|
|
|
inline constexpr const char* kMGPipeFieldOwnershipNames[] = {
|
|
"UNCLASSIFIED", "RECORD-SUPPLIED", "APPLIER-DERIVED", "BARRIER-PULLED", "FATAL",
|
|
};
|
|
|
|
inline constexpr MGPipeFieldOwnership kMGPipeFieldOwnership[kMGPipeInputFieldCount] = {
|
|
MGPipeFieldOwnership::kBarrierPulled, // GetActiveTextureUnit
|
|
MGPipeFieldOwnership::kRecordSupplied, // GetBlendColor
|
|
MGPipeFieldOwnership::kRecordSupplied, // GetBlendEquationIndexed
|
|
MGPipeFieldOwnership::kRecordSupplied, // GetBlendFuncIndexed
|
|
MGPipeFieldOwnership::kFatal, // GetBoundTransformFeedbackName
|
|
MGPipeFieldOwnership::kBarrierPulled, // GetBoundVertexArray
|
|
MGPipeFieldOwnership::kBarrierPulled, // GetBufferBindingSlot
|
|
MGPipeFieldOwnership::kBarrierPulled, // GetBufferBindingPoint
|
|
MGPipeFieldOwnership::kBarrierPulled, // GetBufferBindingPointCount
|
|
MGPipeFieldOwnership::kBarrierPulled, // GetTouchedBufferBindingPointCount
|
|
MGPipeFieldOwnership::kRecordSupplied, // GetClampReadColor
|
|
MGPipeFieldOwnership::kRecordSupplied, // GetClearColor
|
|
MGPipeFieldOwnership::kRecordSupplied, // GetClearDepth
|
|
MGPipeFieldOwnership::kRecordSupplied, // GetClearStencil
|
|
MGPipeFieldOwnership::kRecordSupplied, // GetColorMaskIndexed
|
|
MGPipeFieldOwnership::kRecordSupplied, // GetCullFaceMode
|
|
MGPipeFieldOwnership::kBarrierPulled, // GetCurrentVertexAttribute
|
|
MGPipeFieldOwnership::kRecordSupplied, // GetDepthFunc
|
|
MGPipeFieldOwnership::kRecordSupplied, // GetDepthMask
|
|
MGPipeFieldOwnership::kRecordSupplied, // GetDepthRangeIndexed
|
|
MGPipeFieldOwnership::kBarrierPulled, // GetFramebufferBindingSlot
|
|
MGPipeFieldOwnership::kBarrierPulled, // GetImageTextureBinding
|
|
MGPipeFieldOwnership::kRecordSupplied, // GetLineWidth
|
|
MGPipeFieldOwnership::kRecordSupplied, // GetLogicOp
|
|
MGPipeFieldOwnership::kBarrierPulled, // GetMaxTouchedTextureUnit
|
|
MGPipeFieldOwnership::kRecordSupplied, // GetMinSampleShadingValue
|
|
MGPipeFieldOwnership::kRecordSupplied, // GetPatchDefaultInnerLevel
|
|
MGPipeFieldOwnership::kRecordSupplied, // GetPatchDefaultOuterLevel
|
|
MGPipeFieldOwnership::kRecordSupplied, // GetPatchVertices
|
|
MGPipeFieldOwnership::kRecordSupplied, // GetPipelineStateVersion
|
|
MGPipeFieldOwnership::kApplierDerived, // GetPixelStoreParameters
|
|
MGPipeFieldOwnership::kRecordSupplied, // GetPolygonModeFront
|
|
MGPipeFieldOwnership::kRecordSupplied, // GetPolygonOffsetFactor
|
|
MGPipeFieldOwnership::kRecordSupplied, // GetPolygonOffsetUnits
|
|
MGPipeFieldOwnership::kRecordSupplied, // GetPrimitiveRestartIndex
|
|
MGPipeFieldOwnership::kFatal, // GetProgramForDispatch
|
|
MGPipeFieldOwnership::kBarrierPulled, // GetProgramForDraw
|
|
MGPipeFieldOwnership::kBarrierPulled, // GetProgramObject
|
|
MGPipeFieldOwnership::kRecordSupplied, // GetProvokingVertexMode
|
|
MGPipeFieldOwnership::kRecordSupplied, // GetRenderStateParameters
|
|
MGPipeFieldOwnership::kRecordSupplied, // GetRenderStateParametersVersion
|
|
MGPipeFieldOwnership::kBarrierPulled, // GetSamplingResolutionGeneration
|
|
MGPipeFieldOwnership::kRecordSupplied, // GetScissorBox
|
|
MGPipeFieldOwnership::kRecordSupplied, // GetStencilState
|
|
MGPipeFieldOwnership::kBarrierPulled, // GetTextureBindGeneration
|
|
MGPipeFieldOwnership::kBarrierPulled, // GetTextureContextId
|
|
MGPipeFieldOwnership::kBarrierPulled, // GetTextureObject
|
|
MGPipeFieldOwnership::kBarrierPulled, // GetTextureUnitObject
|
|
MGPipeFieldOwnership::kBarrierPulled, // GetTransformFeedbackCapturedVertices
|
|
MGPipeFieldOwnership::kBarrierPulled, // GetTransformFeedbackGeneration
|
|
MGPipeFieldOwnership::kFatal, // GetTransformFeedbackPausedPrimitiveCounter
|
|
MGPipeFieldOwnership::kBarrierPulled, // GetTransformFeedbackProgram
|
|
MGPipeFieldOwnership::kRecordSupplied, // GetViewport
|
|
MGPipeFieldOwnership::kRecordSupplied, // GetViewportIndexed
|
|
MGPipeFieldOwnership::kRecordSupplied, // IsCapabilityEnabled
|
|
MGPipeFieldOwnership::kRecordSupplied, // IsCapabilityEnabledIndexed
|
|
MGPipeFieldOwnership::kBarrierPulled, // IsTransformFeedbackActive
|
|
MGPipeFieldOwnership::kBarrierPulled, // IsTransformFeedbackPaused
|
|
MGPipeFieldOwnership::kBarrierPulled, // InvalidateCompileEnv
|
|
MGPipeFieldOwnership::kBarrierPulled, // ValidateProgramName
|
|
MGPipeFieldOwnership::kBarrierPulled, // RecordError
|
|
MGPipeFieldOwnership::kBarrierPulled, // GetBoundTransformFeedbackLifetimeId
|
|
MGPipeFieldOwnership::kBarrierPulled, // HasOpenTransformFeedbackSpan
|
|
};
|
|
|
|
// The ROADMAP phase whose row retires the pull. "-" for every class but BARRIER-PULLED.
|
|
inline constexpr const char* kMGPipeFieldRetiringPhase[kMGPipeInputFieldCount] = {
|
|
"P3b/P4b", // GetActiveTextureUnit
|
|
"-", // GetBlendColor
|
|
"-", // GetBlendEquationIndexed
|
|
"-", // GetBlendFuncIndexed
|
|
"-", // GetBoundTransformFeedbackName
|
|
"P8", // GetBoundVertexArray
|
|
"P8 (indirect), P9 (readback), P13 (transfer)", // GetBufferBindingSlot
|
|
"P3b/P4b, P7", // GetBufferBindingPoint
|
|
"P7/P13", // GetBufferBindingPointCount
|
|
"P3b/P4b", // GetTouchedBufferBindingPointCount
|
|
"-", // GetClampReadColor
|
|
"-", // GetClearColor
|
|
"-", // GetClearDepth
|
|
"-", // GetClearStencil
|
|
"-", // GetColorMaskIndexed
|
|
"-", // GetCullFaceMode
|
|
"P3b/P4b", // GetCurrentVertexAttribute
|
|
"-", // GetDepthFunc
|
|
"-", // GetDepthMask
|
|
"-", // GetDepthRangeIndexed
|
|
"P3b/P4b (Espryt), P7 (Magma)", // GetFramebufferBindingSlot
|
|
"P3b/P4b, P7", // GetImageTextureBinding
|
|
"-", // GetLineWidth
|
|
"-", // GetLogicOp
|
|
"P3b/P4b", // GetMaxTouchedTextureUnit
|
|
"-", // GetMinSampleShadingValue
|
|
"-", // GetPatchDefaultInnerLevel
|
|
"-", // GetPatchDefaultOuterLevel
|
|
"-", // GetPatchVertices
|
|
"-", // GetPipelineStateVersion
|
|
"-", // GetPixelStoreParameters
|
|
"-", // GetPolygonModeFront
|
|
"-", // GetPolygonOffsetFactor
|
|
"-", // GetPolygonOffsetUnits
|
|
"-", // GetPrimitiveRestartIndex
|
|
"-", // GetProgramForDispatch
|
|
"P8 (Espryt), P7 (Magma)", // GetProgramForDraw
|
|
"P9", // GetProgramObject
|
|
"-", // GetProvokingVertexMode
|
|
"-", // GetRenderStateParameters
|
|
"-", // GetRenderStateParametersVersion
|
|
"P3b/P4b", // GetSamplingResolutionGeneration
|
|
"-", // GetScissorBox
|
|
"-", // GetStencilState
|
|
"P3b/P4b", // GetTextureBindGeneration
|
|
"P3b/P4b", // GetTextureContextId
|
|
"P7", // GetTextureObject
|
|
"P3b/P4b, P7", // GetTextureUnitObject
|
|
"P3b/P4b (Espryt), P7 (Magma)", // GetTransformFeedbackCapturedVertices
|
|
"P3b/P4b (Espryt), P7 (Magma)", // GetTransformFeedbackGeneration
|
|
"-", // GetTransformFeedbackPausedPrimitiveCounter
|
|
"P3b/P4b (Espryt), P7 (Magma)", // GetTransformFeedbackProgram
|
|
"-", // GetViewport
|
|
"-", // GetViewportIndexed
|
|
"-", // IsCapabilityEnabled
|
|
"-", // IsCapabilityEnabledIndexed
|
|
"P3b/P4b (Espryt), P7 (Magma)", // IsTransformFeedbackActive
|
|
"P3b/P4b (Espryt), P7 (Magma)", // IsTransformFeedbackPaused
|
|
"P5", // InvalidateCompileEnv
|
|
"P9", // ValidateProgramName
|
|
"P9", // RecordError
|
|
"P3b/P4b (Espryt), P7 (Magma)", // GetBoundTransformFeedbackLifetimeId
|
|
"P7/P9", // HasOpenTransformFeedbackSpan
|
|
};
|
|
|
|
// The seven sticky forwards, which are among the 63 above and need a row of their own:
|
|
// they are the ones that hand the server a raw frontend object or write into the
|
|
// frontend, so the exit gate is structurally blind on them without one.
|
|
inline constexpr SizeT kMGPipeFieldOwnershipForwardCount = 7;
|
|
static_assert(kMGPipeFieldOwnershipForwardCount == kMGPipeInputStickyFieldCount,
|
|
"the forward rows and Coverage.def's sticky set are the same seven");
|
|
inline constexpr MGPipeInputField kMGPipeFieldOwnershipForwardField[kMGPipeFieldOwnershipForwardCount] = {
|
|
MGPipeInputField::GetBufferBindingPointCount,
|
|
MGPipeInputField::GetProgramObject,
|
|
MGPipeInputField::GetTextureObject,
|
|
MGPipeInputField::HasOpenTransformFeedbackSpan,
|
|
MGPipeInputField::ValidateProgramName,
|
|
MGPipeInputField::InvalidateCompileEnv,
|
|
MGPipeInputField::RecordError,
|
|
};
|
|
inline constexpr MGPipeFieldOwnership kMGPipeFieldOwnershipForward[kMGPipeFieldOwnershipForwardCount] = {
|
|
MGPipeFieldOwnership::kBarrierPulled, // GetBufferBindingPointCount
|
|
MGPipeFieldOwnership::kBarrierPulled, // GetProgramObject
|
|
MGPipeFieldOwnership::kBarrierPulled, // GetTextureObject
|
|
MGPipeFieldOwnership::kBarrierPulled, // HasOpenTransformFeedbackSpan
|
|
MGPipeFieldOwnership::kBarrierPulled, // ValidateProgramName
|
|
MGPipeFieldOwnership::kBarrierPulled, // InvalidateCompileEnv
|
|
MGPipeFieldOwnership::kBarrierPulled, // RecordError
|
|
};
|
|
inline constexpr const char* kMGPipeFieldOwnershipForwardMechanism[kMGPipeFieldOwnershipForwardCount] = {
|
|
"a server-side binding-point table", // GetBufferBindingPointCount, retires in P7/P13
|
|
"a client-resolved program handle table (ARCHITECTURE 3.2 explicitly-not-ported)", // GetProgramObject, retires in P9
|
|
"a server-side texture handle table", // GetTextureObject, retires in P7
|
|
"server-side XFB span state", // HasOpenTransformFeedbackSpan, retires in P7/P9
|
|
"a client-resolved program name probe", // ValidateProgramName, retires in P9
|
|
"OnCapsInvalidated - the re-arriving caps snapshot IS the invalidation (R-12)", // InvalidateCompileEnv, retires in P5
|
|
"OnGlError, the ordered reverse-channel error post (R-12); its ordering is P9's", // RecordError, retires in P9
|
|
};
|
|
|
|
// CONTRACT-P5.md section 3: "70 rows, each in exactly one class".
|
|
inline constexpr SizeT kMGPipeFieldOwnershipRowCount =
|
|
kMGPipeInputFieldCount + kMGPipeFieldOwnershipForwardCount;
|
|
static_assert(kMGPipeFieldOwnershipRowCount == 70, "table 2's row count moved");
|
|
|
|
// An ARGUMENT-KEYED narrowing of one field. The field keeps its single row above; this
|
|
// says that one argument value of it belongs to a different class. Coverage.def:62-69 already
|
|
// rules the shape for GetBufferBindingSlot - "THE ROW STAYS ONE ROW ... the field is ONE array
|
|
// that a second row of the same name could only duplicate" - and m_pixelStore[2] is the same
|
|
// shape indexed by its own isUnpack argument.
|
|
struct MGPipeFieldArgumentOwnership {
|
|
MGPipeInputField Field;
|
|
Uint32 Arg0;
|
|
MGPipeFieldOwnership Class;
|
|
};
|
|
inline constexpr SizeT kMGPipeFieldArgumentOwnershipCount = 1;
|
|
inline constexpr MGPipeFieldArgumentOwnership
|
|
kMGPipeFieldArgumentOwnership[kMGPipeFieldArgumentOwnershipCount] = {
|
|
{MGPipeInputField::GetPixelStoreParameters, 1u, MGPipeFieldOwnership::kFatal}, // the unpack half has no carrier AND no backend reader; all six MGB_CTX sites pass false
|
|
};
|
|
|
|
constexpr MGPipeFieldOwnership MGPipeFieldOwnershipOf(MGPipeInputField field) {
|
|
return kMGPipeFieldOwnership[static_cast<SizeT>(field)];
|
|
}
|
|
|
|
// The same answer, narrowed by the accessor's first argument. Every accessor that takes one
|
|
// may call this; only the fields with a row above answer differently from the field's class.
|
|
constexpr MGPipeFieldOwnership MGPipeFieldOwnershipOf(MGPipeInputField field, Uint32 arg0) {
|
|
for (SizeT i = 0; i < kMGPipeFieldArgumentOwnershipCount; ++i) {
|
|
if (kMGPipeFieldArgumentOwnership[i].Field == field &&
|
|
kMGPipeFieldArgumentOwnership[i].Arg0 == arg0) {
|
|
return kMGPipeFieldArgumentOwnership[i].Class;
|
|
}
|
|
}
|
|
return MGPipeFieldOwnershipOf(field);
|
|
}
|
|
|
|
constexpr const char* MGPipeFieldOwnershipName(MGPipeFieldOwnership ownership) {
|
|
return kMGPipeFieldOwnershipNames[static_cast<SizeT>(ownership)];
|
|
}
|
|
|
|
// THE BUILD FAILURE R-7.1 ASKS FOR. The generator refuses to emit an unclassified row, so
|
|
// this can only fire on a hand-edited header - which is exactly the edit the DO NOT EDIT
|
|
// banner cannot prevent on its own.
|
|
constexpr Bool MGPipeEveryFieldIsClassified() {
|
|
for (SizeT i = 0; i < kMGPipeInputFieldCount; ++i) {
|
|
if (kMGPipeFieldOwnership[i] == MGPipeFieldOwnership::kUnclassified) return false;
|
|
}
|
|
for (SizeT i = 0; i < kMGPipeFieldOwnershipForwardCount; ++i) {
|
|
if (kMGPipeFieldOwnershipForward[i] == MGPipeFieldOwnership::kUnclassified) return false;
|
|
}
|
|
return true;
|
|
}
|
|
static_assert(MGPipeEveryFieldIsClassified(),
|
|
"a PipeInputs field is in none of the four ownership classes (CONTRACT-P5 table 2, R-7.1)");
|
|
|
|
// WHERE THE SERVER STAMPS. The wire's op and the fill's verb are different name spaces
|
|
// and do not line up by name (draw_vbo is DrawArrays, blit is BlitFramebuffer), so this is the
|
|
// join. An op with no row is NOT a verb boundary and the applier must not stamp on it.
|
|
//
|
|
// EVERY VERB-SHAPED CALL IS ANSWERED HERE OR EXEMPTED BY NAME, and the generator refuses an
|
|
// omission: a verb-shaped record with no row would apply under the PREVIOUS verb's serial,
|
|
// mask and name, so a field inside that mask would read FRESH while holding the previous
|
|
// verb's value - the one silent failure this table has. The exemptions:
|
|
// Flush not a verb at all: the verb census (BRIEF §12 C-3) found Flush is not a GLFunctionsTable
|
|
// Present FillPoints.def:21 - Present and SetSwapInterval go through BackendObject virtuals and
|
|
// SetSwapInterval the same sentence of FillPoints.def:21, and it is class C besides
|
|
constexpr MGPipeVerb MGPipeVerbForWireOp(MGPWireOp op) {
|
|
switch (op) {
|
|
case MGPWireOp::Clear: return MGPipeVerb::Clear;
|
|
case MGPWireOp::DrawVbo: return MGPipeVerb::DrawArrays;
|
|
case MGPWireOp::ReadPixels: return MGPipeVerb::ReadPixels;
|
|
case MGPWireOp::Blit: return MGPipeVerb::BlitFramebuffer;
|
|
case MGPWireOp::LaunchGrid: return MGPipeVerb::DispatchCompute;
|
|
case MGPWireOp::MemoryBarrier: return MGPipeVerb::MemoryBarrier;
|
|
case MGPWireOp::BeginStreamOutput: return MGPipeVerb::BeginTransformFeedback;
|
|
case MGPWireOp::EndStreamOutput: return MGPipeVerb::EndTransformFeedback;
|
|
case MGPWireOp::PauseStreamOutput: return MGPipeVerb::PauseTransformFeedback;
|
|
case MGPWireOp::ResumeStreamOutput: return MGPipeVerb::ResumeTransformFeedback;
|
|
case MGPWireOp::GenerateMipmap: return MGPipeVerb::GenerateMipmap;
|
|
case MGPWireOp::GetTextureImage: return MGPipeVerb::GetTextureImage;
|
|
case MGPWireOp::ResourceCopyRegion: return MGPipeVerb::CopyImageSubData;
|
|
case MGPWireOp::BindShaderImage: return MGPipeVerb::BindImageTexture;
|
|
case MGPWireOp::PatchParameter: return MGPipeVerb::PatchParameteri;
|
|
case MGPWireOp::BindStreamOutput: return MGPipeVerb::BindTransformFeedback;
|
|
case MGPWireOp::SetStorageBlockBinding: return MGPipeVerb::ShaderStorageBlockBinding;
|
|
case MGPWireOp::CopyFramebufferToTexture: return MGPipeVerb::CopyTexImage2D;
|
|
default:
|
|
return MGPipeVerb::kVerbCount;
|
|
}
|
|
}
|
|
|
|
inline constexpr SizeT kMGPipeVerbBoundaryOpCount = 18;
|
|
inline constexpr SizeT kMGPipeVerbBoundaryExemptCount = 3;
|
|
|
|
// The class sizes, as constants a test can pin without recounting the table.
|
|
inline constexpr SizeT kMGPipeRecordSuppliedFieldCount = 32;
|
|
inline constexpr SizeT kMGPipeApplierDerivedFieldCount = 1;
|
|
inline constexpr SizeT kMGPipeBarrierPulledFieldCount = 27;
|
|
inline constexpr SizeT kMGPipeFatalFieldCount = 3;
|
|
static_assert(kMGPipeRecordSuppliedFieldCount + kMGPipeApplierDerivedFieldCount + kMGPipeBarrierPulledFieldCount + kMGPipeFatalFieldCount == kMGPipeInputFieldCount, "the four class sizes do not partition the field set");
|