r600g: don't flush caches when binding shader resources
Reviewed-by: Alex Deucher <alexander.deucher@amd.com> Tested-by: Grazvydas Ignotas <notasas@gmail.com> Tested-by: Dieter Nützel <Dieter@nuetzel-hh.de>
This commit is contained in:
@@ -1287,20 +1287,17 @@ static void evergreen_set_framebuffer_state(struct pipe_context *ctx,
|
||||
struct r600_texture *rtex;
|
||||
uint32_t i, log_samples;
|
||||
|
||||
if (rctx->framebuffer.state.nr_cbufs) {
|
||||
rctx->b.flags |= R600_CONTEXT_WAIT_3D_IDLE | R600_CONTEXT_FLUSH_AND_INV;
|
||||
rctx->b.flags |= R600_CONTEXT_FLUSH_AND_INV_CB |
|
||||
R600_CONTEXT_FLUSH_AND_INV_CB_META;
|
||||
}
|
||||
if (rctx->framebuffer.state.zsbuf) {
|
||||
rctx->b.flags |= R600_CONTEXT_WAIT_3D_IDLE | R600_CONTEXT_FLUSH_AND_INV;
|
||||
rctx->b.flags |= R600_CONTEXT_FLUSH_AND_INV_DB;
|
||||
|
||||
rtex = (struct r600_texture*)rctx->framebuffer.state.zsbuf->texture;
|
||||
if (rtex->htile_buffer) {
|
||||
rctx->b.flags |= R600_CONTEXT_FLUSH_AND_INV_DB_META;
|
||||
}
|
||||
}
|
||||
/* Flush TC when changing the framebuffer state, because the only
|
||||
* client not using TC that can change textures is the framebuffer.
|
||||
* Other places don't typically have to flush TC.
|
||||
*/
|
||||
rctx->b.flags |= R600_CONTEXT_WAIT_3D_IDLE |
|
||||
R600_CONTEXT_FLUSH_AND_INV |
|
||||
R600_CONTEXT_FLUSH_AND_INV_CB |
|
||||
R600_CONTEXT_FLUSH_AND_INV_CB_META |
|
||||
R600_CONTEXT_FLUSH_AND_INV_DB |
|
||||
R600_CONTEXT_FLUSH_AND_INV_DB_META |
|
||||
R600_CONTEXT_INV_TEX_CACHE;
|
||||
|
||||
util_copy_framebuffer_state(&rctx->framebuffer.state, state);
|
||||
|
||||
|
||||
@@ -95,6 +95,10 @@ void r600_flush_emit(struct r600_context *rctx)
|
||||
return;
|
||||
}
|
||||
|
||||
/* Ensure coherency between streamout and shaders. */
|
||||
if (rctx->b.flags & R600_CONTEXT_STREAMOUT_FLUSH)
|
||||
rctx->b.flags |= r600_get_flush_flags(R600_COHERENCY_SHADER);
|
||||
|
||||
if (rctx->b.flags & R600_CONTEXT_WAIT_3D_IDLE) {
|
||||
wait_until |= S_008040_WAIT_3D_IDLE(1);
|
||||
}
|
||||
|
||||
@@ -1099,20 +1099,17 @@ static void r600_set_framebuffer_state(struct pipe_context *ctx,
|
||||
struct r600_texture *rtex;
|
||||
unsigned i;
|
||||
|
||||
if (rctx->framebuffer.state.nr_cbufs) {
|
||||
rctx->b.flags |= R600_CONTEXT_WAIT_3D_IDLE | R600_CONTEXT_FLUSH_AND_INV;
|
||||
rctx->b.flags |= R600_CONTEXT_FLUSH_AND_INV_CB |
|
||||
R600_CONTEXT_FLUSH_AND_INV_CB_META;
|
||||
}
|
||||
if (rctx->framebuffer.state.zsbuf) {
|
||||
rctx->b.flags |= R600_CONTEXT_WAIT_3D_IDLE | R600_CONTEXT_FLUSH_AND_INV;
|
||||
rctx->b.flags |= R600_CONTEXT_FLUSH_AND_INV_DB;
|
||||
|
||||
rtex = (struct r600_texture*)rctx->framebuffer.state.zsbuf->texture;
|
||||
if (rctx->b.chip_class >= R700 && rtex->htile_buffer) {
|
||||
rctx->b.flags |= R600_CONTEXT_FLUSH_AND_INV_DB_META;
|
||||
}
|
||||
}
|
||||
/* Flush TC when changing the framebuffer state, because the only
|
||||
* client not using TC that can change textures is the framebuffer.
|
||||
* Other places don't typically have to flush TC.
|
||||
*/
|
||||
rctx->b.flags |= R600_CONTEXT_WAIT_3D_IDLE |
|
||||
R600_CONTEXT_FLUSH_AND_INV |
|
||||
R600_CONTEXT_FLUSH_AND_INV_CB |
|
||||
R600_CONTEXT_FLUSH_AND_INV_CB_META |
|
||||
R600_CONTEXT_FLUSH_AND_INV_DB |
|
||||
R600_CONTEXT_FLUSH_AND_INV_DB_META |
|
||||
R600_CONTEXT_INV_TEX_CACHE;
|
||||
|
||||
/* Set the new state. */
|
||||
util_copy_framebuffer_state(&rctx->framebuffer.state, state);
|
||||
|
||||
@@ -533,7 +533,6 @@ static void r600_set_index_buffer(struct pipe_context *ctx,
|
||||
void r600_vertex_buffers_dirty(struct r600_context *rctx)
|
||||
{
|
||||
if (rctx->vertex_buffer_state.dirty_mask) {
|
||||
rctx->b.flags |= R600_CONTEXT_INV_VERTEX_CACHE;
|
||||
rctx->vertex_buffer_state.atom.num_dw = (rctx->b.chip_class >= EVERGREEN ? 12 : 11) *
|
||||
util_bitcount(rctx->vertex_buffer_state.dirty_mask);
|
||||
r600_mark_atom_dirty(rctx, &rctx->vertex_buffer_state.atom);
|
||||
@@ -590,7 +589,6 @@ void r600_sampler_views_dirty(struct r600_context *rctx,
|
||||
struct r600_samplerview_state *state)
|
||||
{
|
||||
if (state->dirty_mask) {
|
||||
rctx->b.flags |= R600_CONTEXT_INV_TEX_CACHE;
|
||||
state->atom.num_dw = (rctx->b.chip_class >= EVERGREEN ? 14 : 13) *
|
||||
util_bitcount(state->dirty_mask);
|
||||
r600_mark_atom_dirty(rctx, &state->atom);
|
||||
@@ -1048,7 +1046,6 @@ static void r600_delete_tes_state(struct pipe_context *ctx, void *state)
|
||||
void r600_constant_buffers_dirty(struct r600_context *rctx, struct r600_constbuf_state *state)
|
||||
{
|
||||
if (state->dirty_mask) {
|
||||
rctx->b.flags |= R600_CONTEXT_INV_CONST_CACHE;
|
||||
state->atom.num_dw = rctx->b.chip_class >= EVERGREEN ? util_bitcount(state->dirty_mask)*20
|
||||
: util_bitcount(state->dirty_mask)*19;
|
||||
r600_mark_atom_dirty(rctx, &state->atom);
|
||||
|
||||
Reference in New Issue
Block a user