Program: Make LinkResult use gl::ErrorOrResult.
This simplifies the error handling code, and allows the use of the
ANGLE_TRY macro (and friends).
BUG=angleproject:1576
Change-Id: I3142388b10d0dd67a7f49a5c8c3d11102996be93
Reviewed-on: https://chromium-review.googlesource.com/411201
Commit-Queue: Jamie Madill <jmadill@chromium.org>
Reviewed-by: Corentin Wallez <cwallez@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 5c94994..d00a873 100644
--- a/src/libANGLE/renderer/d3d/ProgramD3D.cpp
+++ b/src/libANGLE/renderer/d3d/ProgramD3D.cpp
@@ -739,14 +739,14 @@
if (memcmp(&identifier, &binaryDeviceIdentifier, sizeof(DeviceIdentifier)) != 0)
{
infoLog << "Invalid program binary, device configuration has changed.";
- return LinkResult(false, gl::Error(GL_NO_ERROR));
+ return false;
}
int compileFlags = stream->readInt<int>();
if (compileFlags != ANGLE_COMPILE_OPTIMIZATION_LEVEL)
{
infoLog << "Mismatched compilation flags.";
- return LinkResult(false, gl::Error(GL_NO_ERROR));
+ return false;
}
for (int &index : mAttribLocationToD3DSemantic)
@@ -780,7 +780,7 @@
if (stream->error())
{
infoLog << "Invalid program binary.";
- return LinkResult(false, gl::Error(GL_NO_ERROR));
+ return false;
}
const auto &linkedUniforms = mState.getUniforms();
@@ -804,7 +804,7 @@
if (stream->error())
{
infoLog << "Invalid program binary.";
- return LinkResult(false, gl::Error(GL_NO_ERROR));
+ return false;
}
ASSERT(mD3DUniformBlocks.empty());
@@ -853,6 +853,8 @@
const unsigned char *binary = reinterpret_cast<const unsigned char *>(stream->data());
+ bool separateAttribs = (mState.getTransformFeedbackBufferMode() == GL_SEPARATE_ATTRIBS);
+
const unsigned int vertexShaderCount = stream->readInt<unsigned int>();
for (unsigned int vertexShaderIndex = 0; vertexShaderIndex < vertexShaderCount;
vertexShaderIndex++)
@@ -870,18 +872,14 @@
ShaderExecutableD3D *shaderExecutable = nullptr;
- gl::Error error = mRenderer->loadExecutable(
- vertexShaderFunction, vertexShaderSize, SHADER_VERTEX, mStreamOutVaryings,
- (mState.getTransformFeedbackBufferMode() == GL_SEPARATE_ATTRIBS), &shaderExecutable);
- if (error.isError())
- {
- return LinkResult(false, error);
- }
+ ANGLE_TRY(mRenderer->loadExecutable(vertexShaderFunction, vertexShaderSize, SHADER_VERTEX,
+ mStreamOutVaryings, separateAttribs,
+ &shaderExecutable));
if (!shaderExecutable)
{
infoLog << "Could not create vertex shader.";
- return LinkResult(false, gl::Error(GL_NO_ERROR));
+ return false;
}
// generated converted input layout
@@ -909,18 +907,14 @@
const unsigned char *pixelShaderFunction = binary + stream->offset();
ShaderExecutableD3D *shaderExecutable = nullptr;
- gl::Error error = mRenderer->loadExecutable(
- pixelShaderFunction, pixelShaderSize, SHADER_PIXEL, mStreamOutVaryings,
- (mState.getTransformFeedbackBufferMode() == GL_SEPARATE_ATTRIBS), &shaderExecutable);
- if (error.isError())
- {
- return LinkResult(false, error);
- }
+ ANGLE_TRY(mRenderer->loadExecutable(pixelShaderFunction, pixelShaderSize, SHADER_PIXEL,
+ mStreamOutVaryings, separateAttribs,
+ &shaderExecutable));
if (!shaderExecutable)
{
infoLog << "Could not create pixel shader.";
- return LinkResult(false, gl::Error(GL_NO_ERROR));
+ return false;
}
// add new binary
@@ -940,27 +934,22 @@
}
const unsigned char *geometryShaderFunction = binary + stream->offset();
- bool splitAttribs = (mState.getTransformFeedbackBufferMode() == GL_SEPARATE_ATTRIBS);
- gl::Error error = mRenderer->loadExecutable(
- geometryShaderFunction, geometryShaderSize, SHADER_GEOMETRY, mStreamOutVaryings,
- splitAttribs, &mGeometryExecutables[geometryExeIndex]);
- if (error.isError())
- {
- return LinkResult(false, error);
- }
+ ANGLE_TRY(mRenderer->loadExecutable(geometryShaderFunction, geometryShaderSize,
+ SHADER_GEOMETRY, mStreamOutVaryings, separateAttribs,
+ &mGeometryExecutables[geometryExeIndex]));
if (!mGeometryExecutables[geometryExeIndex])
{
infoLog << "Could not create geometry shader.";
- return LinkResult(false, gl::Error(GL_NO_ERROR));
+ return false;
}
stream->skip(geometryShaderSize);
}
initializeUniformStorage();
- return LinkResult(true, gl::Error(GL_NO_ERROR));
+ return true;
}
gl::Error ProgramD3D::save(gl::BinaryOutputStream *stream)
@@ -1289,22 +1278,14 @@
{
const gl::InputLayout &defaultInputLayout =
GetDefaultInputLayoutFromShader(mState.getAttachedVertexShader());
- ShaderExecutableD3D *defaultVertexExecutable = NULL;
- gl::Error error =
- getVertexExecutableForInputLayout(defaultInputLayout, &defaultVertexExecutable, &infoLog);
- if (error.isError())
- {
- return LinkResult(false, error);
- }
+ ShaderExecutableD3D *defaultVertexExecutable = nullptr;
+ ANGLE_TRY(
+ getVertexExecutableForInputLayout(defaultInputLayout, &defaultVertexExecutable, &infoLog));
std::vector<GLenum> defaultPixelOutput = GetDefaultOutputLayoutFromShader(getPixelShaderKey());
- ShaderExecutableD3D *defaultPixelExecutable = NULL;
- error =
- getPixelExecutableForOutputLayout(defaultPixelOutput, &defaultPixelExecutable, &infoLog);
- if (error.isError())
- {
- return LinkResult(false, error);
- }
+ ShaderExecutableD3D *defaultPixelExecutable = nullptr;
+ ANGLE_TRY(
+ getPixelExecutableForOutputLayout(defaultPixelOutput, &defaultPixelExecutable, &infoLog));
// Auto-generate the geometry shader here, if we expect to be using point rendering in D3D11.
ShaderExecutableD3D *pointGS = nullptr;
@@ -1337,9 +1318,8 @@
fragmentShaderD3D->appendDebugInfo(defaultPixelExecutable->getDebugInfo());
}
- bool linkSuccess = (defaultVertexExecutable && defaultPixelExecutable &&
- (!usesGeometryShader(GL_POINTS) || pointGS));
- return LinkResult(linkSuccess, gl::Error(GL_NO_ERROR));
+ return (defaultVertexExecutable && defaultPixelExecutable &&
+ (!usesGeometryShader(GL_POINTS) || pointGS));
}
LinkResult ProgramD3D::link(const gl::ContextState &data, gl::InfoLog &infoLog)
@@ -1363,7 +1343,7 @@
if (fragmentShaderD3D->usesFrontFacing())
{
infoLog << "The current renderer doesn't support gl_FrontFacing";
- return LinkResult(false, gl::Error(GL_NO_ERROR));
+ return false;
}
}
@@ -1375,7 +1355,7 @@
if (!varyingPacking.packVaryings(infoLog, packedVaryings,
mState.getTransformFeedbackVaryingNames()))
{
- return LinkResult(false, gl::Error(GL_NO_ERROR));
+ return false;
}
ProgramD3DMetadata metadata(mRenderer, vertexShaderD3D, fragmentShaderD3D);
@@ -1386,7 +1366,7 @@
if (static_cast<GLuint>(varyingPacking.getRegisterCount()) > data.getCaps().maxVaryingVectors)
{
infoLog << "No varying registers left to support gl_FragCoord/gl_PointCoord";
- return LinkResult(false, gl::Error(GL_NO_ERROR));
+ return false;
}
// TODO(jmadill): Implement more sophisticated component packing in D3D9.
@@ -1396,13 +1376,13 @@
varyingPacking.getMaxSemanticIndex() > data.getCaps().maxVaryingVectors)
{
infoLog << "Cannot pack these varyings on D3D9.";
- return LinkResult(false, gl::Error(GL_NO_ERROR));
+ return false;
}
if (!mDynamicHLSL->generateShaderLinkHLSL(data, mState, metadata, varyingPacking, &mPixelHLSL,
&mVertexHLSL))
{
- return LinkResult(false, gl::Error(GL_NO_ERROR));
+ return false;
}
mUsesPointSize = vertexShaderD3D->usesPointSize();
@@ -1433,12 +1413,12 @@
gatherTransformFeedbackVaryings(varyingPacking);
LinkResult result = compileProgramExecutables(data, infoLog);
- if (result.error.isError())
+ if (result.isError())
{
- infoLog << result.error.getMessage();
+ infoLog << result.getError().getMessage();
return result;
}
- else if (!result.linkSuccess)
+ else if (!result.getResult())
{
infoLog << "Failed to create D3D shaders.";
return result;
@@ -1446,7 +1426,7 @@
initUniformBlockInfo();
- return LinkResult(true, gl::Error(GL_NO_ERROR));
+ return true;
}
GLboolean ProgramD3D::validate(const gl::Caps & /*caps*/, gl::InfoLog * /*infoLog*/)