android_frameworks_base/libs/hwui/AutoBackendTextureRelease.h
Greg Daniel 27e1fa257b In Vk DeferredLayerUpdater make sure we releause buffers to foreign queue.
For Vulkan we need to make sure that when we draw AHBs we must
transition them to and from the foreign queue so that the producer is
able to write new data to them and we are able to see the new writes.

Test: Manual running of Lens app
Bug: 178773035
Change-Id: I807709d2b671bf5a01a82237f3b5838734f0d978
2021-05-26 13:38:33 -04:00

73 lines
2.3 KiB
C++

/*
* Copyright 2019 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#pragma once
#include <GrAHardwareBufferUtils.h>
#include <GrBackendSurface.h>
#include <SkImage.h>
#include <android/hardware_buffer.h>
#include <system/graphics.h>
namespace android {
namespace uirenderer {
/**
* AutoBackendTextureRelease manages EglImage/VkImage lifetime. It is a ref-counted object
* that keeps GPU resources alive until the last SkImage object using them is destroyed.
*/
class AutoBackendTextureRelease final {
public:
AutoBackendTextureRelease(GrDirectContext* context,
AHardwareBuffer* buffer);
const GrBackendTexture& getTexture() const { return mBackendTexture; }
// Only called on the RenderThread, so it need not be thread-safe.
void ref() { mUsageCount++; }
void unref(bool releaseImage);
inline sk_sp<SkImage> getImage() const { return mImage; }
void makeImage(AHardwareBuffer* buffer,
android_dataspace dataspace,
GrDirectContext* context);
void newBufferContent(GrDirectContext* context);
void releaseQueueOwnership(GrDirectContext* context);
private:
// The only way to invoke dtor is with unref, when mUsageCount is 0.
~AutoBackendTextureRelease() {}
GrBackendTexture mBackendTexture;
GrAHardwareBufferUtils::DeleteImageProc mDeleteProc;
GrAHardwareBufferUtils::UpdateImageProc mUpdateProc;
GrAHardwareBufferUtils::TexImageCtx mImageCtx;
// Starting with refcount 1, because the first ref is held by SurfaceTexture. Additional refs
// are held by SkImages.
int mUsageCount = 1;
// mImage is the SkImage created from mBackendTexture.
sk_sp<SkImage> mImage;
};
} /* namespace uirenderer */
} /* namespace android */