gallium: add flags parameter to pipe_screen::context_create
[mesa.git] / src / gallium / winsys / sw / wrapper / wrapper_sw_winsys.c
index bc2623e7b77ad35dd3d8cec8c6d3539478e138a8..5c179930d9b90168d0afd30b1d7589b7f95a02c4 100644 (file)
@@ -61,20 +61,18 @@ struct wrapper_sw_displaytarget
    struct pipe_resource *tex;
    struct pipe_transfer *transfer;
 
-   unsigned width;
-   unsigned height;
    unsigned map_count;
-   unsigned stride; /**< because we give stride at create */
+   unsigned stride; /**< because we get stride at create */
    void *ptr;
 };
 
-static INLINE struct wrapper_sw_winsys *
+static inline struct wrapper_sw_winsys *
 wrapper_sw_winsys(struct sw_winsys *ws)
 {
    return (struct wrapper_sw_winsys *)ws;
 }
 
-static INLINE struct wrapper_sw_displaytarget *
+static inline struct wrapper_sw_displaytarget *
 wrapper_sw_displaytarget(struct sw_displaytarget *dt)
 {
    return (struct wrapper_sw_displaytarget *)dt;
@@ -86,23 +84,37 @@ wrapper_sw_displaytarget(struct sw_displaytarget *dt)
  */
 
 
+static boolean
+wsw_is_dt_format_supported(struct sw_winsys *ws,
+                           unsigned tex_usage,
+                           enum pipe_format format)
+{
+   struct wrapper_sw_winsys *wsw = wrapper_sw_winsys(ws);
+
+   return wsw->screen->is_format_supported(wsw->screen, format,
+                                           PIPE_TEXTURE_2D, 0,
+                                           PIPE_BIND_RENDER_TARGET |
+                                           PIPE_BIND_DISPLAY_TARGET);
+}
+
 static boolean
 wsw_dt_get_stride(struct wrapper_sw_displaytarget *wdt, unsigned *stride)
 {
    struct pipe_context *pipe = wdt->winsys->pipe;
    struct pipe_resource *tex = wdt->tex;
    struct pipe_transfer *tr;
+   void *map;
 
-   tr = pipe_get_transfer(pipe, tex, 0, 0, 0,
-                         PIPE_TRANSFER_READ_WRITE,
-                         0, 0, wdt->width, wdt->height);
-   if (!tr)
+   map = pipe_transfer_map(pipe, tex, 0, 0,
+                           PIPE_TRANSFER_READ_WRITE,
+                           0, 0, wdt->tex->width0, wdt->tex->height0, &tr);
+   if (!map)
       return FALSE;
 
    *stride = tr->stride;
    wdt->stride = tr->stride;
 
-   pipe->transfer_destroy(pipe, tr);
+   pipe->transfer_unmap(pipe, tr);
 
    return TRUE;
 }
@@ -149,6 +161,8 @@ wsw_dt_create(struct sw_winsys *ws,
    templ.target = wsw->target;
    templ.width0 = width;
    templ.height0 = height;
+   templ.depth0 = 1;
+   templ.array_size = 1;
    templ.format = format;
    templ.bind = bind;
 
@@ -204,13 +218,9 @@ wsw_dt_map(struct sw_winsys *ws,
 
       assert(!wdt->transfer);
 
-      tr = pipe_get_transfer(pipe, tex, 0, 0, 0,
-                            PIPE_TRANSFER_READ_WRITE,
-                            0, 0, wdt->width, wdt->height);
-      if (!tr)
-         return NULL;
-
-      ptr = pipe->transfer_map(pipe, tr);
+      ptr = pipe_transfer_map(pipe, tex, 0, 0,
+                              PIPE_TRANSFER_READ_WRITE,
+                              0, 0, wdt->tex->width0, wdt->tex->height0, &tr);
       if (!ptr)
         goto err;
 
@@ -226,7 +236,7 @@ wsw_dt_map(struct sw_winsys *ws,
    return wdt->ptr;
 
 err:
-   pipe->transfer_destroy(pipe, tr);
+   pipe->transfer_unmap(pipe, tr);
    return NULL;
 }
 
@@ -245,7 +255,7 @@ wsw_dt_unmap(struct sw_winsys *ws,
       return;
 
    pipe->transfer_unmap(pipe, wdt->transfer);
-   pipe->transfer_destroy(pipe, wdt->transfer);
+   pipe->flush(pipe, NULL, 0);
    wdt->transfer = NULL;
 }
 
@@ -279,6 +289,7 @@ wrapper_sw_winsys_wrap_pipe_screen(struct pipe_screen *screen)
    if (!wsw)
       goto err;
 
+   wsw->base.is_displaytarget_format_supported = wsw_is_dt_format_supported;
    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;
@@ -288,7 +299,7 @@ wrapper_sw_winsys_wrap_pipe_screen(struct pipe_screen *screen)
    wsw->base.destroy = wsw_destroy;
 
    wsw->screen = screen;
-   wsw->pipe = screen->context_create(screen, NULL);
+   wsw->pipe = screen->context_create(screen, NULL, 0);
    if (!wsw->pipe)
       goto err_free;