On Thu, Jan 5, 2017 at 2:18 AM, Samuel Iglesias Gonsálvez < sigles...@igalia.com> wrote:
> We need to pick two 32-bit values per component to perform the right > shuffle operation. > > v2 (Jason): > - Add assert to check matching bit sizes (Jason) > - Simplify the code to pick components (Jason) > > Signed-off-by: Samuel Iglesias Gonsálvez <sigles...@igalia.com> > --- > src/compiler/spirv/spirv_to_nir.c | 40 ++++++++++++++++++++++++++++++ > --------- > 1 file changed, 31 insertions(+), 9 deletions(-) > > diff --git a/src/compiler/spirv/spirv_to_nir.c > b/src/compiler/spirv/spirv_to_nir.c > index b44b8e823d2..a9c1bef1411 100644 > --- a/src/compiler/spirv/spirv_to_nir.c > +++ b/src/compiler/spirv/spirv_to_nir.c > @@ -1076,18 +1076,40 @@ vtn_handle_constant(struct vtn_builder *b, SpvOp > opcode, > unsigned len0 = glsl_get_vector_elements(v0->const_type); > unsigned len1 = glsl_get_vector_elements(v1->const_type); > > - uint32_t u[8]; > - for (unsigned i = 0; i < len0; i++) > - u[i] = v0->constant->values[0].u32[i]; > - for (unsigned i = 0; i < len1; i++) > - u[len0 + i] = v1->constant->values[0].u32[i]; > + uint32_t u32[8]; > + uint64_t u64[8]; > + assert(len0 + len1 < 16); > + > + unsigned bit_size = glsl_get_bit_size(val->const_type); > + assert(bit_size == glsl_get_bit_size(v0->const_type) && > + bit_size == glsl_get_bit_size(v1->const_type)); > + > + for (unsigned i = 0; i < len0; i++) { > + if (bit_size == 64) > + u64[i] = v0->constant->values[0].u64[i]; > + else > + u32[i] = v0->constant->values[0].u32[i]; > + } > + > + for (unsigned i = 0; i < len1; i++) { > + if (bit_size == 64) > Can we please switch on bit_size once? I think it's probably actually easier to read that way. It's not a complicated blob of code but having everything depend on bit_size makes it look more complex than it is. Also, for what it's worth, switching once is more efficient. > + u64[len0 + i] = v1->constant->values[0].u64[i]; > + else > + u32[len0 + i] = v1->constant->values[0].u32[i]; > + } > > - for (unsigned i = 0; i < count - 6; i++) { > + for (unsigned i = 0, j = 0; i < count - 6; i++, j++) { > uint32_t comp = w[i + 6]; > - if (comp == (uint32_t)-1) { > - val->constant->values[0].u32[i] = 0xdeadbeef; > + if (bit_size == 64) { > + if (comp == (uint32_t)-1) > + val->constant->values[0].u64[j] = 0xdeadbeefdeadbeef; > + else > + val->constant->values[0].u64[j] = u64[comp]; > } else { > - val->constant->values[0].u32[i] = u[comp]; > + if (comp == (uint32_t)-1) > + val->constant->values[0].u32[j] = 0xdeadbeef; > + else > + val->constant->values[0].u32[j] = u32[comp]; > } > } > break; > -- > 2.11.0 > > _______________________________________________ > mesa-dev mailing list > mesa-dev@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/mesa-dev >
_______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev