radeonsi: don't create temporary user buffer for r600_upload_const_buffer

This commit is contained in:
Marek Olšák 2012-04-26 13:39:19 +02:00
parent 0b7d48cbad
commit 65d451d9fa
3 changed files with 27 additions and 34 deletions

View File

@ -216,36 +216,30 @@ void r600_upload_index_buffer(struct r600_context *rctx,
}
void r600_upload_const_buffer(struct r600_context *rctx, struct r600_resource **rbuffer,
uint32_t *const_offset)
const uint8_t *ptr, unsigned size,
uint32_t *const_offset)
{
if ((*rbuffer)->b.b.user_ptr) {
uint8_t *ptr = (*rbuffer)->b.b.user_ptr;
unsigned size = (*rbuffer)->b.b.width0;
*rbuffer = NULL;
*rbuffer = NULL;
if (R600_BIG_ENDIAN) {
uint32_t *tmpPtr;
unsigned i;
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->uploader, 0, size, tmpPtr, const_offset,
(struct pipe_resource**)rbuffer);
free(tmpPtr);
} else {
u_upload_data(rctx->uploader, 0, size, ptr, const_offset,
(struct pipe_resource**)rbuffer);
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->uploader, 0, size, tmpPtr, const_offset,
(struct pipe_resource**)rbuffer);
free(tmpPtr);
} else {
*const_offset = 0;
u_upload_data(rctx->uploader, 0, size, ptr, const_offset,
(struct pipe_resource**)rbuffer);
}
}

View File

@ -99,6 +99,8 @@ void r600_texture_transfer_unmap(struct pipe_context *ctx,
struct r600_context;
void r600_upload_const_buffer(struct r600_context *rctx, struct r600_resource **rbuffer, uint32_t *offset);
void r600_upload_const_buffer(struct r600_context *rctx, struct r600_resource **rbuffer,
const uint8_t *ptr, unsigned size,
uint32_t *const_offset);
#endif

View File

@ -439,15 +439,12 @@ void r600_set_constant_buffer(struct pipe_context *ctx, uint shader, uint index,
return;
}
if (cb->user_buffer) {
rbuffer = pipe_user_buffer_create(ctx->screen, cb->user_buffer,
cb->buffer_size,
PIPE_BIND_CONSTANT_BUFFER);
}
r600_inval_shader_cache(rctx);
r600_upload_const_buffer(rctx, &rbuffer, &offset);
if (cb->user_buffer)
r600_upload_const_buffer(rctx, &rbuffer, cb->user_buffer, cb->buffer_size, &offset);
else
offset = 0;
va_offset = r600_resource_va(ctx->screen, (void*)rbuffer);
va_offset += offset;
//va_offset >>= 8;