Commit 3d40488b by Jiawei Shao Committed by Commit Bot

Split varyings into input and output varyings in renderer

This patch intends to split all vector<Varying> into two vectors to store input and output varyings separately in the renderer. This patch is a base of supporting program linking with geometry shader. Unlike the vertex shaders (their outputs are varyings) and fragment shaders (their inputs are varyings), the inputs and outputs of geometry shaders are all varyings, so we need two vector<Varying> to store them correctly. BUG=angleproject:1941 TEST=angle_end2end_tests Change-Id: Ic4b8343f2fc3df87b764c45f2ea7810e565f7bee Reviewed-on: https://chromium-review.googlesource.com/720617 Commit-Queue: Corentin Wallez <cwallez@chromium.org> Reviewed-by: 's avatarOlli Etuaho <oetuaho@nvidia.com> Reviewed-by: 's avatarCorentin Wallez <cwallez@chromium.org>
parent d4556dfc
......@@ -595,7 +595,7 @@ BindingInfo Program::getFragmentInputBindingInfo(const Context *context, GLint i
ASSERT(fragmentShader);
// Find the actual fragment shader varying we're interested in
const std::vector<sh::Varying> &inputs = fragmentShader->getVaryings(context);
const std::vector<sh::Varying> &inputs = fragmentShader->getInputVaryings(context);
for (const auto &binding : mFragmentInputBindings)
{
......@@ -1835,8 +1835,8 @@ bool Program::linkVaryings(const Context *context, InfoLog &infoLog) const
ASSERT(vertexShader->getShaderVersion(context) == fragmentShader->getShaderVersion(context));
const std::vector<sh::Varying> &vertexVaryings = vertexShader->getVaryings(context);
const std::vector<sh::Varying> &fragmentVaryings = fragmentShader->getVaryings(context);
const std::vector<sh::Varying> &vertexVaryings = vertexShader->getOutputVaryings(context);
const std::vector<sh::Varying> &fragmentVaryings = fragmentShader->getInputVaryings(context);
std::map<GLuint, std::string> staticFragmentInputLocations;
......@@ -2413,8 +2413,8 @@ bool Program::linkValidateBuiltInVaryings(const Context *context, InfoLog &infoL
{
Shader *vertexShader = mState.mAttachedVertexShader;
Shader *fragmentShader = mState.mAttachedFragmentShader;
const auto &vertexVaryings = vertexShader->getVaryings(context);
const auto &fragmentVaryings = fragmentShader->getVaryings(context);
const auto &vertexVaryings = vertexShader->getOutputVaryings(context);
const auto &fragmentVaryings = fragmentShader->getInputVaryings(context);
int shaderVersion = vertexShader->getShaderVersion(context);
if (shaderVersion != 100)
......@@ -2626,12 +2626,12 @@ Program::MergedVaryings Program::getMergedVaryings(const Context *context) const
{
MergedVaryings merged;
for (const sh::Varying &varying : mState.mAttachedVertexShader->getVaryings(context))
for (const sh::Varying &varying : mState.mAttachedVertexShader->getOutputVaryings(context))
{
merged[varying.name].vertex = &varying;
}
for (const sh::Varying &varying : mState.mAttachedFragmentShader->getVaryings(context))
for (const sh::Varying &varying : mState.mAttachedFragmentShader->getInputVaryings(context))
{
merged[varying.name].fragment = &varying;
}
......
......@@ -268,7 +268,8 @@ void Shader::compile(const Context *context)
mState.mTranslatedSource.clear();
mInfoLog.clear();
mState.mShaderVersion = 100;
mState.mVaryings.clear();
mState.mInputVaryings.clear();
mState.mOutputVaryings.clear();
mState.mUniforms.clear();
mState.mUniformBlocks.clear();
mState.mShaderStorageBlocks.clear();
......@@ -360,7 +361,6 @@ void Shader::resolveCompile(const Context *context)
// Gather the shader information
mState.mShaderVersion = sh::GetShaderVersion(compilerHandle);
mState.mVaryings = GetShaderVariables(sh::GetVaryings(compilerHandle));
mState.mUniforms = GetShaderVariables(sh::GetUniforms(compilerHandle));
mState.mUniformBlocks = GetShaderVariables(sh::GetUniformBlocks(compilerHandle));
mState.mShaderStorageBlocks = GetShaderVariables(sh::GetShaderStorageBlocks(compilerHandle));
......@@ -375,6 +375,7 @@ void Shader::resolveCompile(const Context *context)
case GL_VERTEX_SHADER:
{
{
mState.mOutputVaryings = GetShaderVariables(sh::GetOutputVaryings(compilerHandle));
mState.mActiveAttributes =
GetActiveShaderVariables(sh::GetAttributes(compilerHandle));
mState.mNumViews = sh::GetVertexShaderNumViews(compilerHandle);
......@@ -383,8 +384,9 @@ void Shader::resolveCompile(const Context *context)
}
case GL_FRAGMENT_SHADER:
{
mState.mInputVaryings = GetShaderVariables(sh::GetInputVaryings(compilerHandle));
// TODO(jmadill): Figure out why we only sort in the FS, and if we need to.
std::sort(mState.mVaryings.begin(), mState.mVaryings.end(), CompareShaderVar);
std::sort(mState.mInputVaryings.begin(), mState.mInputVaryings.end(), CompareShaderVar);
mState.mActiveOutputVariables =
GetActiveShaderVariables(sh::GetOutputVariables(compilerHandle));
break;
......@@ -441,10 +443,16 @@ int Shader::getShaderVersion(const Context *context)
return mState.mShaderVersion;
}
const std::vector<sh::Varying> &Shader::getVaryings(const Context *context)
const std::vector<sh::Varying> &Shader::getInputVaryings(const Context *context)
{
resolveCompile(context);
return mState.getVaryings();
return mState.getInputVaryings();
}
const std::vector<sh::Varying> &Shader::getOutputVaryings(const Context *context)
{
resolveCompile(context);
return mState.getOutputVaryings();
}
const std::vector<sh::Uniform> &Shader::getUniforms(const Context *context)
......@@ -480,7 +488,9 @@ const std::vector<sh::OutputVariable> &Shader::getActiveOutputVariables(const Co
std::string Shader::getTransformFeedbackVaryingMappedName(const std::string &tfVaryingName,
const Context *context)
{
const auto &varyings = getVaryings(context);
// TODO(jiawei.shao@intel.com): support transform feedback on geometry shader.
ASSERT(mState.getShaderType() == GL_VERTEX_SHADER);
const auto &varyings = getOutputVaryings(context);
auto bracketPos = tfVaryingName.find("[");
if (bracketPos != std::string::npos)
{
......
......@@ -62,7 +62,8 @@ class ShaderState final : angle::NonCopyable
GLenum getShaderType() const { return mShaderType; }
int getShaderVersion() const { return mShaderVersion; }
const std::vector<sh::Varying> &getVaryings() const { return mVaryings; }
const std::vector<sh::Varying> &getInputVaryings() const { return mInputVaryings; }
const std::vector<sh::Varying> &getOutputVaryings() const { return mOutputVaryings; }
const std::vector<sh::Uniform> &getUniforms() const { return mUniforms; }
const std::vector<sh::InterfaceBlock> &getUniformBlocks() const { return mUniformBlocks; }
const std::vector<sh::InterfaceBlock> &getShaderStorageBlocks() const
......@@ -89,7 +90,8 @@ class ShaderState final : angle::NonCopyable
sh::WorkGroupSize mLocalSize;
std::vector<sh::Varying> mVaryings;
std::vector<sh::Varying> mInputVaryings;
std::vector<sh::Varying> mOutputVaryings;
std::vector<sh::Uniform> mUniforms;
std::vector<sh::InterfaceBlock> mUniformBlocks;
std::vector<sh::InterfaceBlock> mShaderStorageBlocks;
......@@ -151,7 +153,8 @@ class Shader final : angle::NonCopyable, public LabeledObject
int getShaderVersion(const Context *context);
const std::vector<sh::Varying> &getVaryings(const Context *context);
const std::vector<sh::Varying> &getInputVaryings(const Context *context);
const std::vector<sh::Varying> &getOutputVaryings(const Context *context);
const std::vector<sh::Uniform> &getUniforms(const Context *context);
const std::vector<sh::InterfaceBlock> &getUniformBlocks(const Context *context);
const std::vector<sh::InterfaceBlock> &getShaderStorageBlocks(const Context *context);
......
......@@ -1554,8 +1554,8 @@ gl::LinkResult ProgramD3D::link(const gl::Context *context,
// Cache if we use flat shading
mUsesFlatInterpolation =
(FindFlatInterpolationVarying(fragmentShader->getVaryings(context)) ||
FindFlatInterpolationVarying(vertexShader->getVaryings(context)));
(FindFlatInterpolationVarying(fragmentShader->getInputVaryings(context)) ||
FindFlatInterpolationVarying(vertexShader->getOutputVaryings(context)));
if (mRenderer->getMajorShaderModel() >= 4)
{
......
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