nir/serialize: pack load_const with non-64-bit constants better
authorMarek Olšák <marek.olsak@amd.com>
Tue, 5 Nov 2019 03:15:17 +0000 (22:15 -0500)
committerMarek Olšák <marek.olsak@amd.com>
Sat, 23 Nov 2019 05:02:10 +0000 (00:02 -0500)
v2: use blob_write_uint8/16

Reviewed-by: Jason Ekstrand <jason@jlekstrand.net> (v1)
Reviewed-by: Connor Abbott <cwabbott0@gmail.com>
src/compiler/nir/nir_serialize.c

index 0fa5499657b78e30ae91f33cc592ae61342a054d..354a11b501f59d8cbe0d84ab4561a886a4a85504 100644 (file)
@@ -908,7 +908,30 @@ write_load_const(write_ctx *ctx, const nir_load_const_instr *lc)
    header.load_const.bit_size = encode_bit_size_3bits(lc->def.bit_size);
 
    blob_write_uint32(ctx->blob, header.u32);
-   blob_write_bytes(ctx->blob, lc->value, sizeof(*lc->value) * lc->def.num_components);
+
+   switch (lc->def.bit_size) {
+   case 64:
+      blob_write_bytes(ctx->blob, lc->value,
+                       sizeof(*lc->value) * lc->def.num_components);
+      break;
+
+   case 32:
+      for (unsigned i = 0; i < lc->def.num_components; i++)
+         blob_write_uint32(ctx->blob, lc->value[i].u32);
+      break;
+
+   case 16:
+      for (unsigned i = 0; i < lc->def.num_components; i++)
+         blob_write_uint16(ctx->blob, lc->value[i].u16);
+      break;
+
+   default:
+      assert(lc->def.bit_size <= 8);
+      for (unsigned i = 0; i < lc->def.num_components; i++)
+         blob_write_uint8(ctx->blob, lc->value[i].u8);
+      break;
+   }
+
    write_add_object(ctx, &lc->def);
 }
 
@@ -919,7 +942,28 @@ read_load_const(read_ctx *ctx, union packed_instr header)
       nir_load_const_instr_create(ctx->nir, header.load_const.last_component + 1,
                                   decode_bit_size_3bits(header.load_const.bit_size));
 
-   blob_copy_bytes(ctx->blob, lc->value, sizeof(*lc->value) * lc->def.num_components);
+   switch (lc->def.bit_size) {
+   case 64:
+      blob_copy_bytes(ctx->blob, lc->value, sizeof(*lc->value) * lc->def.num_components);
+      break;
+
+   case 32:
+      for (unsigned i = 0; i < lc->def.num_components; i++)
+         lc->value[i].u32 = blob_read_uint32(ctx->blob);
+      break;
+
+   case 16:
+      for (unsigned i = 0; i < lc->def.num_components; i++)
+         lc->value[i].u16 = blob_read_uint16(ctx->blob);
+      break;
+
+   default:
+      assert(lc->def.bit_size <= 8);
+      for (unsigned i = 0; i < lc->def.num_components; i++)
+         lc->value[i].u8 = blob_read_uint8(ctx->blob);
+      break;
+   }
+
    read_add_object(ctx, &lc->def);
    return lc;
 }