Move more ProgramExecutable basic type vars to mBasicDataTypeStruct

They can be just load/saved along with mBasicDataTypeStruct, no need to
do them separately:

mLinkedShaderVersions was previously only saved if
it is separate program, now it is always saved along with
mBasicDataTypeStruct, since the extra cost of a few more bytes of memcpy
is ignorable, but will make it more consistent.

mActiveUniformBlockBindings was previously updated instead of load, now
it is load (and verified with ASSERT)

mCanDrawWith was previously updated, now chnaged to load.

Bug: b/275102061
Change-Id: I4e15b955606f34966d56b1c5e3d9d2f22ddeb14d
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/4786308
Reviewed-by: Roman Lavrov <romanl@google.com>
Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org>
Commit-Queue: Charlie Lao <cclao@google.com>
This commit is contained in:
Charlie Lao
2023-08-16 14:43:35 -07:00
committed by Angle LUCI CQ
parent 99e3e65221
commit 3479f4a180
3 changed files with 23 additions and 34 deletions

View File

@@ -2723,7 +2723,7 @@ void Program::bindUniformBlock(UniformBlockIndex uniformBlockIndex, GLuint unifo
{
ASSERT(!mLinkingState);
if (mState.mExecutable->mActiveUniformBlockBindings[uniformBlockIndex.value])
if (mState.mExecutable->mPODStruct.activeUniformBlockBindings[uniformBlockIndex.value])
{
GLuint previousBinding =
mState.mExecutable->mUniformBlocks[uniformBlockIndex.value].binding;
@@ -2740,8 +2740,8 @@ void Program::bindUniformBlock(UniformBlockIndex uniformBlockIndex, GLuint unifo
mUniformBlockBindingMasks.resize(uniformBlockBinding + 1, UniformBlockBindingMask());
}
mUniformBlockBindingMasks[uniformBlockBinding].set(uniformBlockIndex.value);
mState.mExecutable->mActiveUniformBlockBindings.set(uniformBlockIndex.value,
uniformBlockBinding != 0);
mState.mExecutable->mPODStruct.activeUniformBlockBindings.set(uniformBlockIndex.value,
uniformBlockBinding != 0);
mDirtyBits.set(DIRTY_BIT_UNIFORM_BLOCK_BINDING_0 + uniformBlockIndex.value);
}
@@ -3802,8 +3802,6 @@ angle::Result Program::deserialize(const Context *context,
mState.mExecutable->updateTransformFeedbackStrides();
}
mState.mExecutable->updateCanDrawWith();
if (context->getShareGroup()->getFrameCaptureShared()->enabled())
{
// Extract the source for each stage from the program binary

View File

@@ -276,7 +276,7 @@ void LoadUniforms(BinaryInputStream *stream,
ProgramExecutable::PODStruct::PODStruct() = default;
ProgramExecutable::PODStruct::PODStruct(const PODStruct &other) = default;
ProgramExecutable::ProgramExecutable() : mActiveSamplerRefCounts{}, mCanDrawWith(false)
ProgramExecutable::ProgramExecutable() : mActiveSamplerRefCounts{}
{
memset(&mPODStruct, 0, sizeof(mPODStruct));
mPODStruct.geometryShaderInputPrimitiveType = PrimitiveMode::Triangles;
@@ -297,7 +297,6 @@ ProgramExecutable::ProgramExecutable(const ProgramExecutable &other)
mActiveSamplerShaderBits(other.mActiveSamplerShaderBits),
mActiveImagesMask(other.mActiveImagesMask),
mActiveImageShaderBits(other.mActiveImageShaderBits),
mCanDrawWith(other.mCanDrawWith),
mOutputVariables(other.mOutputVariables),
mOutputLocations(other.mOutputLocations),
mSecondaryOutputLocations(other.mSecondaryOutputLocations),
@@ -308,7 +307,6 @@ ProgramExecutable::ProgramExecutable(const ProgramExecutable &other)
mUniformNames(other.mUniformNames),
mUniformMappedNames(other.mUniformMappedNames),
mUniformBlocks(other.mUniformBlocks),
mActiveUniformBlockBindings(other.mActiveUniformBlockBindings),
mAtomicCounterBuffers(other.mAtomicCounterBuffers),
mShaderStorageBlocks(other.mShaderStorageBlocks)
{
@@ -370,7 +368,6 @@ void ProgramExecutable::reset(bool clearInfoLog)
mUniformNames.clear();
mUniformMappedNames.clear();
mUniformBlocks.clear();
mActiveUniformBlockBindings.reset();
mShaderStorageBlocks.clear();
mAtomicCounterBuffers.clear();
mOutputVariables.clear();
@@ -403,8 +400,8 @@ void ProgramExecutable::load(bool isSeparable, gl::BinaryInputStream *stream)
{
InterfaceBlock &uniformBlock = mUniformBlocks[uniformBlockIndex];
LoadInterfaceBlock(stream, &uniformBlock);
mActiveUniformBlockBindings.set(uniformBlockIndex, uniformBlock.binding != 0);
ASSERT(mPODStruct.activeUniformBlockBindings.test(uniformBlockIndex) ==
(uniformBlock.binding != 0));
}
size_t shaderStorageBlockCount = stream->readInt<size_t>();
@@ -535,7 +532,6 @@ void ProgramExecutable::load(bool isSeparable, gl::BinaryInputStream *stream)
{
LoadShInterfaceBlock(stream, &shaderStorageBlock);
}
mLinkedShaderVersions[shaderType] = stream->readInt<int>();
}
}
}
@@ -658,7 +654,6 @@ void ProgramExecutable::save(bool isSeparable, gl::BinaryOutputStream *stream) c
{
WriteShInterfaceBlock(stream, shaderStorageBlock);
}
stream->writeInt(mLinkedShaderVersions[shaderType]);
}
}
}
@@ -814,22 +809,17 @@ void ProgramExecutable::setSamplerUniformTextureTypeAndFormat(
}
}
void ProgramExecutable::updateCanDrawWith()
{
mCanDrawWith = hasLinkedShaderStage(ShaderType::Vertex);
}
void ProgramExecutable::saveLinkedStateInfo(const Context *context, const ProgramState &state)
{
for (ShaderType shaderType : getLinkedShaderStages())
{
Shader *shader = state.getAttachedShader(shaderType);
ASSERT(shader);
mLinkedOutputVaryings[shaderType] = shader->getOutputVaryings(context);
mLinkedInputVaryings[shaderType] = shader->getInputVaryings(context);
mLinkedShaderVersions[shaderType] = shader->getShaderVersion(context);
mLinkedUniforms[shaderType] = shader->getUniforms(context);
mLinkedUniformBlocks[shaderType] = shader->getUniformBlocks(context);
mPODStruct.linkedShaderVersions[shaderType] = shader->getShaderVersion(context);
mLinkedOutputVaryings[shaderType] = shader->getOutputVaryings(context);
mLinkedInputVaryings[shaderType] = shader->getInputVaryings(context);
mLinkedUniforms[shaderType] = shader->getUniforms(context);
mLinkedUniformBlocks[shaderType] = shader->getUniformBlocks(context);
}
}

View File

@@ -285,8 +285,8 @@ class ProgramExecutable final : public angle::Subject
// Count the number of uniform and storage buffer declarations, counting arrays as one.
size_t getTransformFeedbackBufferCount() const { return mTransformFeedbackStrides.size(); }
void updateCanDrawWith();
bool hasVertexShader() const { return mCanDrawWith; }
void updateCanDrawWith() { mPODStruct.canDrawWith = hasLinkedShaderStage(ShaderType::Vertex); }
bool hasVertexShader() const { return mPODStruct.canDrawWith; }
const std::vector<ProgramInput> &getProgramInputs() const { return mProgramInputs; }
const std::vector<sh::ShaderVariable> &getOutputVariables() const { return mOutputVariables; }
@@ -301,7 +301,7 @@ class ProgramExecutable final : public angle::Subject
const std::vector<InterfaceBlock> &getUniformBlocks() const { return mUniformBlocks; }
const UniformBlockBindingMask &getActiveUniformBlockBindings() const
{
return mActiveUniformBlockBindings;
return mPODStruct.activeUniformBlockBindings;
}
const std::vector<SamplerBinding> &getSamplerBindings() const { return mSamplerBindings; }
const std::vector<ImageBinding> &getImageBindings() const { return mImageBindings; }
@@ -409,7 +409,7 @@ class ProgramExecutable final : public angle::Subject
int getLinkedShaderVersion(ShaderType shaderType) const
{
return mLinkedShaderVersions[shaderType];
return mPODStruct.linkedShaderVersions[shaderType];
}
bool isYUVOutput() const { return mPODStruct.hasYUVOutput; }
@@ -540,6 +540,7 @@ class ProgramExecutable final : public angle::Subject
bool hasDiscard;
bool hasYUVOutput;
bool enablesPerSampleShading;
bool canDrawWith;
// KHR_blend_equation_advanced supported equation list
BlendEquationBitSet advancedBlendEquations;
@@ -558,6 +559,13 @@ class ProgramExecutable final : public angle::Subject
GLenum tessGenPointMode;
GLenum transformFeedbackBufferMode;
// For faster iteration on the blocks currently being bound.
UniformBlockBindingMask activeUniformBlockBindings;
ShaderMap<int> linkedShaderVersions;
static_assert(std::is_trivially_copyable<ShaderMap<int>>(),
"ShaderMap<int> should be trivial copyable so that we can memcpy");
} mPODStruct;
static_assert(std::is_standard_layout<PODStruct>(),
"PODStruct must be a standard layout struct so that we can memcpy");
@@ -574,8 +582,6 @@ class ProgramExecutable final : public angle::Subject
ActiveTextureMask mActiveImagesMask;
ActiveTextureArray<ShaderBitSet> mActiveImageShaderBits;
bool mCanDrawWith;
// Names and mapped names of output variables that are arrays include [0] in the end, similarly
// to uniforms.
std::vector<sh::ShaderVariable> mOutputVariables;
@@ -605,9 +611,6 @@ class ProgramExecutable final : public angle::Subject
std::vector<std::string> mUniformMappedNames;
std::vector<InterfaceBlock> mUniformBlocks;
// For faster iteration on the blocks currently being bound.
UniformBlockBindingMask mActiveUniformBlockBindings;
std::vector<AtomicCounterBuffer> mAtomicCounterBuffers;
std::vector<InterfaceBlock> mShaderStorageBlocks;
@@ -622,8 +625,6 @@ class ProgramExecutable final : public angle::Subject
ShaderMap<std::vector<sh::ShaderVariable>> mLinkedUniforms;
ShaderMap<std::vector<sh::InterfaceBlock>> mLinkedUniformBlocks;
ShaderMap<int> mLinkedShaderVersions;
// Fragment output variable base types: FLOAT, INT, or UINT. Ordered by location.
std::vector<GLenum> mOutputVariableTypes;