[Mesa-dev] [PATCH 18/19] i965: Do needed HiZ meta-ops before drawing
Chad Versace
chad at chad-versace.us
Fri Sep 23 17:37:48 PDT 2011
In brw_try_draw_prims(), perform a HiZ resolve on the attached depthbuffer
and perform a depth resolve on each enabled depth texture, if needed.
Signed-off-by: Chad Versace <chad at chad-versace.us>
---
src/mesa/drivers/dri/i965/brw_draw.c | 43 ++++++++++++++++++++++++++++++++++
1 files changed, 43 insertions(+), 0 deletions(-)
diff --git a/src/mesa/drivers/dri/i965/brw_draw.c b/src/mesa/drivers/dri/i965/brw_draw.c
index af02332..91f45d2 100644
--- a/src/mesa/drivers/dri/i965/brw_draw.c
+++ b/src/mesa/drivers/dri/i965/brw_draw.c
@@ -43,6 +43,10 @@
#include "brw_state.h"
#include "intel_batchbuffer.h"
+#include "intel_mipmap_tree.h"
+#include "intel_regions.h"
+
+#include "intel_fbo.h"
#define FILE_DEBUG_FLAG DEBUG_PRIMS
@@ -275,6 +279,42 @@ static void brw_merge_inputs( struct brw_context *brw,
brw->state.dirty.brw |= BRW_NEW_INPUT_DIMENSIONS;
}
+/**
+ * \brief Perform needed HiZ ops before preparing for draw
+ *
+ * If needed, perform a HiZ resolve on the attached depthbuffer and
+ * perform a depth resolve on each enabled depth texture.
+ */
+static void
+brw_predraw_hiz_ops(struct brw_context *brw)
+{
+ struct gl_context *ctx = &brw->intel.ctx;
+ struct intel_context *intel = &brw->intel;
+
+ /* Maybe perform HiZ resolve on attached depthbuffer. */
+ struct intel_renderbuffer *depth_irb =
+ intel_get_renderbuffer(ctx->DrawBuffer, BUFFER_DEPTH);
+ if (depth_irb) {
+ struct intel_region *region = depth_irb->region;
+ if (region->hiz.need_resolve == INTEL_HIZ_NEED_HIZ_RESOLVE) {
+ intel->vtbl.resolve_hizbuffer(intel, region);
+ }
+ }
+
+ /* Perform depth resolves on enabled depth textures. */
+ for (int i = 0; i < BRW_MAX_TEX_UNIT; i++) {
+ const struct gl_texture_unit *tex_unit = &ctx->Texture.Unit[i];
+ if (!tex_unit->_ReallyEnabled)
+ continue;
+ struct intel_texture_object *tex_obj =
+ intel_texture_object(tex_unit->_Current);
+ struct intel_region *region = tex_obj->mt->region;
+ if (region->hiz.need_resolve == INTEL_HIZ_NEED_DEPTH_RESOLVE) {
+ intel->vtbl.resolve_depthbuffer(intel, region);
+ }
+ }
+}
+
/* May fail if out of video memory for texture or vbo upload, or on
* fallback conditions.
*/
@@ -292,6 +332,9 @@ static GLboolean brw_try_draw_prims( struct gl_context *ctx,
GLboolean warn = GL_FALSE;
GLuint i;
+ /* HiZ meta-ops must occur before we update the draw state. */
+ brw_predraw_hiz_ops(brw);
+
if (ctx->NewState)
_mesa_update_state( ctx );
--
1.7.6.2
More information about the mesa-dev
mailing list