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) ...@@ -290,11 +290,15 @@ Error Program::link(const gl::Data &data)
return Error(GL_NO_ERROR); return Error(GL_NO_ERROR);
} }
if (!linkVaryings(mInfoLog, mData.mAttachedVertexShader, mData.mAttachedFragmentShader))
{
return Error(GL_NO_ERROR);
}
int registers; int registers;
std::vector<LinkedVarying> linkedVaryings; std::vector<LinkedVarying> linkedVaryings;
rx::LinkResult result = rx::LinkResult result =
mProgram->link(data, mInfoLog, mData.mAttachedFragmentShader, mData.mAttachedVertexShader, mProgram->link(data, mInfoLog, mData.mAttachedFragmentShader, mData.mAttachedVertexShader,
mData.mTransformFeedbackVaryings, mData.mTransformFeedbackBufferMode,
&registers, &linkedVaryings, &mOutputVariables); &registers, &linkedVaryings, &mOutputVariables);
if (result.error.isError() || !result.linkSuccess) if (result.error.isError() || !result.linkSuccess)
{ {
...@@ -314,9 +318,7 @@ Error Program::link(const gl::Data &data) ...@@ -314,9 +318,7 @@ Error Program::link(const gl::Data &data)
} }
if (!gatherTransformFeedbackLinkedVaryings( if (!gatherTransformFeedbackLinkedVaryings(
mInfoLog, linkedVaryings, mData.mTransformFeedbackVaryings, mInfoLog, linkedVaryings, &mProgram->getTransformFeedbackLinkedVaryings(), *data.caps))
mData.mTransformFeedbackBufferMode, &mProgram->getTransformFeedbackLinkedVaryings(),
*data.caps))
{ {
return Error(GL_NO_ERROR); return Error(GL_NO_ERROR);
} }
...@@ -434,6 +436,8 @@ Error Program::loadBinary(GLenum binaryFormat, const void *binary, GLsizei lengt ...@@ -434,6 +436,8 @@ Error Program::loadBinary(GLenum binaryFormat, const void *binary, GLsizei lengt
mProgram->setShaderAttribute(attribIndex, type, precision, name, arraySize, location); mProgram->setShaderAttribute(attribIndex, type, precision, name, arraySize, location);
} }
stream.readInt(&mData.mTransformFeedbackBufferMode);
rx::LinkResult result = mProgram->load(mInfoLog, &stream); rx::LinkResult result = mProgram->load(mInfoLog, &stream);
if (result.error.isError() || !result.linkSuccess) if (result.error.isError() || !result.linkSuccess)
{ {
...@@ -478,6 +482,8 @@ Error Program::saveBinary(GLenum *binaryFormat, void *binary, GLsizei bufSize, G ...@@ -478,6 +482,8 @@ Error Program::saveBinary(GLenum *binaryFormat, void *binary, GLsizei bufSize, G
stream.writeInt(attrib.location); stream.writeInt(attrib.location);
} }
stream.writeInt(mData.mTransformFeedbackBufferMode);
gl::Error error = mProgram->save(&stream); gl::Error error = mProgram->save(&stream);
if (error.isError()) if (error.isError())
{ {
...@@ -1238,48 +1244,49 @@ GLenum Program::getTransformFeedbackBufferMode() const ...@@ -1238,48 +1244,49 @@ GLenum Program::getTransformFeedbackBufferMode() const
return mData.mTransformFeedbackBufferMode; 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(); const std::vector<PackedVarying> &vertexVaryings = vertexShader->getVaryings();
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; bool matched = false;
// Built-in varyings obey special rules // Built-in varyings obey special rules
if (input->isBuiltIn()) if (output.isBuiltIn())
{ {
continue; 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; return false;
} }
output->registerIndex = input->registerIndex;
output->columnIndex = input->columnIndex;
matched = true; matched = true;
break; break;
} }
} }
// We permit unmatched, unreferenced varyings // 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; return false;
} }
} }
// TODO(jmadill): verify no unmatched vertex varyings?
return true; return true;
} }
...@@ -1583,8 +1590,6 @@ bool Program::linkValidateVaryings(InfoLog &infoLog, const std::string &varyingN ...@@ -1583,8 +1590,6 @@ bool Program::linkValidateVaryings(InfoLog &infoLog, const std::string &varyingN
} }
bool Program::gatherTransformFeedbackLinkedVaryings(InfoLog &infoLog, const std::vector<LinkedVarying> &linkedVaryings, bool Program::gatherTransformFeedbackLinkedVaryings(InfoLog &infoLog, const std::vector<LinkedVarying> &linkedVaryings,
const std::vector<std::string> &transformFeedbackVaryingNames,
GLenum transformFeedbackBufferMode,
std::vector<LinkedVarying> *outTransformFeedbackLinkedVaryings, std::vector<LinkedVarying> *outTransformFeedbackLinkedVaryings,
const Caps &caps) const const Caps &caps) const
{ {
...@@ -1592,12 +1597,12 @@ bool Program::gatherTransformFeedbackLinkedVaryings(InfoLog &infoLog, const std: ...@@ -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. // Gather the linked varyings that are used for transform feedback, they should all exist.
outTransformFeedbackLinkedVaryings->clear(); outTransformFeedbackLinkedVaryings->clear();
for (size_t i = 0; i < transformFeedbackVaryingNames.size(); i++) for (size_t i = 0; i < mData.mTransformFeedbackVaryings.size(); i++)
{ {
bool found = false; bool found = false;
for (size_t j = 0; j < linkedVaryings.size(); j++) 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++) for (size_t k = 0; k < outTransformFeedbackLinkedVaryings->size(); k++)
{ {
...@@ -1610,7 +1615,7 @@ bool Program::gatherTransformFeedbackLinkedVaryings(InfoLog &infoLog, const std: ...@@ -1610,7 +1615,7 @@ bool Program::gatherTransformFeedbackLinkedVaryings(InfoLog &infoLog, const std:
} }
size_t componentCount = linkedVaryings[j].semanticIndexCount * 4; size_t componentCount = linkedVaryings[j].semanticIndexCount * 4;
if (transformFeedbackBufferMode == GL_SEPARATE_ATTRIBS && if (mData.mTransformFeedbackBufferMode == GL_SEPARATE_ATTRIBS &&
componentCount > caps.maxTransformFeedbackSeparateComponents) componentCount > caps.maxTransformFeedbackSeparateComponents)
{ {
infoLog << "Transform feedback varying's " << linkedVaryings[j].name infoLog << "Transform feedback varying's " << linkedVaryings[j].name
...@@ -1633,7 +1638,7 @@ bool Program::gatherTransformFeedbackLinkedVaryings(InfoLog &infoLog, const std: ...@@ -1633,7 +1638,7 @@ bool Program::gatherTransformFeedbackLinkedVaryings(InfoLog &infoLog, const std:
UNUSED_ASSERTION_VARIABLE(found); UNUSED_ASSERTION_VARIABLE(found);
} }
if (transformFeedbackBufferMode == GL_INTERLEAVED_ATTRIBS && if (mData.mTransformFeedbackBufferMode == GL_INTERLEAVED_ATTRIBS &&
totalComponents > caps.maxTransformFeedbackInterleavedComponents) totalComponents > caps.maxTransformFeedbackInterleavedComponents)
{ {
infoLog << "Transform feedback varying total components (" << totalComponents infoLog << "Transform feedback varying total components (" << totalComponents
......
...@@ -170,6 +170,11 @@ class Program : angle::NonCopyable ...@@ -170,6 +170,11 @@ class Program : angle::NonCopyable
const Shader *getAttachedVertexShader() const { return mAttachedVertexShader; } const Shader *getAttachedVertexShader() const { return mAttachedVertexShader; }
const Shader *getAttachedFragmentShader() const { return mAttachedFragmentShader; } const Shader *getAttachedFragmentShader() const { return mAttachedFragmentShader; }
const std::vector<std::string> &getTransformFeedbackVaryings() const
{
return mTransformFeedbackVaryings;
}
GLint getTransformFeedbackBufferMode() const { return mTransformFeedbackBufferMode; }
private: private:
friend class Program; friend class Program;
...@@ -281,7 +286,6 @@ class Program : angle::NonCopyable ...@@ -281,7 +286,6 @@ class Program : angle::NonCopyable
GLsizei getTransformFeedbackVaryingMaxLength() const; GLsizei getTransformFeedbackVaryingMaxLength() const;
GLenum getTransformFeedbackBufferMode() 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 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); 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 ...@@ -305,6 +309,9 @@ class Program : angle::NonCopyable
const AttributeBindings &attributeBindings, const AttributeBindings &attributeBindings,
const Shader *vertexShader); const Shader *vertexShader);
bool linkUniformBlocks(InfoLog &infoLog, const Shader &vertexShader, const Shader &fragmentShader, const Caps &caps); 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, bool areMatchingInterfaceBlocks(gl::InfoLog &infoLog, const sh::InterfaceBlock &vertexInterfaceBlock,
const sh::InterfaceBlock &fragmentInterfaceBlock); const sh::InterfaceBlock &fragmentInterfaceBlock);
...@@ -316,8 +323,6 @@ class Program : angle::NonCopyable ...@@ -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); 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, bool gatherTransformFeedbackLinkedVaryings(InfoLog &infoLog, const std::vector<LinkedVarying> &linkedVaryings,
const std::vector<std::string> &transformFeedbackVaryingNames,
GLenum transformFeedbackBufferMode,
std::vector<LinkedVarying> *outTransformFeedbackLinkedVaryings, std::vector<LinkedVarying> *outTransformFeedbackLinkedVaryings,
const Caps &caps) const; const Caps &caps) const;
bool assignUniformBlockRegister(InfoLog &infoLog, UniformBlock *uniformBlock, GLenum shader, unsigned int registerIndex, const Caps &caps); bool assignUniformBlockRegister(InfoLog &infoLog, UniformBlock *uniformBlock, GLenum shader, unsigned int registerIndex, const Caps &caps);
......
...@@ -35,6 +35,7 @@ struct Data; ...@@ -35,6 +35,7 @@ struct Data;
struct PackedVarying : public sh::Varying 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 registerIndex; // Assigned during link
unsigned int columnIndex; // Assigned during link, defaults to 0 unsigned int columnIndex; // Assigned during link, defaults to 0
......
...@@ -38,7 +38,6 @@ class ProgramImpl : angle::NonCopyable ...@@ -38,7 +38,6 @@ class ProgramImpl : angle::NonCopyable
virtual bool usesPointSize() const = 0; virtual bool usesPointSize() const = 0;
virtual int getShaderVersion() const = 0; virtual int getShaderVersion() const = 0;
virtual GLenum getTransformFeedbackBufferMode() const = 0;
virtual GLenum getBinaryFormat() = 0; virtual GLenum getBinaryFormat() = 0;
virtual LinkResult load(gl::InfoLog &infoLog, gl::BinaryInputStream *stream) = 0; virtual LinkResult load(gl::InfoLog &infoLog, gl::BinaryInputStream *stream) = 0;
...@@ -46,8 +45,6 @@ class ProgramImpl : angle::NonCopyable ...@@ -46,8 +45,6 @@ class ProgramImpl : angle::NonCopyable
virtual LinkResult link(const gl::Data &data, gl::InfoLog &infoLog, virtual LinkResult link(const gl::Data &data, gl::InfoLog &infoLog,
gl::Shader *fragmentShader, gl::Shader *vertexShader, gl::Shader *fragmentShader, gl::Shader *vertexShader,
const std::vector<std::string> &transformFeedbackVaryings,
GLenum transformFeedbackBufferMode,
int *registers, std::vector<gl::LinkedVarying> *linkedVaryings, int *registers, std::vector<gl::LinkedVarying> *linkedVaryings,
std::map<int, gl::VariableLocation> *outputVariables) = 0; std::map<int, gl::VariableLocation> *outputVariables) = 0;
......
...@@ -736,10 +736,14 @@ void DynamicHLSL::storeUserLinkedVaryings(const ShaderD3D *vertexShader, ...@@ -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, const VaryingPacking packing,
std::string &pixelHLSL, std::string &vertexHLSL, std::string &pixelHLSL,
ShaderD3D *fragmentShader, ShaderD3D *vertexShader, std::string &vertexHLSL,
const ShaderD3D *fragmentShader,
const ShaderD3D *vertexShader,
const std::vector<std::string> &transformFeedbackVaryings, const std::vector<std::string> &transformFeedbackVaryings,
std::vector<LinkedVarying> *linkedVaryings, std::vector<LinkedVarying> *linkedVaryings,
std::map<int, VariableLocation> *programOutputVars, std::map<int, VariableLocation> *programOutputVars,
...@@ -1086,7 +1090,8 @@ bool DynamicHLSL::generateShaderLinkHLSL(const gl::Data &data, InfoLog &infoLog, ...@@ -1086,7 +1090,8 @@ bool DynamicHLSL::generateShaderLinkHLSL(const gl::Data &data, InfoLog &infoLog,
return true; 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(); const std::vector<sh::Attribute> &shaderOutputVars = fragmentShader->getActiveOutputVariables();
......
...@@ -60,10 +60,14 @@ class DynamicHLSL : angle::NonCopyable ...@@ -60,10 +60,14 @@ class DynamicHLSL : angle::NonCopyable
const std::vector<sh::Attribute> &shaderAttributes) const; const std::vector<sh::Attribute> &shaderAttributes) const;
std::string generatePixelShaderForOutputSignature(const std::string &sourceShader, const std::vector<PixelShaderOutputVariable> &outputVariables, std::string generatePixelShaderForOutputSignature(const std::string &sourceShader, const std::vector<PixelShaderOutputVariable> &outputVariables,
bool usesFragDepth, const std::vector<GLenum> &outputLayout) const; 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, const VaryingPacking packing,
std::string &pixelHLSL, std::string &vertexHLSL, std::string &pixelHLSL,
ShaderD3D *fragmentShader, ShaderD3D *vertexShader, std::string &vertexHLSL,
const ShaderD3D *fragmentShader,
const ShaderD3D *vertexShader,
const std::vector<std::string> &transformFeedbackVaryings, const std::vector<std::string> &transformFeedbackVaryings,
std::vector<gl::LinkedVarying> *linkedVaryings, std::vector<gl::LinkedVarying> *linkedVaryings,
std::map<int, gl::VariableLocation> *programOutputVars, std::map<int, gl::VariableLocation> *programOutputVars,
...@@ -86,7 +90,8 @@ class DynamicHLSL : angle::NonCopyable ...@@ -86,7 +90,8 @@ class DynamicHLSL : angle::NonCopyable
std::string generateVaryingHLSL(const ShaderD3D *shader) const; std::string generateVaryingHLSL(const ShaderD3D *shader) const;
void storeUserLinkedVaryings(const ShaderD3D *vertexShader, std::vector<gl::LinkedVarying> *linkedVaryings) const; void storeUserLinkedVaryings(const ShaderD3D *vertexShader, std::vector<gl::LinkedVarying> *linkedVaryings) const;
void storeBuiltinLinkedVaryings(const SemanticInfo &info, 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, std::string generatePointSpriteHLSL(int registers,
const ShaderD3D *fragmentShader, const ShaderD3D *fragmentShader,
const ShaderD3D *vertexShader) const; const ShaderD3D *vertexShader) const;
......
...@@ -127,8 +127,41 @@ struct AttributeSorter ...@@ -127,8 +127,41 @@ struct AttributeSorter
const ProgramImpl::SemanticIndexArray *originalIndices; const ProgramImpl::SemanticIndexArray *originalIndices;
}; };
bool LinkVaryingRegisters(gl::InfoLog &infoLog,
ShaderD3D *vertexShaderD3D,
ShaderD3D *fragmentShaderD3D)
{
for (gl::PackedVarying &input : fragmentShaderD3D->getVaryings())
{
bool matched = false;
// Built-in varyings obey special rules
if (input.isBuiltIn())
{
continue;
}
for (gl::PackedVarying &output : vertexShaderD3D->getVaryings())
{
if (output.name == input.name)
{
output.registerIndex = input.registerIndex;
output.columnIndex = input.columnIndex;
matched = true;
break;
}
}
// We permit unmatched, unreferenced varyings
ASSERT(matched || !input.staticUse);
}
return true;
} }
} // anonymous namespace
ProgramD3D::VertexExecutable::VertexExecutable(const gl::InputLayout &inputLayout, ProgramD3D::VertexExecutable::VertexExecutable(const gl::InputLayout &inputLayout,
const Signature &signature, const Signature &signature,
ShaderExecutableD3D *shaderExecutable) ShaderExecutableD3D *shaderExecutable)
...@@ -584,7 +617,6 @@ LinkResult ProgramD3D::load(gl::InfoLog &infoLog, gl::BinaryInputStream *stream) ...@@ -584,7 +617,6 @@ LinkResult ProgramD3D::load(gl::InfoLog &infoLog, gl::BinaryInputStream *stream)
mUniformBlocks[uniformBlockIndex] = uniformBlock; mUniformBlocks[uniformBlockIndex] = uniformBlock;
} }
stream->readInt(&mTransformFeedbackBufferMode);
const unsigned int transformFeedbackVaryingCount = stream->readInt<unsigned int>(); const unsigned int transformFeedbackVaryingCount = stream->readInt<unsigned int>();
mTransformFeedbackLinkedVaryings.resize(transformFeedbackVaryingCount); mTransformFeedbackLinkedVaryings.resize(transformFeedbackVaryingCount);
for (unsigned int varyingIndex = 0; varyingIndex < transformFeedbackVaryingCount; varyingIndex++) for (unsigned int varyingIndex = 0; varyingIndex < transformFeedbackVaryingCount; varyingIndex++)
...@@ -632,12 +664,11 @@ LinkResult ProgramD3D::load(gl::InfoLog &infoLog, gl::BinaryInputStream *stream) ...@@ -632,12 +664,11 @@ LinkResult ProgramD3D::load(gl::InfoLog &infoLog, gl::BinaryInputStream *stream)
unsigned int vertexShaderSize = stream->readInt<unsigned int>(); unsigned int vertexShaderSize = stream->readInt<unsigned int>();
const unsigned char *vertexShaderFunction = binary + stream->offset(); const unsigned char *vertexShaderFunction = binary + stream->offset();
ShaderExecutableD3D *shaderExecutable = NULL; ShaderExecutableD3D *shaderExecutable = nullptr;
gl::Error error = mRenderer->loadExecutable(vertexShaderFunction, vertexShaderSize,
SHADER_VERTEX, gl::Error error = mRenderer->loadExecutable(
mTransformFeedbackLinkedVaryings, vertexShaderFunction, vertexShaderSize, SHADER_VERTEX, mTransformFeedbackLinkedVaryings,
(mTransformFeedbackBufferMode == GL_SEPARATE_ATTRIBS), (mData.getTransformFeedbackBufferMode() == GL_SEPARATE_ATTRIBS), &shaderExecutable);
&shaderExecutable);
if (error.isError()) if (error.isError())
{ {
return LinkResult(false, error); return LinkResult(false, error);
...@@ -671,11 +702,11 @@ LinkResult ProgramD3D::load(gl::InfoLog &infoLog, gl::BinaryInputStream *stream) ...@@ -671,11 +702,11 @@ LinkResult ProgramD3D::load(gl::InfoLog &infoLog, gl::BinaryInputStream *stream)
const size_t pixelShaderSize = stream->readInt<unsigned int>(); const size_t pixelShaderSize = stream->readInt<unsigned int>();
const unsigned char *pixelShaderFunction = binary + stream->offset(); const unsigned char *pixelShaderFunction = binary + stream->offset();
ShaderExecutableD3D *shaderExecutable = NULL; ShaderExecutableD3D *shaderExecutable = nullptr;
gl::Error error = mRenderer->loadExecutable(pixelShaderFunction, pixelShaderSize, SHADER_PIXEL,
mTransformFeedbackLinkedVaryings, gl::Error error = mRenderer->loadExecutable(
(mTransformFeedbackBufferMode == GL_SEPARATE_ATTRIBS), pixelShaderFunction, pixelShaderSize, SHADER_PIXEL, mTransformFeedbackLinkedVaryings,
&shaderExecutable); (mData.getTransformFeedbackBufferMode() == GL_SEPARATE_ATTRIBS), &shaderExecutable);
if (error.isError()) if (error.isError())
{ {
return LinkResult(false, error); return LinkResult(false, error);
...@@ -698,10 +729,10 @@ LinkResult ProgramD3D::load(gl::InfoLog &infoLog, gl::BinaryInputStream *stream) ...@@ -698,10 +729,10 @@ LinkResult ProgramD3D::load(gl::InfoLog &infoLog, gl::BinaryInputStream *stream)
if (geometryShaderSize > 0) if (geometryShaderSize > 0)
{ {
const unsigned char *geometryShaderFunction = binary + stream->offset(); const unsigned char *geometryShaderFunction = binary + stream->offset();
gl::Error error = mRenderer->loadExecutable(geometryShaderFunction, geometryShaderSize, SHADER_GEOMETRY, gl::Error error = mRenderer->loadExecutable(
mTransformFeedbackLinkedVaryings, geometryShaderFunction, geometryShaderSize, SHADER_GEOMETRY,
(mTransformFeedbackBufferMode == GL_SEPARATE_ATTRIBS), mTransformFeedbackLinkedVaryings,
&mGeometryExecutable); (mData.getTransformFeedbackBufferMode() == GL_SEPARATE_ATTRIBS), &mGeometryExecutable);
if (error.isError()) if (error.isError())
{ {
return LinkResult(false, error); return LinkResult(false, error);
...@@ -804,7 +835,6 @@ gl::Error ProgramD3D::save(gl::BinaryOutputStream *stream) ...@@ -804,7 +835,6 @@ gl::Error ProgramD3D::save(gl::BinaryOutputStream *stream)
stream->writeInt(uniformBlock.vsRegisterIndex); stream->writeInt(uniformBlock.vsRegisterIndex);
} }
stream->writeInt(mTransformFeedbackBufferMode);
stream->writeInt(mTransformFeedbackLinkedVaryings.size()); stream->writeInt(mTransformFeedbackLinkedVaryings.size());
for (size_t i = 0; i < mTransformFeedbackLinkedVaryings.size(); i++) for (size_t i = 0; i < mTransformFeedbackLinkedVaryings.size(); i++)
{ {
...@@ -933,10 +963,10 @@ gl::Error ProgramD3D::getPixelExecutableForOutputLayout(const std::vector<GLenum ...@@ -933,10 +963,10 @@ gl::Error ProgramD3D::getPixelExecutableForOutputLayout(const std::vector<GLenum
gl::InfoLog tempInfoLog; gl::InfoLog tempInfoLog;
gl::InfoLog *currentInfoLog = infoLog ? infoLog : &tempInfoLog; gl::InfoLog *currentInfoLog = infoLog ? infoLog : &tempInfoLog;
gl::Error error = mRenderer->compileToExecutable(*currentInfoLog, finalPixelHLSL, SHADER_PIXEL, gl::Error error = mRenderer->compileToExecutable(
mTransformFeedbackLinkedVaryings, *currentInfoLog, finalPixelHLSL, SHADER_PIXEL, mTransformFeedbackLinkedVaryings,
(mTransformFeedbackBufferMode == GL_SEPARATE_ATTRIBS), (mData.getTransformFeedbackBufferMode() == GL_SEPARATE_ATTRIBS), mPixelWorkarounds,
mPixelWorkarounds, &pixelExecutable); &pixelExecutable);
if (error.isError()) if (error.isError())
{ {
return error; return error;
...@@ -981,10 +1011,10 @@ gl::Error ProgramD3D::getVertexExecutableForInputLayout(const gl::InputLayout &i ...@@ -981,10 +1011,10 @@ gl::Error ProgramD3D::getVertexExecutableForInputLayout(const gl::InputLayout &i
gl::InfoLog tempInfoLog; gl::InfoLog tempInfoLog;
gl::InfoLog *currentInfoLog = infoLog ? infoLog : &tempInfoLog; gl::InfoLog *currentInfoLog = infoLog ? infoLog : &tempInfoLog;
gl::Error error = mRenderer->compileToExecutable(*currentInfoLog, finalVertexHLSL, SHADER_VERTEX, gl::Error error = mRenderer->compileToExecutable(
mTransformFeedbackLinkedVaryings, *currentInfoLog, finalVertexHLSL, SHADER_VERTEX, mTransformFeedbackLinkedVaryings,
(mTransformFeedbackBufferMode == GL_SEPARATE_ATTRIBS), (mData.getTransformFeedbackBufferMode() == GL_SEPARATE_ATTRIBS), mVertexWorkarounds,
mVertexWorkarounds, &vertexExecutable); &vertexExecutable);
if (error.isError()) if (error.isError())
{ {
return error; return error;
...@@ -1031,10 +1061,10 @@ LinkResult ProgramD3D::compileProgramExecutables(gl::InfoLog &infoLog, int regis ...@@ -1031,10 +1061,10 @@ LinkResult ProgramD3D::compileProgramExecutables(gl::InfoLog &infoLog, int regis
{ {
std::string geometryHLSL = mDynamicHLSL->generateGeometryShaderHLSL(registers, fragmentShaderD3D, vertexShaderD3D); std::string geometryHLSL = mDynamicHLSL->generateGeometryShaderHLSL(registers, fragmentShaderD3D, vertexShaderD3D);
error = mRenderer->compileToExecutable(
error = mRenderer->compileToExecutable(infoLog, geometryHLSL, SHADER_GEOMETRY, mTransformFeedbackLinkedVaryings, infoLog, geometryHLSL, SHADER_GEOMETRY, mTransformFeedbackLinkedVaryings,
(mTransformFeedbackBufferMode == GL_SEPARATE_ATTRIBS), (mData.getTransformFeedbackBufferMode() == GL_SEPARATE_ATTRIBS),
D3DCompilerWorkarounds(), &mGeometryExecutable); D3DCompilerWorkarounds(), &mGeometryExecutable);
if (error.isError()) if (error.isError())
{ {
return LinkResult(false, error); return LinkResult(false, error);
...@@ -1068,8 +1098,6 @@ LinkResult ProgramD3D::compileProgramExecutables(gl::InfoLog &infoLog, int regis ...@@ -1068,8 +1098,6 @@ LinkResult ProgramD3D::compileProgramExecutables(gl::InfoLog &infoLog, int regis
LinkResult ProgramD3D::link(const gl::Data &data, gl::InfoLog &infoLog, LinkResult ProgramD3D::link(const gl::Data &data, gl::InfoLog &infoLog,
gl::Shader *fragmentShader, gl::Shader *vertexShader, gl::Shader *fragmentShader, gl::Shader *vertexShader,
const std::vector<std::string> &transformFeedbackVaryings,
GLenum transformFeedbackBufferMode,
int *registers, std::vector<gl::LinkedVarying> *linkedVaryings, int *registers, std::vector<gl::LinkedVarying> *linkedVaryings,
std::map<int, gl::VariableLocation> *outputVariables) std::map<int, gl::VariableLocation> *outputVariables)
{ {
...@@ -1079,8 +1107,6 @@ LinkResult ProgramD3D::link(const gl::Data &data, gl::InfoLog &infoLog, ...@@ -1079,8 +1107,6 @@ LinkResult ProgramD3D::link(const gl::Data &data, gl::InfoLog &infoLog,
mSamplersPS.resize(data.caps->maxTextureImageUnits); mSamplersPS.resize(data.caps->maxTextureImageUnits);
mSamplersVS.resize(data.caps->maxVertexTextureImageUnits); mSamplersVS.resize(data.caps->maxVertexTextureImageUnits);
mTransformFeedbackBufferMode = transformFeedbackBufferMode;
mPixelHLSL = fragmentShaderD3D->getTranslatedSource(); mPixelHLSL = fragmentShaderD3D->getTranslatedSource();
fragmentShaderD3D->generateWorkarounds(&mPixelWorkarounds); fragmentShaderD3D->generateWorkarounds(&mPixelWorkarounds);
...@@ -1099,21 +1125,20 @@ LinkResult ProgramD3D::link(const gl::Data &data, gl::InfoLog &infoLog, ...@@ -1099,21 +1125,20 @@ LinkResult ProgramD3D::link(const gl::Data &data, gl::InfoLog &infoLog,
// Map the varyings to the register file // Map the varyings to the register file
VaryingPacking packing = {}; VaryingPacking packing = {};
*registers = mDynamicHLSL->packVaryings(infoLog, packing, fragmentShaderD3D, vertexShaderD3D, transformFeedbackVaryings); *registers = mDynamicHLSL->packVaryings(infoLog, packing, fragmentShaderD3D, vertexShaderD3D,
mData.getTransformFeedbackVaryings());
if (*registers < 0) if (*registers < 0)
{ {
return LinkResult(false, gl::Error(GL_NO_ERROR)); return LinkResult(false, gl::Error(GL_NO_ERROR));
} }
if (!gl::Program::linkVaryings(infoLog, fragmentShader, vertexShader)) LinkVaryingRegisters(infoLog, vertexShaderD3D, fragmentShaderD3D);
{
return LinkResult(false, gl::Error(GL_NO_ERROR));
}
if (!mDynamicHLSL->generateShaderLinkHLSL(data, infoLog, *registers, packing, mPixelHLSL, mVertexHLSL, if (!mDynamicHLSL->generateShaderLinkHLSL(data, infoLog, *registers, packing, mPixelHLSL,
fragmentShaderD3D, vertexShaderD3D, transformFeedbackVaryings, mVertexHLSL, fragmentShaderD3D, vertexShaderD3D,
linkedVaryings, outputVariables, &mPixelShaderKey, &mUsesFragDepth)) mData.getTransformFeedbackVaryings(), linkedVaryings,
outputVariables, &mPixelShaderKey, &mUsesFragDepth))
{ {
return LinkResult(false, gl::Error(GL_NO_ERROR)); return LinkResult(false, gl::Error(GL_NO_ERROR));
} }
...@@ -2016,8 +2041,6 @@ void ProgramD3D::reset() ...@@ -2016,8 +2041,6 @@ void ProgramD3D::reset()
SafeDeleteContainer(mPixelExecutables); SafeDeleteContainer(mPixelExecutables);
SafeDelete(mGeometryExecutable); SafeDelete(mGeometryExecutable);
mTransformFeedbackBufferMode = GL_NONE;
mVertexHLSL.clear(); mVertexHLSL.clear();
mVertexWorkarounds = D3DCompilerWorkarounds(); mVertexWorkarounds = D3DCompilerWorkarounds();
mShaderVersion = 100; mShaderVersion = 100;
......
...@@ -47,7 +47,6 @@ class ProgramD3D : public ProgramImpl ...@@ -47,7 +47,6 @@ class ProgramD3D : public ProgramImpl
const std::vector<PixelShaderOutputVariable> &getPixelShaderKey() { return mPixelShaderKey; } const std::vector<PixelShaderOutputVariable> &getPixelShaderKey() { return mPixelShaderKey; }
int getShaderVersion() const { return mShaderVersion; } int getShaderVersion() const { return mShaderVersion; }
GLenum getTransformFeedbackBufferMode() const { return mTransformFeedbackBufferMode; }
GLint getSamplerMapping(gl::SamplerType type, unsigned int samplerIndex, const gl::Caps &caps) const; GLint getSamplerMapping(gl::SamplerType type, unsigned int samplerIndex, const gl::Caps &caps) const;
GLenum getSamplerTextureType(gl::SamplerType type, unsigned int samplerIndex) const; GLenum getSamplerTextureType(gl::SamplerType type, unsigned int samplerIndex) const;
...@@ -73,8 +72,6 @@ class ProgramD3D : public ProgramImpl ...@@ -73,8 +72,6 @@ class ProgramD3D : public ProgramImpl
LinkResult link(const gl::Data &data, gl::InfoLog &infoLog, LinkResult link(const gl::Data &data, gl::InfoLog &infoLog,
gl::Shader *fragmentShader, gl::Shader *vertexShader, gl::Shader *fragmentShader, gl::Shader *vertexShader,
const std::vector<std::string> &transformFeedbackVaryings,
GLenum transformFeedbackBufferMode,
int *registers, std::vector<gl::LinkedVarying> *linkedVaryings, int *registers, std::vector<gl::LinkedVarying> *linkedVaryings,
std::map<int, gl::VariableLocation> *outputVariables); std::map<int, gl::VariableLocation> *outputVariables);
...@@ -225,8 +222,6 @@ class ProgramD3D : public ProgramImpl ...@@ -225,8 +222,6 @@ class ProgramD3D : public ProgramImpl
UniformStorageD3D *mVertexUniformStorage; UniformStorageD3D *mVertexUniformStorage;
UniformStorageD3D *mFragmentUniformStorage; UniformStorageD3D *mFragmentUniformStorage;
GLenum mTransformFeedbackBufferMode;
std::vector<Sampler> mSamplersPS; std::vector<Sampler> mSamplersPS;
std::vector<Sampler> mSamplersVS; std::vector<Sampler> mSamplersVS;
GLuint mUsedVertexSamplerRange; GLuint mUsedVertexSamplerRange;
......
...@@ -46,12 +46,6 @@ int ProgramGL::getShaderVersion() const ...@@ -46,12 +46,6 @@ int ProgramGL::getShaderVersion() const
return int(); return int();
} }
GLenum ProgramGL::getTransformFeedbackBufferMode() const
{
UNIMPLEMENTED();
return GLenum();
}
GLenum ProgramGL::getBinaryFormat() GLenum ProgramGL::getBinaryFormat()
{ {
UNIMPLEMENTED(); UNIMPLEMENTED();
...@@ -72,16 +66,14 @@ gl::Error ProgramGL::save(gl::BinaryOutputStream *stream) ...@@ -72,16 +66,14 @@ gl::Error ProgramGL::save(gl::BinaryOutputStream *stream)
LinkResult ProgramGL::link(const gl::Data &data, gl::InfoLog &infoLog, LinkResult ProgramGL::link(const gl::Data &data, gl::InfoLog &infoLog,
gl::Shader *fragmentShader, gl::Shader *vertexShader, gl::Shader *fragmentShader, gl::Shader *vertexShader,
const std::vector<std::string> &transformFeedbackVaryings,
GLenum transformFeedbackBufferMode,
int *registers, std::vector<gl::LinkedVarying> *linkedVaryings, int *registers, std::vector<gl::LinkedVarying> *linkedVaryings,
std::map<int, gl::VariableLocation> *outputVariables) std::map<int, gl::VariableLocation> *outputVariables)
{ {
// Reset the program state, delete the current program if one exists // Reset the program state, delete the current program if one exists
reset(); reset();
ShaderGL *vertexShaderGL = GetImplAs<ShaderGL>(vertexShader); const ShaderGL *vertexShaderGL = GetImplAs<ShaderGL>(vertexShader);
ShaderGL *fragmentShaderGL = GetImplAs<ShaderGL>(fragmentShader); const ShaderGL *fragmentShaderGL = GetImplAs<ShaderGL>(fragmentShader);
// Attach the shaders // Attach the shaders
mFunctions->attachShader(mProgramID, vertexShaderGL->getShaderID()); mFunctions->attachShader(mProgramID, vertexShaderGL->getShaderID());
......
...@@ -33,7 +33,6 @@ class ProgramGL : public ProgramImpl ...@@ -33,7 +33,6 @@ class ProgramGL : public ProgramImpl
bool usesPointSize() const override; bool usesPointSize() const override;
int getShaderVersion() const override; int getShaderVersion() const override;
GLenum getTransformFeedbackBufferMode() const override;
GLenum getBinaryFormat() override; GLenum getBinaryFormat() override;
LinkResult load(gl::InfoLog &infoLog, gl::BinaryInputStream *stream) override; LinkResult load(gl::InfoLog &infoLog, gl::BinaryInputStream *stream) override;
...@@ -41,8 +40,6 @@ class ProgramGL : public ProgramImpl ...@@ -41,8 +40,6 @@ class ProgramGL : public ProgramImpl
LinkResult link(const gl::Data &data, gl::InfoLog &infoLog, LinkResult link(const gl::Data &data, gl::InfoLog &infoLog,
gl::Shader *fragmentShader, gl::Shader *vertexShader, gl::Shader *fragmentShader, gl::Shader *vertexShader,
const std::vector<std::string> &transformFeedbackVaryings,
GLenum transformFeedbackBufferMode,
int *registers, std::vector<gl::LinkedVarying> *linkedVaryings, int *registers, std::vector<gl::LinkedVarying> *linkedVaryings,
std::map<int, gl::VariableLocation> *outputVariables) override; 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