st/egl: Add native_surface::present callback.
The callback presents the given attachment to the native engine. It allows the swap behavior and interval to be controlled. It will replace native_surface::flush_frontbuffer and native_surface::swap_buffers shortly.
This commit is contained in:
@@ -54,7 +54,17 @@ enum native_param_type {
|
||||
* Return TRUE if window/pixmap surfaces use the buffers of the native
|
||||
* types.
|
||||
*/
|
||||
NATIVE_PARAM_USE_NATIVE_BUFFER
|
||||
NATIVE_PARAM_USE_NATIVE_BUFFER,
|
||||
|
||||
/**
|
||||
* Return TRUE if native_surface::present can preserve the buffer.
|
||||
*/
|
||||
NATIVE_PARAM_PRESERVE_BUFFER,
|
||||
|
||||
/**
|
||||
* Return the maximum supported swap interval.
|
||||
*/
|
||||
NATIVE_PARAM_MAX_SWAP_INTERVAL
|
||||
};
|
||||
|
||||
struct native_surface {
|
||||
@@ -78,6 +88,14 @@ struct native_surface {
|
||||
*/
|
||||
boolean (*flush_frontbuffer)(struct native_surface *nsurf);
|
||||
|
||||
/**
|
||||
* Present the given buffer to the native engine.
|
||||
*/
|
||||
boolean (*present)(struct native_surface *nsurf,
|
||||
enum native_attachment natt,
|
||||
boolean preserve,
|
||||
uint swap_interval);
|
||||
|
||||
/**
|
||||
* Validate the buffers of the surface. textures, if not NULL, points to an
|
||||
* array of size NUM_NATIVE_ATTACHMENTS and the returned textures are owned
|
||||
|
||||
@@ -167,6 +167,32 @@ drm_surface_swap_buffers(struct native_surface *nsurf)
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static boolean
|
||||
drm_surface_present(struct native_surface *nsurf,
|
||||
enum native_attachment natt,
|
||||
boolean preserve,
|
||||
uint swap_interval)
|
||||
{
|
||||
boolean ret;
|
||||
|
||||
if (preserve || swap_interval)
|
||||
return FALSE;
|
||||
|
||||
switch (natt) {
|
||||
case NATIVE_ATTACHMENT_FRONT_LEFT:
|
||||
ret = drm_surface_flush_frontbuffer(nsurf);
|
||||
break;
|
||||
case NATIVE_ATTACHMENT_BACK_LEFT:
|
||||
ret = drm_surface_swap_buffers(nsurf);
|
||||
break;
|
||||
default:
|
||||
ret = FALSE;
|
||||
break;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void
|
||||
drm_surface_wait(struct native_surface *nsurf)
|
||||
{
|
||||
@@ -227,6 +253,7 @@ drm_display_create_surface(struct native_display *ndpy,
|
||||
drmsurf->base.destroy = drm_surface_destroy;
|
||||
drmsurf->base.swap_buffers = drm_surface_swap_buffers;
|
||||
drmsurf->base.flush_frontbuffer = drm_surface_flush_frontbuffer;
|
||||
drmsurf->base.present = drm_surface_present;
|
||||
drmsurf->base.validate = drm_surface_validate;
|
||||
drmsurf->base.wait = drm_surface_wait;
|
||||
|
||||
|
||||
@@ -103,6 +103,9 @@ drm_display_get_param(struct native_display *ndpy,
|
||||
int val;
|
||||
|
||||
switch (param) {
|
||||
case NATIVE_PARAM_USE_NATIVE_BUFFER:
|
||||
case NATIVE_PARAM_PRESERVE_BUFFER:
|
||||
case NATIVE_PARAM_MAX_SWAP_INTERVAL:
|
||||
default:
|
||||
val = 0;
|
||||
break;
|
||||
|
||||
@@ -137,6 +137,32 @@ fbdev_surface_swap_buffers(struct native_surface *nsurf)
|
||||
return ret;
|
||||
}
|
||||
|
||||
static boolean
|
||||
fbdev_surface_present(struct native_surface *nsurf,
|
||||
enum native_attachment natt,
|
||||
boolean preserve,
|
||||
uint swap_interval)
|
||||
{
|
||||
boolean ret;
|
||||
|
||||
if (preserve || swap_interval)
|
||||
return FALSE;
|
||||
|
||||
switch (natt) {
|
||||
case NATIVE_ATTACHMENT_FRONT_LEFT:
|
||||
ret = fbdev_surface_flush_frontbuffer(nsurf);
|
||||
break;
|
||||
case NATIVE_ATTACHMENT_BACK_LEFT:
|
||||
ret = fbdev_surface_swap_buffers(nsurf);
|
||||
break;
|
||||
default:
|
||||
ret = FALSE;
|
||||
break;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void
|
||||
fbdev_surface_wait(struct native_surface *nsurf)
|
||||
{
|
||||
@@ -183,6 +209,7 @@ fbdev_display_create_scanout_surface(struct native_display *ndpy,
|
||||
fbsurf->base.destroy = fbdev_surface_destroy;
|
||||
fbsurf->base.swap_buffers = fbdev_surface_swap_buffers;
|
||||
fbsurf->base.flush_frontbuffer = fbdev_surface_flush_frontbuffer;
|
||||
fbsurf->base.present = fbdev_surface_present;
|
||||
fbsurf->base.validate = fbdev_surface_validate;
|
||||
fbsurf->base.wait = fbdev_surface_wait;
|
||||
|
||||
@@ -279,6 +306,9 @@ fbdev_display_get_param(struct native_display *ndpy,
|
||||
int val;
|
||||
|
||||
switch (param) {
|
||||
case NATIVE_PARAM_USE_NATIVE_BUFFER:
|
||||
case NATIVE_PARAM_PRESERVE_BUFFER:
|
||||
case NATIVE_PARAM_MAX_SWAP_INTERVAL:
|
||||
default:
|
||||
val = 0;
|
||||
break;
|
||||
|
||||
@@ -159,6 +159,32 @@ gdi_surface_swap_buffers(struct native_surface *nsurf)
|
||||
return ret;
|
||||
}
|
||||
|
||||
static boolean
|
||||
gdi_surface_present(struct native_surface *nsurf,
|
||||
enum native_attachment natt,
|
||||
boolean preserve,
|
||||
uint swap_interval)
|
||||
{
|
||||
boolean ret;
|
||||
|
||||
if (preserve || swap_interval)
|
||||
return FALSE;
|
||||
|
||||
switch (natt) {
|
||||
case NATIVE_ATTACHMENT_FRONT_LEFT:
|
||||
ret = gdi_surface_flush_frontbuffer(nsurf);
|
||||
break;
|
||||
case NATIVE_ATTACHMENT_BACK_LEFT:
|
||||
ret = gdi_surface_swap_buffers(nsurf);
|
||||
break;
|
||||
default:
|
||||
ret = FALSE;
|
||||
break;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static boolean
|
||||
gdi_surface_validate(struct native_surface *nsurf, uint attachment_mask,
|
||||
unsigned int *seq_num, struct pipe_resource **textures,
|
||||
@@ -233,6 +259,7 @@ gdi_display_create_window_surface(struct native_display *ndpy,
|
||||
gsurf->base.destroy = gdi_surface_destroy;
|
||||
gsurf->base.swap_buffers = gdi_surface_swap_buffers;
|
||||
gsurf->base.flush_frontbuffer = gdi_surface_flush_frontbuffer;
|
||||
xsurf->base.present = gdi_surface_present;
|
||||
gsurf->base.validate = gdi_surface_validate;
|
||||
gsurf->base.wait = gdi_surface_wait;
|
||||
|
||||
@@ -321,6 +348,8 @@ gdi_display_get_param(struct native_display *ndpy,
|
||||
/* private buffers are allocated */
|
||||
val = FALSE;
|
||||
break;
|
||||
case NATIVE_PARAM_PRESERVE_BUFFER:
|
||||
case NATIVE_PARAM_MAX_SWAP_INTERVAL:
|
||||
default:
|
||||
val = 0;
|
||||
break;
|
||||
|
||||
@@ -337,6 +337,32 @@ dri2_surface_swap_buffers(struct native_surface *nsurf)
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static boolean
|
||||
dri2_surface_present(struct native_surface *nsurf,
|
||||
enum native_attachment natt,
|
||||
boolean preserve,
|
||||
uint swap_interval)
|
||||
{
|
||||
boolean ret;
|
||||
|
||||
if (swap_interval)
|
||||
return FALSE;
|
||||
|
||||
switch (natt) {
|
||||
case NATIVE_ATTACHMENT_FRONT_LEFT:
|
||||
ret = dri2_surface_flush_frontbuffer(nsurf);
|
||||
break;
|
||||
case NATIVE_ATTACHMENT_BACK_LEFT:
|
||||
ret = dri2_surface_swap_buffers(nsurf);
|
||||
break;
|
||||
default:
|
||||
ret = FALSE;
|
||||
break;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static boolean
|
||||
dri2_surface_validate(struct native_surface *nsurf, uint attachment_mask,
|
||||
unsigned int *seq_num, struct pipe_resource **textures,
|
||||
@@ -432,6 +458,7 @@ dri2_display_create_surface(struct native_display *ndpy,
|
||||
dri2surf->base.destroy = dri2_surface_destroy;
|
||||
dri2surf->base.swap_buffers = dri2_surface_swap_buffers;
|
||||
dri2surf->base.flush_frontbuffer = dri2_surface_flush_frontbuffer;
|
||||
dri2surf->base.present = dri2_surface_present;
|
||||
dri2surf->base.validate = dri2_surface_validate;
|
||||
dri2surf->base.wait = dri2_surface_wait;
|
||||
|
||||
@@ -630,9 +657,14 @@ dri2_display_get_param(struct native_display *ndpy,
|
||||
|
||||
switch (param) {
|
||||
case NATIVE_PARAM_USE_NATIVE_BUFFER:
|
||||
/* DRI2GetBuffers use the native buffers */
|
||||
/* DRI2GetBuffers uses the native buffers */
|
||||
val = TRUE;
|
||||
break;
|
||||
case NATIVE_PARAM_PRESERVE_BUFFER:
|
||||
/* DRI2CopyRegion is used */
|
||||
val = TRUE;
|
||||
break;
|
||||
case NATIVE_PARAM_MAX_SWAP_INTERVAL:
|
||||
default:
|
||||
val = 0;
|
||||
break;
|
||||
|
||||
@@ -174,6 +174,32 @@ ximage_surface_swap_buffers(struct native_surface *nsurf)
|
||||
return ret;
|
||||
}
|
||||
|
||||
static boolean
|
||||
ximage_surface_present(struct native_surface *nsurf,
|
||||
enum native_attachment natt,
|
||||
boolean preserve,
|
||||
uint swap_interval)
|
||||
{
|
||||
boolean ret;
|
||||
|
||||
if (preserve || swap_interval)
|
||||
return FALSE;
|
||||
|
||||
switch (natt) {
|
||||
case NATIVE_ATTACHMENT_FRONT_LEFT:
|
||||
ret = ximage_surface_flush_frontbuffer(nsurf);
|
||||
break;
|
||||
case NATIVE_ATTACHMENT_BACK_LEFT:
|
||||
ret = ximage_surface_swap_buffers(nsurf);
|
||||
break;
|
||||
default:
|
||||
ret = FALSE;
|
||||
break;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static boolean
|
||||
ximage_surface_validate(struct native_surface *nsurf, uint attachment_mask,
|
||||
unsigned int *seq_num, struct pipe_resource **textures,
|
||||
@@ -259,6 +285,7 @@ ximage_display_create_surface(struct native_display *ndpy,
|
||||
xsurf->base.destroy = ximage_surface_destroy;
|
||||
xsurf->base.swap_buffers = ximage_surface_swap_buffers;
|
||||
xsurf->base.flush_frontbuffer = ximage_surface_flush_frontbuffer;
|
||||
xsurf->base.present = ximage_surface_present;
|
||||
xsurf->base.validate = ximage_surface_validate;
|
||||
xsurf->base.wait = ximage_surface_wait;
|
||||
|
||||
@@ -416,6 +443,8 @@ ximage_display_get_param(struct native_display *ndpy,
|
||||
/* private buffers are allocated */
|
||||
val = FALSE;
|
||||
break;
|
||||
case NATIVE_PARAM_PRESERVE_BUFFER:
|
||||
case NATIVE_PARAM_MAX_SWAP_INTERVAL:
|
||||
default:
|
||||
val = 0;
|
||||
break;
|
||||
|
||||
Reference in New Issue
Block a user