svga: Conversion to winsys handle

This commit is contained in:
Jakob Bornecrantz 2010-02-26 04:27:48 +00:00
parent 45089784e3
commit 3a2358b6c6
3 changed files with 91 additions and 80 deletions

View file

@ -426,13 +426,15 @@ svga_texture_blanket(struct pipe_screen * screen,
}
struct pipe_texture *
svga_screen_texture_wrap_surface(struct pipe_screen *screen,
struct pipe_texture *base,
enum SVGA3dSurfaceFormat format,
struct svga_winsys_surface *srf)
static struct pipe_texture *
svga_screen_texture_from_handle(struct pipe_screen *screen,
const struct pipe_texture *base,
struct winsys_handle *whandle)
{
struct svga_winsys_screen *sws = svga_winsys_screen(screen);
struct svga_winsys_surface *srf;
struct svga_texture *tex;
enum SVGA3dSurfaceFormat format = 0;
assert(screen);
/* Only supports one type */
@ -442,6 +444,8 @@ svga_screen_texture_wrap_surface(struct pipe_screen *screen,
return NULL;
}
srf = sws->surface_from_handle(sws, whandle, &format);
if (!srf)
return NULL;
@ -482,6 +486,22 @@ svga_screen_texture_wrap_surface(struct pipe_screen *screen,
}
static boolean
svga_screen_texture_get_handle(struct pipe_screen *screen,
struct pipe_texture *texture,
struct winsys_handle *whandle)
{
struct svga_winsys_screen *sws = svga_winsys_screen(texture->screen);
unsigned stride;
assert(svga_texture(texture)->key.cachable == 0);
svga_texture(texture)->key.cachable = 0;
stride = util_format_get_nblocksx(texture->format, texture->width0) *
util_format_get_blocksize(texture->format);
return sws->surface_get_handle(sws, svga_texture(texture)->handle, stride, whandle);
}
static void
svga_texture_destroy(struct pipe_texture *pt)
{
@ -959,6 +979,8 @@ void
svga_screen_init_texture_functions(struct pipe_screen *screen)
{
screen->texture_create = svga_texture_create;
screen->texture_from_handle = svga_screen_texture_from_handle;
screen->texture_get_handle = svga_screen_texture_get_handle;
screen->texture_destroy = svga_texture_destroy;
screen->get_tex_surface = svga_get_tex_surface;
screen->tex_surface_destroy = svga_tex_surface_destroy;
@ -1124,33 +1146,3 @@ svga_destroy_sampler_view_priv(struct svga_sampler_view *v)
pipe_texture_reference(&v->texture, NULL);
FREE(v);
}
boolean
svga_screen_buffer_from_texture(struct pipe_texture *texture,
struct pipe_buffer **buffer,
unsigned *stride)
{
struct svga_texture *stex = svga_texture(texture);
*buffer = svga_screen_buffer_wrap_surface
(texture->screen,
svga_translate_format(texture->format),
stex->handle);
*stride = util_format_get_stride(texture->format, texture->width0);
return *buffer != NULL;
}
struct svga_winsys_surface *
svga_screen_texture_get_winsys_surface(struct pipe_texture *texture)
{
struct svga_winsys_screen *sws = svga_winsys_screen(texture->screen);
struct svga_winsys_surface *vsurf = NULL;
assert(svga_texture(texture)->key.cachable == 0);
svga_texture(texture)->key.cachable = 0;
sws->surface_reference(sws, &vsurf, svga_texture(texture)->handle);
return vsurf;
}

View file

@ -51,6 +51,7 @@ struct pipe_context;
struct pipe_fence_handle;
struct pipe_texture;
struct svga_region;
struct winsys_handle;
#define SVGA_BUFFER_USAGE_PINNED (PIPE_BUFFER_USAGE_CUSTOM << 0)
@ -186,6 +187,25 @@ struct svga_winsys_screen
uint32 numFaces,
uint32 numMipLevels);
/**
* Creates a surface from a winsys handle.
* Used to implement pipe_screen::texture_from_handle.
*/
struct svga_winsys_surface *
(*surface_from_handle)(struct svga_winsys_screen *sws,
struct winsys_handle *whandle,
SVGA3dSurfaceFormat *format);
/**
* Get a winsys_handle from a surface.
* Used to implement pipe_screen::texture_get_handle.
*/
boolean
(*surface_get_handle)(struct svga_winsys_screen *sws,
struct svga_winsys_surface *surface,
unsigned stride,
struct winsys_handle *whandle);
/**
* Whether this surface is sitting in a validate list
*/
@ -283,20 +303,7 @@ svga_screen_buffer_wrap_surface(struct pipe_screen *screen,
enum SVGA3dSurfaceFormat format,
struct svga_winsys_surface *srf);
struct svga_winsys_surface *
svga_screen_texture_get_winsys_surface(struct pipe_texture *texture);
struct svga_winsys_surface *
svga_screen_buffer_get_winsys_surface(struct pipe_buffer *buffer);
boolean
svga_screen_buffer_from_texture(struct pipe_texture *texture,
struct pipe_buffer **buffer,
unsigned *stride);
struct pipe_texture *
svga_screen_texture_wrap_surface(struct pipe_screen *screen,
struct pipe_texture *base,
enum SVGA3dSurfaceFormat format,
struct svga_winsys_surface *srf);
#endif /* SVGA_WINSYS_H_ */

View file

@ -44,6 +44,16 @@
#include <stdio.h>
static struct svga_winsys_surface *
vmw_drm_surface_from_handle(struct svga_winsys_screen *sws,
struct winsys_handle *whandle,
SVGA3dSurfaceFormat *format);
static boolean
vmw_drm_surface_get_handle(struct svga_winsys_screen *sws,
struct svga_winsys_surface *surface,
unsigned stride,
struct winsys_handle *whandle);
static struct dri1_api dri1_api_hooks;
static struct dri1_api_version ddx_required = { 0, 1, 0 };
static struct dri1_api_version ddx_compat = { 0, 0, 0 };
@ -129,7 +139,12 @@ vmw_drm_create_screen(struct drm_api *drm_api,
&drm_compat, "use old scanout field (not a error)"))
use_old_scanout_flag = TRUE;
dri1->api = &dri1_api_hooks;
#if 0
break;
#else
assert(!"No dri 1 support for now\n");
return NULL;
#endif
default:
return NULL;
}
@ -139,6 +154,10 @@ vmw_drm_create_screen(struct drm_api *drm_api,
if (!vws)
goto out_no_vws;
/* XXX do this properly */
vws->base.surface_from_handle = vmw_drm_surface_from_handle;
vws->base.surface_get_handle = vmw_drm_surface_get_handle;
screen = svga_screen_create( &vws->base );
if (!screen)
goto out_no_screen;
@ -200,6 +219,7 @@ vmw_dri1_present_locked(struct pipe_context *locked_pipe,
const struct drm_clip_rect *bbox,
struct pipe_fence_handle **p_fence)
{
#if 0
struct svga_winsys_surface *srf =
svga_screen_texture_get_winsys_surface(surf->texture);
struct vmw_svga_winsys_surface *vsrf = vmw_svga_winsys_surface(srf);
@ -246,21 +266,19 @@ vmw_dri1_present_locked(struct pipe_context *locked_pipe,
*p_fence = (visible) ? vmw_pipe_fence(fence_seq) : NULL;
vmw_svga_winsys_surface_reference(&vsrf, NULL);
#else
assert(!"No dri 1 support for now\n");
#endif
}
static struct pipe_texture *
vmw_drm_texture_from_handle(struct drm_api *drm_api,
struct pipe_screen *screen,
struct pipe_texture *templat,
const char *name,
unsigned stride,
unsigned handle)
static struct svga_winsys_surface *
vmw_drm_surface_from_handle(struct svga_winsys_screen *sws,
struct winsys_handle *whandle,
SVGA3dSurfaceFormat *format)
{
struct vmw_svga_winsys_surface *vsrf;
struct svga_winsys_surface *ssrf;
struct vmw_winsys_screen *vws =
vmw_winsys_screen(svga_winsys_screen(screen));
struct pipe_texture *tex;
struct vmw_winsys_screen *vws = vmw_winsys_screen(sws);
union drm_vmw_surface_reference_arg arg;
struct drm_vmw_surface_arg *req = &arg.req;
struct drm_vmw_surface_create_req *rep = &arg.rep;
@ -273,7 +291,7 @@ vmw_drm_texture_from_handle(struct drm_api *drm_api,
*/
memset(&arg, 0, sizeof(arg));
req->sid = handle;
req->sid = whandle->handle;
ret = drmCommandWriteRead(vws->ioctl.drm_fd, DRM_VMW_REF_SURFACE,
&arg, sizeof(arg));
@ -281,14 +299,14 @@ vmw_drm_texture_from_handle(struct drm_api *drm_api,
if (ret) {
fprintf(stderr, "Failed referencing shared surface. SID %d.\n"
"Error %d (%s).\n",
handle, ret, strerror(-ret));
whandle->handle, ret, strerror(-ret));
return NULL;
}
if (rep->mip_levels[0] != 1) {
fprintf(stderr, "Incorrect number of mipmap levels on shared surface."
" SID %d, levels %d\n",
handle, rep->mip_levels[0]);
whandle->handle, rep->mip_levels[0]);
goto out_mip;
}
@ -296,7 +314,7 @@ vmw_drm_texture_from_handle(struct drm_api *drm_api,
if (rep->mip_levels[i] != 0) {
fprintf(stderr, "Incorrect number of faces levels on shared surface."
" SID %d, face %d present.\n",
handle, i);
whandle->handle, i);
goto out_mip;
}
}
@ -308,38 +326,32 @@ vmw_drm_texture_from_handle(struct drm_api *drm_api,
pipe_reference_init(&vsrf->refcnt, 1);
p_atomic_set(&vsrf->validated, 0);
vsrf->screen = vws;
vsrf->sid = handle;
vsrf->sid = whandle->handle;
ssrf = svga_winsys_surface(vsrf);
tex = svga_screen_texture_wrap_surface(screen, templat, rep->format, ssrf);
if (!tex)
vmw_svga_winsys_surface_reference(&vsrf, NULL);
*format = rep->format;
return tex;
out_mip:
vmw_ioctl_surface_destroy(vws, handle);
return ssrf;
out_mip:
vmw_ioctl_surface_destroy(vws, whandle->handle);
return NULL;
}
static boolean
vmw_drm_handle_from_texture(struct drm_api *drm_api,
struct pipe_screen *screen,
struct pipe_texture *texture,
unsigned *stride,
unsigned *handle)
vmw_drm_surface_get_handle(struct svga_winsys_screen *sws,
struct svga_winsys_surface *surface,
unsigned stride,
struct winsys_handle *whandle)
{
struct svga_winsys_surface *surface =
svga_screen_texture_get_winsys_surface(texture);
struct vmw_svga_winsys_surface *vsrf;
if (!surface)
return FALSE;
vsrf = vmw_svga_winsys_surface(surface);
*handle = vsrf->sid;
*stride = util_format_get_nblocksx(texture->format, texture->width0) *
util_format_get_blocksize(texture->format);
whandle->handle = vsrf->sid;
whandle->stride = stride;
vmw_svga_winsys_surface_reference(&vsrf, NULL);
return TRUE;
}