drm/radeon: remove softpipe references
[mesa.git] / src / gallium / winsys / drm / radeon / core / radeon_buffer.c
index b8be059ce86dc698e80d4b958ad04357fd71a628..3b1c3860a4c4cec187cf3d9b13940c62e4934752 100644 (file)
@@ -33,7 +33,6 @@
 #include "radeon_buffer.h"
 
 #include "radeon_bo_gem.h"
-#include "softpipe/sp_texture.h"
 #include "r300_context.h"
 #include "util/u_format.h"
 #include "util/u_math.h"
@@ -51,6 +50,26 @@ static const char *radeon_get_name(struct pipe_winsys *ws)
     return "Radeon/GEM+KMS";
 }
 
+static uint32_t radeon_domain_from_usage(unsigned usage)
+{
+    uint32_t domain = 0;
+
+    if (usage & PIPE_BUFFER_USAGE_GPU_WRITE) {
+        domain |= RADEON_GEM_DOMAIN_VRAM;
+    }
+    if (usage & PIPE_BUFFER_USAGE_PIXEL) {
+        domain |= RADEON_GEM_DOMAIN_VRAM;
+    }
+    if (usage & PIPE_BUFFER_USAGE_VERTEX) {
+        domain |= RADEON_GEM_DOMAIN_GTT;
+    }
+    if (usage & PIPE_BUFFER_USAGE_INDEX) {
+        domain |= RADEON_GEM_DOMAIN_GTT;
+    }
+
+    return domain;
+}
+
 static struct pipe_buffer *radeon_buffer_create(struct pipe_winsys *ws,
                                                 unsigned alignment,
                                                 unsigned usage,
@@ -58,6 +77,7 @@ static struct pipe_buffer *radeon_buffer_create(struct pipe_winsys *ws,
 {
     struct radeon_winsys *radeon_ws = (struct radeon_winsys *)ws;
     struct radeon_pipe_buffer *radeon_buffer;
+    struct pb_desc desc;
     uint32_t domain;
 
     radeon_buffer = CALLOC_STRUCT(radeon_pipe_buffer);
@@ -70,19 +90,16 @@ static struct pipe_buffer *radeon_buffer_create(struct pipe_winsys *ws,
     radeon_buffer->base.usage = usage;
     radeon_buffer->base.size = size;
 
-    domain = 0;
-
-    if (usage & PIPE_BUFFER_USAGE_PIXEL) {
-        domain |= RADEON_GEM_DOMAIN_VRAM;
-    }
-    if (usage & PIPE_BUFFER_USAGE_VERTEX) {
-        domain |= RADEON_GEM_DOMAIN_GTT;
-    }
-    if (usage & PIPE_BUFFER_USAGE_INDEX) {
-        domain |= RADEON_GEM_DOMAIN_GTT;
+    if (usage & PIPE_BUFFER_USAGE_CONSTANT && is_r3xx(radeon_ws->pci_id)) {
+        /* Don't bother allocating a BO, as it'll never get to the card. */
+        desc.alignment = alignment;
+        desc.usage = usage;
+        radeon_buffer->pb = pb_malloc_buffer_create(size, &desc);
+        return &radeon_buffer->base;
     }
 
-    radeon_buffer->ws = radeon_ws;
+    domain = radeon_domain_from_usage(usage);
+
     radeon_buffer->bo = radeon_bo_open(radeon_ws->priv->bom, 0, size,
             alignment, domain, 0);
     if (radeon_buffer->bo == NULL) {
@@ -133,14 +150,17 @@ static void radeon_buffer_del(struct pipe_buffer *buffer)
 {
     struct radeon_pipe_buffer *radeon_buffer =
         (struct radeon_pipe_buffer*)buffer;
-    struct radeon_winsys_priv *priv = radeon_buffer->ws->priv;
 
-    if (radeon_bo_is_referenced_by_cs(radeon_buffer->bo, priv->cs)) {
-        priv->flush_cb(priv->flush_data);
+    if (radeon_buffer->pb) {
+        pipe_reference_init(&radeon_buffer->pb->base.reference, 0);
+        pb_destroy(radeon_buffer->pb);
+    }
+
+    if (radeon_buffer->bo) {
+        radeon_bo_unref(radeon_buffer->bo);
     }
 
-    radeon_bo_unref(radeon_buffer->bo);
-    free(radeon_buffer);
+    FREE(radeon_buffer);
 }
 
 static void *radeon_buffer_map(struct pipe_winsys *ws,
@@ -152,8 +172,8 @@ static void *radeon_buffer_map(struct pipe_winsys *ws,
         (struct radeon_pipe_buffer*)buffer;
     int write = 0;
 
-    if (radeon_bo_is_referenced_by_cs(radeon_buffer->bo, priv->cs)) {
-        priv->flush_cb(priv->flush_data);
+    if (radeon_buffer->pb) {
+        return pb_map(radeon_buffer->pb, flags);
     }
 
     if (flags & PIPE_BUFFER_USAGE_DONTBLOCK) {
@@ -162,6 +182,11 @@ static void *radeon_buffer_map(struct pipe_winsys *ws,
         if (radeon_bo_is_busy(radeon_buffer->bo, &domain))
             return NULL;
     }
+
+    if (radeon_bo_is_referenced_by_cs(radeon_buffer->bo, priv->cs)) {
+        priv->flush_cb(priv->flush_data);
+    }
+
     if (flags & PIPE_BUFFER_USAGE_CPU_WRITE) {
         write = 1;
     }
@@ -179,7 +204,31 @@ static void radeon_buffer_unmap(struct pipe_winsys *ws,
     struct radeon_pipe_buffer *radeon_buffer =
         (struct radeon_pipe_buffer*)buffer;
 
-    radeon_bo_unmap(radeon_buffer->bo);
+    if (radeon_buffer->pb) {
+        pb_unmap(radeon_buffer->pb);
+    } else {
+        radeon_bo_unmap(radeon_buffer->bo);
+    }
+}
+
+static void radeon_buffer_set_tiling(struct radeon_winsys *ws,
+                                     struct pipe_buffer *buffer,
+                                     uint32_t pitch,
+                                     boolean microtiled,
+                                     boolean macrotiled)
+{
+    struct radeon_pipe_buffer *radeon_buffer =
+        (struct radeon_pipe_buffer*)buffer;
+    uint32_t flags = 0;
+
+    if (microtiled) {
+        flags |= RADEON_BO_FLAGS_MICRO_TILE;
+    }
+    if (macrotiled) {
+        flags |= RADEON_BO_FLAGS_MACRO_TILE;
+    }
+
+    radeon_bo_set_tiling(radeon_buffer->bo, flags, pitch);
 }
 
 static void radeon_fence_reference(struct pipe_winsys *ws,
@@ -202,55 +251,6 @@ static int radeon_fence_finish(struct pipe_winsys *ws,
     return 0;
 }
 
-static void radeon_display_surface(struct pipe_winsys *pws,
-                                   struct pipe_surface *psurf,
-                                   struct radeon_vl_context *rvl_ctx)
-{
-    struct r300_texture *r300tex = (struct r300_texture *)(psurf->texture);
-    XImage *ximage;
-    void *data;
-
-    ximage = XCreateImage(rvl_ctx->display,
-                          XDefaultVisual(rvl_ctx->display, rvl_ctx->screen),
-                          XDefaultDepth(rvl_ctx->display, rvl_ctx->screen),
-                          ZPixmap, 0,   /* format, offset */
-                          NULL,         /* data */
-                          0, 0,         /* size */
-                          32,           /* bitmap_pad */
-                          0);           /* bytes_per_line */
-
-    assert(ximage->format);
-    assert(ximage->bitmap_unit);
-
-    data = pws->buffer_map(pws, r300tex->buffer, 0);
-
-    /* update XImage's fields */
-    ximage->data = data;
-    ximage->width = psurf->width;
-    ximage->height = psurf->height;
-    ximage->bytes_per_line = psurf->width * (ximage->bits_per_pixel >> 3);
-
-    XPutImage(rvl_ctx->display, rvl_ctx->drawable,
-              XDefaultGC(rvl_ctx->display, rvl_ctx->screen),
-              ximage, 0, 0, 0, 0, psurf->width, psurf->height);
-
-    XSync(rvl_ctx->display, 0);
-
-    ximage->data = NULL;
-    XDestroyImage(ximage);
-
-    pws->buffer_unmap(pws, r300tex->buffer);
-}
-
-static void radeon_flush_frontbuffer(struct pipe_winsys *pipe_winsys,
-                                     struct pipe_surface *pipe_surface,
-                                     void *context_private)
-{
-    struct radeon_vl_context *rvl_ctx;
-    rvl_ctx = (struct radeon_vl_context *) context_private;
-    radeon_display_surface(pipe_winsys, pipe_surface, rvl_ctx);
-}
-
 struct radeon_winsys* radeon_pipe_winsys(int fd)
 {
     struct radeon_winsys* radeon_ws;
@@ -269,7 +269,7 @@ struct radeon_winsys* radeon_pipe_winsys(int fd)
     radeon_ws->priv->fd = fd;
     radeon_ws->priv->bom = radeon_bo_manager_gem_ctor(fd);
 
-    radeon_ws->base.flush_frontbuffer = radeon_flush_frontbuffer;
+    radeon_ws->base.flush_frontbuffer = NULL; /* overriden by co-state tracker */
 
     radeon_ws->base.buffer_create = radeon_buffer_create;
     radeon_ws->base.user_buffer_create = radeon_buffer_user_create;
@@ -284,60 +284,7 @@ struct radeon_winsys* radeon_pipe_winsys(int fd)
 
     radeon_ws->base.get_name = radeon_get_name;
 
-    return radeon_ws;
-}
-#if 0
-static struct pipe_buffer *radeon_buffer_from_handle(struct radeon_screen *radeon_screen,
-                                                  uint32_t handle)
-{
-    struct radeon_pipe_buffer *radeon_buffer;
-    struct radeon_bo *bo = NULL;
-
-    bo = radeon_bo_open(radeon_screen->bom, handle, 0, 0, 0, 0);
-    if (bo == NULL) {
-        return NULL;
-    }
-    radeon_buffer = calloc(1, sizeof(struct radeon_pipe_buffer));
-    if (radeon_buffer == NULL) {
-        radeon_bo_unref(bo);
-        return NULL;
-    }
-    pipe_reference_init(&radeon_buffer->base.reference, 1);
-    radeon_buffer->base.usage = PIPE_BUFFER_USAGE_PIXEL;
-    radeon_buffer->bo = bo;
-    return &radeon_buffer->base;
-}
+    radeon_ws->buffer_set_tiling = radeon_buffer_set_tiling;
 
-struct pipe_surface *radeon_surface_from_handle(struct radeon_context *radeon_context,
-                                             uint32_t handle,
-                                             enum pipe_format format,
-                                             int w, int h, int pitch)
-{
-    struct pipe_screen *pipe_screen = radeon_context->pipe_screen;
-    struct pipe_winsys *pipe_winsys = radeon_context->pipe_winsys;
-    struct pipe_texture tmpl;
-    struct pipe_surface *ps;
-    struct pipe_texture *pt;
-    struct pipe_buffer *pb;
-
-    pb = radeon_buffer_from_handle(radeon_context->radeon_screen, handle);
-    if (pb == NULL) {
-        return NULL;
-    }
-    memset(&tmpl, 0, sizeof(tmpl));
-    tmpl.tex_usage = PIPE_TEXTURE_USAGE_DISPLAY_TARGET;
-    tmpl.target = PIPE_TEXTURE_2D;
-    tmpl.width0 = w;
-    tmpl.height0 = h;
-    tmpl.depth0 = 1;
-    tmpl.format = format;
-
-    pt = pipe_screen->texture_blanket(pipe_screen, &tmpl, &pitch, pb);
-    if (pt == NULL) {
-        pipe_buffer_reference(&pb, NULL);
-    }
-    ps = pipe_screen->get_tex_surface(pipe_screen, pt, 0, 0, 0,
-                                      PIPE_BUFFER_USAGE_GPU_WRITE);
-    return ps;
+    return radeon_ws;
 }
-#endif