@@ -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); | |||
} |
@@ -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); | |||
/* |
@@ -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); | |||
} |
@@ -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; |