st/mesa: call nir_serialize only once per shader

It was called twice.

Acked-by: Pierre-Eric Pelloux-Prayer <pierre-eric.pelloux-prayer@amd.com>
This commit is contained in:
Marek Olšák
2019-11-07 19:24:57 -05:00
parent db0c89d4bf
commit 3a8d686889
3 changed files with 24 additions and 21 deletions
+15 -8
View File
@@ -2068,6 +2068,20 @@ st_precompile_shader_variant(struct st_context *st,
}
}
void
st_serialize_nir(struct st_program *stp)
{
if (!stp->nir_binary) {
struct blob blob;
size_t size;
blob_init(&blob);
nir_serialize(&blob, stp->Base.nir, false);
blob_finish_get_buffer(&blob, &stp->nir_binary, &size);
stp->nir_size = size;
}
}
void
st_finalize_program(struct st_context *st, struct gl_program *prog)
{
@@ -2092,14 +2106,7 @@ st_finalize_program(struct st_context *st, struct gl_program *prog)
* to save memory.
*/
if (prog->nir) {
/* Serialize NIR. */
struct blob blob;
blob_init(&blob);
nir_serialize(&blob, prog->nir, false);
stp->nir_binary = malloc(blob.size);
memcpy(stp->nir_binary, blob.data, blob.size);
stp->nir_size = blob.size;
blob_finish(&blob);
st_serialize_nir(stp);
/* Free NIR. */
assert(stp->state.ir.nir == prog->nir);
+3
View File
@@ -352,6 +352,9 @@ extern bool
st_translate_common_program(struct st_context *st,
struct st_program *stp);
extern void
st_serialize_nir(struct st_program *stp);
extern void
st_finalize_program(struct st_context *st, struct gl_program *prog);
+6 -13
View File
@@ -70,20 +70,13 @@ write_tgsi_to_cache(struct blob *blob, const struct tgsi_token *tokens,
static void
write_nir_to_cache(struct blob *blob, struct gl_program *prog)
{
if (prog->nir) {
/* Reserve intptr_t to store the size. intptr_t is also the alignment
* of NIR in the blob, so the NIR size computation will be trivial.
*/
size_t offset = blob_reserve_intptr(blob);
nir_serialize(blob, prog->nir, false);
struct st_program *stp = (struct st_program *)prog;
st_serialize_nir(stp);
blob_write_intptr(blob, stp->nir_size);
blob_write_bytes(blob, stp->nir_binary, stp->nir_size);
unsigned nir_size = blob->size - offset - sizeof(intptr_t);
*(uintptr_t *)(blob->data + offset) = nir_size;
} else {
struct st_program *stp = (struct st_program *)prog;
blob_write_intptr(blob, stp->nir_size);
blob_write_bytes(blob, stp->nir_binary, stp->nir_size);
}
copy_blob_to_driver_cache_blob(blob, prog);
}