gallium: add flags parameter to pipe_screen::context_create
[mesa.git] / src / gallium / winsys / sw / wrapper / wrapper_sw_winsys.c
index d4d4270eb864ab91b9522715de823e8218c77dc4..5c179930d9b90168d0afd30b1d7589b7f95a02c4 100644 (file)
@@ -52,6 +52,7 @@ 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
@@ -60,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;
@@ -85,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;
 }
@@ -145,8 +158,11 @@ wsw_dt_create(struct sw_winsys *ws,
     * 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.depth0 = 1;
+   templ.array_size = 1;
    templ.format = format;
    templ.bind = bind;
 
@@ -175,6 +191,18 @@ wsw_dt_from_handle(struct sw_winsys *ws,
    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,
@@ -190,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;
 
@@ -212,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;
 }
 
@@ -231,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;
 }
 
@@ -258,25 +282,32 @@ wsw_destroy(struct sw_winsys *ws)
 }
 
 struct sw_winsys *
-wrapper_sw_winsys_warp_pipe_screen(struct pipe_screen *screen)
+wrapper_sw_winsys_wrap_pipe_screen(struct pipe_screen *screen)
 {
    struct wrapper_sw_winsys *wsw = CALLOC_STRUCT(wrapper_sw_winsys);
 
    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;
    wsw->base.displaytarget_map = wsw_dt_map;
    wsw->base.displaytarget_unmap = wsw_dt_unmap;
    wsw->base.displaytarget_destroy = wsw_dt_destroy;
    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;
 
+   if(screen->get_param(screen, PIPE_CAP_NPOT_TEXTURES))
+      wsw->target = PIPE_TEXTURE_2D;
+   else
+      wsw->target = PIPE_TEXTURE_RECT;
+
    return &wsw->base;
 
 err_free:
@@ -284,3 +315,16 @@ err_free:
 err:
    return NULL;
 }
+
+struct pipe_screen *
+wrapper_sw_winsys_dewrap_pipe_screen(struct sw_winsys *ws)
+{
+   struct wrapper_sw_winsys *wsw = wrapper_sw_winsys(ws);
+   struct pipe_screen *screen = wsw->screen;
+
+   wsw->pipe->destroy(wsw->pipe);
+   /* don't destroy the screen its needed later on */
+
+   FREE(wsw);
+   return screen;
+}