r300g: add get_cs_info winsys entrypoint, abandon check_cs
authorMarek Olšák <maraeo@gmail.com>
Wed, 26 May 2010 17:29:58 +0000 (19:29 +0200)
committerMarek Olšák <maraeo@gmail.com>
Wed, 26 May 2010 20:22:52 +0000 (22:22 +0200)
src/gallium/drivers/r300/r300_context.c
src/gallium/drivers/r300/r300_context.h
src/gallium/drivers/r300/r300_cs.h
src/gallium/drivers/r300/r300_render.c
src/gallium/drivers/r300/r300_winsys.h
src/gallium/winsys/radeon/drm/radeon_r300.c

index 85e45d8647d6b60883df24f2c56a860315e4e952..88ce1867982f5bb78c1b379b06eea2766a028581 100644 (file)
@@ -236,6 +236,14 @@ struct pipe_context* r300_create_context(struct pipe_screen* screen,
     return NULL;
 }
 
+boolean r300_check_cs(struct r300_context *r300, unsigned size)
+{
+    struct r300_cs_info cs_info;
+
+    r300->rws->get_cs_info(r300->rws, &cs_info);
+    return size <= cs_info.free;
+}
+
 void r300_finish(struct r300_context *r300)
 {
     struct pipe_framebuffer_state *fb;
index efc6df3fabf859464a039be48700f80b81ab887d..97b69e76527acdd39bdc98e34c741a1b8552abdc 100644 (file)
@@ -490,6 +490,7 @@ void r300_init_render_functions(struct r300_context *r300);
 void r300_init_state_functions(struct r300_context* r300);
 void r300_init_resource_functions(struct r300_context* r300);
 
+boolean r300_check_cs(struct r300_context *r300, unsigned size);
 void r300_finish(struct r300_context *r300);
 void r500_dump_rs_block(struct r300_rs_block *rs);
 
index 996a4f491e7c5c6ecdb493a05c4cf66c056a01a3..6739f6703ac5ddc4e3c52b41508d1937e7ec5db1 100644 (file)
@@ -54,7 +54,7 @@
     int cs_count = 0; (void) cs_count;
 
 #define CHECK_CS(size) \
-    assert(cs_winsys->check_cs(cs_winsys, (size)))
+    assert(r300_check_cs(cs_context_copy, (size)))
 
 #define BEGIN_CS(size) do { \
     CHECK_CS(size); \
index 42716552c7f18f5625976bb057b7d2db2eaf92c5..3f66f75943e296807490b3182c115fab905bb2e8 100644 (file)
@@ -173,7 +173,7 @@ static void r300_prepare_for_rendering(struct r300_context *r300,
     cs_dwords += 26; /* emit_query_end */
 
     /* Reserve requested CS space. */
-    if (!r300->rws->check_cs(r300->rws, cs_dwords)) {
+    if (!r300_check_cs(r300, cs_dwords)) {
         r300->context.flush(&r300->context, 0, NULL);
         flushed = TRUE;
     }
index 3d0413f90af4f20ee4a5add95c923041ddf6b88f..f7cbbde410a0402efd826ead4c0672fc5255fbd9 100644 (file)
@@ -47,6 +47,13 @@ enum r300_reference_domain { /* bitfield */
     R300_REF_HW = 2
 };
 
+struct r300_cs_info {
+    /* In DWORDs. */
+    unsigned used;
+    unsigned free;
+    unsigned capacity;
+};
+
 struct r300_winsys_screen {
     void (*destroy)(struct r300_winsys_screen *ws);
     
@@ -101,8 +108,9 @@ struct r300_winsys_screen {
      * Returns TRUE if a flush is required. */
     boolean (*validate)(struct r300_winsys_screen* winsys);
 
-    /* Check to see if there's room for commands. */
-    boolean (*check_cs)(struct r300_winsys_screen* winsys, int size);
+    /* Return current CS info. */
+    void (*get_cs_info)(struct r300_winsys_screen *winsys,
+                        struct r300_cs_info *info);
 
     /* Start a command emit. */
     void (*begin_cs)(struct r300_winsys_screen* winsys,
index e188f7e7ccd50271f34300c7dadb2c73ebc4d96f..ecee1ee73db046ed536bccc9cdfb0d02d2fcd455 100644 (file)
@@ -183,12 +183,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 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,
@@ -333,7 +336,7 @@ 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;