mirror of
https://gitee.com/openharmony/graphic_graphic_2d
synced 2024-11-27 09:10:54 +00:00
commit
e64c0beddc
@ -403,7 +403,7 @@ SurfaceError SurfaceImage::AcquireNativeWindowBuffer(OHNativeWindowBuffer** nati
|
|||||||
Rect damage;
|
Rect damage;
|
||||||
SurfaceError ret = AcquireBuffer(buffer, acquireFence, timestamp, damage);
|
SurfaceError ret = AcquireBuffer(buffer, acquireFence, timestamp, damage);
|
||||||
if (ret != SURFACE_ERROR_OK) {
|
if (ret != SURFACE_ERROR_OK) {
|
||||||
BLOGE("AcquireBuffer failed: %d", ret);
|
BLOGE("AcquireBuffer failed: %{public}d", ret);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
currentSurfaceBuffer_ = buffer;
|
currentSurfaceBuffer_ = buffer;
|
||||||
@ -415,7 +415,10 @@ SurfaceError SurfaceImage::AcquireNativeWindowBuffer(OHNativeWindowBuffer** nati
|
|||||||
currentTransformType_, currentCrop_);
|
currentTransformType_, currentCrop_);
|
||||||
|
|
||||||
*fenceFd = acquireFence->Dup();
|
*fenceFd = acquireFence->Dup();
|
||||||
OHNativeWindowBuffer *nwBuffer = new OHNativeWindowBuffer();
|
OHNativeWindowBuffer *nwBuffer = new(std::nothrow) OHNativeWindowBuffer();
|
||||||
|
if (nwBuffer == nullptr) {
|
||||||
|
return SURFACE_ERROR_NOMEM;
|
||||||
|
}
|
||||||
nwBuffer->sfbuffer = buffer;
|
nwBuffer->sfbuffer = buffer;
|
||||||
NativeObjectReference(nwBuffer);
|
NativeObjectReference(nwBuffer);
|
||||||
*nativeWindowBuffer = nwBuffer;
|
*nativeWindowBuffer = nwBuffer;
|
||||||
@ -429,7 +432,7 @@ SurfaceError SurfaceImage::ReleaseNativeWindowBuffer(OHNativeWindowBuffer* nativ
|
|||||||
// There is no need to close this fd, because in function ReleaseBuffer it will be closed.
|
// There is no need to close this fd, because in function ReleaseBuffer it will be closed.
|
||||||
SurfaceError ret = ReleaseBuffer(nativeWindowBuffer->sfbuffer, fenceFd);
|
SurfaceError ret = ReleaseBuffer(nativeWindowBuffer->sfbuffer, fenceFd);
|
||||||
if (ret != SURFACE_ERROR_OK) {
|
if (ret != SURFACE_ERROR_OK) {
|
||||||
BLOGE("ReleaseBuffer failed: %d", ret);
|
BLOGE("ReleaseBuffer failed: %{public}d", ret);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
NativeObjectUnreference(nativeWindowBuffer);
|
NativeObjectUnreference(nativeWindowBuffer);
|
||||||
|
@ -17,6 +17,7 @@
|
|||||||
#include <native_image.h>
|
#include <native_image.h>
|
||||||
#include <EGL/egl.h>
|
#include <EGL/egl.h>
|
||||||
#include <EGL/eglext.h>
|
#include <EGL/eglext.h>
|
||||||
|
#include <sys/time.h>
|
||||||
#include "graphic_common_c.h"
|
#include "graphic_common_c.h"
|
||||||
#include "surface_type.h"
|
#include "surface_type.h"
|
||||||
#include "window.h"
|
#include "window.h"
|
||||||
@ -937,4 +938,147 @@ HWTEST_F(NativeImageTest, OHNativeImageAcquireNativeWindowBuffer002, Function |
|
|||||||
delete region;
|
delete region;
|
||||||
OH_NativeImage_Destroy(&newImage);
|
OH_NativeImage_Destroy(&newImage);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Function: OH_NativeImage_AcquireNativeWindowBuffer
|
||||||
|
* Type: Function
|
||||||
|
* Rank: Important(1)
|
||||||
|
* EnvConditions: N/A
|
||||||
|
* CaseDescription: 1. call OH_NativeImage_AcquireNativeWindowBuffer
|
||||||
|
* 2. check ret
|
||||||
|
* 3. call OH_NativeImage_ReleaseNativeWindowBuffer
|
||||||
|
* 4. check ret
|
||||||
|
* @tc.require: issueI5KG61
|
||||||
|
*/
|
||||||
|
HWTEST_F(NativeImageTest, OHNativeImageAcquireNativeWindowBuffer003, Function | MediumTest | Level1)
|
||||||
|
{
|
||||||
|
OH_NativeImage* newImage = OH_NativeImage_Create(0, 0);
|
||||||
|
ASSERT_NE(newImage, nullptr);
|
||||||
|
OHNativeWindow* newNativeWindow = OH_NativeImage_AcquireNativeWindow(newImage);
|
||||||
|
ASSERT_NE(newNativeWindow, nullptr);
|
||||||
|
|
||||||
|
int32_t code = SET_BUFFER_GEOMETRY;
|
||||||
|
int32_t width = 0x100;
|
||||||
|
int32_t height = 0x100;
|
||||||
|
int32_t ret = NativeWindowHandleOpt(newNativeWindow, code, width, height);
|
||||||
|
ASSERT_EQ(ret, GSERROR_OK);
|
||||||
|
struct Region *region = new Region();
|
||||||
|
struct Region::Rect *rect = new Region::Rect();
|
||||||
|
rect->x = 0x100;
|
||||||
|
rect->y = 0x100;
|
||||||
|
rect->w = 0x100;
|
||||||
|
rect->h = 0x100;
|
||||||
|
region->rects = rect;
|
||||||
|
|
||||||
|
NativeWindowBuffer* nativeWindowBuffer = nullptr;
|
||||||
|
int fenceFd = -1;
|
||||||
|
|
||||||
|
ret = OH_NativeImage_AcquireNativeWindowBuffer(newImage, &nativeWindowBuffer, &fenceFd);
|
||||||
|
ASSERT_EQ(ret, SURFACE_ERROR_NO_BUFFER);
|
||||||
|
|
||||||
|
ret = OH_NativeWindow_NativeWindowRequestBuffer(newNativeWindow, &nativeWindowBuffer, &fenceFd);
|
||||||
|
ASSERT_EQ(ret, GSERROR_OK);
|
||||||
|
|
||||||
|
ret = OH_NativeWindow_NativeWindowFlushBuffer(newNativeWindow, nativeWindowBuffer, fenceFd, *region);
|
||||||
|
ASSERT_EQ(ret, GSERROR_OK);
|
||||||
|
|
||||||
|
ret = OH_NativeImage_ReleaseNativeWindowBuffer(newImage, nativeWindowBuffer, fenceFd);
|
||||||
|
ASSERT_EQ(ret, SURFACE_ERROR_BUFFER_STATE_INVALID);
|
||||||
|
|
||||||
|
OH_NativeImage* newImage1 = OH_NativeImage_Create(0, 0);
|
||||||
|
ASSERT_NE(newImage1, nullptr);
|
||||||
|
OHNativeWindow* newNativeWindow1 = OH_NativeImage_AcquireNativeWindow(newImage1);
|
||||||
|
ASSERT_NE(newNativeWindow1, nullptr);
|
||||||
|
code = SET_BUFFER_GEOMETRY;
|
||||||
|
width = 0x100;
|
||||||
|
height = 0x100;
|
||||||
|
ret = NativeWindowHandleOpt(newNativeWindow1, code, width, height);
|
||||||
|
ASSERT_EQ(ret, GSERROR_OK);
|
||||||
|
|
||||||
|
NativeWindowBuffer* nativeWindowBuffer1 = nullptr;
|
||||||
|
ret = OH_NativeWindow_NativeWindowRequestBuffer(newNativeWindow1, &nativeWindowBuffer1, &fenceFd);
|
||||||
|
ASSERT_EQ(ret, GSERROR_OK);
|
||||||
|
ret = OH_NativeWindow_NativeWindowFlushBuffer(newNativeWindow1, nativeWindowBuffer1, fenceFd, *region);
|
||||||
|
ASSERT_EQ(ret, GSERROR_OK);
|
||||||
|
|
||||||
|
ret = OH_NativeImage_AcquireNativeWindowBuffer(newImage1, &nativeWindowBuffer1, &fenceFd);
|
||||||
|
ASSERT_EQ(ret, GSERROR_OK);
|
||||||
|
ret = OH_NativeImage_ReleaseNativeWindowBuffer(newImage, nativeWindowBuffer1, fenceFd);
|
||||||
|
ASSERT_EQ(ret, SURFACE_ERROR_BUFFER_NOT_INCACHE);
|
||||||
|
|
||||||
|
delete rect;
|
||||||
|
delete region;
|
||||||
|
OH_NativeImage_Destroy(&newImage);
|
||||||
|
OH_NativeImage_Destroy(&newImage1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Function: OH_NativeImage_AcquireNativeWindowBuffer
|
||||||
|
* Type: Function
|
||||||
|
* Rank: Important(1)
|
||||||
|
* EnvConditions: N/A
|
||||||
|
* CaseDescription: 1. call OH_NativeImage_AcquireNativeWindowBuffer
|
||||||
|
* 2. check ret
|
||||||
|
* 3. call OH_NativeImage_ReleaseNativeWindowBuffer
|
||||||
|
* 4. check ret
|
||||||
|
* @tc.require: issueI5KG61
|
||||||
|
*/
|
||||||
|
HWTEST_F(NativeImageTest, OHNativeImageAcquireNativeWindowBuffer004, Function | MediumTest | Level1)
|
||||||
|
{
|
||||||
|
OH_NativeImage* newImage = OH_NativeImage_Create(0, 0);
|
||||||
|
ASSERT_NE(newImage, nullptr);
|
||||||
|
OHNativeWindow* newNativeWindow = OH_NativeImage_AcquireNativeWindow(newImage);
|
||||||
|
ASSERT_NE(newNativeWindow, nullptr);
|
||||||
|
|
||||||
|
int32_t code = SET_BUFFER_GEOMETRY;
|
||||||
|
int32_t width = 0x100;
|
||||||
|
int32_t height = 0x100;
|
||||||
|
int32_t ret = NativeWindowHandleOpt(newNativeWindow, code, width, height);
|
||||||
|
ASSERT_EQ(ret, GSERROR_OK);
|
||||||
|
|
||||||
|
NativeWindowBuffer* nativeWindowBuffer = nullptr;
|
||||||
|
int fenceFd = -1;
|
||||||
|
struct Region *region = new Region();
|
||||||
|
struct Region::Rect *rect = new Region::Rect();
|
||||||
|
rect->x = 0x100;
|
||||||
|
rect->y = 0x100;
|
||||||
|
rect->w = 0x100;
|
||||||
|
rect->h = 0x100;
|
||||||
|
region->rects = rect;
|
||||||
|
struct timeval acquireStartTime;
|
||||||
|
struct timeval acquireEndTime;
|
||||||
|
struct timeval releaseStartTime;
|
||||||
|
struct timeval releaseEndTime;
|
||||||
|
uint64_t acquireTotalTime = 0;
|
||||||
|
uint64_t releaseTotalTime = 0;
|
||||||
|
for (int32_t i = 0; i < 10000; i++) {
|
||||||
|
ret = OH_NativeWindow_NativeWindowRequestBuffer(newNativeWindow, &nativeWindowBuffer, &fenceFd);
|
||||||
|
ASSERT_EQ(ret, GSERROR_OK);
|
||||||
|
|
||||||
|
ret = OH_NativeWindow_NativeWindowFlushBuffer(newNativeWindow, nativeWindowBuffer, fenceFd, *region);
|
||||||
|
ASSERT_EQ(ret, GSERROR_OK);
|
||||||
|
|
||||||
|
nativeWindowBuffer = nullptr;
|
||||||
|
gettimeofday(&acquireStartTime, nullptr);
|
||||||
|
ret = OH_NativeImage_AcquireNativeWindowBuffer(newImage, &nativeWindowBuffer, &fenceFd);
|
||||||
|
gettimeofday(&acquireEndTime, nullptr);
|
||||||
|
acquireTotalTime += (1000000 * (acquireEndTime.tv_sec - acquireStartTime.tv_sec) +
|
||||||
|
(acquireEndTime.tv_usec - acquireStartTime.tv_usec));
|
||||||
|
ASSERT_EQ(ret, GSERROR_OK);
|
||||||
|
ASSERT_NE(nativeWindowBuffer, nullptr);
|
||||||
|
|
||||||
|
gettimeofday(&releaseStartTime, nullptr);
|
||||||
|
ret = OH_NativeImage_ReleaseNativeWindowBuffer(newImage, nativeWindowBuffer, fenceFd);
|
||||||
|
gettimeofday(&releaseEndTime, nullptr);
|
||||||
|
releaseTotalTime += (1000000 * (releaseEndTime.tv_sec - releaseStartTime.tv_sec) +
|
||||||
|
(releaseEndTime.tv_usec - releaseStartTime.tv_usec));
|
||||||
|
ASSERT_EQ(ret, GSERROR_OK);
|
||||||
|
}
|
||||||
|
std::cout << "10000 count total time, OH_NativeImage_AcquireNativeWindowBuffer: " << acquireTotalTime << " us" <<
|
||||||
|
" OH_NativeImage_ReleaseNativeWindowBuffer: " << releaseTotalTime << " us" << std::endl;
|
||||||
|
|
||||||
|
delete rect;
|
||||||
|
delete region;
|
||||||
|
OH_NativeImage_Destroy(&newImage);
|
||||||
|
}
|
||||||
}
|
}
|
@ -224,9 +224,11 @@ int32_t OH_NativeImage_GetTransformMatrixV2(OH_NativeImage* image, float matrix[
|
|||||||
* @brief Acquire an <b>OHNativeWindowBuffer</b> through an <b>OH_NativeImage</b> instance for content consumer.\n
|
* @brief Acquire an <b>OHNativeWindowBuffer</b> through an <b>OH_NativeImage</b> instance for content consumer.\n
|
||||||
* This method can not be used at the same time with <b>OH_NativeImage_UpdateSurfaceImage</b>.\n
|
* This method can not be used at the same time with <b>OH_NativeImage_UpdateSurfaceImage</b>.\n
|
||||||
* This method will create an <b>OHNativeWindowBuffer</b>.\n
|
* This method will create an <b>OHNativeWindowBuffer</b>.\n
|
||||||
* When using <b>OHNativeWindowBuffer</b>, need to increase its reference count
|
* If there is a situation when <b>OHNativeWindowBuffer</b> is still used after calling
|
||||||
|
* <b>OH_NativeImage_ReleaseNativeWindowBuffer</b>, you must pay attention to the following two points.\n
|
||||||
|
* 1) When using <b>OHNativeWindowBuffer</b>, need to increase its reference count
|
||||||
* by <b>OH_NativeWindow_NativeObjectReference</b>.\n
|
* by <b>OH_NativeWindow_NativeObjectReference</b>.\n
|
||||||
* When the <b>OHNativeWindowBuffer</b> is used up, its reference count needs to be decremented
|
* 2) When the <b>OHNativeWindowBuffer</b> is used up, its reference count needs to be decremented
|
||||||
* by <b>OH_NativeWindow_NativeObjectUnreference</b>.\n
|
* by <b>OH_NativeWindow_NativeObjectUnreference</b>.\n
|
||||||
* This interface needs to be used in conjunction with <b>OH_NativeImage_ReleaseNativeWindowBuffer<\b>,
|
* This interface needs to be used in conjunction with <b>OH_NativeImage_ReleaseNativeWindowBuffer<\b>,
|
||||||
* otherwise memory leaks will occur.\n
|
* otherwise memory leaks will occur.\n
|
||||||
|
Loading…
Reference in New Issue
Block a user