diff options
| -rw-r--r-- | src/gallium/drivers/svga/svga_screen_texture.c | 62 | ||||
| -rw-r--r-- | src/gallium/drivers/svga/svga_winsys.h | 33 | ||||
| -rw-r--r-- | src/gallium/winsys/drm/vmware/core/vmw_screen_dri.c | 76 | 
3 files changed, 91 insertions, 80 deletions
| diff --git a/src/gallium/drivers/svga/svga_screen_texture.c b/src/gallium/drivers/svga/svga_screen_texture.c index b34f906ceb..994a6e0fd1 100644 --- a/src/gallium/drivers/svga/svga_screen_texture.c +++ b/src/gallium/drivers/svga/svga_screen_texture.c @@ -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; -} diff --git a/src/gallium/drivers/svga/svga_winsys.h b/src/gallium/drivers/svga/svga_winsys.h index b4e3af0eaf..d4bb176f9a 100644 --- a/src/gallium/drivers/svga/svga_winsys.h +++ b/src/gallium/drivers/svga/svga_winsys.h @@ -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) @@ -187,6 +188,25 @@ struct svga_winsys_screen                       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      */     boolean @@ -284,19 +304,6 @@ svga_screen_buffer_wrap_surface(struct pipe_screen *screen,  				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_ */ diff --git a/src/gallium/winsys/drm/vmware/core/vmw_screen_dri.c b/src/gallium/winsys/drm/vmware/core/vmw_screen_dri.c index a7c6e88b9e..0e3dad84a5 100644 --- a/src/gallium/winsys/drm/vmware/core/vmw_screen_dri.c +++ b/src/gallium/winsys/drm/vmware/core/vmw_screen_dri.c @@ -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 ssrf; -    return tex; -  out_mip: -    vmw_ioctl_surface_destroy(vws, handle); +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;  } | 
