mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-07 17:58:26 +02:00
svga: Conversion to winsys handle
This commit is contained in:
parent
45089784e3
commit
3a2358b6c6
3 changed files with 91 additions and 80 deletions
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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_ */
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue