[Mesa-dev] [PATCH 21/23] st/glsl_to_tgsi: add ARB_get_program_binary support using TGSI
Timothy Arceri
tarceri at itsqueeze.com
Wed Nov 29 01:24:57 UTC 2017
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
More information about the mesa-dev
mailing list