Signed-off-by: Topi Pohjolainen <topi.pohjolai...@intel.com> --- src/mesa/drivers/dri/i965/brw_blorp.h | 27 +++++++++ src/mesa/drivers/dri/i965/brw_blorp_blit.cpp | 90 ++++++++++++++++++++++++++++ 2 files changed, 117 insertions(+)
diff --git a/src/mesa/drivers/dri/i965/brw_blorp.h b/src/mesa/drivers/dri/i965/brw_blorp.h index 9fd4193..253d6e6 100644 --- a/src/mesa/drivers/dri/i965/brw_blorp.h +++ b/src/mesa/drivers/dri/i965/brw_blorp.h @@ -430,6 +430,33 @@ private: uint32_t wm_prog_offset); }; +class brw_meta_blit_params : public brw_meta_fs_params +{ +public: + brw_meta_blit_params(struct brw_context *brw, + const struct gl_fragment_program *fp, + uint32_t wm_prog_offset, + const struct brw_wm_prog_data *wm_prog_data, + const struct gl_framebuffer *read_fb, + const struct gl_framebuffer *draw_fb, + struct intel_mipmap_tree *src_mt, + unsigned src_level, unsigned src_layer, + mesa_format src_format, + float src_x0, float src_y0, + float src_x1, float src_y1, + float dst_x0, float dst_y0, + float dst_x1, float dst_y1, + GLenum filter, GLenum target, + bool mirror_x, bool mirror_y); + +private: + const float src_x0, src_y0, src_x1, src_y1; + const struct gl_framebuffer * const read_fb; + const struct gl_framebuffer * const draw_fb; + const GLenum filter; + const GLenum target; +}; + /** * \name BLORP internals * \{ diff --git a/src/mesa/drivers/dri/i965/brw_blorp_blit.cpp b/src/mesa/drivers/dri/i965/brw_blorp_blit.cpp index 947f3b0..17b884f 100644 --- a/src/mesa/drivers/dri/i965/brw_blorp_blit.cpp +++ b/src/mesa/drivers/dri/i965/brw_blorp_blit.cpp @@ -345,6 +345,63 @@ brw_blorp_framebuffer(struct brw_context *brw, return mask; } +bool +brw_meta_fbo_color_blit(struct brw_context *brw, + struct gl_framebuffer *read_fb, + struct gl_framebuffer *draw_fb, + float src_x0, float src_y0, + float src_x1, float src_y1, + float dst_x0, float dst_y0, + float dst_x1, float dst_y1, + GLenum filter) +{ + /* Sync up the state of window system buffers. We need to do this before + * we go looking for the buffers. + */ + intel_prepare_render(brw); + + bool mirror_x, mirror_y; + if (brw_meta_mirror_clip_and_scissor(&brw->ctx, read_fb, draw_fb, + &src_x0, &src_y0, &src_x1, &src_y1, + &dst_x0, &dst_y0, &dst_x1, &dst_y1, + &mirror_x, &mirror_y)) + return true; + + GLenum target; + const struct gl_fragment_program *fp; + uint32_t wm_prog_offset; + const struct brw_wm_prog_data *wm_prog_data; + + if (!brw_meta_choose_blit_shader(brw, GL_COLOR_BUFFER_BIT, filter, &target, + &fp, &wm_prog_offset, &wm_prog_data)) + return false; + + struct intel_renderbuffer *src_irb = + intel_renderbuffer(read_fb->_ColorReadBuffer); + struct intel_mipmap_tree *src_mt = + find_miptree(GL_COLOR_BUFFER_BIT, src_irb); + + intel_miptree_resolve_color(brw, src_mt); + brw_meta_blit_params params(brw, fp, wm_prog_offset, wm_prog_data, + read_fb, draw_fb, src_mt, + src_irb->mt_level, src_irb->mt_layer, + src_irb->Base.Base.Format, + src_x0, src_y0, + src_x1, src_y1, + dst_x0, dst_y0, + dst_x1, dst_y1, + filter, target, mirror_x, mirror_y); + + /* Manually store and disable current srgb setting. */ + bool srgb_save = brw->ctx.Color.sRGBEnabled; + brw->ctx.Color.sRGBEnabled = false; + + brw_blorp_exec(brw, ¶ms); + + brw->ctx.Color.sRGBEnabled = srgb_save; + + return true; +} /** * Enum to specify the order of arguments in a sampler message @@ -2136,3 +2193,36 @@ brw_blorp_blit_params::set_wm_prog(struct brw_context *brw) &prog_offset, &prog_data); } } + +brw_meta_blit_params::brw_meta_blit_params( + struct brw_context *brw, + const struct gl_fragment_program *fp, + uint32_t wm_prog_offset, + const struct brw_wm_prog_data *wm_prog_data, + const struct gl_framebuffer *read_fb, + const struct gl_framebuffer *draw_fb, + struct intel_mipmap_tree *src_mt, + unsigned src_level, + unsigned src_layer, + mesa_format src_format, + float src_x0, float src_y0, + float src_x1, float src_y1, + float dst_x0, float dst_y0, + float dst_x1, float dst_y1, + GLenum filter, GLenum target, + bool mirror_x, bool mirror_y) : + brw_meta_fs_params(draw_fb->Visual.samples, draw_fb->_NumColorDrawBuffers, + 1 /* single layer */, + fp, wm_prog_offset, wm_prog_data, + 0 /* no-op clear */), + src_x0(src_x0), src_y0(src_y0), src_x1(src_x1), src_y1(src_y1), + read_fb(read_fb), draw_fb(draw_fb), filter(filter), target(target) +{ + use_wm_prog = true; + x0 = mirror_x ? dst_x1 : dst_x0; + y0 = mirror_y ? dst_y1 : dst_y0; + x1 = mirror_x ? dst_x0 : dst_x1; + y1 = mirror_y ? dst_y0 : dst_y1; + + src.set(brw, src_mt, src_level, src_layer, src_format, false); +} -- 1.9.3 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev