Mesa (master): r600g: inline r600_upload_const_buffer

Marek Olšák mareko at kemper.freedesktop.org
Wed Apr 4 11:15:02 UTC 2012


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

Author: Marek Olšák <maraeo at gmail.com>
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 <MostAwesomeDude at gmail.com>
  */
 #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 *




More information about the mesa-commit mailing list