diff options
author | Francisco Jerez <[email protected]> | 2019-01-16 18:49:47 -0800 |
---|---|---|
committer | Francisco Jerez <[email protected]> | 2019-02-21 14:07:25 -0800 |
commit | 7f9f6263c1ecc3ab9e1984f5a9814f6820eb85cf (patch) | |
tree | 92819ca950a340c14a55481d1fa621e09f49a7aa /src/intel/compiler | |
parent | e2f475ddffabff5cbe2bcff78ff42ce899869b29 (diff) |
intel/fs: Cap dst-aligned region stride to maximum representable hstride value.
This is required in combination with the following commit, because
otherwise if a source region with an extended 8+ stride is present in
the instruction (which we're about to declare legal) we'll end up
emitting code that attempts to write to such a region, even though
strides greater than four are still illegal for the destination.
Tested-by: Anuj Phogat <[email protected]>
Reviewed-by: Jason Ekstrand <[email protected]>
Diffstat (limited to 'src/intel/compiler')
-rw-r--r-- | src/intel/compiler/brw_fs_lower_regioning.cpp | 28 |
1 files changed, 23 insertions, 5 deletions
diff --git a/src/intel/compiler/brw_fs_lower_regioning.cpp b/src/intel/compiler/brw_fs_lower_regioning.cpp index 6a3c23892b4..c60d4700419 100644 --- a/src/intel/compiler/brw_fs_lower_regioning.cpp +++ b/src/intel/compiler/brw_fs_lower_regioning.cpp @@ -71,15 +71,33 @@ namespace { !is_byte_raw_mov(inst)) { return get_exec_type_size(inst); } else { - unsigned stride = inst->dst.stride * type_sz(inst->dst.type); + /* Calculate the maximum byte stride and the minimum/maximum type + * size across all source and destination operands we are required to + * lower. + */ + unsigned max_stride = inst->dst.stride * type_sz(inst->dst.type); + unsigned min_size = type_sz(inst->dst.type); + unsigned max_size = type_sz(inst->dst.type); for (unsigned i = 0; i < inst->sources; i++) { - if (!is_uniform(inst->src[i]) && !inst->is_control_source(i)) - stride = MAX2(stride, inst->src[i].stride * - type_sz(inst->src[i].type)); + if (!is_uniform(inst->src[i]) && !inst->is_control_source(i)) { + const unsigned size = type_sz(inst->src[i].type); + max_stride = MAX2(max_stride, inst->src[i].stride * size); + min_size = MIN2(min_size, size); + max_size = MAX2(max_size, size); + } } - return stride; + /* All operands involved in lowering need to fit in the calculated + * stride. + */ + assert(max_size <= 4 * min_size); + + /* Attempt to use the largest byte stride among all present operands, + * but never exceed a stride of 4 since that would lead to illegal + * destination regions during lowering. + */ + return MIN2(max_stride, 4 * min_size); } } |