Commit 77851053 by Tim Van Patten Committed by Commit Bot

Reduce dependency on ProgramExecutable::mProgram[Pipeline]State

Remove the dependency on mProgramState/mProgramPipelineState for the following functions in ProgramExecutable: hasUniformBuffers() hasStorageBuffers() hasAtomicCounterBuffers() hasTransformFeedbackOutput() getTransformFeedbackBufferCount() The data structures those function were querying were recently moved into the ProgramExecutable, so the call stack was: ProgramExecutable -> ProgramState -> ProgramExecutable This change updates the functions to return the results immediately. Remaining functions to be cleaned up in later CLs: hasDefaultUniforms() hasTextures() hasImages() Bug: angleproject:4520 Test: Build/CQ Change-Id: Ieaa041ff128e389f322745d55f688d4b07a5a23d Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/2216764Reviewed-by: 's avatarJamie Madill <jmadill@chromium.org> Reviewed-by: 's avatarShahbaz Youssefi <syoussefi@chromium.org> Commit-Queue: Tim Van Patten <timvp@google.com>
parent 550bc069
...@@ -1118,11 +1118,6 @@ Shader *ProgramState::getAttachedShader(ShaderType shaderType) const ...@@ -1118,11 +1118,6 @@ Shader *ProgramState::getAttachedShader(ShaderType shaderType) const
return mAttachedShaders[shaderType]; return mAttachedShaders[shaderType];
} }
size_t ProgramState::getTransformFeedbackBufferCount() const
{
return mExecutable->mTransformFeedbackStrides.size();
}
GLuint ProgramState::getUniformIndexFromName(const std::string &name) const GLuint ProgramState::getUniformIndexFromName(const std::string &name) const
{ {
return GetResourceIndexFromName(mExecutable->mUniforms, name); return GetResourceIndexFromName(mExecutable->mUniforms, name);
......
...@@ -279,9 +279,6 @@ class ProgramState final : angle::NonCopyable ...@@ -279,9 +279,6 @@ class ProgramState final : angle::NonCopyable
return mExecutable->getAtomicCounterBuffers(); return mExecutable->getAtomicCounterBuffers();
} }
// Count the number of uniform and storage buffer declarations, counting arrays as one.
size_t getTransformFeedbackBufferCount() const;
GLuint getUniformIndexFromName(const std::string &name) const; GLuint getUniformIndexFromName(const std::string &name) const;
GLuint getUniformIndexFromLocation(UniformLocation location) const; GLuint getUniformIndexFromLocation(UniformLocation location) const;
Optional<GLuint> getSamplerIndex(UniformLocation location) const; Optional<GLuint> getSamplerIndex(UniformLocation location) const;
...@@ -321,14 +318,7 @@ class ProgramState final : angle::NonCopyable ...@@ -321,14 +318,7 @@ class ProgramState final : angle::NonCopyable
bool hasDefaultUniforms() const { return !getDefaultUniformRange().empty(); } bool hasDefaultUniforms() const { return !getDefaultUniformRange().empty(); }
bool hasTextures() const { return !getSamplerBindings().empty(); } bool hasTextures() const { return !getSamplerBindings().empty(); }
bool hasUniformBuffers() const { return !getUniformBlocks().empty(); }
bool hasStorageBuffers() const { return !getShaderStorageBlocks().empty(); }
bool hasAtomicCounterBuffers() const { return !getAtomicCounterBuffers().empty(); }
bool hasImages() const { return !getImageBindings().empty(); } bool hasImages() const { return !getImageBindings().empty(); }
bool hasTransformFeedbackOutput() const
{
return !getLinkedTransformFeedbackVaryings().empty();
}
bool hasEarlyFragmentTestsOptimization() const { return mEarlyFramentTestsOptimization; } bool hasEarlyFragmentTestsOptimization() const { return mEarlyFramentTestsOptimization; }
bool isShaderMarkedForDetach(gl::ShaderType shaderType) const bool isShaderMarkedForDetach(gl::ShaderType shaderType) const
......
...@@ -28,7 +28,13 @@ ProgramExecutable::ProgramExecutable() ...@@ -28,7 +28,13 @@ ProgramExecutable::ProgramExecutable()
mCanDrawWith(false), mCanDrawWith(false),
mTransformFeedbackBufferMode(GL_INTERLEAVED_ATTRIBS), mTransformFeedbackBufferMode(GL_INTERLEAVED_ATTRIBS),
mSamplerUniformRange(0, 0), mSamplerUniformRange(0, 0),
mImageUniformRange(0, 0) mImageUniformRange(0, 0),
mPipelineHasGraphicsUniformBuffers(false),
mPipelineHasComputeUniformBuffers(false),
mPipelineHasGraphicsStorageBuffers(false),
mPipelineHasComputeStorageBuffers(false),
mPipelineHasGraphicsAtomicCounterBuffers(false),
mPipelineHasComputeAtomicCounterBuffers(false)
{ {
reset(); reset();
} }
...@@ -61,7 +67,13 @@ ProgramExecutable::ProgramExecutable(const ProgramExecutable &other) ...@@ -61,7 +67,13 @@ ProgramExecutable::ProgramExecutable(const ProgramExecutable &other)
mUniformBlocks(other.mUniformBlocks), mUniformBlocks(other.mUniformBlocks),
mAtomicCounterBuffers(other.mAtomicCounterBuffers), mAtomicCounterBuffers(other.mAtomicCounterBuffers),
mImageUniformRange(other.mImageUniformRange), mImageUniformRange(other.mImageUniformRange),
mShaderStorageBlocks(other.mShaderStorageBlocks) mShaderStorageBlocks(other.mShaderStorageBlocks),
mPipelineHasGraphicsUniformBuffers(other.mPipelineHasGraphicsUniformBuffers),
mPipelineHasComputeUniformBuffers(other.mPipelineHasComputeUniformBuffers),
mPipelineHasGraphicsStorageBuffers(other.mPipelineHasGraphicsStorageBuffers),
mPipelineHasComputeStorageBuffers(other.mPipelineHasComputeStorageBuffers),
mPipelineHasGraphicsAtomicCounterBuffers(other.mPipelineHasGraphicsAtomicCounterBuffers),
mPipelineHasComputeAtomicCounterBuffers(other.mPipelineHasComputeAtomicCounterBuffers)
{ {
reset(); reset();
} }
...@@ -91,6 +103,13 @@ void ProgramExecutable::reset() ...@@ -91,6 +103,13 @@ void ProgramExecutable::reset()
mAtomicCounterBuffers.clear(); mAtomicCounterBuffers.clear();
mOutputVariables.clear(); mOutputVariables.clear();
mOutputLocations.clear(); mOutputLocations.clear();
mPipelineHasGraphicsUniformBuffers = false;
mPipelineHasComputeUniformBuffers = false;
mPipelineHasGraphicsStorageBuffers = false;
mPipelineHasComputeStorageBuffers = false;
mPipelineHasGraphicsAtomicCounterBuffers = false;
mPipelineHasComputeAtomicCounterBuffers = false;
} }
void ProgramExecutable::load(gl::BinaryInputStream *stream) void ProgramExecutable::load(gl::BinaryInputStream *stream)
...@@ -105,6 +124,13 @@ void ProgramExecutable::load(gl::BinaryInputStream *stream) ...@@ -105,6 +124,13 @@ void ProgramExecutable::load(gl::BinaryInputStream *stream)
mLinkedGraphicsShaderStages = ShaderBitSet(stream->readInt<uint8_t>()); mLinkedGraphicsShaderStages = ShaderBitSet(stream->readInt<uint8_t>());
mLinkedComputeShaderStages = ShaderBitSet(stream->readInt<uint8_t>()); mLinkedComputeShaderStages = ShaderBitSet(stream->readInt<uint8_t>());
mPipelineHasGraphicsUniformBuffers = stream->readBool();
mPipelineHasComputeUniformBuffers = stream->readBool();
mPipelineHasGraphicsStorageBuffers = stream->readBool();
mPipelineHasComputeStorageBuffers = stream->readBool();
mPipelineHasGraphicsAtomicCounterBuffers = stream->readBool();
mPipelineHasComputeAtomicCounterBuffers = stream->readBool();
} }
void ProgramExecutable::save(gl::BinaryOutputStream *stream) const void ProgramExecutable::save(gl::BinaryOutputStream *stream) const
...@@ -118,6 +144,13 @@ void ProgramExecutable::save(gl::BinaryOutputStream *stream) const ...@@ -118,6 +144,13 @@ void ProgramExecutable::save(gl::BinaryOutputStream *stream) const
stream->writeInt(mLinkedGraphicsShaderStages.bits()); stream->writeInt(mLinkedGraphicsShaderStages.bits());
stream->writeInt(mLinkedComputeShaderStages.bits()); stream->writeInt(mLinkedComputeShaderStages.bits());
stream->writeInt(static_cast<bool>(mPipelineHasGraphicsUniformBuffers));
stream->writeInt(static_cast<bool>(mPipelineHasComputeUniformBuffers));
stream->writeInt(static_cast<bool>(mPipelineHasGraphicsStorageBuffers));
stream->writeInt(static_cast<bool>(mPipelineHasComputeStorageBuffers));
stream->writeInt(static_cast<bool>(mPipelineHasGraphicsAtomicCounterBuffers));
stream->writeInt(static_cast<bool>(mPipelineHasComputeAtomicCounterBuffers));
} }
const ProgramState *ProgramExecutable::getProgramState(ShaderType shaderType) const const ProgramState *ProgramExecutable::getProgramState(ShaderType shaderType) const
...@@ -190,6 +223,7 @@ AttributesMask ProgramExecutable::getAttributesMask() const ...@@ -190,6 +223,7 @@ AttributesMask ProgramExecutable::getAttributesMask() const
return mAttributesMask; return mAttributesMask;
} }
// TODO: http://anglebug.com/4520: Needs mDefaultUniformRange moved to ProgramExecutable
bool ProgramExecutable::hasDefaultUniforms() const bool ProgramExecutable::hasDefaultUniforms() const
{ {
ASSERT(mProgramState || mProgramPipelineState); ASSERT(mProgramState || mProgramPipelineState);
...@@ -201,6 +235,7 @@ bool ProgramExecutable::hasDefaultUniforms() const ...@@ -201,6 +235,7 @@ bool ProgramExecutable::hasDefaultUniforms() const
return mProgramPipelineState->hasDefaultUniforms(); return mProgramPipelineState->hasDefaultUniforms();
} }
// TODO: http://anglebug.com/4520: Needs mSamplerBindings moved to ProgramExecutable
bool ProgramExecutable::hasTextures() const bool ProgramExecutable::hasTextures() const
{ {
ASSERT(mProgramState || mProgramPipelineState); ASSERT(mProgramState || mProgramPipelineState);
...@@ -212,39 +247,28 @@ bool ProgramExecutable::hasTextures() const ...@@ -212,39 +247,28 @@ bool ProgramExecutable::hasTextures() const
return mProgramPipelineState->hasTextures(); return mProgramPipelineState->hasTextures();
} }
// TODO: http://anglebug.com/3570: Remove mHas*UniformBuffers once PPO's have valid data in
// mUniformBlocks
bool ProgramExecutable::hasUniformBuffers() const bool ProgramExecutable::hasUniformBuffers() const
{ {
ASSERT(mProgramState || mProgramPipelineState); return !getUniformBlocks().empty() ||
if (mProgramState) (isCompute() ? mPipelineHasComputeUniformBuffers : mPipelineHasGraphicsUniformBuffers);
{
return mProgramState->hasUniformBuffers();
}
return mProgramPipelineState->hasUniformBuffers();
} }
bool ProgramExecutable::hasStorageBuffers() const bool ProgramExecutable::hasStorageBuffers() const
{ {
ASSERT(mProgramState || mProgramPipelineState); return !getShaderStorageBlocks().empty() ||
if (mProgramState) (isCompute() ? mPipelineHasComputeStorageBuffers : mPipelineHasGraphicsStorageBuffers);
{
return mProgramState->hasStorageBuffers();
}
return mProgramPipelineState->hasStorageBuffers();
} }
bool ProgramExecutable::hasAtomicCounterBuffers() const bool ProgramExecutable::hasAtomicCounterBuffers() const
{ {
ASSERT(mProgramState || mProgramPipelineState); return !getAtomicCounterBuffers().empty() ||
if (mProgramState) (isCompute() ? mPipelineHasComputeAtomicCounterBuffers
{ : mPipelineHasGraphicsAtomicCounterBuffers);
return mProgramState->hasAtomicCounterBuffers();
}
return mProgramPipelineState->hasAtomicCounterBuffers();
} }
// TODO: http://anglebug.com/4520: Needs mImageBindings moved to ProgramExecutable
bool ProgramExecutable::hasImages() const bool ProgramExecutable::hasImages() const
{ {
ASSERT(mProgramState || mProgramPipelineState); ASSERT(mProgramState || mProgramPipelineState);
...@@ -256,30 +280,6 @@ bool ProgramExecutable::hasImages() const ...@@ -256,30 +280,6 @@ bool ProgramExecutable::hasImages() const
return mProgramPipelineState->hasImages(); return mProgramPipelineState->hasImages();
} }
bool ProgramExecutable::hasTransformFeedbackOutput() const
{
ASSERT(mProgramState || mProgramPipelineState);
if (mProgramState)
{
return mProgramState->hasTransformFeedbackOutput();
}
return mProgramPipelineState->hasTransformFeedbackOutput();
}
size_t ProgramExecutable::getTransformFeedbackBufferCount(const gl::State &glState) const
{
ASSERT(mProgramState || mProgramPipelineState);
if (mProgramState)
{
return mProgramState->getTransformFeedbackBufferCount();
}
// TODO(timvp): http://anglebug.com/3570: Support program pipelines
return 0;
}
void ProgramExecutable::updateActiveSamplers(const ProgramState &programState) void ProgramExecutable::updateActiveSamplers(const ProgramState &programState)
{ {
const std::vector<SamplerBinding> &samplerBindings = programState.getSamplerBindings(); const std::vector<SamplerBinding> &samplerBindings = programState.getSamplerBindings();
......
...@@ -189,10 +189,13 @@ class ProgramExecutable ...@@ -189,10 +189,13 @@ class ProgramExecutable
bool hasStorageBuffers() const; bool hasStorageBuffers() const;
bool hasAtomicCounterBuffers() const; bool hasAtomicCounterBuffers() const;
bool hasImages() const; bool hasImages() const;
bool hasTransformFeedbackOutput() const; bool hasTransformFeedbackOutput() const
{
return !getLinkedTransformFeedbackVaryings().empty();
}
// Count the number of uniform and storage buffer declarations, counting arrays as one. // Count the number of uniform and storage buffer declarations, counting arrays as one.
size_t getTransformFeedbackBufferCount(const gl::State &glState) const; size_t getTransformFeedbackBufferCount() const { return mTransformFeedbackStrides.size(); }
bool linkValidateGlobalNames(InfoLog &infoLog) const; bool linkValidateGlobalNames(InfoLog &infoLog) const;
...@@ -355,6 +358,15 @@ class ProgramExecutable ...@@ -355,6 +358,15 @@ class ProgramExecutable
RangeUI mImageUniformRange; RangeUI mImageUniformRange;
std::vector<InterfaceBlock> mShaderStorageBlocks; std::vector<InterfaceBlock> mShaderStorageBlocks;
// TODO: http://anglebug.com/3570: Remove mPipelineHas*UniformBuffers once PPO's have valid data
// in mUniformBlocks
bool mPipelineHasGraphicsUniformBuffers;
bool mPipelineHasComputeUniformBuffers;
bool mPipelineHasGraphicsStorageBuffers;
bool mPipelineHasComputeStorageBuffers;
bool mPipelineHasGraphicsAtomicCounterBuffers;
bool mPipelineHasComputeAtomicCounterBuffers;
ShaderMap<std::vector<sh::ShaderVariable>> mLinkedOutputVaryings; ShaderMap<std::vector<sh::ShaderVariable>> mLinkedOutputVaryings;
ShaderMap<std::vector<sh::ShaderVariable>> mLinkedInputVaryings; ShaderMap<std::vector<sh::ShaderVariable>> mLinkedInputVaryings;
ShaderMap<int> mLinkedShaderVersions; ShaderMap<int> mLinkedShaderVersions;
......
...@@ -152,48 +152,6 @@ bool ProgramPipelineState::hasTextures() const ...@@ -152,48 +152,6 @@ bool ProgramPipelineState::hasTextures() const
return false; return false;
} }
bool ProgramPipelineState::hasUniformBuffers() const
{
for (const gl::ShaderType shaderType : mExecutable->getLinkedShaderStages())
{
const Program *shaderProgram = getShaderProgram(shaderType);
if (shaderProgram && shaderProgram->getState().hasUniformBuffers())
{
return true;
}
}
return false;
}
bool ProgramPipelineState::hasStorageBuffers() const
{
for (const gl::ShaderType shaderType : mExecutable->getLinkedShaderStages())
{
const Program *shaderProgram = getShaderProgram(shaderType);
if (shaderProgram && shaderProgram->getState().hasStorageBuffers())
{
return true;
}
}
return false;
}
bool ProgramPipelineState::hasAtomicCounterBuffers() const
{
for (const gl::ShaderType shaderType : mExecutable->getLinkedShaderStages())
{
const Program *shaderProgram = getShaderProgram(shaderType);
if (shaderProgram && shaderProgram->getState().hasAtomicCounterBuffers())
{
return true;
}
}
return false;
}
bool ProgramPipelineState::hasImages() const bool ProgramPipelineState::hasImages() const
{ {
for (const gl::ShaderType shaderType : mExecutable->getLinkedShaderStages()) for (const gl::ShaderType shaderType : mExecutable->getLinkedShaderStages())
...@@ -208,20 +166,6 @@ bool ProgramPipelineState::hasImages() const ...@@ -208,20 +166,6 @@ bool ProgramPipelineState::hasImages() const
return false; return false;
} }
bool ProgramPipelineState::hasTransformFeedbackOutput() const
{
for (const gl::ShaderType shaderType : mExecutable->getLinkedShaderStages())
{
const Program *shaderProgram = getShaderProgram(shaderType);
if (shaderProgram && shaderProgram->getState().hasTransformFeedbackOutput())
{
return true;
}
}
return false;
}
ProgramPipeline::ProgramPipeline(rx::GLImplFactory *factory, ProgramPipelineID handle) ProgramPipeline::ProgramPipeline(rx::GLImplFactory *factory, ProgramPipelineID handle)
: RefCountObject(factory->generateSerial(), handle), : RefCountObject(factory->generateSerial(), handle),
mProgramPipelineImpl(factory->createProgramPipeline(mState)) mProgramPipelineImpl(factory->createProgramPipeline(mState))
...@@ -311,6 +255,21 @@ void ProgramPipeline::updateExecutableAttributes() ...@@ -311,6 +255,21 @@ void ProgramPipeline::updateExecutableAttributes()
mState.mExecutable->mAttributesMask = vertexExecutable.mAttributesMask; mState.mExecutable->mAttributesMask = vertexExecutable.mAttributesMask;
} }
void ProgramPipeline::updateTransformFeedbackMembers()
{
Program *vertexProgram = getShaderProgram(gl::ShaderType::Vertex);
if (!vertexProgram)
{
return;
}
const ProgramExecutable &vertexExecutable = vertexProgram->getExecutable();
mState.mExecutable->mTransformFeedbackStrides = vertexExecutable.mTransformFeedbackStrides;
mState.mExecutable->mLinkedTransformFeedbackVaryings =
vertexExecutable.mLinkedTransformFeedbackVaryings;
}
void ProgramPipeline::updateExecutableTextures() void ProgramPipeline::updateExecutableTextures()
{ {
for (const ShaderType shaderType : mState.mExecutable->getLinkedShaderStages()) for (const ShaderType shaderType : mState.mExecutable->getLinkedShaderStages())
...@@ -327,15 +286,62 @@ void ProgramPipeline::updateExecutableTextures() ...@@ -327,15 +286,62 @@ void ProgramPipeline::updateExecutableTextures()
} }
} }
void ProgramPipeline::updateHasBuffers()
{
// Need to check all of the shader stages, not just linked, so we handle Compute correctly.
for (const gl::ShaderType shaderType : kAllGraphicsShaderTypes)
{
const Program *shaderProgram = getShaderProgram(shaderType);
if (shaderProgram)
{
const ProgramExecutable &executable = shaderProgram->getExecutable();
if (executable.hasUniformBuffers())
{
mState.mExecutable->mPipelineHasGraphicsUniformBuffers = true;
}
if (executable.hasStorageBuffers())
{
mState.mExecutable->mPipelineHasGraphicsStorageBuffers = true;
}
if (executable.hasAtomicCounterBuffers())
{
mState.mExecutable->mPipelineHasGraphicsAtomicCounterBuffers = true;
}
}
}
const Program *computeProgram = getShaderProgram(ShaderType::Compute);
if (computeProgram)
{
const ProgramExecutable &executable = computeProgram->getExecutable();
if (executable.hasUniformBuffers())
{
mState.mExecutable->mPipelineHasComputeUniformBuffers = true;
}
if (executable.hasStorageBuffers())
{
mState.mExecutable->mPipelineHasComputeStorageBuffers = true;
}
if (executable.hasAtomicCounterBuffers())
{
mState.mExecutable->mPipelineHasComputeAtomicCounterBuffers = true;
}
}
}
void ProgramPipeline::updateExecutable() void ProgramPipeline::updateExecutable()
{ {
mState.mExecutable->reset(); mState.mExecutable->reset();
// Vertex Shader ProgramExecutable properties // Vertex Shader ProgramExecutable properties
updateExecutableAttributes(); updateExecutableAttributes();
updateTransformFeedbackMembers();
// All Shader ProgramExecutable properties // All Shader ProgramExecutable properties
updateExecutableTextures(); updateExecutableTextures();
updateHasBuffers();
} }
ProgramMergedVaryings ProgramPipeline::getMergedVaryings() const ProgramMergedVaryings ProgramPipeline::getMergedVaryings() const
......
...@@ -68,11 +68,7 @@ class ProgramPipelineState final : angle::NonCopyable ...@@ -68,11 +68,7 @@ class ProgramPipelineState final : angle::NonCopyable
bool hasDefaultUniforms() const; bool hasDefaultUniforms() const;
bool hasTextures() const; bool hasTextures() const;
bool hasUniformBuffers() const;
bool hasStorageBuffers() const;
bool hasAtomicCounterBuffers() const;
bool hasImages() const; bool hasImages() const;
bool hasTransformFeedbackOutput() const;
private: private:
void useProgramStage(const Context *context, ShaderType shaderType, Program *shaderProgram); void useProgramStage(const Context *context, ShaderType shaderType, Program *shaderProgram);
...@@ -127,10 +123,6 @@ class ProgramPipeline final : public RefCountObject<ProgramPipelineID>, public L ...@@ -127,10 +123,6 @@ class ProgramPipeline final : public RefCountObject<ProgramPipelineID>, public L
void useProgramStages(const Context *context, GLbitfield stages, Program *shaderProgram); void useProgramStages(const Context *context, GLbitfield stages, Program *shaderProgram);
void updateExecutableAttributes();
void updateExecutableTextures();
void updateExecutable();
Program *getShaderProgram(ShaderType shaderType) const { return mState.mPrograms[shaderType]; } Program *getShaderProgram(ShaderType shaderType) const { return mState.mPrograms[shaderType]; }
ProgramMergedVaryings getMergedVaryings() const; ProgramMergedVaryings getMergedVaryings() const;
...@@ -168,6 +160,11 @@ class ProgramPipeline final : public RefCountObject<ProgramPipelineID>, public L ...@@ -168,6 +160,11 @@ class ProgramPipeline final : public RefCountObject<ProgramPipelineID>, public L
private: private:
void updateLinkedShaderStages(); void updateLinkedShaderStages();
void updateExecutableAttributes();
void updateTransformFeedbackMembers();
void updateExecutableTextures();
void updateHasBuffers();
void updateExecutable();
std::unique_ptr<rx::ProgramPipelineImpl> mProgramPipelineImpl; std::unique_ptr<rx::ProgramPipelineImpl> mProgramPipelineImpl;
......
...@@ -1463,7 +1463,7 @@ angle::Result ContextVk::handleDirtyGraphicsTransformFeedbackBuffersEmulation( ...@@ -1463,7 +1463,7 @@ angle::Result ContextVk::handleDirtyGraphicsTransformFeedbackBuffersEmulation(
} }
TransformFeedbackVk *transformFeedbackVk = vk::GetImpl(mState.getCurrentTransformFeedback()); TransformFeedbackVk *transformFeedbackVk = vk::GetImpl(mState.getCurrentTransformFeedback());
size_t bufferCount = executable->getTransformFeedbackBufferCount(mState); size_t bufferCount = executable->getTransformFeedbackBufferCount();
const gl::TransformFeedbackBuffersArray<vk::BufferHelper *> &bufferHelpers = const gl::TransformFeedbackBuffersArray<vk::BufferHelper *> &bufferHelpers =
transformFeedbackVk->getBufferHelpers(); transformFeedbackVk->getBufferHelpers();
...@@ -1491,7 +1491,7 @@ angle::Result ContextVk::handleDirtyGraphicsTransformFeedbackBuffersExtension( ...@@ -1491,7 +1491,7 @@ angle::Result ContextVk::handleDirtyGraphicsTransformFeedbackBuffersExtension(
return angle::Result::Continue; return angle::Result::Continue;
TransformFeedbackVk *transformFeedbackVk = vk::GetImpl(mState.getCurrentTransformFeedback()); TransformFeedbackVk *transformFeedbackVk = vk::GetImpl(mState.getCurrentTransformFeedback());
size_t bufferCount = executable->getTransformFeedbackBufferCount(mState); size_t bufferCount = executable->getTransformFeedbackBufferCount();
const gl::TransformFeedbackBuffersArray<vk::BufferHelper *> &bufferHelpers = const gl::TransformFeedbackBuffersArray<vk::BufferHelper *> &bufferHelpers =
transformFeedbackVk->getBufferHelpers(); transformFeedbackVk->getBufferHelpers();
...@@ -1533,7 +1533,7 @@ angle::Result ContextVk::handleDirtyGraphicsTransformFeedbackState(const gl::Con ...@@ -1533,7 +1533,7 @@ angle::Result ContextVk::handleDirtyGraphicsTransformFeedbackState(const gl::Con
TransformFeedbackVk *transformFeedbackVk = vk::GetImpl(mState.getCurrentTransformFeedback()); TransformFeedbackVk *transformFeedbackVk = vk::GetImpl(mState.getCurrentTransformFeedback());
// We should have same number of counter buffers as xfb buffers have // We should have same number of counter buffers as xfb buffers have
size_t bufferCount = executable->getTransformFeedbackBufferCount(mState); size_t bufferCount = executable->getTransformFeedbackBufferCount();
const gl::TransformFeedbackBuffersArray<VkBuffer> &counterBufferHandles = const gl::TransformFeedbackBuffersArray<VkBuffer> &counterBufferHandles =
transformFeedbackVk->getCounterBufferHandles(); transformFeedbackVk->getCounterBufferHandles();
......
...@@ -655,8 +655,9 @@ angle::Result ProgramExecutableVk::createPipelineLayout(const gl::Context *glCon ...@@ -655,8 +655,9 @@ angle::Result ProgramExecutableVk::createPipelineLayout(const gl::Context *glCon
!programStates[gl::ShaderType::Vertex]->getLinkedTransformFeedbackVaryings().empty()); !programStates[gl::ShaderType::Vertex]->getLinkedTransformFeedbackVaryings().empty());
if (hasVertexShader && transformFeedback && hasXfbVaryings) if (hasVertexShader && transformFeedback && hasXfbVaryings)
{ {
size_t xfbBufferCount = const gl::ProgramExecutable &executable =
programStates[gl::ShaderType::Vertex]->getTransformFeedbackBufferCount(); programStates[gl::ShaderType::Vertex]->getExecutable();
size_t xfbBufferCount = executable.getTransformFeedbackBufferCount();
TransformFeedbackVk *transformFeedbackVk = vk::GetImpl(transformFeedback); TransformFeedbackVk *transformFeedbackVk = vk::GetImpl(transformFeedback);
transformFeedbackVk->updateDescriptorSetLayout(contextVk, transformFeedbackVk->updateDescriptorSetLayout(contextVk,
mVariableInfoMap[gl::ShaderType::Vertex], mVariableInfoMap[gl::ShaderType::Vertex],
...@@ -1223,7 +1224,7 @@ void ProgramExecutableVk::updateTransformFeedbackDescriptorSetImpl( ...@@ -1223,7 +1224,7 @@ void ProgramExecutableVk::updateTransformFeedbackDescriptorSetImpl(
{ {
TransformFeedbackVk *transformFeedbackVk = vk::GetImpl(transformFeedback); TransformFeedbackVk *transformFeedbackVk = vk::GetImpl(transformFeedback);
transformFeedbackVk->initDescriptorSet( transformFeedbackVk->initDescriptorSet(
contextVk, programState.getTransformFeedbackBufferCount(), &mEmptyBuffer, contextVk, executable.getTransformFeedbackBufferCount(), &mEmptyBuffer,
mDescriptorSets[kUniformsAndXfbDescriptorSetIndex]); mDescriptorSets[kUniformsAndXfbDescriptorSetIndex]);
} }
return; return;
......
...@@ -55,7 +55,7 @@ angle::Result TransformFeedbackVk::begin(const gl::Context *context, ...@@ -55,7 +55,7 @@ angle::Result TransformFeedbackVk::begin(const gl::Context *context,
const gl::ProgramExecutable *executable = contextVk->getState().getProgramExecutable(); const gl::ProgramExecutable *executable = contextVk->getState().getProgramExecutable();
ASSERT(executable); ASSERT(executable);
size_t xfbBufferCount = executable->getTransformFeedbackBufferCount(contextVk->getState()); size_t xfbBufferCount = executable->getTransformFeedbackBufferCount();
for (size_t bufferIndex = 0; bufferIndex < xfbBufferCount; ++bufferIndex) for (size_t bufferIndex = 0; bufferIndex < xfbBufferCount; ++bufferIndex)
{ {
...@@ -235,7 +235,7 @@ void TransformFeedbackVk::updateDescriptorSet(ContextVk *contextVk, ...@@ -235,7 +235,7 @@ void TransformFeedbackVk::updateDescriptorSet(ContextVk *contextVk,
const gl::ProgramExecutable *executable = contextVk->getState().getProgramExecutable(); const gl::ProgramExecutable *executable = contextVk->getState().getProgramExecutable();
ASSERT(executable); ASSERT(executable);
size_t xfbBufferCount = executable->getTransformFeedbackBufferCount(contextVk->getState()); size_t xfbBufferCount = executable->getTransformFeedbackBufferCount();
ASSERT(xfbBufferCount > 0); ASSERT(xfbBufferCount > 0);
ASSERT(programState.getTransformFeedbackBufferMode() != GL_INTERLEAVED_ATTRIBS || ASSERT(programState.getTransformFeedbackBufferMode() != GL_INTERLEAVED_ATTRIBS ||
...@@ -271,7 +271,7 @@ void TransformFeedbackVk::getBufferOffsets(ContextVk *contextVk, ...@@ -271,7 +271,7 @@ void TransformFeedbackVk::getBufferOffsets(ContextVk *contextVk,
mState.getBoundProgram()->getTransformFeedbackStrides(); mState.getBoundProgram()->getTransformFeedbackStrides();
const gl::ProgramExecutable *executable = contextVk->getState().getProgramExecutable(); const gl::ProgramExecutable *executable = contextVk->getState().getProgramExecutable();
ASSERT(executable); ASSERT(executable);
size_t xfbBufferCount = executable->getTransformFeedbackBufferCount(contextVk->getState()); size_t xfbBufferCount = executable->getTransformFeedbackBufferCount();
ASSERT(xfbBufferCount > 0); ASSERT(xfbBufferCount > 0);
......
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