mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-08 09:08:10 +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
35182247fc
commit
32aba91c07
1 changed files with 15 additions and 1 deletions
|
|
@ -456,7 +456,20 @@ lp_build_create_jit_compiler_for_module(LLVMExecutionEngineRef *OutJIT,
|
||||||
* when not using MCJIT so no instructions are generated which the old JIT
|
* 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.
|
* 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",
|
* Versions of LLVM prior to 4.0 lacked a table entry for "POWER8NVL",
|
||||||
* resulting in (big-endian) "generic" being returned on
|
* resulting in (big-endian) "generic" being returned on
|
||||||
|
|
@ -468,6 +481,7 @@ lp_build_create_jit_compiler_for_module(LLVMExecutionEngineRef *OutJIT,
|
||||||
*/
|
*/
|
||||||
if (MCPU == "generic")
|
if (MCPU == "generic")
|
||||||
MCPU = "pwr8";
|
MCPU = "pwr8";
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
builder.setMCPU(MCPU);
|
builder.setMCPU(MCPU);
|
||||||
if (gallivm_debug & (GALLIVM_DEBUG_IR | GALLIVM_DEBUG_ASM | GALLIVM_DEBUG_DUMP_BC)) {
|
if (gallivm_debug & (GALLIVM_DEBUG_IR | GALLIVM_DEBUG_ASM | GALLIVM_DEBUG_DUMP_BC)) {
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue