D3D: Move some HLSL-specific code to a new folder.
This code doesn't actually call any D3D runtime methods, so it can be
included in our cross platform unit tests. Just include the varying
packing code for now.
BUG=angleproject:1296
BUG=angleproject:1638
Change-Id: I5c0ccccb00e1c13ca98448256be048f7cd0968ce
Reviewed-on: https://chromium-review.googlesource.com/417116
Commit-Queue: Jamie Madill <jmadill@chromium.org>
Reviewed-by: Geoff Lang <geofflang@chromium.org>
diff --git a/src/libANGLE/renderer/d3d/ProgramD3D.cpp b/src/libANGLE/renderer/d3d/ProgramD3D.cpp
index 723a5c5..4728e79 100644
--- a/src/libANGLE/renderer/d3d/ProgramD3D.cpp
+++ b/src/libANGLE/renderer/d3d/ProgramD3D.cpp
@@ -21,8 +21,8 @@
#include "libANGLE/renderer/d3d/RendererD3D.h"
#include "libANGLE/renderer/d3d/ShaderD3D.h"
#include "libANGLE/renderer/d3d/ShaderExecutableD3D.h"
-#include "libANGLE/renderer/d3d/VaryingPacking.h"
#include "libANGLE/renderer/d3d/VertexDataManager.h"
+#include "libANGLE/renderer/d3d/hlsl/VaryingPacking.h"
using namespace angle;
@@ -473,6 +473,60 @@
return mFragmentShader;
}
+void ProgramD3DMetadata::updatePackingBuiltins(ShaderType shaderType, VaryingPacking *packing)
+{
+ const std::string &userSemantic =
+ GetVaryingSemantic(mRendererMajorShaderModel, usesSystemValuePointSize());
+
+ unsigned int reservedSemanticIndex = packing->getMaxSemanticIndex();
+
+ VaryingPacking::BuiltinInfo *builtins = &packing->builtins(shaderType);
+
+ if (mRendererMajorShaderModel >= 4)
+ {
+ builtins->dxPosition.enableSystem("SV_Position");
+ }
+ else if (shaderType == SHADER_PIXEL)
+ {
+ builtins->dxPosition.enableSystem("VPOS");
+ }
+ else
+ {
+ builtins->dxPosition.enableSystem("POSITION");
+ }
+
+ if (usesTransformFeedbackGLPosition())
+ {
+ builtins->glPosition.enable(userSemantic, reservedSemanticIndex++);
+ }
+
+ if (usesFragCoord())
+ {
+ builtins->glFragCoord.enable(userSemantic, reservedSemanticIndex++);
+ }
+
+ if (shaderType == SHADER_VERTEX ? addsPointCoordToVertexShader() : usesPointCoord())
+ {
+ // SM3 reserves the TEXCOORD semantic for point sprite texcoords (gl_PointCoord)
+ // In D3D11 we manually compute gl_PointCoord in the GS.
+ if (mRendererMajorShaderModel >= 4)
+ {
+ builtins->glPointCoord.enable(userSemantic, reservedSemanticIndex++);
+ }
+ else
+ {
+ builtins->glPointCoord.enable("TEXCOORD", 0);
+ }
+ }
+
+ // Special case: do not include PSIZE semantic in HLSL 3 pixel shaders
+ if (usesSystemValuePointSize() &&
+ (shaderType != SHADER_PIXEL || mRendererMajorShaderModel >= 4))
+ {
+ builtins->glPointSize.enableSystem("PSIZE");
+ }
+}
+
// ProgramD3D Implementation
ProgramD3D::VertexExecutable::VertexExecutable(const gl::InputLayout &inputLayout,
@@ -1444,8 +1498,8 @@
ProgramD3DMetadata metadata(mRenderer, vertexShaderD3D, fragmentShaderD3D);
- varyingPacking.enableBuiltins(SHADER_VERTEX, metadata);
- varyingPacking.enableBuiltins(SHADER_PIXEL, metadata);
+ metadata.updatePackingBuiltins(SHADER_VERTEX, &varyingPacking);
+ metadata.updatePackingBuiltins(SHADER_PIXEL, &varyingPacking);
if (static_cast<GLuint>(varyingPacking.getRegisterCount()) > data.getCaps().maxVaryingVectors)
{
@@ -1486,7 +1540,7 @@
if (mRenderer->getMajorShaderModel() >= 4)
{
- varyingPacking.enableBuiltins(SHADER_GEOMETRY, metadata);
+ metadata.updatePackingBuiltins(SHADER_GEOMETRY, &varyingPacking);
mGeometryShaderPreamble = mDynamicHLSL->generateGeometryShaderPreamble(varyingPacking);
}