diff options
author | Stan Iliev <stani@google.com> | 2018-08-14 13:30:17 -0400 |
---|---|---|
committer | Stan Iliev <stani@google.com> | 2018-08-29 10:22:03 -0400 |
commit | c8e22a653297837da9a80b0ba65f6854c8986c96 (patch) | |
tree | 7344df1a8aff45ccbf5b9ffb5b4de49499cc7c94 /libs/hwui/renderstate/RenderState.cpp | |
parent | 660bb2f3a1dde0b5cca5c8293bf0e72d47b2b6fc (diff) |
TextureView Vulkan support and optimized OpenGL draw
Render TextureView as hardware bitmaps, instead of GL textures.
Cache SkImage for each observed GraphicBuffer, which is faster
even for GL.
Implement C++ SurfaceTexture, which allows Java SurfaceTexture
to be used with Vulkan HWUI render thread and application GL.
threads. Delete GLLayer and VkLayer classes and texture code
from old HWUI pipeline.
Test: Ran skiagl and skiavk pipeline with a TextureView app.
Test: TextureView CTS tests pass for GL pipeline.
Test: Ran Android NDK Native codec sample app.
Change-Id: Idc94f864ce2d34fd6ceff4be4fc7d3327e99879c
Diffstat (limited to 'libs/hwui/renderstate/RenderState.cpp')
-rw-r--r-- | libs/hwui/renderstate/RenderState.cpp | 83 |
1 files changed, 6 insertions, 77 deletions
diff --git a/libs/hwui/renderstate/RenderState.cpp b/libs/hwui/renderstate/RenderState.cpp index 3be84f588a20..b524bcb096da 100644 --- a/libs/hwui/renderstate/RenderState.cpp +++ b/libs/hwui/renderstate/RenderState.cpp @@ -16,8 +16,6 @@ #include "renderstate/RenderState.h" #include <GpuMemoryTracker.h> #include "DeferredLayerUpdater.h" -#include "GlLayer.h" -#include "VkLayer.h" #include "Snapshot.h" #include "renderthread/CanvasContext.h" @@ -39,44 +37,11 @@ RenderState::RenderState(renderthread::RenderThread& thread) RenderState::~RenderState() { } -void RenderState::onGLContextCreated() { +void RenderState::onContextCreated() { GpuMemoryTracker::onGpuContextCreated(); - - // This is delayed because the first access of Caches makes GL calls - if (!mCaches) { - mCaches = &Caches::createInstance(*this); - } - mCaches->init(); } -static void layerLostGlContext(Layer* layer) { - LOG_ALWAYS_FATAL_IF(layer->getApi() != Layer::Api::OpenGL, - "layerLostGlContext on non GL layer"); - static_cast<GlLayer*>(layer)->onGlContextLost(); -} - -void RenderState::onGLContextDestroyed() { - // TODO: reset all cached state in state objects - std::for_each(mActiveLayers.begin(), mActiveLayers.end(), layerLostGlContext); - - mCaches->terminate(); - - destroyLayersInUpdater(); - GpuMemoryTracker::onGpuContextDestroyed(); -} - -void RenderState::onVkContextCreated() { - GpuMemoryTracker::onGpuContextCreated(); -} - -static void layerDestroyedVkContext(Layer* layer) { - LOG_ALWAYS_FATAL_IF(layer->getApi() != Layer::Api::Vulkan, - "layerLostVkContext on non Vulkan layer"); - static_cast<VkLayer*>(layer)->onVkContextDestroyed(); -} - -void RenderState::onVkContextDestroyed() { - std::for_each(mActiveLayers.begin(), mActiveLayers.end(), layerDestroyedVkContext); +void RenderState::onContextDestroyed() { destroyLayersInUpdater(); GpuMemoryTracker::onGpuContextDestroyed(); } @@ -85,10 +50,6 @@ GrContext* RenderState::getGrContext() const { return mRenderThread.getGrContext(); } -void RenderState::flush(Caches::FlushMode mode) { - if (mCaches) mCaches->flush(mode); -} - void RenderState::onBitmapDestroyed(uint32_t pixelRefId) { // DEAD CODE } @@ -126,42 +87,6 @@ void RenderState::deleteFramebuffer(GLuint fbo) { glDeleteFramebuffers(1, &fbo); } -void RenderState::invokeFunctor(Functor* functor, DrawGlInfo::Mode mode, DrawGlInfo* info) { - if (mode == DrawGlInfo::kModeProcessNoContext) { - // If there's no context we don't need to interrupt as there's - // no gl state to save/restore - (*functor)(mode, info); - } else { - interruptForFunctorInvoke(); - (*functor)(mode, info); - resumeFromFunctorInvoke(); - } -} - -void RenderState::interruptForFunctorInvoke() { - mCaches->textureState().resetActiveTexture(); - debugOverdraw(false, false); - // TODO: We need a way to know whether the functor is sRGB aware (b/32072673) - if (mCaches->extensions().hasLinearBlending() && mCaches->extensions().hasSRGBWriteControl()) { - glDisable(GL_FRAMEBUFFER_SRGB_EXT); - } -} - -void RenderState::resumeFromFunctorInvoke() { - if (mCaches->extensions().hasLinearBlending() && mCaches->extensions().hasSRGBWriteControl()) { - glEnable(GL_FRAMEBUFFER_SRGB_EXT); - } - - glViewport(0, 0, mViewportWidth, mViewportHeight); - glBindFramebuffer(GL_FRAMEBUFFER, mFramebuffer); - debugOverdraw(false, false); - - glClearColor(0.0f, 0.0f, 0.0f, 0.0f); - - mCaches->textureState().activateTexture(0); - mCaches->textureState().resetBoundTextures(); -} - void RenderState::debugOverdraw(bool enable, bool clear) { // DEAD CODE } @@ -190,5 +115,9 @@ void RenderState::dump() { // DEAD CODE } +renderthread::RenderThread& RenderState::getRenderThread() { + return mRenderThread; +} + } /* namespace uirenderer */ } /* namespace android */ |