mirror of
https://github.com/godotengine/godot-angle-static.git
synced 2026-01-06 02:09:55 +03:00
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:
committed by
Angle LUCI CQ
parent
99e3e65221
commit
3479f4a180
@@ -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
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user