ilo: embed pipe_index_buffer in ilo_ib_state
Make it obvious that we save a copy of pipe_index_buffer.
This commit is contained in:
parent
73f0d6d22d
commit
7b3432b62d
|
@ -452,12 +452,12 @@ draw_vbo_with_sw_restart(struct ilo_context *ilo,
|
||||||
} u;
|
} u;
|
||||||
|
|
||||||
/* we will draw with IB mapped */
|
/* we will draw with IB mapped */
|
||||||
if (ib->buffer) {
|
if (ib->state.buffer) {
|
||||||
u.ptr = intel_bo_map(ilo_buffer(ib->buffer)->bo, false);
|
u.ptr = intel_bo_map(ilo_buffer(ib->state.buffer)->bo, false);
|
||||||
if (u.ptr)
|
if (u.ptr)
|
||||||
u.u8 += ib->offset;
|
u.u8 += ib->state.offset;
|
||||||
} else {
|
} else {
|
||||||
u.ptr = ib->user_buffer;
|
u.ptr = ib->state.user_buffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!u.ptr)
|
if (!u.ptr)
|
||||||
|
@ -483,7 +483,7 @@ draw_vbo_with_sw_restart(struct ilo_context *ilo,
|
||||||
(pipe)->draw_vbo(pipe, &subinfo); \
|
(pipe)->draw_vbo(pipe, &subinfo); \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
switch (ib->index_size) {
|
switch (ib->state.index_size) {
|
||||||
case 1:
|
case 1:
|
||||||
DRAW_VBO_WITH_SW_RESTART(&ilo->base, info, u.u8);
|
DRAW_VBO_WITH_SW_RESTART(&ilo->base, info, u.u8);
|
||||||
break;
|
break;
|
||||||
|
@ -500,8 +500,8 @@ draw_vbo_with_sw_restart(struct ilo_context *ilo,
|
||||||
|
|
||||||
#undef DRAW_VBO_WITH_SW_RESTART
|
#undef DRAW_VBO_WITH_SW_RESTART
|
||||||
|
|
||||||
if (ib->buffer)
|
if (ib->state.buffer)
|
||||||
intel_bo_unmap(ilo_buffer(ib->buffer)->bo);
|
intel_bo_unmap(ilo_buffer(ib->state.buffer)->bo);
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool
|
static bool
|
||||||
|
@ -511,9 +511,9 @@ draw_vbo_need_sw_restart(const struct ilo_context *ilo,
|
||||||
/* the restart index is fixed prior to GEN7.5 */
|
/* the restart index is fixed prior to GEN7.5 */
|
||||||
if (ilo_dev_gen(ilo->dev) < ILO_GEN(7.5)) {
|
if (ilo_dev_gen(ilo->dev) < ILO_GEN(7.5)) {
|
||||||
const unsigned cut_index =
|
const unsigned cut_index =
|
||||||
(ilo->state_vector.ib.index_size == 1) ? 0xff :
|
(ilo->state_vector.ib.state.index_size == 1) ? 0xff :
|
||||||
(ilo->state_vector.ib.index_size == 2) ? 0xffff :
|
(ilo->state_vector.ib.state.index_size == 2) ? 0xffff :
|
||||||
(ilo->state_vector.ib.index_size == 4) ? 0xffffffff : 0;
|
(ilo->state_vector.ib.state.index_size == 4) ? 0xffffffff : 0;
|
||||||
|
|
||||||
if (info->restart_index < cut_index)
|
if (info->restart_index < cut_index)
|
||||||
return true;
|
return true;
|
||||||
|
|
|
@ -368,7 +368,8 @@ finalize_index_buffer(struct ilo_context *ilo)
|
||||||
{
|
{
|
||||||
struct ilo_state_vector *vec = &ilo->state_vector;
|
struct ilo_state_vector *vec = &ilo->state_vector;
|
||||||
const bool need_upload = (vec->draw->indexed &&
|
const bool need_upload = (vec->draw->indexed &&
|
||||||
(vec->ib.user_buffer || vec->ib.offset % vec->ib.index_size));
|
(vec->ib.state.user_buffer ||
|
||||||
|
vec->ib.state.offset % vec->ib.state.index_size));
|
||||||
struct pipe_resource *current_hw_res = NULL;
|
struct pipe_resource *current_hw_res = NULL;
|
||||||
|
|
||||||
if (!(vec->dirty & ILO_DIRTY_IB) && !need_upload)
|
if (!(vec->dirty & ILO_DIRTY_IB) && !need_upload)
|
||||||
|
@ -377,45 +378,47 @@ finalize_index_buffer(struct ilo_context *ilo)
|
||||||
pipe_resource_reference(¤t_hw_res, vec->ib.hw_resource);
|
pipe_resource_reference(¤t_hw_res, vec->ib.hw_resource);
|
||||||
|
|
||||||
if (need_upload) {
|
if (need_upload) {
|
||||||
const unsigned offset = vec->ib.index_size * vec->draw->start;
|
const unsigned offset = vec->ib.state.index_size * vec->draw->start;
|
||||||
const unsigned size = vec->ib.index_size * vec->draw->count;
|
const unsigned size = vec->ib.state.index_size * vec->draw->count;
|
||||||
unsigned hw_offset;
|
unsigned hw_offset;
|
||||||
|
|
||||||
if (vec->ib.user_buffer) {
|
if (vec->ib.state.user_buffer) {
|
||||||
u_upload_data(ilo->uploader, 0, size,
|
u_upload_data(ilo->uploader, 0, size,
|
||||||
vec->ib.user_buffer + offset, &hw_offset, &vec->ib.hw_resource);
|
vec->ib.state.user_buffer + offset,
|
||||||
}
|
&hw_offset, &vec->ib.hw_resource);
|
||||||
else {
|
} else {
|
||||||
u_upload_buffer(ilo->uploader, 0, vec->ib.offset + offset, size,
|
u_upload_buffer(ilo->uploader, 0,
|
||||||
vec->ib.buffer, &hw_offset, &vec->ib.hw_resource);
|
vec->ib.state.offset + offset, size, vec->ib.state.buffer,
|
||||||
|
&hw_offset, &vec->ib.hw_resource);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* the HW offset should be aligned */
|
/* the HW offset should be aligned */
|
||||||
assert(hw_offset % vec->ib.index_size == 0);
|
assert(hw_offset % vec->ib.state.index_size == 0);
|
||||||
vec->ib.draw_start_offset = hw_offset / vec->ib.index_size;
|
vec->ib.draw_start_offset = hw_offset / vec->ib.state.index_size;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* INDEX[vec->draw->start] in the original buffer is INDEX[0] in the HW
|
* INDEX[vec->draw->start] in the original buffer is INDEX[0] in the HW
|
||||||
* resource
|
* resource
|
||||||
*/
|
*/
|
||||||
vec->ib.draw_start_offset -= vec->draw->start;
|
vec->ib.draw_start_offset -= vec->draw->start;
|
||||||
}
|
} else {
|
||||||
else {
|
pipe_resource_reference(&vec->ib.hw_resource, vec->ib.state.buffer);
|
||||||
pipe_resource_reference(&vec->ib.hw_resource, vec->ib.buffer);
|
|
||||||
|
|
||||||
/* note that index size may be zero when the draw is not indexed */
|
/* note that index size may be zero when the draw is not indexed */
|
||||||
if (vec->draw->indexed)
|
if (vec->draw->indexed) {
|
||||||
vec->ib.draw_start_offset = vec->ib.offset / vec->ib.index_size;
|
vec->ib.draw_start_offset =
|
||||||
else
|
vec->ib.state.offset / vec->ib.state.index_size;
|
||||||
|
} else {
|
||||||
vec->ib.draw_start_offset = 0;
|
vec->ib.draw_start_offset = 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* treat the IB as clean if the HW states do not change */
|
/* treat the IB as clean if the HW states do not change */
|
||||||
if (vec->ib.hw_resource == current_hw_res &&
|
if (vec->ib.hw_resource == current_hw_res &&
|
||||||
vec->ib.hw_index_size == vec->ib.index_size)
|
vec->ib.hw_index_size == vec->ib.state.index_size)
|
||||||
vec->dirty &= ~ILO_DIRTY_IB;
|
vec->dirty &= ~ILO_DIRTY_IB;
|
||||||
else
|
else
|
||||||
vec->ib.hw_index_size = vec->ib.index_size;
|
vec->ib.hw_index_size = vec->ib.state.index_size;
|
||||||
|
|
||||||
pipe_resource_reference(¤t_hw_res, NULL);
|
pipe_resource_reference(¤t_hw_res, NULL);
|
||||||
}
|
}
|
||||||
|
@ -1809,16 +1812,11 @@ ilo_set_index_buffer(struct pipe_context *pipe,
|
||||||
struct ilo_state_vector *vec = &ilo_context(pipe)->state_vector;
|
struct ilo_state_vector *vec = &ilo_context(pipe)->state_vector;
|
||||||
|
|
||||||
if (state) {
|
if (state) {
|
||||||
pipe_resource_reference(&vec->ib.buffer, state->buffer);
|
pipe_resource_reference(&vec->ib.state.buffer, state->buffer);
|
||||||
vec->ib.user_buffer = state->user_buffer;
|
vec->ib.state = *state;
|
||||||
vec->ib.offset = state->offset;
|
} else {
|
||||||
vec->ib.index_size = state->index_size;
|
pipe_resource_reference(&vec->ib.state.buffer, NULL);
|
||||||
}
|
memset(&vec->ib.state, 0, sizeof(vec->ib.state));
|
||||||
else {
|
|
||||||
pipe_resource_reference(&vec->ib.buffer, NULL);
|
|
||||||
vec->ib.user_buffer = NULL;
|
|
||||||
vec->ib.offset = 0;
|
|
||||||
vec->ib.index_size = 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
vec->dirty |= ILO_DIRTY_IB;
|
vec->dirty |= ILO_DIRTY_IB;
|
||||||
|
@ -2292,7 +2290,7 @@ ilo_state_vector_cleanup(struct ilo_state_vector *vec)
|
||||||
pipe_resource_reference(&vec->vb.states[i].buffer, NULL);
|
pipe_resource_reference(&vec->vb.states[i].buffer, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
pipe_resource_reference(&vec->ib.buffer, NULL);
|
pipe_resource_reference(&vec->ib.state.buffer, NULL);
|
||||||
pipe_resource_reference(&vec->ib.hw_resource, NULL);
|
pipe_resource_reference(&vec->ib.hw_resource, NULL);
|
||||||
|
|
||||||
for (i = 0; i < vec->so.count; i++)
|
for (i = 0; i < vec->so.count; i++)
|
||||||
|
@ -2355,7 +2353,7 @@ ilo_state_vector_resource_renamed(struct ilo_state_vector *vec,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (vec->ib.buffer == res) {
|
if (vec->ib.state.buffer == res) {
|
||||||
states |= ILO_DIRTY_IB;
|
states |= ILO_DIRTY_IB;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -162,10 +162,7 @@ struct ilo_vb_state {
|
||||||
};
|
};
|
||||||
|
|
||||||
struct ilo_ib_state {
|
struct ilo_ib_state {
|
||||||
struct pipe_resource *buffer;
|
struct pipe_index_buffer state;
|
||||||
const void *user_buffer;
|
|
||||||
unsigned offset;
|
|
||||||
unsigned index_size;
|
|
||||||
|
|
||||||
/* these are not valid until the state is finalized */
|
/* these are not valid until the state is finalized */
|
||||||
struct pipe_resource *hw_resource;
|
struct pipe_resource *hw_resource;
|
||||||
|
|
Loading…
Reference in New Issue