diff --git a/src/libANGLE/Program.cpp b/src/libANGLE/Program.cpp index 6c3b1578e..ff5a3a1e1 100644 --- a/src/libANGLE/Program.cpp +++ b/src/libANGLE/Program.cpp @@ -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 diff --git a/src/libANGLE/ProgramExecutable.cpp b/src/libANGLE/ProgramExecutable.cpp index f0716f95f..1d8760569 100644 --- a/src/libANGLE/ProgramExecutable.cpp +++ b/src/libANGLE/ProgramExecutable.cpp @@ -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(); @@ -535,7 +532,6 @@ void ProgramExecutable::load(bool isSeparable, gl::BinaryInputStream *stream) { LoadShInterfaceBlock(stream, &shaderStorageBlock); } - mLinkedShaderVersions[shaderType] = stream->readInt(); } } } @@ -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); } } diff --git a/src/libANGLE/ProgramExecutable.h b/src/libANGLE/ProgramExecutable.h index ebcc72821..438954c74 100644 --- a/src/libANGLE/ProgramExecutable.h +++ b/src/libANGLE/ProgramExecutable.h @@ -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 &getProgramInputs() const { return mProgramInputs; } const std::vector &getOutputVariables() const { return mOutputVariables; } @@ -301,7 +301,7 @@ class ProgramExecutable final : public angle::Subject const std::vector &getUniformBlocks() const { return mUniformBlocks; } const UniformBlockBindingMask &getActiveUniformBlockBindings() const { - return mActiveUniformBlockBindings; + return mPODStruct.activeUniformBlockBindings; } const std::vector &getSamplerBindings() const { return mSamplerBindings; } const std::vector &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 linkedShaderVersions; + static_assert(std::is_trivially_copyable>(), + "ShaderMap should be trivial copyable so that we can memcpy"); } mPODStruct; static_assert(std::is_standard_layout(), "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 mActiveImageShaderBits; - bool mCanDrawWith; - // Names and mapped names of output variables that are arrays include [0] in the end, similarly // to uniforms. std::vector mOutputVariables; @@ -605,9 +611,6 @@ class ProgramExecutable final : public angle::Subject std::vector mUniformMappedNames; std::vector mUniformBlocks; - // For faster iteration on the blocks currently being bound. - UniformBlockBindingMask mActiveUniformBlockBindings; - std::vector mAtomicCounterBuffers; std::vector mShaderStorageBlocks; @@ -622,8 +625,6 @@ class ProgramExecutable final : public angle::Subject ShaderMap> mLinkedUniforms; ShaderMap> mLinkedUniformBlocks; - ShaderMap mLinkedShaderVersions; - // Fragment output variable base types: FLOAT, INT, or UINT. Ordered by location. std::vector mOutputVariableTypes;