summaryrefslogtreecommitdiff
path: root/src/gallium/drivers/r600/evergreen_state.c
diff options
context:
space:
mode:
authorMarek Olšák <maraeo@gmail.com>2012-08-14 20:42:35 +0200
committerMarek Olšák <maraeo@gmail.com>2012-09-27 19:14:44 +0200
commit9f5d6320f2ee1e8147866030212f9924c6b3bf60 (patch)
treeeb47d8fa3d5efa47c9c859ccfe1b75bab4f6bd08 /src/gallium/drivers/r600/evergreen_state.c
parentb1d0fe022dc4826dadce014ab8fe062a82f75a16 (diff)
downloadmesa-9f5d6320f2ee1e8147866030212f9924c6b3bf60.tar.gz
r600g: use invalid DB hardware formats to disable depth/stencil
Diffstat (limited to 'src/gallium/drivers/r600/evergreen_state.c')
-rw-r--r--src/gallium/drivers/r600/evergreen_state.c17
1 files changed, 15 insertions, 2 deletions
diff --git a/src/gallium/drivers/r600/evergreen_state.c b/src/gallium/drivers/r600/evergreen_state.c
index 3f4ee8e952f..98dbb2f5e69 100644
--- a/src/gallium/drivers/r600/evergreen_state.c
+++ b/src/gallium/drivers/r600/evergreen_state.c
@@ -1434,10 +1434,15 @@ static void evergreen_init_depth_surface(struct r600_context *rctx,
stencil_offset >>= 8;
surf->db_stencil_base = stencil_offset;
- surf->db_stencil_info = 1 | S_028044_TILE_SPLIT(stile_split);
+ surf->db_stencil_info = S_028044_FORMAT(V_028044_STENCIL_8) |
+ S_028044_TILE_SPLIT(stile_split);
} else {
surf->db_stencil_base = offset;
- surf->db_stencil_info = 1;
+ /* DRM 2.6.18 allows the INVALID format to disable stencil.
+ * Older kernels are out of luck. */
+ surf->db_stencil_info = rctx->screen->info.drm_minor >= 18 ?
+ S_028044_FORMAT(V_028044_STENCIL_INVALID) :
+ S_028044_FORMAT(V_028044_STENCIL_8);
}
surf->depth_initialized = true;
@@ -1575,6 +1580,8 @@ static void evergreen_set_framebuffer_state(struct pipe_context *ctx,
rctx->framebuffer.atom.num_dw += 21;
if (rctx->keep_tiling_flags)
rctx->framebuffer.atom.num_dw += 2;
+ } else if (rctx->screen->info.drm_minor >= 18) {
+ rctx->framebuffer.atom.num_dw += 4;
}
r600_atom_dirty(rctx, &rctx->framebuffer.atom);
@@ -1903,6 +1910,12 @@ static void evergreen_emit_framebuffer_state(struct r600_context *rctx, struct r
r600_write_value(cs, PKT3(PKT3_NOP, 0, 0)); /* R_028054_DB_STENCIL_WRITE_BASE */
r600_write_value(cs, reloc);
+ } else if (rctx->screen->info.drm_minor >= 18) {
+ /* DRM 2.6.18 allows the INVALID format to disable depth/stencil.
+ * Older kernels are out of luck. */
+ r600_write_context_reg_seq(cs, R_028040_DB_Z_INFO, 2);
+ r600_write_value(cs, S_028040_FORMAT(V_028040_Z_INVALID)); /* R_028040_DB_Z_INFO */
+ r600_write_value(cs, S_028044_FORMAT(V_028044_STENCIL_INVALID)); /* R_028044_DB_STENCIL_INFO */
}
/* Framebuffer dimensions. */