i965/fs: Support 16-bit do_read_vector with VK_KHR_relaxed_block_layout
authorJose Maria Casanova Crespo <jmcasanova@igalia.com>
Wed, 31 Jan 2018 23:05:11 +0000 (00:05 +0100)
committerJason Ekstrand <jason.ekstrand@intel.com>
Thu, 1 Mar 2018 05:37:40 +0000 (21:37 -0800)
commit8dd8be0323bbc207631a39f43cff7b898af4a55a
tree9a4557a72e74a0f4af51cd6ed0a4cae4ff55a89f
parent2dd94f462b0069fc3a20c9a93a9cfe97dd079837
i965/fs: Support 16-bit do_read_vector with VK_KHR_relaxed_block_layout

16-bit load_ubo/ssbo operations that call do_untyped_read_vector don't
guarantee that offsets are multiple of 4-bytes as required by untyped_read
message. This happens for example in the case of f16mat3x3 when then
VK_KHR_relaxed_block_layout is enabled.

Vectors reads when we have non-constant offsets are implemented with
multiple byte_scattered_read messages that not require 32-bit aligned offsets.

Now for all constant offsets we can use the untyped_read_surface message.
In the case of constant offsets not aligned to 32-bits, we calculate a
start offset 32-bit aligned and use the shuffle_32bit_load_result_to_16bit_data
function and the first_component parameter to skip the copy of the unneeded
component.

v2: (Jason Ekstrand)
    Use untyped_read_surface messages always we have constant offsets.

v3: (Jason Ekstrand)
    Simplify loop for reads with non constant offsets.
    Use end - start to calculate the number of 32-bit components to read with
    constant offsets.

Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
src/intel/compiler/brw_fs_nir.cpp