From b4c37ce2140c0195005d865b7a4de903ef50a097 Mon Sep 17 00:00:00 2001 From: Jordan Justen Date: Sat, 4 Nov 2017 16:53:15 -0700 Subject: [PATCH] i965: Add ARB_get_program_binary support using nir_serialization MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit This resolves an apparent game bug described in 85564. The game doesn't properly handle ARB_get_program_binary with 0 supported formats. V2 (Timothy Arceri): - less driver code as more has been moved into the common helpers. Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=85564 Signed-off-by: Timothy Arceri Signed-off-by: Jordan Justen (v1) Reviewed-by: Tapani Pälli --- src/mesa/drivers/dri/i965/Makefile.sources | 1 + src/mesa/drivers/dri/i965/brw_context.c | 10 +++ src/mesa/drivers/dri/i965/brw_context.h | 15 ++++ src/mesa/drivers/dri/i965/brw_program.h | 6 -- .../drivers/dri/i965/brw_program_binary.c | 72 +++++++++++++++++++ src/mesa/drivers/dri/i965/meson.build | 1 + 6 files changed, 99 insertions(+), 6 deletions(-) create mode 100644 src/mesa/drivers/dri/i965/brw_program_binary.c diff --git a/src/mesa/drivers/dri/i965/Makefile.sources b/src/mesa/drivers/dri/i965/Makefile.sources index 5599f0a4b1e..d928f71b431 100644 --- a/src/mesa/drivers/dri/i965/Makefile.sources +++ b/src/mesa/drivers/dri/i965/Makefile.sources @@ -38,6 +38,7 @@ i965_FILES = \ brw_performance_query.c \ brw_program.c \ brw_program.h \ + brw_program_binary.c \ brw_program_cache.c \ brw_primitive_restart.c \ brw_queryobj.c \ diff --git a/src/mesa/drivers/dri/i965/brw_context.c b/src/mesa/drivers/dri/i965/brw_context.c index b62852d90c8..126c187f629 100644 --- a/src/mesa/drivers/dri/i965/brw_context.c +++ b/src/mesa/drivers/dri/i965/brw_context.c @@ -329,6 +329,13 @@ brw_init_driver_functions(struct brw_context *brw, if (devinfo->gen >= 6) functions->GetSamplePosition = gen6_get_sample_position; + + /* GL_ARB_get_program_binary */ + brw_program_binary_init(brw->screen->deviceID); + functions->GetProgramBinaryDriverSHA1 = brw_get_program_binary_driver_sha1; + functions->ProgramBinarySerializeDriverBlob = brw_program_serialize_nir; + functions->ProgramBinaryDeserializeDriverBlob = + brw_deserialize_program_binary; } static void @@ -696,6 +703,9 @@ brw_initialize_context_constants(struct brw_context *brw) if (!(ctx->Const.ContextFlags & GL_CONTEXT_FLAG_DEBUG_BIT)) ctx->Const.AllowMappedBuffersDuringExecution = true; + + /* GL_ARB_get_program_binary */ + ctx->Const.NumProgramBinaryFormats = 1; } static void diff --git a/src/mesa/drivers/dri/i965/brw_context.h b/src/mesa/drivers/dri/i965/brw_context.h index aa91380b964..0f0aad85348 100644 --- a/src/mesa/drivers/dri/i965/brw_context.h +++ b/src/mesa/drivers/dri/i965/brw_context.h @@ -1579,6 +1579,21 @@ brw_check_for_reset(struct brw_context *brw); extern void brw_init_compute_functions(struct dd_function_table *functions); +/* brw_program_binary.c */ +extern void +brw_program_binary_init(unsigned device_id); +extern void +brw_get_program_binary_driver_sha1(struct gl_context *ctx, uint8_t *sha1); +extern void +brw_deserialize_program_binary(struct gl_context *ctx, + struct gl_shader_program *shProg, + struct gl_program *prog); +void +brw_program_serialize_nir(struct gl_context *ctx, struct gl_program *prog); +void +brw_program_deserialize_nir(struct gl_context *ctx, struct gl_program *prog, + gl_shader_stage stage); + /*====================================================================== * Inline conversion functions. These are better-typed than the * macros used previously: diff --git a/src/mesa/drivers/dri/i965/brw_program.h b/src/mesa/drivers/dri/i965/brw_program.h index c89614d5c90..701b8da482e 100644 --- a/src/mesa/drivers/dri/i965/brw_program.h +++ b/src/mesa/drivers/dri/i965/brw_program.h @@ -81,12 +81,6 @@ brw_assign_common_binding_table_offsets(const struct gen_device_info *devinfo, struct brw_stage_prog_data *stage_prog_data, uint32_t next_binding_table_offset); -void -brw_program_serialize_nir(struct gl_context *ctx, struct gl_program *prog); -void -brw_program_deserialize_nir(struct gl_context *ctx, struct gl_program *prog, - gl_shader_stage stage); - void brw_stage_prog_data_free(const void *prog_data); diff --git a/src/mesa/drivers/dri/i965/brw_program_binary.c b/src/mesa/drivers/dri/i965/brw_program_binary.c new file mode 100644 index 00000000000..f1b327de4b3 --- /dev/null +++ b/src/mesa/drivers/dri/i965/brw_program_binary.c @@ -0,0 +1,72 @@ +/* + * Copyright (c) 2017 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include + +#include "util/build_id.h" +#include "util/mesa-sha1.h" + +#include "brw_context.h" +#include "brw_program.h" + +static uint8_t driver_sha1[20]; + +void +brw_program_binary_init(unsigned device_id) +{ + const struct build_id_note *note = + build_id_find_nhdr_for_addr(brw_program_binary_init); + assert(note); + + /** + * With Mesa's megadrivers, taking the sha1 of i965_dri.so may not be + * unique. Therefore, we make a sha1 of the "i965" string and the sha1 + * build id from i965_dri.so. + */ + struct mesa_sha1 ctx; + _mesa_sha1_init(&ctx); + char renderer[10]; + assert(device_id < 0x10000); + int len = snprintf(renderer, sizeof(renderer), "i965_%04x", device_id); + assert(len == sizeof(renderer) - 1); + _mesa_sha1_update(&ctx, renderer, len); + _mesa_sha1_update(&ctx, build_id_data(note), build_id_length(note)); + _mesa_sha1_final(&ctx, driver_sha1); +} + +void +brw_get_program_binary_driver_sha1(struct gl_context *ctx, uint8_t *sha1) +{ + memcpy(sha1, driver_sha1, sizeof(uint8_t) * 20); +} + +/* This is just a wrapper around brw_program_deserialize_nir() as i965 + * doesn't need gl_shader_program like other drivers do. + */ +void +brw_deserialize_program_binary(struct gl_context *ctx, + struct gl_shader_program *shProg, + struct gl_program *prog) +{ + brw_program_deserialize_nir(ctx, prog, prog->info.stage); +} diff --git a/src/mesa/drivers/dri/i965/meson.build b/src/mesa/drivers/dri/i965/meson.build index 4b62625deda..0a214a0d8be 100644 --- a/src/mesa/drivers/dri/i965/meson.build +++ b/src/mesa/drivers/dri/i965/meson.build @@ -57,6 +57,7 @@ files_i965 = files( 'brw_performance_query.c', 'brw_program.c', 'brw_program.h', + 'brw_program_binary.c', 'brw_program_cache.c', 'brw_primitive_restart.c', 'brw_queryobj.c', -- 2.30.2