From 455c79b24f91fbceaed57d49718fa198e2a6b0ff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Ol=C5=A1=C3=A1k?= Date: Wed, 16 Nov 2016 00:47:35 +0100 Subject: [PATCH] tgsi/scan: record load/store/atomic image usage Reviewed-by: Dave Airlie --- src/gallium/auxiliary/tgsi/tgsi_scan.c | 15 ++++++++++----- src/gallium/auxiliary/tgsi/tgsi_scan.h | 8 +++----- src/gallium/drivers/radeonsi/si_shader.c | 4 +++- 3 files changed, 16 insertions(+), 11 deletions(-) diff --git a/src/gallium/auxiliary/tgsi/tgsi_scan.c b/src/gallium/auxiliary/tgsi/tgsi_scan.c index 7d5496c9603..99799fa16e2 100644 --- a/src/gallium/auxiliary/tgsi/tgsi_scan.c +++ b/src/gallium/auxiliary/tgsi/tgsi_scan.c @@ -283,9 +283,9 @@ scan_src_operand(struct tgsi_shader_info *info, if (src->Register.File == TGSI_FILE_IMAGE) { if (src->Register.Indirect) - info->images_writemask = info->images_declared; + info->images_atomic = info->images_declared; else - info->images_writemask |= 1 << src->Register.Index; + info->images_atomic |= 1 << src->Register.Index; } else if (src->Register.File == TGSI_FILE_BUFFER) { if (src->Register.Indirect) info->shader_buffers_atomic = info->shader_buffers_declared; @@ -293,7 +293,12 @@ scan_src_operand(struct tgsi_shader_info *info, info->shader_buffers_atomic |= 1 << src->Register.Index; } } else { - if (src->Register.File == TGSI_FILE_BUFFER) { + if (src->Register.File == TGSI_FILE_IMAGE) { + if (src->Register.Indirect) + info->images_load = info->images_declared; + else + info->images_load |= 1 << src->Register.Index; + } else if (src->Register.File == TGSI_FILE_BUFFER) { if (src->Register.Indirect) info->shader_buffers_load = info->shader_buffers_declared; else @@ -425,9 +430,9 @@ scan_instruction(struct tgsi_shader_info *info, if (dst->Register.File == TGSI_FILE_IMAGE) { if (dst->Register.Indirect) - info->images_writemask = info->images_declared; + info->images_store = info->images_declared; else - info->images_writemask |= 1 << dst->Register.Index; + info->images_store |= 1 << dst->Register.Index; } else if (dst->Register.File == TGSI_FILE_BUFFER) { if (dst->Register.Indirect) info->shader_buffers_store = info->shader_buffers_declared; diff --git a/src/gallium/auxiliary/tgsi/tgsi_scan.h b/src/gallium/auxiliary/tgsi/tgsi_scan.h index e3c24e950ed..3854827e5cb 100644 --- a/src/gallium/auxiliary/tgsi/tgsi_scan.h +++ b/src/gallium/auxiliary/tgsi/tgsi_scan.h @@ -137,15 +137,13 @@ struct tgsi_shader_info unsigned num_written_clipdistance; unsigned images_declared; /**< bitmask of declared images */ - /** - * Bitmask indicating which images are written to (STORE / ATOM*). - * Indirect image accesses are not reflected in this mask. - */ - unsigned images_writemask; /** * Bitmask indicating which declared image is a buffer. */ unsigned images_buffers; + unsigned images_load; /**< bitmask of images using loads */ + unsigned images_store; /**< bitmask of images using stores */ + unsigned images_atomic; /**< bitmask of images using atomics */ unsigned shader_buffers_declared; /**< bitmask of declared shader buffers */ unsigned shader_buffers_load; /**< bitmask of shader buffers using loads */ unsigned shader_buffers_store; /**< bitmask of shader buffers using stores */ diff --git a/src/gallium/drivers/radeonsi/si_shader.c b/src/gallium/drivers/radeonsi/si_shader.c index 212a9bee800..f84eefc3ddc 100644 --- a/src/gallium/drivers/radeonsi/si_shader.c +++ b/src/gallium/drivers/radeonsi/si_shader.c @@ -3328,10 +3328,12 @@ image_fetch_rsrc( if (!image->Register.Indirect) { const struct tgsi_shader_info *info = bld_base->info; + unsigned images_writemask = info->images_store | + info->images_atomic; index = LLVMConstInt(ctx->i32, image->Register.Index, 0); - if (info->images_writemask & (1 << image->Register.Index) && + if (images_writemask & (1 << image->Register.Index) && target != TGSI_TEXTURE_BUFFER) dcc_off = true; } else {