r600: make reloc_chunk size dynamic
authorAlex Deucher <alexdeucher@gmail.com>
Wed, 26 Aug 2009 16:17:44 +0000 (12:17 -0400)
committerAlex Deucher <alexdeucher@gmail.com>
Wed, 26 Aug 2009 16:17:44 +0000 (12:17 -0400)
src/mesa/drivers/dri/r600/r600_cmdbuf.c
src/mesa/drivers/dri/r600/r700_render.c

index 050d7bc6d0ed9e01fb2f914546945c3440a8eb83..1734b0a89f990650ff1e2dd60389db8c5a238b55 100644 (file)
@@ -324,7 +324,7 @@ static int r600_cs_emit(struct radeon_cs *cs)
     struct drm_radeon_cs_chunk cs_chunk[2];
     uint32_t length_dw_reloc_chunk;
     uint64_t chunk_ptrs[2];
-    uint32_t reloc_chunk[256];
+    uint32_t *reloc_chunk;
     int r;
     int retry = 0;
 
@@ -333,8 +333,11 @@ static int r600_cs_emit(struct radeon_cs *cs)
 
     csm->pending_count = 1;
 
-    r = r600_cs_process_relocs(cs, &(reloc_chunk[0]), &length_dw_reloc_chunk);
+    reloc_chunk = (uint32_t*)calloc(1, cs->crelocs * 4 * 4);
+
+    r = r600_cs_process_relocs(cs, reloc_chunk, &length_dw_reloc_chunk);
     if (r) {
+       free(reloc_chunk);
         return 0;
     }
 
@@ -346,7 +349,7 @@ static int r600_cs_emit(struct radeon_cs *cs)
     /* reloc chaunk */
     cs_chunk[1].chunk_id   = RADEON_CHUNK_ID_RELOCS;
     cs_chunk[1].length_dw  = length_dw_reloc_chunk;
-    cs_chunk[1].chunk_data = (unsigned long)&(reloc_chunk[0]);
+    cs_chunk[1].chunk_data = (unsigned long)reloc_chunk;
 
     chunk_ptrs[0] = (uint64_t)(unsigned long)&(cs_chunk[0]);
     chunk_ptrs[1] = (uint64_t)(unsigned long)&(cs_chunk[1]);
@@ -364,6 +367,7 @@ static int r600_cs_emit(struct radeon_cs *cs)
     } while (r == -EAGAIN && retry < 1000);
 
     if (r) {
+       free(reloc_chunk);
         return r;
     }
 
@@ -375,6 +379,8 @@ static int r600_cs_emit(struct radeon_cs *cs)
     cs->csm->vram_write_used = 0;
     cs->csm->gart_write_used = 0;
 
+    free(reloc_chunk);
+
     return 0;
 }
 
index d64e921bdad8bee72ffea85700e0d2efe9d59b7a..0b3ceb01bacff35431ff6d4d7936e1540acd81f8 100644 (file)
@@ -143,8 +143,7 @@ GLboolean r700SyncSurf(context_t *context,
     R600_OUT_BATCH_RELOC(0,
                         pbo,
                         0,
-                        read_domain, write_domain, 0); // ???
-
+                        read_domain, write_domain, 0);
     END_BATCH();
     COMMIT_BATCH();