Commit f50aa214 authored by Tim Rowley's avatar Tim Rowley

swr: build driver proper separate from rasterizer

swr used to build and link the rasterizer to the driver, and to support
multiple architectures we needed to have multiple versions of the
driver/rasterizer combination, which needed to link in much of mesa.

Changing to having one instance of the driver and just building
architecture specific versions of the rasterizer gives a large reduction
in disk space.

libGL.so        6464 Kb ->  7000 Kb
libswrAVX.so   10068 Kb ->  5432 Kb
libswrAVX2.so   9828 Kb ->  5200 Kb

Total          26360 Kb -> 17632 Kb
Reviewed-by: default avatarEmil Velikov <emil.velikov@collabora.com>
parent 50cd2221
......@@ -26,7 +26,14 @@ AM_CXXFLAGS = $(GALLIUM_DRIVER_CFLAGS) $(SWR_CXX11_CXXFLAGS)
noinst_LTLIBRARIES = libmesaswr.la
libmesaswr_la_SOURCES = $(LOADER_SOURCES)
# gen_knobs.* included here to provide driver access to swr configuration
libmesaswr_la_SOURCES = \
$(CXX_SOURCES) \
$(COMMON_CXX_SOURCES) \
$(JITTER_CXX_SOURCES) \
rasterizer/codegen/gen_knobs.cpp \
rasterizer/codegen/gen_knobs.h \
$(LOADER_SOURCES)
COMMON_CXXFLAGS = \
-fno-strict-aliasing \
......@@ -43,12 +50,15 @@ COMMON_CXXFLAGS = \
-I$(srcdir)/rasterizer/jitter \
-I$(srcdir)/rasterizer/archrast
# SWR_AVX_CXXFLAGS needed for intrinsic usage in swr api headers
libmesaswr_la_CXXFLAGS = \
$(SWR_AVX_CXXFLAGS) \
$(COMMON_CXXFLAGS)
COMMON_SOURCES = \
$(CXX_SOURCES) \
$(ARCHRAST_CXX_SOURCES) \
$(COMMON_CXX_SOURCES) \
$(CORE_CXX_SOURCES) \
$(JITTER_CXX_SOURCES) \
$(MEMORY_CXX_SOURCES) \
$(BUILT_SOURCES)
......@@ -207,19 +217,12 @@ rasterizer.intermediate: rasterizer/codegen/gen_backends.py rasterizer/codegen/t
--cpp \
--hpp
COMMON_LIBADD = \
$(top_builddir)/src/gallium/auxiliary/libgallium.la \
$(top_builddir)/src/mesa/libmesagallium.la \
$(LLVM_LIBS)
COMMON_LDFLAGS = \
-shared \
-module \
-no-undefined \
$(GC_SECTIONS) \
$(NO_UNDEFINED) \
$(LLVM_LDFLAGS)
$(NO_UNDEFINED)
lib_LTLIBRARIES = libswrAVX.la libswrAVX2.la
......@@ -231,9 +234,6 @@ libswrAVX_la_CXXFLAGS = \
libswrAVX_la_SOURCES = \
$(COMMON_SOURCES)
libswrAVX_la_LIBADD = \
$(COMMON_LIBADD)
libswrAVX_la_LDFLAGS = \
$(COMMON_LDFLAGS)
......@@ -245,9 +245,6 @@ libswrAVX2_la_CXXFLAGS = \
libswrAVX2_la_SOURCES = \
$(COMMON_SOURCES)
libswrAVX2_la_LIBADD = \
$(COMMON_LIBADD)
libswrAVX2_la_LDFLAGS = \
$(COMMON_LDFLAGS)
......
......@@ -30,12 +30,6 @@ else:
llvm_includedir = env.backtick('%s --includedir' % llvm_config).rstrip()
print "llvm include dir %s" % llvm_includedir
# the loader is included in the mesa lib itself
# All the remaining files are in loadable modules
loadersource = env.ParseSourceList('Makefile.sources', [
'LOADER_SOURCES'
])
if not env['msvc'] :
env.Append(CCFLAGS = [
'-std=c++11',
......@@ -191,16 +185,12 @@ built_sources += [backendPixelRateFiles, genRasterizerFiles]
source = built_sources
source += env.ParseSourceList(swrroot + 'Makefile.sources', [
'CXX_SOURCES',
'ARCHRAST_CXX_SOURCES',
'COMMON_CXX_SOURCES',
'CORE_CXX_SOURCES',
'JITTER_CXX_SOURCES',
'MEMORY_CXX_SOURCES'
])
env.Prepend(LIBS = [ mesautil, mesa, gallium ])
env.Prepend(CPPPATH = [
'.',
'rasterizer',
......@@ -242,14 +232,24 @@ swrAVX2 = envavx2.SharedLibrary(
)
env.Alias('swrAVX2', swrAVX2)
source = env.ParseSourceList(swrroot + 'Makefile.sources', [
'CXX_SOURCES',
'COMMON_CXX_SOURCES',
'JITTER_CXX_SOURCES',
'LOADER_SOURCES'
])
source += [
'rasterizer/codegen/gen_knobs.cpp',
'rasterizer/archrast/gen_ar_event.cpp',
]
# main SWR lib
swr = env.ConvenienceLibrary(
envSWR = envavx.Clone() # pick up the arch flag for intrinsic usage
swr = envSWR.ConvenienceLibrary(
target = 'swr',
source = loadersource,
source = source,
)
# treat arch libs as dependencies, even though they are not linked
# into swr, so we don't have to build them separately
Depends(swr, ['swrAVX', 'swrAVX2'])
......
......@@ -467,7 +467,7 @@ swr_create_context(struct pipe_screen *p_screen, void *priv, unsigned flags)
AlignedMalloc(sizeof(struct swr_context), KNOB_SIMD_BYTES);
memset(ctx, 0, sizeof(struct swr_context));
SwrGetInterface(ctx->api);
swr_screen(p_screen)->pfnSwrGetInterface(ctx->api);
ctx->swrDC.pAPI = &ctx->api;
ctx->blendJIT =
......
......@@ -24,13 +24,10 @@
#include "util/u_cpu_detect.h"
#include "util/u_dl.h"
#include "swr_public.h"
#include "pipe/p_screen.h"
#include "swr_screen.h"
#include <stdio.h>
typedef pipe_screen *(*screen_create_proc)(struct sw_winsys *winsys);
struct pipe_screen *
swr_create_screen(struct sw_winsys *winsys)
{
......@@ -57,16 +54,17 @@ swr_create_screen(struct sw_winsys *winsys)
exit(-1);
}
util_dl_proc pScreenProc = util_dl_get_proc_address(pLibrary, "swr_create_screen_internal");
util_dl_proc pApiProc = util_dl_get_proc_address(pLibrary, "SwrGetInterface");
if (!pScreenProc) {
if (!pApiProc) {
fprintf(stderr, "SWR library search failure: %s\n", util_dl_error());
exit(-1);
}
screen_create_proc pScreenCreate = (screen_create_proc)pScreenProc;
struct pipe_screen *screen = swr_create_screen_internal(winsys);
swr_screen(screen)->pfnSwrGetInterface = (PFNSwrGetInterface)pApiProc;
return pScreenCreate(winsys);
return screen;
}
......
......@@ -47,6 +47,8 @@ struct swr_screen {
uint8_t msaa_max_count;
HANDLE hJitMgr;
PFNSwrGetInterface pfnSwrGetInterface;
};
static INLINE struct swr_screen *
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment