mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-07 00:38:48 +02:00
llvmpipe: use ppc64le/ppc64 Large code model for JIT-compiled shaders
Large programs, e.g. gnome-shell and firefox, may tax the
addressability of the Medium code model once a (potentially unbounded)
number of dynamically generated JIT-compiled shader programs are
linked in and relocated. Yet the default code model as of LLVM 8 is
Medium or even Small.
The cost of changing from Medium to Large is negligible:
- an additional 8-byte pointer stored immediately before the shader entrypoint;
- change an add-immediate (addis) instruction to a load (ld).
Testing with WebGL Conformance
(https://www.khronos.org/registry/webgl/sdk/tests/webgl-conformance-tests.html)
yields clean runs with this change (and crashes without it).
Testing with glxgears shows no detectable performance difference.
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1753327, 1753789, 1543572, 1747110, and 1582226
Closes: https://gitlab.freedesktop.org/mesa/mesa/issues/223
Co-authored by: Nemanja Ivanovic <nemanjai@ca.ibm.com>, Tom Stellard <tstellar@redhat.com>
CC: mesa-stable@lists.freedesktop.org
Signed-off-by: Ben Crocker <bcrocker@redhat.com>
(cherry picked from commit 9c3be6d21f)
Conflicts resolved Dylan (PIPE_ARCH -> UTIL_ARCH rename)
This commit is contained in:
parent
60c299c542
commit
ae071434e9
1 changed files with 15 additions and 1 deletions
|
|
@ -692,7 +692,20 @@ lp_build_create_jit_compiler_for_module(LLVMExecutionEngineRef *OutJIT,
|
|||
* when not using MCJIT so no instructions are generated which the old JIT
|
||||
* can't handle. Not entirely sure if we really need to do anything yet.
|
||||
*/
|
||||
#if defined(PIPE_ARCH_LITTLE_ENDIAN) && defined(PIPE_ARCH_PPC_64)
|
||||
|
||||
#ifdef PIPE_ARCH_PPC_64
|
||||
/*
|
||||
* Large programs, e.g. gnome-shell and firefox, may tax the addressability
|
||||
* of the Medium code model once dynamically generated JIT-compiled shader
|
||||
* programs are linked in and relocated. Yet the default code model as of
|
||||
* LLVM 8 is Medium or even Small.
|
||||
* The cost of changing from Medium to Large is negligible:
|
||||
* - an additional 8-byte pointer stored immediately before the shader entrypoint;
|
||||
* - change an add-immediate (addis) instruction to a load (ld).
|
||||
*/
|
||||
builder.setCodeModel(CodeModel::Large);
|
||||
|
||||
#if PIPE_ARCH_LITTLE_ENDIAN
|
||||
/*
|
||||
* Versions of LLVM prior to 4.0 lacked a table entry for "POWER8NVL",
|
||||
* resulting in (big-endian) "generic" being returned on
|
||||
|
|
@ -704,6 +717,7 @@ lp_build_create_jit_compiler_for_module(LLVMExecutionEngineRef *OutJIT,
|
|||
*/
|
||||
if (MCPU == "generic")
|
||||
MCPU = "pwr8";
|
||||
#endif
|
||||
#endif
|
||||
builder.setMCPU(MCPU);
|
||||
if (gallivm_debug & (GALLIVM_DEBUG_IR | GALLIVM_DEBUG_ASM | GALLIVM_DEBUG_DUMP_BC)) {
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue