On Thu, 2017-01-05 at 17:32 +0100, Erik Faye-Lund wrote: > > > On Jan 5, 2017 10:20, "Samuel Iglesias Gonsálvez" <siglesias@igalia.c > om> 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) > + 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; > > If this is really intended, shouldn't there be some explanation? >
Right. I am going to add a comment. Thanks, Sam > + 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; > > Same... > > + 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 >
signature.asc
Description: This is a digitally signed message part
_______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev