[Mesa-dev] [PATCH v3 06/22] spirv: fix SpvOpSpecConstantOp with SpvOpVectorShuffle working with double-based vecs
Jason Ekstrand
jason at jlekstrand.net
Thu Jan 5 20:51:22 UTC 2017
On Thu, Jan 5, 2017 at 12:39 PM, Jason Ekstrand <jason at jlekstrand.net>
wrote:
> On Thu, Jan 5, 2017 at 2:18 AM, Samuel Iglesias Gonsálvez <
> siglesias at 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 <siglesias at 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.\
>
With that,
Reviewed-by: Jason Ekstrand <jason at jlekstrand.net>
>
>
>> + 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 at lists.freedesktop.org
>> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
>>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/mesa-dev/attachments/20170105/6ed0f38e/attachment.html>
More information about the mesa-dev
mailing list