diff options
author | Chad Versace <[email protected]> | 2012-07-26 16:47:35 -0700 |
---|---|---|
committer | Chad Versace <[email protected]> | 2012-08-07 09:30:33 -0700 |
commit | 6b56140b4bafcef8bea5ca67cb31023a533c3bd4 (patch) | |
tree | d8906621ce06cff8569fdd802dcb06e1af143fad /src | |
parent | d3746354fbfadf821dc108e072d86b5329737444 (diff) |
i965: Mark needed downsamples for msaa winsys buffers
Add function intel_renderbuffer_set_needs_downsample. It is a no-op
except on multisample winsys buffers shared with DRI2.
Mark the needed downsamples with the new function at two locations:
- Immediately after drawing is complete.
- After blitting.
Reviewed-by: Eric Anholt <[email protected]>
Reviewed-by: Paul Berry <[email protected]>
Signed-off-by: Chad Versace <[email protected]>
Diffstat (limited to 'src')
-rw-r--r-- | src/mesa/drivers/dri/i965/brw_blorp_blit.cpp | 2 | ||||
-rw-r--r-- | src/mesa/drivers/dri/i965/brw_draw.c | 20 | ||||
-rw-r--r-- | src/mesa/drivers/dri/intel/intel_fbo.c | 10 | ||||
-rw-r--r-- | src/mesa/drivers/dri/intel/intel_fbo.h | 3 |
4 files changed, 29 insertions, 6 deletions
diff --git a/src/mesa/drivers/dri/i965/brw_blorp_blit.cpp b/src/mesa/drivers/dri/i965/brw_blorp_blit.cpp index 700b0cfcf8a..53b72f6ef4d 100644 --- a/src/mesa/drivers/dri/i965/brw_blorp_blit.cpp +++ b/src/mesa/drivers/dri/i965/brw_blorp_blit.cpp @@ -163,8 +163,8 @@ do_blorp_blit(struct intel_context *intel, GLbitfield buffer_bit, srcX0, srcY0, dstX0, dstY0, dstX1, dstY1, mirror_x, mirror_y); - /* Mark the dst buffer as needing a HiZ resolve if necessary. */ intel_renderbuffer_set_needs_hiz_resolve(intel_renderbuffer(dst_rb)); + intel_renderbuffer_set_needs_downsample(intel_renderbuffer(dst_rb)); } diff --git a/src/mesa/drivers/dri/i965/brw_draw.c b/src/mesa/drivers/dri/i965/brw_draw.c index 1069a6335fe..ccfc306cac6 100644 --- a/src/mesa/drivers/dri/i965/brw_draw.c +++ b/src/mesa/drivers/dri/i965/brw_draw.c @@ -326,18 +326,28 @@ brw_predraw_resolve_buffers(struct brw_context *brw) * If the depth buffer was written to and if it has an accompanying HiZ * buffer, then mark that it needs a depth resolve. * - * (In the future, this will also mark needed MSAA resolves). + * If the color buffer is a multisample window system buffer, then + * mark that it needs a downsample. */ static void brw_postdraw_set_buffers_need_resolve(struct brw_context *brw) { + struct intel_context *intel = &brw->intel; struct gl_context *ctx = &brw->intel.ctx; struct gl_framebuffer *fb = ctx->DrawBuffer; - struct intel_renderbuffer *depth_irb = - intel_get_renderbuffer(fb, BUFFER_DEPTH); - if (depth_irb && ctx->Depth.Mask) { + struct intel_renderbuffer *front_irb = NULL; + struct intel_renderbuffer *back_irb = intel_get_renderbuffer(fb, BUFFER_BACK_LEFT); + struct intel_renderbuffer *depth_irb = intel_get_renderbuffer(fb, BUFFER_DEPTH); + + if (intel->is_front_buffer_rendering) + front_irb = intel_get_renderbuffer(fb, BUFFER_FRONT_LEFT); + + if (front_irb) + intel_renderbuffer_set_needs_downsample(front_irb); + if (back_irb) + intel_renderbuffer_set_needs_downsample(back_irb); + if (depth_irb && ctx->Depth.Mask) intel_renderbuffer_set_needs_depth_resolve(depth_irb); - } } static int diff --git a/src/mesa/drivers/dri/intel/intel_fbo.c b/src/mesa/drivers/dri/intel/intel_fbo.c index e6e64080bf2..3a610c244b1 100644 --- a/src/mesa/drivers/dri/intel/intel_fbo.c +++ b/src/mesa/drivers/dri/intel/intel_fbo.c @@ -881,6 +881,16 @@ intel_blit_framebuffer(struct gl_context *ctx, mask, filter); } +/** + * This is a no-op except on multisample buffers shared with DRI2. + */ +void +intel_renderbuffer_set_needs_downsample(struct intel_renderbuffer *irb) +{ + if (irb->mt && irb->mt->singlesample_mt) + irb->mt->need_downsample = true; +} + void intel_renderbuffer_set_needs_hiz_resolve(struct intel_renderbuffer *irb) { diff --git a/src/mesa/drivers/dri/intel/intel_fbo.h b/src/mesa/drivers/dri/intel/intel_fbo.h index 72ed04d1212..6574f0faf22 100644 --- a/src/mesa/drivers/dri/intel/intel_fbo.h +++ b/src/mesa/drivers/dri/intel/intel_fbo.h @@ -170,6 +170,9 @@ struct intel_region* intel_get_rb_region(struct gl_framebuffer *fb, GLuint attIndex); void +intel_renderbuffer_set_needs_downsample(struct intel_renderbuffer *irb); + +void intel_renderbuffer_set_needs_hiz_resolve(struct intel_renderbuffer *irb); void |