svga: Conversion to winsys handle
authorJakob Bornecrantz <jakob@vmware.com>
Fri, 26 Feb 2010 04:27:48 +0000 (04:27 +0000)
committerJakob Bornecrantz <jakob@vmware.com>
Mon, 1 Mar 2010 16:05:58 +0000 (16:05 +0000)
src/gallium/drivers/svga/svga_screen_texture.c
src/gallium/drivers/svga/svga_winsys.h
src/gallium/winsys/drm/vmware/core/vmw_screen_dri.c

index b34f906ceb06132f5a706b539949e0e54f31f075..994a6e0fd1d6df8c28fd61f33ab5f2d0ae686236 100644 (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;
-}
index b4e3af0eafce0a3de88b5074da34b5e2f39df5f2..d4bb176f9a82dc93bad1427c6c87553a3b8883e0 100644 (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_ */
index a7c6e88b9ebc55c3696228bbece8c0e5ae568494..0e3dad84a5ee5e3c9873f4162ead50ea6c686477 100644 (file)
 
 #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;
 }