From eb904d4aa48cc44292e50c8659b142b1c40826d5 Mon Sep 17 00:00:00 2001 From: Derek Sollenberger Date: Mon, 22 Mar 2021 12:58:53 -0400 Subject: RE was not using the protected cache when in protected mode Test: librenderengine_test Bug: 183391755 Change-Id: Iccdf46b2157a633e5e03f2c46f059396d71cb574 --- libs/renderengine/skia/SkiaGLRenderEngine.cpp | 29 +++++++++++++++++++-------- 1 file changed, 21 insertions(+), 8 deletions(-) diff --git a/libs/renderengine/skia/SkiaGLRenderEngine.cpp b/libs/renderengine/skia/SkiaGLRenderEngine.cpp index f76bfa2495..ae0b4e3fa9 100644 --- a/libs/renderengine/skia/SkiaGLRenderEngine.cpp +++ b/libs/renderengine/skia/SkiaGLRenderEngine.cpp @@ -463,18 +463,31 @@ void SkiaGLRenderEngine::cacheExternalTextureBuffer(const sp& buf } ATRACE_CALL(); + // We need to switch the currently bound context if the buffer is protected but the current + // context is not. The current state must then be restored after the buffer is cached. + const bool protectedContextState = mInProtectedContext; + if (!useProtectedContext(protectedContextState || + (buffer->getUsage() & GRALLOC_USAGE_PROTECTED))) { + ALOGE("Attempting to cache a buffer into a different context than what is currently bound"); + return; + } + + auto grContext = mInProtectedContext ? mProtectedGrContext : mGrContext; + auto& cache = mInProtectedContext ? mProtectedTextureCache : mTextureCache; + std::lock_guard lock(mRenderingMutex); - auto iter = mTextureCache.find(buffer->getId()); - if (iter != mTextureCache.end()) { + auto iter = cache.find(buffer->getId()); + if (iter != cache.end()) { ALOGV("Texture already exists in cache."); - return; } else { std::shared_ptr imageTextureRef = std::make_shared(); imageTextureRef->setTexture( - new AutoBackendTexture(mGrContext.get(), buffer->toAHardwareBuffer(), false)); - mTextureCache.insert({buffer->getId(), imageTextureRef}); + new AutoBackendTexture(grContext.get(), buffer->toAHardwareBuffer(), false)); + cache.insert({buffer->getId(), imageTextureRef}); } + // restore the original state of the protected context if necessary + useProtectedContext(protectedContextState); } void SkiaGLRenderEngine::unbindExternalTextureBuffer(uint64_t bufferId) { @@ -824,15 +837,15 @@ status_t SkiaGLRenderEngine::drawLayers(const DisplaySettings& display, validateInputBufferUsage(layer->source.buffer.buffer); const auto& item = layer->source.buffer; std::shared_ptr imageTextureRef = nullptr; - auto iter = mTextureCache.find(item.buffer->getId()); - if (iter != mTextureCache.end()) { + auto iter = cache.find(item.buffer->getId()); + if (iter != cache.end()) { imageTextureRef = iter->second; } else { imageTextureRef = std::make_shared(); imageTextureRef->setTexture(new AutoBackendTexture(grContext.get(), item.buffer->toAHardwareBuffer(), false)); - mTextureCache.insert({item.buffer->getId(), imageTextureRef}); + cache.insert({item.buffer->getId(), imageTextureRef}); } sk_sp image = -- cgit v1.2.3-59-g8ed1b