mirror of
https://github.com/MobileGL-Dev/MobileGL
synced 2026-09-17 00:28:31 +09:00
1207 lines
55 KiB
C++
1207 lines
55 KiB
C++
// MobileGL - MobileGL/MG_Pipe/generated/PipeWire.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
|
|
|
|
// G3: wire records, size assertions and the applier's bounds gate.
|
|
//
|
|
// GENERATED by scripts/gen_pipe.py from PipeCalls.def - 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.
|
|
|
|
// Every record is a fixed header plus its payload, padded to the stream's 8-byte
|
|
// granularity. The size assertion is stated as a COMPOSITION so it fires on any padding
|
|
// the compiler inserts between the header and the payload while staying honest about the
|
|
// tail padding the alignment requires.
|
|
//
|
|
// The applier's precondition is checked BEFORE dispatch, on every record, in every build:
|
|
// a record that is shorter than its own type, longer than what is left in the buffer, or
|
|
// not a multiple of 8 is protocol corruption and is fatal. There is no recovery path -
|
|
// silently applying a truncated record is how a corrupt stream becomes a wrong picture.
|
|
//
|
|
// OVERSIZED PAYLOADS ARE CHUNKED, NEVER EMITTED WHOLE (plan section 8.2: G3 has to define
|
|
// the path for a record larger than the segment). The bound is the ring's,
|
|
// RingProducer::MaxRecordBytes() == Capacity()/2, and it is exact rather than
|
|
// conservative: a record has to be placeable at every head offset of an empty ring, the
|
|
// wrap pad in front of it costs up to total-8 bytes, and only a record of at most half the
|
|
// ring survives that at every offset. An emitter holding more than Capacity()/2 bytes of
|
|
// record (a large resource_subdata, a create_shader_state archive) splits it into several
|
|
// records of at most that size; the transport refuses a bigger one outright - nullptr plus
|
|
// an MGLOG_E - rather than let the producer wait on free bytes that can never suffice.
|
|
|
|
struct MGPWireRecHeader {
|
|
Uint16 Op; // MGPWireOp
|
|
// RING FRAMING FLAGS - MG_Remote::Transport::RingRecordFlags - NOT MGPipeCallFlags.
|
|
//
|
|
// This field IS RingRecordHeader::flags (Ring.h): the two structs are the same eight bytes
|
|
// and the ring writes this one. The two flag spaces OVERLAP AND DISAGREE, so stamping
|
|
// MGPipeCallFlagsFor(op) in here is a silent, data-dependent corruption:
|
|
//
|
|
// bit 0 kNeedsAck == kRecNeedsAck agree
|
|
// bit 1 kHasBlob == kRecHasBlob agree
|
|
// bit 2 kVarTail vs kRecPad DISAGREE
|
|
// bit 3 kHostSpan vs kRecBorrowSlot DISAGREE
|
|
// bit 4 kReplySlot vs kRecVarTail DISAGREE
|
|
// bit 5 kOptional vs (nothing) no ring counterpart
|
|
//
|
|
// The first two agreeing is exactly what makes this dangerous: a naive stamp looks right
|
|
// in a debugger. It is not. RingProducer::Reserve masks kRecPad out of a caller's flags,
|
|
// so bit 2 is defended for anyone who goes through it - and ONLY bit 2, and only on that
|
|
// path. A producer that writes this header itself (these are the same eight bytes, so a
|
|
// codec with its own header struct does exactly that) loses even that: Pop treats kRecPad
|
|
// as a WRAP FILLER AND SKIPS THE RECORD. Bits 3 and 4 are undefended everywhere - a
|
|
// stamped kHostSpan tells the consumer this record borrowed a slot into the GPU timeline
|
|
// and must retire late, and a stamped kReplySlot claims a tail that is not there.
|
|
//
|
|
// THE TWO SPACES ARE DISJOINT BY TRANSLATION, NOT SHARED. The encoder maps one to the
|
|
// other explicitly (MG_Remote/Wire/PipeWireCodec.cpp) and nothing else may write this
|
|
// field. The CALL's flags are not on the wire at all and do not need to be: the opcode is,
|
|
// and MGPipeCallFlagsFor(op) recovers them exactly on either side.
|
|
Uint16 Flags;
|
|
Uint32 Size; // bytes of this record including the header and the variable tail
|
|
};
|
|
static_assert(sizeof(MGPWireRecHeader) == 8, "the wire header is 8 bytes");
|
|
static_assert(std::is_trivially_copyable_v<MGPWireRecHeader>);
|
|
|
|
// The opcode is the call's position in PipeCalls.def. Reordering that file is a protocol
|
|
// break; appending to it is not.
|
|
enum class MGPWireOp : Uint16 {
|
|
kInvalid = 0,
|
|
GetCaps = 1,
|
|
ResourceCreate = 2,
|
|
ResourceRespecify = 3,
|
|
ResourceDestroy = 4,
|
|
MapPersistent = 5,
|
|
UnmapPersistent = 6,
|
|
FenceCreate = 7,
|
|
FenceStatus = 8,
|
|
FenceWait = 9,
|
|
FenceDestroy = 10,
|
|
QueryCreate = 11,
|
|
QueryBegin = 12,
|
|
QueryEnd = 13,
|
|
QueryAvailable = 14,
|
|
QueryResult = 15,
|
|
QueryDestroy = 16,
|
|
CreateRenderState = 17,
|
|
BindRenderState = 18,
|
|
DeleteRenderState = 19,
|
|
CreateVertexElements = 20,
|
|
BindVertexElements = 21,
|
|
DeleteVertexElements = 22,
|
|
CreateSamplerState = 23,
|
|
DeleteSamplerState = 24,
|
|
CreateSamplerView = 25,
|
|
DeleteSamplerView = 26,
|
|
CreateShaderState = 27,
|
|
BindShaderState = 28,
|
|
DeleteShaderState = 29,
|
|
SetDynamicState = 30,
|
|
SetFramebufferState = 31,
|
|
SetVertexBuffers = 32,
|
|
SetIndexBuffer = 33,
|
|
SetIndirectBuffers = 34,
|
|
SetSamplerViews = 35,
|
|
BindSamplerStates = 36,
|
|
SetShaderImages = 37,
|
|
SetShaderBuffers = 38,
|
|
SetStreamOutputTargets = 39,
|
|
SetGlobalConstants = 40,
|
|
SetVertexAttribDefaults = 41,
|
|
SetPixelPackState = 42,
|
|
SetPatchState = 43,
|
|
SetDrawProgram = 44,
|
|
SetDispatchProgram = 45,
|
|
SetResidualValueState = 46,
|
|
SetTextureParams = 47,
|
|
ResourceSubData = 48,
|
|
BufferSubDataResident = 49,
|
|
ResourceSubDataComplete = 50,
|
|
ResourceFlushRange = 51,
|
|
ResourceReadback = 52,
|
|
ResourceCopyRegion = 53,
|
|
GenerateMipmap = 54,
|
|
GetTextureImage = 55,
|
|
Blit = 56,
|
|
Clear = 57,
|
|
ReadPixels = 58,
|
|
DrawVbo = 59,
|
|
LaunchGrid = 60,
|
|
MemoryBarrier = 61,
|
|
BeginStreamOutput = 62,
|
|
EndStreamOutput = 63,
|
|
PauseStreamOutput = 64,
|
|
ResumeStreamOutput = 65,
|
|
Flush = 66,
|
|
Present = 67,
|
|
SetSwapInterval = 68,
|
|
QueryTimestamp = 69,
|
|
QueryCounter = 70,
|
|
FenceWaitServer = 71,
|
|
BindShaderImage = 72,
|
|
PatchParameter = 73,
|
|
BindStreamOutput = 74,
|
|
SetStorageBlockBinding = 75,
|
|
CopyFramebufferToTexture = 76,
|
|
kOpCount = 77,
|
|
};
|
|
|
|
// THE FLAGS, EXPORTED ONCE, INDEXED BY OPCODE (P5 R-13.4). MGPWireRecHeader::Flags is
|
|
// documented as "MGPipeCallFlags of the call", and until this table existed nothing
|
|
// generated said what those were: every consumer that needed to know whether a record owns
|
|
// an MGPBlobRef, a variable tail or a reply slot had to hard-code its own copy of
|
|
// PipeCalls.def's fourth column, and six of them were about to. A hard-coded copy is how
|
|
// GetCaps and CreateSamplerState came to carry an MGPBlobRef member with no kHasBlob on
|
|
// their line at all - nothing compared the two, because nothing had both in one place.
|
|
//
|
|
// Index 0 is MGPWireOp::kInvalid and is kNone: the catalogue is 1-based, and an encoder
|
|
// that reads flags for an opcode it never got from the catalogue must see the empty set
|
|
// rather than another call's flags.
|
|
//
|
|
// kHasBlob here means EXACTLY "the payload owns an MGPBlobRef member". Three calls carry
|
|
// bytes without one - resource_respecify, resource_flush_range and map_persistent, whose
|
|
// companion pointers have no carrier - and they are deliberately NOT flagged; MG_Remote's
|
|
// CONTRACT-P5.md table 1 is where those live, because a decoder that trusts kHasBlob has
|
|
// to find a member to read.
|
|
inline constexpr Uint32 kMGPipeCallFlags[static_cast<SizeT>(MGPWireOp::kOpCount)] = {
|
|
/* 0 kInvalid */ static_cast<Uint32>(kNone),
|
|
/* 1 GetCaps */ static_cast<Uint32>(kReplySlot | kHasBlob),
|
|
/* 2 ResourceCreate */ static_cast<Uint32>(kReplySlot),
|
|
/* 3 ResourceRespecify */ static_cast<Uint32>(kNeedsAck | kReplySlot),
|
|
/* 4 ResourceDestroy */ static_cast<Uint32>(kNone),
|
|
/* 5 MapPersistent */ static_cast<Uint32>(kReplySlot | kOptional),
|
|
/* 6 UnmapPersistent */ static_cast<Uint32>(kOptional),
|
|
/* 7 FenceCreate */ static_cast<Uint32>(kNone),
|
|
/* 8 FenceStatus */ static_cast<Uint32>(kReplySlot),
|
|
/* 9 FenceWait */ static_cast<Uint32>(kReplySlot),
|
|
/* 10 FenceDestroy */ static_cast<Uint32>(kNone),
|
|
/* 11 QueryCreate */ static_cast<Uint32>(kNone),
|
|
/* 12 QueryBegin */ static_cast<Uint32>(kNone),
|
|
/* 13 QueryEnd */ static_cast<Uint32>(kNone),
|
|
/* 14 QueryAvailable */ static_cast<Uint32>(kReplySlot),
|
|
/* 15 QueryResult */ static_cast<Uint32>(kReplySlot),
|
|
/* 16 QueryDestroy */ static_cast<Uint32>(kNone),
|
|
/* 17 CreateRenderState */ static_cast<Uint32>(kHasBlob),
|
|
/* 18 BindRenderState */ static_cast<Uint32>(kNone),
|
|
/* 19 DeleteRenderState */ static_cast<Uint32>(kNone),
|
|
/* 20 CreateVertexElements */ static_cast<Uint32>(kHasBlob),
|
|
/* 21 BindVertexElements */ static_cast<Uint32>(kNone),
|
|
/* 22 DeleteVertexElements */ static_cast<Uint32>(kNone),
|
|
/* 23 CreateSamplerState */ static_cast<Uint32>(kHasBlob),
|
|
/* 24 DeleteSamplerState */ static_cast<Uint32>(kNone),
|
|
/* 25 CreateSamplerView */ static_cast<Uint32>(kNone),
|
|
/* 26 DeleteSamplerView */ static_cast<Uint32>(kNone),
|
|
/* 27 CreateShaderState */ static_cast<Uint32>(kHasBlob),
|
|
/* 28 BindShaderState */ static_cast<Uint32>(kNone),
|
|
/* 29 DeleteShaderState */ static_cast<Uint32>(kNone),
|
|
/* 30 SetDynamicState */ static_cast<Uint32>(kHasBlob),
|
|
/* 31 SetFramebufferState */ static_cast<Uint32>(kNone),
|
|
/* 32 SetVertexBuffers */ static_cast<Uint32>(kVarTail),
|
|
/* 33 SetIndexBuffer */ static_cast<Uint32>(kNone),
|
|
/* 34 SetIndirectBuffers */ static_cast<Uint32>(kNone),
|
|
/* 35 SetSamplerViews */ static_cast<Uint32>(kVarTail),
|
|
/* 36 BindSamplerStates */ static_cast<Uint32>(kVarTail),
|
|
/* 37 SetShaderImages */ static_cast<Uint32>(kVarTail),
|
|
/* 38 SetShaderBuffers */ static_cast<Uint32>(kVarTail | kHostSpan),
|
|
/* 39 SetStreamOutputTargets */ static_cast<Uint32>(kVarTail),
|
|
/* 40 SetGlobalConstants */ static_cast<Uint32>(kHasBlob),
|
|
/* 41 SetVertexAttribDefaults */ static_cast<Uint32>(kVarTail),
|
|
/* 42 SetPixelPackState */ static_cast<Uint32>(kNone),
|
|
/* 43 SetPatchState */ static_cast<Uint32>(kNone),
|
|
/* 44 SetDrawProgram */ static_cast<Uint32>(kNone),
|
|
/* 45 SetDispatchProgram */ static_cast<Uint32>(kNone),
|
|
/* 46 SetResidualValueState */ static_cast<Uint32>(kHasBlob),
|
|
/* 47 SetTextureParams */ static_cast<Uint32>(kReplySlot),
|
|
/* 48 ResourceSubData */ static_cast<Uint32>(kHasBlob | kVarTail | kReplySlot),
|
|
/* 49 BufferSubDataResident */ static_cast<Uint32>(kHasBlob | kOptional),
|
|
/* 50 ResourceSubDataComplete */ static_cast<Uint32>(kNone),
|
|
/* 51 ResourceFlushRange */ static_cast<Uint32>(kNone),
|
|
/* 52 ResourceReadback */ static_cast<Uint32>(kReplySlot),
|
|
/* 53 ResourceCopyRegion */ static_cast<Uint32>(kNone),
|
|
/* 54 GenerateMipmap */ static_cast<Uint32>(kNone),
|
|
/* 55 GetTextureImage */ static_cast<Uint32>(kReplySlot),
|
|
/* 56 Blit */ static_cast<Uint32>(kNone),
|
|
/* 57 Clear */ static_cast<Uint32>(kNone),
|
|
/* 58 ReadPixels */ static_cast<Uint32>(kReplySlot),
|
|
/* 59 DrawVbo */ static_cast<Uint32>(kHostSpan | kVarTail),
|
|
/* 60 LaunchGrid */ static_cast<Uint32>(kNone),
|
|
/* 61 MemoryBarrier */ static_cast<Uint32>(kNone),
|
|
/* 62 BeginStreamOutput */ static_cast<Uint32>(kNone),
|
|
/* 63 EndStreamOutput */ static_cast<Uint32>(kNone),
|
|
/* 64 PauseStreamOutput */ static_cast<Uint32>(kNone),
|
|
/* 65 ResumeStreamOutput */ static_cast<Uint32>(kNone),
|
|
/* 66 Flush */ static_cast<Uint32>(kNone),
|
|
/* 67 Present */ static_cast<Uint32>(kNone),
|
|
/* 68 SetSwapInterval */ static_cast<Uint32>(kOptional),
|
|
/* 69 QueryTimestamp */ static_cast<Uint32>(kReplySlot),
|
|
/* 70 QueryCounter */ static_cast<Uint32>(kNone),
|
|
/* 71 FenceWaitServer */ static_cast<Uint32>(kNone),
|
|
/* 72 BindShaderImage */ static_cast<Uint32>(kNone),
|
|
/* 73 PatchParameter */ static_cast<Uint32>(kNone),
|
|
/* 74 BindStreamOutput */ static_cast<Uint32>(kNone),
|
|
/* 75 SetStorageBlockBinding */ static_cast<Uint32>(kHasBlob),
|
|
/* 76 CopyFramebufferToTexture*/ static_cast<Uint32>(kNone),
|
|
};
|
|
static_assert(sizeof(kMGPipeCallFlags) / sizeof(kMGPipeCallFlags[0]) ==
|
|
static_cast<SizeT>(MGPWireOp::kOpCount),
|
|
"the flags table and the opcode space disagree");
|
|
|
|
// The only supported read of the table. Out-of-range is kNone rather than undefined
|
|
// behaviour, because the one caller that can pass a bad opcode is a decoder holding bytes
|
|
// off a stream, and it must reach its own Fatal{ProtocolCorruption} rather than read past
|
|
// the array on the way there.
|
|
inline constexpr Uint32 MGPipeCallFlagsFor(MGPWireOp op) {
|
|
const SizeT index = static_cast<SizeT>(op);
|
|
return index < static_cast<SizeT>(MGPWireOp::kOpCount) ? kMGPipeCallFlags[index]
|
|
: static_cast<Uint32>(kNone);
|
|
}
|
|
|
|
// Spot checks the generator states about its own output, so that a catalogue edit that
|
|
// silently drops a flag is a build break here and not a wrong decode six packages away.
|
|
static_assert(MGPipeCallFlagsFor(MGPWireOp::kInvalid) == static_cast<Uint32>(kNone),
|
|
"opcode 0 is not a call and carries no flags");
|
|
static_assert((MGPipeCallFlagsFor(MGPWireOp::GetCaps) & static_cast<Uint32>(kHasBlob)) != 0,
|
|
"MGPCaps owns two MGPBlobRef members; R-13.1 gave the call its flag");
|
|
static_assert((MGPipeCallFlagsFor(MGPWireOp::CreateSamplerState) & static_cast<Uint32>(kHasBlob)) != 0,
|
|
"MGPSamplerDesc owns an MGPBlobRef member; R-13.1 gave the call its flag");
|
|
static_assert((MGPipeCallFlagsFor(MGPWireOp::ResourceFlushRange) & static_cast<Uint32>(kHasBlob)) == 0,
|
|
"R-13.2: resource_flush_range carries no bytes on the wire and owns no blobref");
|
|
static_assert((MGPipeCallFlagsFor(MGPWireOp::ResourceRespecify) & static_cast<Uint32>(kHasBlob)) == 0,
|
|
"R-13.3: initial bytes follow as resource_subdata; MGPResourceDesc owns no blobref");
|
|
static_assert((MGPipeCallFlagsFor(MGPWireOp::DrawVbo) &
|
|
static_cast<Uint32>(kHostSpan | kVarTail)) == static_cast<Uint32>(kHostSpan | kVarTail),
|
|
"draw_vbo is the conditional-tail plus host-span shape the codec is measured on");
|
|
|
|
|
|
// The bit layout of MGPipeCallFlags, read out of MGPipe.h by the generator.
|
|
// MG_Test/Wire/RingTest.cpp holds the other half: what each of these bits means
|
|
// in MG_Remote::Transport::RingRecordFlags, which is NOT the same thing.
|
|
static_assert(static_cast<Uint32>(kNeedsAck) == (1u << 0),
|
|
"MGPipeCallFlags::kNeedsAck moved bit; MG_Remote's translation is keyed on it");
|
|
static_assert(static_cast<Uint32>(kHasBlob) == (1u << 1),
|
|
"MGPipeCallFlags::kHasBlob moved bit; MG_Remote's translation is keyed on it");
|
|
static_assert(static_cast<Uint32>(kVarTail) == (1u << 2),
|
|
"MGPipeCallFlags::kVarTail moved bit; MG_Remote's translation is keyed on it");
|
|
static_assert(static_cast<Uint32>(kHostSpan) == (1u << 3),
|
|
"MGPipeCallFlags::kHostSpan moved bit; MG_Remote's translation is keyed on it");
|
|
static_assert(static_cast<Uint32>(kReplySlot) == (1u << 4),
|
|
"MGPipeCallFlags::kReplySlot moved bit; MG_Remote's translation is keyed on it");
|
|
static_assert(static_cast<Uint32>(kOptional) == (1u << 5),
|
|
"MGPipeCallFlags::kOptional moved bit; MG_Remote's translation is keyed on it");
|
|
// ... and this is ALL of them. A seventh flag changes this number, which is the
|
|
// build break that sends its author to the ring's flag space before it ships.
|
|
inline constexpr Uint32 kMGPipeCallFlagsAllBits = static_cast<Uint32>(kNeedsAck | kHasBlob | kVarTail | kHostSpan | kReplySlot | kOptional);
|
|
static_assert(kMGPipeCallFlagsAllBits == 0x3Fu,
|
|
"the MGPipeCallFlags bit set changed; see RingTest's cross-enum table");
|
|
|
|
struct alignas(8) MGPWireRec_GetCaps {
|
|
MGPWireRecHeader Header;
|
|
MGPCaps Payload;
|
|
};
|
|
static_assert(sizeof(MGPWireRec_GetCaps) ==
|
|
((sizeof(MGPWireRecHeader) + sizeof(MGPCaps) + 7u) & ~SizeT(7u)),
|
|
"MGPWireRec_GetCaps gained padding; the wire format moved");
|
|
|
|
struct alignas(8) MGPWireRec_ResourceCreate {
|
|
MGPWireRecHeader Header;
|
|
MGPResourceDesc Payload;
|
|
};
|
|
static_assert(sizeof(MGPWireRec_ResourceCreate) ==
|
|
((sizeof(MGPWireRecHeader) + sizeof(MGPResourceDesc) + 7u) & ~SizeT(7u)),
|
|
"MGPWireRec_ResourceCreate gained padding; the wire format moved");
|
|
|
|
struct alignas(8) MGPWireRec_ResourceRespecify {
|
|
MGPWireRecHeader Header;
|
|
MGPResourceDesc Payload;
|
|
};
|
|
static_assert(sizeof(MGPWireRec_ResourceRespecify) ==
|
|
((sizeof(MGPWireRecHeader) + sizeof(MGPResourceDesc) + 7u) & ~SizeT(7u)),
|
|
"MGPWireRec_ResourceRespecify gained padding; the wire format moved");
|
|
|
|
struct alignas(8) MGPWireRec_ResourceDestroy {
|
|
MGPWireRecHeader Header;
|
|
MGPHandleOnly Payload;
|
|
};
|
|
static_assert(sizeof(MGPWireRec_ResourceDestroy) ==
|
|
((sizeof(MGPWireRecHeader) + sizeof(MGPHandleOnly) + 7u) & ~SizeT(7u)),
|
|
"MGPWireRec_ResourceDestroy gained padding; the wire format moved");
|
|
|
|
struct alignas(8) MGPWireRec_MapPersistent {
|
|
MGPWireRecHeader Header;
|
|
MGPHandleOnly Payload;
|
|
};
|
|
static_assert(sizeof(MGPWireRec_MapPersistent) ==
|
|
((sizeof(MGPWireRecHeader) + sizeof(MGPHandleOnly) + 7u) & ~SizeT(7u)),
|
|
"MGPWireRec_MapPersistent gained padding; the wire format moved");
|
|
|
|
struct alignas(8) MGPWireRec_UnmapPersistent {
|
|
MGPWireRecHeader Header;
|
|
MGPHandleOnly Payload;
|
|
};
|
|
static_assert(sizeof(MGPWireRec_UnmapPersistent) ==
|
|
((sizeof(MGPWireRecHeader) + sizeof(MGPHandleOnly) + 7u) & ~SizeT(7u)),
|
|
"MGPWireRec_UnmapPersistent gained padding; the wire format moved");
|
|
|
|
struct alignas(8) MGPWireRec_FenceCreate {
|
|
MGPWireRecHeader Header;
|
|
MGPHandleOnly Payload;
|
|
};
|
|
static_assert(sizeof(MGPWireRec_FenceCreate) ==
|
|
((sizeof(MGPWireRecHeader) + sizeof(MGPHandleOnly) + 7u) & ~SizeT(7u)),
|
|
"MGPWireRec_FenceCreate gained padding; the wire format moved");
|
|
|
|
struct alignas(8) MGPWireRec_FenceStatus {
|
|
MGPWireRecHeader Header;
|
|
MGPHandleOnly Payload;
|
|
};
|
|
static_assert(sizeof(MGPWireRec_FenceStatus) ==
|
|
((sizeof(MGPWireRecHeader) + sizeof(MGPHandleOnly) + 7u) & ~SizeT(7u)),
|
|
"MGPWireRec_FenceStatus gained padding; the wire format moved");
|
|
|
|
struct alignas(8) MGPWireRec_FenceWait {
|
|
MGPWireRecHeader Header;
|
|
MGPFenceWait Payload;
|
|
};
|
|
static_assert(sizeof(MGPWireRec_FenceWait) ==
|
|
((sizeof(MGPWireRecHeader) + sizeof(MGPFenceWait) + 7u) & ~SizeT(7u)),
|
|
"MGPWireRec_FenceWait gained padding; the wire format moved");
|
|
|
|
struct alignas(8) MGPWireRec_FenceDestroy {
|
|
MGPWireRecHeader Header;
|
|
MGPHandleOnly Payload;
|
|
};
|
|
static_assert(sizeof(MGPWireRec_FenceDestroy) ==
|
|
((sizeof(MGPWireRecHeader) + sizeof(MGPHandleOnly) + 7u) & ~SizeT(7u)),
|
|
"MGPWireRec_FenceDestroy gained padding; the wire format moved");
|
|
|
|
struct alignas(8) MGPWireRec_QueryCreate {
|
|
MGPWireRecHeader Header;
|
|
MGPQueryDesc Payload;
|
|
};
|
|
static_assert(sizeof(MGPWireRec_QueryCreate) ==
|
|
((sizeof(MGPWireRecHeader) + sizeof(MGPQueryDesc) + 7u) & ~SizeT(7u)),
|
|
"MGPWireRec_QueryCreate gained padding; the wire format moved");
|
|
|
|
struct alignas(8) MGPWireRec_QueryBegin {
|
|
MGPWireRecHeader Header;
|
|
MGPQueryDesc Payload;
|
|
};
|
|
static_assert(sizeof(MGPWireRec_QueryBegin) ==
|
|
((sizeof(MGPWireRecHeader) + sizeof(MGPQueryDesc) + 7u) & ~SizeT(7u)),
|
|
"MGPWireRec_QueryBegin gained padding; the wire format moved");
|
|
|
|
struct alignas(8) MGPWireRec_QueryEnd {
|
|
MGPWireRecHeader Header;
|
|
MGPQueryDesc Payload;
|
|
};
|
|
static_assert(sizeof(MGPWireRec_QueryEnd) ==
|
|
((sizeof(MGPWireRecHeader) + sizeof(MGPQueryDesc) + 7u) & ~SizeT(7u)),
|
|
"MGPWireRec_QueryEnd gained padding; the wire format moved");
|
|
|
|
struct alignas(8) MGPWireRec_QueryAvailable {
|
|
MGPWireRecHeader Header;
|
|
MGPHandleOnly Payload;
|
|
};
|
|
static_assert(sizeof(MGPWireRec_QueryAvailable) ==
|
|
((sizeof(MGPWireRecHeader) + sizeof(MGPHandleOnly) + 7u) & ~SizeT(7u)),
|
|
"MGPWireRec_QueryAvailable gained padding; the wire format moved");
|
|
|
|
struct alignas(8) MGPWireRec_QueryResult {
|
|
MGPWireRecHeader Header;
|
|
MGPQueryResultRequest Payload;
|
|
};
|
|
static_assert(sizeof(MGPWireRec_QueryResult) ==
|
|
((sizeof(MGPWireRecHeader) + sizeof(MGPQueryResultRequest) + 7u) & ~SizeT(7u)),
|
|
"MGPWireRec_QueryResult gained padding; the wire format moved");
|
|
|
|
struct alignas(8) MGPWireRec_QueryDestroy {
|
|
MGPWireRecHeader Header;
|
|
MGPHandleOnly Payload;
|
|
};
|
|
static_assert(sizeof(MGPWireRec_QueryDestroy) ==
|
|
((sizeof(MGPWireRecHeader) + sizeof(MGPHandleOnly) + 7u) & ~SizeT(7u)),
|
|
"MGPWireRec_QueryDestroy gained padding; the wire format moved");
|
|
|
|
struct alignas(8) MGPWireRec_CreateRenderState {
|
|
MGPWireRecHeader Header;
|
|
MGPRenderStateDesc Payload;
|
|
};
|
|
static_assert(sizeof(MGPWireRec_CreateRenderState) ==
|
|
((sizeof(MGPWireRecHeader) + sizeof(MGPRenderStateDesc) + 7u) & ~SizeT(7u)),
|
|
"MGPWireRec_CreateRenderState gained padding; the wire format moved");
|
|
|
|
struct alignas(8) MGPWireRec_BindRenderState {
|
|
MGPWireRecHeader Header;
|
|
MGPBindRenderState Payload;
|
|
};
|
|
static_assert(sizeof(MGPWireRec_BindRenderState) ==
|
|
((sizeof(MGPWireRecHeader) + sizeof(MGPBindRenderState) + 7u) & ~SizeT(7u)),
|
|
"MGPWireRec_BindRenderState gained padding; the wire format moved");
|
|
|
|
struct alignas(8) MGPWireRec_DeleteRenderState {
|
|
MGPWireRecHeader Header;
|
|
MGPHandleOnly Payload;
|
|
};
|
|
static_assert(sizeof(MGPWireRec_DeleteRenderState) ==
|
|
((sizeof(MGPWireRecHeader) + sizeof(MGPHandleOnly) + 7u) & ~SizeT(7u)),
|
|
"MGPWireRec_DeleteRenderState gained padding; the wire format moved");
|
|
|
|
struct alignas(8) MGPWireRec_CreateVertexElements {
|
|
MGPWireRecHeader Header;
|
|
MGPVertexElements Payload;
|
|
};
|
|
static_assert(sizeof(MGPWireRec_CreateVertexElements) ==
|
|
((sizeof(MGPWireRecHeader) + sizeof(MGPVertexElements) + 7u) & ~SizeT(7u)),
|
|
"MGPWireRec_CreateVertexElements gained padding; the wire format moved");
|
|
|
|
struct alignas(8) MGPWireRec_BindVertexElements {
|
|
MGPWireRecHeader Header;
|
|
MGPHandleOnly Payload;
|
|
};
|
|
static_assert(sizeof(MGPWireRec_BindVertexElements) ==
|
|
((sizeof(MGPWireRecHeader) + sizeof(MGPHandleOnly) + 7u) & ~SizeT(7u)),
|
|
"MGPWireRec_BindVertexElements gained padding; the wire format moved");
|
|
|
|
struct alignas(8) MGPWireRec_DeleteVertexElements {
|
|
MGPWireRecHeader Header;
|
|
MGPHandleOnly Payload;
|
|
};
|
|
static_assert(sizeof(MGPWireRec_DeleteVertexElements) ==
|
|
((sizeof(MGPWireRecHeader) + sizeof(MGPHandleOnly) + 7u) & ~SizeT(7u)),
|
|
"MGPWireRec_DeleteVertexElements gained padding; the wire format moved");
|
|
|
|
struct alignas(8) MGPWireRec_CreateSamplerState {
|
|
MGPWireRecHeader Header;
|
|
MGPSamplerDesc Payload;
|
|
};
|
|
static_assert(sizeof(MGPWireRec_CreateSamplerState) ==
|
|
((sizeof(MGPWireRecHeader) + sizeof(MGPSamplerDesc) + 7u) & ~SizeT(7u)),
|
|
"MGPWireRec_CreateSamplerState gained padding; the wire format moved");
|
|
|
|
struct alignas(8) MGPWireRec_DeleteSamplerState {
|
|
MGPWireRecHeader Header;
|
|
MGPHandleOnly Payload;
|
|
};
|
|
static_assert(sizeof(MGPWireRec_DeleteSamplerState) ==
|
|
((sizeof(MGPWireRecHeader) + sizeof(MGPHandleOnly) + 7u) & ~SizeT(7u)),
|
|
"MGPWireRec_DeleteSamplerState gained padding; the wire format moved");
|
|
|
|
struct alignas(8) MGPWireRec_CreateSamplerView {
|
|
MGPWireRecHeader Header;
|
|
MGPSamplerView Payload;
|
|
};
|
|
static_assert(sizeof(MGPWireRec_CreateSamplerView) ==
|
|
((sizeof(MGPWireRecHeader) + sizeof(MGPSamplerView) + 7u) & ~SizeT(7u)),
|
|
"MGPWireRec_CreateSamplerView gained padding; the wire format moved");
|
|
|
|
struct alignas(8) MGPWireRec_DeleteSamplerView {
|
|
MGPWireRecHeader Header;
|
|
MGPHandleOnly Payload;
|
|
};
|
|
static_assert(sizeof(MGPWireRec_DeleteSamplerView) ==
|
|
((sizeof(MGPWireRecHeader) + sizeof(MGPHandleOnly) + 7u) & ~SizeT(7u)),
|
|
"MGPWireRec_DeleteSamplerView gained padding; the wire format moved");
|
|
|
|
struct alignas(8) MGPWireRec_CreateShaderState {
|
|
MGPWireRecHeader Header;
|
|
MGPProgramDesc Payload;
|
|
};
|
|
static_assert(sizeof(MGPWireRec_CreateShaderState) ==
|
|
((sizeof(MGPWireRecHeader) + sizeof(MGPProgramDesc) + 7u) & ~SizeT(7u)),
|
|
"MGPWireRec_CreateShaderState gained padding; the wire format moved");
|
|
|
|
struct alignas(8) MGPWireRec_BindShaderState {
|
|
MGPWireRecHeader Header;
|
|
MGPHandleOnly Payload;
|
|
};
|
|
static_assert(sizeof(MGPWireRec_BindShaderState) ==
|
|
((sizeof(MGPWireRecHeader) + sizeof(MGPHandleOnly) + 7u) & ~SizeT(7u)),
|
|
"MGPWireRec_BindShaderState gained padding; the wire format moved");
|
|
|
|
struct alignas(8) MGPWireRec_DeleteShaderState {
|
|
MGPWireRecHeader Header;
|
|
MGPHandleOnly Payload;
|
|
};
|
|
static_assert(sizeof(MGPWireRec_DeleteShaderState) ==
|
|
((sizeof(MGPWireRecHeader) + sizeof(MGPHandleOnly) + 7u) & ~SizeT(7u)),
|
|
"MGPWireRec_DeleteShaderState gained padding; the wire format moved");
|
|
|
|
struct alignas(8) MGPWireRec_SetDynamicState {
|
|
MGPWireRecHeader Header;
|
|
MGPDynamicState Payload;
|
|
};
|
|
static_assert(sizeof(MGPWireRec_SetDynamicState) ==
|
|
((sizeof(MGPWireRecHeader) + sizeof(MGPDynamicState) + 7u) & ~SizeT(7u)),
|
|
"MGPWireRec_SetDynamicState gained padding; the wire format moved");
|
|
|
|
struct alignas(8) MGPWireRec_SetFramebufferState {
|
|
MGPWireRecHeader Header;
|
|
MGPFramebufferState Payload;
|
|
};
|
|
static_assert(sizeof(MGPWireRec_SetFramebufferState) ==
|
|
((sizeof(MGPWireRecHeader) + sizeof(MGPFramebufferState) + 7u) & ~SizeT(7u)),
|
|
"MGPWireRec_SetFramebufferState gained padding; the wire format moved");
|
|
|
|
struct alignas(8) MGPWireRec_SetVertexBuffers {
|
|
MGPWireRecHeader Header;
|
|
MGPVertexBuffers Payload;
|
|
};
|
|
static_assert(sizeof(MGPWireRec_SetVertexBuffers) ==
|
|
((sizeof(MGPWireRecHeader) + sizeof(MGPVertexBuffers) + 7u) & ~SizeT(7u)),
|
|
"MGPWireRec_SetVertexBuffers gained padding; the wire format moved");
|
|
|
|
struct alignas(8) MGPWireRec_SetIndexBuffer {
|
|
MGPWireRecHeader Header;
|
|
MGPIndexBuffer Payload;
|
|
};
|
|
static_assert(sizeof(MGPWireRec_SetIndexBuffer) ==
|
|
((sizeof(MGPWireRecHeader) + sizeof(MGPIndexBuffer) + 7u) & ~SizeT(7u)),
|
|
"MGPWireRec_SetIndexBuffer gained padding; the wire format moved");
|
|
|
|
struct alignas(8) MGPWireRec_SetIndirectBuffers {
|
|
MGPWireRecHeader Header;
|
|
MGPIndirectBuffers Payload;
|
|
};
|
|
static_assert(sizeof(MGPWireRec_SetIndirectBuffers) ==
|
|
((sizeof(MGPWireRecHeader) + sizeof(MGPIndirectBuffers) + 7u) & ~SizeT(7u)),
|
|
"MGPWireRec_SetIndirectBuffers gained padding; the wire format moved");
|
|
|
|
struct alignas(8) MGPWireRec_SetSamplerViews {
|
|
MGPWireRecHeader Header;
|
|
MGPSamplerViews Payload;
|
|
};
|
|
static_assert(sizeof(MGPWireRec_SetSamplerViews) ==
|
|
((sizeof(MGPWireRecHeader) + sizeof(MGPSamplerViews) + 7u) & ~SizeT(7u)),
|
|
"MGPWireRec_SetSamplerViews gained padding; the wire format moved");
|
|
|
|
struct alignas(8) MGPWireRec_BindSamplerStates {
|
|
MGPWireRecHeader Header;
|
|
MGPSamplerStates Payload;
|
|
};
|
|
static_assert(sizeof(MGPWireRec_BindSamplerStates) ==
|
|
((sizeof(MGPWireRecHeader) + sizeof(MGPSamplerStates) + 7u) & ~SizeT(7u)),
|
|
"MGPWireRec_BindSamplerStates gained padding; the wire format moved");
|
|
|
|
struct alignas(8) MGPWireRec_SetShaderImages {
|
|
MGPWireRecHeader Header;
|
|
MGPShaderImages Payload;
|
|
};
|
|
static_assert(sizeof(MGPWireRec_SetShaderImages) ==
|
|
((sizeof(MGPWireRecHeader) + sizeof(MGPShaderImages) + 7u) & ~SizeT(7u)),
|
|
"MGPWireRec_SetShaderImages gained padding; the wire format moved");
|
|
|
|
struct alignas(8) MGPWireRec_SetShaderBuffers {
|
|
MGPWireRecHeader Header;
|
|
MGPShaderBuffers Payload;
|
|
};
|
|
static_assert(sizeof(MGPWireRec_SetShaderBuffers) ==
|
|
((sizeof(MGPWireRecHeader) + sizeof(MGPShaderBuffers) + 7u) & ~SizeT(7u)),
|
|
"MGPWireRec_SetShaderBuffers gained padding; the wire format moved");
|
|
|
|
struct alignas(8) MGPWireRec_SetStreamOutputTargets {
|
|
MGPWireRecHeader Header;
|
|
MGPStreamOutputTargets Payload;
|
|
};
|
|
static_assert(sizeof(MGPWireRec_SetStreamOutputTargets) ==
|
|
((sizeof(MGPWireRecHeader) + sizeof(MGPStreamOutputTargets) + 7u) & ~SizeT(7u)),
|
|
"MGPWireRec_SetStreamOutputTargets gained padding; the wire format moved");
|
|
|
|
struct alignas(8) MGPWireRec_SetGlobalConstants {
|
|
MGPWireRecHeader Header;
|
|
MGPGlobalConstants Payload;
|
|
};
|
|
static_assert(sizeof(MGPWireRec_SetGlobalConstants) ==
|
|
((sizeof(MGPWireRecHeader) + sizeof(MGPGlobalConstants) + 7u) & ~SizeT(7u)),
|
|
"MGPWireRec_SetGlobalConstants gained padding; the wire format moved");
|
|
|
|
struct alignas(8) MGPWireRec_SetVertexAttribDefaults {
|
|
MGPWireRecHeader Header;
|
|
MGPVertexAttribDefaults Payload;
|
|
};
|
|
static_assert(sizeof(MGPWireRec_SetVertexAttribDefaults) ==
|
|
((sizeof(MGPWireRecHeader) + sizeof(MGPVertexAttribDefaults) + 7u) & ~SizeT(7u)),
|
|
"MGPWireRec_SetVertexAttribDefaults gained padding; the wire format moved");
|
|
|
|
struct alignas(8) MGPWireRec_SetPixelPackState {
|
|
MGPWireRecHeader Header;
|
|
MGPPixelPackState Payload;
|
|
};
|
|
static_assert(sizeof(MGPWireRec_SetPixelPackState) ==
|
|
((sizeof(MGPWireRecHeader) + sizeof(MGPPixelPackState) + 7u) & ~SizeT(7u)),
|
|
"MGPWireRec_SetPixelPackState gained padding; the wire format moved");
|
|
|
|
struct alignas(8) MGPWireRec_SetPatchState {
|
|
MGPWireRecHeader Header;
|
|
MGPPatchState Payload;
|
|
};
|
|
static_assert(sizeof(MGPWireRec_SetPatchState) ==
|
|
((sizeof(MGPWireRecHeader) + sizeof(MGPPatchState) + 7u) & ~SizeT(7u)),
|
|
"MGPWireRec_SetPatchState gained padding; the wire format moved");
|
|
|
|
struct alignas(8) MGPWireRec_SetDrawProgram {
|
|
MGPWireRecHeader Header;
|
|
MGPHandleOnly Payload;
|
|
};
|
|
static_assert(sizeof(MGPWireRec_SetDrawProgram) ==
|
|
((sizeof(MGPWireRecHeader) + sizeof(MGPHandleOnly) + 7u) & ~SizeT(7u)),
|
|
"MGPWireRec_SetDrawProgram gained padding; the wire format moved");
|
|
|
|
struct alignas(8) MGPWireRec_SetDispatchProgram {
|
|
MGPWireRecHeader Header;
|
|
MGPHandleOnly Payload;
|
|
};
|
|
static_assert(sizeof(MGPWireRec_SetDispatchProgram) ==
|
|
((sizeof(MGPWireRecHeader) + sizeof(MGPHandleOnly) + 7u) & ~SizeT(7u)),
|
|
"MGPWireRec_SetDispatchProgram gained padding; the wire format moved");
|
|
|
|
struct alignas(8) MGPWireRec_SetResidualValueState {
|
|
MGPWireRecHeader Header;
|
|
MGPResidualValueState Payload;
|
|
};
|
|
static_assert(sizeof(MGPWireRec_SetResidualValueState) ==
|
|
((sizeof(MGPWireRecHeader) + sizeof(MGPResidualValueState) + 7u) & ~SizeT(7u)),
|
|
"MGPWireRec_SetResidualValueState gained padding; the wire format moved");
|
|
|
|
struct alignas(8) MGPWireRec_SetTextureParams {
|
|
MGPWireRecHeader Header;
|
|
MGPTextureParams Payload;
|
|
};
|
|
static_assert(sizeof(MGPWireRec_SetTextureParams) ==
|
|
((sizeof(MGPWireRecHeader) + sizeof(MGPTextureParams) + 7u) & ~SizeT(7u)),
|
|
"MGPWireRec_SetTextureParams gained padding; the wire format moved");
|
|
|
|
struct alignas(8) MGPWireRec_ResourceSubData {
|
|
MGPWireRecHeader Header;
|
|
MGPSubData Payload;
|
|
};
|
|
static_assert(sizeof(MGPWireRec_ResourceSubData) ==
|
|
((sizeof(MGPWireRecHeader) + sizeof(MGPSubData) + 7u) & ~SizeT(7u)),
|
|
"MGPWireRec_ResourceSubData gained padding; the wire format moved");
|
|
|
|
struct alignas(8) MGPWireRec_BufferSubDataResident {
|
|
MGPWireRecHeader Header;
|
|
MGPSubData Payload;
|
|
};
|
|
static_assert(sizeof(MGPWireRec_BufferSubDataResident) ==
|
|
((sizeof(MGPWireRecHeader) + sizeof(MGPSubData) + 7u) & ~SizeT(7u)),
|
|
"MGPWireRec_BufferSubDataResident gained padding; the wire format moved");
|
|
|
|
struct alignas(8) MGPWireRec_ResourceSubDataComplete {
|
|
MGPWireRecHeader Header;
|
|
MGPSubDataComplete Payload;
|
|
};
|
|
static_assert(sizeof(MGPWireRec_ResourceSubDataComplete) ==
|
|
((sizeof(MGPWireRecHeader) + sizeof(MGPSubDataComplete) + 7u) & ~SizeT(7u)),
|
|
"MGPWireRec_ResourceSubDataComplete gained padding; the wire format moved");
|
|
|
|
struct alignas(8) MGPWireRec_ResourceFlushRange {
|
|
MGPWireRecHeader Header;
|
|
MGPFlushRange Payload;
|
|
};
|
|
static_assert(sizeof(MGPWireRec_ResourceFlushRange) ==
|
|
((sizeof(MGPWireRecHeader) + sizeof(MGPFlushRange) + 7u) & ~SizeT(7u)),
|
|
"MGPWireRec_ResourceFlushRange gained padding; the wire format moved");
|
|
|
|
struct alignas(8) MGPWireRec_ResourceReadback {
|
|
MGPWireRecHeader Header;
|
|
MGPReadback Payload;
|
|
};
|
|
static_assert(sizeof(MGPWireRec_ResourceReadback) ==
|
|
((sizeof(MGPWireRecHeader) + sizeof(MGPReadback) + 7u) & ~SizeT(7u)),
|
|
"MGPWireRec_ResourceReadback gained padding; the wire format moved");
|
|
|
|
struct alignas(8) MGPWireRec_ResourceCopyRegion {
|
|
MGPWireRecHeader Header;
|
|
MGPCopyRegion Payload;
|
|
};
|
|
static_assert(sizeof(MGPWireRec_ResourceCopyRegion) ==
|
|
((sizeof(MGPWireRecHeader) + sizeof(MGPCopyRegion) + 7u) & ~SizeT(7u)),
|
|
"MGPWireRec_ResourceCopyRegion gained padding; the wire format moved");
|
|
|
|
struct alignas(8) MGPWireRec_GenerateMipmap {
|
|
MGPWireRecHeader Header;
|
|
MGPMipPlan Payload;
|
|
};
|
|
static_assert(sizeof(MGPWireRec_GenerateMipmap) ==
|
|
((sizeof(MGPWireRecHeader) + sizeof(MGPMipPlan) + 7u) & ~SizeT(7u)),
|
|
"MGPWireRec_GenerateMipmap gained padding; the wire format moved");
|
|
|
|
struct alignas(8) MGPWireRec_GetTextureImage {
|
|
MGPWireRecHeader Header;
|
|
MGPReadbackInfo Payload;
|
|
};
|
|
static_assert(sizeof(MGPWireRec_GetTextureImage) ==
|
|
((sizeof(MGPWireRecHeader) + sizeof(MGPReadbackInfo) + 7u) & ~SizeT(7u)),
|
|
"MGPWireRec_GetTextureImage gained padding; the wire format moved");
|
|
|
|
struct alignas(8) MGPWireRec_Blit {
|
|
MGPWireRecHeader Header;
|
|
MGPBlit Payload;
|
|
};
|
|
static_assert(sizeof(MGPWireRec_Blit) ==
|
|
((sizeof(MGPWireRecHeader) + sizeof(MGPBlit) + 7u) & ~SizeT(7u)),
|
|
"MGPWireRec_Blit gained padding; the wire format moved");
|
|
|
|
struct alignas(8) MGPWireRec_Clear {
|
|
MGPWireRecHeader Header;
|
|
MGPClear Payload;
|
|
};
|
|
static_assert(sizeof(MGPWireRec_Clear) ==
|
|
((sizeof(MGPWireRecHeader) + sizeof(MGPClear) + 7u) & ~SizeT(7u)),
|
|
"MGPWireRec_Clear gained padding; the wire format moved");
|
|
|
|
struct alignas(8) MGPWireRec_ReadPixels {
|
|
MGPWireRecHeader Header;
|
|
MGPReadbackInfo Payload;
|
|
};
|
|
static_assert(sizeof(MGPWireRec_ReadPixels) ==
|
|
((sizeof(MGPWireRecHeader) + sizeof(MGPReadbackInfo) + 7u) & ~SizeT(7u)),
|
|
"MGPWireRec_ReadPixels gained padding; the wire format moved");
|
|
|
|
struct alignas(8) MGPWireRec_DrawVbo {
|
|
MGPWireRecHeader Header;
|
|
MGPDrawInfo Payload;
|
|
};
|
|
static_assert(sizeof(MGPWireRec_DrawVbo) ==
|
|
((sizeof(MGPWireRecHeader) + sizeof(MGPDrawInfo) + 7u) & ~SizeT(7u)),
|
|
"MGPWireRec_DrawVbo gained padding; the wire format moved");
|
|
|
|
struct alignas(8) MGPWireRec_LaunchGrid {
|
|
MGPWireRecHeader Header;
|
|
MGPGridInfo Payload;
|
|
};
|
|
static_assert(sizeof(MGPWireRec_LaunchGrid) ==
|
|
((sizeof(MGPWireRecHeader) + sizeof(MGPGridInfo) + 7u) & ~SizeT(7u)),
|
|
"MGPWireRec_LaunchGrid gained padding; the wire format moved");
|
|
|
|
struct alignas(8) MGPWireRec_MemoryBarrier {
|
|
MGPWireRecHeader Header;
|
|
MGPMemoryBarrier Payload;
|
|
};
|
|
static_assert(sizeof(MGPWireRec_MemoryBarrier) ==
|
|
((sizeof(MGPWireRecHeader) + sizeof(MGPMemoryBarrier) + 7u) & ~SizeT(7u)),
|
|
"MGPWireRec_MemoryBarrier gained padding; the wire format moved");
|
|
|
|
struct alignas(8) MGPWireRec_BeginStreamOutput {
|
|
MGPWireRecHeader Header;
|
|
MGPStreamOutputBegin Payload;
|
|
};
|
|
static_assert(sizeof(MGPWireRec_BeginStreamOutput) ==
|
|
((sizeof(MGPWireRecHeader) + sizeof(MGPStreamOutputBegin) + 7u) & ~SizeT(7u)),
|
|
"MGPWireRec_BeginStreamOutput gained padding; the wire format moved");
|
|
|
|
struct alignas(8) MGPWireRec_EndStreamOutput {
|
|
MGPWireRecHeader Header;
|
|
MGPXfbAccounting Payload;
|
|
};
|
|
static_assert(sizeof(MGPWireRec_EndStreamOutput) ==
|
|
((sizeof(MGPWireRecHeader) + sizeof(MGPXfbAccounting) + 7u) & ~SizeT(7u)),
|
|
"MGPWireRec_EndStreamOutput gained padding; the wire format moved");
|
|
|
|
struct alignas(8) MGPWireRec_PauseStreamOutput {
|
|
MGPWireRecHeader Header;
|
|
MGPStreamOutputControl Payload;
|
|
};
|
|
static_assert(sizeof(MGPWireRec_PauseStreamOutput) ==
|
|
((sizeof(MGPWireRecHeader) + sizeof(MGPStreamOutputControl) + 7u) & ~SizeT(7u)),
|
|
"MGPWireRec_PauseStreamOutput gained padding; the wire format moved");
|
|
|
|
struct alignas(8) MGPWireRec_ResumeStreamOutput {
|
|
MGPWireRecHeader Header;
|
|
MGPStreamOutputControl Payload;
|
|
};
|
|
static_assert(sizeof(MGPWireRec_ResumeStreamOutput) ==
|
|
((sizeof(MGPWireRecHeader) + sizeof(MGPStreamOutputControl) + 7u) & ~SizeT(7u)),
|
|
"MGPWireRec_ResumeStreamOutput gained padding; the wire format moved");
|
|
|
|
struct alignas(8) MGPWireRec_Flush {
|
|
MGPWireRecHeader Header;
|
|
MGPFlush Payload;
|
|
};
|
|
static_assert(sizeof(MGPWireRec_Flush) ==
|
|
((sizeof(MGPWireRecHeader) + sizeof(MGPFlush) + 7u) & ~SizeT(7u)),
|
|
"MGPWireRec_Flush gained padding; the wire format moved");
|
|
|
|
struct alignas(8) MGPWireRec_Present {
|
|
MGPWireRecHeader Header;
|
|
MGPPresent Payload;
|
|
};
|
|
static_assert(sizeof(MGPWireRec_Present) ==
|
|
((sizeof(MGPWireRecHeader) + sizeof(MGPPresent) + 7u) & ~SizeT(7u)),
|
|
"MGPWireRec_Present gained padding; the wire format moved");
|
|
|
|
struct alignas(8) MGPWireRec_SetSwapInterval {
|
|
MGPWireRecHeader Header;
|
|
MGPSwapInterval Payload;
|
|
};
|
|
static_assert(sizeof(MGPWireRec_SetSwapInterval) ==
|
|
((sizeof(MGPWireRecHeader) + sizeof(MGPSwapInterval) + 7u) & ~SizeT(7u)),
|
|
"MGPWireRec_SetSwapInterval gained padding; the wire format moved");
|
|
|
|
struct alignas(8) MGPWireRec_QueryTimestamp {
|
|
MGPWireRecHeader Header;
|
|
MGPTimestampRequest Payload;
|
|
};
|
|
static_assert(sizeof(MGPWireRec_QueryTimestamp) ==
|
|
((sizeof(MGPWireRecHeader) + sizeof(MGPTimestampRequest) + 7u) & ~SizeT(7u)),
|
|
"MGPWireRec_QueryTimestamp gained padding; the wire format moved");
|
|
|
|
struct alignas(8) MGPWireRec_QueryCounter {
|
|
MGPWireRecHeader Header;
|
|
MGPQueryDesc Payload;
|
|
};
|
|
static_assert(sizeof(MGPWireRec_QueryCounter) ==
|
|
((sizeof(MGPWireRecHeader) + sizeof(MGPQueryDesc) + 7u) & ~SizeT(7u)),
|
|
"MGPWireRec_QueryCounter gained padding; the wire format moved");
|
|
|
|
struct alignas(8) MGPWireRec_FenceWaitServer {
|
|
MGPWireRecHeader Header;
|
|
MGPFenceWait Payload;
|
|
};
|
|
static_assert(sizeof(MGPWireRec_FenceWaitServer) ==
|
|
((sizeof(MGPWireRecHeader) + sizeof(MGPFenceWait) + 7u) & ~SizeT(7u)),
|
|
"MGPWireRec_FenceWaitServer gained padding; the wire format moved");
|
|
|
|
struct alignas(8) MGPWireRec_BindShaderImage {
|
|
MGPWireRecHeader Header;
|
|
MGPImageBind Payload;
|
|
};
|
|
static_assert(sizeof(MGPWireRec_BindShaderImage) ==
|
|
((sizeof(MGPWireRecHeader) + sizeof(MGPImageBind) + 7u) & ~SizeT(7u)),
|
|
"MGPWireRec_BindShaderImage gained padding; the wire format moved");
|
|
|
|
struct alignas(8) MGPWireRec_PatchParameter {
|
|
MGPWireRecHeader Header;
|
|
MGPPatchParameter Payload;
|
|
};
|
|
static_assert(sizeof(MGPWireRec_PatchParameter) ==
|
|
((sizeof(MGPWireRecHeader) + sizeof(MGPPatchParameter) + 7u) & ~SizeT(7u)),
|
|
"MGPWireRec_PatchParameter gained padding; the wire format moved");
|
|
|
|
struct alignas(8) MGPWireRec_BindStreamOutput {
|
|
MGPWireRecHeader Header;
|
|
MGPStreamOutputBind Payload;
|
|
};
|
|
static_assert(sizeof(MGPWireRec_BindStreamOutput) ==
|
|
((sizeof(MGPWireRecHeader) + sizeof(MGPStreamOutputBind) + 7u) & ~SizeT(7u)),
|
|
"MGPWireRec_BindStreamOutput gained padding; the wire format moved");
|
|
|
|
struct alignas(8) MGPWireRec_SetStorageBlockBinding {
|
|
MGPWireRecHeader Header;
|
|
MGPStorageBlockBinding Payload;
|
|
};
|
|
static_assert(sizeof(MGPWireRec_SetStorageBlockBinding) ==
|
|
((sizeof(MGPWireRecHeader) + sizeof(MGPStorageBlockBinding) + 7u) & ~SizeT(7u)),
|
|
"MGPWireRec_SetStorageBlockBinding gained padding; the wire format moved");
|
|
|
|
struct alignas(8) MGPWireRec_CopyFramebufferToTexture {
|
|
MGPWireRecHeader Header;
|
|
MGPCopyFromFramebuffer Payload;
|
|
};
|
|
static_assert(sizeof(MGPWireRec_CopyFramebufferToTexture) ==
|
|
((sizeof(MGPWireRecHeader) + sizeof(MGPCopyFromFramebuffer) + 7u) & ~SizeT(7u)),
|
|
"MGPWireRec_CopyFramebufferToTexture gained padding; the wire format moved");
|
|
|
|
[[noreturn]] inline void MGPipeWireProtocolFatal(const char* call, Uint64 size, Uint64 remaining) {
|
|
MGLOG_F("MGPipe: protocol corruption applying %s: size=%llu remaining=%llu", call,
|
|
static_cast<unsigned long long>(size), static_cast<unsigned long long>(remaining));
|
|
std::abort();
|
|
}
|
|
|
|
#define MGP_WIRE_CHECK_BOUNDS(RecType, CallName) \
|
|
do { \
|
|
if (!(size >= sizeof(RecType) && size <= remaining && (size % 8) == 0)) { \
|
|
MGPipeWireProtocolFatal(CallName, size, remaining); \
|
|
} \
|
|
} while (0)
|
|
|
|
#if MOBILEGL_BUILD_DISAGGREGATED
|
|
// THE DECODER HOOK (P5 w1). MG_Pipe is BELOW MG_Remote and may not include it, so the real
|
|
// 71-arm decoder - MG_Remote/Wire/PipeWireCodec.cpp, which resolves the segments, cross-checks
|
|
// the variable tails and calls today's MGPipeApply* free functions - installs itself here.
|
|
// The indirection is the layering, not a policy: gMGPipeSegmentResolver
|
|
// (MGPipeHostSpan.h:47) is the same shape for the same reason.
|
|
//
|
|
// It lives behind the build option because G1 admits no symbol movement in a PULL build, and
|
|
// an inline variable that MGPipeApplyWireRecord odr-uses would be one.
|
|
using MGPipeWireRecordApplyFn = Bool (*)(MGPWireOp op, const void* record, Uint64 size,
|
|
Uint64 remaining);
|
|
inline MGPipeWireRecordApplyFn gMGPipeWireRecordApply = nullptr;
|
|
#endif
|
|
|
|
// Returns whether the record was applied.
|
|
//
|
|
// THE SWITCH IS THE PER-OPCODE BOUNDS GATE AND NOTHING ELSE, AND IT CANNOT SEE THE TAIL.
|
|
// MGP_WIRE_CHECK_BOUNDS proves `size >= sizeof(MGPWireRec_X)`, `size <= remaining` and
|
|
// 8-alignment - which is exactly the part a generator can state, because it is the part that
|
|
// follows from the opcode alone. A kVarTail record declaring Count = 4000 while carrying 8
|
|
// bytes passes every one of those, so the SECOND check - recompute the total from the
|
|
// record's own count fields and require it to EQUAL MGPWireRecHeader::Size - belongs to the
|
|
// decoder, which has the payload (MG_Remote/Wire's MGPipeWireRecordLayout, P5 w1).
|
|
//
|
|
// The switch and the opcode enum come from the same list, so a call added to the catalogue
|
|
// cannot be forgotten here; the default arm is for the opcode that never came from this
|
|
// catalogue at all - a byte off a corrupt stream - and it is fatal for the same reason the
|
|
// bounds check is.
|
|
//
|
|
// With no decoder installed - every monolith build, and a split build before
|
|
// ClientSession::Start - this returns false, "this build does not implement it". That is the
|
|
// P0 skeleton's answer, kept deliberately: a codec that has not been installed must not look
|
|
// like one that applied the record.
|
|
inline Bool MGPipeApplyWireRecord(MGPWireOp op, const void* record, Uint64 size, Uint64 remaining) {
|
|
(void)record;
|
|
switch (op) {
|
|
case MGPWireOp::GetCaps:
|
|
MGP_WIRE_CHECK_BOUNDS(MGPWireRec_GetCaps, "GetCaps");
|
|
break;
|
|
case MGPWireOp::ResourceCreate:
|
|
MGP_WIRE_CHECK_BOUNDS(MGPWireRec_ResourceCreate, "ResourceCreate");
|
|
break;
|
|
case MGPWireOp::ResourceRespecify:
|
|
MGP_WIRE_CHECK_BOUNDS(MGPWireRec_ResourceRespecify, "ResourceRespecify");
|
|
break;
|
|
case MGPWireOp::ResourceDestroy:
|
|
MGP_WIRE_CHECK_BOUNDS(MGPWireRec_ResourceDestroy, "ResourceDestroy");
|
|
break;
|
|
case MGPWireOp::MapPersistent:
|
|
MGP_WIRE_CHECK_BOUNDS(MGPWireRec_MapPersistent, "MapPersistent");
|
|
break;
|
|
case MGPWireOp::UnmapPersistent:
|
|
MGP_WIRE_CHECK_BOUNDS(MGPWireRec_UnmapPersistent, "UnmapPersistent");
|
|
break;
|
|
case MGPWireOp::FenceCreate:
|
|
MGP_WIRE_CHECK_BOUNDS(MGPWireRec_FenceCreate, "FenceCreate");
|
|
break;
|
|
case MGPWireOp::FenceStatus:
|
|
MGP_WIRE_CHECK_BOUNDS(MGPWireRec_FenceStatus, "FenceStatus");
|
|
break;
|
|
case MGPWireOp::FenceWait:
|
|
MGP_WIRE_CHECK_BOUNDS(MGPWireRec_FenceWait, "FenceWait");
|
|
break;
|
|
case MGPWireOp::FenceDestroy:
|
|
MGP_WIRE_CHECK_BOUNDS(MGPWireRec_FenceDestroy, "FenceDestroy");
|
|
break;
|
|
case MGPWireOp::QueryCreate:
|
|
MGP_WIRE_CHECK_BOUNDS(MGPWireRec_QueryCreate, "QueryCreate");
|
|
break;
|
|
case MGPWireOp::QueryBegin:
|
|
MGP_WIRE_CHECK_BOUNDS(MGPWireRec_QueryBegin, "QueryBegin");
|
|
break;
|
|
case MGPWireOp::QueryEnd:
|
|
MGP_WIRE_CHECK_BOUNDS(MGPWireRec_QueryEnd, "QueryEnd");
|
|
break;
|
|
case MGPWireOp::QueryAvailable:
|
|
MGP_WIRE_CHECK_BOUNDS(MGPWireRec_QueryAvailable, "QueryAvailable");
|
|
break;
|
|
case MGPWireOp::QueryResult:
|
|
MGP_WIRE_CHECK_BOUNDS(MGPWireRec_QueryResult, "QueryResult");
|
|
break;
|
|
case MGPWireOp::QueryDestroy:
|
|
MGP_WIRE_CHECK_BOUNDS(MGPWireRec_QueryDestroy, "QueryDestroy");
|
|
break;
|
|
case MGPWireOp::CreateRenderState:
|
|
MGP_WIRE_CHECK_BOUNDS(MGPWireRec_CreateRenderState, "CreateRenderState");
|
|
break;
|
|
case MGPWireOp::BindRenderState:
|
|
MGP_WIRE_CHECK_BOUNDS(MGPWireRec_BindRenderState, "BindRenderState");
|
|
break;
|
|
case MGPWireOp::DeleteRenderState:
|
|
MGP_WIRE_CHECK_BOUNDS(MGPWireRec_DeleteRenderState, "DeleteRenderState");
|
|
break;
|
|
case MGPWireOp::CreateVertexElements:
|
|
MGP_WIRE_CHECK_BOUNDS(MGPWireRec_CreateVertexElements, "CreateVertexElements");
|
|
break;
|
|
case MGPWireOp::BindVertexElements:
|
|
MGP_WIRE_CHECK_BOUNDS(MGPWireRec_BindVertexElements, "BindVertexElements");
|
|
break;
|
|
case MGPWireOp::DeleteVertexElements:
|
|
MGP_WIRE_CHECK_BOUNDS(MGPWireRec_DeleteVertexElements, "DeleteVertexElements");
|
|
break;
|
|
case MGPWireOp::CreateSamplerState:
|
|
MGP_WIRE_CHECK_BOUNDS(MGPWireRec_CreateSamplerState, "CreateSamplerState");
|
|
break;
|
|
case MGPWireOp::DeleteSamplerState:
|
|
MGP_WIRE_CHECK_BOUNDS(MGPWireRec_DeleteSamplerState, "DeleteSamplerState");
|
|
break;
|
|
case MGPWireOp::CreateSamplerView:
|
|
MGP_WIRE_CHECK_BOUNDS(MGPWireRec_CreateSamplerView, "CreateSamplerView");
|
|
break;
|
|
case MGPWireOp::DeleteSamplerView:
|
|
MGP_WIRE_CHECK_BOUNDS(MGPWireRec_DeleteSamplerView, "DeleteSamplerView");
|
|
break;
|
|
case MGPWireOp::CreateShaderState:
|
|
MGP_WIRE_CHECK_BOUNDS(MGPWireRec_CreateShaderState, "CreateShaderState");
|
|
break;
|
|
case MGPWireOp::BindShaderState:
|
|
MGP_WIRE_CHECK_BOUNDS(MGPWireRec_BindShaderState, "BindShaderState");
|
|
break;
|
|
case MGPWireOp::DeleteShaderState:
|
|
MGP_WIRE_CHECK_BOUNDS(MGPWireRec_DeleteShaderState, "DeleteShaderState");
|
|
break;
|
|
case MGPWireOp::SetDynamicState:
|
|
MGP_WIRE_CHECK_BOUNDS(MGPWireRec_SetDynamicState, "SetDynamicState");
|
|
break;
|
|
case MGPWireOp::SetFramebufferState:
|
|
MGP_WIRE_CHECK_BOUNDS(MGPWireRec_SetFramebufferState, "SetFramebufferState");
|
|
break;
|
|
case MGPWireOp::SetVertexBuffers:
|
|
MGP_WIRE_CHECK_BOUNDS(MGPWireRec_SetVertexBuffers, "SetVertexBuffers");
|
|
break;
|
|
case MGPWireOp::SetIndexBuffer:
|
|
MGP_WIRE_CHECK_BOUNDS(MGPWireRec_SetIndexBuffer, "SetIndexBuffer");
|
|
break;
|
|
case MGPWireOp::SetIndirectBuffers:
|
|
MGP_WIRE_CHECK_BOUNDS(MGPWireRec_SetIndirectBuffers, "SetIndirectBuffers");
|
|
break;
|
|
case MGPWireOp::SetSamplerViews:
|
|
MGP_WIRE_CHECK_BOUNDS(MGPWireRec_SetSamplerViews, "SetSamplerViews");
|
|
break;
|
|
case MGPWireOp::BindSamplerStates:
|
|
MGP_WIRE_CHECK_BOUNDS(MGPWireRec_BindSamplerStates, "BindSamplerStates");
|
|
break;
|
|
case MGPWireOp::SetShaderImages:
|
|
MGP_WIRE_CHECK_BOUNDS(MGPWireRec_SetShaderImages, "SetShaderImages");
|
|
break;
|
|
case MGPWireOp::SetShaderBuffers:
|
|
MGP_WIRE_CHECK_BOUNDS(MGPWireRec_SetShaderBuffers, "SetShaderBuffers");
|
|
break;
|
|
case MGPWireOp::SetStreamOutputTargets:
|
|
MGP_WIRE_CHECK_BOUNDS(MGPWireRec_SetStreamOutputTargets, "SetStreamOutputTargets");
|
|
break;
|
|
case MGPWireOp::SetGlobalConstants:
|
|
MGP_WIRE_CHECK_BOUNDS(MGPWireRec_SetGlobalConstants, "SetGlobalConstants");
|
|
break;
|
|
case MGPWireOp::SetVertexAttribDefaults:
|
|
MGP_WIRE_CHECK_BOUNDS(MGPWireRec_SetVertexAttribDefaults, "SetVertexAttribDefaults");
|
|
break;
|
|
case MGPWireOp::SetPixelPackState:
|
|
MGP_WIRE_CHECK_BOUNDS(MGPWireRec_SetPixelPackState, "SetPixelPackState");
|
|
break;
|
|
case MGPWireOp::SetPatchState:
|
|
MGP_WIRE_CHECK_BOUNDS(MGPWireRec_SetPatchState, "SetPatchState");
|
|
break;
|
|
case MGPWireOp::SetDrawProgram:
|
|
MGP_WIRE_CHECK_BOUNDS(MGPWireRec_SetDrawProgram, "SetDrawProgram");
|
|
break;
|
|
case MGPWireOp::SetDispatchProgram:
|
|
MGP_WIRE_CHECK_BOUNDS(MGPWireRec_SetDispatchProgram, "SetDispatchProgram");
|
|
break;
|
|
case MGPWireOp::SetResidualValueState:
|
|
MGP_WIRE_CHECK_BOUNDS(MGPWireRec_SetResidualValueState, "SetResidualValueState");
|
|
break;
|
|
case MGPWireOp::SetTextureParams:
|
|
MGP_WIRE_CHECK_BOUNDS(MGPWireRec_SetTextureParams, "SetTextureParams");
|
|
break;
|
|
case MGPWireOp::ResourceSubData:
|
|
MGP_WIRE_CHECK_BOUNDS(MGPWireRec_ResourceSubData, "ResourceSubData");
|
|
break;
|
|
case MGPWireOp::BufferSubDataResident:
|
|
MGP_WIRE_CHECK_BOUNDS(MGPWireRec_BufferSubDataResident, "BufferSubDataResident");
|
|
break;
|
|
case MGPWireOp::ResourceSubDataComplete:
|
|
MGP_WIRE_CHECK_BOUNDS(MGPWireRec_ResourceSubDataComplete, "ResourceSubDataComplete");
|
|
break;
|
|
case MGPWireOp::ResourceFlushRange:
|
|
MGP_WIRE_CHECK_BOUNDS(MGPWireRec_ResourceFlushRange, "ResourceFlushRange");
|
|
break;
|
|
case MGPWireOp::ResourceReadback:
|
|
MGP_WIRE_CHECK_BOUNDS(MGPWireRec_ResourceReadback, "ResourceReadback");
|
|
break;
|
|
case MGPWireOp::ResourceCopyRegion:
|
|
MGP_WIRE_CHECK_BOUNDS(MGPWireRec_ResourceCopyRegion, "ResourceCopyRegion");
|
|
break;
|
|
case MGPWireOp::GenerateMipmap:
|
|
MGP_WIRE_CHECK_BOUNDS(MGPWireRec_GenerateMipmap, "GenerateMipmap");
|
|
break;
|
|
case MGPWireOp::GetTextureImage:
|
|
MGP_WIRE_CHECK_BOUNDS(MGPWireRec_GetTextureImage, "GetTextureImage");
|
|
break;
|
|
case MGPWireOp::Blit:
|
|
MGP_WIRE_CHECK_BOUNDS(MGPWireRec_Blit, "Blit");
|
|
break;
|
|
case MGPWireOp::Clear:
|
|
MGP_WIRE_CHECK_BOUNDS(MGPWireRec_Clear, "Clear");
|
|
break;
|
|
case MGPWireOp::ReadPixels:
|
|
MGP_WIRE_CHECK_BOUNDS(MGPWireRec_ReadPixels, "ReadPixels");
|
|
break;
|
|
case MGPWireOp::DrawVbo:
|
|
MGP_WIRE_CHECK_BOUNDS(MGPWireRec_DrawVbo, "DrawVbo");
|
|
break;
|
|
case MGPWireOp::LaunchGrid:
|
|
MGP_WIRE_CHECK_BOUNDS(MGPWireRec_LaunchGrid, "LaunchGrid");
|
|
break;
|
|
case MGPWireOp::MemoryBarrier:
|
|
MGP_WIRE_CHECK_BOUNDS(MGPWireRec_MemoryBarrier, "MemoryBarrier");
|
|
break;
|
|
case MGPWireOp::BeginStreamOutput:
|
|
MGP_WIRE_CHECK_BOUNDS(MGPWireRec_BeginStreamOutput, "BeginStreamOutput");
|
|
break;
|
|
case MGPWireOp::EndStreamOutput:
|
|
MGP_WIRE_CHECK_BOUNDS(MGPWireRec_EndStreamOutput, "EndStreamOutput");
|
|
break;
|
|
case MGPWireOp::PauseStreamOutput:
|
|
MGP_WIRE_CHECK_BOUNDS(MGPWireRec_PauseStreamOutput, "PauseStreamOutput");
|
|
break;
|
|
case MGPWireOp::ResumeStreamOutput:
|
|
MGP_WIRE_CHECK_BOUNDS(MGPWireRec_ResumeStreamOutput, "ResumeStreamOutput");
|
|
break;
|
|
case MGPWireOp::Flush:
|
|
MGP_WIRE_CHECK_BOUNDS(MGPWireRec_Flush, "Flush");
|
|
break;
|
|
case MGPWireOp::Present:
|
|
MGP_WIRE_CHECK_BOUNDS(MGPWireRec_Present, "Present");
|
|
break;
|
|
case MGPWireOp::SetSwapInterval:
|
|
MGP_WIRE_CHECK_BOUNDS(MGPWireRec_SetSwapInterval, "SetSwapInterval");
|
|
break;
|
|
case MGPWireOp::QueryTimestamp:
|
|
MGP_WIRE_CHECK_BOUNDS(MGPWireRec_QueryTimestamp, "QueryTimestamp");
|
|
break;
|
|
case MGPWireOp::QueryCounter:
|
|
MGP_WIRE_CHECK_BOUNDS(MGPWireRec_QueryCounter, "QueryCounter");
|
|
break;
|
|
case MGPWireOp::FenceWaitServer:
|
|
MGP_WIRE_CHECK_BOUNDS(MGPWireRec_FenceWaitServer, "FenceWaitServer");
|
|
break;
|
|
case MGPWireOp::BindShaderImage:
|
|
MGP_WIRE_CHECK_BOUNDS(MGPWireRec_BindShaderImage, "BindShaderImage");
|
|
break;
|
|
case MGPWireOp::PatchParameter:
|
|
MGP_WIRE_CHECK_BOUNDS(MGPWireRec_PatchParameter, "PatchParameter");
|
|
break;
|
|
case MGPWireOp::BindStreamOutput:
|
|
MGP_WIRE_CHECK_BOUNDS(MGPWireRec_BindStreamOutput, "BindStreamOutput");
|
|
break;
|
|
case MGPWireOp::SetStorageBlockBinding:
|
|
MGP_WIRE_CHECK_BOUNDS(MGPWireRec_SetStorageBlockBinding, "SetStorageBlockBinding");
|
|
break;
|
|
case MGPWireOp::CopyFramebufferToTexture:
|
|
MGP_WIRE_CHECK_BOUNDS(MGPWireRec_CopyFramebufferToTexture, "CopyFramebufferToTexture");
|
|
break;
|
|
case MGPWireOp::kInvalid:
|
|
case MGPWireOp::kOpCount:
|
|
default:
|
|
MGPipeWireProtocolFatal("<unknown opcode>", size, remaining);
|
|
}
|
|
#if MOBILEGL_BUILD_DISAGGREGATED
|
|
if (gMGPipeWireRecordApply != nullptr) {
|
|
return gMGPipeWireRecordApply(op, record, size, remaining);
|
|
}
|
|
#endif
|
|
return false;
|
|
}
|
|
|
|
#undef MGP_WIRE_CHECK_BOUNDS
|
|
|
|
// The ResidualValueBlock layout, from PipeFields.def's
|
|
// MGP_FIELDS_ResidualValueBlock. Retiring a field without lowering
|
|
// MGL_RESIDUAL_BLOCK_SIZE is a build break, which is the point.
|
|
static_assert(offsetof(ResidualValueBlock, CapabilityBits) == 0,
|
|
"the residual block's first member must sit at offset 0");
|
|
static_assert(sizeof(ResidualValueBlock) == MGL_RESIDUAL_BLOCK_SIZE,
|
|
"the residual ratchet only ever goes down");
|