r300g, radeong: fix the CS overflow
authorMarek Olšák <maraeo@gmail.com>
Wed, 2 Dec 2009 16:15:27 +0000 (17:15 +0100)
committerCorbin Simpson <MostAwesomeDude@gmail.com>
Fri, 4 Dec 2009 17:23:59 +0000 (09:23 -0800)
src/gallium/drivers/r300/r300_cs.h
src/gallium/drivers/r300/r300_emit.c
src/gallium/winsys/drm/radeon/core/radeon_r300.c

index 8b100375fdf0d56545dc35c60a37b4547f3cbbd6..9fcf3ab538ca94122af46af4c5d3f4edde9e5d7a 100644 (file)
@@ -55,7 +55,7 @@
     int cs_count = 0;
 
 #define CHECK_CS(size) \
-    cs_winsys->check_cs(cs_winsys, (size))
+    assert(cs_winsys->check_cs(cs_winsys, (size)))
 
 #define BEGIN_CS(size) do { \
     CHECK_CS(size); \
index a479842f9eb72efbc3f90dd7ec4c8ecd86d759a0..3bb42f9e4342bc035b9f01c7d41f8c632eeca5d6 100644 (file)
@@ -871,10 +871,17 @@ void r300_emit_dirty_state(struct r300_context* r300)
         return;
     }
 
+    /* Check size of CS. */
+    /* Make sure we have at least 8*1024 spare dwords. */
+    /* XXX It would be nice to know the number of dwords we really need to
+     * XXX emit. */
+    if (!r300->winsys->check_cs(r300->winsys, 8*1024)) {
+        r300->context.flush(&r300->context, 0, NULL);
+    }
+
     /* Clean out BOs. */
     r300->winsys->reset_bos(r300->winsys);
 
-    /* XXX check size */
 validate:
     /* Color buffers... */
     for (i = 0; i < r300->framebuffer_state.nr_cbufs; i++) {
index 7362279b77a9241e7a7c4cc37ab35abe2245e43b..ba0596c30dc3ceb48b7671525e12625b66213846 100644 (file)
@@ -52,8 +52,9 @@ static boolean radeon_validate(struct radeon_winsys* winsys)
 
 static boolean radeon_check_cs(struct radeon_winsys* winsys, int size)
 {
-    /* XXX check size here, lazy ass! */
-    return radeon_validate(winsys);
+    struct radeon_cs* cs = winsys->priv->cs;
+
+    return radeon_validate(winsys) && cs->cdw + size <= cs->ndw;
 }
 
 static void radeon_begin_cs(struct radeon_winsys* winsys,