r300g: various other cleanups
[mesa.git] / src / gallium / drivers / r300 / r300_screen_buffer.c
index cb47ba16882360723f8662536422cf2f8ab4519e..ea10aeee24e92cbea126ef9c622dc9fea6fd886a 100644 (file)
@@ -22,6 +22,7 @@
  *
  * Authors: Dave Airlie
  */
+
 #include <stdio.h>
 
 #include "util/u_inlines.h"
@@ -31,7 +32,6 @@
 #include "util/u_math.h"
 
 #include "r300_screen_buffer.h"
-
 #include "r300_winsys.h"
 
 static unsigned r300_buffer_is_referenced(struct pipe_context *context,
@@ -80,7 +80,7 @@ int r300_upload_index_buffer(struct r300_context *r300,
     return ret;
 }
 
-/* External helper, not required to implent u_resource_vtbl:
+/* External helper, not required to implement u_resource_vtbl:
  */
 int r300_upload_user_buffers(struct r300_context *r300)
 {
@@ -90,7 +90,6 @@ int r300_upload_user_buffers(struct r300_context *r300)
     nr = r300->vertex_buffer_count;
 
     for (i = 0; i < nr; i++) {
-
        if (r300_buffer_is_user_buffer(r300->vertex_buffer[i].buffer)) {
            struct pipe_resource *upload_buffer = NULL;
            unsigned offset = 0; /*r300->vertex_buffer[i].buffer_offset * 4;*/
@@ -135,7 +134,6 @@ static void r300_winsys_buffer_destroy(struct r300_screen *r300screen,
     }
 }
 
-
 static void r300_buffer_destroy(struct pipe_screen *screen,
                                struct pipe_resource *buf)
 {
@@ -147,33 +145,30 @@ static void r300_buffer_destroy(struct pipe_screen *screen,
 }
 
 static void *
-r300_buffer_map_range(struct pipe_screen *screen,
-                     struct pipe_resource *buf,
-                     unsigned offset, unsigned length,
-                     unsigned usage )
+r300_buffer_transfer_map( struct pipe_context *pipe,
+                         struct pipe_transfer *transfer )
 {
-    struct r300_screen *r300screen = r300_screen(screen);
+    struct r300_screen *r300screen = r300_screen(pipe->screen);
     struct r300_winsys_screen *rws = r300screen->rws;
-    struct r300_buffer *rbuf = r300_buffer(buf);
-    void *map;
-    int flush = 0;
-    int i;
+    struct r300_buffer *rbuf = r300_buffer(transfer->resource);
+    uint8_t *map;
+    boolean flush = FALSE;
+    unsigned i;
 
     if (rbuf->user_buffer)
-       return rbuf->user_buffer;
+        return rbuf->user_buffer + transfer->box.x;
 
     if (rbuf->b.b.bind & PIPE_BIND_CONSTANT_BUFFER) {
        goto just_map;
     }
 
     /* check if the mapping is to a range we already flushed */
-    if (usage & PIPE_TRANSFER_DISCARD) {
+    if (transfer->usage & PIPE_TRANSFER_DISCARD) {
        for (i = 0; i < rbuf->num_ranges; i++) {
+           if ((transfer->box.x >= rbuf->ranges[i].start) &&
+               (transfer->box.x < rbuf->ranges[i].end))
+               flush = TRUE;
 
-           if ((offset >= rbuf->ranges[i].start) &&
-               (offset < rbuf->ranges[i].end))
-               flush = 1;
-           
            if (flush) {
                /* unreference this hw buffer and allocate a new one */
                rws->buffer_reference(rws, &rbuf->buf, NULL);
@@ -189,19 +184,28 @@ r300_buffer_map_range(struct pipe_screen *screen,
        }
     }
 just_map:
-    map = rws->buffer_map(rws, rbuf->buf, usage);
-   
-    return map;
+    map = rws->buffer_map(rws, rbuf->buf, transfer->usage);
+
+    if (map == NULL)
+        return NULL;
+
+    /* map_buffer() returned a pointer to the beginning of the buffer,
+     * but transfers are expected to return a pointer to just the
+     * region specified in the box.
+     */
+    return map + transfer->box.x;
 }
 
-static void 
-r300_buffer_flush_mapped_range( struct pipe_screen *screen,
-                               struct pipe_resource *buf,
-                               unsigned offset,
-                               unsigned length )
+static void r300_buffer_transfer_flush_region( struct pipe_context *pipe,
+                                              struct pipe_transfer *transfer,
+                                              const struct pipe_box *box)
 {
-    struct r300_buffer *rbuf = r300_buffer(buf);
-    int i;
+    struct r300_buffer *rbuf = r300_buffer(transfer->resource);
+    unsigned i;
+    unsigned offset = transfer->box.x + box->x;
+    unsigned length = box->width;
+
+    assert(box->x + box->width <= transfer->box.width);
 
     if (rbuf->user_buffer)
        return;
@@ -211,7 +215,7 @@ r300_buffer_flush_mapped_range( struct pipe_screen *screen,
 
     /* mark the range as used */
     for(i = 0; i < rbuf->num_ranges; ++i) {
-       if(offset <= rbuf->ranges[i].end && rbuf->ranges[i].start <= (offset+length)) {
+       if(offset <= rbuf->ranges[i].end && rbuf->ranges[i].start <= (offset+box->width)) {
            rbuf->ranges[i].start = MIN2(rbuf->ranges[i].start, offset);
            rbuf->ranges[i].end   = MAX2(rbuf->ranges[i].end, (offset+length));
            return;
@@ -223,72 +227,18 @@ r300_buffer_flush_mapped_range( struct pipe_screen *screen,
     rbuf->num_ranges++;
 }
 
-
-static void
-r300_buffer_unmap(struct pipe_screen *screen,
-                 struct pipe_resource *buf)
+static void r300_buffer_transfer_unmap( struct pipe_context *pipe,
+                           struct pipe_transfer *transfer )
 {
-    struct r300_screen *r300screen = r300_screen(screen);
+    struct r300_screen *r300screen = r300_screen(pipe->screen);
     struct r300_winsys_screen *rws = r300screen->rws;
-    struct r300_buffer *rbuf = r300_buffer(buf);
+    struct r300_buffer *rbuf = r300_buffer(transfer->resource);
 
     if (rbuf->buf) {
         rws->buffer_unmap(rws, rbuf->buf);
     }
 }
 
-
-
-
-/* As a first step, keep the original code intact, implement buffer
- * transfers in terms of the old map/unmap functions.
- *
- * Utility functions for transfer create/destroy are hooked in and
- * just record the arguments to those functions.
- */
-static void *
-r300_buffer_transfer_map( struct pipe_context *pipe,
-                         struct pipe_transfer *transfer )
-{
-   uint8_t *map = r300_buffer_map_range( pipe->screen,
-                                        transfer->resource,
-                                        transfer->box.x,
-                                        transfer->box.width,
-                                        transfer->usage );
-   if (map == NULL)
-      return NULL;
-
-   /* map_buffer() returned a pointer to the beginning of the buffer,
-    * but transfers are expected to return a pointer to just the
-    * region specified in the box.
-    */
-   return map + transfer->box.x;
-}
-
-
-
-static void r300_buffer_transfer_flush_region( struct pipe_context *pipe,
-                                              struct pipe_transfer *transfer,
-                                              const struct pipe_box *box)
-{
-   assert(box->x + box->width <= transfer->box.width);
-
-   r300_buffer_flush_mapped_range(pipe->screen,
-                                 transfer->resource,
-                                 transfer->box.x + box->x,
-                                 box->width);
-}
-
-static void r300_buffer_transfer_unmap( struct pipe_context *pipe,
-                           struct pipe_transfer *transfer )
-{
-   r300_buffer_unmap(pipe->screen,
-                    transfer->resource);
-}
-
-
-
-
 struct u_resource_vtbl r300_buffer_vtbl = 
 {
    u_default_resource_get_handle,      /* get_handle */
@@ -302,11 +252,8 @@ struct u_resource_vtbl r300_buffer_vtbl =
    u_default_transfer_inline_write   /* transfer_inline_write */
 };
 
-
-
-
 struct pipe_resource *r300_buffer_create(struct pipe_screen *screen,
-                                        const struct pipe_resource *template)
+                                        const struct pipe_resource *templ)
 {
     struct r300_screen *r300screen = r300_screen(screen);
     struct r300_buffer *rbuf;
@@ -318,13 +265,13 @@ struct pipe_resource *r300_buffer_create(struct pipe_screen *screen,
 
     rbuf->magic = R300_BUFFER_MAGIC;
 
-    rbuf->b.b = *template;
+    rbuf->b.b = *templ;
     rbuf->b.vtbl = &r300_buffer_vtbl;
     pipe_reference_init(&rbuf->b.b.reference, 1);
     rbuf->b.b.screen = screen;
 
     if (rbuf->b.b.bind & R300_BIND_OQBO)
-       alignment = 4096;
+        alignment = 4096;
 
     rbuf->buf = r300_winsys_buffer_create(r300screen,
                                          alignment,
@@ -341,7 +288,6 @@ error1:
     return NULL;
 }
 
-
 struct pipe_resource *r300_user_buffer_create(struct pipe_screen *screen,
                                              void *ptr,
                                              unsigned bytes,
@@ -371,4 +317,3 @@ struct pipe_resource *r300_user_buffer_create(struct pipe_screen *screen,
 no_rbuf:
     return NULL;
 }
-