r300g: do not create a user buffer struct for misaligned ushort indices fallback
authorMarek Olšák <maraeo@gmail.com>
Mon, 14 Feb 2011 09:08:59 +0000 (10:08 +0100)
committerMarek Olšák <maraeo@gmail.com>
Mon, 14 Feb 2011 10:43:14 +0000 (11:43 +0100)
src/gallium/drivers/r300/r300_render.c
src/gallium/drivers/r300/r300_screen_buffer.c
src/gallium/drivers/r300/r300_screen_buffer.h

index 051f434d428c221bd75c20eaeac239dad2ab69ef..37b9934a6195ecbf063d964aa11f309315d12cd9 100644 (file)
@@ -578,7 +578,6 @@ static void r300_draw_range_elements(struct pipe_context* pipe,
     if (indexSize == 2 && (start & 1) &&
         !r300_resource(indexBuffer)->b.user_ptr) {
         struct pipe_transfer *transfer;
-        struct pipe_resource *userbuf;
 
         uint16_t *ptr = pipe_buffer_map(pipe, indexBuffer,
                                         PIPE_TRANSFER_READ |
@@ -590,18 +589,16 @@ static void r300_draw_range_elements(struct pipe_context* pipe,
         } else {
             /* Copy the mapped index buffer directly to the upload buffer.
              * The start index will be aligned simply from the fact that
-             * every sub-buffer in u_upload_mgr is aligned. */
-            userbuf = pipe->screen->user_buffer_create(pipe->screen,
-                                                       ptr, 0,
-                                                       PIPE_BIND_INDEX_BUFFER);
-            indexBuffer = userbuf;
-            r300_upload_index_buffer(r300, &indexBuffer, indexSize, &start, count);
-            pipe_resource_reference(&userbuf, NULL);
+             * every sub-buffer in the upload buffer is aligned. */
+            r300_upload_index_buffer(r300, &indexBuffer, indexSize, &start,
+                                     count, (uint8_t*)ptr);
         }
         pipe_buffer_unmap(pipe, transfer);
     } else {
         if (r300_resource(indexBuffer)->b.user_ptr)
-            r300_upload_index_buffer(r300, &indexBuffer, indexSize, &start, count);
+            r300_upload_index_buffer(r300, &indexBuffer, indexSize,
+                                     &start, count,
+                                     r300_resource(indexBuffer)->b.user_ptr);
     }
 
     /* 19 dwords for emit_draw_elements. Give up if the function fails. */
index 04afae609f9225187ddb7235613bc6ff2e096901..7855d70a97316ab26d701717110df2efaf649c0c 100644 (file)
@@ -51,10 +51,9 @@ unsigned r300_buffer_is_referenced(struct pipe_context *context,
 void r300_upload_index_buffer(struct r300_context *r300,
                              struct pipe_resource **index_buffer,
                              unsigned index_size, unsigned *start,
-                             unsigned count)
+                             unsigned count, uint8_t *ptr)
 {
     unsigned index_offset;
-    uint8_t *ptr = r300_resource(*index_buffer)->b.user_ptr;
     boolean flushed;
 
     *index_buffer = NULL;
index ae87c4406a74723b6f4fe45dda04b345df3b1209..14bee460d5b0602ad9d8dfc50d05518346324849 100644 (file)
@@ -40,7 +40,7 @@
 void r300_upload_index_buffer(struct r300_context *r300,
                              struct pipe_resource **index_buffer,
                              unsigned index_size, unsigned *start,
-                             unsigned count);
+                             unsigned count, uint8_t *ptr);
 
 struct pipe_resource *r300_buffer_create(struct pipe_screen *screen,
                                         const struct pipe_resource *templ);