Hash :
785e8a0b
Author :
Date :
2018-10-04T17:42:00
Remove gl::LinkResult. Instead of returning a small struct from LinkProgram calls we use angle::Result. Linking can have 3 cases: - the link was successful -> angle::Result::Continue - the link failed -> angle::Result::Incomplete - there was an internal error -> angle::Result::Stop Note that any unexpected Incomplete is still an error. Each function that accepts Incomplete must check explicitly. This is the last user of ErrorOrResult. Bug: angleproject:2491 Change-Id: Idba23be27efe4b561720a4bdd8fe486b40779497 Reviewed-on: https://chromium-review.googlesource.com/c/1255645 Commit-Queue: Jamie Madill <jmadill@chromium.org> Reviewed-by: Yuly Novikov <ynovikov@google.com>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125
//
// Copyright (c) 2014 The ANGLE Project Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//
// Error.cpp: Implements the egl::Error and gl::Error classes which encapsulate API errors
// and optional error messages.
#include "libANGLE/Error.h"
#include "common/angleutils.h"
#include "common/debug.h"
#include "common/utilities.h"
#include <cstdarg>
namespace
{
std::unique_ptr<std::string> EmplaceErrorString(std::string &&message)
{
return message.empty() ? std::unique_ptr<std::string>()
: std::unique_ptr<std::string>(new std::string(std::move(message)));
}
} // anonymous namespace
namespace gl
{
Error::Error(GLenum errorCode, std::string &&message)
: mCode(errorCode), mID(errorCode), mMessage(EmplaceErrorString(std::move(message)))
{
}
Error::Error(GLenum errorCode, GLuint id, std::string &&message)
: mCode(errorCode), mID(id), mMessage(EmplaceErrorString(std::move(message)))
{
}
void Error::createMessageString() const
{
if (!mMessage)
{
mMessage.reset(new std::string(GetGenericErrorMessage(mCode)));
}
}
const std::string &Error::getMessage() const
{
createMessageString();
return *mMessage;
}
bool Error::operator==(const Error &other) const
{
if (mCode != other.mCode)
return false;
// TODO(jmadill): Compare extended error codes instead of strings.
if ((!mMessage || !other.mMessage) && (!mMessage != !other.mMessage))
return false;
return (*mMessage == *other.mMessage);
}
bool Error::operator!=(const Error &other) const
{
return !(*this == other);
}
std::ostream &operator<<(std::ostream &os, const Error &err)
{
return gl::FmtHex(os, err.getCode());
}
} // namespace gl
namespace egl
{
Error::Error(EGLint errorCode, std::string &&message)
: mCode(errorCode), mID(errorCode), mMessage(EmplaceErrorString(std::move(message)))
{
}
Error::Error(EGLint errorCode, EGLint id, std::string &&message)
: mCode(errorCode), mID(id), mMessage(EmplaceErrorString(std::move(message)))
{
}
void Error::createMessageString() const
{
if (!mMessage)
{
mMessage.reset(new std::string(GetGenericErrorMessage(mCode)));
}
}
const std::string &Error::getMessage() const
{
createMessageString();
return *mMessage;
}
std::ostream &operator<<(std::ostream &os, const Error &err)
{
return gl::FmtHex(os, err.getCode());
}
} // namespace egl
// angle::Result Implementation.
namespace angle
{
Result::operator gl::Error() const
{
if (mValue == Value::Continue)
{
return gl::NoError();
}
else
{
return gl::Error(GL_INTERNAL_ERROR_ANGLEX);
}
}
} // namespace angle