Commit ada9ecc3 by Jamie Madill

Make TF Feedback buffer mode a GL-level variable.

Don't query this as an Impl method, since it exists on the GL level. Also some related refactorings and cleanups. BUG=angleproject:1123 Change-Id: I3610bc0db2bcaa96408506e06a65a2f4dab93150 Reviewed-on: https://chromium-review.googlesource.com/293761Reviewed-by: 's avatarCorentin Wallez <cwallez@chromium.org> Tested-by: 's avatarJamie Madill <jmadill@chromium.org>
parent 5c6b7bfe
......@@ -290,11 +290,15 @@ Error Program::link(const gl::Data &data)
return Error(GL_NO_ERROR);
}
if (!linkVaryings(mInfoLog, mData.mAttachedVertexShader, mData.mAttachedFragmentShader))
{
return Error(GL_NO_ERROR);
}
int registers;
std::vector<LinkedVarying> linkedVaryings;
rx::LinkResult result =
mProgram->link(data, mInfoLog, mData.mAttachedFragmentShader, mData.mAttachedVertexShader,
mData.mTransformFeedbackVaryings, mData.mTransformFeedbackBufferMode,
&registers, &linkedVaryings, &mOutputVariables);
if (result.error.isError() || !result.linkSuccess)
{
......@@ -314,9 +318,7 @@ Error Program::link(const gl::Data &data)
}
if (!gatherTransformFeedbackLinkedVaryings(
mInfoLog, linkedVaryings, mData.mTransformFeedbackVaryings,
mData.mTransformFeedbackBufferMode, &mProgram->getTransformFeedbackLinkedVaryings(),
*data.caps))
mInfoLog, linkedVaryings, &mProgram->getTransformFeedbackLinkedVaryings(), *data.caps))
{
return Error(GL_NO_ERROR);
}
......@@ -434,6 +436,8 @@ Error Program::loadBinary(GLenum binaryFormat, const void *binary, GLsizei lengt
mProgram->setShaderAttribute(attribIndex, type, precision, name, arraySize, location);
}
stream.readInt(&mData.mTransformFeedbackBufferMode);
rx::LinkResult result = mProgram->load(mInfoLog, &stream);
if (result.error.isError() || !result.linkSuccess)
{
......@@ -478,6 +482,8 @@ Error Program::saveBinary(GLenum *binaryFormat, void *binary, GLsizei bufSize, G
stream.writeInt(attrib.location);
}
stream.writeInt(mData.mTransformFeedbackBufferMode);
gl::Error error = mProgram->save(&stream);
if (error.isError())
{
......@@ -1238,48 +1244,49 @@ GLenum Program::getTransformFeedbackBufferMode() const
return mData.mTransformFeedbackBufferMode;
}
bool Program::linkVaryings(InfoLog &infoLog, Shader *fragmentShader, Shader *vertexShader)
// static
bool Program::linkVaryings(InfoLog &infoLog,
const Shader *vertexShader,
const Shader *fragmentShader)
{
std::vector<PackedVarying> &fragmentVaryings = fragmentShader->getVaryings();
std::vector<PackedVarying> &vertexVaryings = vertexShader->getVaryings();
const std::vector<PackedVarying> &vertexVaryings = vertexShader->getVaryings();
const std::vector<PackedVarying> &fragmentVaryings = fragmentShader->getVaryings();
for (size_t fragVaryingIndex = 0; fragVaryingIndex < fragmentVaryings.size(); fragVaryingIndex++)
for (const PackedVarying &output : fragmentVaryings)
{
PackedVarying *input = &fragmentVaryings[fragVaryingIndex];
bool matched = false;
// Built-in varyings obey special rules
if (input->isBuiltIn())
if (output.isBuiltIn())
{
continue;
}
for (size_t vertVaryingIndex = 0; vertVaryingIndex < vertexVaryings.size(); vertVaryingIndex++)
for (const PackedVarying &input : vertexVaryings)
{
PackedVarying *output = &vertexVaryings[vertVaryingIndex];
if (output->name == input->name)
if (output.name == input.name)
{
if (!linkValidateVaryings(infoLog, output->name, *input, *output))
ASSERT(!input.isBuiltIn());
if (!linkValidateVaryings(infoLog, output.name, input, output))
{
return false;
}
output->registerIndex = input->registerIndex;
output->columnIndex = input->columnIndex;
matched = true;
break;
}
}
// We permit unmatched, unreferenced varyings
if (!matched && input->staticUse)
if (!matched && output.staticUse)
{
infoLog << "Fragment varying " << input->name << " does not match any vertex varying";
infoLog << "Fragment varying " << output.name << " does not match any vertex varying";
return false;
}
}
// TODO(jmadill): verify no unmatched vertex varyings?
return true;
}
......@@ -1583,8 +1590,6 @@ bool Program::linkValidateVaryings(InfoLog &infoLog, const std::string &varyingN
}
bool Program::gatherTransformFeedbackLinkedVaryings(InfoLog &infoLog, const std::vector<LinkedVarying> &linkedVaryings,
const std::vector<std::string> &transformFeedbackVaryingNames,
GLenum transformFeedbackBufferMode,
std::vector<LinkedVarying> *outTransformFeedbackLinkedVaryings,
const Caps &caps) const
{
......@@ -1592,12 +1597,12 @@ bool Program::gatherTransformFeedbackLinkedVaryings(InfoLog &infoLog, const std:
// Gather the linked varyings that are used for transform feedback, they should all exist.
outTransformFeedbackLinkedVaryings->clear();
for (size_t i = 0; i < transformFeedbackVaryingNames.size(); i++)
for (size_t i = 0; i < mData.mTransformFeedbackVaryings.size(); i++)
{
bool found = false;
for (size_t j = 0; j < linkedVaryings.size(); j++)
{
if (transformFeedbackVaryingNames[i] == linkedVaryings[j].name)
if (mData.mTransformFeedbackVaryings[i] == linkedVaryings[j].name)
{
for (size_t k = 0; k < outTransformFeedbackLinkedVaryings->size(); k++)
{
......@@ -1610,7 +1615,7 @@ bool Program::gatherTransformFeedbackLinkedVaryings(InfoLog &infoLog, const std:
}
size_t componentCount = linkedVaryings[j].semanticIndexCount * 4;
if (transformFeedbackBufferMode == GL_SEPARATE_ATTRIBS &&
if (mData.mTransformFeedbackBufferMode == GL_SEPARATE_ATTRIBS &&
componentCount > caps.maxTransformFeedbackSeparateComponents)
{
infoLog << "Transform feedback varying's " << linkedVaryings[j].name
......@@ -1633,7 +1638,7 @@ bool Program::gatherTransformFeedbackLinkedVaryings(InfoLog &infoLog, const std:
UNUSED_ASSERTION_VARIABLE(found);
}
if (transformFeedbackBufferMode == GL_INTERLEAVED_ATTRIBS &&
if (mData.mTransformFeedbackBufferMode == GL_INTERLEAVED_ATTRIBS &&
totalComponents > caps.maxTransformFeedbackInterleavedComponents)
{
infoLog << "Transform feedback varying total components (" << totalComponents
......
......@@ -170,6 +170,11 @@ class Program : angle::NonCopyable
const Shader *getAttachedVertexShader() const { return mAttachedVertexShader; }
const Shader *getAttachedFragmentShader() const { return mAttachedFragmentShader; }
const std::vector<std::string> &getTransformFeedbackVaryings() const
{
return mTransformFeedbackVaryings;
}
GLint getTransformFeedbackBufferMode() const { return mTransformFeedbackBufferMode; }
private:
friend class Program;
......@@ -281,7 +286,6 @@ class Program : angle::NonCopyable
GLsizei getTransformFeedbackVaryingMaxLength() const;
GLenum getTransformFeedbackBufferMode() const;
static bool linkVaryings(InfoLog &infoLog, Shader *fragmentShader, Shader *vertexShader);
static bool linkValidateUniforms(InfoLog &infoLog, const std::string &uniformName, const sh::Uniform &vertexUniform, const sh::Uniform &fragmentUniform);
static bool linkValidateInterfaceBlockFields(InfoLog &infoLog, const std::string &uniformName, const sh::InterfaceBlockField &vertexUniform, const sh::InterfaceBlockField &fragmentUniform);
......@@ -305,6 +309,9 @@ class Program : angle::NonCopyable
const AttributeBindings &attributeBindings,
const Shader *vertexShader);
bool linkUniformBlocks(InfoLog &infoLog, const Shader &vertexShader, const Shader &fragmentShader, const Caps &caps);
static bool linkVaryings(InfoLog &infoLog,
const Shader *vertexShader,
const Shader *fragmentShader);
bool areMatchingInterfaceBlocks(gl::InfoLog &infoLog, const sh::InterfaceBlock &vertexInterfaceBlock,
const sh::InterfaceBlock &fragmentInterfaceBlock);
......@@ -316,8 +323,6 @@ class Program : angle::NonCopyable
static bool linkValidateVaryings(InfoLog &infoLog, const std::string &varyingName, const sh::Varying &vertexVarying, const sh::Varying &fragmentVarying);
bool gatherTransformFeedbackLinkedVaryings(InfoLog &infoLog, const std::vector<LinkedVarying> &linkedVaryings,
const std::vector<std::string> &transformFeedbackVaryingNames,
GLenum transformFeedbackBufferMode,
std::vector<LinkedVarying> *outTransformFeedbackLinkedVaryings,
const Caps &caps) const;
bool assignUniformBlockRegister(InfoLog &infoLog, UniformBlock *uniformBlock, GLenum shader, unsigned int registerIndex, const Caps &caps);
......
......@@ -35,6 +35,7 @@ struct Data;
struct PackedVarying : public sh::Varying
{
// TODO(jmadill): Make these D3D-only or otherwise clearly separate from GL.
unsigned int registerIndex; // Assigned during link
unsigned int columnIndex; // Assigned during link, defaults to 0
......
......@@ -38,7 +38,6 @@ class ProgramImpl : angle::NonCopyable
virtual bool usesPointSize() const = 0;
virtual int getShaderVersion() const = 0;
virtual GLenum getTransformFeedbackBufferMode() const = 0;
virtual GLenum getBinaryFormat() = 0;
virtual LinkResult load(gl::InfoLog &infoLog, gl::BinaryInputStream *stream) = 0;
......@@ -46,8 +45,6 @@ class ProgramImpl : angle::NonCopyable
virtual LinkResult link(const gl::Data &data, gl::InfoLog &infoLog,
gl::Shader *fragmentShader, gl::Shader *vertexShader,
const std::vector<std::string> &transformFeedbackVaryings,
GLenum transformFeedbackBufferMode,
int *registers, std::vector<gl::LinkedVarying> *linkedVaryings,
std::map<int, gl::VariableLocation> *outputVariables) = 0;
......
......@@ -736,10 +736,14 @@ void DynamicHLSL::storeUserLinkedVaryings(const ShaderD3D *vertexShader,
}
}
bool DynamicHLSL::generateShaderLinkHLSL(const gl::Data &data, InfoLog &infoLog, int registers,
bool DynamicHLSL::generateShaderLinkHLSL(const gl::Data &data,
InfoLog &infoLog,
int registers,
const VaryingPacking packing,
std::string &pixelHLSL, std::string &vertexHLSL,
ShaderD3D *fragmentShader, ShaderD3D *vertexShader,
std::string &pixelHLSL,
std::string &vertexHLSL,
const ShaderD3D *fragmentShader,
const ShaderD3D *vertexShader,
const std::vector<std::string> &transformFeedbackVaryings,
std::vector<LinkedVarying> *linkedVaryings,
std::map<int, VariableLocation> *programOutputVars,
......@@ -1086,7 +1090,8 @@ bool DynamicHLSL::generateShaderLinkHLSL(const gl::Data &data, InfoLog &infoLog,
return true;
}
void DynamicHLSL::defineOutputVariables(ShaderD3D *fragmentShader, std::map<int, VariableLocation> *programOutputVars) const
void DynamicHLSL::defineOutputVariables(const ShaderD3D *fragmentShader,
std::map<int, VariableLocation> *programOutputVars) const
{
const std::vector<sh::Attribute> &shaderOutputVars = fragmentShader->getActiveOutputVariables();
......
......@@ -60,10 +60,14 @@ class DynamicHLSL : angle::NonCopyable
const std::vector<sh::Attribute> &shaderAttributes) const;
std::string generatePixelShaderForOutputSignature(const std::string &sourceShader, const std::vector<PixelShaderOutputVariable> &outputVariables,
bool usesFragDepth, const std::vector<GLenum> &outputLayout) const;
bool generateShaderLinkHLSL(const gl::Data &data, gl::InfoLog &infoLog, int registers,
bool generateShaderLinkHLSL(const gl::Data &data,
gl::InfoLog &infoLog,
int registers,
const VaryingPacking packing,
std::string &pixelHLSL, std::string &vertexHLSL,
ShaderD3D *fragmentShader, ShaderD3D *vertexShader,
std::string &pixelHLSL,
std::string &vertexHLSL,
const ShaderD3D *fragmentShader,
const ShaderD3D *vertexShader,
const std::vector<std::string> &transformFeedbackVaryings,
std::vector<gl::LinkedVarying> *linkedVaryings,
std::map<int, gl::VariableLocation> *programOutputVars,
......@@ -86,7 +90,8 @@ class DynamicHLSL : angle::NonCopyable
std::string generateVaryingHLSL(const ShaderD3D *shader) const;
void storeUserLinkedVaryings(const ShaderD3D *vertexShader, std::vector<gl::LinkedVarying> *linkedVaryings) const;
void storeBuiltinLinkedVaryings(const SemanticInfo &info, std::vector<gl::LinkedVarying> *linkedVaryings) const;
void defineOutputVariables(ShaderD3D *fragmentShader, std::map<int, gl::VariableLocation> *programOutputVars) const;
void defineOutputVariables(const ShaderD3D *fragmentShader,
std::map<int, gl::VariableLocation> *programOutputVars) const;
std::string generatePointSpriteHLSL(int registers,
const ShaderD3D *fragmentShader,
const ShaderD3D *vertexShader) const;
......
......@@ -47,7 +47,6 @@ class ProgramD3D : public ProgramImpl
const std::vector<PixelShaderOutputVariable> &getPixelShaderKey() { return mPixelShaderKey; }
int getShaderVersion() const { return mShaderVersion; }
GLenum getTransformFeedbackBufferMode() const { return mTransformFeedbackBufferMode; }
GLint getSamplerMapping(gl::SamplerType type, unsigned int samplerIndex, const gl::Caps &caps) const;
GLenum getSamplerTextureType(gl::SamplerType type, unsigned int samplerIndex) const;
......@@ -73,8 +72,6 @@ class ProgramD3D : public ProgramImpl
LinkResult link(const gl::Data &data, gl::InfoLog &infoLog,
gl::Shader *fragmentShader, gl::Shader *vertexShader,
const std::vector<std::string> &transformFeedbackVaryings,
GLenum transformFeedbackBufferMode,
int *registers, std::vector<gl::LinkedVarying> *linkedVaryings,
std::map<int, gl::VariableLocation> *outputVariables);
......@@ -225,8 +222,6 @@ class ProgramD3D : public ProgramImpl
UniformStorageD3D *mVertexUniformStorage;
UniformStorageD3D *mFragmentUniformStorage;
GLenum mTransformFeedbackBufferMode;
std::vector<Sampler> mSamplersPS;
std::vector<Sampler> mSamplersVS;
GLuint mUsedVertexSamplerRange;
......
......@@ -46,12 +46,6 @@ int ProgramGL::getShaderVersion() const
return int();
}
GLenum ProgramGL::getTransformFeedbackBufferMode() const
{
UNIMPLEMENTED();
return GLenum();
}
GLenum ProgramGL::getBinaryFormat()
{
UNIMPLEMENTED();
......@@ -72,16 +66,14 @@ gl::Error ProgramGL::save(gl::BinaryOutputStream *stream)
LinkResult ProgramGL::link(const gl::Data &data, gl::InfoLog &infoLog,
gl::Shader *fragmentShader, gl::Shader *vertexShader,
const std::vector<std::string> &transformFeedbackVaryings,
GLenum transformFeedbackBufferMode,
int *registers, std::vector<gl::LinkedVarying> *linkedVaryings,
std::map<int, gl::VariableLocation> *outputVariables)
{
// Reset the program state, delete the current program if one exists
reset();
ShaderGL *vertexShaderGL = GetImplAs<ShaderGL>(vertexShader);
ShaderGL *fragmentShaderGL = GetImplAs<ShaderGL>(fragmentShader);
const ShaderGL *vertexShaderGL = GetImplAs<ShaderGL>(vertexShader);
const ShaderGL *fragmentShaderGL = GetImplAs<ShaderGL>(fragmentShader);
// Attach the shaders
mFunctions->attachShader(mProgramID, vertexShaderGL->getShaderID());
......
......@@ -33,7 +33,6 @@ class ProgramGL : public ProgramImpl
bool usesPointSize() const override;
int getShaderVersion() const override;
GLenum getTransformFeedbackBufferMode() const override;
GLenum getBinaryFormat() override;
LinkResult load(gl::InfoLog &infoLog, gl::BinaryInputStream *stream) override;
......@@ -41,8 +40,6 @@ class ProgramGL : public ProgramImpl
LinkResult link(const gl::Data &data, gl::InfoLog &infoLog,
gl::Shader *fragmentShader, gl::Shader *vertexShader,
const std::vector<std::string> &transformFeedbackVaryings,
GLenum transformFeedbackBufferMode,
int *registers, std::vector<gl::LinkedVarying> *linkedVaryings,
std::map<int, gl::VariableLocation> *outputVariables) override;
......
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