[Mesa-dev] [PATCH 30/41] intel: Resolve buffers in intelSpanRenderStart

Chad Versace chad.versace at linux.intel.com
Thu Nov 17 19:58:57 PST 2011


Resolve all buffers that will be mapped by intelSpanRenderStart. This
comprises resolving the depth buffer of each enabled texture and of the
read and draw buffers.

Signed-off-by: Chad Versace <chad.versace at linux.intel.com>
---
 src/mesa/drivers/dri/intel/intel_span.c |   40 ++++++++++++++++++++++++++++++-
 1 files changed, 39 insertions(+), 1 deletions(-)

diff --git a/src/mesa/drivers/dri/intel/intel_span.c b/src/mesa/drivers/dri/intel/intel_span.c
index e73e804..042bc30 100644
--- a/src/mesa/drivers/dri/intel/intel_span.c
+++ b/src/mesa/drivers/dri/intel/intel_span.c
@@ -254,6 +254,42 @@ intel_framebuffer_unmap(struct intel_context *intel, struct gl_framebuffer *fb)
 }
 
 /**
+ * Resolve all buffers that will be mapped by intelSpanRenderStart().
+ *
+ * Resolve the depth buffer of each enabled texture and of the read and draw
+ * buffers.
+ *
+ * (Note: In the future this will also perform MSAA resolves.)
+ */
+static void
+intel_span_resolve_buffers(struct intel_context *intel)
+{
+   struct gl_context *ctx = &intel->ctx;
+   struct intel_renderbuffer *draw_irb;
+   struct intel_renderbuffer *read_irb;
+   struct intel_texture_object *tex_obj;
+
+   /* Resolve depth buffer of each enabled texture. */
+   for (int i = 0; i < ctx->Const.MaxTextureImageUnits; i++) {
+      if (!ctx->Texture.Unit[i]._ReallyEnabled)
+	 continue;
+      tex_obj = intel_texture_object(ctx->Texture.Unit[i]._Current);
+      intel_finalize_mipmap_tree(intel, i);
+      if (!tex_obj || !tex_obj->mt)
+	 continue;
+      intel_miptree_all_slices_resolve_depth(intel, tex_obj->mt);
+   }
+
+   /* Resolve each attached depth buffer. */
+   draw_irb = intel_get_renderbuffer(ctx->DrawBuffer, BUFFER_DEPTH);
+   read_irb = intel_get_renderbuffer(ctx->ReadBuffer, BUFFER_DEPTH);
+   if (draw_irb)
+      intel_renderbuffer_resolve_depth(intel, draw_irb);
+   if (read_irb != draw_irb && read_irb)
+      intel_renderbuffer_resolve_depth(intel, read_irb);
+}
+
+/**
  * Map the regions needed by intelSpanRenderStart().
  */
 static void
@@ -288,8 +324,10 @@ intelSpanRenderStart(struct gl_context * ctx)
 {
    struct intel_context *intel = intel_context(ctx);
 
-   intel_flush(&intel->ctx);
+   intel_flush(ctx);
    intel_prepare_render(intel);
+   intel_span_resolve_buffers(intel);
+   intel_flush(ctx);
    intel_span_map_buffers(intel);
 }
 
-- 
1.7.7.1



More information about the mesa-dev mailing list