Browse Source

r300g: inline some of the pipe_buffer_map/unmap calls

tags/android-x86-2.2-r2
Marek Olšák 14 years ago
parent
commit
56029ce52b
1 changed files with 14 additions and 18 deletions
  1. 14
    18
      src/gallium/drivers/r300/r300_render.c

+ 14
- 18
src/gallium/drivers/r300/r300_render.c View File

unsigned stride[PIPE_MAX_ATTRIBS]; unsigned stride[PIPE_MAX_ATTRIBS];


/* Mapped vertex buffers. */ /* Mapped vertex buffers. */
uint32_t* map[PIPE_MAX_ATTRIBS];
uint32_t* map[PIPE_MAX_ATTRIBS] = {0};
uint32_t* mapelem[PIPE_MAX_ATTRIBS]; uint32_t* mapelem[PIPE_MAX_ATTRIBS];
struct pipe_transfer* transfer[PIPE_MAX_ATTRIBS] = {0};


CS_LOCALS(r300); CS_LOCALS(r300);


stride[i] = vbuf->stride / 4; stride[i] = vbuf->stride / 4;


/* Map the buffer. */ /* Map the buffer. */
if (!transfer[vbi]) {
map[vbi] = (uint32_t*)pipe_buffer_map(&r300->context,
r300->vbuf_mgr->real_vertex_buffer[vbi],
PIPE_TRANSFER_READ |
PIPE_TRANSFER_UNSYNCHRONIZED,
&transfer[vbi]);
if (!map[vbi]) {
map[vbi] = (uint32_t*)r300->rws->buffer_map(
r300_resource(r300->vbuf_mgr->real_vertex_buffer[vbi])->buf,
r300->cs, PIPE_TRANSFER_READ | PIPE_TRANSFER_UNSYNCHRONIZED);
map[vbi] += (vbuf->buffer_offset / 4) + stride[i] * start; map[vbi] += (vbuf->buffer_offset / 4) + stride[i] * start;
} }
mapelem[i] = map[vbi] + (velem->src_offset / 4); mapelem[i] = map[vbi] + (velem->src_offset / 4);
for (i = 0; i < vertex_element_count; i++) { for (i = 0; i < vertex_element_count; i++) {
vbi = r300->velems->velem[i].vertex_buffer_index; vbi = r300->velems->velem[i].vertex_buffer_index;


if (transfer[vbi]) {
pipe_buffer_unmap(&r300->context, transfer[vbi]);
transfer[vbi] = NULL;
if (map[vbi]) {
r300->rws->buffer_unmap(r300_resource(r300->vbuf_mgr->real_vertex_buffer[vbi])->buf);
map[vbi] = NULL;
} }
} }
} }
/* Fallback for misaligned ushort indices. */ /* Fallback for misaligned ushort indices. */
if (indexSize == 2 && (start & 1) && if (indexSize == 2 && (start & 1) &&
!r300_resource(indexBuffer)->b.user_ptr) { !r300_resource(indexBuffer)->b.user_ptr) {
struct pipe_transfer *transfer;

uint16_t *ptr = pipe_buffer_map(&r300->context, indexBuffer,
PIPE_TRANSFER_READ |
PIPE_TRANSFER_UNSYNCHRONIZED,
&transfer);
/* If we got here, then orgIndexBuffer == indexBuffer. */
uint16_t *ptr = r300->rws->buffer_map(r300_resource(orgIndexBuffer)->buf,
r300->cs,
PIPE_TRANSFER_READ |
PIPE_TRANSFER_UNSYNCHRONIZED);


if (mode == PIPE_PRIM_TRIANGLES) { if (mode == PIPE_PRIM_TRIANGLES) {
memcpy(indices3, ptr + start, 6); memcpy(indices3, ptr + start, 6);
r300_upload_index_buffer(r300, &indexBuffer, indexSize, &start, r300_upload_index_buffer(r300, &indexBuffer, indexSize, &start,
count, (uint8_t*)ptr); count, (uint8_t*)ptr);
} }
pipe_buffer_unmap(&r300->context, transfer);
r300->rws->buffer_unmap(r300_resource(orgIndexBuffer)->buf);
} else { } else {
if (r300_resource(indexBuffer)->b.user_ptr) if (r300_resource(indexBuffer)->b.user_ptr)
r300_upload_index_buffer(r300, &indexBuffer, indexSize, r300_upload_index_buffer(r300, &indexBuffer, indexSize,

Loading…
Cancel
Save