Просмотр исходного кода

r600g: consolidate vertex_buffer_update functions

tags/android-x86-2.2-r2
Marek Olšák 14 лет назад
Родитель
Сommit
73fb2b7c90

+ 30
- 79
src/gallium/drivers/r600/evergreen_state.c Просмотреть файл

@@ -1328,85 +1328,6 @@ void evergreen_polygon_offset_update(struct r600_pipe_context *rctx)
}
}

void evergreen_vertex_buffer_update(struct r600_pipe_context *rctx)
{
struct r600_pipe_state *rstate;
struct r600_resource *rbuffer;
struct pipe_vertex_buffer *vertex_buffer;
unsigned i, offset;

/* we don't update until we know vertex elements */
if (rctx->vertex_elements == NULL || !rctx->nvertex_buffer)
return;

if (rctx->vertex_elements->incompatible_layout) {
/* translate rebind new vertex elements so
* return once translated
*/
r600_begin_vertex_translate(rctx);
return;
}

if (rctx->any_user_vbs) {
r600_upload_user_buffers(rctx);
rctx->any_user_vbs = FALSE;
}

if (rctx->vertex_elements->vbuffer_need_offset) {
/* one resource per vertex elements */
rctx->nvs_resource = rctx->vertex_elements->count;
} else {
/* bind vertex buffer once */
rctx->nvs_resource = rctx->nvertex_buffer;
}

for (i = 0 ; i < rctx->nvs_resource; i++) {
rstate = &rctx->vs_resource[i];
rstate->id = R600_PIPE_STATE_RESOURCE;
rstate->nregs = 0;

if (rctx->vertex_elements->vbuffer_need_offset) {
/* one resource per vertex elements */
unsigned vbuffer_index;
vbuffer_index = rctx->vertex_elements->elements[i].vertex_buffer_index;
vertex_buffer = &rctx->vertex_buffer[vbuffer_index];
rbuffer = (struct r600_resource*)vertex_buffer->buffer;
offset = rctx->vertex_elements->vbuffer_offset[i];
} else {
/* bind vertex buffer once */
vertex_buffer = &rctx->vertex_buffer[i];
rbuffer = (struct r600_resource*)vertex_buffer->buffer;
offset = 0;
}
if (vertex_buffer == NULL || rbuffer == NULL)
continue;
offset += vertex_buffer->buffer_offset + r600_bo_offset(rbuffer->bo);

r600_pipe_state_add_reg(rstate, R_030000_RESOURCE0_WORD0,
offset, 0xFFFFFFFF, rbuffer->bo);
r600_pipe_state_add_reg(rstate, R_030004_RESOURCE0_WORD1,
rbuffer->bo_size - offset - 1, 0xFFFFFFFF, NULL);
r600_pipe_state_add_reg(rstate, R_030008_RESOURCE0_WORD2,
S_030008_STRIDE(vertex_buffer->stride),
0xFFFFFFFF, NULL);
r600_pipe_state_add_reg(rstate, R_03000C_RESOURCE0_WORD3,
S_03000C_DST_SEL_X(V_03000C_SQ_SEL_X) |
S_03000C_DST_SEL_Y(V_03000C_SQ_SEL_Y) |
S_03000C_DST_SEL_Z(V_03000C_SQ_SEL_Z) |
S_03000C_DST_SEL_W(V_03000C_SQ_SEL_W),
0xFFFFFFFF, NULL);
r600_pipe_state_add_reg(rstate, R_030010_RESOURCE0_WORD4,
0x00000000, 0xFFFFFFFF, NULL);
r600_pipe_state_add_reg(rstate, R_030014_RESOURCE0_WORD5,
0x00000000, 0xFFFFFFFF, NULL);
r600_pipe_state_add_reg(rstate, R_030018_RESOURCE0_WORD6,
0x00000000, 0xFFFFFFFF, NULL);
r600_pipe_state_add_reg(rstate, R_03001C_RESOURCE0_WORD7,
0xC0000000, 0xFFFFFFFF, NULL);
evergreen_context_pipe_state_set_fs_resource(&rctx->ctx, rstate, i);
}
}

void evergreen_pipe_shader_ps(struct pipe_context *ctx, struct r600_pipe_shader *shader)
{
struct r600_pipe_state *rstate = &shader->rstate;
@@ -1605,3 +1526,33 @@ void *evergreen_create_db_flush_dsa(struct r600_pipe_context *rctx)
S_028000_COPY_CENTROID(1), NULL);
return rstate;
}

void evergreen_pipe_add_vertex_attrib(struct r600_pipe_context *rctx,
struct r600_pipe_state *rstate,
unsigned index,
struct r600_resource *rbuffer,
unsigned offset, unsigned stride)
{
r600_pipe_state_add_reg(rstate, R_030000_RESOURCE0_WORD0,
offset, 0xFFFFFFFF, rbuffer->bo);
r600_pipe_state_add_reg(rstate, R_030004_RESOURCE0_WORD1,
rbuffer->bo_size - offset - 1, 0xFFFFFFFF, NULL);
r600_pipe_state_add_reg(rstate, R_030008_RESOURCE0_WORD2,
S_030008_STRIDE(stride),
0xFFFFFFFF, NULL);
r600_pipe_state_add_reg(rstate, R_03000C_RESOURCE0_WORD3,
S_03000C_DST_SEL_X(V_03000C_SQ_SEL_X) |
S_03000C_DST_SEL_Y(V_03000C_SQ_SEL_Y) |
S_03000C_DST_SEL_Z(V_03000C_SQ_SEL_Z) |
S_03000C_DST_SEL_W(V_03000C_SQ_SEL_W),
0xFFFFFFFF, NULL);
r600_pipe_state_add_reg(rstate, R_030010_RESOURCE0_WORD4,
0x00000000, 0xFFFFFFFF, NULL);
r600_pipe_state_add_reg(rstate, R_030014_RESOURCE0_WORD5,
0x00000000, 0xFFFFFFFF, NULL);
r600_pipe_state_add_reg(rstate, R_030018_RESOURCE0_WORD6,
0x00000000, 0xFFFFFFFF, NULL);
r600_pipe_state_add_reg(rstate, R_03001C_RESOURCE0_WORD7,
0xC0000000, 0xFFFFFFFF, NULL);
evergreen_context_pipe_state_set_fs_resource(&rctx->ctx, rstate, index);
}

+ 11
- 2
src/gallium/drivers/r600/r600_pipe.h Просмотреть файл

@@ -185,7 +185,11 @@ void evergreen_pipe_shader_ps(struct pipe_context *ctx, struct r600_pipe_shader
void evergreen_pipe_shader_vs(struct pipe_context *ctx, struct r600_pipe_shader *shader);
void *evergreen_create_db_flush_dsa(struct r600_pipe_context *rctx);
void evergreen_polygon_offset_update(struct r600_pipe_context *rctx);
void evergreen_vertex_buffer_update(struct r600_pipe_context *rctx);
void evergreen_pipe_add_vertex_attrib(struct r600_pipe_context *rctx,
struct r600_pipe_state *rstate,
unsigned index,
struct r600_resource *rbuffer,
unsigned offset, unsigned stride);

/* r600_blit.c */
void r600_init_blit_functions(struct r600_pipe_context *rctx);
@@ -224,7 +228,11 @@ void r600_spi_update(struct r600_pipe_context *rctx);
void r600_init_config(struct r600_pipe_context *rctx);
void *r600_create_db_flush_dsa(struct r600_pipe_context *rctx);
void r600_polygon_offset_update(struct r600_pipe_context *rctx);
void r600_vertex_buffer_update(struct r600_pipe_context *rctx);
void r600_pipe_add_vertex_attrib(struct r600_pipe_context *rctx,
struct r600_pipe_state *rstate,
unsigned index,
struct r600_resource *rbuffer,
unsigned offset, unsigned stride);

/* r600_helper.h */
int r600_conv_pipe_prim(unsigned pprim, unsigned *prim);
@@ -269,6 +277,7 @@ void r600_bind_ps_shader(struct pipe_context *ctx, void *state);
void r600_bind_vs_shader(struct pipe_context *ctx, void *state);
void r600_delete_ps_shader(struct pipe_context *ctx, void *state);
void r600_delete_vs_shader(struct pipe_context *ctx, void *state);
void r600_vertex_buffer_update(struct r600_pipe_context *rctx);
void r600_draw_vbo(struct pipe_context *ctx, const struct pipe_draw_info *info);

/*

+ 24
- 73
src/gallium/drivers/r600/r600_state.c Просмотреть файл

@@ -94,79 +94,6 @@ void r600_polygon_offset_update(struct r600_pipe_context *rctx)
}
}

void r600_vertex_buffer_update(struct r600_pipe_context *rctx)
{
struct r600_pipe_state *rstate;
struct r600_resource *rbuffer;
struct pipe_vertex_buffer *vertex_buffer;
unsigned i, offset;

/* we don't update until we know vertex elements */
if (rctx->vertex_elements == NULL || !rctx->nvertex_buffer)
return;

if (rctx->vertex_elements->incompatible_layout) {
/* translate rebind new vertex elements so
* return once translated
*/
r600_begin_vertex_translate(rctx);
return;
}

if (rctx->any_user_vbs) {
r600_upload_user_buffers(rctx);
rctx->any_user_vbs = FALSE;
}

if (rctx->vertex_elements->vbuffer_need_offset) {
/* one resource per vertex elements */
rctx->nvs_resource = rctx->vertex_elements->count;
} else {
/* bind vertex buffer once */
rctx->nvs_resource = rctx->nvertex_buffer;
}

for (i = 0 ; i < rctx->nvs_resource; i++) {
rstate = &rctx->vs_resource[i];
rstate->id = R600_PIPE_STATE_RESOURCE;
rstate->nregs = 0;

if (rctx->vertex_elements->vbuffer_need_offset) {
/* one resource per vertex elements */
unsigned vbuffer_index;
vbuffer_index = rctx->vertex_elements->elements[i].vertex_buffer_index;
vertex_buffer = &rctx->vertex_buffer[vbuffer_index];
rbuffer = (struct r600_resource*)vertex_buffer->buffer;
offset = rctx->vertex_elements->vbuffer_offset[i];
} else {
/* bind vertex buffer once */
vertex_buffer = &rctx->vertex_buffer[i];
rbuffer = (struct r600_resource*)vertex_buffer->buffer;
offset = 0;
}
if (vertex_buffer == NULL || rbuffer == NULL)
continue;
offset += vertex_buffer->buffer_offset + r600_bo_offset(rbuffer->bo);

r600_pipe_state_add_reg(rstate, R_038000_RESOURCE0_WORD0,
offset, 0xFFFFFFFF, rbuffer->bo);
r600_pipe_state_add_reg(rstate, R_038004_RESOURCE0_WORD1,
rbuffer->bo_size - offset - 1, 0xFFFFFFFF, NULL);
r600_pipe_state_add_reg(rstate, R_038008_RESOURCE0_WORD2,
S_038008_STRIDE(vertex_buffer->stride),
0xFFFFFFFF, NULL);
r600_pipe_state_add_reg(rstate, R_03800C_RESOURCE0_WORD3,
0x00000000, 0xFFFFFFFF, NULL);
r600_pipe_state_add_reg(rstate, R_038010_RESOURCE0_WORD4,
0x00000000, 0xFFFFFFFF, NULL);
r600_pipe_state_add_reg(rstate, R_038014_RESOURCE0_WORD5,
0x00000000, 0xFFFFFFFF, NULL);
r600_pipe_state_add_reg(rstate, R_038018_RESOURCE0_WORD6,
0xC0000000, 0xFFFFFFFF, NULL);
r600_context_pipe_state_set_fs_resource(&rctx->ctx, rstate, i);
}
}

static void r600_set_blend_color(struct pipe_context *ctx,
const struct pipe_blend_color *state)
{
@@ -1339,3 +1266,27 @@ void *r600_create_db_flush_dsa(struct r600_pipe_context *rctx)
S_028D0C_COPY_CENTROID(1), NULL);
return rstate;
}

void r600_pipe_add_vertex_attrib(struct r600_pipe_context *rctx,
struct r600_pipe_state *rstate,
unsigned index,
struct r600_resource *rbuffer,
unsigned offset, unsigned stride)
{
r600_pipe_state_add_reg(rstate, R_038000_RESOURCE0_WORD0,
offset, 0xFFFFFFFF, rbuffer->bo);
r600_pipe_state_add_reg(rstate, R_038004_RESOURCE0_WORD1,
rbuffer->bo_size - offset - 1, 0xFFFFFFFF, NULL);
r600_pipe_state_add_reg(rstate, R_038008_RESOURCE0_WORD2,
S_038008_STRIDE(stride),
0xFFFFFFFF, NULL);
r600_pipe_state_add_reg(rstate, R_03800C_RESOURCE0_WORD3,
0x00000000, 0xFFFFFFFF, NULL);
r600_pipe_state_add_reg(rstate, R_038010_RESOURCE0_WORD4,
0x00000000, 0xFFFFFFFF, NULL);
r600_pipe_state_add_reg(rstate, R_038014_RESOURCE0_WORD5,
0x00000000, 0xFFFFFFFF, NULL);
r600_pipe_state_add_reg(rstate, R_038018_RESOURCE0_WORD6,
0xC0000000, 0xFFFFFFFF, NULL);
r600_context_pipe_state_set_fs_resource(&rctx->ctx, rstate, index);
}

+ 69
- 10
src/gallium/drivers/r600/r600_state_common.c Просмотреть файл

@@ -130,11 +130,7 @@ void r600_bind_vertex_elements(struct pipe_context *ctx, void *state)
if (v) {
rctx->states[v->rstate.id] = &v->rstate;
r600_context_pipe_state_set(&rctx->ctx, &v->rstate);
if (rctx->family >= CHIP_CEDAR) {
evergreen_vertex_buffer_update(rctx);
} else {
r600_vertex_buffer_update(rctx);
}
r600_vertex_buffer_update(rctx);
}

if (v) {
@@ -216,11 +212,8 @@ void r600_set_vertex_buffers(struct pipe_context *ctx, unsigned count,
}
rctx->nvertex_buffer = count;
rctx->vb_max_index = max_index;
if (rctx->family >= CHIP_CEDAR) {
evergreen_vertex_buffer_update(rctx);
} else {
r600_vertex_buffer_update(rctx);
}

r600_vertex_buffer_update(rctx);
}


@@ -366,6 +359,72 @@ void r600_spi_update(struct r600_pipe_context *rctx)
r600_context_pipe_state_set(&rctx->ctx, &rstate);
}

void r600_vertex_buffer_update(struct r600_pipe_context *rctx)
{
struct r600_pipe_state *rstate;
struct r600_resource *rbuffer;
struct pipe_vertex_buffer *vertex_buffer;
unsigned i, offset;

/* we don't update until we know vertex elements */
if (rctx->vertex_elements == NULL || !rctx->nvertex_buffer)
return;

if (rctx->vertex_elements->incompatible_layout) {
/* translate rebind new vertex elements so
* return once translated
*/
r600_begin_vertex_translate(rctx);
return;
}

if (rctx->any_user_vbs) {
r600_upload_user_buffers(rctx);
rctx->any_user_vbs = FALSE;
}

if (rctx->vertex_elements->vbuffer_need_offset) {
/* one resource per vertex elements */
rctx->nvs_resource = rctx->vertex_elements->count;
} else {
/* bind vertex buffer once */
rctx->nvs_resource = rctx->nvertex_buffer;
}

for (i = 0 ; i < rctx->nvs_resource; i++) {
rstate = &rctx->vs_resource[i];
rstate->id = R600_PIPE_STATE_RESOURCE;
rstate->nregs = 0;

if (rctx->vertex_elements->vbuffer_need_offset) {
/* one resource per vertex elements */
unsigned vbuffer_index;
vbuffer_index = rctx->vertex_elements->elements[i].vertex_buffer_index;
vertex_buffer = &rctx->vertex_buffer[vbuffer_index];
rbuffer = (struct r600_resource*)vertex_buffer->buffer;
offset = rctx->vertex_elements->vbuffer_offset[i];
} else {
/* bind vertex buffer once */
vertex_buffer = &rctx->vertex_buffer[i];
rbuffer = (struct r600_resource*)vertex_buffer->buffer;
offset = 0;
}
if (vertex_buffer == NULL || rbuffer == NULL)
continue;
offset += vertex_buffer->buffer_offset + r600_bo_offset(rbuffer->bo);

if (rctx->family >= CHIP_CEDAR) {
evergreen_pipe_add_vertex_attrib(rctx, rstate, i,
rbuffer, offset,
vertex_buffer->stride);
} else {
r600_pipe_add_vertex_attrib(rctx, rstate, i,
rbuffer, offset,
vertex_buffer->stride);
}
}
}

void r600_draw_vbo(struct pipe_context *ctx, const struct pipe_draw_info *info)
{
struct r600_pipe_context *rctx = (struct r600_pipe_context *)ctx;

Загрузка…
Отмена
Сохранить