r300g: fix and cleanup flushing before clearing CMASK, ZMASK, and HIZ
This commit is contained in:
@@ -295,12 +295,14 @@ static void r300_clear(struct pipe_context* pipe,
|
|||||||
r300_depth_clear_value(fb->zsbuf->format, depth, stencil);
|
r300_depth_clear_value(fb->zsbuf->format, depth, stencil);
|
||||||
|
|
||||||
r300_mark_atom_dirty(r300, &r300->zmask_clear);
|
r300_mark_atom_dirty(r300, &r300->zmask_clear);
|
||||||
|
r300_mark_atom_dirty(r300, &r300->gpu_flush);
|
||||||
buffers &= ~PIPE_CLEAR_DEPTHSTENCIL;
|
buffers &= ~PIPE_CLEAR_DEPTHSTENCIL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (hiz_clear) {
|
if (hiz_clear) {
|
||||||
r300->hiz_clear_value = r300_hiz_clear_value(depth);
|
r300->hiz_clear_value = r300_hiz_clear_value(depth);
|
||||||
r300_mark_atom_dirty(r300, &r300->hiz_clear);
|
r300_mark_atom_dirty(r300, &r300->hiz_clear);
|
||||||
|
r300_mark_atom_dirty(r300, &r300->gpu_flush);
|
||||||
}
|
}
|
||||||
r300->num_z_clears++;
|
r300->num_z_clears++;
|
||||||
}
|
}
|
||||||
@@ -339,6 +341,7 @@ static void r300_clear(struct pipe_context* pipe,
|
|||||||
if (r300->screen->cmask_resource == fb->cbufs[0]->texture) {
|
if (r300->screen->cmask_resource == fb->cbufs[0]->texture) {
|
||||||
r300_set_clear_color(r300, color);
|
r300_set_clear_color(r300, color);
|
||||||
r300_mark_atom_dirty(r300, &r300->cmask_clear);
|
r300_mark_atom_dirty(r300, &r300->cmask_clear);
|
||||||
|
r300_mark_atom_dirty(r300, &r300->gpu_flush);
|
||||||
buffers &= ~PIPE_CLEAR_COLOR;
|
buffers &= ~PIPE_CLEAR_COLOR;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -375,6 +378,7 @@ static void r300_clear(struct pipe_context* pipe,
|
|||||||
* procedure. */
|
* procedure. */
|
||||||
/* Calculate zmask_clear and hiz_clear atom sizes. */
|
/* Calculate zmask_clear and hiz_clear atom sizes. */
|
||||||
unsigned dwords =
|
unsigned dwords =
|
||||||
|
r300->gpu_flush.size +
|
||||||
(r300->zmask_clear.dirty ? r300->zmask_clear.size : 0) +
|
(r300->zmask_clear.dirty ? r300->zmask_clear.size : 0) +
|
||||||
(r300->hiz_clear.dirty ? r300->hiz_clear.size : 0) +
|
(r300->hiz_clear.dirty ? r300->hiz_clear.size : 0) +
|
||||||
(r300->cmask_clear.dirty ? r300->cmask_clear.size : 0) +
|
(r300->cmask_clear.dirty ? r300->cmask_clear.size : 0) +
|
||||||
@@ -386,6 +390,9 @@ static void r300_clear(struct pipe_context* pipe,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Emit clear packets. */
|
/* Emit clear packets. */
|
||||||
|
r300_emit_gpu_flush(r300, r300->gpu_flush.size, r300->gpu_flush.state);
|
||||||
|
r300->gpu_flush.dirty = FALSE;
|
||||||
|
|
||||||
if (r300->zmask_clear.dirty) {
|
if (r300->zmask_clear.dirty) {
|
||||||
r300_emit_zmask_clear(r300, r300->zmask_clear.size,
|
r300_emit_zmask_clear(r300, r300->zmask_clear.size,
|
||||||
r300->zmask_clear.state);
|
r300->zmask_clear.state);
|
||||||
|
@@ -204,9 +204,9 @@ static boolean r300_setup_atoms(struct r300_context* r300)
|
|||||||
R300_INIT_ATOM(texture_cache_inval, 2);
|
R300_INIT_ATOM(texture_cache_inval, 2);
|
||||||
R300_INIT_ATOM(textures_state, 0);
|
R300_INIT_ATOM(textures_state, 0);
|
||||||
/* Clear commands */
|
/* Clear commands */
|
||||||
R300_INIT_ATOM(hiz_clear, r300->screen->caps.hiz_ram > 0 ? 6 : 0);
|
R300_INIT_ATOM(hiz_clear, r300->screen->caps.hiz_ram > 0 ? 4 : 0);
|
||||||
R300_INIT_ATOM(zmask_clear, r300->screen->caps.zmask_ram > 0 ? 6 : 0);
|
R300_INIT_ATOM(zmask_clear, r300->screen->caps.zmask_ram > 0 ? 4 : 0);
|
||||||
R300_INIT_ATOM(cmask_clear, 6);
|
R300_INIT_ATOM(cmask_clear, 4);
|
||||||
/* ZB (unpipelined), SU. */
|
/* ZB (unpipelined), SU. */
|
||||||
R300_INIT_ATOM(query_start, 4);
|
R300_INIT_ATOM(query_start, 4);
|
||||||
|
|
||||||
|
@@ -487,6 +487,13 @@ struct r300_context {
|
|||||||
* performance and stability if not handled with care. */
|
* performance and stability if not handled with care. */
|
||||||
/* GPU flush. */
|
/* GPU flush. */
|
||||||
struct r300_atom gpu_flush;
|
struct r300_atom gpu_flush;
|
||||||
|
/* Clears must be emitted immediately after the flush. */
|
||||||
|
/* HiZ clear */
|
||||||
|
struct r300_atom hiz_clear;
|
||||||
|
/* zmask clear */
|
||||||
|
struct r300_atom zmask_clear;
|
||||||
|
/* cmask clear */
|
||||||
|
struct r300_atom cmask_clear;
|
||||||
/* Anti-aliasing (MSAA) state. */
|
/* Anti-aliasing (MSAA) state. */
|
||||||
struct r300_atom aa_state;
|
struct r300_atom aa_state;
|
||||||
/* Framebuffer state. */
|
/* Framebuffer state. */
|
||||||
@@ -537,12 +544,6 @@ struct r300_context {
|
|||||||
struct r300_atom texture_cache_inval;
|
struct r300_atom texture_cache_inval;
|
||||||
/* Textures state. */
|
/* Textures state. */
|
||||||
struct r300_atom textures_state;
|
struct r300_atom textures_state;
|
||||||
/* HiZ clear */
|
|
||||||
struct r300_atom hiz_clear;
|
|
||||||
/* zmask clear */
|
|
||||||
struct r300_atom zmask_clear;
|
|
||||||
/* cmask clear */
|
|
||||||
struct r300_atom cmask_clear;
|
|
||||||
/* Occlusion query. */
|
/* Occlusion query. */
|
||||||
struct r300_atom query_start;
|
struct r300_atom query_start;
|
||||||
|
|
||||||
|
@@ -1210,9 +1210,6 @@ void r300_emit_hiz_clear(struct r300_context *r300, unsigned size, void *state)
|
|||||||
tex = r300_resource(fb->zsbuf->texture);
|
tex = r300_resource(fb->zsbuf->texture);
|
||||||
|
|
||||||
BEGIN_CS(size);
|
BEGIN_CS(size);
|
||||||
OUT_CS_REG(R300_ZB_ZCACHE_CTLSTAT,
|
|
||||||
R300_ZB_ZCACHE_CTLSTAT_ZC_FLUSH_FLUSH_AND_FREE |
|
|
||||||
R300_ZB_ZCACHE_CTLSTAT_ZC_FREE_FREE);
|
|
||||||
OUT_CS_PKT3(R300_PACKET3_3D_CLEAR_HIZ, 2);
|
OUT_CS_PKT3(R300_PACKET3_3D_CLEAR_HIZ, 2);
|
||||||
OUT_CS(0);
|
OUT_CS(0);
|
||||||
OUT_CS(tex->tex.hiz_dwords[fb->zsbuf->u.tex.level]);
|
OUT_CS(tex->tex.hiz_dwords[fb->zsbuf->u.tex.level]);
|
||||||
@@ -1235,9 +1232,6 @@ void r300_emit_zmask_clear(struct r300_context *r300, unsigned size, void *state
|
|||||||
tex = r300_resource(fb->zsbuf->texture);
|
tex = r300_resource(fb->zsbuf->texture);
|
||||||
|
|
||||||
BEGIN_CS(size);
|
BEGIN_CS(size);
|
||||||
OUT_CS_REG(R300_ZB_ZCACHE_CTLSTAT,
|
|
||||||
R300_ZB_ZCACHE_CTLSTAT_ZC_FLUSH_FLUSH_AND_FREE |
|
|
||||||
R300_ZB_ZCACHE_CTLSTAT_ZC_FREE_FREE);
|
|
||||||
OUT_CS_PKT3(R300_PACKET3_3D_CLEAR_ZMASK, 2);
|
OUT_CS_PKT3(R300_PACKET3_3D_CLEAR_ZMASK, 2);
|
||||||
OUT_CS(0);
|
OUT_CS(0);
|
||||||
OUT_CS(tex->tex.zmask_dwords[fb->zsbuf->u.tex.level]);
|
OUT_CS(tex->tex.zmask_dwords[fb->zsbuf->u.tex.level]);
|
||||||
@@ -1259,9 +1253,6 @@ void r300_emit_cmask_clear(struct r300_context *r300, unsigned size, void *state
|
|||||||
tex = r300_resource(fb->cbufs[0]->texture);
|
tex = r300_resource(fb->cbufs[0]->texture);
|
||||||
|
|
||||||
BEGIN_CS(size);
|
BEGIN_CS(size);
|
||||||
OUT_CS_REG(R300_RB3D_DSTCACHE_CTLSTAT,
|
|
||||||
R300_RB3D_DSTCACHE_CTLSTAT_DC_FREE_FREE_3D_TAGS |
|
|
||||||
R300_RB3D_DSTCACHE_CTLSTAT_DC_FLUSH_FLUSH_DIRTY_3D);
|
|
||||||
OUT_CS_PKT3(R300_PACKET3_3D_CLEAR_CMASK, 2);
|
OUT_CS_PKT3(R300_PACKET3_3D_CLEAR_CMASK, 2);
|
||||||
OUT_CS(0);
|
OUT_CS(0);
|
||||||
OUT_CS(tex->tex.cmask_dwords);
|
OUT_CS(tex->tex.cmask_dwords);
|
||||||
|
Reference in New Issue
Block a user