mirror of
https://github.com/MobileGL-Dev/MobileGL
synced 2026-11-09 11:03:23 +09:00
[MGPipe] carry full mutable mip extents independently of dirty upload boxes
This commit is contained in:
@@ -1249,6 +1249,9 @@ namespace MobileGL::MG_Pipe {
|
|||||||
static_cast<Uint32>(MGPipeResourceTargetForTextureTarget(texture->GetTarget())),
|
static_cast<Uint32>(MGPipeResourceTargetForTextureTarget(texture->GetTarget())),
|
||||||
static_cast<Uint32>(uploadTarget));
|
static_cast<Uint32>(uploadTarget));
|
||||||
m_lastSubData.Level = static_cast<Uint16>(level);
|
m_lastSubData.Level = static_cast<Uint16>(level);
|
||||||
|
m_lastSubData.LevelWidth = static_cast<Uint32>(levelSize.x());
|
||||||
|
m_lastSubData.LevelHeight = static_cast<Uint32>(levelSize.y());
|
||||||
|
m_lastSubData.LevelDepth = static_cast<Uint32>(levelSize.z());
|
||||||
// ALWAYS 1 ON THE CLIENT SIDE. The conversion fallbacks (the packed-norm, widened
|
// ALWAYS 1 ON THE CLIENT SIDE. The conversion fallbacks (the packed-norm, widened
|
||||||
// and fallback upload preparers) are the server's and run there, so the bytes this
|
// and fallback upload preparers) are the server's and run there, so the bytes this
|
||||||
// record declares ARE the level shadow. The server clears the flag internally when
|
// record declares ARE the level shadow. The server clears the flag internally when
|
||||||
|
|||||||
@@ -1290,8 +1290,11 @@ namespace MobileGL::MG_Pipe {
|
|||||||
Uint32 RegionCount; // MGPSubRegion[] in the variable tail
|
Uint32 RegionCount; // MGPSubRegion[] in the variable tail
|
||||||
Uint32 Pad1;
|
Uint32 Pad1;
|
||||||
MGPBlobRef Blob;
|
MGPBlobRef Blob;
|
||||||
|
// Mutable GL images may define a lone mip or a noncanonical mip size.
|
||||||
|
// The dirty box describes changed texels, not the full staged image.
|
||||||
|
Uint32 LevelWidth, LevelHeight, LevelDepth, LevelPad;
|
||||||
};
|
};
|
||||||
MGP_ASSERT_POD(MGPSubData, 72);
|
MGP_ASSERT_POD(MGPSubData, 88);
|
||||||
|
|
||||||
// The one spelling of MGPSubData::Target's encoding, stated above the struct.
|
// The one spelling of MGPSubData::Target's encoding, stated above the struct.
|
||||||
//
|
//
|
||||||
|
|||||||
@@ -2040,6 +2040,15 @@ namespace MobileGL::MG_Remote::Wire {
|
|||||||
// ---- transfer ---------------------------------------------------------------------
|
// ---- transfer ---------------------------------------------------------------------
|
||||||
case MGPWireOp::ResourceSubData: {
|
case MGPWireOp::ResourceSubData: {
|
||||||
const auto& rec = *static_cast<const MGPSubData*>(payload);
|
const auto& rec = *static_cast<const MGPSubData*>(payload);
|
||||||
|
const Bool hasExtent = rec.LevelWidth || rec.LevelHeight || rec.LevelDepth;
|
||||||
|
if (hasExtent && (rec.Target == kMGPipeResourceTargetBuffer || !rec.LevelWidth ||
|
||||||
|
!rec.LevelHeight || !rec.LevelDepth || rec.LevelWidth > 0x7fffffffu ||
|
||||||
|
rec.LevelHeight > 0x7fffffffu || rec.LevelDepth > 0x7fffffffu ||
|
||||||
|
rec.UnionBox.X < 0 || rec.UnionBox.Y < 0 || rec.UnionBox.Z < 0 ||
|
||||||
|
Uint64(rec.UnionBox.X) + rec.UnionBox.W > rec.LevelWidth ||
|
||||||
|
Uint64(rec.UnionBox.Y) + rec.UnionBox.H > rec.LevelHeight ||
|
||||||
|
Uint64(rec.UnionBox.Z) + rec.UnionBox.D > rec.LevelDepth))
|
||||||
|
WireProtocolFatal("ResourceSubData.LevelExtent", "invalid full image extent or dirty box");
|
||||||
// Rule A arms both halves. The buffer half already declared a real size in
|
// Rule A arms both halves. The buffer half already declared a real size in
|
||||||
// monolith and is cross-checked at PipeApply.cpp:702; THE TEXTURE HALF DECLARED 0
|
// monolith and is cross-checked at PipeApply.cpp:702; THE TEXTURE HALF DECLARED 0
|
||||||
// (TextureEmit.h:1265-1267, on the grounds that the byte count was "the server's
|
// (TextureEmit.h:1265-1267, on the grounds that the byte count was "the server's
|
||||||
|
|||||||
Reference in New Issue
Block a user