aboutsummaryrefslogtreecommitdiff
path: root/src/libGLESv2/renderer/d3d
diff options
context:
space:
mode:
authorJamie Madill <jmadill@chromium.org>2014-09-03 09:40:45 -0400
committerJamie Madill <jmadill@chromium.org>2014-09-03 15:52:05 +0000
commit2ad1dc48ed14cb53f7de6d9dea34d88851e1bb2e (patch)
tree190978087434850f0e180c0de1406dc3237d8964 /src/libGLESv2/renderer/d3d
parentd15250e62703537195df41ea6c2412d92aee120a (diff)
downloadangle-2ad1dc48ed14cb53f7de6d9dea34d88851e1bb2e.tar.gz
Compact the D3D shader specializations into one.
BUG=angle:731 Change-Id: I4f35a05aeea130f9011ec62cfe931ed23e2681c9 Reviewed-on: https://chromium-review.googlesource.com/214871 Tested-by: Jamie Madill <jmadill@chromium.org> Reviewed-by: Geoff Lang <geofflang@chromium.org>
Diffstat (limited to 'src/libGLESv2/renderer/d3d')
-rw-r--r--src/libGLESv2/renderer/d3d/DynamicHLSL.cpp16
-rw-r--r--src/libGLESv2/renderer/d3d/DynamicHLSL.h18
-rw-r--r--src/libGLESv2/renderer/d3d/ShaderD3D.cpp107
-rw-r--r--src/libGLESv2/renderer/d3d/ShaderD3D.h57
-rw-r--r--src/libGLESv2/renderer/d3d/d3d11/Renderer11.cpp11
-rw-r--r--src/libGLESv2/renderer/d3d/d3d9/Renderer9.cpp11
6 files changed, 70 insertions, 150 deletions
diff --git a/src/libGLESv2/renderer/d3d/DynamicHLSL.cpp b/src/libGLESv2/renderer/d3d/DynamicHLSL.cpp
index 7086f47b..404525ce 100644
--- a/src/libGLESv2/renderer/d3d/DynamicHLSL.cpp
+++ b/src/libGLESv2/renderer/d3d/DynamicHLSL.cpp
@@ -207,8 +207,8 @@ static bool packVarying(PackedVarying *varying, const int maxVaryingVectors, Var
// Packs varyings into generic varying registers, using the algorithm from [OpenGL ES Shading Language 1.00 rev. 17] appendix A section 7 page 111
// Returns the number of used varying registers, or -1 if unsuccesful
-int DynamicHLSL::packVaryings(InfoLog &infoLog, VaryingPacking packing, rx::FragmentShaderD3D *fragmentShader,
- rx::VertexShaderD3D *vertexShader, const std::vector<std::string>& transformFeedbackVaryings)
+int DynamicHLSL::packVaryings(InfoLog &infoLog, VaryingPacking packing, rx::ShaderD3D *fragmentShader,
+ rx::ShaderD3D *vertexShader, const std::vector<std::string>& transformFeedbackVaryings)
{
// TODO (geofflang): Use context's caps
const int maxVaryingVectors = mRenderer->getRendererCaps().maxVaryingVectors;
@@ -278,7 +278,7 @@ int DynamicHLSL::packVaryings(InfoLog &infoLog, VaryingPacking packing, rx::Frag
return registers;
}
-std::string DynamicHLSL::generateVaryingHLSL(rx::VertexShaderD3D *shader) const
+std::string DynamicHLSL::generateVaryingHLSL(rx::ShaderD3D *shader) const
{
std::string varyingSemantic = getVaryingSemantic(shader->mUsesPointSize);
std::string varyingHLSL;
@@ -607,7 +607,7 @@ void DynamicHLSL::storeBuiltinLinkedVaryings(const SemanticInfo &info,
}
}
-void DynamicHLSL::storeUserLinkedVaryings(const rx::VertexShaderD3D *vertexShader,
+void DynamicHLSL::storeUserLinkedVaryings(const rx::ShaderD3D *vertexShader,
std::vector<LinkedVarying> *linkedVaryings) const
{
const std::string &varyingSemantic = getVaryingSemantic(vertexShader->mUsesPointSize);
@@ -630,7 +630,7 @@ void DynamicHLSL::storeUserLinkedVaryings(const rx::VertexShaderD3D *vertexShade
bool DynamicHLSL::generateShaderLinkHLSL(InfoLog &infoLog, int registers, const VaryingPacking packing,
std::string& pixelHLSL, std::string& vertexHLSL,
- rx::FragmentShaderD3D *fragmentShader, rx::VertexShaderD3D *vertexShader,
+ rx::ShaderD3D *fragmentShader, rx::ShaderD3D *vertexShader,
const std::vector<std::string>& transformFeedbackVaryings,
std::vector<LinkedVarying> *linkedVaryings,
std::map<int, VariableLocation> *programOutputVars,
@@ -956,7 +956,7 @@ bool DynamicHLSL::generateShaderLinkHLSL(InfoLog &infoLog, int registers, const
return true;
}
-void DynamicHLSL::defineOutputVariables(rx::FragmentShaderD3D *fragmentShader, std::map<int, VariableLocation> *programOutputVars) const
+void DynamicHLSL::defineOutputVariables(rx::ShaderD3D *fragmentShader, std::map<int, VariableLocation> *programOutputVars) const
{
const std::vector<sh::Attribute> &shaderOutputVars = fragmentShader->getActiveOutputVariables();
@@ -982,14 +982,14 @@ void DynamicHLSL::defineOutputVariables(rx::FragmentShaderD3D *fragmentShader, s
}
}
-std::string DynamicHLSL::generateGeometryShaderHLSL(int registers, rx::FragmentShaderD3D *fragmentShader, rx::VertexShaderD3D *vertexShader) const
+std::string DynamicHLSL::generateGeometryShaderHLSL(int registers, rx::ShaderD3D *fragmentShader, rx::ShaderD3D *vertexShader) const
{
// for now we only handle point sprite emulation
ASSERT(vertexShader->mUsesPointSize && mRenderer->getMajorShaderModel() >= 4);
return generatePointSpriteHLSL(registers, fragmentShader, vertexShader);
}
-std::string DynamicHLSL::generatePointSpriteHLSL(int registers, rx::FragmentShaderD3D *fragmentShader, rx::VertexShaderD3D *vertexShader) const
+std::string DynamicHLSL::generatePointSpriteHLSL(int registers, rx::ShaderD3D *fragmentShader, rx::ShaderD3D *vertexShader) const
{
ASSERT(registers >= 0);
ASSERT(vertexShader->mUsesPointSize);
diff --git a/src/libGLESv2/renderer/d3d/DynamicHLSL.h b/src/libGLESv2/renderer/d3d/DynamicHLSL.h
index 6ee7b11c..cf619952 100644
--- a/src/libGLESv2/renderer/d3d/DynamicHLSL.h
+++ b/src/libGLESv2/renderer/d3d/DynamicHLSL.h
@@ -42,8 +42,6 @@ namespace rx
{
class Renderer;
class ShaderD3D;
-class VertexShaderD3D;
-class FragmentShaderD3D;
typedef const gl::PackedVarying *VaryingPacking[gl::IMPLEMENTATION_MAX_VARYING_VECTORS][4];
@@ -60,22 +58,22 @@ class DynamicHLSL
public:
explicit DynamicHLSL(rx::Renderer *const renderer);
- int packVaryings(gl::InfoLog &infoLog, VaryingPacking packing, rx::FragmentShaderD3D *fragmentShader,
- rx::VertexShaderD3D *vertexShader, const std::vector<std::string>& transformFeedbackVaryings);
+ int packVaryings(gl::InfoLog &infoLog, VaryingPacking packing, rx::ShaderD3D *fragmentShader,
+ rx::ShaderD3D *vertexShader, const std::vector<std::string>& transformFeedbackVaryings);
std::string generateVertexShaderForInputLayout(const std::string &sourceShader, const gl::VertexFormat inputLayout[],
const sh::Attribute shaderAttributes[]) const;
std::string generatePixelShaderForOutputSignature(const std::string &sourceShader, const std::vector<PixelShaderOuputVariable> &outputVariables,
bool usesFragDepth, const std::vector<GLenum> &outputLayout) const;
bool generateShaderLinkHLSL(gl::InfoLog &infoLog, int registers, const VaryingPacking packing,
std::string& pixelHLSL, std::string& vertexHLSL,
- rx::FragmentShaderD3D *fragmentShader, rx::VertexShaderD3D *vertexShader,
+ rx::ShaderD3D *fragmentShader, rx::ShaderD3D *vertexShader,
const std::vector<std::string>& transformFeedbackVaryings,
std::vector<gl::LinkedVarying> *linkedVaryings,
std::map<int, gl::VariableLocation> *programOutputVars,
std::vector<PixelShaderOuputVariable> *outPixelShaderKey,
bool *outUsesFragDepth) const;
- std::string generateGeometryShaderHLSL(int registers, rx::FragmentShaderD3D *fragmentShader, rx::VertexShaderD3D *vertexShader) const;
+ std::string generateGeometryShaderHLSL(int registers, rx::ShaderD3D *fragmentShader, rx::ShaderD3D *vertexShader) const;
void getInputLayoutSignature(const gl::VertexFormat inputLayout[], GLenum signature[]) const;
private:
@@ -89,11 +87,11 @@ class DynamicHLSL
SemanticInfo getSemanticInfo(int startRegisters, bool fragCoord, bool pointCoord, bool pointSize,
bool pixelShader) const;
std::string generateVaryingLinkHLSL(const SemanticInfo &info, const std::string &varyingHLSL) const;
- std::string generateVaryingHLSL(rx::VertexShaderD3D *shader) const;
- void storeUserLinkedVaryings(const rx::VertexShaderD3D *vertexShader, std::vector<gl::LinkedVarying> *linkedVaryings) const;
+ std::string generateVaryingHLSL(rx::ShaderD3D *shader) const;
+ void storeUserLinkedVaryings(const rx::ShaderD3D *vertexShader, std::vector<gl::LinkedVarying> *linkedVaryings) const;
void storeBuiltinLinkedVaryings(const SemanticInfo &info, std::vector<gl::LinkedVarying> *linkedVaryings) const;
- void defineOutputVariables(rx::FragmentShaderD3D *fragmentShader, std::map<int, gl::VariableLocation> *programOutputVars) const;
- std::string generatePointSpriteHLSL(int registers, rx::FragmentShaderD3D *fragmentShader, rx::VertexShaderD3D *vertexShader) const;
+ void defineOutputVariables(rx::ShaderD3D *fragmentShader, std::map<int, gl::VariableLocation> *programOutputVars) const;
+ std::string generatePointSpriteHLSL(int registers, rx::ShaderD3D *fragmentShader, rx::ShaderD3D *vertexShader) const;
// Prepend an underscore
static std::string decorateVariable(const std::string &name);
diff --git a/src/libGLESv2/renderer/d3d/ShaderD3D.cpp b/src/libGLESv2/renderer/d3d/ShaderD3D.cpp
index f26df10e..a6d5266a 100644
--- a/src/libGLESv2/renderer/d3d/ShaderD3D.cpp
+++ b/src/libGLESv2/renderer/d3d/ShaderD3D.cpp
@@ -27,8 +27,8 @@ const std::vector<VarT> *GetShaderVariables(const std::vector<VarT> *variableLis
return variableList;
}
-ShaderD3D::ShaderD3D(rx::Renderer *renderer)
- : ShaderImpl(),
+ShaderD3D::ShaderD3D(GLenum type, rx::Renderer *renderer)
+ : mType(type),
mRenderer(renderer),
mShaderVersion(100)
{
@@ -340,15 +340,28 @@ unsigned int ShaderD3D::getInterfaceBlockRegister(const std::string &blockName)
return mInterfaceBlockRegisterMap.find(blockName)->second;
}
+void *ShaderD3D::getCompiler()
+{
+ if (mType == GL_VERTEX_SHADER)
+ {
+ return mVertexCompiler;
+ }
+ else
+ {
+ ASSERT(mType == GL_FRAGMENT_SHADER);
+ return mFragmentCompiler;
+ }
+}
+
ShShaderOutput ShaderD3D::getCompilerOutputType(GLenum shader)
{
void *compiler = NULL;
switch (shader)
{
- case GL_VERTEX_SHADER: compiler = mVertexCompiler; break;
- case GL_FRAGMENT_SHADER: compiler = mFragmentCompiler; break;
- default: UNREACHABLE(); return SH_HLSL9_OUTPUT;
+ case GL_VERTEX_SHADER: compiler = mVertexCompiler; break;
+ case GL_FRAGMENT_SHADER: compiler = mFragmentCompiler; break;
+ default: UNREACHABLE(); return SH_HLSL9_OUTPUT;
}
size_t outputType = 0;
@@ -357,47 +370,45 @@ ShShaderOutput ShaderD3D::getCompilerOutputType(GLenum shader)
return static_cast<ShShaderOutput>(outputType);
}
-VertexShaderD3D::VertexShaderD3D(rx::Renderer *renderer) : ShaderD3D(renderer)
+bool ShaderD3D::compile(const std::string &source)
{
-}
+ uncompile();
-VertexShaderD3D::~VertexShaderD3D()
-{
-}
+ void *compiler = getCompiler();
-VertexShaderD3D *VertexShaderD3D::makeVertexShaderD3D(ShaderImpl *impl)
-{
- ASSERT(HAS_DYNAMIC_TYPE(VertexShaderD3D*, impl));
- return static_cast<VertexShaderD3D*>(impl);
-}
+ compileToHLSL(compiler, source);
-const VertexShaderD3D *VertexShaderD3D::makeVertexShaderD3D(const ShaderImpl *impl)
-{
- ASSERT(HAS_DYNAMIC_TYPE(const VertexShaderD3D*, impl));
- return static_cast<const VertexShaderD3D*>(impl);
-}
+ if (mType == GL_VERTEX_SHADER)
+ {
+ parseAttributes(compiler);
+ }
-bool VertexShaderD3D::compile(const std::string &source)
-{
- uncompile();
+ parseVaryings(compiler);
+
+ if (mType == GL_FRAGMENT_SHADER)
+ {
+ std::sort(mVaryings.begin(), mVaryings.end(), compareVarying);
- compileToHLSL(mVertexCompiler, source);
- parseAttributes();
- parseVaryings(mVertexCompiler);
+ const std::string &hlsl = getTranslatedSource();
+ if (!hlsl.empty())
+ {
+ mActiveOutputVariables = *GetShaderVariables(ShGetOutputVariables(compiler));
+ }
+ }
return !getTranslatedSource().empty();
}
-void VertexShaderD3D::parseAttributes()
+void ShaderD3D::parseAttributes(void *compiler)
{
const std::string &hlsl = getTranslatedSource();
if (!hlsl.empty())
{
- mActiveAttributes = *GetShaderVariables(ShGetAttributes(mVertexCompiler));
+ mActiveAttributes = *GetShaderVariables(ShGetAttributes(compiler));
}
}
-int VertexShaderD3D::getSemanticIndex(const std::string &attributeName) const
+int ShaderD3D::getSemanticIndex(const std::string &attributeName) const
{
if (!attributeName.empty())
{
@@ -418,42 +429,4 @@ int VertexShaderD3D::getSemanticIndex(const std::string &attributeName) const
return -1;
}
-FragmentShaderD3D::FragmentShaderD3D(rx::Renderer *renderer) : ShaderD3D(renderer)
-{
-}
-
-FragmentShaderD3D::~FragmentShaderD3D()
-{
-}
-
-FragmentShaderD3D *FragmentShaderD3D::makeFragmentShaderD3D(ShaderImpl *impl)
-{
- ASSERT(HAS_DYNAMIC_TYPE(FragmentShaderD3D*, impl));
- return static_cast<FragmentShaderD3D*>(impl);
-}
-
-const FragmentShaderD3D *FragmentShaderD3D::makeFragmentShaderD3D(const ShaderImpl *impl)
-{
- ASSERT(HAS_DYNAMIC_TYPE(const FragmentShaderD3D*, impl));
- return static_cast<const FragmentShaderD3D*>(impl);
-}
-
-bool FragmentShaderD3D::compile(const std::string &source)
-{
- uncompile();
-
- compileToHLSL(mFragmentCompiler, source);
- parseVaryings(mFragmentCompiler);
-
- std::sort(mVaryings.begin(), mVaryings.end(), compareVarying);
-
- const std::string &hlsl = getTranslatedSource();
- if (!hlsl.empty())
- {
- mActiveOutputVariables = *GetShaderVariables(ShGetOutputVariables(mFragmentCompiler));
- return true;
- }
- return false;
-}
-
}
diff --git a/src/libGLESv2/renderer/d3d/ShaderD3D.h b/src/libGLESv2/renderer/d3d/ShaderD3D.h
index d537f5bb..9f7dc0b8 100644
--- a/src/libGLESv2/renderer/d3d/ShaderD3D.h
+++ b/src/libGLESv2/renderer/d3d/ShaderD3D.h
@@ -23,7 +23,7 @@ class ShaderD3D : public ShaderImpl
friend class DynamicHLSL;
public:
- ShaderD3D(rx::Renderer *renderer);
+ ShaderD3D(GLenum type, rx::Renderer *renderer);
virtual ~ShaderD3D();
static ShaderD3D *makeShaderD3D(ShaderImpl *impl);
@@ -38,6 +38,7 @@ class ShaderD3D : public ShaderImpl
void resetVaryingsRegisterAssignment();
unsigned int getUniformRegister(const std::string &uniformName) const;
unsigned int getInterfaceBlockRegister(const std::string &blockName) const;
+ int getSemanticIndex(const std::string &attributeName) const;
rx::D3DWorkaroundType getD3DWorkarounds() const;
int getShaderVersion() const { return mShaderVersion; }
@@ -47,15 +48,24 @@ class ShaderD3D : public ShaderImpl
static void releaseCompiler();
static ShShaderOutput getCompilerOutputType(GLenum shader);
- protected:
+ virtual bool compile(const std::string &source);
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(ShaderD3D);
+
void compileToHLSL(void *compiler, const std::string &source);
void parseVaryings(void *compiler);
+ void initializeCompiler();
+ void parseAttributes(void *compiler);
+ void *getCompiler();
+
static bool compareVarying(const gl::PackedVarying &x, const gl::PackedVarying &y);
static void *mFragmentCompiler;
static void *mVertexCompiler;
+ GLenum mType;
rx::Renderer *mRenderer;
int mShaderVersion;
@@ -72,55 +82,12 @@ class ShaderD3D : public ShaderImpl
bool mUsesDiscardRewriting;
bool mUsesNestedBreak;
- private:
- DISALLOW_COPY_AND_ASSIGN(ShaderD3D);
-
- void initializeCompiler();
-
std::string mHlsl;
std::string mInfoLog;
std::map<std::string, unsigned int> mUniformRegisterMap;
std::map<std::string, unsigned int> mInterfaceBlockRegisterMap;
};
-class VertexShaderD3D : public ShaderD3D
-{
- friend class DynamicHLSL;
-
- public:
- VertexShaderD3D(rx::Renderer *renderer);
- virtual ~VertexShaderD3D();
-
- static VertexShaderD3D *makeVertexShaderD3D(ShaderImpl *impl);
- static const VertexShaderD3D *makeVertexShaderD3D(const ShaderImpl *impl);
-
- virtual bool compile(const std::string &source);
-
- int getSemanticIndex(const std::string &attributeName) const;
-
- private:
- DISALLOW_COPY_AND_ASSIGN(VertexShaderD3D);
-
- void parseAttributes();
-};
-
-class FragmentShaderD3D : public ShaderD3D
-{
- friend class DynamicHLSL;
-
- public:
- FragmentShaderD3D(rx::Renderer *renderer);
- virtual ~FragmentShaderD3D();
-
- static FragmentShaderD3D *makeFragmentShaderD3D(ShaderImpl *impl);
- static const FragmentShaderD3D *makeFragmentShaderD3D(const ShaderImpl *impl);
-
- virtual bool compile(const std::string &source);
-
- private:
- DISALLOW_COPY_AND_ASSIGN(FragmentShaderD3D);
-};
-
}
#endif // LIBGLESV2_RENDERER_SHADERD3D_H_
diff --git a/src/libGLESv2/renderer/d3d/d3d11/Renderer11.cpp b/src/libGLESv2/renderer/d3d/d3d11/Renderer11.cpp
index 3a276e1a..33c39de3 100644
--- a/src/libGLESv2/renderer/d3d/d3d11/Renderer11.cpp
+++ b/src/libGLESv2/renderer/d3d/d3d11/Renderer11.cpp
@@ -2207,16 +2207,7 @@ RenderTarget *Renderer11::createRenderTarget(int width, int height, GLenum forma
ShaderImpl *Renderer11::createShader(GLenum type)
{
- switch (type)
- {
- case GL_VERTEX_SHADER:
- return new VertexShaderD3D(this);
- case GL_FRAGMENT_SHADER:
- return new FragmentShaderD3D(this);
- default:
- UNREACHABLE();
- return NULL;
- }
+ return new ShaderD3D(type, this);
}
void Renderer11::releaseShaderCompiler()
diff --git a/src/libGLESv2/renderer/d3d/d3d9/Renderer9.cpp b/src/libGLESv2/renderer/d3d/d3d9/Renderer9.cpp
index e26dcc7b..7b0e14b7 100644
--- a/src/libGLESv2/renderer/d3d/d3d9/Renderer9.cpp
+++ b/src/libGLESv2/renderer/d3d/d3d9/Renderer9.cpp
@@ -2760,16 +2760,7 @@ RenderTarget *Renderer9::createRenderTarget(int width, int height, GLenum format
ShaderImpl *Renderer9::createShader(GLenum type)
{
- switch (type)
- {
- case GL_VERTEX_SHADER:
- return new VertexShaderD3D(this);
- case GL_FRAGMENT_SHADER:
- return new FragmentShaderD3D(this);
- default:
- UNREACHABLE();
- return NULL;
- }
+ return new ShaderD3D(type, this);
}
void Renderer9::releaseShaderCompiler()