ilo: clean up ilo_set_constant_buffer()

Add loops that will be optimized away.
This commit is contained in:
Chia-I Wu 2013-06-28 13:56:36 +08:00
parent 11d283cde9
commit 7ea3ed81c8
1 changed files with 46 additions and 31 deletions

View File

@ -587,51 +587,66 @@ ilo_set_clip_state(struct pipe_context *pipe,
static void
ilo_set_constant_buffer(struct pipe_context *pipe,
uint shader, uint index,
struct pipe_constant_buffer *state)
struct pipe_constant_buffer *buf)
{
struct ilo_context *ilo = ilo_context(pipe);
struct ilo_cbuf_cso *cbuf;
struct ilo_cbuf_state *cbuf = &ilo->cbuf[shader];
const unsigned count = 1;
unsigned i;
assert(shader < Elements(ilo->cbuf));
assert(index < Elements(ilo->cbuf[shader].cso));
assert(index + count <= Elements(ilo->cbuf[shader].cso));
cbuf = &ilo->cbuf[shader].cso[index];
if (buf) {
for (i = 0; i < count; i++) {
struct ilo_cbuf_cso *cso = &cbuf->cso[index + i];
if (state) {
pipe_resource_reference(&cbuf->resource, state->buffer);
pipe_resource_reference(&cso->resource, buf[i].buffer);
if (state->buffer) {
const enum pipe_format elem_format = PIPE_FORMAT_R32G32B32A32_FLOAT;
if (buf[i].buffer) {
const enum pipe_format elem_format =
PIPE_FORMAT_R32G32B32A32_FLOAT;
ilo_gpe_init_view_surface_for_buffer(ilo->dev,
ilo_buffer(cbuf->resource),
state->buffer_offset, state->buffer_size,
util_format_get_blocksize(elem_format), elem_format,
false, false, &cbuf->surface);
ilo_gpe_init_view_surface_for_buffer(ilo->dev,
ilo_buffer(buf[i].buffer),
buf[i].buffer_offset, buf[i].buffer_size,
util_format_get_blocksize(elem_format), elem_format,
false, false, &cso->surface);
cbuf->user_buffer = NULL;
cbuf->user_buffer_size = 0;
cso->user_buffer = NULL;
cso->user_buffer_size = 0;
cbuf->enabled_mask |= 1 << (index + i);
}
else if (buf[i].user_buffer) {
cso->surface.bo = NULL;
/* buffer_offset does not apply for user buffer */
cso->user_buffer = buf[i].user_buffer;
cso->user_buffer_size = buf[i].buffer_size;
cbuf->enabled_mask |= 1 << (index + i);
}
else {
cso->surface.bo = NULL;
cso->user_buffer = NULL;
cso->user_buffer_size = 0;
cbuf->enabled_mask &= ~(1 << (index + i));
}
}
else {
assert(state->user_buffer);
cbuf->surface.bo = NULL;
/* state->buffer_offset does not apply for user buffer */
cbuf->user_buffer = state->user_buffer;
cbuf->user_buffer_size = state->buffer_size;
}
ilo->cbuf[shader].enabled_mask |= 1 << index;
}
else {
pipe_resource_reference(&cbuf->resource, NULL);
cbuf->surface.bo = NULL;
for (i = 0; i < count; i++) {
struct ilo_cbuf_cso *cso = &cbuf->cso[index + i];
cbuf->user_buffer = NULL;
cbuf->user_buffer_size = 0;
pipe_resource_reference(&cso->resource, NULL);
cso->surface.bo = NULL;
cso->user_buffer = NULL;
cso->user_buffer_size = 0;
ilo->cbuf[shader].enabled_mask &= ~(1 << index);
cbuf->enabled_mask &= ~(1 << (index + i));
}
}
ilo->dirty |= ILO_DIRTY_CBUF;