Commit 4e31ad55 by Jamie Madill

D3D11: Add dynamic geometry shaders.

The geometry shader we want will depend on our current draw mode, and if we're using flat shading in the shader. Without flat shading, we'll still be using them only for point sprites, but for other primitive types with flat shading enabled, we'll be using them to correct the provoking vertex order with D3D11. Note: no new features in this CL, those are turned on in follow-ups. BUG=angleproject:754 Change-Id: Iabf13ffd582f5a7200ee0df5aa9c3671aa7b6ed4 Reviewed-on: https://chromium-review.googlesource.com/309154Reviewed-by: 's avatarGeoff Lang <geofflang@chromium.org> Tested-by: 's avatarJamie Madill <jmadill@chromium.org>
parent 76f8fa66
...@@ -70,9 +70,9 @@ void SafeDelete(T*& resource) ...@@ -70,9 +70,9 @@ void SafeDelete(T*& resource)
template <typename T> template <typename T>
void SafeDeleteContainer(T& resource) void SafeDeleteContainer(T& resource)
{ {
for (typename T::iterator i = resource.begin(); i != resource.end(); i++) for (auto &element : resource)
{ {
SafeDelete(*i); SafeDelete(element);
} }
resource.clear(); resource.clear();
} }
......
...@@ -74,10 +74,11 @@ class DynamicHLSL : angle::NonCopyable ...@@ -74,10 +74,11 @@ class DynamicHLSL : angle::NonCopyable
public: public:
explicit DynamicHLSL(RendererD3D *const renderer); explicit DynamicHLSL(RendererD3D *const renderer);
int packVaryings(const gl::Caps &caps, bool packVaryings(const gl::Caps &caps,
gl::InfoLog &infoLog, gl::InfoLog &infoLog,
std::vector<PackedVarying> *packedVaryings, std::vector<PackedVarying> *packedVaryings,
const std::vector<std::string> &transformFeedbackVaryings); const std::vector<std::string> &transformFeedbackVaryings,
unsigned int *registerCountOut);
std::string generateVertexShaderForInputLayout( std::string generateVertexShaderForInputLayout(
const std::string &sourceShader, const std::string &sourceShader,
const gl::InputLayout &inputLayout, const gl::InputLayout &inputLayout,
...@@ -90,7 +91,7 @@ class DynamicHLSL : angle::NonCopyable ...@@ -90,7 +91,7 @@ class DynamicHLSL : angle::NonCopyable
bool generateShaderLinkHLSL(const gl::Data &data, bool generateShaderLinkHLSL(const gl::Data &data,
const gl::Program::Data &programData, const gl::Program::Data &programData,
gl::InfoLog &infoLog, gl::InfoLog &infoLog,
int registers, unsigned int registerCount,
std::string *pixelHLSL, std::string *pixelHLSL,
std::string *vertexHLSL, std::string *vertexHLSL,
const std::vector<PackedVarying> &packedVaryings, const std::vector<PackedVarying> &packedVaryings,
...@@ -98,19 +99,24 @@ class DynamicHLSL : angle::NonCopyable ...@@ -98,19 +99,24 @@ class DynamicHLSL : angle::NonCopyable
std::vector<PixelShaderOutputVariable> *outPixelShaderKey, std::vector<PixelShaderOutputVariable> *outPixelShaderKey,
bool *outUsesFragDepth) const; bool *outUsesFragDepth) const;
std::string generateGeometryShaderHLSL(gl::PrimitiveType primitiveType, std::string generateGeometryShaderPreamble(
const gl::Data &data, const gl::Data &data,
const gl::Program::Data &programData, const gl::Program::Data &programData,
int registers, unsigned int registers,
const std::vector<PackedVarying> &packedVaryings) const; const std::vector<PackedVarying> &packedVaryings) const;
std::string generateGeometryShaderHLSL(gl::PrimitiveType primitiveType,
const gl::Data &data,
const gl::Program::Data &programData,
const std::string &preambleString) const;
private: private:
RendererD3D *const mRenderer; RendererD3D *const mRenderer;
struct SemanticInfo; struct SemanticInfo;
std::string getVaryingSemantic(bool pointSize) const; std::string getVaryingSemantic(bool pointSize) const;
SemanticInfo getSemanticInfo(int startRegisters, SemanticInfo getSemanticInfo(unsigned int startRegisters,
bool position, bool position,
bool fragCoord, bool fragCoord,
bool pointCoord, bool pointCoord,
......
...@@ -113,7 +113,10 @@ class ProgramD3D : public ProgramImpl ...@@ -113,7 +113,10 @@ class ProgramD3D : public ProgramImpl
gl::Error getVertexExecutableForInputLayout(const gl::InputLayout &inputLayout, gl::Error getVertexExecutableForInputLayout(const gl::InputLayout &inputLayout,
ShaderExecutableD3D **outExectuable, ShaderExecutableD3D **outExectuable,
gl::InfoLog *infoLog); gl::InfoLog *infoLog);
ShaderExecutableD3D *getGeometryExecutable() const { return mGeometryExecutable; } gl::Error getGeometryExecutableForPrimitiveType(const gl::Data &data,
GLenum drawMode,
ShaderExecutableD3D **outExecutable,
gl::InfoLog *infoLog);
LinkResult link(const gl::Data &data, gl::InfoLog &infoLog) override; LinkResult link(const gl::Data &data, gl::InfoLog &infoLog) override;
GLboolean validate(const gl::Caps &caps, gl::InfoLog *infoLog) override; GLboolean validate(const gl::Caps &caps, gl::InfoLog *infoLog) override;
...@@ -278,10 +281,7 @@ class ProgramD3D : public ProgramImpl ...@@ -278,10 +281,7 @@ class ProgramD3D : public ProgramImpl
const GLfloat *value, const GLfloat *value,
GLenum targetUniformType); GLenum targetUniformType);
LinkResult compileProgramExecutables(const gl::Data &data, LinkResult compileProgramExecutables(const gl::Data &data, gl::InfoLog &infoLog);
gl::InfoLog &infoLog,
int registers,
const std::vector<PackedVarying> &packedVaryings);
void gatherTransformFeedbackVaryings(const std::vector<gl::LinkedVarying> &varyings); void gatherTransformFeedbackVaryings(const std::vector<gl::LinkedVarying> &varyings);
D3DUniform *getD3DUniformByName(const std::string &name); D3DUniform *getD3DUniformByName(const std::string &name);
...@@ -301,7 +301,7 @@ class ProgramD3D : public ProgramImpl ...@@ -301,7 +301,7 @@ class ProgramD3D : public ProgramImpl
std::vector<VertexExecutable *> mVertexExecutables; std::vector<VertexExecutable *> mVertexExecutables;
std::vector<PixelExecutable *> mPixelExecutables; std::vector<PixelExecutable *> mPixelExecutables;
ShaderExecutableD3D *mGeometryExecutable; std::vector<ShaderExecutableD3D *> mGeometryExecutables;
std::string mVertexHLSL; std::string mVertexHLSL;
D3DCompilerWorkarounds mVertexWorkarounds; D3DCompilerWorkarounds mVertexWorkarounds;
...@@ -311,6 +311,11 @@ class ProgramD3D : public ProgramImpl ...@@ -311,6 +311,11 @@ class ProgramD3D : public ProgramImpl
bool mUsesFragDepth; bool mUsesFragDepth;
std::vector<PixelShaderOutputVariable> mPixelShaderKey; std::vector<PixelShaderOutputVariable> mPixelShaderKey;
// Common code for all dynamic geometry shaders. Consists mainly of the GS input and output
// structures, built from the linked varying info. We store the string itself instead of the
// packed varyings for simplicity.
std::string mGeometryShaderPreamble;
bool mUsesPointSize; bool mUsesPointSize;
UniformStorageD3D *mVertexUniformStorage; UniformStorageD3D *mVertexUniformStorage;
......
...@@ -195,7 +195,7 @@ gl::Error RendererD3D::genericDrawElements(const gl::Data &data, ...@@ -195,7 +195,7 @@ gl::Error RendererD3D::genericDrawElements(const gl::Data &data,
return error; return error;
} }
error = applyShaders(data); error = applyShaders(data, mode);
if (error.isError()) if (error.isError())
{ {
return error; return error;
...@@ -270,7 +270,7 @@ gl::Error RendererD3D::genericDrawArrays(const gl::Data &data, ...@@ -270,7 +270,7 @@ gl::Error RendererD3D::genericDrawArrays(const gl::Data &data,
return error; return error;
} }
error = applyShaders(data); error = applyShaders(data, mode);
if (error.isError()) if (error.isError())
{ {
return error; return error;
...@@ -436,13 +436,13 @@ gl::Error RendererD3D::applyState(const gl::Data &data, GLenum drawMode) ...@@ -436,13 +436,13 @@ gl::Error RendererD3D::applyState(const gl::Data &data, GLenum drawMode)
} }
// Applies the shaders and shader constants to the Direct3D device // Applies the shaders and shader constants to the Direct3D device
gl::Error RendererD3D::applyShaders(const gl::Data &data) gl::Error RendererD3D::applyShaders(const gl::Data &data, GLenum drawMode)
{ {
gl::Program *program = data.state->getProgram(); gl::Program *program = data.state->getProgram();
ProgramD3D *programD3D = GetImplAs<ProgramD3D>(program); ProgramD3D *programD3D = GetImplAs<ProgramD3D>(program);
programD3D->updateCachedInputLayout(*data.state); programD3D->updateCachedInputLayout(*data.state);
gl::Error error = applyShadersImpl(data); gl::Error error = applyShadersImpl(data, drawMode);
if (error.isError()) if (error.isError())
{ {
return error; return error;
......
...@@ -242,7 +242,7 @@ class RendererD3D : public Renderer, public BufferFactoryD3D ...@@ -242,7 +242,7 @@ class RendererD3D : public Renderer, public BufferFactoryD3D
protected: protected:
virtual bool getLUID(LUID *adapterLuid) const = 0; virtual bool getLUID(LUID *adapterLuid) const = 0;
virtual gl::Error applyShadersImpl(const gl::Data &data) = 0; virtual gl::Error applyShadersImpl(const gl::Data &data, GLenum drawMode) = 0;
void cleanup(); void cleanup();
...@@ -296,7 +296,7 @@ class RendererD3D : public Renderer, public BufferFactoryD3D ...@@ -296,7 +296,7 @@ class RendererD3D : public Renderer, public BufferFactoryD3D
gl::Error applyRenderTarget(const gl::Data &data, GLenum drawMode, bool ignoreViewport); gl::Error applyRenderTarget(const gl::Data &data, GLenum drawMode, bool ignoreViewport);
gl::Error applyState(const gl::Data &data, GLenum drawMode); gl::Error applyState(const gl::Data &data, GLenum drawMode);
gl::Error applyShaders(const gl::Data &data); gl::Error applyShaders(const gl::Data &data, GLenum drawMode);
gl::Error applyTextures(const gl::Data &data, gl::SamplerType shaderType, gl::Error applyTextures(const gl::Data &data, gl::SamplerType shaderType,
const FramebufferTextureArray &framebufferTextures, size_t framebufferTextureCount); const FramebufferTextureArray &framebufferTextures, size_t framebufferTextureCount);
gl::Error applyTextures(const gl::Data &data); gl::Error applyTextures(const gl::Data &data);
......
...@@ -1711,7 +1711,15 @@ gl::Error Renderer11::drawArraysImpl(const gl::Data &data, ...@@ -1711,7 +1711,15 @@ gl::Error Renderer11::drawArraysImpl(const gl::Data &data,
mDeviceContext->PSSetShader(pixelShader, NULL, 0); mDeviceContext->PSSetShader(pixelShader, NULL, 0);
// Retrieve the point sprite geometry shader // Retrieve the point sprite geometry shader
rx::ShaderExecutableD3D *geometryExe = programD3D->getGeometryExecutable(); rx::ShaderExecutableD3D *geometryExe = nullptr;
error = programD3D->getGeometryExecutableForPrimitiveType(data, mode, &geometryExe,
nullptr);
if (error.isError())
{
return error;
}
ID3D11GeometryShader *geometryShader = (geometryExe ? GetAs<ShaderExecutable11>(geometryExe)->getGeometryShader() : NULL); ID3D11GeometryShader *geometryShader = (geometryExe ? GetAs<ShaderExecutable11>(geometryExe)->getGeometryShader() : NULL);
mAppliedGeometryShader = reinterpret_cast<uintptr_t>(geometryShader); mAppliedGeometryShader = reinterpret_cast<uintptr_t>(geometryShader);
ASSERT(geometryShader); ASSERT(geometryShader);
...@@ -2045,7 +2053,7 @@ gl::Error Renderer11::drawTriangleFan(GLsizei count, GLenum type, const GLvoid * ...@@ -2045,7 +2053,7 @@ gl::Error Renderer11::drawTriangleFan(GLsizei count, GLenum type, const GLvoid *
return gl::Error(GL_NO_ERROR); return gl::Error(GL_NO_ERROR);
} }
gl::Error Renderer11::applyShadersImpl(const gl::Data &data) gl::Error Renderer11::applyShadersImpl(const gl::Data &data, GLenum drawMode)
{ {
ProgramD3D *programD3D = GetImplAs<ProgramD3D>(data.state->getProgram()); ProgramD3D *programD3D = GetImplAs<ProgramD3D>(data.state->getProgram());
const auto &inputLayout = programD3D->getCachedInputLayout(); const auto &inputLayout = programD3D->getCachedInputLayout();
...@@ -2065,7 +2073,13 @@ gl::Error Renderer11::applyShadersImpl(const gl::Data &data) ...@@ -2065,7 +2073,13 @@ gl::Error Renderer11::applyShadersImpl(const gl::Data &data)
return error; return error;
} }
ShaderExecutableD3D *geometryExe = programD3D->getGeometryExecutable(); ShaderExecutableD3D *geometryExe = nullptr;
error =
programD3D->getGeometryExecutableForPrimitiveType(data, drawMode, &geometryExe, nullptr);
if (error.isError())
{
return error;
}
ID3D11VertexShader *vertexShader = (vertexExe ? GetAs<ShaderExecutable11>(vertexExe)->getVertexShader() : NULL); ID3D11VertexShader *vertexShader = (vertexExe ? GetAs<ShaderExecutable11>(vertexExe)->getVertexShader() : NULL);
...@@ -2083,7 +2097,7 @@ gl::Error Renderer11::applyShadersImpl(const gl::Data &data) ...@@ -2083,7 +2097,7 @@ gl::Error Renderer11::applyShadersImpl(const gl::Data &data)
{ {
geometryShader = (vertexExe ? GetAs<ShaderExecutable11>(vertexExe)->getStreamOutShader() : NULL); geometryShader = (vertexExe ? GetAs<ShaderExecutable11>(vertexExe)->getStreamOutShader() : NULL);
} }
else if (mCurRasterState.pointDrawMode) else
{ {
geometryShader = (geometryExe ? GetAs<ShaderExecutable11>(geometryExe)->getGeometryShader() : NULL); geometryShader = (geometryExe ? GetAs<ShaderExecutable11>(geometryExe)->getGeometryShader() : NULL);
} }
......
...@@ -132,7 +132,6 @@ class Renderer11 : public RendererD3D ...@@ -132,7 +132,6 @@ class Renderer11 : public RendererD3D
virtual bool applyPrimitiveType(GLenum mode, GLsizei count, bool usesPointSize); virtual bool applyPrimitiveType(GLenum mode, GLsizei count, bool usesPointSize);
gl::Error applyRenderTarget(const gl::Framebuffer *frameBuffer) override; gl::Error applyRenderTarget(const gl::Framebuffer *frameBuffer) override;
gl::Error applyUniforms(const ProgramD3D &programD3D, gl::Error applyUniforms(const ProgramD3D &programD3D,
const std::vector<D3DUniform *> &uniformArray) override; const std::vector<D3DUniform *> &uniformArray) override;
virtual gl::Error applyVertexBuffer(const gl::State &state, GLenum mode, GLint first, GLsizei count, GLsizei instances, SourceIndexData *sourceIndexInfo); virtual gl::Error applyVertexBuffer(const gl::State &state, GLenum mode, GLint first, GLsizei count, GLsizei instances, SourceIndexData *sourceIndexInfo);
...@@ -269,7 +268,7 @@ class Renderer11 : public RendererD3D ...@@ -269,7 +268,7 @@ class Renderer11 : public RendererD3D
protected: protected:
void createAnnotator() override; void createAnnotator() override;
gl::Error clearTextures(gl::SamplerType samplerType, size_t rangeStart, size_t rangeEnd) override; gl::Error clearTextures(gl::SamplerType samplerType, size_t rangeStart, size_t rangeEnd) override;
gl::Error applyShadersImpl(const gl::Data &data) override; gl::Error applyShadersImpl(const gl::Data &data, GLenum drawMode) override;
private: private:
gl::Error drawArraysImpl(const gl::Data &data, gl::Error drawArraysImpl(const gl::Data &data,
......
...@@ -1862,7 +1862,7 @@ gl::Error Renderer9::getCountingIB(size_t count, StaticIndexBufferInterface **ou ...@@ -1862,7 +1862,7 @@ gl::Error Renderer9::getCountingIB(size_t count, StaticIndexBufferInterface **ou
return gl::Error(GL_NO_ERROR); return gl::Error(GL_NO_ERROR);
} }
gl::Error Renderer9::applyShadersImpl(const gl::Data &data) gl::Error Renderer9::applyShadersImpl(const gl::Data &data, GLenum /*drawMode*/)
{ {
ProgramD3D *programD3D = GetImplAs<ProgramD3D>(data.state->getProgram()); ProgramD3D *programD3D = GetImplAs<ProgramD3D>(data.state->getProgram());
const auto &inputLayout = programD3D->getCachedInputLayout(); const auto &inputLayout = programD3D->getCachedInputLayout();
......
...@@ -235,7 +235,7 @@ class Renderer9 : public RendererD3D ...@@ -235,7 +235,7 @@ class Renderer9 : public RendererD3D
protected: protected:
void createAnnotator() override; void createAnnotator() override;
gl::Error clearTextures(gl::SamplerType samplerType, size_t rangeStart, size_t rangeEnd) override; gl::Error clearTextures(gl::SamplerType samplerType, size_t rangeStart, size_t rangeEnd) override;
gl::Error applyShadersImpl(const gl::Data &data) override; gl::Error applyShadersImpl(const gl::Data &data, GLenum drawMode) override;
private: private:
gl::Error drawArraysImpl(const gl::Data &data, gl::Error drawArraysImpl(const gl::Data &data,
......
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