mirror of
https://github.com/Evolution-X/hardware_interfaces
synced 2026-02-01 16:50:18 +00:00
VTS: Free allocated buffers
The native handle was not freed which causes some devices to run out of memory when executing the test. This change creates a RAII wrapper around native_handle_t, which automatically deallocates buffers when they go out of scope. Bug: 188686850 Test: atest VtsHalGraphicsComposerV2_4TargetTest Change-Id: I19a22a5a3202e048de77926ce4a116a31d9de906
This commit is contained in:
@@ -308,6 +308,12 @@ void ComposerClient::execute(TestCommandReader* reader, CommandWriterBase* write
|
||||
writer->reset();
|
||||
}
|
||||
|
||||
NativeHandleWrapper::~NativeHandleWrapper() {
|
||||
if (mHandle) {
|
||||
mGralloc.freeBuffer(mHandle);
|
||||
}
|
||||
}
|
||||
|
||||
Gralloc::Gralloc() {
|
||||
[this] {
|
||||
ASSERT_NO_FATAL_FAILURE(mGralloc4 = std::make_shared<Gralloc4>("default", "default",
|
||||
@@ -324,9 +330,10 @@ Gralloc::Gralloc() {
|
||||
}();
|
||||
}
|
||||
|
||||
const native_handle_t* Gralloc::allocate(uint32_t width, uint32_t height, uint32_t layerCount,
|
||||
PixelFormat format, uint64_t usage, bool import,
|
||||
uint32_t* outStride) {
|
||||
const NativeHandleWrapper Gralloc::allocate(uint32_t width, uint32_t height, uint32_t layerCount,
|
||||
PixelFormat format, uint64_t usage, bool import,
|
||||
uint32_t* outStride) {
|
||||
const native_handle_t* handle;
|
||||
if (mGralloc4) {
|
||||
IMapper4::BufferDescriptorInfo info{};
|
||||
info.width = width;
|
||||
@@ -334,7 +341,7 @@ const native_handle_t* Gralloc::allocate(uint32_t width, uint32_t height, uint32
|
||||
info.layerCount = layerCount;
|
||||
info.format = static_cast<android::hardware::graphics::common::V1_2::PixelFormat>(format);
|
||||
info.usage = usage;
|
||||
return mGralloc4->allocate(info, import, outStride);
|
||||
handle = mGralloc4->allocate(info, import, outStride);
|
||||
} else if (mGralloc3) {
|
||||
IMapper3::BufferDescriptorInfo info{};
|
||||
info.width = width;
|
||||
@@ -342,7 +349,7 @@ const native_handle_t* Gralloc::allocate(uint32_t width, uint32_t height, uint32
|
||||
info.layerCount = layerCount;
|
||||
info.format = static_cast<android::hardware::graphics::common::V1_2::PixelFormat>(format);
|
||||
info.usage = usage;
|
||||
return mGralloc3->allocate(info, import, outStride);
|
||||
handle = mGralloc3->allocate(info, import, outStride);
|
||||
} else {
|
||||
IMapper2::BufferDescriptorInfo info{};
|
||||
info.width = width;
|
||||
@@ -350,8 +357,9 @@ const native_handle_t* Gralloc::allocate(uint32_t width, uint32_t height, uint32
|
||||
info.layerCount = layerCount;
|
||||
info.format = format;
|
||||
info.usage = usage;
|
||||
return mGralloc2->allocate(info, import, outStride);
|
||||
handle = mGralloc2->allocate(info, import, outStride);
|
||||
}
|
||||
return NativeHandleWrapper(*this, handle);
|
||||
}
|
||||
|
||||
void* Gralloc::lock(const native_handle_t* bufferHandle, uint64_t cpuUsage,
|
||||
|
||||
@@ -136,13 +136,30 @@ class AccessRegion {
|
||||
int32_t height;
|
||||
};
|
||||
|
||||
class Gralloc;
|
||||
|
||||
// RAII wrapper around native_handle_t*
|
||||
class NativeHandleWrapper {
|
||||
public:
|
||||
NativeHandleWrapper(Gralloc& gralloc, const native_handle_t* handle)
|
||||
: mGralloc(gralloc), mHandle(handle) {}
|
||||
|
||||
~NativeHandleWrapper();
|
||||
|
||||
const native_handle_t* get() { return mHandle; }
|
||||
|
||||
private:
|
||||
Gralloc& mGralloc;
|
||||
const native_handle_t* mHandle;
|
||||
};
|
||||
|
||||
class Gralloc {
|
||||
public:
|
||||
explicit Gralloc();
|
||||
|
||||
const native_handle_t* allocate(uint32_t width, uint32_t height, uint32_t layerCount,
|
||||
PixelFormat format, uint64_t usage, bool import = true,
|
||||
uint32_t* outStride = nullptr);
|
||||
const NativeHandleWrapper allocate(uint32_t width, uint32_t height, uint32_t layerCount,
|
||||
PixelFormat format, uint64_t usage, bool import = true,
|
||||
uint32_t* outStride = nullptr);
|
||||
|
||||
void* lock(const native_handle_t* bufferHandle, uint64_t cpuUsage,
|
||||
const AccessRegion& accessRegionRect, int acquireFence);
|
||||
|
||||
@@ -666,7 +666,7 @@ class GraphicsComposerHidlCommandTest : public GraphicsComposerHidlTest {
|
||||
ASSERT_NO_FATAL_FAILURE(GraphicsComposerHidlTest::TearDown());
|
||||
}
|
||||
|
||||
const native_handle_t* allocate() {
|
||||
NativeHandleWrapper allocate() {
|
||||
uint64_t usage =
|
||||
static_cast<uint64_t>(BufferUsage::CPU_WRITE_OFTEN | BufferUsage::CPU_READ_OFTEN |
|
||||
BufferUsage::COMPOSER_OVERLAY);
|
||||
@@ -727,11 +727,11 @@ TEST_P(GraphicsComposerHidlCommandTest, SET_OUTPUT_BUFFER) {
|
||||
display = mComposerClient->createVirtualDisplay(64, 64, PixelFormat::IMPLEMENTATION_DEFINED,
|
||||
kBufferSlotCount, &format));
|
||||
|
||||
const native_handle_t* handle;
|
||||
ASSERT_NO_FATAL_FAILURE(handle = allocate());
|
||||
std::unique_ptr<NativeHandleWrapper> handle;
|
||||
ASSERT_NO_FATAL_FAILURE(handle.reset(new NativeHandleWrapper(allocate())));
|
||||
|
||||
mWriter->selectDisplay(display);
|
||||
mWriter->setOutputBuffer(0, handle, -1);
|
||||
mWriter->setOutputBuffer(0, handle->get(), -1);
|
||||
execute();
|
||||
}
|
||||
|
||||
@@ -783,7 +783,7 @@ TEST_P(GraphicsComposerHidlCommandTest, PRESENT_DISPLAY_NO_LAYER_STATE_CHANGES)
|
||||
mComposerClient->setColorMode(mPrimaryDisplay, ColorMode::NATIVE);
|
||||
|
||||
auto handle = allocate();
|
||||
ASSERT_NE(nullptr, handle);
|
||||
ASSERT_NE(nullptr, handle.get());
|
||||
|
||||
IComposerClient::Rect displayFrame{0, 0, mDisplayWidth, mDisplayHeight};
|
||||
|
||||
@@ -800,7 +800,7 @@ TEST_P(GraphicsComposerHidlCommandTest, PRESENT_DISPLAY_NO_LAYER_STATE_CHANGES)
|
||||
mWriter->setLayerZOrder(10);
|
||||
mWriter->setLayerBlendMode(IComposerClient::BlendMode::NONE);
|
||||
mWriter->setLayerSurfaceDamage(std::vector<IComposerClient::Rect>(1, displayFrame));
|
||||
mWriter->setLayerBuffer(0, handle, -1);
|
||||
mWriter->setLayerBuffer(0, handle.get(), -1);
|
||||
mWriter->setLayerDataspace(Dataspace::UNKNOWN);
|
||||
|
||||
mWriter->validateDisplay();
|
||||
@@ -817,8 +817,8 @@ TEST_P(GraphicsComposerHidlCommandTest, PRESENT_DISPLAY_NO_LAYER_STATE_CHANGES)
|
||||
|
||||
mWriter->selectLayer(layer);
|
||||
auto handle2 = allocate();
|
||||
ASSERT_NE(nullptr, handle2);
|
||||
mWriter->setLayerBuffer(0, handle2, -1);
|
||||
ASSERT_NE(nullptr, handle2.get());
|
||||
mWriter->setLayerBuffer(0, handle2.get(), -1);
|
||||
mWriter->setLayerSurfaceDamage(std::vector<IComposerClient::Rect>(1, {0, 0, 10, 10}));
|
||||
mWriter->presentDisplay();
|
||||
execute();
|
||||
@@ -833,12 +833,12 @@ TEST_P(GraphicsComposerHidlCommandTest, SET_LAYER_CURSOR_POSITION) {
|
||||
mComposerClient->createLayer(mPrimaryDisplay, kBufferSlotCount));
|
||||
|
||||
auto handle = allocate();
|
||||
ASSERT_NE(nullptr, handle);
|
||||
ASSERT_NE(nullptr, handle.get());
|
||||
IComposerClient::Rect displayFrame{0, 0, mDisplayWidth, mDisplayHeight};
|
||||
|
||||
mWriter->selectDisplay(mPrimaryDisplay);
|
||||
mWriter->selectLayer(layer);
|
||||
mWriter->setLayerBuffer(0, handle, -1);
|
||||
mWriter->setLayerBuffer(0, handle.get(), -1);
|
||||
mWriter->setLayerCompositionType(IComposerClient::Composition::CURSOR);
|
||||
mWriter->setLayerDisplayFrame(displayFrame);
|
||||
mWriter->setLayerPlaneAlpha(1);
|
||||
@@ -871,7 +871,7 @@ TEST_P(GraphicsComposerHidlCommandTest, SET_LAYER_CURSOR_POSITION) {
|
||||
*/
|
||||
TEST_P(GraphicsComposerHidlCommandTest, SET_LAYER_BUFFER) {
|
||||
auto handle = allocate();
|
||||
ASSERT_NE(nullptr, handle);
|
||||
ASSERT_NE(nullptr, handle.get());
|
||||
|
||||
Layer layer;
|
||||
ASSERT_NO_FATAL_FAILURE(layer =
|
||||
@@ -879,7 +879,7 @@ TEST_P(GraphicsComposerHidlCommandTest, SET_LAYER_BUFFER) {
|
||||
|
||||
mWriter->selectDisplay(mPrimaryDisplay);
|
||||
mWriter->selectLayer(layer);
|
||||
mWriter->setLayerBuffer(0, handle, -1);
|
||||
mWriter->setLayerBuffer(0, handle.get(), -1);
|
||||
execute();
|
||||
}
|
||||
|
||||
@@ -1003,7 +1003,7 @@ TEST_P(GraphicsComposerHidlCommandTest, SET_LAYER_SIDEBAND_STREAM) {
|
||||
}
|
||||
|
||||
auto handle = allocate();
|
||||
ASSERT_NE(nullptr, handle);
|
||||
ASSERT_NE(nullptr, handle.get());
|
||||
|
||||
Layer layer;
|
||||
ASSERT_NO_FATAL_FAILURE(layer =
|
||||
@@ -1011,7 +1011,7 @@ TEST_P(GraphicsComposerHidlCommandTest, SET_LAYER_SIDEBAND_STREAM) {
|
||||
|
||||
mWriter->selectDisplay(mPrimaryDisplay);
|
||||
mWriter->selectLayer(layer);
|
||||
mWriter->setLayerSidebandStream(handle);
|
||||
mWriter->setLayerSidebandStream(handle.get());
|
||||
execute();
|
||||
}
|
||||
|
||||
|
||||
@@ -208,22 +208,13 @@ ReadbackBuffer::ReadbackBuffer(Display display, const std::shared_ptr<ComposerCl
|
||||
mAccessRegion.height = height;
|
||||
}
|
||||
|
||||
ReadbackBuffer::~ReadbackBuffer() {
|
||||
if (mBufferHandle != nullptr) {
|
||||
mGralloc->freeBuffer(mBufferHandle);
|
||||
}
|
||||
}
|
||||
|
||||
void ReadbackBuffer::setReadbackBuffer() {
|
||||
if (mBufferHandle != nullptr) {
|
||||
mGralloc->freeBuffer(mBufferHandle);
|
||||
mBufferHandle = nullptr;
|
||||
}
|
||||
mBufferHandle = mGralloc->allocate(mWidth, mHeight, mLayerCount, mFormat, mUsage,
|
||||
/*import*/ true, &mStride);
|
||||
ASSERT_NE(false, mGralloc->validateBufferSize(mBufferHandle, mWidth, mHeight, mLayerCount,
|
||||
mFormat, mUsage, mStride));
|
||||
ASSERT_NO_FATAL_FAILURE(mComposerClient->setReadbackBuffer(mDisplay, mBufferHandle, -1));
|
||||
mBufferHandle.reset(new Gralloc::NativeHandleWrapper(
|
||||
mGralloc->allocate(mWidth, mHeight, mLayerCount, mFormat, mUsage,
|
||||
/*import*/ true, &mStride)));
|
||||
ASSERT_NE(false, mGralloc->validateBufferSize(mBufferHandle->get(), mWidth, mHeight,
|
||||
mLayerCount, mFormat, mUsage, mStride));
|
||||
ASSERT_NO_FATAL_FAILURE(mComposerClient->setReadbackBuffer(mDisplay, mBufferHandle->get(), -1));
|
||||
}
|
||||
|
||||
void ReadbackBuffer::checkReadbackBuffer(std::vector<IComposerClient::Color> expectedColors) {
|
||||
@@ -231,11 +222,11 @@ void ReadbackBuffer::checkReadbackBuffer(std::vector<IComposerClient::Color> exp
|
||||
int32_t fenceHandle;
|
||||
ASSERT_NO_FATAL_FAILURE(mComposerClient->getReadbackBufferFence(mDisplay, &fenceHandle));
|
||||
|
||||
void* bufData = mGralloc->lock(mBufferHandle, mUsage, mAccessRegion, fenceHandle);
|
||||
void* bufData = mGralloc->lock(mBufferHandle->get(), mUsage, mAccessRegion, fenceHandle);
|
||||
ASSERT_TRUE(mPixelFormat == PixelFormat::RGB_888 || mPixelFormat == PixelFormat::RGBA_8888);
|
||||
ReadbackHelper::compareColorBuffers(expectedColors, bufData, mStride, mWidth, mHeight,
|
||||
mPixelFormat);
|
||||
int32_t unlockFence = mGralloc->unlock(mBufferHandle);
|
||||
int32_t unlockFence = mGralloc->unlock(mBufferHandle->get());
|
||||
if (unlockFence != -1) {
|
||||
sync_wait(unlockFence, -1);
|
||||
close(unlockFence);
|
||||
@@ -281,23 +272,17 @@ TestBufferLayer::TestBufferLayer(const std::shared_ptr<ComposerClient>& client,
|
||||
setSourceCrop({0, 0, (float)width, (float)height});
|
||||
}
|
||||
|
||||
TestBufferLayer::~TestBufferLayer() {
|
||||
if (mBufferHandle != nullptr) {
|
||||
mGralloc->freeBuffer(mBufferHandle);
|
||||
}
|
||||
}
|
||||
|
||||
void TestBufferLayer::write(const std::shared_ptr<CommandWriterBase>& writer) {
|
||||
TestLayer::write(writer);
|
||||
writer->setLayerCompositionType(mComposition);
|
||||
writer->setLayerVisibleRegion(std::vector<IComposerClient::Rect>(1, mDisplayFrame));
|
||||
if (mBufferHandle != nullptr) writer->setLayerBuffer(0, mBufferHandle, mFillFence);
|
||||
if (mBufferHandle != nullptr) writer->setLayerBuffer(0, mBufferHandle->get(), mFillFence);
|
||||
}
|
||||
|
||||
LayerSettings TestBufferLayer::toRenderEngineLayerSettings() {
|
||||
LayerSettings layerSettings = TestLayer::toRenderEngineLayerSettings();
|
||||
layerSettings.source.buffer.buffer = std::make_shared<renderengine::ExternalTexture>(
|
||||
new GraphicBuffer(mBufferHandle, GraphicBuffer::CLONE_HANDLE, mWidth, mHeight,
|
||||
new GraphicBuffer(mBufferHandle->get(), GraphicBuffer::CLONE_HANDLE, mWidth, mHeight,
|
||||
static_cast<int32_t>(mFormat), 1, mUsage, mStride),
|
||||
mRenderEngine.getInternalRenderEngine(),
|
||||
renderengine::ExternalTexture::Usage::READABLE);
|
||||
@@ -318,10 +303,10 @@ LayerSettings TestBufferLayer::toRenderEngineLayerSettings() {
|
||||
}
|
||||
|
||||
void TestBufferLayer::fillBuffer(std::vector<IComposerClient::Color> expectedColors) {
|
||||
void* bufData = mGralloc->lock(mBufferHandle, mUsage, mAccessRegion, -1);
|
||||
void* bufData = mGralloc->lock(mBufferHandle->get(), mUsage, mAccessRegion, -1);
|
||||
ASSERT_NO_FATAL_FAILURE(
|
||||
ReadbackHelper::fillBuffer(mWidth, mHeight, mStride, bufData, mFormat, expectedColors));
|
||||
mFillFence = mGralloc->unlock(mBufferHandle);
|
||||
mFillFence = mGralloc->unlock(mBufferHandle->get());
|
||||
if (mFillFence != -1) {
|
||||
sync_wait(mFillFence, -1);
|
||||
close(mFillFence);
|
||||
@@ -329,16 +314,13 @@ void TestBufferLayer::fillBuffer(std::vector<IComposerClient::Color> expectedCol
|
||||
}
|
||||
|
||||
void TestBufferLayer::setBuffer(std::vector<IComposerClient::Color> colors) {
|
||||
if (mBufferHandle != nullptr) {
|
||||
mGralloc->freeBuffer(mBufferHandle);
|
||||
mBufferHandle = nullptr;
|
||||
}
|
||||
mBufferHandle = mGralloc->allocate(mWidth, mHeight, mLayerCount, mFormat, mUsage,
|
||||
/*import*/ true, &mStride);
|
||||
ASSERT_NE(nullptr, mBufferHandle);
|
||||
mBufferHandle.reset(new Gralloc::NativeHandleWrapper(
|
||||
mGralloc->allocate(mWidth, mHeight, mLayerCount, mFormat, mUsage,
|
||||
/*import*/ true, &mStride)));
|
||||
ASSERT_NE(nullptr, mBufferHandle->get());
|
||||
ASSERT_NO_FATAL_FAILURE(fillBuffer(colors));
|
||||
ASSERT_NE(false, mGralloc->validateBufferSize(mBufferHandle, mWidth, mHeight, mLayerCount,
|
||||
mFormat, mUsage, mStride));
|
||||
ASSERT_NE(false, mGralloc->validateBufferSize(mBufferHandle->get(), mWidth, mHeight,
|
||||
mLayerCount, mFormat, mUsage, mStride));
|
||||
}
|
||||
|
||||
void TestBufferLayer::setDataspace(Dataspace dataspace,
|
||||
|
||||
@@ -93,10 +93,12 @@ class ComposerClient : public V2_1::vts::ComposerClient {
|
||||
|
||||
class Gralloc : public V2_1::vts::Gralloc {
|
||||
public:
|
||||
using NativeHandleWrapper = V2_1::vts::NativeHandleWrapper;
|
||||
|
||||
Gralloc();
|
||||
const native_handle_t* allocate(uint32_t width, uint32_t height, uint32_t layerCount,
|
||||
PixelFormat format, uint64_t usage, bool import = true,
|
||||
uint32_t* outStride = nullptr) {
|
||||
const NativeHandleWrapper allocate(uint32_t width, uint32_t height, uint32_t layerCount,
|
||||
PixelFormat format, uint64_t usage, bool import = true,
|
||||
uint32_t* outStride = nullptr) {
|
||||
return V2_1::vts::Gralloc::allocate(
|
||||
width, height, layerCount,
|
||||
static_cast<android::hardware::graphics::common::V1_0::PixelFormat>(format), usage,
|
||||
|
||||
@@ -25,6 +25,8 @@
|
||||
#include <mapper-vts/2.1/MapperVts.h>
|
||||
#include <renderengine/RenderEngine.h>
|
||||
|
||||
#include <memory>
|
||||
|
||||
namespace android {
|
||||
namespace hardware {
|
||||
namespace graphics {
|
||||
@@ -116,8 +118,6 @@ class TestBufferLayer : public TestLayer {
|
||||
PixelFormat format,
|
||||
IComposerClient::Composition composition = IComposerClient::Composition::DEVICE);
|
||||
|
||||
~TestBufferLayer();
|
||||
|
||||
void write(const std::shared_ptr<CommandWriterBase>& writer) override;
|
||||
|
||||
LayerSettings toRenderEngineLayerSettings() override;
|
||||
@@ -143,7 +143,7 @@ class TestBufferLayer : public TestLayer {
|
||||
std::shared_ptr<Gralloc> mGralloc;
|
||||
TestRenderEngine& mRenderEngine;
|
||||
int32_t mFillFence;
|
||||
const native_handle_t* mBufferHandle = nullptr;
|
||||
std::unique_ptr<Gralloc::NativeHandleWrapper> mBufferHandle;
|
||||
};
|
||||
|
||||
class ReadbackHelper {
|
||||
@@ -182,7 +182,6 @@ class ReadbackBuffer {
|
||||
ReadbackBuffer(Display display, const std::shared_ptr<ComposerClient>& client,
|
||||
const std::shared_ptr<Gralloc>& gralloc, uint32_t width, uint32_t height,
|
||||
PixelFormat pixelFormat, Dataspace dataspace);
|
||||
~ReadbackBuffer();
|
||||
|
||||
void setReadbackBuffer();
|
||||
|
||||
@@ -196,7 +195,7 @@ class ReadbackBuffer {
|
||||
uint64_t mUsage;
|
||||
AccessRegion mAccessRegion;
|
||||
uint32_t mStride;
|
||||
const native_handle_t* mBufferHandle = nullptr;
|
||||
std::unique_ptr<Gralloc::NativeHandleWrapper> mBufferHandle = nullptr;
|
||||
PixelFormat mPixelFormat;
|
||||
Dataspace mDataspace;
|
||||
Display mDisplay;
|
||||
|
||||
@@ -39,15 +39,13 @@ namespace V2_2 {
|
||||
namespace vts {
|
||||
namespace {
|
||||
|
||||
using android::GraphicBuffer;
|
||||
using android::Rect;
|
||||
using android::hardware::hidl_handle;
|
||||
using common::V1_1::BufferUsage;
|
||||
using common::V1_1::Dataspace;
|
||||
using common::V1_1::PixelFormat;
|
||||
using mapper::V2_1::IMapper;
|
||||
using V2_1::Config;
|
||||
using V2_1::Display;
|
||||
using V2_1::vts::NativeHandleWrapper;
|
||||
using V2_1::vts::TestCommandReader;
|
||||
using vts::Gralloc;
|
||||
|
||||
@@ -355,9 +353,9 @@ TEST_P(GraphicsCompositionTest, SetLayerBufferNoEffect) {
|
||||
// This following buffer call should have no effect
|
||||
uint64_t usage =
|
||||
static_cast<uint64_t>(BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN);
|
||||
const native_handle_t* bufferHandle =
|
||||
NativeHandleWrapper bufferHandle =
|
||||
mGralloc->allocate(mDisplayWidth, mDisplayHeight, 1, PixelFormat::RGBA_8888, usage);
|
||||
mWriter->setLayerBuffer(0, bufferHandle, -1);
|
||||
mWriter->setLayerBuffer(0, bufferHandle.get(), -1);
|
||||
|
||||
// expected color for each pixel
|
||||
std::vector<IComposerClient::Color> expectedColors(mDisplayWidth * mDisplayHeight);
|
||||
@@ -465,24 +463,24 @@ TEST_P(GraphicsCompositionTest, ClientComposition) {
|
||||
|
||||
// create client target buffer
|
||||
uint32_t clientStride;
|
||||
const native_handle_t* clientBufferHandle =
|
||||
NativeHandleWrapper clientBufferHandle =
|
||||
mGralloc->allocate(layer->mWidth, layer->mHeight, layer->mLayerCount,
|
||||
clientFormat, clientUsage, /*import*/ true, &clientStride);
|
||||
ASSERT_NE(nullptr, clientBufferHandle);
|
||||
ASSERT_NE(nullptr, clientBufferHandle.get());
|
||||
|
||||
void* clientBufData =
|
||||
mGralloc->lock(clientBufferHandle, clientUsage, layer->mAccessRegion, -1);
|
||||
mGralloc->lock(clientBufferHandle.get(), clientUsage, layer->mAccessRegion, -1);
|
||||
|
||||
ASSERT_NO_FATAL_FAILURE(ReadbackHelper::fillBuffer(layer->mWidth, layer->mHeight,
|
||||
clientStride, clientBufData,
|
||||
clientFormat, expectedColors));
|
||||
int clientFence = mGralloc->unlock(clientBufferHandle);
|
||||
int clientFence = mGralloc->unlock(clientBufferHandle.get());
|
||||
if (clientFence != -1) {
|
||||
sync_wait(clientFence, -1);
|
||||
close(clientFence);
|
||||
}
|
||||
|
||||
mWriter->setClientTarget(0, clientBufferHandle, clientFence, clientDataspace,
|
||||
mWriter->setClientTarget(0, clientBufferHandle.get(), clientFence, clientDataspace,
|
||||
std::vector<IComposerClient::Rect>(1, damage));
|
||||
|
||||
layer->setToClientComposition(mWriter);
|
||||
@@ -593,12 +591,12 @@ TEST_P(GraphicsCompositionTest, DeviceAndClientComposition) {
|
||||
// create client target buffer
|
||||
ASSERT_EQ(1, mReader->mCompositionChanges[0].second);
|
||||
uint32_t clientStride;
|
||||
const native_handle_t* clientBufferHandle =
|
||||
NativeHandleWrapper clientBufferHandle =
|
||||
mGralloc->allocate(mDisplayWidth, mDisplayHeight, clientLayer->mLayerCount,
|
||||
clientFormat, clientUsage, /*import*/ true, &clientStride);
|
||||
ASSERT_NE(nullptr, clientBufferHandle);
|
||||
ASSERT_NE(nullptr, clientBufferHandle.get());
|
||||
|
||||
void* clientBufData = mGralloc->lock(clientBufferHandle, clientUsage,
|
||||
void* clientBufData = mGralloc->lock(clientBufferHandle.get(), clientUsage,
|
||||
{0, 0, mDisplayWidth, mDisplayHeight}, -1);
|
||||
|
||||
std::vector<IComposerClient::Color> clientColors(mDisplayWidth * mDisplayHeight);
|
||||
@@ -606,13 +604,13 @@ TEST_P(GraphicsCompositionTest, DeviceAndClientComposition) {
|
||||
ASSERT_NO_FATAL_FAILURE(ReadbackHelper::fillBuffer(mDisplayWidth, mDisplayHeight,
|
||||
clientStride, clientBufData,
|
||||
clientFormat, clientColors));
|
||||
int clientFence = mGralloc->unlock(clientBufferHandle);
|
||||
int clientFence = mGralloc->unlock(clientBufferHandle.get());
|
||||
if (clientFence != -1) {
|
||||
sync_wait(clientFence, -1);
|
||||
close(clientFence);
|
||||
}
|
||||
|
||||
mWriter->setClientTarget(0, clientBufferHandle, clientFence, clientDataspace,
|
||||
mWriter->setClientTarget(0, clientBufferHandle.get(), clientFence, clientDataspace,
|
||||
std::vector<IComposerClient::Rect>(1, clientFrame));
|
||||
clientLayer->setToClientComposition(mWriter);
|
||||
mWriter->validateDisplay();
|
||||
|
||||
@@ -36,13 +36,11 @@ namespace vts {
|
||||
namespace {
|
||||
|
||||
using common::V1_0::BufferUsage;
|
||||
using common::V1_0::ColorTransform;
|
||||
using common::V1_0::Transform;
|
||||
using common::V1_1::ColorMode;
|
||||
using common::V1_1::Dataspace;
|
||||
using common::V1_1::PixelFormat;
|
||||
using common::V1_1::RenderIntent;
|
||||
using mapper::V2_0::IMapper;
|
||||
using V2_1::vts::NativeHandleWrapper;
|
||||
|
||||
class GraphicsComposerHidlTest : public ::testing::TestWithParam<std::string> {
|
||||
protected:
|
||||
@@ -154,7 +152,7 @@ class GraphicsComposerHidlCommandTest : public GraphicsComposerHidlTest {
|
||||
ASSERT_NO_FATAL_FAILURE(GraphicsComposerHidlTest::TearDown());
|
||||
}
|
||||
|
||||
const native_handle_t* allocate() {
|
||||
NativeHandleWrapper allocate() {
|
||||
uint64_t usage =
|
||||
static_cast<uint64_t>(BufferUsage::CPU_WRITE_OFTEN | BufferUsage::CPU_READ_OFTEN);
|
||||
return mGralloc->allocate(/*width*/ 64, /*height*/ 64, /*layerCount*/ 1,
|
||||
@@ -440,12 +438,12 @@ TEST_P(GraphicsComposerHidlTest, SetReadbackBuffer) {
|
||||
static_cast<uint64_t>(BufferUsage::COMPOSER_OVERLAY | BufferUsage::CPU_READ_OFTEN);
|
||||
|
||||
std::unique_ptr<Gralloc> gralloc;
|
||||
const native_handle_t* buffer;
|
||||
std::unique_ptr<NativeHandleWrapper> buffer;
|
||||
ASSERT_NO_FATAL_FAILURE(gralloc = std::make_unique<Gralloc>());
|
||||
ASSERT_NO_FATAL_FAILURE(buffer = gralloc->allocate(mDisplayWidth, mDisplayHeight, 1,
|
||||
mReadbackPixelFormat, usage));
|
||||
ASSERT_NO_FATAL_FAILURE(buffer.reset(new NativeHandleWrapper(
|
||||
gralloc->allocate(mDisplayWidth, mDisplayHeight, 1, mReadbackPixelFormat, usage))));
|
||||
|
||||
mComposerClient->setReadbackBuffer(mPrimaryDisplay, buffer, -1);
|
||||
mComposerClient->setReadbackBuffer(mPrimaryDisplay, buffer->get(), -1);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -463,12 +461,13 @@ TEST_P(GraphicsComposerHidlTest, SetReadbackBufferBadDisplay) {
|
||||
static_cast<uint64_t>(BufferUsage::COMPOSER_OVERLAY | BufferUsage::CPU_READ_OFTEN);
|
||||
|
||||
std::unique_ptr<Gralloc> gralloc;
|
||||
const native_handle_t* buffer;
|
||||
std::unique_ptr<NativeHandleWrapper> buffer;
|
||||
ASSERT_NO_FATAL_FAILURE(gralloc = std::make_unique<Gralloc>());
|
||||
ASSERT_NO_FATAL_FAILURE(buffer = gralloc->allocate(mDisplayWidth, mDisplayHeight, 1,
|
||||
mReadbackPixelFormat, usage));
|
||||
ASSERT_NO_FATAL_FAILURE(buffer.reset(new NativeHandleWrapper(
|
||||
gralloc->allocate(mDisplayWidth, mDisplayHeight, 1, mReadbackPixelFormat, usage))));
|
||||
|
||||
Error error = mComposerClient->getRaw()->setReadbackBuffer(mInvalidDisplayId, buffer, nullptr);
|
||||
Error error =
|
||||
mComposerClient->getRaw()->setReadbackBuffer(mInvalidDisplayId, buffer->get(), nullptr);
|
||||
ASSERT_EQ(Error::BAD_DISPLAY, error);
|
||||
}
|
||||
|
||||
|
||||
@@ -38,12 +38,10 @@ namespace V2_3 {
|
||||
namespace vts {
|
||||
namespace {
|
||||
|
||||
using common::V1_0::BufferUsage;
|
||||
using common::V1_1::RenderIntent;
|
||||
using common::V1_2::ColorMode;
|
||||
using common::V1_2::Dataspace;
|
||||
using common::V1_2::PixelFormat;
|
||||
using mapper::V2_0::IMapper;
|
||||
using V2_2::vts::Gralloc;
|
||||
|
||||
class GraphicsComposerHidlTest : public ::testing::TestWithParam<std::string> {
|
||||
@@ -140,12 +138,6 @@ class GraphicsComposerHidlCommandTest : public GraphicsComposerHidlTest {
|
||||
ASSERT_NO_FATAL_FAILURE(GraphicsComposerHidlTest::TearDown());
|
||||
}
|
||||
|
||||
const native_handle_t* allocate() {
|
||||
return mGralloc->allocate(
|
||||
64, 64, 1, static_cast<common::V1_1::PixelFormat>(PixelFormat::RGBA_8888),
|
||||
static_cast<uint64_t>(BufferUsage::CPU_WRITE_OFTEN | BufferUsage::CPU_READ_OFTEN));
|
||||
}
|
||||
|
||||
void execute() { mComposerClient->execute(mReader.get(), mWriter.get()); }
|
||||
|
||||
std::unique_ptr<CommandWriterBase> mWriter;
|
||||
|
||||
@@ -52,8 +52,8 @@ using common::V1_1::RenderIntent;
|
||||
using common::V1_2::ColorMode;
|
||||
using common::V1_2::Dataspace;
|
||||
using common::V1_2::PixelFormat;
|
||||
using mapper::V2_0::IMapper;
|
||||
using V2_1::Layer;
|
||||
using V2_1::vts::NativeHandleWrapper;
|
||||
using V2_2::Transform;
|
||||
using V2_2::vts::Gralloc;
|
||||
|
||||
@@ -159,7 +159,7 @@ class GraphicsComposerHidlTest : public ::testing::TestWithParam<std::string> {
|
||||
|
||||
void execute() { mComposerClient->execute(mReader.get(), mWriter.get()); }
|
||||
|
||||
const native_handle_t* allocate(int32_t width, int32_t height) {
|
||||
NativeHandleWrapper allocate(int32_t width, int32_t height) {
|
||||
return mGralloc->allocate(
|
||||
width, height, /*layerCount*/ 1,
|
||||
static_cast<common::V1_1::PixelFormat>(PixelFormat::RGBA_8888),
|
||||
@@ -493,46 +493,53 @@ void GraphicsComposerHidlTest::sendRefreshFrame(const VtsDisplay& display,
|
||||
IComposerClient::FRect displayCrop = display.getCrop();
|
||||
int32_t displayWidth = static_cast<int32_t>(std::ceilf(displayCrop.right - displayCrop.left));
|
||||
int32_t displayHeight = static_cast<int32_t>(std::ceilf(displayCrop.bottom - displayCrop.top));
|
||||
auto handle = allocate(displayWidth, displayHeight);
|
||||
ASSERT_NE(nullptr, handle);
|
||||
|
||||
Layer layer;
|
||||
ASSERT_NO_FATAL_FAILURE(layer = mComposerClient->createLayer(display.get(), kBufferSlotCount));
|
||||
mWriter->selectLayer(layer);
|
||||
mWriter->setLayerCompositionType(IComposerClient::Composition::DEVICE);
|
||||
mWriter->setLayerDisplayFrame(display.getFrameRect());
|
||||
mWriter->setLayerPlaneAlpha(1);
|
||||
mWriter->setLayerSourceCrop(display.getCrop());
|
||||
mWriter->setLayerTransform(static_cast<Transform>(0));
|
||||
mWriter->setLayerVisibleRegion(std::vector<IComposerClient::Rect>(1, display.getFrameRect()));
|
||||
mWriter->setLayerZOrder(10);
|
||||
mWriter->setLayerBlendMode(IComposerClient::BlendMode::NONE);
|
||||
mWriter->setLayerSurfaceDamage(std::vector<IComposerClient::Rect>(1, display.getFrameRect()));
|
||||
mWriter->setLayerBuffer(0, handle, -1);
|
||||
mWriter->setLayerDataspace(Dataspace::UNKNOWN);
|
||||
|
||||
mWriter->validateDisplay();
|
||||
execute();
|
||||
ASSERT_EQ(0, mReader->mErrors.size());
|
||||
mReader->mCompositionChanges.clear();
|
||||
{
|
||||
auto handle = allocate(displayWidth, displayHeight);
|
||||
ASSERT_NE(nullptr, handle.get());
|
||||
|
||||
mWriter->presentDisplay();
|
||||
execute();
|
||||
ASSERT_EQ(0, mReader->mErrors.size());
|
||||
mWriter->selectLayer(layer);
|
||||
mWriter->setLayerCompositionType(IComposerClient::Composition::DEVICE);
|
||||
mWriter->setLayerDisplayFrame(display.getFrameRect());
|
||||
mWriter->setLayerPlaneAlpha(1);
|
||||
mWriter->setLayerSourceCrop(display.getCrop());
|
||||
mWriter->setLayerTransform(static_cast<Transform>(0));
|
||||
mWriter->setLayerVisibleRegion(
|
||||
std::vector<IComposerClient::Rect>(1, display.getFrameRect()));
|
||||
mWriter->setLayerZOrder(10);
|
||||
mWriter->setLayerBlendMode(IComposerClient::BlendMode::NONE);
|
||||
mWriter->setLayerSurfaceDamage(
|
||||
std::vector<IComposerClient::Rect>(1, display.getFrameRect()));
|
||||
mWriter->setLayerBuffer(0, handle.get(), -1);
|
||||
mWriter->setLayerDataspace(Dataspace::UNKNOWN);
|
||||
|
||||
mWriter->selectLayer(layer);
|
||||
auto handle2 = allocate(displayWidth, displayHeight);
|
||||
ASSERT_NE(nullptr, handle2);
|
||||
mWriter->validateDisplay();
|
||||
execute();
|
||||
ASSERT_EQ(0, mReader->mErrors.size());
|
||||
mReader->mCompositionChanges.clear();
|
||||
|
||||
mWriter->setLayerBuffer(0, handle2, -1);
|
||||
mWriter->setLayerSurfaceDamage(std::vector<IComposerClient::Rect>(1, {0, 0, 10, 10}));
|
||||
mWriter->validateDisplay();
|
||||
execute();
|
||||
ASSERT_EQ(0, mReader->mErrors.size());
|
||||
mReader->mCompositionChanges.clear();
|
||||
mWriter->presentDisplay();
|
||||
execute();
|
||||
ASSERT_EQ(0, mReader->mErrors.size());
|
||||
}
|
||||
|
||||
mWriter->presentDisplay();
|
||||
execute();
|
||||
{
|
||||
auto handle = allocate(displayWidth, displayHeight);
|
||||
ASSERT_NE(nullptr, handle.get());
|
||||
|
||||
mWriter->selectLayer(layer);
|
||||
mWriter->setLayerBuffer(0, handle.get(), -1);
|
||||
mWriter->setLayerSurfaceDamage(std::vector<IComposerClient::Rect>(1, {0, 0, 10, 10}));
|
||||
mWriter->validateDisplay();
|
||||
execute();
|
||||
ASSERT_EQ(0, mReader->mErrors.size());
|
||||
mReader->mCompositionChanges.clear();
|
||||
|
||||
mWriter->presentDisplay();
|
||||
execute();
|
||||
}
|
||||
|
||||
ASSERT_NO_FATAL_FAILURE(mComposerClient->destroyLayer(display.get(), layer));
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user