Module: Mesa Branch: 17.3 Commit: d654c58ca74aea432ccd5097210ef83a5022b87d URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=d654c58ca74aea432ccd5097210ef83a5022b87d
Author: Jason Ekstrand <jason.ekstr...@intel.com> Date: Tue Oct 31 16:29:22 2017 -0700 i965/draw: Do resolves properly for textures used by TXF Reviewed-by: Iago Toral Quiroga <ito...@igalia.com> Reviewed-by: Kenneth Graunke <kenn...@whitecape.org> (cherry picked from commit 96aa5587155e7de87e80d617725cc66f6807c5d1) --- src/mesa/drivers/dri/i965/brw_draw.c | 41 ++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/src/mesa/drivers/dri/i965/brw_draw.c b/src/mesa/drivers/dri/i965/brw_draw.c index 83ab53bd27..5912e021cd 100644 --- a/src/mesa/drivers/dri/i965/brw_draw.c +++ b/src/mesa/drivers/dri/i965/brw_draw.c @@ -40,6 +40,7 @@ #include "swrast_setup/swrast_setup.h" #include "drivers/common/meta.h" #include "util/bitscan.h" +#include "util/bitset.h" #include "brw_blorp.h" #include "brw_draw.h" @@ -375,6 +376,20 @@ intel_disable_rb_aux_buffer(struct brw_context *brw, return found; } +static void +mark_textures_used_for_txf(BITSET_WORD *used_for_txf, + const struct gl_program *prog) +{ + if (!prog) + return; + + unsigned mask = prog->SamplersUsed & prog->info.textures_used_by_txf; + while (mask) { + int s = u_bit_scan(&mask); + BITSET_SET(used_for_txf, prog->SamplerUnits[s]); + } +} + /** * \brief Resolve buffers before drawing. * @@ -390,6 +405,18 @@ brw_predraw_resolve_inputs(struct brw_context *brw, bool rendering) memset(brw->draw_aux_buffer_disabled, 0, sizeof(brw->draw_aux_buffer_disabled)); + BITSET_DECLARE(used_for_txf, MAX_COMBINED_TEXTURE_IMAGE_UNITS); + memset(used_for_txf, 0, sizeof(used_for_txf)); + if (rendering) { + mark_textures_used_for_txf(used_for_txf, ctx->VertexProgram._Current); + mark_textures_used_for_txf(used_for_txf, ctx->TessCtrlProgram._Current); + mark_textures_used_for_txf(used_for_txf, ctx->TessEvalProgram._Current); + mark_textures_used_for_txf(used_for_txf, ctx->GeometryProgram._Current); + mark_textures_used_for_txf(used_for_txf, ctx->FragmentProgram._Current); + } else { + mark_textures_used_for_txf(used_for_txf, ctx->ComputeProgram._Current); + } + /* Resolve depth buffer and render cache of each enabled texture. */ int maxEnabledUnit = ctx->Texture._MaxEnabledTexImageUnit; for (int i = 0; i <= maxEnabledUnit; i++) { @@ -426,6 +453,20 @@ brw_predraw_resolve_inputs(struct brw_context *brw, bool rendering) min_layer, num_layers, disable_aux); + /* If any programs are using it with texelFetch, we may need to also do + * a prepare with an sRGB format to ensure texelFetch works "properly". + */ + if (BITSET_TEST(used_for_txf, i)) { + enum isl_format txf_format = + translate_tex_format(brw, tex_obj->_Format, GL_DECODE_EXT); + if (txf_format != view_format) { + intel_miptree_prepare_texture(brw, tex_obj->mt, txf_format, + min_level, num_levels, + min_layer, num_layers, + disable_aux); + } + } + brw_cache_flush_for_read(brw, tex_obj->mt->bo); if (tex_obj->base.StencilSampling || _______________________________________________ mesa-commit mailing list mesa-commit@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-commit