meson/gallium: Add an option to not use LLVM for gallium draw module

We'd like to use one Mesa build environment which builds our CL compiler
stack (which needs Clang/LLVM) and which builds our GL driver. The GL
driver doesn't really need LLVM support, and since we're statically
linking LLVM, removing it from the driver drastically reduces our DLL
size on disk.

Acked-by: Eric Anholt <eric@anholt.net>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/9259>
This commit is contained in:
Jesse Natalie 2021-02-24 10:42:49 -08:00 committed by Marge Bot
parent 3adac6affc
commit 3955dd077b
22 changed files with 73 additions and 57 deletions

View File

@ -97,7 +97,7 @@ endif
define mesa-build-with-llvm
$(if $(filter $(MESA_ANDROID_MAJOR_VERSION), 4 5 6 7), \
$(warning Unsupported LLVM version in Android $(MESA_ANDROID_MAJOR_VERSION)),) \
$(eval LOCAL_CFLAGS += -DLLVM_AVAILABLE -DLLVM_IS_SHARED=1 -DMESA_LLVM_VERSION_STRING=\"3.9\") \
$(eval LOCAL_CFLAGS += -DLLVM_AVAILABLE -DDRAW_LLVM_AVAILABLE -DLLVM_IS_SHARED=1 -DMESA_LLVM_VERSION_STRING=\"3.9\") \
$(eval LOCAL_SHARED_LIBRARIES += libLLVM)
endef

View File

@ -1574,6 +1574,7 @@ endif
dep_llvm = null_dep
with_llvm = false
draw_with_llvm = get_option('draw-use-llvm')
if _llvm != 'disabled'
dep_llvm = dependency(
'llvm',
@ -1596,6 +1597,12 @@ if with_llvm
pre_args += '-DMESA_LLVM_VERSION_STRING="@0@"'.format(dep_llvm.version())
pre_args += '-DLLVM_IS_SHARED=@0@'.format(_shared_llvm.to_int())
if draw_with_llvm
pre_args += '-DDRAW_LLVM_AVAILABLE'
elif with_gallium_swr
error('SWR requires LLVM draw support.')
endif
# LLVM can be built without rtti, turning off rtti changes the ABI of C++
# programs, so we need to build all C++ code in mesa without rtti as well to
# ensure that linking works.
@ -1627,6 +1634,8 @@ elif with_gallium_opencl
error('The OpenCL "Clover" state tracker requires LLVM, but LLVM is disabled.')
elif with_microsoft_clc
error('The Microsoft CLC compiler requires LLVM, but LLVM is disabled.')
else
draw_with_llvm = false
endif
with_opencl_spirv = (_opencl != 'disabled' and get_option('opencl-spirv')) or with_microsoft_clc

View File

@ -321,6 +321,12 @@ option(
choices : ['auto', 'true', 'false', 'enabled', 'disabled'],
description : 'Whether to link LLVM shared or statically.'
)
option(
'draw-use-llvm',
type : 'boolean',
value : 'true',
description : 'Whether to use LLVM for the Gallium draw module, if LLVM is included.'
)
option(
'valgrind',
type : 'combo',

View File

@ -341,6 +341,7 @@ def generate(env):
# Define LLVM_AVAILABLE macro to guard code blocks, and MESA_LLVM_VERSION_STRING
env.Prepend(CPPDEFINES = [('LLVM_AVAILABLE', 1)])
env.Prepend(CPPDEFINES = [('DRAW_LLVM_AVAILABLE', 1)])
env.Prepend(CPPDEFINES = [('MESA_LLVM_VERSION_STRING=\\"%s\\"' % llvm_version)])
def exists(env):

View File

@ -46,7 +46,7 @@
#include "draw_gs.h"
#include "draw_tess.h"
#ifdef LLVM_AVAILABLE
#ifdef DRAW_LLVM_AVAILABLE
#include "gallivm/lp_bld_init.h"
#include "gallivm/lp_bld_limits.h"
#include "draw_llvm.h"
@ -67,7 +67,7 @@ draw_get_option_use_llvm(void)
bool
draw_has_llvm(void)
{
#ifdef LLVM_AVAILABLE
#ifdef DRAW_LLVM_AVAILABLE
return draw_get_option_use_llvm();
#else
return false;
@ -88,7 +88,7 @@ draw_create_context(struct pipe_context *pipe, void *context,
/* we need correct cpu caps for disabling denorms in draw_vbo() */
util_cpu_detect();
#ifdef LLVM_AVAILABLE
#ifdef DRAW_LLVM_AVAILABLE
if (try_llvm && draw_get_option_use_llvm()) {
draw->llvm = draw_llvm_create(draw, (LLVMContextRef)context);
}
@ -123,7 +123,7 @@ draw_create(struct pipe_context *pipe)
}
#ifdef LLVM_AVAILABLE
#ifdef DRAW_LLVM_AVAILABLE
struct draw_context *
draw_create_with_llvm_context(struct pipe_context *pipe,
void *context)
@ -233,7 +233,7 @@ void draw_destroy( struct draw_context *draw )
draw_pt_destroy( draw );
draw_vs_destroy( draw );
draw_gs_destroy( draw );
#ifdef LLVM_AVAILABLE
#ifdef DRAW_LLVM_AVAILABLE
if (draw->llvm)
draw_llvm_destroy( draw->llvm );
#endif
@ -1140,7 +1140,7 @@ draw_set_samplers(struct draw_context *draw,
draw->num_samplers[shader_stage] = num;
#ifdef LLVM_AVAILABLE
#ifdef DRAW_LLVM_AVAILABLE
if (draw->llvm)
draw_llvm_set_sampler_state(draw, shader_stage);
#endif
@ -1180,7 +1180,7 @@ draw_set_mapped_texture(struct draw_context *draw,
uint32_t img_stride[PIPE_MAX_TEXTURE_LEVELS],
uint32_t mip_offsets[PIPE_MAX_TEXTURE_LEVELS])
{
#ifdef LLVM_AVAILABLE
#ifdef DRAW_LLVM_AVAILABLE
if (draw->llvm)
draw_llvm_set_mapped_texture(draw,
shader_stage,
@ -1202,7 +1202,7 @@ draw_set_mapped_image(struct draw_context *draw,
uint32_t num_samples,
uint32_t sample_stride)
{
#ifdef LLVM_AVAILABLE
#ifdef DRAW_LLVM_AVAILABLE
if (draw->llvm)
draw_llvm_set_mapped_image(draw,
shader_stage,
@ -1241,7 +1241,7 @@ int
draw_get_shader_param(enum pipe_shader_type shader, enum pipe_shader_cap param)
{
#ifdef LLVM_AVAILABLE
#ifdef DRAW_LLVM_AVAILABLE
if (draw_get_option_use_llvm()) {
switch(shader) {
case PIPE_SHADER_VERTEX:

View File

@ -69,7 +69,7 @@ bool draw_has_llvm(void);
struct draw_context *draw_create( struct pipe_context *pipe );
#ifdef LLVM_AVAILABLE
#ifdef DRAW_LLVM_AVAILABLE
struct draw_context *draw_create_with_llvm_context(struct pipe_context *pipe,
void *context);
#endif

View File

@ -29,7 +29,7 @@
#include "draw_private.h"
#include "draw_context.h"
#ifdef LLVM_AVAILABLE
#ifdef DRAW_LLVM_AVAILABLE
#include "draw_llvm.h"
#endif
@ -222,7 +222,7 @@ static void tgsi_gs_run(struct draw_geometry_shader *shader,
out_prims[i] = machine->OutputPrimCount[i];
}
#ifdef LLVM_AVAILABLE
#ifdef DRAW_LLVM_AVAILABLE
static void
llvm_fetch_gs_input(struct draw_geometry_shader *shader,
@ -622,7 +622,7 @@ int draw_geometry_shader_run(struct draw_geometry_shader *shader,
shader->input = input;
shader->input_info = input_info;
#ifdef LLVM_AVAILABLE
#ifdef DRAW_LLVM_AVAILABLE
if (shader->draw->llvm) {
for (i = 0; i < shader->num_vertex_streams; i++) {
shader->gs_output[i] = output_verts[i].verts;
@ -753,14 +753,14 @@ struct draw_geometry_shader *
draw_create_geometry_shader(struct draw_context *draw,
const struct pipe_shader_state *state)
{
#ifdef LLVM_AVAILABLE
#ifdef DRAW_LLVM_AVAILABLE
boolean use_llvm = draw->llvm != NULL;
struct llvm_geometry_shader *llvm_gs = NULL;
#endif
struct draw_geometry_shader *gs;
unsigned i;
#ifdef LLVM_AVAILABLE
#ifdef DRAW_LLVM_AVAILABLE
if (use_llvm) {
llvm_gs = CALLOC_STRUCT(llvm_geometry_shader);
@ -796,7 +796,7 @@ draw_create_geometry_shader(struct draw_context *draw,
/* setup the defaults */
gs->max_out_prims = 0;
#ifdef LLVM_AVAILABLE
#ifdef DRAW_LLVM_AVAILABLE
if (use_llvm) {
/* TODO: change the input array to handle the following
vector length, instead of the currently hardcoded
@ -853,7 +853,7 @@ draw_create_geometry_shader(struct draw_context *draw,
gs->num_vertex_streams = gs->state.stream_output.output[i].stream + 1;
}
#ifdef LLVM_AVAILABLE
#ifdef DRAW_LLVM_AVAILABLE
if (use_llvm) {
int vector_size = gs->vector_length * sizeof(float);
gs->gs_input = align_malloc(sizeof(struct draw_gs_inputs), 16);
@ -913,7 +913,7 @@ void draw_delete_geometry_shader(struct draw_context *draw,
if (!dgs) {
return;
}
#ifdef LLVM_AVAILABLE
#ifdef DRAW_LLVM_AVAILABLE
if (draw->llvm) {
struct llvm_geometry_shader *shader = llvm_geometry_shader(dgs);
struct draw_gs_llvm_variant_list_item *li;
@ -955,7 +955,7 @@ void draw_delete_geometry_shader(struct draw_context *draw,
}
#ifdef LLVM_AVAILABLE
#ifdef DRAW_LLVM_AVAILABLE
void draw_gs_set_current_variant(struct draw_geometry_shader *shader,
struct draw_gs_llvm_variant *variant)
{

View File

@ -36,7 +36,7 @@
struct draw_context;
#ifdef LLVM_AVAILABLE
#ifdef DRAW_LLVM_AVAILABLE
struct draw_gs_jit_context;
struct draw_gs_llvm_variant;
@ -96,7 +96,7 @@ struct draw_geometry_shader {
unsigned num_invocations;
unsigned invocation_id;
#ifdef LLVM_AVAILABLE
#ifdef DRAW_LLVM_AVAILABLE
struct draw_gs_inputs *gs_input;
struct draw_gs_jit_context *jit_context;
struct draw_gs_llvm_variant *current_variant;
@ -146,7 +146,7 @@ void draw_geometry_shader_prepare(struct draw_geometry_shader *shader,
int draw_gs_max_output_vertices(struct draw_geometry_shader *shader,
unsigned pipe_prim);
#ifdef LLVM_AVAILABLE
#ifdef DRAW_LLVM_AVAILABLE
void draw_gs_set_current_variant(struct draw_geometry_shader *shader,
struct draw_gs_llvm_variant *variant);
#endif

View File

@ -318,7 +318,7 @@ generate_aaline_fs(struct aaline_stage *aaline)
static boolean
generate_aaline_fs_nir(struct aaline_stage *aaline)
{
#ifdef LLVM_AVAILABLE
#ifdef DRAW_LLVM_AVAILABLE
struct pipe_context *pipe = aaline->stage.draw->pipe;
const struct pipe_shader_state *orig_fs = &aaline->fs->state;
struct pipe_shader_state aaline_fs;
@ -644,7 +644,7 @@ aaline_create_fs_state(struct pipe_context *pipe,
aafs->state.type = fs->type;
if (fs->type == PIPE_SHADER_IR_TGSI)
aafs->state.tokens = tgsi_dup_tokens(fs->tokens);
#ifdef LLVM_AVAILABLE
#ifdef DRAW_LLVM_AVAILABLE
else
aafs->state.ir.nir = nir_shader_clone(NULL, fs->ir.nir);
#endif

View File

@ -411,7 +411,7 @@ fail:
static boolean
generate_aapoint_fs_nir(struct aapoint_stage *aapoint)
{
#ifdef LLVM_AVAILABLE
#ifdef DRAW_LLVM_AVAILABLE
struct pipe_context *pipe = aapoint->stage.draw->pipe;
const struct pipe_shader_state *orig_fs = &aapoint->fs->state;
struct pipe_shader_state aapoint_fs;
@ -748,7 +748,7 @@ aapoint_create_fs_state(struct pipe_context *pipe,
aafs->state.type = fs->type;
if (fs->type == PIPE_SHADER_IR_TGSI)
aafs->state.tokens = tgsi_dup_tokens(fs->tokens);
#ifdef LLVM_AVAILABLE
#ifdef DRAW_LLVM_AVAILABLE
else
aafs->state.ir.nir = nir_shader_clone(NULL, fs->ir.nir);
#endif

View File

@ -144,7 +144,7 @@ generate_pstip_fs(struct pstip_stage *pstip)
if (pstip_fs.tokens == NULL)
return FALSE;
} else {
#ifdef LLVM_AVAILABLE
#ifdef DRAW_LLVM_AVAILABLE
pstip_fs.ir.nir = nir_shader_clone(NULL, orig_fs->ir.nir);
nir_lower_pstipple_fs(pstip_fs.ir.nir,
&pstip->fs->sampler_unit, 0, wincoord_file == TGSI_FILE_SYSTEM_VALUE);

View File

@ -46,7 +46,7 @@
#include "tgsi/tgsi_scan.h"
#ifdef LLVM_AVAILABLE
#ifdef DRAW_LLVM_AVAILABLE
struct gallivm_state;
#endif

View File

@ -200,7 +200,7 @@ boolean draw_pt_init( struct draw_context *draw )
if (!draw->pt.middle.general)
return FALSE;
#ifdef LLVM_AVAILABLE
#ifdef DRAW_LLVM_AVAILABLE
if (draw->llvm)
draw->pt.middle.llvm = draw_pt_fetch_pipeline_or_emit_llvm( draw );
#endif
@ -546,7 +546,7 @@ draw_vbo(struct draw_context *draw,
draw->pt.vertex_element,
draw->pt.nr_vertex_elements,
info);
#ifdef LLVM_AVAILABLE
#ifdef DRAW_LLVM_AVAILABLE
if (!draw->llvm)
#endif
{

View File

@ -23,7 +23,7 @@
*
**************************************************************************/
#include "draw_tess.h"
#ifdef LLVM_AVAILABLE
#ifdef DRAW_LLVM_AVAILABLE
#include "draw_llvm.h"
#endif
@ -48,7 +48,7 @@ draw_tes_get_input_index(int semantic, int index,
return -1;
}
#ifdef LLVM_AVAILABLE
#ifdef DRAW_LLVM_AVAILABLE
#define DEBUG_INPUTS 0
static void
llvm_fetch_tcs_input(struct draw_tess_ctrl_shader *shader,
@ -188,7 +188,7 @@ int draw_tess_ctrl_shader_run(struct draw_tess_ctrl_shader *shader,
if (shader->draw->collect_statistics) {
shader->draw->statistics.hs_invocations += num_patches;
}
#ifdef LLVM_AVAILABLE
#ifdef DRAW_LLVM_AVAILABLE
for (unsigned i = 0; i < num_patches; i++) {
uint32_t vert_start = output_verts->count;
@ -212,7 +212,7 @@ int draw_tess_ctrl_shader_run(struct draw_tess_ctrl_shader *shader,
return 0;
}
#ifdef LLVM_AVAILABLE
#ifdef DRAW_LLVM_AVAILABLE
#define DEBUG_INPUTS 0
static void
llvm_fetch_tes_input(struct draw_tess_eval_shader *shader,
@ -350,7 +350,7 @@ int draw_tess_eval_shader_run(struct draw_tess_eval_shader *shader,
shader->input_vertex_stride = input_stride;
shader->input_info = input_info;
#ifdef LLVM_AVAILABLE
#ifdef DRAW_LLVM_AVAILABLE
struct pipe_tessellation_factors factors;
struct pipe_tessellator_data data = { 0 };
struct pipe_tessellator *ptess = p_tess_init(shader->prim_mode,
@ -415,13 +415,13 @@ struct draw_tess_ctrl_shader *
draw_create_tess_ctrl_shader(struct draw_context *draw,
const struct pipe_shader_state *state)
{
#ifdef LLVM_AVAILABLE
#ifdef DRAW_LLVM_AVAILABLE
boolean use_llvm = draw->llvm != NULL;
struct llvm_tess_ctrl_shader *llvm_tcs = NULL;
#endif
struct draw_tess_ctrl_shader *tcs;
#ifdef LLVM_AVAILABLE
#ifdef DRAW_LLVM_AVAILABLE
if (use_llvm) {
llvm_tcs = CALLOC_STRUCT(llvm_tess_ctrl_shader);
@ -447,7 +447,7 @@ draw_create_tess_ctrl_shader(struct draw_context *draw,
tcs->vector_length = 4;
tcs->vertices_out = tcs->info.properties[TGSI_PROPERTY_TCS_VERTICES_OUT];
#ifdef LLVM_AVAILABLE
#ifdef DRAW_LLVM_AVAILABLE
if (use_llvm) {
tcs->tcs_input = align_malloc(sizeof(struct draw_tcs_inputs), 16);
@ -484,7 +484,7 @@ void draw_delete_tess_ctrl_shader(struct draw_context *draw,
if (!dtcs)
return;
#ifdef LLVM_AVAILABLE
#ifdef DRAW_LLVM_AVAILABLE
if (draw->llvm) {
struct llvm_tess_ctrl_shader *shader = llvm_tess_ctrl_shader(dtcs);
@ -508,7 +508,7 @@ void draw_delete_tess_ctrl_shader(struct draw_context *draw,
FREE(dtcs);
}
#ifdef LLVM_AVAILABLE
#ifdef DRAW_LLVM_AVAILABLE
void draw_tcs_set_current_variant(struct draw_tess_ctrl_shader *shader,
struct draw_tcs_llvm_variant *variant)
{
@ -520,13 +520,13 @@ struct draw_tess_eval_shader *
draw_create_tess_eval_shader(struct draw_context *draw,
const struct pipe_shader_state *state)
{
#ifdef LLVM_AVAILABLE
#ifdef DRAW_LLVM_AVAILABLE
boolean use_llvm = draw->llvm != NULL;
struct llvm_tess_eval_shader *llvm_tes = NULL;
#endif
struct draw_tess_eval_shader *tes;
#ifdef LLVM_AVAILABLE
#ifdef DRAW_LLVM_AVAILABLE
if (use_llvm) {
llvm_tes = CALLOC_STRUCT(llvm_tess_eval_shader);
@ -570,7 +570,7 @@ draw_create_tess_eval_shader(struct draw_context *draw,
}
}
#ifdef LLVM_AVAILABLE
#ifdef DRAW_LLVM_AVAILABLE
if (use_llvm) {
tes->tes_input = align_malloc(sizeof(struct draw_tes_inputs), 16);
@ -605,7 +605,7 @@ void draw_delete_tess_eval_shader(struct draw_context *draw,
if (!dtes)
return;
#ifdef LLVM_AVAILABLE
#ifdef DRAW_LLVM_AVAILABLE
if (draw->llvm) {
struct llvm_tess_eval_shader *shader = llvm_tess_eval_shader(dtes);
struct draw_tes_llvm_variant_list_item *li;
@ -626,7 +626,7 @@ void draw_delete_tess_eval_shader(struct draw_context *draw,
FREE(dtes);
}
#ifdef LLVM_AVAILABLE
#ifdef DRAW_LLVM_AVAILABLE
void draw_tes_set_current_variant(struct draw_tess_eval_shader *shader,
struct draw_tes_llvm_variant *variant)
{

View File

@ -30,7 +30,7 @@
#include "draw_private.h"
struct draw_context;
#ifdef LLVM_AVAILABLE
#ifdef DRAW_LLVM_AVAILABLE
#define NUM_PATCH_INPUTS 32
#define NUM_TCS_INPUTS (PIPE_MAX_SHADER_INPUTS - NUM_PATCH_INPUTS)
@ -64,7 +64,7 @@ struct draw_tess_ctrl_shader {
unsigned input_vertex_stride;
const float (*input)[4];
const struct tgsi_shader_info *input_info;
#ifdef LLVM_AVAILABLE
#ifdef DRAW_LLVM_AVAILABLE
struct draw_tcs_inputs *tcs_input;
struct draw_tcs_outputs *tcs_output;
struct draw_tcs_jit_context *jit_context;
@ -91,7 +91,7 @@ struct draw_tess_eval_shader {
const float (*input)[4];
const struct tgsi_shader_info *input_info;
#ifdef LLVM_AVAILABLE
#ifdef DRAW_LLVM_AVAILABLE
struct draw_tes_inputs *tes_input;
struct draw_tes_jit_context *jit_context;
struct draw_tes_llvm_variant *current_variant;
@ -120,7 +120,7 @@ int draw_tess_eval_shader_run(struct draw_tess_eval_shader *shader,
struct draw_prim_info *output_prims,
ushort **elts_out);
#ifdef LLVM_AVAILABLE
#ifdef DRAW_LLVM_AVAILABLE
void draw_tcs_set_current_variant(struct draw_tess_ctrl_shader *shader,
struct draw_tcs_llvm_variant *variant);
void draw_tes_set_current_variant(struct draw_tess_eval_shader *shader,

View File

@ -59,7 +59,7 @@ draw_create_vertex_shader(struct draw_context *draw,
tgsi_dump(shader->tokens, 0);
}
#ifdef LLVM_AVAILABLE
#ifdef DRAW_LLVM_AVAILABLE
if (draw->pt.middle.llvm) {
vs = draw_create_vs_llvm(draw, shader);
}

View File

@ -164,7 +164,7 @@ draw_create_vs_exec(struct draw_context *draw,
struct draw_vs_variant_key;
struct draw_vertex_shader;
#ifdef LLVM_AVAILABLE
#ifdef DRAW_LLVM_AVAILABLE
struct draw_vertex_shader *
draw_create_vs_llvm(struct draw_context *draw,
const struct pipe_shader_state *state);

View File

@ -345,7 +345,7 @@ if dep_libdrm.found()
)
endif
if with_llvm
if draw_with_llvm
files_libgallium += files(
'gallivm/lp_bld_arit.c',
'gallivm/lp_bld_arit.h',

View File

@ -29,7 +29,7 @@ struct nir_shader;
struct tgsi_shader_info;
/* only llvmpipe uses this path, so handle draw not using llvm */
#ifdef LLVM_AVAILABLE
#ifdef DRAW_LLVM_AVAILABLE
void nir_tgsi_scan_shader(const struct nir_shader *nir,
struct tgsi_shader_info *info,
bool need_texcoord);

View File

@ -114,7 +114,7 @@ driver_swrast = declare_dependency(
dependencies : [driver_swrast, dep_llvm, idep_mesautil],
)
if with_tests and with_gallium_softpipe and with_llvm
if with_tests and with_gallium_softpipe and draw_with_llvm
foreach t : ['lp_test_format', 'lp_test_arit', 'lp_test_blend',
'lp_test_conv', 'lp_test_printf']
test(

View File

@ -98,7 +98,7 @@ svga_get_name( struct pipe_screen *pscreen )
#else
build = "build: RELEASE;";
#endif
#ifdef LLVM_AVAILABLE
#ifdef DRAW_LLVM_AVAILABLE
llvm = "LLVM;";
#endif

View File

@ -52,7 +52,7 @@ else
endif
if with_gallium_softpipe
subdir('drivers/softpipe')
if with_llvm
if draw_with_llvm
subdir('drivers/llvmpipe')
endif
else