summaryrefslogtreecommitdiff
path: root/chromium/third_party/angle/src/libANGLE/renderer/d3d/ProgramD3D.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/third_party/angle/src/libANGLE/renderer/d3d/ProgramD3D.cpp')
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/d3d/ProgramD3D.cpp51
1 files changed, 30 insertions, 21 deletions
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/d3d/ProgramD3D.cpp b/chromium/third_party/angle/src/libANGLE/renderer/d3d/ProgramD3D.cpp
index d62bb7244a1..5c949945bc1 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/d3d/ProgramD3D.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/d3d/ProgramD3D.cpp
@@ -377,16 +377,14 @@ D3DVarying::D3DVarying(const std::string &semanticNameIn,
// ProgramD3DMetadata Implementation
-ProgramD3DMetadata::ProgramD3DMetadata(int rendererMajorShaderModel,
- const std::string &shaderModelSuffix,
- bool usesInstancedPointSpriteEmulation,
- bool usesViewScale,
+ProgramD3DMetadata::ProgramD3DMetadata(RendererD3D *renderer,
const ShaderD3D *vertexShader,
const ShaderD3D *fragmentShader)
- : mRendererMajorShaderModel(rendererMajorShaderModel),
- mShaderModelSuffix(shaderModelSuffix),
- mUsesInstancedPointSpriteEmulation(usesInstancedPointSpriteEmulation),
- mUsesViewScale(usesViewScale),
+ : mRendererMajorShaderModel(renderer->getMajorShaderModel()),
+ mShaderModelSuffix(renderer->getShaderModelSuffix()),
+ mUsesInstancedPointSpriteEmulation(
+ renderer->getWorkarounds().useInstancedPointSpriteEmulation),
+ mUsesViewScale(renderer->presentPathFastEnabled()),
mVertexShader(vertexShader),
mFragmentShader(fragmentShader)
{
@@ -399,7 +397,7 @@ int ProgramD3DMetadata::getRendererMajorShaderModel() const
bool ProgramD3DMetadata::usesBroadcast(const gl::ContextState &data) const
{
- return (mFragmentShader->usesFragColor() && data.getClientVersion() < 3);
+ return (mFragmentShader->usesFragColor() && data.getClientMajorVersion() < 3);
}
bool ProgramD3DMetadata::usesFragDepth() const
@@ -424,7 +422,8 @@ bool ProgramD3DMetadata::usesPointSize() const
bool ProgramD3DMetadata::usesInsertedPointCoordValue() const
{
- return !usesPointSize() && usesPointCoord() && mRendererMajorShaderModel >= 4;
+ return (!usesPointSize() || !mUsesInstancedPointSpriteEmulation) && usesPointCoord() &&
+ mRendererMajorShaderModel >= 4;
}
bool ProgramD3DMetadata::usesViewScale() const
@@ -434,13 +433,12 @@ bool ProgramD3DMetadata::usesViewScale() const
bool ProgramD3DMetadata::addsPointCoordToVertexShader() const
{
- // Instanced PointSprite emulation requires that gl_PointCoord is present in the vertex shader
+ // PointSprite emulation requiress that gl_PointCoord is present in the vertex shader
// VS_OUTPUT structure to ensure compatibility with the generated PS_INPUT of the pixel shader.
- // GeometryShader PointSprite emulation does not require this additional entry because the
- // GS_OUTPUT of the Geometry shader contains the pointCoord value and already matches the
- // PS_INPUT of the generated pixel shader. The Geometry Shader point sprite implementation needs
- // gl_PointSize to be in VS_OUTPUT and GS_INPUT. Instanced point sprites doesn't need
- // gl_PointSize in VS_OUTPUT.
+ // Even with a geometry shader, the app can render triangles or lines and reference
+ // gl_PointCoord in the fragment shader, requiring us to provide a dummy value. For
+ // simplicity, we always add this to the vertex shader when the fragment shader
+ // references gl_PointCoord, even if we could skip it in the geometry shader.
return (mUsesInstancedPointSpriteEmulation && usesPointCoord()) ||
usesInsertedPointCoordValue();
}
@@ -1380,10 +1378,7 @@ LinkResult ProgramD3D::link(const gl::ContextState &data, gl::InfoLog &infoLog)
return LinkResult(false, gl::Error(GL_NO_ERROR));
}
- ProgramD3DMetadata metadata(mRenderer->getMajorShaderModel(), mRenderer->getShaderModelSuffix(),
- usesInstancedPointSpriteEmulation(),
- mRenderer->presentPathFastEnabled(), vertexShaderD3D,
- fragmentShaderD3D);
+ ProgramD3DMetadata metadata(mRenderer, vertexShaderD3D, fragmentShaderD3D);
varyingPacking.enableBuiltins(SHADER_VERTEX, metadata);
varyingPacking.enableBuiltins(SHADER_PIXEL, metadata);
@@ -1438,7 +1433,12 @@ LinkResult ProgramD3D::link(const gl::ContextState &data, gl::InfoLog &infoLog)
gatherTransformFeedbackVaryings(varyingPacking);
LinkResult result = compileProgramExecutables(data, infoLog);
- if (result.error.isError() || !result.linkSuccess)
+ if (result.error.isError())
+ {
+ infoLog << result.error.getMessage();
+ return result;
+ }
+ else if (!result.linkSuccess)
{
infoLog << "Failed to create D3D shaders.";
return result;
@@ -2309,4 +2309,13 @@ bool ProgramD3D::getUniformBlockMemberInfo(const std::string &memberUniformName,
*memberInfoOut = infoIter->second;
return true;
}
+
+void ProgramD3D::setPathFragmentInputGen(const std::string &inputName,
+ GLenum genMode,
+ GLint components,
+ const GLfloat *coeffs)
+{
+ UNREACHABLE();
+}
+
} // namespace rx