diff options
Diffstat (limited to 'chromium/third_party/angle/src/libANGLE/renderer/gl')
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); |