This resolves a game bug in Deal Island. The game doesn't properly handle ARB_get_program_binary with 0 supported formats, and ends up crashing.
This will enable ARB_get_program_binary binary support for any driver that currently enables the on-disk shader cache. Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=85564 --- src/mesa/state_tracker/st_context.c | 6 ++++++ src/mesa/state_tracker/st_extensions.c | 4 ++++ 2 files changed, 10 insertions(+) diff --git a/src/mesa/state_tracker/st_context.c b/src/mesa/state_tracker/st_context.c index da1cca471ba..6f6dd857d97 100644 --- a/src/mesa/state_tracker/st_context.c +++ b/src/mesa/state_tracker/st_context.c @@ -67,20 +67,21 @@ #include "st_cb_strings.h" #include "st_cb_texturebarrier.h" #include "st_cb_viewport.h" #include "st_atom.h" #include "st_draw.h" #include "st_extensions.h" #include "st_gen_mipmap.h" #include "st_pbo.h" #include "st_program.h" #include "st_sampler_view.h" +#include "st_shader_cache.h" #include "st_vdpau.h" #include "st_texture.h" #include "pipe/p_context.h" #include "util/u_inlines.h" #include "util/u_upload_mgr.h" #include "util/u_vbuf.h" #include "cso_cache/cso_context.h" DEBUG_GET_ONCE_BOOL_OPTION(mesa_mvp_dp4, "MESA_MVP_DP4", FALSE) @@ -753,11 +754,16 @@ st_init_driver_functions(struct pipe_screen *screen, if (screen->get_param(screen, PIPE_CAP_STRING_MARKER)) functions->EmitStringMarker = st_emit_string_marker; functions->Enable = st_Enable; functions->UpdateState = st_invalidate_state; functions->QueryMemoryInfo = st_query_memory_info; functions->SetBackgroundContext = st_set_background_context; functions->GetDriverUuid = st_get_device_uuid; functions->GetDeviceUuid = st_get_driver_uuid; + + /* GL_ARB_get_program_binary */ + functions->GetProgramBinaryDriverSHA1 = st_get_program_binary_driver_sha1; + functions->ProgramBinarySerializeDriverBlob = st_serialise_tgsi_program; + functions->ProgramBinaryDeserializeDriverBlob = st_deserialise_tgsi_program; } diff --git a/src/mesa/state_tracker/st_extensions.c b/src/mesa/state_tracker/st_extensions.c index de3d1ef4e9b..d4cb901f911 100644 --- a/src/mesa/state_tracker/st_extensions.c +++ b/src/mesa/state_tracker/st_extensions.c @@ -410,20 +410,24 @@ void st_init_limits(struct pipe_screen *screen, c->Program[MESA_SHADER_FRAGMENT].MaxUniformBlocks + c->Program[MESA_SHADER_COMPUTE].MaxUniformBlocks; assert(c->MaxCombinedUniformBlocks <= MAX_COMBINED_UNIFORM_BUFFERS); } c->GLSLFragCoordIsSysVal = screen->get_param(screen, PIPE_CAP_TGSI_FS_POSITION_IS_SYSVAL); c->GLSLFrontFacingIsSysVal = screen->get_param(screen, PIPE_CAP_TGSI_FS_FACE_IS_INTEGER_SYSVAL); + /* GL_ARB_get_program_binary */ + if (screen->get_disk_shader_cache && screen->get_disk_shader_cache(screen)) + c->NumProgramBinaryFormats = 1; + c->MaxAtomicBufferBindings = c->Program[MESA_SHADER_FRAGMENT].MaxAtomicBuffers; if (!ssbo_atomic) { /* for separate atomic buffers - there atomic buffer size will be limited */ c->MaxAtomicBufferSize = c->Program[MESA_SHADER_FRAGMENT].MaxAtomicCounters * ATOMIC_COUNTER_SIZE; /* on all HW with separate atomic (evergreen) the following lines are true. not sure it's worth adding CAPs for this at this stage. */ -- 2.14.3 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev