Move some D3D-specific stuff into ProgramD3D.
BUG=angle:773
Change-Id: I48b42e7a3e82a43d3dde16a8d1016d28280eae39
Reviewed-on: https://chromium-review.googlesource.com/232968
Reviewed-by: Jamie Madill <jmadill@chromium.org>
Tested-by: Jamie Madill <jmadill@chromium.org>
diff --git a/src/libANGLE/Program.cpp b/src/libANGLE/Program.cpp
index ea83387..026e19b 100644
--- a/src/libANGLE/Program.cpp
+++ b/src/libANGLE/Program.cpp
@@ -8,13 +8,12 @@
// and related functionality. [OpenGL ES 2.0.24] section 2.10.3 page 28.
#include "libANGLE/Program.h"
-#include "libANGLE/ResourceManager.h"
+
#include "libANGLE/Data.h"
+#include "libANGLE/ResourceManager.h"
#include "libANGLE/features.h"
#include "libANGLE/renderer/Renderer.h"
#include "libANGLE/renderer/ProgramImpl.h"
-#include "libANGLE/renderer/d3d/ShaderD3D.h"
-#include "libANGLE/renderer/d3d/VertexDataManager.h"
#include "common/debug.h"
#include "common/version.h"
@@ -322,6 +321,11 @@
}
ASSERT(mVertexShader->getType() == GL_VERTEX_SHADER);
+ if (!linkAttributes(mInfoLog, mAttributeBindings, mVertexShader))
+ {
+ return Error(GL_NO_ERROR);
+ }
+
int registers;
std::vector<LinkedVarying> linkedVaryings;
rx::LinkResult result = mProgram->link(data, mInfoLog, mFragmentShader, mVertexShader, mTransformFeedbackVaryings, mTransformFeedbackBufferMode,
@@ -331,11 +335,6 @@
return result.error;
}
- if (!linkAttributes(mInfoLog, mAttributeBindings, mVertexShader))
- {
- return Error(GL_NO_ERROR);
- }
-
if (!mProgram->linkUniforms(mInfoLog, *mVertexShader, *mFragmentShader, *data.caps))
{
return Error(GL_NO_ERROR);
@@ -398,8 +397,6 @@
}
std::fill(mLinkedAttribute, mLinkedAttribute + ArraySize(mLinkedAttribute), sh::Attribute());
- std::fill(mSemanticIndex, mSemanticIndex + ArraySize(mSemanticIndex), -1);
- std::fill(mAttributesByLayout, mAttributesByLayout + ArraySize(mAttributesByLayout), -1);
mOutputVariables.clear();
mProgram->reset();
@@ -454,11 +451,9 @@
stream.readString(&mLinkedAttribute[i].name);
stream.readInt(&mProgram->getShaderAttributes()[i].type);
stream.readString(&mProgram->getShaderAttributes()[i].name);
- stream.readInt(&mSemanticIndex[i]);
+ stream.readInt(&mProgram->getSemanticIndexes()[i]);
}
- initAttributesByLayout();
-
rx::LinkResult result = mProgram->load(mInfoLog, &stream);
if (result.error.isError() || !result.linkSuccess)
{
@@ -490,7 +485,7 @@
stream.writeString(mLinkedAttribute[i].name);
stream.writeInt(mProgram->getShaderAttributes()[i].type);
stream.writeString(mProgram->getShaderAttributes()[i].name);
- stream.writeInt(mSemanticIndex[i]);
+ stream.writeInt(mProgram->getSemanticIndexes()[i]);
}
gl::Error error = mProgram->save(&stream);
@@ -622,7 +617,7 @@
{
ASSERT(attributeIndex >= 0 && attributeIndex < MAX_VERTEX_ATTRIBS);
- return mSemanticIndex[attributeIndex];
+ return mProgram->getSemanticIndexes()[attributeIndex];
}
void Program::getActiveAttribute(GLuint index, GLsizei bufsize, GLsizei *length, GLint *size, GLenum *type, GLchar *name)
@@ -1238,50 +1233,6 @@
return mTransformFeedbackBufferMode;
}
-struct AttributeSorter
-{
- AttributeSorter(const int(&semanticIndices)[MAX_VERTEX_ATTRIBS])
- : originalIndices(semanticIndices)
- {
- }
-
- bool operator()(int a, int b)
- {
- if (originalIndices[a] == -1) return false;
- if (originalIndices[b] == -1) return true;
- return (originalIndices[a] < originalIndices[b]);
- }
-
- const int(&originalIndices)[MAX_VERTEX_ATTRIBS];
-};
-
-void Program::initAttributesByLayout()
-{
- for (int i = 0; i < MAX_VERTEX_ATTRIBS; i++)
- {
- mAttributesByLayout[i] = i;
- }
-
- std::sort(&mAttributesByLayout[0], &mAttributesByLayout[MAX_VERTEX_ATTRIBS], AttributeSorter(mSemanticIndex));
-}
-
-void Program::sortAttributesByLayout(rx::TranslatedAttribute attributes[MAX_VERTEX_ATTRIBS], int sortedSemanticIndices[MAX_VERTEX_ATTRIBS]) const
-{
- rx::TranslatedAttribute oldTranslatedAttributes[MAX_VERTEX_ATTRIBS];
-
- for (int i = 0; i < MAX_VERTEX_ATTRIBS; i++)
- {
- oldTranslatedAttributes[i] = attributes[i];
- }
-
- for (int i = 0; i < MAX_VERTEX_ATTRIBS; i++)
- {
- int oldIndex = mAttributesByLayout[i];
- sortedSemanticIndices[i] = mSemanticIndex[oldIndex];
- attributes[i] = oldTranslatedAttributes[oldIndex];
- }
-}
-
bool Program::linkVaryings(InfoLog &infoLog, Shader *fragmentShader, Shader *vertexShader)
{
std::vector<PackedVarying> &fragmentVaryings = fragmentShader->getVaryings();
@@ -1346,8 +1297,6 @@
// Determines the mapping between GL attributes and Direct3D 9 vertex stream usage indices
bool Program::linkAttributes(InfoLog &infoLog, const AttributeBindings &attributeBindings, const Shader *vertexShader)
{
- const rx::ShaderD3D *vertexShaderD3D = rx::ShaderD3D::makeShaderD3D(vertexShader->getImplementation());
-
unsigned int usedLocations = 0;
const std::vector<sh::Attribute> &shaderAttributes = vertexShader->getActiveAttributes();
@@ -1422,17 +1371,15 @@
for (int attributeIndex = 0; attributeIndex < MAX_VERTEX_ATTRIBS; )
{
- int index = vertexShaderD3D->getSemanticIndex(mLinkedAttribute[attributeIndex].name);
+ int index = vertexShader->getSemanticIndex(mLinkedAttribute[attributeIndex].name);
int rows = VariableRegisterCount(mLinkedAttribute[attributeIndex].type);
for (int r = 0; r < rows; r++)
{
- mSemanticIndex[attributeIndex++] = index++;
+ mProgram->getSemanticIndexes()[attributeIndex++] = index++;
}
}
- initAttributesByLayout();
-
return true;
}