summaryrefslogtreecommitdiff
path: root/chromium/third_party/angle/src/libANGLE/renderer/gl
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/third_party/angle/src/libANGLE/renderer/gl')
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/gl/ContextGL.cpp4
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/gl/ContextGL.h2
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/gl/ProgramGL.cpp34
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/gl/ProgramGL.h6
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/gl/QueryGL.cpp2
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/gl/RendererGL.cpp2
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/gl/RendererGL.h4
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/gl/ShaderGL.cpp8
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/gl/ShaderGL.h2
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/gl/StateManagerGL.cpp2
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/gl/StateManagerGL.h1
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/gl/TransformFeedbackGL.cpp22
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/gl/TransformFeedbackGL.h5
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/gl/VertexArrayGL.cpp14
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/gl/egl/FunctionsEGL.cpp13
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/gl/egl/android/NativeBufferImageSiblingAndroid.cpp65
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/gl/egl/android/NativeBufferImageSiblingAndroid.h8
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/gl/egl/android/android_util.cpp158
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/gl/egl/android/android_util.h23
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/gl/glx/FunctionsGLX.cpp17
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/gl/renderergl_utils.cpp18
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/gl/wgl/DisplayWGL.cpp33
22 files changed, 135 insertions, 308 deletions
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/gl/ContextGL.cpp b/chromium/third_party/angle/src/libANGLE/renderer/gl/ContextGL.cpp
index 2cb10e22c72..14464ccdaa6 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/gl/ContextGL.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/gl/ContextGL.cpp
@@ -508,9 +508,9 @@ void ContextGL::popGroupMarker()
mRenderer->popGroupMarker();
}
-void ContextGL::pushDebugGroup(GLenum source, GLuint id, GLsizei length, const char *message)
+void ContextGL::pushDebugGroup(GLenum source, GLuint id, const std::string &message)
{
- mRenderer->pushDebugGroup(source, id, length, message);
+ mRenderer->pushDebugGroup(source, id, message);
}
void ContextGL::popDebugGroup()
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/gl/ContextGL.h b/chromium/third_party/angle/src/libANGLE/renderer/gl/ContextGL.h
index 9e513cfe378..263e40f5fcb 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/gl/ContextGL.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/gl/ContextGL.h
@@ -173,7 +173,7 @@ class ContextGL : public ContextImpl
void popGroupMarker() override;
// KHR_debug
- void pushDebugGroup(GLenum source, GLuint id, GLsizei length, const char *message) override;
+ void pushDebugGroup(GLenum source, GLuint id, const std::string &message) override;
void popDebugGroup() override;
// State sync with dirty bits.
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/gl/ProgramGL.cpp b/chromium/third_party/angle/src/libANGLE/renderer/gl/ProgramGL.cpp
index b5422e1c9c6..2585d1fa1ee 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/gl/ProgramGL.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/gl/ProgramGL.cpp
@@ -57,9 +57,9 @@ ProgramGL::~ProgramGL()
mProgramID = 0;
}
-angle::Result ProgramGL::load(const gl::Context *context,
- gl::InfoLog &infoLog,
- gl::BinaryInputStream *stream)
+std::unique_ptr<LinkEvent> ProgramGL::load(const gl::Context *context,
+ gl::BinaryInputStream *stream,
+ gl::InfoLog &infoLog)
{
preLink();
@@ -75,13 +75,13 @@ angle::Result ProgramGL::load(const gl::Context *context,
// Verify that the program linked
if (!checkLinkStatus(infoLog))
{
- return angle::Result::Incomplete;
+ return std::make_unique<LinkEventDone>(angle::Result::Incomplete);
}
postLink();
reapplyUBOBindingsIfNeeded(context);
- return angle::Result::Continue;
+ return std::make_unique<LinkEventDone>(angle::Result::Continue);
}
void ProgramGL::save(const gl::Context *context, gl::BinaryOutputStream *stream)
@@ -130,22 +130,24 @@ void ProgramGL::setSeparable(bool separable)
mFunctions->programParameteri(mProgramID, GL_PROGRAM_SEPARABLE, separable ? GL_TRUE : GL_FALSE);
}
-using LinkImplFunctor = std::function<bool()>;
+using LinkImplFunctor = std::function<bool(std::string &)>;
class ProgramGL::LinkTask final : public angle::Closure
{
public:
LinkTask(LinkImplFunctor &&functor) : mLinkImplFunctor(functor), mFallbackToMainContext(false)
{}
- void operator()() override { mFallbackToMainContext = mLinkImplFunctor(); }
+ void operator()() override { mFallbackToMainContext = mLinkImplFunctor(mInfoLog); }
bool fallbackToMainContext() { return mFallbackToMainContext; }
+ const std::string &getInfoLog() { return mInfoLog; }
private:
LinkImplFunctor mLinkImplFunctor;
bool mFallbackToMainContext;
+ std::string mInfoLog;
};
-using PostLinkImplFunctor = std::function<angle::Result(bool)>;
+using PostLinkImplFunctor = std::function<angle::Result(bool, const std::string &)>;
class ProgramGL::LinkEventGL final : public LinkEvent
{
public:
@@ -162,7 +164,7 @@ class ProgramGL::LinkEventGL final : public LinkEvent
angle::Result wait(const gl::Context *context) override
{
mWaitableEvent->wait();
- return mPostLinkImplFunctor(mLinkTask->fallbackToMainContext());
+ return mPostLinkImplFunctor(mLinkTask->fallbackToMainContext(), mLinkTask->getInfoLog());
}
bool isLinking() override { return !mWaitableEvent->isReady(); }
@@ -358,13 +360,13 @@ std::unique_ptr<LinkEvent> ProgramGL::link(const gl::Context *context,
}
}
auto workerPool = context->getWorkerThreadPool();
- auto linkTask = std::make_shared<LinkTask>([this]() {
- std::string infoLog;
- ScopedWorkerContextGL worker(mRenderer.get(), &infoLog);
+ auto linkTask = std::make_shared<LinkTask>([this](std::string &infoLog) {
+ std::string workerInfoLog;
+ ScopedWorkerContextGL worker(mRenderer.get(), &workerInfoLog);
if (!worker())
{
#if !defined(NDEBUG)
- WARN() << "bindWorkerContext failed." << std::endl << infoLog;
+ infoLog += "bindWorkerContext failed.\n" + workerInfoLog;
#endif
// Fallback to the main context.
return true;
@@ -379,7 +381,9 @@ std::unique_ptr<LinkEvent> ProgramGL::link(const gl::Context *context,
return false;
});
- auto postLinkImplTask = [this, &infoLog, &resources](bool fallbackToMainContext) {
+ auto postLinkImplTask = [this, &infoLog, &resources](bool fallbackToMainContext,
+ const std::string &workerInfoLog) {
+ infoLog << workerInfoLog;
if (fallbackToMainContext)
{
mFunctions->linkProgram(mProgramID);
@@ -433,7 +437,7 @@ std::unique_ptr<LinkEvent> ProgramGL::link(const gl::Context *context,
}
else
{
- return std::make_unique<LinkEventDone>(postLinkImplTask(true));
+ return std::make_unique<LinkEventDone>(postLinkImplTask(true, std::string()));
}
}
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/gl/ProgramGL.h b/chromium/third_party/angle/src/libANGLE/renderer/gl/ProgramGL.h
index 73f5afe8036..c92398f401f 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/gl/ProgramGL.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/gl/ProgramGL.h
@@ -33,9 +33,9 @@ class ProgramGL : public ProgramImpl
const std::shared_ptr<RendererGL> &renderer);
~ProgramGL() override;
- angle::Result load(const gl::Context *context,
- gl::InfoLog &infoLog,
- gl::BinaryInputStream *stream) override;
+ std::unique_ptr<LinkEvent> load(const gl::Context *context,
+ gl::BinaryInputStream *stream,
+ gl::InfoLog &infoLog) override;
void save(const gl::Context *context, gl::BinaryOutputStream *stream) override;
void setBinaryRetrievableHint(bool retrievable) override;
void setSeparable(bool separable) override;
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/gl/QueryGL.cpp b/chromium/third_party/angle/src/libANGLE/renderer/gl/QueryGL.cpp
index 23f4ef6b2e1..459e555dd25 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/gl/QueryGL.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/gl/QueryGL.cpp
@@ -326,7 +326,7 @@ angle::Result SyncQueryGL::end(const gl::Context *context)
else if (nativegl::SupportsOcclusionQueries(mFunctions))
{
mSyncProvider.reset(new SyncProviderGLQuery(mFunctions));
- ANGLE_TRY(mSyncProvider->init(context, gl::QueryType::AnySamples))
+ ANGLE_TRY(mSyncProvider->init(context, gl::QueryType::AnySamples));
}
else
{
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/gl/RendererGL.cpp b/chromium/third_party/angle/src/libANGLE/renderer/gl/RendererGL.cpp
index 2655aaaf1ee..042ead517d3 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/gl/RendererGL.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/gl/RendererGL.cpp
@@ -422,7 +422,7 @@ void RendererGL::pushGroupMarker(GLsizei length, const char *marker) {}
void RendererGL::popGroupMarker() {}
-void RendererGL::pushDebugGroup(GLenum source, GLuint id, GLsizei length, const char *message) {}
+void RendererGL::pushDebugGroup(GLenum source, GLuint id, const std::string &message) {}
void RendererGL::popDebugGroup() {}
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/gl/RendererGL.h b/chromium/third_party/angle/src/libANGLE/renderer/gl/RendererGL.h
index f1eb3964dd2..f8f6c6b632b 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/gl/RendererGL.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/gl/RendererGL.h
@@ -51,7 +51,7 @@ class StateManagerGL;
class WorkerContext : angle::NonCopyable
{
public:
- virtual ~WorkerContext(){};
+ virtual ~WorkerContext() {}
virtual bool makeCurrent() = 0;
virtual void unmakeCurrent() = 0;
@@ -146,7 +146,7 @@ class RendererGL : angle::NonCopyable
void popGroupMarker();
// KHR_debug
- void pushDebugGroup(GLenum source, GLuint id, GLsizei length, const char *message);
+ void pushDebugGroup(GLenum source, GLuint id, const std::string &message);
void popDebugGroup();
std::string getVendorString() const;
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/gl/ShaderGL.cpp b/chromium/third_party/angle/src/libANGLE/renderer/gl/ShaderGL.cpp
index e4c6c2e4472..4067d6ad29a 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/gl/ShaderGL.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/gl/ShaderGL.cpp
@@ -177,10 +177,10 @@ void ShaderGL::compileAndCheckShader(const char *source)
}
}
-void ShaderGL::compileAsync(const std::string &source)
+void ShaderGL::compileAsync(const std::string &source, std::string &infoLog)
{
- std::string infoLog;
- ScopedWorkerContextGL worker(mRenderer.get(), &infoLog);
+ std::string workerInfoLog;
+ ScopedWorkerContextGL worker(mRenderer.get(), &workerInfoLog);
if (worker())
{
compileAndCheckShader(source.c_str());
@@ -189,7 +189,7 @@ void ShaderGL::compileAsync(const std::string &source)
else
{
#if !defined(NDEBUG)
- WARN() << "bindWorkerContext failed." << std::endl << infoLog;
+ infoLog += "bindWorkerContext failed.\n" + workerInfoLog;
#endif
}
}
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/gl/ShaderGL.h b/chromium/third_party/angle/src/libANGLE/renderer/gl/ShaderGL.h
index cb10679b126..43d2ba5e335 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/gl/ShaderGL.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/gl/ShaderGL.h
@@ -32,7 +32,7 @@ class ShaderGL : public ShaderImpl
ShCompileOptions prepareSourceAndReturnOptions(const gl::Context *context,
std::stringstream *sourceStream,
std::string *sourcePath) override;
- void compileAsync(const std::string &source) override;
+ void compileAsync(const std::string &source, std::string &infoLog) override;
bool postTranslateCompile(gl::ShCompilerInstance *compiler, std::string *infoLog) override;
std::string getDebugInfo() const override;
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/gl/StateManagerGL.cpp b/chromium/third_party/angle/src/libANGLE/renderer/gl/StateManagerGL.cpp
index a67f97489f0..3ddbcb379d5 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/gl/StateManagerGL.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/gl/StateManagerGL.cpp
@@ -2245,7 +2245,7 @@ void StateManagerGL::syncTransformFeedbackState(const gl::Context *context)
TransformFeedbackGL *transformFeedbackGL =
GetImplAs<TransformFeedbackGL>(transformFeedback);
bindTransformFeedback(GL_TRANSFORM_FEEDBACK, transformFeedbackGL->getTransformFeedbackID());
- transformFeedbackGL->syncActiveState(transformFeedback->isActive(),
+ transformFeedbackGL->syncActiveState(context, transformFeedback->isActive(),
transformFeedback->getPrimitiveMode());
transformFeedbackGL->syncPausedState(transformFeedback->isPaused());
mCurrentTransformFeedback = transformFeedbackGL;
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/gl/StateManagerGL.h b/chromium/third_party/angle/src/libANGLE/renderer/gl/StateManagerGL.h
index b40bea8c1f2..41c903e0895 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/gl/StateManagerGL.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/gl/StateManagerGL.h
@@ -173,6 +173,7 @@ class StateManagerGL final : angle::NonCopyable
}
}
+ GLuint getProgramID() const { return mProgram; }
GLuint getVertexArrayID() const { return mVAO; }
GLuint getFramebufferID(angle::FramebufferBinding binding) const
{
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/gl/TransformFeedbackGL.cpp b/chromium/third_party/angle/src/libANGLE/renderer/gl/TransformFeedbackGL.cpp
index fbddad97225..8255ffb3396 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/gl/TransformFeedbackGL.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/gl/TransformFeedbackGL.cpp
@@ -9,10 +9,14 @@
#include "libANGLE/renderer/gl/TransformFeedbackGL.h"
#include "common/debug.h"
+#include "libANGLE/Context.h"
#include "libANGLE/State.h"
#include "libANGLE/renderer/gl/BufferGL.h"
#include "libANGLE/renderer/gl/FunctionsGL.h"
+#include "libANGLE/renderer/gl/ProgramGL.h"
#include "libANGLE/renderer/gl/StateManagerGL.h"
+#include "libANGLE/renderer/gl/WorkaroundsGL.h"
+#include "libANGLE/renderer/gl/renderergl_utils.h"
namespace rx
{
@@ -25,7 +29,8 @@ TransformFeedbackGL::TransformFeedbackGL(const gl::TransformFeedbackState &state
mStateManager(stateManager),
mTransformFeedbackID(0),
mIsActive(false),
- mIsPaused(false)
+ mIsPaused(false),
+ mActiveProgram(0)
{
mFunctions->genTransformFeedbacks(1, &mTransformFeedbackID);
}
@@ -48,7 +53,7 @@ angle::Result TransformFeedbackGL::end(const gl::Context *context)
mStateManager->onTransformFeedbackStateChange();
// Immediately end the transform feedback so that the results are visible.
- syncActiveState(false, gl::PrimitiveMode::InvalidEnum);
+ syncActiveState(context, false, gl::PrimitiveMode::InvalidEnum);
return angle::Result::Continue;
}
@@ -107,7 +112,9 @@ GLuint TransformFeedbackGL::getTransformFeedbackID() const
return mTransformFeedbackID;
}
-void TransformFeedbackGL::syncActiveState(bool active, gl::PrimitiveMode primitiveMode) const
+void TransformFeedbackGL::syncActiveState(const gl::Context *context,
+ bool active,
+ gl::PrimitiveMode primitiveMode) const
{
if (mIsActive != active)
{
@@ -118,11 +125,20 @@ void TransformFeedbackGL::syncActiveState(bool active, gl::PrimitiveMode primiti
if (mIsActive)
{
ASSERT(primitiveMode != gl::PrimitiveMode::InvalidEnum);
+ mActiveProgram = GetImplAs<ProgramGL>(mState.getBoundProgram())->getProgramID();
+ mStateManager->useProgram(mActiveProgram);
mFunctions->beginTransformFeedback(gl::ToGLenum(primitiveMode));
}
else
{
+ // Implementations disagree about what should happen if a different program is bound
+ // when calling EndTransformFeedback. We avoid the ambiguity by always re-binding the
+ // program associated with this transform feedback.
+ GLuint previousProgram = mStateManager->getProgramID();
+ mStateManager->useProgram(mActiveProgram);
mFunctions->endTransformFeedback();
+ // Restore the current program if we changed it.
+ mStateManager->useProgram(previousProgram);
}
}
}
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/gl/TransformFeedbackGL.h b/chromium/third_party/angle/src/libANGLE/renderer/gl/TransformFeedbackGL.h
index 41f3296958e..421fd3fac26 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/gl/TransformFeedbackGL.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/gl/TransformFeedbackGL.h
@@ -38,7 +38,9 @@ class TransformFeedbackGL : public TransformFeedbackImpl
GLuint getTransformFeedbackID() const;
- void syncActiveState(bool active, gl::PrimitiveMode primitiveMode) const;
+ void syncActiveState(const gl::Context *context,
+ bool active,
+ gl::PrimitiveMode primitiveMode) const;
void syncPausedState(bool paused) const;
private:
@@ -49,6 +51,7 @@ class TransformFeedbackGL : public TransformFeedbackImpl
mutable bool mIsActive;
mutable bool mIsPaused;
+ mutable GLuint mActiveProgram;
};
} // namespace rx
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/gl/VertexArrayGL.cpp b/chromium/third_party/angle/src/libANGLE/renderer/gl/VertexArrayGL.cpp
index 1479b59b66c..dc8264fab94 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/gl/VertexArrayGL.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/gl/VertexArrayGL.cpp
@@ -98,7 +98,7 @@ void VertexArrayGL::destroy(const gl::Context *context)
mAppliedElementArrayBuffer.set(context, nullptr);
for (auto &binding : mAppliedBindings)
{
- binding.setBuffer(context, nullptr, false);
+ binding.setBuffer(context, nullptr);
}
}
@@ -435,7 +435,7 @@ void VertexArrayGL::updateAttribPointer(const gl::Context *context, size_t attri
{
// Mark the applied binding isn't using a buffer by setting its buffer to nullptr so that if
// it starts to use a buffer later, there is no chance that the caching will skip it.
- mAppliedBindings[attribIndex].setBuffer(context, nullptr, false);
+ mAppliedBindings[attribIndex].setBuffer(context, nullptr);
return;
}
@@ -474,7 +474,7 @@ void VertexArrayGL::updateAttribPointer(const gl::Context *context, size_t attri
mAppliedBindings[attribIndex].setStride(binding.getStride());
mAppliedBindings[attribIndex].setOffset(binding.getOffset());
- mAppliedBindings[attribIndex].setBuffer(context, binding.getBuffer().get(), false);
+ mAppliedBindings[attribIndex].setBuffer(context, binding.getBuffer().get());
}
void VertexArrayGL::callVertexAttribPointer(GLuint attribIndex,
@@ -569,7 +569,7 @@ void VertexArrayGL::updateBindingBuffer(const gl::Context *context, size_t bindi
mAppliedBindings[bindingIndex].setStride(binding.getStride());
mAppliedBindings[bindingIndex].setOffset(binding.getOffset());
- mAppliedBindings[bindingIndex].setBuffer(context, binding.getBuffer().get(), false);
+ mAppliedBindings[bindingIndex].setBuffer(context, binding.getBuffer().get());
}
void VertexArrayGL::updateBindingDivisor(size_t bindingIndex)
@@ -690,9 +690,9 @@ angle::Result VertexArrayGL::syncState(const gl::Context *context,
case VertexArray::DIRTY_BIT_ELEMENT_ARRAY_BUFFER_DATA:
break;
- ANGLE_VERTEX_INDEX_CASES(ANGLE_DIRTY_ATTRIB_FUNC);
- ANGLE_VERTEX_INDEX_CASES(ANGLE_DIRTY_BINDING_FUNC);
- ANGLE_VERTEX_INDEX_CASES(ANGLE_DIRTY_BUFFER_DATA_FUNC);
+ ANGLE_VERTEX_INDEX_CASES(ANGLE_DIRTY_ATTRIB_FUNC)
+ ANGLE_VERTEX_INDEX_CASES(ANGLE_DIRTY_BINDING_FUNC)
+ ANGLE_VERTEX_INDEX_CASES(ANGLE_DIRTY_BUFFER_DATA_FUNC)
default:
UNREACHABLE();
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/gl/egl/FunctionsEGL.cpp b/chromium/third_party/angle/src/libANGLE/renderer/gl/egl/FunctionsEGL.cpp
index 7c88f65ad4a..ac03341c9b9 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/gl/egl/FunctionsEGL.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/gl/egl/FunctionsEGL.cpp
@@ -145,11 +145,14 @@ FunctionsEGL::~FunctionsEGL()
egl::Error FunctionsEGL::initialize(EGLNativeDisplayType nativeDisplay)
{
-#define ANGLE_GET_PROC_OR_ERROR(MEMBER, NAME) \
- if (!SetPtr(MEMBER, getProcAddress(#NAME))) \
- { \
- return egl::EglNotInitialized() << "Could not load EGL entry point " #NAME; \
- }
+#define ANGLE_GET_PROC_OR_ERROR(MEMBER, NAME) \
+ do \
+ { \
+ if (!SetPtr(MEMBER, getProcAddress(#NAME))) \
+ { \
+ return egl::EglNotInitialized() << "Could not load EGL entry point " #NAME; \
+ } \
+ } while (0)
ANGLE_GET_PROC_OR_ERROR(&mFnPtrs->bindAPIPtr, eglBindAPI);
ANGLE_GET_PROC_OR_ERROR(&mFnPtrs->chooseConfigPtr, eglChooseConfig);
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/gl/egl/android/NativeBufferImageSiblingAndroid.cpp b/chromium/third_party/angle/src/libANGLE/renderer/gl/egl/android/NativeBufferImageSiblingAndroid.cpp
index 7abe559ae3d..a42b5eef33a 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/gl/egl/android/NativeBufferImageSiblingAndroid.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/gl/egl/android/NativeBufferImageSiblingAndroid.cpp
@@ -8,63 +8,30 @@
#include "libANGLE/renderer/gl/egl/android/NativeBufferImageSiblingAndroid.h"
-#include "libANGLE/renderer/gl/egl/android/android_util.h"
-
-// Taken from cutils/native_handle.h:
-// https://android.googlesource.com/platform/system/core/+/master/libcutils/include/cutils/native_handle.h
-typedef struct native_handle
-{
- int version; /* sizeof(native_handle_t) */
- int numFds; /* number of file-descriptors at &data[0] */
- int numInts; /* number of ints at &data[numFds] */
- int data[0]; /* numFds + numInts ints */
-} native_handle_t;
-
-// Taken from nativebase/nativebase.h
-// https://android.googlesource.com/platform/frameworks/native/+/master/libs/nativebase/include/nativebase/nativebase.h
-typedef const native_handle_t *buffer_handle_t;
-
-typedef struct android_native_base_t
-{
- /* a magic value defined by the actual EGL native type */
- int magic;
- /* the sizeof() of the actual EGL native type */
- int version;
- void *reserved[4];
- /* reference-counting interface */
- void (*incRef)(struct android_native_base_t *base);
- void (*decRef)(struct android_native_base_t *base);
-} android_native_base_t;
-
-typedef struct ANativeWindowBuffer
-{
- struct android_native_base_t common;
- int width;
- int height;
- int stride;
- int format;
- int usage_deprecated;
- uintptr_t layerCount;
- void *reserved[1];
- const native_handle_t *handle;
- uint64_t usage;
- // we needed extra space for storing the 64-bits usage flags
- // the number of slots to use from reserved_proc depends on the
- // architecture.
- void *reserved_proc[8 - (sizeof(uint64_t) / sizeof(void *))];
-} ANativeWindowBuffer_t;
+#include "common/android_util.h"
namespace rx
{
NativeBufferImageSiblingAndroid::NativeBufferImageSiblingAndroid(EGLClientBuffer buffer)
- : mBuffer(static_cast<struct ANativeWindowBuffer *>(buffer))
+ : mBuffer(buffer), mFormat(GL_NONE)
{}
NativeBufferImageSiblingAndroid::~NativeBufferImageSiblingAndroid() {}
+egl::Error NativeBufferImageSiblingAndroid::initialize(const egl::Display *display)
+{
+ int pixelFormat = 0;
+ angle::android::GetANativeWindowBufferProperties(
+ angle::android::ClientBufferToANativeWindowBuffer(mBuffer), &mSize.width, &mSize.height,
+ &mSize.depth, &pixelFormat);
+ mFormat = gl::Format(angle::android::NativePixelFormatToGLInternalFormat(pixelFormat));
+
+ return egl::NoError();
+}
+
gl::Format NativeBufferImageSiblingAndroid::getFormat() const
{
- return gl::Format(android::NativePixelFormatToGLInternalFormat(mBuffer->format));
+ return mFormat;
}
bool NativeBufferImageSiblingAndroid::isRenderable(const gl::Context *context) const
@@ -79,7 +46,7 @@ bool NativeBufferImageSiblingAndroid::isTexturable(const gl::Context *context) c
gl::Extents NativeBufferImageSiblingAndroid::getSize() const
{
- return gl::Extents(mBuffer->width, mBuffer->height, 1);
+ return mSize;
}
size_t NativeBufferImageSiblingAndroid::getSamples() const
@@ -89,7 +56,7 @@ size_t NativeBufferImageSiblingAndroid::getSamples() const
EGLClientBuffer NativeBufferImageSiblingAndroid::getBuffer() const
{
- return static_cast<EGLClientBuffer>(mBuffer);
+ return mBuffer;
}
} // namespace rx
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/gl/egl/android/NativeBufferImageSiblingAndroid.h b/chromium/third_party/angle/src/libANGLE/renderer/gl/egl/android/NativeBufferImageSiblingAndroid.h
index 20c8960b1d9..764a4886659 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/gl/egl/android/NativeBufferImageSiblingAndroid.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/gl/egl/android/NativeBufferImageSiblingAndroid.h
@@ -12,8 +12,6 @@
#include "libANGLE/renderer/gl/egl/ExternalImageSiblingEGL.h"
-struct ANativeWindowBuffer;
-
namespace rx
{
@@ -23,6 +21,8 @@ class NativeBufferImageSiblingAndroid : public ExternalImageSiblingEGL
NativeBufferImageSiblingAndroid(EGLClientBuffer buffer);
virtual ~NativeBufferImageSiblingAndroid();
+ egl::Error initialize(const egl::Display *display) override;
+
// ExternalImageSiblingImpl interface
gl::Format getFormat() const override;
bool isRenderable(const gl::Context *context) const override;
@@ -34,7 +34,9 @@ class NativeBufferImageSiblingAndroid : public ExternalImageSiblingEGL
EGLClientBuffer getBuffer() const override;
private:
- struct ANativeWindowBuffer *mBuffer;
+ EGLClientBuffer mBuffer;
+ gl::Extents mSize;
+ gl::Format mFormat;
};
} // namespace rx
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/gl/egl/android/android_util.cpp b/chromium/third_party/angle/src/libANGLE/renderer/gl/egl/android/android_util.cpp
deleted file mode 100644
index 29b0af27ee4..00000000000
--- a/chromium/third_party/angle/src/libANGLE/renderer/gl/egl/android/android_util.cpp
+++ /dev/null
@@ -1,158 +0,0 @@
-//
-// Copyright 2018 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.
-//
-
-// android_util.cpp: Utilities for the using the Android platform
-
-#include "libANGLE/renderer/gl/egl/android/android_util.h"
-
-namespace rx
-{
-
-namespace
-{
-
-// Taken from android/hardware_buffer.h
-// https://android.googlesource.com/platform/frameworks/native/+/master/libs/nativewindow/include/android/hardware_buffer.h
-
-// AHARDWAREBUFFER_FORMAT_B8G8R8A8_UNORM AHARDWAREBUFFER_FORMAT_B4G4R4A4_UNORM,
-// AHARDWAREBUFFER_FORMAT_B5G5R5A1_UNORM formats were deprecated and re-added explicitly.
-
-// clang-format off
-/**
- * Buffer pixel formats.
- */
-enum {
- /**
- * Corresponding formats:
- * Vulkan: VK_FORMAT_R8G8B8A8_UNORM
- * OpenGL ES: GL_RGBA8
- */
- AHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORM = 1,
- /**
- * 32 bits per pixel, 8 bits per channel format where alpha values are
- * ignored (always opaque).
- * Corresponding formats:
- * Vulkan: VK_FORMAT_R8G8B8A8_UNORM
- * OpenGL ES: GL_RGB8
- */
- AHARDWAREBUFFER_FORMAT_R8G8B8X8_UNORM = 2,
- /**
- * Corresponding formats:
- * Vulkan: VK_FORMAT_R8G8B8_UNORM
- * OpenGL ES: GL_RGB8
- */
- AHARDWAREBUFFER_FORMAT_R8G8B8_UNORM = 3,
- /**
- * Corresponding formats:
- * Vulkan: VK_FORMAT_R5G6B5_UNORM_PACK16
- * OpenGL ES: GL_RGB565
- */
- AHARDWAREBUFFER_FORMAT_R5G6B5_UNORM = 4,
- AHARDWAREBUFFER_FORMAT_B8G8R8A8_UNORM = 5,
- AHARDWAREBUFFER_FORMAT_B4G4R4A4_UNORM = 6,
- AHARDWAREBUFFER_FORMAT_B5G5R5A1_UNORM = 7,
- /**
- * Corresponding formats:
- * Vulkan: VK_FORMAT_R16G16B16A16_SFLOAT
- * OpenGL ES: GL_RGBA16F
- */
- AHARDWAREBUFFER_FORMAT_R16G16B16A16_FLOAT = 0x16,
- /**
- * Corresponding formats:
- * Vulkan: VK_FORMAT_A2B10G10R10_UNORM_PACK32
- * OpenGL ES: GL_RGB10_A2
- */
- AHARDWAREBUFFER_FORMAT_R10G10B10A2_UNORM = 0x2b,
- /**
- * An opaque binary blob format that must have height 1, with width equal to
- * the buffer size in bytes.
- */
- AHARDWAREBUFFER_FORMAT_BLOB = 0x21,
- /**
- * Corresponding formats:
- * Vulkan: VK_FORMAT_D16_UNORM
- * OpenGL ES: GL_DEPTH_COMPONENT16
- */
- AHARDWAREBUFFER_FORMAT_D16_UNORM = 0x30,
- /**
- * Corresponding formats:
- * Vulkan: VK_FORMAT_X8_D24_UNORM_PACK32
- * OpenGL ES: GL_DEPTH_COMPONENT24
- */
- AHARDWAREBUFFER_FORMAT_D24_UNORM = 0x31,
- /**
- * Corresponding formats:
- * Vulkan: VK_FORMAT_D24_UNORM_S8_UINT
- * OpenGL ES: GL_DEPTH24_STENCIL8
- */
- AHARDWAREBUFFER_FORMAT_D24_UNORM_S8_UINT = 0x32,
- /**
- * Corresponding formats:
- * Vulkan: VK_FORMAT_D32_SFLOAT
- * OpenGL ES: GL_DEPTH_COMPONENT32F
- */
- AHARDWAREBUFFER_FORMAT_D32_FLOAT = 0x33,
- /**
- * Corresponding formats:
- * Vulkan: VK_FORMAT_D32_SFLOAT_S8_UINT
- * OpenGL ES: GL_DEPTH32F_STENCIL8
- */
- AHARDWAREBUFFER_FORMAT_D32_FLOAT_S8_UINT = 0x34,
- /**
- * Corresponding formats:
- * Vulkan: VK_FORMAT_S8_UINT
- * OpenGL ES: GL_STENCIL_INDEX8
- */
- AHARDWAREBUFFER_FORMAT_S8_UINT = 0x35,
-};
-// clang-format on
-
-} // anonymous namespace
-
-namespace android
-{
-GLenum NativePixelFormatToGLInternalFormat(int pixelFormat)
-{
- switch (pixelFormat)
- {
- case AHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORM:
- return GL_RGBA8;
- case AHARDWAREBUFFER_FORMAT_R8G8B8X8_UNORM:
- return GL_RGB8;
- case AHARDWAREBUFFER_FORMAT_R8G8B8_UNORM:
- return GL_RGB8;
- case AHARDWAREBUFFER_FORMAT_R5G6B5_UNORM:
- return GL_RGB565;
- case AHARDWAREBUFFER_FORMAT_B8G8R8A8_UNORM:
- return GL_BGRA8_EXT;
- case AHARDWAREBUFFER_FORMAT_B4G4R4A4_UNORM:
- return GL_RGBA4;
- case AHARDWAREBUFFER_FORMAT_B5G5R5A1_UNORM:
- return GL_RGB5_A1;
- case AHARDWAREBUFFER_FORMAT_R16G16B16A16_FLOAT:
- return GL_RGBA16F;
- case AHARDWAREBUFFER_FORMAT_R10G10B10A2_UNORM:
- return GL_RGB10_A2;
- case AHARDWAREBUFFER_FORMAT_BLOB:
- return GL_NONE;
- case AHARDWAREBUFFER_FORMAT_D16_UNORM:
- return GL_DEPTH_COMPONENT16;
- case AHARDWAREBUFFER_FORMAT_D24_UNORM:
- return GL_DEPTH_COMPONENT24;
- case AHARDWAREBUFFER_FORMAT_D24_UNORM_S8_UINT:
- return GL_DEPTH24_STENCIL8;
- case AHARDWAREBUFFER_FORMAT_D32_FLOAT:
- return GL_DEPTH_COMPONENT32F;
- case AHARDWAREBUFFER_FORMAT_D32_FLOAT_S8_UINT:
- return GL_DEPTH32F_STENCIL8;
- case AHARDWAREBUFFER_FORMAT_S8_UINT:
- return GL_STENCIL_INDEX8;
- default:
- return GL_NONE;
- }
-}
-} // namespace android
-} // namespace rx
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/gl/egl/android/android_util.h b/chromium/third_party/angle/src/libANGLE/renderer/gl/egl/android/android_util.h
deleted file mode 100644
index e1ac8782e44..00000000000
--- a/chromium/third_party/angle/src/libANGLE/renderer/gl/egl/android/android_util.h
+++ /dev/null
@@ -1,23 +0,0 @@
-//
-// Copyright 2018 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.
-//
-
-// android_util.h: Utilities for the using the Android platform
-
-#ifndef LIBANGLE_RENDERER_GL_EGL_ANDROID_ANDROID_UTIL_H_
-#define LIBANGLE_RENDERER_GL_EGL_ANDROID_ANDROID_UTIL_H_
-
-#include "angle_gl.h"
-
-namespace rx
-{
-
-namespace android
-{
-GLenum NativePixelFormatToGLInternalFormat(int pixelFormat);
-}
-} // namespace rx
-
-#endif // LIBANGLE_RENDERER_GL_EGL_ANDROID_ANDROID_UTIL_H_ \ No newline at end of file
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/gl/glx/FunctionsGLX.cpp b/chromium/third_party/angle/src/libANGLE/renderer/gl/glx/FunctionsGLX.cpp
index bb9fb6a6169..1304622e9f0 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/gl/glx/FunctionsGLX.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/gl/glx/FunctionsGLX.cpp
@@ -150,16 +150,19 @@ bool FunctionsGLX::initialize(Display *xDisplay, int screen, std::string *errorS
getProc = reinterpret_cast<PFNGETPROCPROC>(glXGetProcAddress);
#endif
-#define GET_PROC_OR_ERROR(MEMBER, NAME) \
- if (!GetProc(getProc, MEMBER, #NAME)) \
- { \
- *errorString = "Could not load GLX entry point " #NAME; \
- return false; \
- }
+#define GET_PROC_OR_ERROR(MEMBER, NAME) \
+ do \
+ { \
+ if (!GetProc(getProc, MEMBER, #NAME)) \
+ { \
+ *errorString = "Could not load GLX entry point " #NAME; \
+ return false; \
+ } \
+ } while (0)
#if !defined(ANGLE_LINK_GLX)
# define GET_FNPTR_OR_ERROR(MEMBER, NAME) GET_PROC_OR_ERROR(MEMBER, NAME)
#else
-# define GET_FNPTR_OR_ERROR(MEMBER, NAME) *MEMBER = NAME;
+# define GET_FNPTR_OR_ERROR(MEMBER, NAME) *MEMBER = NAME
#endif
// GLX 1.0
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/gl/renderergl_utils.cpp b/chromium/third_party/angle/src/libANGLE/renderer/gl/renderergl_utils.cpp
index 81af439886e..c0d3bfa0761 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/gl/renderergl_utils.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/gl/renderergl_utils.cpp
@@ -1123,12 +1123,13 @@ void GenerateCaps(const FunctionsGL *functions,
functions->hasGLESExtension("GL_OES_texture_border_clamp") ||
functions->hasGLESExtension("GL_EXT_texture_border_clamp") ||
functions->hasGLESExtension("GL_NV_texture_border_clamp");
- extensions->instancedArrays = functions->isAtLeastGL(gl::Version(3, 1)) ||
- (functions->hasGLExtension("GL_ARB_instanced_arrays") &&
- (functions->hasGLExtension("GL_ARB_draw_instanced") ||
- functions->hasGLExtension("GL_EXT_draw_instanced"))) ||
- functions->isAtLeastGLES(gl::Version(3, 0)) ||
- functions->hasGLESExtension("GL_EXT_instanced_arrays");
+ extensions->instancedArraysANGLE = functions->isAtLeastGL(gl::Version(3, 1)) ||
+ (functions->hasGLExtension("GL_ARB_instanced_arrays") &&
+ (functions->hasGLExtension("GL_ARB_draw_instanced") ||
+ functions->hasGLExtension("GL_EXT_draw_instanced"))) ||
+ functions->isAtLeastGLES(gl::Version(3, 0)) ||
+ functions->hasGLESExtension("GL_EXT_instanced_arrays");
+ extensions->instancedArraysEXT = extensions->instancedArraysANGLE;
extensions->unpackSubimage = functions->standard == STANDARD_GL_DESKTOP ||
functions->isAtLeastGLES(gl::Version(3, 0)) ||
functions->hasGLESExtension("GL_EXT_unpack_subimage");
@@ -1344,6 +1345,11 @@ void GenerateCaps(const FunctionsGL *functions,
extensions->maxDualSourceDrawBuffers = 1;
}
+ // EXT_float_blend
+ // Assume all desktop driver supports this by default.
+ extensions->floatBlend = functions->standard == STANDARD_GL_DESKTOP ||
+ functions->hasGLESExtension("GL_EXT_float_blend");
+
// GL_CHROMIUM_compressed_texture_etc
// Expose this extension only when we support the formats or we're running on top of a native
// ES driver.
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/gl/wgl/DisplayWGL.cpp b/chromium/third_party/angle/src/libANGLE/renderer/gl/wgl/DisplayWGL.cpp
index 5baa08a6a03..2a413878a5f 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/gl/wgl/DisplayWGL.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/gl/wgl/DisplayWGL.cpp
@@ -282,7 +282,7 @@ egl::Error DisplayWGL::initializeImpl(egl::Display *display)
mHasRobustness = functionsGL->getGraphicsResetStatus != nullptr;
if (mHasWGLCreateContextRobustness != mHasRobustness)
{
- WARN() << "WGL_ARB_create_context_robustness exists but unable to OpenGL context with "
+ WARN() << "WGL_ARB_create_context_robustness exists but unable to create a context with "
"robustness.";
}
@@ -885,7 +885,7 @@ HGLRC DisplayWGL::createContextAttribs(const gl::Version &version,
egl::Error DisplayWGL::createRenderer(std::shared_ptr<RendererWGL> *outRenderer)
{
- HGLRC context = nullptr;
+ HGLRC context = nullptr;
HGLRC sharedContext = nullptr;
std::vector<int> workerContextAttribs;
@@ -1006,19 +1006,22 @@ WorkerContext *DisplayWGL::createWorkerContext(std::string *infoLog,
HDC workerDeviceContext = nullptr;
HGLRC workerContext = nullptr;
-#define CLEANUP_ON_ERROR() \
- if (workerContext) \
- { \
- mFunctionsWGL->deleteContext(workerContext); \
- } \
- if (workerDeviceContext) \
- { \
- mFunctionsWGL->releasePbufferDCARB(workerPbuffer, workerDeviceContext); \
- } \
- if (workerPbuffer) \
- { \
- mFunctionsWGL->destroyPbufferARB(workerPbuffer); \
- }
+#define CLEANUP_ON_ERROR() \
+ do \
+ { \
+ if (workerContext) \
+ { \
+ mFunctionsWGL->deleteContext(workerContext); \
+ } \
+ if (workerDeviceContext) \
+ { \
+ mFunctionsWGL->releasePbufferDCARB(workerPbuffer, workerDeviceContext); \
+ } \
+ if (workerPbuffer) \
+ { \
+ mFunctionsWGL->destroyPbufferARB(workerPbuffer); \
+ } \
+ } while (0)
const int attribs[] = {0, 0};
workerPbuffer = mFunctionsWGL->createPbufferARB(mDeviceContext, mPixelFormat, 1, 1, attribs);