summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEric Anholt <eric@anholt.net>2011-11-30 08:27:53 -0800
committerEric Anholt <eric@anholt.net>2011-12-07 13:38:51 -0800
commite0d67a3a8b4ec73df7e6f818989480a3dd1ee706 (patch)
tree79b8a4595e8a5c5dddf61e76a7d6879d7634c436
parented3aeb56ec3fde24c2fc69515c0b5d348b41caf3 (diff)
intel: Track miptrees for fake packed depth/stencil renderbuffers.
Right now the fake packed d/s RBs are creating two sub-renderbuffers with their own storage, and the hardware setup and the mapping code have been explicitly referencing them. By setting miptrees on them, we'll be able to make our renderbuffer code for fake packed depth/stencil more consistent with all our other renderbuffers. The interesting new behavior here is that there is now a mt with a non-depthstencil format (X8Z24) that has a stencil_mt field associated. This looks like it should be safe, and we'll need to be able to do this for floating point depth/stencil as well.
-rw-r--r--src/mesa/drivers/dri/intel/intel_fbo.c10
1 files changed, 10 insertions, 0 deletions
diff --git a/src/mesa/drivers/dri/intel/intel_fbo.c b/src/mesa/drivers/dri/intel/intel_fbo.c
index de4abab7488..8b72eb798d1 100644
--- a/src/mesa/drivers/dri/intel/intel_fbo.c
+++ b/src/mesa/drivers/dri/intel/intel_fbo.c
@@ -591,6 +591,7 @@ intel_alloc_renderbuffer_storage(struct gl_context * ctx, struct gl_renderbuffer
bool ok = true;
struct gl_renderbuffer *depth_rb;
struct gl_renderbuffer *stencil_rb;
+ struct intel_renderbuffer *depth_irb, *stencil_irb;
depth_rb = intel_create_wrapped_renderbuffer(ctx, width, height,
MESA_FORMAT_X8_Z24);
@@ -614,6 +615,12 @@ intel_alloc_renderbuffer_storage(struct gl_context * ctx, struct gl_renderbuffer
return false;
}
+ depth_irb = intel_renderbuffer(depth_rb);
+ stencil_irb = intel_renderbuffer(stencil_rb);
+
+ intel_miptree_reference(&depth_irb->mt->stencil_mt, stencil_irb->mt);
+ intel_miptree_reference(&irb->mt, depth_irb->mt);
+
depth_rb->Wrapped = rb;
stencil_rb->Wrapped = rb;
_mesa_reference_renderbuffer(&irb->wrapped_depth, depth_rb);
@@ -953,6 +960,9 @@ intel_renderbuffer_update_wrapper(struct intel_context *intel,
if (!ok)
return false;
}
+
+ intel_miptree_reference(&depth_irb->mt->stencil_mt, stencil_irb->mt);
+ intel_miptree_reference(&irb->mt, depth_irb->mt);
} else {
intel_miptree_reference(&irb->mt, mt);
intel_renderbuffer_set_draw_offset(irb);