Commit b2e76cf5 by Tim Van Patten Committed by Commit Bot

Save/Load missing members

There are several class/struct members that are missing when a program is serialized/deserialized. This leads to errors when attempting to link programs that have been deserialized. For example, when drawing with a PPO that contains programs which were created with glProgramBinary(). This CL adds saving/loading the missing members. Bug: b/182409935 Change-Id: I637c6cd8c174acd6da8d51433893323a32e5d7c0 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/2770683 Commit-Queue: Tim Van Patten <timvp@google.com> Reviewed-by: 's avatarJamie Madill <jmadill@chromium.org> Reviewed-by: 's avatarShahbaz Youssefi <syoussefi@chromium.org> Reviewed-by: 's avatarCody Northrop <cnorthrop@google.com>
parent 4386840c
......@@ -935,49 +935,66 @@ void WriteShaderVar(BinaryOutputStream *stream, const sh::ShaderVariable &var)
stream->writeIntVector(var.arraySizes);
stream->writeBool(var.staticUse);
stream->writeBool(var.active);
stream->writeInt(var.binding);
stream->writeInt<size_t>(var.fields.size());
for (const sh::ShaderVariable &shaderVariable : var.fields)
{
WriteShaderVar(stream, shaderVariable);
}
stream->writeString(var.structOrBlockName);
stream->writeString(var.mappedStructOrBlockName);
stream->writeInt(var.hasParentArrayIndex() ? var.parentArrayIndex() : -1);
stream->writeBool(var.isRowMajorLayout);
stream->writeInt(var.location);
stream->writeBool(var.hasImplicitLocation);
stream->writeInt(var.binding);
stream->writeInt(var.imageUnitFormat);
stream->writeInt(var.offset);
stream->writeBool(var.readonly);
stream->writeBool(var.writeonly);
stream->writeBool(var.isFragmentInOut);
if (var.isFragmentInOut)
{
stream->writeInt(var.location);
}
stream->writeInt(var.index);
stream->writeBool(var.yuv);
stream->writeEnum(var.interpolation);
stream->writeBool(var.isInvariant);
stream->writeBool(var.isShaderIOBlock);
stream->writeBool(var.isPatch);
stream->writeBool(var.texelFetchStaticUse);
ASSERT(var.fields.empty());
stream->writeInt(var.getFlattenedOffsetInParentArrays());
}
void LoadShaderVar(BinaryInputStream *stream, sh::ShaderVariable *var)
void LoadShaderVar(gl::BinaryInputStream *stream, sh::ShaderVariable *var)
{
var->type = stream->readInt<GLenum>();
var->precision = stream->readInt<GLenum>();
var->name = stream->readString();
var->mappedName = stream->readString();
var->type = stream->readInt<GLenum>();
var->precision = stream->readInt<GLenum>();
stream->readString(&var->name);
stream->readString(&var->mappedName);
stream->readIntVector<unsigned int>(&var->arraySizes);
var->staticUse = stream->readBool();
var->active = stream->readBool();
var->binding = stream->readInt<int>();
var->structOrBlockName = stream->readString();
var->mappedStructOrBlockName = stream->readString();
var->setParentArrayIndex(stream->readInt<int>());
var->imageUnitFormat = stream->readInt<GLenum>();
var->offset = stream->readInt<int>();
var->readonly = stream->readBool();
var->writeonly = stream->readBool();
var->isFragmentInOut = stream->readBool();
if (var->isFragmentInOut)
{
var->location = stream->readInt<int>();
}
var->staticUse = stream->readBool();
var->active = stream->readBool();
size_t elementCount = stream->readInt<size_t>();
var->fields.resize(elementCount);
for (sh::ShaderVariable &variable : var->fields)
{
LoadShaderVar(stream, &variable);
}
stream->readString(&var->structOrBlockName);
stream->readString(&var->mappedStructOrBlockName);
var->isRowMajorLayout = stream->readBool();
var->location = stream->readInt<int>();
var->hasImplicitLocation = stream->readBool();
var->binding = stream->readInt<int>();
var->imageUnitFormat = stream->readInt<GLenum>();
var->offset = stream->readInt<int>();
var->readonly = stream->readBool();
var->writeonly = stream->readBool();
var->isFragmentInOut = stream->readBool();
var->index = stream->readInt<int>();
var->yuv = stream->readBool();
var->interpolation = stream->readEnum<sh::InterpolationType>();
var->isInvariant = stream->readBool();
var->isShaderIOBlock = stream->readBool();
var->isPatch = stream->readBool();
var->texelFetchStaticUse = stream->readBool();
var->setParentArrayIndex(stream->readInt<int>());
}
// VariableLocation implementation.
......@@ -4673,6 +4690,8 @@ angle::Result Program::serialize(const Context *context, angle::MemoryBuffer *bi
stream.writeInt(mState.getAtomicCounterUniformRange().low());
stream.writeInt(mState.getAtomicCounterUniformRange().high());
stream.writeBool(mState.mSeparable);
mProgram->save(context, &stream);
ASSERT(binaryOut);
......@@ -4758,6 +4777,8 @@ angle::Result Program::deserialize(const Context *context,
unsigned int atomicCounterRangeHigh = stream.readInt<unsigned int>();
mState.mAtomicCounterUniformRange = RangeUI(atomicCounterRangeLow, atomicCounterRangeHigh);
mState.mSeparable = stream.readBool();
static_assert(static_cast<unsigned long>(ShaderType::EnumCount) <= sizeof(unsigned long) * 8,
"Too many shader types");
......
......@@ -414,6 +414,35 @@ void ProgramExecutable::load(gl::BinaryInputStream *stream)
mGraphicsImageBindings.emplace_back(imageBinding);
}
}
for (ShaderType shaderType : mLinkedGraphicsShaderStages)
{
mLinkedOutputVaryings[shaderType].resize(stream->readInt<size_t>());
for (sh::ShaderVariable &variable : mLinkedOutputVaryings[shaderType])
{
LoadShaderVar(stream, &variable);
}
mLinkedInputVaryings[shaderType].resize(stream->readInt<size_t>());
for (sh::ShaderVariable &variable : mLinkedInputVaryings[shaderType])
{
LoadShaderVar(stream, &variable);
}
mLinkedShaderVersions[shaderType] = stream->readInt<int>();
}
for (ShaderType shaderType : mLinkedComputeShaderStages)
{
mLinkedOutputVaryings[shaderType].resize(stream->readInt<size_t>());
for (sh::ShaderVariable &variable : mLinkedOutputVaryings[shaderType])
{
LoadShaderVar(stream, &variable);
}
mLinkedInputVaryings[shaderType].resize(stream->readInt<size_t>());
for (sh::ShaderVariable &variable : mLinkedInputVaryings[shaderType])
{
LoadShaderVar(stream, &variable);
}
mLinkedShaderVersions[shaderType] = stream->readInt<int>();
}
}
void ProgramExecutable::save(gl::BinaryOutputStream *stream) const
......@@ -467,8 +496,6 @@ void ProgramExecutable::save(gl::BinaryOutputStream *stream) const
{
WriteShaderVar(stream, uniform);
// FIXME: referenced
stream->writeInt(uniform.bufferIndex);
WriteBlockMemberInfo(stream, uniform.blockInfo);
......@@ -563,6 +590,35 @@ void ProgramExecutable::save(gl::BinaryOutputStream *stream) const
stream->writeInt(imageBinding.boundImageUnits[i]);
}
}
for (ShaderType shaderType : mLinkedGraphicsShaderStages)
{
stream->writeInt(mLinkedOutputVaryings[shaderType].size());
for (const sh::ShaderVariable &shaderVariable : mLinkedOutputVaryings[shaderType])
{
WriteShaderVar(stream, shaderVariable);
}
stream->writeInt(mLinkedInputVaryings[shaderType].size());
for (const sh::ShaderVariable &shaderVariable : mLinkedInputVaryings[shaderType])
{
WriteShaderVar(stream, shaderVariable);
}
stream->writeInt(mLinkedShaderVersions[shaderType]);
}
for (ShaderType shaderType : mLinkedComputeShaderStages)
{
stream->writeInt(mLinkedOutputVaryings[shaderType].size());
for (const sh::ShaderVariable &shaderVariable : mLinkedOutputVaryings[shaderType])
{
WriteShaderVar(stream, shaderVariable);
}
stream->writeInt(mLinkedInputVaryings[shaderType].size());
for (const sh::ShaderVariable &shaderVariable : mLinkedInputVaryings[shaderType])
{
WriteShaderVar(stream, shaderVariable);
}
stream->writeInt(mLinkedShaderVersions[shaderType]);
}
}
int ProgramExecutable::getInfoLogLength() const
......
......@@ -282,6 +282,7 @@ std::unique_ptr<rx::LinkEvent> ProgramExecutableVk::load(gl::BinaryInputStream *
info.binding = stream->readInt<uint32_t>();
info.location = stream->readInt<uint32_t>();
info.component = stream->readInt<uint32_t>();
info.index = stream->readInt<uint32_t>();
// PackedEnumBitSet uses uint8_t
info.activeStages = gl::ShaderBitSet(stream->readInt<uint8_t>());
LoadShaderInterfaceVariableXfbInfo(stream, &info.xfb);
......@@ -316,6 +317,7 @@ void ProgramExecutableVk::save(gl::BinaryOutputStream *stream)
stream->writeInt(info.binding);
stream->writeInt(info.location);
stream->writeInt(info.component);
stream->writeInt(info.index);
// PackedEnumBitSet uses uint8_t
stream->writeInt(info.activeStages.bits());
SaveShaderInterfaceVariableXfbInfo(info.xfb, stream);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment