class TDMVblankWithoutCreating: public ::testing::Test {
protected:
- tbm_bufmgr bufmgr;
- tdm_display *dpy;
- int output_count;
- bool has_output;
- tdm_output *connected_output;
- const tdm_output_mode *preferred_mode;
- tdm_output *disconnected_output;
- tdm_output *default_output;
+ tbm_bufmgr bufmgr = NULL;
+ tdm_display *dpy = NULL;
+ int output_count = 0;
+ bool has_output = 0;
+ tdm_output *connected_output = NULL;
+ const tdm_output_mode *preferred_mode = NULL;
+ tdm_output *disconnected_output = NULL;
+ tdm_output *default_output = NULL;
void SetUp(void) {
tdm_output *output;
tdm_output_conn_status status;
tdm_error error = TDM_ERROR_NONE;
- bufmgr = NULL;
- dpy = NULL;
- output_count = 0;
- connected_output = NULL;
- connected_output = NULL;
- default_output = NULL;
- preferred_mode = NULL;
-
setenv("TDM_DLOG", "1", 1);
setenv("XDG_RUNTIME_DIR", ".", 1);
setenv("TBM_DLOG", "1", 1);
if(output_modes[i].type & TDM_OUTPUT_MODE_TYPE_PREFERRED) {
preferred_mode = &output_modes[i];
- error = tdm_output_set_mode(connected_output, preferred_mode);
- ASSERT_TRUE(error == TDM_ERROR_NONE);
-
- error = tdm_output_set_dpms(connected_output, TDM_OUTPUT_DPMS_ON);
- ASSERT_TRUE(error == TDM_ERROR_NONE);
-
default_output = connected_output;
return;
{
if (connected_output)
tdm_output_set_dpms(connected_output, TDM_OUTPUT_DPMS_OFF);
-
if (bufmgr)
tbm_bufmgr_deinit(bufmgr);
if (dpy)
class TDMVblank: public TDMVblankWithoutCreating {
protected:
- tdm_vblank *con_output_vblank;
- tdm_vblank *discon_output_vblank;
- tdm_output *default_vblank;
+ tdm_vblank *con_output_vblank = NULL;
+ tdm_vblank *discon_output_vblank = NULL;
+ tdm_output *default_vblank = NULL;
+ int setModeAndDpms = 0;
+ tbm_surface_h buffer = NULL;
+ tdm_layer *layer = NULL;
void SetUp(void)
{
tdm_error error;
- con_output_vblank = NULL;
- discon_output_vblank = NULL;
- default_vblank = NULL;
TDMVblankWithoutCreating::SetUp();
+ if (connected_output && setModeAndDpms) {
+ int primary_index;
+ tdm_info_layer info = {0};
+
+ error = tdm_output_set_mode(connected_output, preferred_mode);
+ ASSERT_TRUE(error == TDM_ERROR_NONE);
+
+ error = tdm_output_get_primary_index(connected_output, &primary_index);
+ ASSERT_TRUE(error == TDM_ERROR_NONE);
+
+ layer = tdm_output_get_layer(connected_output, primary_index, &error);
+ ASSERT_TRUE(error == TDM_ERROR_NONE);
+ ASSERT_TRUE(layer != NULL);
+
+ info.src_config.size.h = preferred_mode->hdisplay;
+ info.src_config.size.v = preferred_mode->vdisplay;
+ info.src_config.pos.x = 0;
+ info.src_config.pos.y = 0;
+ info.src_config.pos.w = preferred_mode->hdisplay;
+ info.src_config.pos.h = preferred_mode->vdisplay;
+ info.src_config.format = TBM_FORMAT_ARGB8888;
+ info.dst_pos.x = 0;
+ info.dst_pos.y = 0;
+ info.dst_pos.w = preferred_mode->hdisplay;
+ info.dst_pos.h = preferred_mode->vdisplay;
+ info.transform = TDM_TRANSFORM_NORMAL;
+
+ error = tdm_layer_set_info(layer, &info);
+ ASSERT_TRUE(error == TDM_ERROR_NONE);
+
+ error = tdm_output_set_dpms(connected_output, TDM_OUTPUT_DPMS_ON);
+ ASSERT_TRUE(error == TDM_ERROR_NONE);
+
+ buffer = tbm_surface_internal_create_with_flags(preferred_mode->hdisplay,
+ preferred_mode->vdisplay,
+ TBM_FORMAT_ARGB8888,
+ TBM_BO_SCANOUT);
+ ASSERT_TRUE(buffer != NULL);
+
+ error = tdm_layer_set_buffer(layer, buffer);
+ ASSERT_TRUE(error == TDM_ERROR_NONE);
+
+ error = tdm_output_commit(connected_output, 0, NULL, NULL);
+ ASSERT_TRUE(error == TDM_ERROR_NONE);
+ /* TODO: use a commit handler instead of an usleep to wait when
+ * commit will be applied */
+ usleep(20000);
+ }
+
if (disconnected_output) {
discon_output_vblank = tdm_vblank_create(dpy, disconnected_output, &error);
EXPECT_TRUE(discon_output_vblank != NULL);
EXPECT_TRUE(error == TDM_ERROR_NONE);
+ default_vblank = discon_output_vblank;
}
if (connected_output) {
con_output_vblank = tdm_vblank_create(dpy, connected_output, &error);
EXPECT_TRUE(con_output_vblank != NULL);
EXPECT_TRUE(error == TDM_ERROR_NONE);
- }
-
- if (connected_output)
- default_vblank = discon_output_vblank;
- else
default_vblank = con_output_vblank;
+ }
ASSERT_TRUE(default_vblank != NULL);
}
+
+ void TearDown(void)
+ {
+ if (buffer) {
+ tdm_layer_unset_buffer(layer);
+ tdm_output_commit(connected_output, 0, NULL, NULL);
+ tbm_surface_destroy(buffer);
+ }
+
+ TDMVblankWithoutCreating::TearDown();
+ }
};
class TDMVblankWait : public TDMVblank {
utVblankHandlerIsCalled = 1;
}
- int utWaitVblankThreadHndlResult;
+ int utWaitVblankThreadHndlResult = -1;
friend void *UtWaitVblankThreadHndl(void *ptr);
- int utWaitVblankSeqThreadHndlResult;
+ int utWaitVblankSeqThreadHndlResult = -1;
friend void *UtWaitVblankSeqThreadHndl(void *ptr);
private:
- int epFd;
- int timerFd;
- int tdmFd;
+ int epFd = -1;
+ int timerFd = -1;
+ int tdmFd = -1;
static const int timeLimitSec = 1;
protected:
{
struct epoll_event ep;
- epFd = -1;
- timerFd = -1;
utVblankHandlerIsCalled = 0;
- utWaitVblankThreadHndlResult = -1;
- utWaitVblankSeqThreadHndlResult = -1;
+ setModeAndDpms = 1;
TDMVblank::SetUp();
epFd = epoll_create1(0);
if (!con_output_vblank)
return;
+ error = tdm_vblank_set_enable_fake(con_output_vblank, 0);
+ ASSERT_TRUE(error == TDM_ERROR_NONE);
+
error = tdm_vblank_ignore_global_fps(con_output_vblank, 0);
ASSERT_TRUE(error == TDM_ERROR_NONE);