Merge remote branch 'origin/master' into nv50-compiler
[mesa.git] / src / gallium / winsys / sw / wrapper / wrapper_sw_winsys.c
index 459b1c1e2a3829f9a917d747f5a7ca0b952674dc..3a76098b655b223c6c586cffb3ab56f258d82e22 100644 (file)
@@ -52,12 +52,13 @@ struct wrapper_sw_winsys
    struct sw_winsys base;
    struct pipe_screen *screen;
    struct pipe_context *pipe;
+   enum pipe_texture_target target;
 };
 
 struct wrapper_sw_displaytarget
 {
    struct wrapper_sw_winsys *winsys;
-   struct pipe_texture *tex;
+   struct pipe_resource *tex;
    struct pipe_transfer *transfer;
 
    unsigned width;
@@ -89,26 +90,26 @@ static boolean
 wsw_dt_get_stride(struct wrapper_sw_displaytarget *wdt, unsigned *stride)
 {
    struct pipe_context *pipe = wdt->winsys->pipe;
-   struct pipe_texture *tex = wdt->tex;
+   struct pipe_resource *tex = wdt->tex;
    struct pipe_transfer *tr;
 
-   tr = pipe->get_tex_transfer(pipe, tex, 0, 0, 0,
-                               PIPE_TRANSFER_READ_WRITE,
-                               0, 0, wdt->width, wdt->height);
+   tr = pipe_get_transfer(pipe, tex, 0, 0, 0,
+                         PIPE_TRANSFER_READ_WRITE,
+                         0, 0, wdt->width, wdt->height);
    if (!tr)
       return FALSE;
 
    *stride = tr->stride;
    wdt->stride = tr->stride;
 
-   pipe->tex_transfer_destroy(pipe, tr);
+   pipe->transfer_destroy(pipe, tr);
 
    return TRUE;
 }
 
 static struct sw_displaytarget *
 wsw_dt_wrap_texture(struct wrapper_sw_winsys *wsw,
-                    struct pipe_texture *tex, unsigned *stride)
+                    struct pipe_resource *tex, unsigned *stride)
 {
    struct wrapper_sw_displaytarget *wdt = CALLOC_STRUCT(wrapper_sw_displaytarget);
    if (!wdt)
@@ -125,34 +126,35 @@ wsw_dt_wrap_texture(struct wrapper_sw_winsys *wsw,
 err_free:
    FREE(wdt);
 err_unref:
-   pipe_texture_reference(&tex, NULL);
+   pipe_resource_reference(&tex, NULL);
    return NULL;
 }
 
 static struct sw_displaytarget *
 wsw_dt_create(struct sw_winsys *ws,
-              unsigned tex_usage,
+              unsigned bind,
               enum pipe_format format,
               unsigned width, unsigned height,
               unsigned alignment,
               unsigned *stride)
 {
    struct wrapper_sw_winsys *wsw = wrapper_sw_winsys(ws);
-   struct pipe_texture templ;
-   struct pipe_texture *tex;
+   struct pipe_resource templ;
+   struct pipe_resource *tex;
 
    /*
     * XXX Why don't we just get the template.
     */
    memset(&templ, 0, sizeof(templ));
+   templ.target = wsw->target;
    templ.width0 = width;
    templ.height0 = height;
    templ.format = format;
-   templ.tex_usage = tex_usage;
+   templ.bind = bind;
 
    /* XXX alignment: we can't do anything about this */
 
-   tex = wsw->screen->texture_create(wsw->screen, &templ);
+   tex = wsw->screen->resource_create(wsw->screen, &templ);
    if (!tex)
       return NULL;
 
@@ -161,20 +163,32 @@ wsw_dt_create(struct sw_winsys *ws,
 
 static struct sw_displaytarget *
 wsw_dt_from_handle(struct sw_winsys *ws,
-                   const struct pipe_texture *templ,
+                   const struct pipe_resource *templ,
                    struct winsys_handle *whandle,
                    unsigned *stride)
 {
    struct wrapper_sw_winsys *wsw = wrapper_sw_winsys(ws);
-   struct pipe_texture *tex;
+   struct pipe_resource *tex;
 
-   tex = wsw->screen->texture_from_handle(wsw->screen, templ, whandle);
+   tex = wsw->screen->resource_from_handle(wsw->screen, templ, whandle);
    if (!tex)
       return NULL;
 
    return wsw_dt_wrap_texture(wsw, tex, stride);
 }
 
+static boolean
+wsw_dt_get_handle(struct sw_winsys *ws,
+                  struct sw_displaytarget *dt,
+                  struct winsys_handle *whandle)
+{
+   struct wrapper_sw_winsys *wsw = wrapper_sw_winsys(ws);
+   struct wrapper_sw_displaytarget *wdt = wrapper_sw_displaytarget(dt);
+   struct pipe_resource *tex = wdt->tex;
+
+   return wsw->screen->resource_get_handle(wsw->screen, tex, whandle);
+}
+
 static void *
 wsw_dt_map(struct sw_winsys *ws,
            struct sw_displaytarget *dt,
@@ -182,7 +196,7 @@ wsw_dt_map(struct sw_winsys *ws,
 {
    struct wrapper_sw_displaytarget *wdt = wrapper_sw_displaytarget(dt);
    struct pipe_context *pipe = wdt->winsys->pipe;
-   struct pipe_texture *tex = wdt->tex;
+   struct pipe_resource *tex = wdt->tex;
    struct pipe_transfer *tr;
    void *ptr;
 
@@ -190,9 +204,9 @@ wsw_dt_map(struct sw_winsys *ws,
 
       assert(!wdt->transfer);
 
-      tr = pipe->get_tex_transfer(pipe, tex, 0, 0, 0,
-                                  PIPE_TRANSFER_READ_WRITE,
-                                  0, 0, wdt->width, wdt->height);
+      tr = pipe_get_transfer(pipe, tex, 0, 0, 0,
+                            PIPE_TRANSFER_READ_WRITE,
+                            0, 0, wdt->width, wdt->height);
       if (!tr)
          return NULL;
 
@@ -212,7 +226,7 @@ wsw_dt_map(struct sw_winsys *ws,
    return wdt->ptr;
 
 err:
-   pipe->tex_transfer_destroy(pipe, tr);
+   pipe->transfer_destroy(pipe, tr);
    return NULL;
 }
 
@@ -231,7 +245,7 @@ wsw_dt_unmap(struct sw_winsys *ws,
       return;
 
    pipe->transfer_unmap(pipe, wdt->transfer);
-   pipe->tex_transfer_destroy(pipe, wdt->transfer);
+   pipe->transfer_destroy(pipe, wdt->transfer);
    wdt->transfer = NULL;
 }
 
@@ -241,7 +255,7 @@ wsw_dt_destroy(struct sw_winsys *ws,
 {
    struct wrapper_sw_displaytarget *wdt = wrapper_sw_displaytarget(dt);
 
-   pipe_texture_reference(&wdt->tex, NULL);
+   pipe_resource_reference(&wdt->tex, NULL);
 
    FREE(wdt);
 }
@@ -262,8 +276,12 @@ wrapper_sw_winsys_warp_pipe_screen(struct pipe_screen *screen)
 {
    struct wrapper_sw_winsys *wsw = CALLOC_STRUCT(wrapper_sw_winsys);
 
+   if (!wsw)
+      goto err;
+
    wsw->base.displaytarget_create = wsw_dt_create;
    wsw->base.displaytarget_from_handle = wsw_dt_from_handle;
+   wsw->base.displaytarget_get_handle = wsw_dt_get_handle;
    wsw->base.displaytarget_map = wsw_dt_map;
    wsw->base.displaytarget_unmap = wsw_dt_unmap;
    wsw->base.displaytarget_destroy = wsw_dt_destroy;
@@ -272,11 +290,17 @@ wrapper_sw_winsys_warp_pipe_screen(struct pipe_screen *screen)
    wsw->screen = screen;
    wsw->pipe = screen->context_create(screen, NULL);
    if (!wsw->pipe)
-      goto err;
+      goto err_free;
+
+   if(screen->get_param(screen, PIPE_CAP_NPOT_TEXTURES))
+      wsw->target = PIPE_TEXTURE_2D;
+   else
+      wsw->target = PIPE_TEXTURE_RECT;
 
    return &wsw->base;
 
-err:
+err_free:
    FREE(wsw);
+err:
    return NULL;
 }