summaryrefslogtreecommitdiffstats
path: root/src/3rdparty/angle/src/libANGLE/renderer/d3d/DynamicHLSL.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/3rdparty/angle/src/libANGLE/renderer/d3d/DynamicHLSL.h')
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/DynamicHLSL.h123
1 files changed, 97 insertions, 26 deletions
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/DynamicHLSL.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/DynamicHLSL.h
index 69d941c06a..fe8d9cb0a3 100644
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/DynamicHLSL.h
+++ b/src/3rdparty/angle/src/libANGLE/renderer/d3d/DynamicHLSL.h
@@ -16,6 +16,7 @@
#include "common/angleutils.h"
#include "libANGLE/Constants.h"
#include "libANGLE/Program.h"
+#include "libANGLE/angletypes.h"
#include "libANGLE/formatutils.h"
#include "libANGLE/renderer/d3d/RendererD3D.h"
@@ -29,23 +30,88 @@ namespace gl
{
class InfoLog;
struct VariableLocation;
+class VaryingPacking;
struct VertexAttribute;
-struct Data;
}
namespace rx
{
-struct PackedVarying;
class ProgramD3DMetadata;
class ShaderD3D;
-class VaryingPacking;
struct PixelShaderOutputVariable
{
- GLenum type;
+ PixelShaderOutputVariable() {}
+ PixelShaderOutputVariable(GLenum typeIn,
+ const std::string &nameIn,
+ const std::string &sourceIn,
+ size_t outputIndexIn)
+ : type(typeIn), name(nameIn), source(sourceIn), outputIndex(outputIndexIn)
+ {
+ }
+
+ GLenum type = GL_NONE;
std::string name;
std::string source;
- size_t outputIndex;
+ size_t outputIndex = 0;
+};
+
+struct BuiltinVarying final : private angle::NonCopyable
+{
+ BuiltinVarying();
+
+ std::string str() const;
+ void enableSystem(const std::string &systemValueSemantic);
+ void enable(const std::string &semanticVal, unsigned int indexVal);
+
+ bool enabled;
+ std::string semantic;
+ unsigned int index;
+ bool systemValue;
+};
+
+struct BuiltinInfo
+{
+ BuiltinInfo();
+ ~BuiltinInfo();
+
+ BuiltinVarying dxPosition;
+ BuiltinVarying glPosition;
+ BuiltinVarying glFragCoord;
+ BuiltinVarying glPointCoord;
+ BuiltinVarying glPointSize;
+ BuiltinVarying glViewIDOVR;
+ BuiltinVarying glViewportIndex;
+ BuiltinVarying glLayer;
+};
+
+inline std::string GetVaryingSemantic(int majorShaderModel, bool programUsesPointSize)
+{
+ // SM3 reserves the TEXCOORD semantic for point sprite texcoords (gl_PointCoord)
+ // In D3D11 we manually compute gl_PointCoord in the GS.
+ return ((programUsesPointSize && majorShaderModel < 4) ? "COLOR" : "TEXCOORD");
+}
+
+class BuiltinVaryingsD3D
+{
+ public:
+ BuiltinVaryingsD3D(const ProgramD3DMetadata &metadata, const gl::VaryingPacking &packing);
+ ~BuiltinVaryingsD3D();
+
+ bool usesPointSize() const { return mBuiltinInfo[gl::SHADER_VERTEX].glPointSize.enabled; }
+
+ const BuiltinInfo &operator[](gl::ShaderType shaderType) const
+ {
+ return mBuiltinInfo[shaderType];
+ }
+ BuiltinInfo &operator[](gl::ShaderType shaderType) { return mBuiltinInfo[shaderType]; }
+
+ private:
+ void updateBuiltins(gl::ShaderType shaderType,
+ const ProgramD3DMetadata &metadata,
+ const gl::VaryingPacking &packing);
+
+ std::array<BuiltinInfo, gl::SHADER_TYPE_MAX> mBuiltinInfo;
};
class DynamicHLSL : angle::NonCopyable
@@ -62,43 +128,48 @@ class DynamicHLSL : angle::NonCopyable
const std::vector<PixelShaderOutputVariable> &outputVariables,
bool usesFragDepth,
const std::vector<GLenum> &outputLayout) const;
- bool generateShaderLinkHLSL(const gl::Data &data,
- const gl::Program::Data &programData,
+ void generateShaderLinkHLSL(const gl::Context *context,
+ const gl::ProgramState &programData,
const ProgramD3DMetadata &programMetadata,
- const VaryingPacking &varyingPacking,
+ const gl::VaryingPacking &varyingPacking,
+ const BuiltinVaryingsD3D &builtinsD3D,
std::string *pixelHLSL,
std::string *vertexHLSL) const;
+ std::string generateComputeShaderLinkHLSL(const gl::Context *context,
+ const gl::ProgramState &programData) const;
- std::string generateGeometryShaderPreamble(const VaryingPacking &varyingPacking) const;
+ std::string generateGeometryShaderPreamble(const gl::VaryingPacking &varyingPacking,
+ const BuiltinVaryingsD3D &builtinsD3D,
+ const bool hasANGLEMultiviewEnabled,
+ const bool selectViewInVS) const;
- std::string generateGeometryShaderHLSL(gl::PrimitiveType primitiveType,
- const gl::Data &data,
- const gl::Program::Data &programData,
+ std::string generateGeometryShaderHLSL(const gl::Context *context,
+ gl::PrimitiveType primitiveType,
+ const gl::ProgramState &programData,
const bool useViewScale,
+ const bool hasANGLEMultiviewEnabled,
+ const bool selectViewInVS,
+ const bool pointSpriteEmulation,
const std::string &preambleString) const;
- void getPixelShaderOutputKey(const gl::Data &data,
- const gl::Program::Data &programData,
+ void getPixelShaderOutputKey(const gl::ContextState &data,
+ const gl::ProgramState &programData,
const ProgramD3DMetadata &metadata,
std::vector<PixelShaderOutputVariable> *outPixelShaderKey);
private:
RendererD3D *const mRenderer;
- void generateVaryingLinkHLSL(ShaderType shaderType,
- const VaryingPacking &varyingPacking,
- std::stringstream &linkStream) const;
- void generateVaryingHLSL(const VaryingPacking &varyingPacking,
- std::stringstream &hlslStream) const;
-
- // Prepend an underscore
- static std::string decorateVariable(const std::string &name);
+ void generateVaryingLinkHLSL(const gl::VaryingPacking &varyingPacking,
+ const BuiltinInfo &builtins,
+ bool programUsesPointSize,
+ std::ostringstream &hlslStream) const;
- std::string generateAttributeConversionHLSL(gl::VertexFormatType vertexFormatType,
- const sh::ShaderVariable &shaderAttrib) const;
+ static void GenerateAttributeConversionHLSL(gl::VertexFormatType vertexFormatType,
+ const sh::ShaderVariable &shaderAttrib,
+ std::ostringstream &outStream);
};
-std::string GetVaryingSemantic(int majorShaderModel, bool programUsesPointSize);
-}
+} // namespace rx
#endif // LIBANGLE_RENDERER_D3D_DYNAMICHLSL_H_