Module: Mesa
Branch: master
Commit: e9abb2cd6e93681504fbcf323c790e3950304734
URL:    
http://cgit.freedesktop.org/mesa/mesa/commit/?id=e9abb2cd6e93681504fbcf323c790e3950304734

Author: Marek Olšák <[email protected]>
Date:   Mon Apr  2 02:45:27 2012 +0200

r600g: inline r600_upload_const_buffer

---

 src/gallium/drivers/r600/r600_buffer.c       |   36 ----------------------
 src/gallium/drivers/r600/r600_resource.h     |    4 --
 src/gallium/drivers/r600/r600_state_common.c |   42 +++++++++++++++++++------
 3 files changed, 32 insertions(+), 50 deletions(-)

diff --git a/src/gallium/drivers/r600/r600_buffer.c 
b/src/gallium/drivers/r600/r600_buffer.c
index f9f32b2..b165c31 100644
--- a/src/gallium/drivers/r600/r600_buffer.c
+++ b/src/gallium/drivers/r600/r600_buffer.c
@@ -25,7 +25,6 @@
  *      Corbin Simpson <[email protected]>
  */
 #include "r600_pipe.h"
-#include <byteswap.h>
 #include "util/u_upload_mgr.h"
 
 static void r600_buffer_destroy(struct pipe_screen *screen,
@@ -267,38 +266,3 @@ void r600_upload_index_buffer(struct r600_context *rctx,
        u_upload_data(rctx->vbuf_mgr->uploader, 0, count * ib->index_size,
                      rbuffer->b.user_ptr, &ib->offset, &ib->buffer);
 }
-
-void r600_upload_const_buffer(struct r600_context *rctx, struct r600_resource 
**rbuffer,
-                            uint32_t *const_offset)
-{
-       if ((*rbuffer)->b.user_ptr) {
-               uint8_t *ptr = (*rbuffer)->b.user_ptr;
-               unsigned size = (*rbuffer)->b.b.b.width0;
-
-               *rbuffer = NULL;
-
-               if (R600_BIG_ENDIAN) {
-                       uint32_t *tmpPtr;
-                       unsigned i;
-
-                       if (!(tmpPtr = malloc(size))) {
-                               R600_ERR("Failed to allocate BE swap 
buffer.\n");
-                               return;
-                       }
-
-                       for (i = 0; i < size / 4; ++i) {
-                               tmpPtr[i] = bswap_32(((uint32_t *)ptr)[i]);
-                       }
-
-                       u_upload_data(rctx->vbuf_mgr->uploader, 0, size, 
tmpPtr, const_offset,
-                                     (struct pipe_resource**)rbuffer);
-
-                       free(tmpPtr);
-               } else {
-                       u_upload_data(rctx->vbuf_mgr->uploader, 0, size, ptr, 
const_offset,
-                                     (struct pipe_resource**)rbuffer);
-               }
-       } else {
-               *const_offset = 0;
-       }
-}
diff --git a/src/gallium/drivers/r600/r600_resource.h 
b/src/gallium/drivers/r600/r600_resource.h
index 5bb5e57..87bef73 100644
--- a/src/gallium/drivers/r600/r600_resource.h
+++ b/src/gallium/drivers/r600/r600_resource.h
@@ -94,8 +94,4 @@ void* r600_texture_transfer_map(struct pipe_context *ctx,
 void r600_texture_transfer_unmap(struct pipe_context *ctx,
                                 struct pipe_transfer* transfer);
 
-struct r600_context;
-
-void r600_upload_const_buffer(struct r600_context *rctx, struct r600_resource 
**rbuffer, uint32_t *offset);
-
 #endif
diff --git a/src/gallium/drivers/r600/r600_state_common.c 
b/src/gallium/drivers/r600/r600_state_common.c
index 24e9ae3..1738d30 100644
--- a/src/gallium/drivers/r600/r600_state_common.c
+++ b/src/gallium/drivers/r600/r600_state_common.c
@@ -28,7 +28,9 @@
 #include "r600d.h"
 
 #include "util/u_blitter.h"
+#include "util/u_upload_mgr.h"
 #include "tgsi/tgsi_parse.h"
+#include <byteswap.h>
 
 static void r600_emit_command_buffer(struct r600_context *rctx, struct 
r600_atom *atom)
 {
@@ -531,10 +533,9 @@ void r600_set_constant_buffer(struct pipe_context *ctx, 
uint shader, uint index,
                              struct pipe_resource *buffer)
 {
        struct r600_context *rctx = (struct r600_context *)ctx;
-       struct r600_resource *rbuffer = r600_resource(buffer);
        struct r600_constbuf_state *state;
        struct r600_constant_buffer *cb;
-       uint32_t offset;
+       uint8_t *ptr;
 
        switch (shader) {
        case PIPE_SHADER_VERTEX:
@@ -550,26 +551,47 @@ void r600_set_constant_buffer(struct pipe_context *ctx, 
uint shader, uint index,
        /* Note that the state tracker can unbind constant buffers by
         * passing NULL here.
         */
-       if (buffer == NULL) {
+       if (unlikely(!buffer)) {
                state->enabled_mask &= ~(1 << index);
                state->dirty_mask &= ~(1 << index);
                pipe_resource_reference(&state->cb[index].buffer, NULL);
                return;
        }
 
-       r600_upload_const_buffer(rctx, &rbuffer, &offset);
-
        cb = &state->cb[index];
-       pipe_resource_reference(&cb->buffer, &rbuffer->b.b.b);
-       cb->buffer_offset = offset;
        cb->buffer_size = buffer->width0;
 
+       ptr = u_vbuf_resource(buffer)->user_ptr;
+
+       if (ptr) {
+               /* Upload the user buffer. */
+               if (R600_BIG_ENDIAN) {
+                       uint32_t *tmpPtr;
+                       unsigned i, size = buffer->width0;
+
+                       if (!(tmpPtr = malloc(size))) {
+                               R600_ERR("Failed to allocate BE swap 
buffer.\n");
+                               return;
+                       }
+
+                       for (i = 0; i < size / 4; ++i) {
+                               tmpPtr[i] = bswap_32(((uint32_t *)ptr)[i]);
+                       }
+
+                       u_upload_data(rctx->vbuf_mgr->uploader, 0, size, 
tmpPtr, &cb->buffer_offset, &cb->buffer);
+                       free(tmpPtr);
+               } else {
+                       u_upload_data(rctx->vbuf_mgr->uploader, 0, 
buffer->width0, ptr, &cb->buffer_offset, &cb->buffer);
+               }
+       } else {
+               /* Setup the hw buffer. */
+               cb->buffer_offset = 0;
+               pipe_resource_reference(&cb->buffer, buffer);
+       }
+
        state->enabled_mask |= 1 << index;
        state->dirty_mask |= 1 << index;
        r600_constant_buffers_dirty(rctx, state);
-
-       if (buffer != &rbuffer->b.b.b)
-               pipe_resource_reference((struct pipe_resource**)&rbuffer, NULL);
 }
 
 struct pipe_stream_output_target *

_______________________________________________
mesa-commit mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/mesa-commit

Reply via email to