r300g: let the driver determine the GEM domain for buffer_create
[mesa.git] / src / gallium / winsys / radeon / drm / radeon_r300.c
index 38fcf889c8b401395c3206eddb0fd727a58cd9d5..4cf21ff72bfe9c2a1cf08d86e389485b0609f156 100644 (file)
@@ -31,6 +31,7 @@ static struct r300_winsys_buffer *
 radeon_r300_winsys_buffer_create(struct r300_winsys_screen *rws,
                                 unsigned alignment,
                                 unsigned usage,
+                                 enum r300_buffer_domain domain,
                                 unsigned size)
 {
     struct radeon_libdrm_winsys *ws = radeon_winsys_screen(rws);
@@ -38,14 +39,22 @@ radeon_r300_winsys_buffer_create(struct r300_winsys_screen *rws,
     struct pb_manager *provider;
     struct pb_buffer *buffer;
 
+    /* XXX this is hackish, but it's the only way to pass these flags
+     * to the real create function. */
+    usage &= ~(RADEON_USAGE_DOMAIN_GTT | RADEON_USAGE_DOMAIN_VRAM);
+    if (domain & R300_DOMAIN_GTT)
+        usage |= RADEON_USAGE_DOMAIN_GTT;
+    if (domain & R300_DOMAIN_VRAM)
+        usage |= RADEON_USAGE_DOMAIN_VRAM;
+
     memset(&desc, 0, sizeof(desc));
     desc.alignment = alignment;
     desc.usage = usage;
 
-    if (usage & PIPE_BUFFER_USAGE_CONSTANT)
+    if (usage & PIPE_BIND_CONSTANT_BUFFER)
         provider = ws->mman;
-    else if ((usage & PIPE_BUFFER_USAGE_VERTEX) ||
-            (usage & PIPE_BUFFER_USAGE_INDEX))
+    else if ((usage & PIPE_BIND_VERTEX_BUFFER) ||
+            (usage & PIPE_BIND_INDEX_BUFFER))
        provider = ws->cman;
     else
         provider = ws->kman;
@@ -72,12 +81,21 @@ static void radeon_r300_winsys_buffer_set_tiling(struct r300_winsys_screen *rws,
     radeon_drm_bufmgr_set_tiling(_buf, microtiled, macrotiled, pitch);
 }
 
+static void radeon_r300_winsys_buffer_get_tiling(struct r300_winsys_screen *rws,
+                                                 struct r300_winsys_buffer *buf,
+                                                 enum r300_buffer_tiling *microtiled,
+                                                 enum r300_buffer_tiling *macrotiled)
+{
+    struct pb_buffer *_buf = radeon_pb_buffer(buf);
+    radeon_drm_bufmgr_get_tiling(_buf, microtiled, macrotiled);
+}
+
 static void *radeon_r300_winsys_buffer_map(struct r300_winsys_screen *ws,
                                           struct r300_winsys_buffer *buf,
                                           unsigned usage)
 {
     struct pb_buffer *_buf = radeon_pb_buffer(buf);
-    
+
     return pb_map(_buf, usage);
 }
 
@@ -89,6 +107,13 @@ static void radeon_r300_winsys_buffer_unmap(struct r300_winsys_screen *ws,
     pb_unmap(_buf);
 }
 
+static void radeon_r300_winsys_buffer_wait(struct r300_winsys_screen *ws,
+                                           struct r300_winsys_buffer *buf)
+{
+    struct pb_buffer *_buf = radeon_pb_buffer(buf);
+    radeon_drm_bufmgr_wait(_buf);
+}
+
 static void radeon_r300_winsys_buffer_reference(struct r300_winsys_screen *rws,
                                                struct r300_winsys_buffer **pdst,
                                                struct r300_winsys_buffer *src)
@@ -102,11 +127,12 @@ static void radeon_r300_winsys_buffer_reference(struct r300_winsys_screen *rws,
 }
 
 static boolean radeon_r300_winsys_is_buffer_referenced(struct r300_winsys_screen *rws,
-                                                      struct r300_winsys_buffer *buf)
+                                                      struct r300_winsys_buffer *buf,
+                                                       enum r300_reference_domain domain)
 {
     struct pb_buffer *_buf = radeon_pb_buffer(buf);
 
-    return radeon_drm_bufmgr_is_buffer_referenced(_buf);
+    return radeon_drm_bufmgr_is_buffer_referenced(_buf, domain);
 }
 
 static struct r300_winsys_buffer *radeon_r300_winsys_buffer_from_handle(struct r300_winsys_screen *rws,
@@ -166,12 +192,15 @@ static boolean radeon_validate(struct r300_winsys_screen *rws)
     return TRUE;
 }
 
-static boolean radeon_check_cs(struct r300_winsys_screen *rws, int size)
+static void radeon_get_cs_info(struct r300_winsys_screen *rws,
+                               struct r300_cs_info *info)
 {
     struct radeon_libdrm_winsys *ws = radeon_winsys_screen(rws);
     struct radeon_cs *cs = ws->cs;
 
-    return radeon_validate(rws) && cs->cdw + size <= cs->ndw;
+    info->capacity = cs->ndw;
+    info->used = cs->cdw;
+    info->free = cs->ndw - cs->cdw;
 }
 
 static void radeon_begin_cs(struct r300_winsys_screen *rws,
@@ -191,6 +220,13 @@ static void radeon_write_cs_dword(struct r300_winsys_screen *rws,
     radeon_cs_write_dword(ws->cs, dword);
 }
 
+static void radeon_write_cs_table(struct r300_winsys_screen *rws,
+                                  const void *table, unsigned count)
+{
+    struct radeon_libdrm_winsys *ws = radeon_winsys_screen(rws);
+    radeon_cs_write_table(ws->cs, table, count);
+}
+
 static void radeon_write_cs_reloc(struct r300_winsys_screen *rws,
                                   struct r300_winsys_buffer *buf,
                                   uint32_t rd,
@@ -255,6 +291,8 @@ static uint32_t radeon_get_value(struct r300_winsys_screen *rws,
        return ws->z_pipes;
     case R300_VID_SQUARE_TILING_SUPPORT:
         return ws->squaretiling;
+    case R300_VID_DRM_2_3_0:
+        return ws->drm_2_3_0;
     }
     return 0;
 }
@@ -307,9 +345,10 @@ radeon_setup_winsys(int fd, struct radeon_libdrm_winsys* ws)
     ws->base.add_buffer = radeon_add_buffer;
     ws->base.validate = radeon_validate;
     ws->base.destroy = radeon_winsys_destroy;
-    ws->base.check_cs = radeon_check_cs;
+    ws->base.get_cs_info = radeon_get_cs_info;
     ws->base.begin_cs = radeon_begin_cs;
     ws->base.write_cs_dword = radeon_write_cs_dword;
+    ws->base.write_cs_table = radeon_write_cs_table;
     ws->base.write_cs_reloc = radeon_write_cs_reloc;
     ws->base.end_cs = radeon_end_cs;
     ws->base.flush_cs = radeon_flush_cs;
@@ -320,8 +359,10 @@ radeon_setup_winsys(int fd, struct radeon_libdrm_winsys* ws)
     ws->base.buffer_create = radeon_r300_winsys_buffer_create;
     ws->base.buffer_destroy = radeon_r300_winsys_buffer_destroy;
     ws->base.buffer_set_tiling = radeon_r300_winsys_buffer_set_tiling;
+    ws->base.buffer_get_tiling = radeon_r300_winsys_buffer_get_tiling;
     ws->base.buffer_map = radeon_r300_winsys_buffer_map;
     ws->base.buffer_unmap = radeon_r300_winsys_buffer_unmap;
+    ws->base.buffer_wait = radeon_r300_winsys_buffer_wait;
     ws->base.buffer_reference = radeon_r300_winsys_buffer_reference;
     ws->base.buffer_from_handle = radeon_r300_winsys_buffer_from_handle;
     ws->base.buffer_get_handle = radeon_r300_winsys_buffer_get_handle;