mirror of
https://gitee.com/openharmony/graphic_graphic_2d
synced 2024-11-23 15:11:51 +00:00
修复Hello_Composer,添加setLayerColor测试
Signed-off-by: 刘瓒 <liuzan9@huawei.com>
This commit is contained in:
parent
3b65cbce41
commit
7d66465d40
@ -55,7 +55,8 @@ using GraphicCompositionType = enum {
|
|||||||
GRAPHIC_COMPOSITION_DEVICE_CLEAR, /**< Device clear composition type, the device will clear the target region. */
|
GRAPHIC_COMPOSITION_DEVICE_CLEAR, /**< Device clear composition type, the device will clear the target region. */
|
||||||
GRAPHIC_COMPOSITION_CLIENT_CLEAR, /**< Client clear composition type, the service will clear the target region. */
|
GRAPHIC_COMPOSITION_CLIENT_CLEAR, /**< Client clear composition type, the service will clear the target region. */
|
||||||
GRAPHIC_COMPOSITION_TUNNEL, /**< Tunnel composition type, used for tunnel. */
|
GRAPHIC_COMPOSITION_TUNNEL, /**< Tunnel composition type, used for tunnel. */
|
||||||
GRAPHIC_COMPOSITION_BUTT
|
GRAPHIC_COMPOSITION_BUTT,
|
||||||
|
GRAPHIC_COMPOSITION_SOLID_COLOR /**< used for SetLayerColor. */
|
||||||
};
|
};
|
||||||
|
|
||||||
using GraphicLayerAlpha = struct {
|
using GraphicLayerAlpha = struct {
|
||||||
|
@ -50,6 +50,7 @@ static const std::map<GraphicCompositionType, std::string> CompositionTypeStrs =
|
|||||||
{GRAPHIC_COMPOSITION_CLIENT_CLEAR, "5 <client clear composistion>"},
|
{GRAPHIC_COMPOSITION_CLIENT_CLEAR, "5 <client clear composistion>"},
|
||||||
{GRAPHIC_COMPOSITION_TUNNEL, "6 <tunnel composistion>"},
|
{GRAPHIC_COMPOSITION_TUNNEL, "6 <tunnel composistion>"},
|
||||||
{GRAPHIC_COMPOSITION_BUTT, "7 <uninitialized>"},
|
{GRAPHIC_COMPOSITION_BUTT, "7 <uninitialized>"},
|
||||||
|
{GRAPHIC_COMPOSITION_SOLID_COLOR, "8 <layercolor composition>"},
|
||||||
};
|
};
|
||||||
|
|
||||||
static const std::map<GraphicBlendType, std::string> BlendTypeStrs = {
|
static const std::map<GraphicBlendType, std::string> BlendTypeStrs = {
|
||||||
|
@ -55,6 +55,7 @@ ohos_executable("hello_composer") {
|
|||||||
]
|
]
|
||||||
|
|
||||||
external_deps = [
|
external_deps = [
|
||||||
|
"c_utils:utils",
|
||||||
"eventhandler:libeventhandler",
|
"eventhandler:libeventhandler",
|
||||||
"hilog:libhilog",
|
"hilog:libhilog",
|
||||||
]
|
]
|
||||||
|
@ -74,7 +74,7 @@ void HelloComposer::Run(const std::vector<std::string> &runArgs)
|
|||||||
sleep(1);
|
sleep(1);
|
||||||
std::shared_ptr<OHOS::AppExecFwk::EventRunner> runner = OHOS::AppExecFwk::EventRunner::Create(false);
|
std::shared_ptr<OHOS::AppExecFwk::EventRunner> runner = OHOS::AppExecFwk::EventRunner::Create(false);
|
||||||
mainThreadHandler_ = std::make_shared<OHOS::AppExecFwk::EventHandler>(runner);
|
mainThreadHandler_ = std::make_shared<OHOS::AppExecFwk::EventHandler>(runner);
|
||||||
g_receiver = new VSyncReceiver(vsyncConnection, mainThreadHandler_);
|
g_receiver = new VSyncReceiver(vsyncConnection, nullptr, mainThreadHandler_);
|
||||||
g_receiver->Init();
|
g_receiver->Init();
|
||||||
mainThreadHandler_->PostTask(std::bind(&HelloComposer::RequestSync, this));
|
mainThreadHandler_->PostTask(std::bind(&HelloComposer::RequestSync, this));
|
||||||
runner->Run();
|
runner->Run();
|
||||||
@ -91,6 +91,8 @@ void HelloComposer::ParseArgs(const std::vector<std::string> &runArgs)
|
|||||||
testLayerRotate_ = true;
|
testLayerRotate_ = true;
|
||||||
} else if (arg == "--YUV") {
|
} else if (arg == "--YUV") {
|
||||||
YUVFormat_ = true;
|
YUVFormat_ = true;
|
||||||
|
} else if (arg == "--testLayerColor") {
|
||||||
|
testLayerColor_ = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -219,6 +221,10 @@ void HelloComposer::Sync(int64_t, void *data)
|
|||||||
void HelloComposer::SetRunArgs(const std::unique_ptr<LayerContext> &drawLayer) const
|
void HelloComposer::SetRunArgs(const std::unique_ptr<LayerContext> &drawLayer) const
|
||||||
{
|
{
|
||||||
LayerType type = drawLayer->GetLayerType();
|
LayerType type = drawLayer->GetLayerType();
|
||||||
|
if (testLayerColor_) {
|
||||||
|
drawLayer->SetTestLayerColor(true);
|
||||||
|
}
|
||||||
|
|
||||||
if (type < LayerType::LAYER_EXTRA) {
|
if (type < LayerType::LAYER_EXTRA) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -248,6 +254,7 @@ void HelloComposer::Draw()
|
|||||||
}
|
}
|
||||||
|
|
||||||
for (auto &drawLayer : drawLayers) { // consumer
|
for (auto &drawLayer : drawLayers) { // consumer
|
||||||
|
drawLayer->FillHDIBuffer();
|
||||||
drawLayer->FillHDILayer();
|
drawLayer->FillHDILayer();
|
||||||
layerVec.emplace_back(drawLayer->GetHdiLayer());
|
layerVec.emplace_back(drawLayer->GetHdiLayer());
|
||||||
}
|
}
|
||||||
@ -464,13 +471,11 @@ void HelloComposer::DoPrepareCompleted(sptr<Surface> surface, const struct Prepa
|
|||||||
sptr<SyncFence> tempFence = new SyncFence(releaseFence);
|
sptr<SyncFence> tempFence = new SyncFence(releaseFence);
|
||||||
tempFence->Wait(100); // 100 ms
|
tempFence->Wait(100); // 100 ms
|
||||||
|
|
||||||
uint32_t clientCount = 0;
|
|
||||||
bool hasClient = false;
|
bool hasClient = false;
|
||||||
const std::vector<LayerInfoPtr> &layers = param.layers;
|
const std::vector<LayerInfoPtr> &layers = param.layers;
|
||||||
for (const LayerInfoPtr &layer : layers) {
|
for (const LayerInfoPtr &layer : layers) {
|
||||||
if (layer->GetCompositionType() == GraphicCompositionType::GRAPHIC_COMPOSITION_CLIENT) {
|
if (layer->GetCompositionType() == GraphicCompositionType::GRAPHIC_COMPOSITION_CLIENT) {
|
||||||
hasClient = true;
|
hasClient = true;
|
||||||
clientCount++;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -47,6 +47,7 @@ private:
|
|||||||
bool postHotPlugEvent_ = false;
|
bool postHotPlugEvent_ = false;
|
||||||
bool testClient_ = false;
|
bool testClient_ = false;
|
||||||
bool testLayerRotate_ = false;
|
bool testLayerRotate_ = false;
|
||||||
|
bool testLayerColor_ = false;
|
||||||
HdiBackend* backend_ = nullptr;
|
HdiBackend* backend_ = nullptr;
|
||||||
std::vector<std::unique_ptr<HdiScreen>> screens_;
|
std::vector<std::unique_ptr<HdiScreen>> screens_;
|
||||||
std::shared_ptr<HdiOutput> curOutput_;
|
std::shared_ptr<HdiOutput> curOutput_;
|
||||||
|
@ -72,6 +72,11 @@ void LayerContext::SetTestYUVStatus(bool status)
|
|||||||
testYUV_ = status;
|
testYUV_ = status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void LayerContext::SetTestLayerColor(bool status)
|
||||||
|
{
|
||||||
|
testLayerColor_ = status;
|
||||||
|
}
|
||||||
|
|
||||||
OHOS::Rosen::LayerType LayerContext::GetLayerType() const
|
OHOS::Rosen::LayerType LayerContext::GetLayerType() const
|
||||||
{
|
{
|
||||||
return layerType_;
|
return layerType_;
|
||||||
@ -132,23 +137,9 @@ SurfaceError LayerContext::DrawBufferColor()
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
SurfaceError LayerContext::FillHDILayer()
|
void LayerContext::FillHDILayer()
|
||||||
{
|
{
|
||||||
OHOS::sptr<SurfaceBuffer> buffer = nullptr;
|
|
||||||
int32_t acquireFence = -1;
|
|
||||||
int64_t timestamp;
|
|
||||||
Rect damage;
|
|
||||||
SurfaceError ret = cSurface_->AcquireBuffer(buffer, acquireFence, timestamp, damage);
|
|
||||||
sptr<SyncFence> acquireSyncFence = new SyncFence(acquireFence);
|
|
||||||
if (ret != SURFACE_ERROR_OK) {
|
|
||||||
LOGE("Acquire buffer failed");
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
GraphicLayerAlpha alpha = { .enPixelAlpha = true };
|
GraphicLayerAlpha alpha = { .enPixelAlpha = true };
|
||||||
|
|
||||||
hdiLayer_->SetSurface(cSurface_);
|
|
||||||
hdiLayer_->SetBuffer(buffer, acquireSyncFence);
|
|
||||||
hdiLayer_->SetZorder(static_cast<int32_t>(zorder_));
|
hdiLayer_->SetZorder(static_cast<int32_t>(zorder_));
|
||||||
hdiLayer_->SetAlpha(alpha);
|
hdiLayer_->SetAlpha(alpha);
|
||||||
if (layerType_ >= LayerType::LAYER_EXTRA) {
|
if (layerType_ >= LayerType::LAYER_EXTRA) {
|
||||||
@ -163,9 +154,52 @@ SurfaceError LayerContext::FillHDILayer()
|
|||||||
dirtyRegions.emplace_back(src_);
|
dirtyRegions.emplace_back(src_);
|
||||||
hdiLayer_->SetDirtyRegions(dirtyRegions);
|
hdiLayer_->SetDirtyRegions(dirtyRegions);
|
||||||
hdiLayer_->SetLayerSize(dst_);
|
hdiLayer_->SetLayerSize(dst_);
|
||||||
hdiLayer_->SetBlendType(GraphicBlendType::GRAPHIC_BLEND_SRCOVER);
|
|
||||||
|
if (testLayerColor_) {
|
||||||
|
hdiLayer_->SetBlendType(GraphicBlendType::GRAPHIC_BLEND_SRC);
|
||||||
|
} else {
|
||||||
|
hdiLayer_->SetBlendType(GraphicBlendType::GRAPHIC_BLEND_SRCOVER);
|
||||||
|
}
|
||||||
|
|
||||||
|
hdiLayer_->SetPreMulti(true);
|
||||||
hdiLayer_->SetCropRect(src_);
|
hdiLayer_->SetCropRect(src_);
|
||||||
hdiLayer_->SetPreMulti(false);
|
}
|
||||||
|
|
||||||
|
SurfaceError LayerContext::FillHDIBuffer()
|
||||||
|
{
|
||||||
|
OHOS::sptr<SurfaceBuffer> buffer = nullptr;
|
||||||
|
int32_t acquireFence = -1;
|
||||||
|
int64_t timestamp;
|
||||||
|
Rect damage;
|
||||||
|
SurfaceError ret = cSurface_->AcquireBuffer(buffer, acquireFence, timestamp, damage);
|
||||||
|
sptr<SyncFence> acquireSyncFence = new SyncFence(acquireFence);
|
||||||
|
if (ret != SURFACE_ERROR_OK) {
|
||||||
|
LOGE("Acquire buffer failed");
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
hdiLayer_->SetSurface(cSurface_);
|
||||||
|
|
||||||
|
if (testLayerColor_) {
|
||||||
|
if (layerType_ != LayerType::LAYER_LAUNCHER) {
|
||||||
|
hdiLayer_->SetBuffer(buffer, acquireSyncFence);
|
||||||
|
} else {
|
||||||
|
const uint32_t COLOR_R = 255; // 255 is red color
|
||||||
|
const uint32_t COLOR_G = 255; // 255 is green color
|
||||||
|
const uint32_t COLOR_B = 255; // 255 is blue color
|
||||||
|
const uint32_t COLOR_A = 255; // 255 is alpha
|
||||||
|
GraphicLayerColor color = {
|
||||||
|
.r = COLOR_R,
|
||||||
|
.g = COLOR_G,
|
||||||
|
.b = COLOR_B,
|
||||||
|
.a = COLOR_A
|
||||||
|
};
|
||||||
|
|
||||||
|
hdiLayer_->SetLayerColor(color);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
hdiLayer_->SetBuffer(buffer, acquireSyncFence);
|
||||||
|
}
|
||||||
|
|
||||||
prevBuffer_ = buffer;
|
prevBuffer_ = buffer;
|
||||||
prevFence_ = acquireSyncFence;
|
prevFence_ = acquireSyncFence;
|
||||||
@ -201,6 +235,8 @@ void LayerContext::SetLayerCompositionType()
|
|||||||
{
|
{
|
||||||
if (layerType_ >= LayerType::LAYER_EXTRA && testClient_) {
|
if (layerType_ >= LayerType::LAYER_EXTRA && testClient_) {
|
||||||
hdiLayer_->SetCompositionType(GraphicCompositionType::GRAPHIC_COMPOSITION_CLIENT);
|
hdiLayer_->SetCompositionType(GraphicCompositionType::GRAPHIC_COMPOSITION_CLIENT);
|
||||||
|
} else if (layerType_ == LayerType::LAYER_LAUNCHER && testLayerColor_) {
|
||||||
|
hdiLayer_->SetCompositionType(GraphicCompositionType::GRAPHIC_COMPOSITION_SOLID_COLOR);
|
||||||
} else {
|
} else {
|
||||||
hdiLayer_->SetCompositionType(GraphicCompositionType::GRAPHIC_COMPOSITION_DEVICE);
|
hdiLayer_->SetCompositionType(GraphicCompositionType::GRAPHIC_COMPOSITION_DEVICE);
|
||||||
}
|
}
|
||||||
|
@ -48,11 +48,13 @@ public:
|
|||||||
|
|
||||||
void OnBufferAvailable() override;
|
void OnBufferAvailable() override;
|
||||||
SurfaceError DrawBufferColor();
|
SurfaceError DrawBufferColor();
|
||||||
SurfaceError FillHDILayer();
|
void FillHDILayer();
|
||||||
|
SurfaceError FillHDIBuffer();
|
||||||
const std::shared_ptr<HdiLayerInfo> GetHdiLayer();
|
const std::shared_ptr<HdiLayerInfo> GetHdiLayer();
|
||||||
void SetTestClientStatus(bool status);
|
void SetTestClientStatus(bool status);
|
||||||
void SetTestRotateStatus(bool status);
|
void SetTestRotateStatus(bool status);
|
||||||
void SetTestYUVStatus(bool status);
|
void SetTestYUVStatus(bool status);
|
||||||
|
void SetTestLayerColor(bool status);
|
||||||
LayerType GetLayerType() const;
|
LayerType GetLayerType() const;
|
||||||
sptr<SurfaceBuffer> GetPreBuffer() const
|
sptr<SurfaceBuffer> GetPreBuffer() const
|
||||||
{
|
{
|
||||||
@ -80,6 +82,7 @@ private:
|
|||||||
bool testClient_ = false;
|
bool testClient_ = false;
|
||||||
bool testRotate_ = false;
|
bool testRotate_ = false;
|
||||||
bool testYUV_ = false;
|
bool testYUV_ = false;
|
||||||
|
bool testLayerColor_ = false;
|
||||||
|
|
||||||
void DrawColor(void *image, int width, int height);
|
void DrawColor(void *image, int width, int height);
|
||||||
void DrawExtraColor(void *image, uint32_t width, uint32_t height);
|
void DrawExtraColor(void *image, uint32_t width, uint32_t height);
|
||||||
|
Loading…
Reference in New Issue
Block a user