diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/mesa/drivers/dri/i965/brw_blorp_clear.cpp | 215 |
1 files changed, 83 insertions, 132 deletions
diff --git a/src/mesa/drivers/dri/i965/brw_blorp_clear.cpp b/src/mesa/drivers/dri/i965/brw_blorp_clear.cpp index 2d404686b87..6896f5f1680 100644 --- a/src/mesa/drivers/dri/i965/brw_blorp_clear.cpp +++ b/src/mesa/drivers/dri/i965/brw_blorp_clear.cpp @@ -45,43 +45,6 @@ struct brw_blorp_const_color_prog_key bool pad[3]; }; -/** - * Parameters for a blorp operation where the fragment shader outputs a - * constant color. This is used for both fast color clears and color - * resolves. - */ -class brw_blorp_const_color_params : public brw_blorp_params -{ -public: - brw_blorp_const_color_prog_key wm_prog_key; -}; - -class brw_blorp_clear_params : public brw_blorp_const_color_params -{ -public: - brw_blorp_clear_params(struct brw_context *brw, - struct gl_framebuffer *fb, - struct gl_renderbuffer *rb, - GLubyte *color_mask, - bool partial_clear, - bool encode_srgb, - unsigned layer); -}; - - -/** - * Parameters for a blorp operation that performs a "render target resolve". - * This is used to resolve pending fast clear pixels before a color buffer is - * used for texturing, ReadPixels, or scanout. - */ -class brw_blorp_rt_resolve_params : public brw_blorp_const_color_params -{ -public: - brw_blorp_rt_resolve_params(struct brw_context *brw, - struct intel_mipmap_tree *mt); -}; - - class brw_blorp_const_color_program { public: @@ -175,97 +138,6 @@ set_write_disables(const struct intel_renderbuffer *irb, return disables; } -brw_blorp_clear_params::brw_blorp_clear_params(struct brw_context *brw, - struct gl_framebuffer *fb, - struct gl_renderbuffer *rb, - GLubyte *color_mask, - bool partial_clear, - bool encode_srgb, - unsigned layer) -{ - struct gl_context *ctx = &brw->ctx; - struct intel_renderbuffer *irb = intel_renderbuffer(rb); - mesa_format format = irb->mt->format; - - if (!encode_srgb && _mesa_get_format_color_encoding(format) == GL_SRGB) - format = _mesa_get_srgb_format_linear(format); - - dst.set(brw, irb->mt, irb->mt_level, layer, format, true); - - /* Override the surface format according to the context's sRGB rules. */ - dst.brw_surfaceformat = brw->render_target_format[format]; - - x0 = fb->_Xmin; - x1 = fb->_Xmax; - if (rb->Name != 0) { - y0 = fb->_Ymin; - y1 = fb->_Ymax; - } else { - y0 = rb->Height - fb->_Ymax; - y1 = rb->Height - fb->_Ymin; - } - - memcpy(&wm_push_consts.dst_x0, ctx->Color.ClearColor.f, sizeof(float) * 4); - - memset(&wm_prog_key, 0, sizeof(wm_prog_key)); - - wm_prog_key.use_simd16_replicated_data = true; - - /* From the SNB PRM (Vol4_Part1): - * - * "Replicated data (Message Type = 111) is only supported when - * accessing tiled memory. Using this Message Type to access linear - * (untiled) memory is UNDEFINED." - */ - if (irb->mt->tiling == I915_TILING_NONE) - wm_prog_key.use_simd16_replicated_data = false; - - /* Constant color writes ignore everyting in blend and color calculator - * state. This is not documented. - */ - if (set_write_disables(irb, color_mask, color_write_disable)) - wm_prog_key.use_simd16_replicated_data = false; - - if (irb->mt->fast_clear_state != INTEL_FAST_CLEAR_STATE_NO_MCS && - !partial_clear && wm_prog_key.use_simd16_replicated_data && - brw_is_color_fast_clear_compatible(brw, irb->mt, - &ctx->Color.ClearColor)) { - memset(&wm_push_consts, 0xff, 4*sizeof(float)); - fast_clear_op = GEN7_PS_RENDER_TARGET_FAST_CLEAR_ENABLE; - - brw_get_fast_clear_rect(brw, fb, irb->mt, &x0, &y0, &x1, &y1); - } else { - brw_meta_get_buffer_rect(fb, &x0, &y0, &x1, &y1); - } - - brw_blorp_params_get_clear_kernel(brw, this, &wm_prog_key); -} - - -brw_blorp_rt_resolve_params::brw_blorp_rt_resolve_params( - struct brw_context *brw, - struct intel_mipmap_tree *mt) -{ - const mesa_format format = _mesa_get_srgb_format_linear(mt->format); - - dst.set(brw, mt, 0 /* level */, 0 /* layer */, format, true); - - brw_get_resolve_rect(brw, mt, &x0, &y0, &x1, &y1); - - fast_clear_op = GEN7_PS_RENDER_TARGET_RESOLVE_ENABLE; - - /* Note: there is no need to initialize push constants because it doesn't - * matter what data gets dispatched to the render target. However, we must - * ensure that the fragment shader delivers the data using the "replicated - * color" message. - */ - memset(&wm_prog_key, 0, sizeof(wm_prog_key)); - wm_prog_key.use_simd16_replicated_data = true; - - brw_blorp_params_get_clear_kernel(brw, this, &wm_prog_key); -} - - void brw_blorp_const_color_program::alloc_regs() { @@ -358,9 +230,67 @@ do_single_blorp_clear(struct brw_context *brw, struct gl_framebuffer *fb, { struct gl_context *ctx = &brw->ctx; struct intel_renderbuffer *irb = intel_renderbuffer(rb); + mesa_format format = irb->mt->format; + + brw_blorp_params params; + + if (!encode_srgb && _mesa_get_format_color_encoding(format) == GL_SRGB) + format = _mesa_get_srgb_format_linear(format); + + params.dst.set(brw, irb->mt, irb->mt_level, layer, format, true); + + /* Override the surface format according to the context's sRGB rules. */ + params.dst.brw_surfaceformat = brw->render_target_format[format]; + + params.x0 = fb->_Xmin; + params.x1 = fb->_Xmax; + if (rb->Name != 0) { + params.y0 = fb->_Ymin; + params.y1 = fb->_Ymax; + } else { + params.y0 = rb->Height - fb->_Ymax; + params.y1 = rb->Height - fb->_Ymin; + } + + memcpy(¶ms.wm_push_consts.dst_x0, + ctx->Color.ClearColor.f, sizeof(float) * 4); + + brw_blorp_const_color_prog_key wm_prog_key; + memset(&wm_prog_key, 0, sizeof(wm_prog_key)); + + wm_prog_key.use_simd16_replicated_data = true; + + /* From the SNB PRM (Vol4_Part1): + * + * "Replicated data (Message Type = 111) is only supported when + * accessing tiled memory. Using this Message Type to access linear + * (untiled) memory is UNDEFINED." + */ + if (irb->mt->tiling == I915_TILING_NONE) + wm_prog_key.use_simd16_replicated_data = false; + + /* Constant color writes ignore everyting in blend and color calculator + * state. This is not documented. + */ + if (set_write_disables(irb, ctx->Color.ColorMask[buf], + params.color_write_disable)) + wm_prog_key.use_simd16_replicated_data = false; + + if (irb->mt->fast_clear_state != INTEL_FAST_CLEAR_STATE_NO_MCS && + !partial_clear && wm_prog_key.use_simd16_replicated_data && + brw_is_color_fast_clear_compatible(brw, irb->mt, + &ctx->Color.ClearColor)) { + memset(¶ms.wm_push_consts, 0xff, 4*sizeof(float)); + params.fast_clear_op = GEN7_PS_RENDER_TARGET_FAST_CLEAR_ENABLE; + + brw_get_fast_clear_rect(brw, fb, irb->mt, ¶ms.x0, ¶ms.y0, + ¶ms.x1, ¶ms.y1); + } else { + brw_meta_get_buffer_rect(fb, ¶ms.x0, ¶ms.y0, + ¶ms.x1, ¶ms.y1); + } - brw_blorp_clear_params params(brw, fb, rb, ctx->Color.ColorMask[buf], - partial_clear, encode_srgb, layer); + brw_blorp_params_get_clear_kernel(brw, ¶ms, &wm_prog_key); const bool is_fast_clear = params.fast_clear_op == GEN7_PS_RENDER_TARGET_FAST_CLEAR_ENABLE; @@ -394,7 +324,7 @@ do_single_blorp_clear(struct brw_context *brw, struct gl_framebuffer *fb, const char *clear_type; if (is_fast_clear) clear_type = "fast"; - else if (params.wm_prog_key.use_simd16_replicated_data) + else if (wm_prog_key.use_simd16_replicated_data) clear_type = "replicated"; else clear_type = "slow"; @@ -467,7 +397,28 @@ brw_blorp_resolve_color(struct brw_context *brw, struct intel_mipmap_tree *mt) { DBG("%s to mt %p\n", __FUNCTION__, mt); - brw_blorp_rt_resolve_params params(brw, mt); + const mesa_format format = _mesa_get_srgb_format_linear(mt->format); + + brw_blorp_params params; + + params.dst.set(brw, mt, 0 /* level */, 0 /* layer */, format, true); + + brw_get_resolve_rect(brw, mt, ¶ms.x0, ¶ms.y0, + ¶ms.x1, ¶ms.y1); + + params.fast_clear_op = GEN7_PS_RENDER_TARGET_RESOLVE_ENABLE; + + /* Note: there is no need to initialize push constants because it doesn't + * matter what data gets dispatched to the render target. However, we must + * ensure that the fragment shader delivers the data using the "replicated + * color" message. + */ + brw_blorp_const_color_prog_key wm_prog_key; + memset(&wm_prog_key, 0, sizeof(wm_prog_key)); + wm_prog_key.use_simd16_replicated_data = true; + + brw_blorp_params_get_clear_kernel(brw, ¶ms, &wm_prog_key); + brw_blorp_exec(brw, ¶ms); mt->fast_clear_state = INTEL_FAST_CLEAR_STATE_RESOLVED; } |