winsys/svga: Make it possible to specify coherent resources
Add a flag in the surface cache key and a winsys usage flag to specify coherent memory. Signed-off-by: Thomas Hellstrom <thellstrom@vmware.com> Reviewed-by: Brian Paul <brianp@vmware.com>
This commit is contained in:
parent
4412be40dd
commit
4f59d51d82
|
@ -550,6 +550,8 @@ svga_screen_surface_create(struct svga_screen *svgascreen,
|
||||||
usage |= SVGA_SURFACE_USAGE_SHARED;
|
usage |= SVGA_SURFACE_USAGE_SHARED;
|
||||||
if (key->scanout)
|
if (key->scanout)
|
||||||
usage |= SVGA_SURFACE_USAGE_SCANOUT;
|
usage |= SVGA_SURFACE_USAGE_SCANOUT;
|
||||||
|
if (key->coherent)
|
||||||
|
usage |= SVGA_SURFACE_USAGE_COHERENT;
|
||||||
|
|
||||||
handle = sws->surface_create(sws,
|
handle = sws->surface_create(sws,
|
||||||
key->flags,
|
key->flags,
|
||||||
|
|
|
@ -69,6 +69,7 @@ struct svga_host_surface_cache_key
|
||||||
uint32_t cachable:1; /* False if this is a shared surface */
|
uint32_t cachable:1; /* False if this is a shared surface */
|
||||||
uint32_t sampleCount:5;
|
uint32_t sampleCount:5;
|
||||||
uint32_t scanout:1;
|
uint32_t scanout:1;
|
||||||
|
uint32_t coherent:1;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -81,8 +81,9 @@ struct winsys_handle;
|
||||||
#define SVGA_FENCE_FLAG_EXEC (1 << 0)
|
#define SVGA_FENCE_FLAG_EXEC (1 << 0)
|
||||||
#define SVGA_FENCE_FLAG_QUERY (1 << 1)
|
#define SVGA_FENCE_FLAG_QUERY (1 << 1)
|
||||||
|
|
||||||
#define SVGA_SURFACE_USAGE_SHARED (1 << 0)
|
#define SVGA_SURFACE_USAGE_SHARED (1 << 0)
|
||||||
#define SVGA_SURFACE_USAGE_SCANOUT (1 << 1)
|
#define SVGA_SURFACE_USAGE_SCANOUT (1 << 1)
|
||||||
|
#define SVGA_SURFACE_USAGE_COHERENT (1 << 2)
|
||||||
|
|
||||||
#define SVGA_QUERY_FLAG_SET (1 << 0)
|
#define SVGA_QUERY_FLAG_SET (1 << 0)
|
||||||
#define SVGA_QUERY_FLAG_REF (1 << 1)
|
#define SVGA_QUERY_FLAG_REF (1 << 1)
|
||||||
|
@ -677,6 +678,8 @@ struct svga_winsys_screen
|
||||||
/** Can we do DMA with guest-backed objects enabled? */
|
/** Can we do DMA with guest-backed objects enabled? */
|
||||||
bool have_gb_dma;
|
bool have_gb_dma;
|
||||||
|
|
||||||
|
/** Do we support coherent surface memory? */
|
||||||
|
bool have_coherent;
|
||||||
/**
|
/**
|
||||||
* Create and define a GB shader.
|
* Create and define a GB shader.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -315,7 +315,7 @@ vmw_svga_winsys_buffer_wrap(struct pb_buffer *buffer)
|
||||||
}
|
}
|
||||||
|
|
||||||
buf->pb_buf = buffer;
|
buf->pb_buf = buffer;
|
||||||
buf->fbuf = debug_flush_buf_create(TRUE, VMW_DEBUG_FLUSH_STACK);
|
buf->fbuf = debug_flush_buf_create(FALSE, VMW_DEBUG_FLUSH_STACK);
|
||||||
return buf;
|
return buf;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -365,7 +365,7 @@ vmw_svga_winsys_buffer_map(struct svga_winsys_screen *sws,
|
||||||
STATIC_ASSERT((unsigned) PB_USAGE_UNSYNCHRONIZED ==
|
STATIC_ASSERT((unsigned) PB_USAGE_UNSYNCHRONIZED ==
|
||||||
(unsigned) PIPE_TRANSFER_UNSYNCHRONIZED);
|
(unsigned) PIPE_TRANSFER_UNSYNCHRONIZED);
|
||||||
|
|
||||||
map = pb_map(vmw_pb_buffer(buf), flags, NULL);
|
map = pb_map(vmw_pb_buffer(buf), flags & PB_USAGE_ALL, NULL);
|
||||||
|
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
if (map != NULL)
|
if (map != NULL)
|
||||||
|
|
|
@ -246,7 +246,7 @@ vmw_ioctl_gb_surface_create(struct vmw_winsys_screen *vws,
|
||||||
if (usage & SVGA_SURFACE_USAGE_SHARED)
|
if (usage & SVGA_SURFACE_USAGE_SHARED)
|
||||||
req->base.drm_surface_flags |= drm_vmw_surface_flag_shareable;
|
req->base.drm_surface_flags |= drm_vmw_surface_flag_shareable;
|
||||||
|
|
||||||
if (vws->force_coherent)
|
if ((usage & SVGA_SURFACE_USAGE_COHERENT) || vws->force_coherent)
|
||||||
req->base.drm_surface_flags |= drm_vmw_surface_flag_coherent;
|
req->base.drm_surface_flags |= drm_vmw_surface_flag_coherent;
|
||||||
|
|
||||||
req->base.drm_surface_flags |= drm_vmw_surface_flag_create_buffer;
|
req->base.drm_surface_flags |= drm_vmw_surface_flag_create_buffer;
|
||||||
|
@ -1117,6 +1117,7 @@ vmw_ioctl_init(struct vmw_winsys_screen *vws)
|
||||||
vws->ioctl.num_cap_3d = SVGA3D_DEVCAP_MAX;
|
vws->ioctl.num_cap_3d = SVGA3D_DEVCAP_MAX;
|
||||||
|
|
||||||
if (have_drm_2_16) {
|
if (have_drm_2_16) {
|
||||||
|
vws->base.have_coherent = TRUE;
|
||||||
getenv_val = getenv("SVGA_FORCE_COHERENT");
|
getenv_val = getenv("SVGA_FORCE_COHERENT");
|
||||||
if (getenv_val && strcmp(getenv_val, "0") != 0)
|
if (getenv_val && strcmp(getenv_val, "0") != 0)
|
||||||
vws->force_coherent = TRUE;
|
vws->force_coherent = TRUE;
|
||||||
|
|
|
@ -51,15 +51,8 @@ vmw_svga_winsys_surface_map(struct svga_winsys_context *swc,
|
||||||
mtx_lock(&vsrf->mutex);
|
mtx_lock(&vsrf->mutex);
|
||||||
|
|
||||||
if (vsrf->mapcount) {
|
if (vsrf->mapcount) {
|
||||||
/*
|
/* Other mappers will get confused if we discard. */
|
||||||
* Only allow multiple readers to map.
|
flags &= ~PIPE_TRANSFER_DISCARD_WHOLE_RESOURCE;
|
||||||
*/
|
|
||||||
if ((flags & PIPE_TRANSFER_WRITE) ||
|
|
||||||
(vsrf->map_mode & PIPE_TRANSFER_WRITE))
|
|
||||||
goto out_unlock;
|
|
||||||
|
|
||||||
data = vsrf->data;
|
|
||||||
goto out_mapped;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
vsrf->rebind = FALSE;
|
vsrf->rebind = FALSE;
|
||||||
|
@ -89,7 +82,8 @@ vmw_svga_winsys_surface_map(struct svga_winsys_context *swc,
|
||||||
goto out_unlock;
|
goto out_unlock;
|
||||||
}
|
}
|
||||||
|
|
||||||
pb_flags = flags & (PIPE_TRANSFER_READ_WRITE | PIPE_TRANSFER_UNSYNCHRONIZED);
|
pb_flags = flags & (PIPE_TRANSFER_READ_WRITE | PIPE_TRANSFER_UNSYNCHRONIZED |
|
||||||
|
PIPE_TRANSFER_PERSISTENT);
|
||||||
|
|
||||||
if (flags & PIPE_TRANSFER_DISCARD_WHOLE_RESOURCE) {
|
if (flags & PIPE_TRANSFER_DISCARD_WHOLE_RESOURCE) {
|
||||||
struct pb_manager *provider;
|
struct pb_manager *provider;
|
||||||
|
@ -169,10 +163,10 @@ vmw_svga_winsys_surface_unmap(struct svga_winsys_context *swc,
|
||||||
if (--vsrf->mapcount == 0) {
|
if (--vsrf->mapcount == 0) {
|
||||||
*rebind = vsrf->rebind;
|
*rebind = vsrf->rebind;
|
||||||
vsrf->rebind = FALSE;
|
vsrf->rebind = FALSE;
|
||||||
vmw_svga_winsys_buffer_unmap(&vsrf->screen->base, vsrf->buf);
|
|
||||||
} else {
|
} else {
|
||||||
*rebind = FALSE;
|
*rebind = FALSE;
|
||||||
}
|
}
|
||||||
|
vmw_svga_winsys_buffer_unmap(&vsrf->screen->base, vsrf->buf);
|
||||||
mtx_unlock(&vsrf->mutex);
|
mtx_unlock(&vsrf->mutex);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue