Move the winsys into the pipe-target, similar to the hardware pipe-driver. v2: - move int declaration outside of loop (Brian) - fold the teardown into a goto + separate function. Signed-off-by: Emil Velikov <emil.l.velikov@gmail.com> Acked-by: Rob Clark <robclark@freedesktop.org>tags/11.1-branchpoint
@@ -35,9 +35,11 @@ | |||
#include "sw/wrapper/wrapper_sw_winsys.h" | |||
#include "target-helpers/inline_sw_helper.h" | |||
#include "state_tracker/drisw_api.h" | |||
#include "state_tracker/sw_driver.h" | |||
struct pipe_loader_sw_device { | |||
struct pipe_loader_device base; | |||
const struct sw_driver_descriptor *dd; | |||
struct util_dl_library *lib; | |||
struct sw_winsys *ws; | |||
}; | |||
@@ -49,33 +51,62 @@ static struct pipe_loader_ops pipe_loader_sw_ops; | |||
static bool | |||
pipe_loader_sw_probe_init_common(struct pipe_loader_sw_device *sdev) | |||
{ | |||
if (!sdev->ws) | |||
return false; | |||
sdev->base.type = PIPE_LOADER_DEVICE_SOFTWARE; | |||
sdev->base.driver_name = "swrast"; | |||
sdev->base.ops = &pipe_loader_sw_ops; | |||
sdev->lib = pipe_loader_find_module(&sdev->base, PIPE_SEARCH_DIR); | |||
if (!sdev->lib) | |||
return false; | |||
sdev->dd = (const struct sw_driver_descriptor *) | |||
util_dl_get_proc_address(sdev->lib, "swrast_driver_descriptor"); | |||
if (!sdev->dd){ | |||
util_dl_close(sdev->lib); | |||
sdev->lib = NULL; | |||
return false; | |||
} | |||
return true; | |||
} | |||
static void | |||
pipe_loader_sw_probe_teardown_common(struct pipe_loader_sw_device *sdev) | |||
{ | |||
if (sdev->lib) | |||
util_dl_close(sdev->lib); | |||
} | |||
#ifdef HAVE_PIPE_LOADER_DRI | |||
bool | |||
pipe_loader_sw_probe_dri(struct pipe_loader_device **devs, struct drisw_loader_funcs *drisw_lf) | |||
{ | |||
struct pipe_loader_sw_device *sdev = CALLOC_STRUCT(pipe_loader_sw_device); | |||
int i; | |||
if (!sdev) | |||
return false; | |||
sdev->ws = dri_create_sw_winsys(drisw_lf); | |||
if (!pipe_loader_sw_probe_init_common(sdev)) { | |||
FREE(sdev); | |||
return false; | |||
if (!pipe_loader_sw_probe_init_common(sdev)) | |||
goto fail; | |||
for (i = 0; sdev->dd->winsys; i++) { | |||
if (strcmp(sdev->dd->winsys[i].name, "dri") == 0) { | |||
sdev->ws = sdev->dd->winsys[i].create_winsys(drisw_lf); | |||
break; | |||
} | |||
} | |||
*devs = &sdev->base; | |||
if (!sdev->ws) | |||
goto fail; | |||
*devs = &sdev->base; | |||
return true; | |||
fail: | |||
pipe_loader_sw_probe_teardown_common(sdev); | |||
FREE(sdev); | |||
return false; | |||
} | |||
#endif | |||
@@ -84,18 +115,30 @@ bool | |||
pipe_loader_sw_probe_kms(struct pipe_loader_device **devs, int fd) | |||
{ | |||
struct pipe_loader_sw_device *sdev = CALLOC_STRUCT(pipe_loader_sw_device); | |||
int i; | |||
if (!sdev) | |||
return false; | |||
sdev->ws = kms_dri_create_winsys(fd); | |||
if (!pipe_loader_sw_probe_init_common(sdev)) { | |||
FREE(sdev); | |||
return false; | |||
if (!pipe_loader_sw_probe_init_common(sdev)) | |||
goto fail; | |||
for (i = 0; sdev->dd->winsys; i++) { | |||
if (strcmp(sdev->dd->winsys[i].name, "kms_dri") == 0) { | |||
sdev->ws = sdev->dd->winsys[i].create_winsys(fd); | |||
break; | |||
} | |||
} | |||
*devs = &sdev->base; | |||
if (!sdev->ws) | |||
goto fail; | |||
*devs = &sdev->base; | |||
return true; | |||
fail: | |||
pipe_loader_sw_probe_teardown_common(sdev); | |||
FREE(sdev); | |||
return false; | |||
} | |||
#endif | |||
@@ -103,18 +146,30 @@ bool | |||
pipe_loader_sw_probe_null(struct pipe_loader_device **devs) | |||
{ | |||
struct pipe_loader_sw_device *sdev = CALLOC_STRUCT(pipe_loader_sw_device); | |||
int i; | |||
if (!sdev) | |||
return false; | |||
sdev->ws = null_sw_create(); | |||
if (!pipe_loader_sw_probe_init_common(sdev)) { | |||
FREE(sdev); | |||
return false; | |||
if (!pipe_loader_sw_probe_init_common(sdev)) | |||
goto fail; | |||
for (i = 0; sdev->dd->winsys; i++) { | |||
if (strcmp(sdev->dd->winsys[i].name, "null") == 0) { | |||
sdev->ws = sdev->dd->winsys[i].create_winsys(); | |||
break; | |||
} | |||
} | |||
*devs = &sdev->base; | |||
if (!sdev->ws) | |||
goto fail; | |||
*devs = &sdev->base; | |||
return true; | |||
fail: | |||
pipe_loader_sw_probe_teardown_common(sdev); | |||
FREE(sdev); | |||
return false; | |||
} | |||
int | |||
@@ -136,17 +191,30 @@ pipe_loader_sw_probe_wrapped(struct pipe_loader_device **dev, | |||
struct pipe_screen *screen) | |||
{ | |||
struct pipe_loader_sw_device *sdev = CALLOC_STRUCT(pipe_loader_sw_device); | |||
int i; | |||
if (!sdev) | |||
return false; | |||
sdev->ws = wrapper_sw_winsys_wrap_pipe_screen(screen); | |||
if (!pipe_loader_sw_probe_init_common(sdev)) { | |||
FREE(sdev); | |||
return false; | |||
if (!pipe_loader_sw_probe_init_common(sdev)) | |||
goto fail; | |||
for (i = 0; sdev->dd->winsys; i++) { | |||
if (strcmp(sdev->dd->winsys[i].name, "wrapped") == 0) { | |||
sdev->ws = sdev->dd->winsys[i].create_winsys(screen); | |||
break; | |||
} | |||
} | |||
if (!sdev->ws) | |||
goto fail; | |||
*dev = &sdev->base; | |||
return true; | |||
fail: | |||
pipe_loader_sw_probe_teardown_common(sdev); | |||
FREE(sdev); | |||
return false; | |||
} | |||
static void | |||
@@ -172,21 +240,8 @@ static struct pipe_screen * | |||
pipe_loader_sw_create_screen(struct pipe_loader_device *dev) | |||
{ | |||
struct pipe_loader_sw_device *sdev = pipe_loader_sw_device(dev); | |||
struct pipe_screen *(*init)(struct sw_winsys *); | |||
if (!sdev->lib) | |||
sdev->lib = pipe_loader_find_module(&sdev->base, PIPE_SEARCH_DIR); | |||
if (!sdev->lib) | |||
return NULL; | |||
init = (void *)util_dl_get_proc_address(sdev->lib, "swrast_create_screen"); | |||
if (!init){ | |||
util_dl_close(sdev->lib); | |||
sdev->lib = NULL; | |||
return NULL; | |||
} | |||
return init(sdev->ws); | |||
return sdev->dd->create_screen(sdev->ws); | |||
} | |||
static struct pipe_loader_ops pipe_loader_sw_ops = { |
@@ -0,0 +1,21 @@ | |||
#ifndef _SW_DRIVER_H_ | |||
#define _SW_DRIVER_H_ | |||
#include "pipe/p_compiler.h" | |||
struct pipe_screen; | |||
struct sw_winsys; | |||
struct sw_driver_descriptor | |||
{ | |||
struct pipe_screen *(*create_screen)(struct sw_winsys *ws); | |||
struct { | |||
const char * const name; | |||
struct sw_winsys *(*create_winsys)(); | |||
} winsys[]; | |||
}; | |||
extern struct sw_driver_descriptor swrast_driver_descriptor; | |||
#endif |
@@ -110,8 +110,7 @@ d3dadapter9_la_LIBADD += $(TARGET_LIB_DEPS) \ | |||
else # HAVE_GALLIUM_STATIC_TARGETS | |||
d3dadapter9_la_LIBADD += \ | |||
$(top_builddir)/src/gallium/auxiliary/pipe-loader/libpipe_loader.la \ | |||
$(GALLIUM_PIPE_LOADER_WINSYS_LIBS) | |||
$(top_builddir)/src/gallium/auxiliary/pipe-loader/libpipe_loader.la | |||
endif # HAVE_GALLIUM_STATIC_TARGETS | |||
@@ -98,8 +98,7 @@ gallium_dri_la_LIBADD += $(TARGET_LIB_DEPS) \ | |||
else # HAVE_GALLIUM_STATIC_TARGETS | |||
gallium_dri_la_LIBADD += \ | |||
$(top_builddir)/src/gallium/auxiliary/pipe-loader/libpipe_loader.la \ | |||
$(GALLIUM_PIPE_LOADER_WINSYS_LIBS) | |||
$(top_builddir)/src/gallium/auxiliary/pipe-loader/libpipe_loader.la | |||
endif # HAVE_GALLIUM_STATIC_TARGETS | |||
@@ -56,8 +56,7 @@ libomx_mesa_la_LIBADD += $(TARGET_LIB_DEPS) \ | |||
else # HAVE_GALLIUM_STATIC_TARGETS | |||
libomx_mesa_la_LIBADD += \ | |||
$(top_builddir)/src/gallium/auxiliary/pipe-loader/libpipe_loader.la \ | |||
$(GALLIUM_PIPE_LOADER_WINSYS_LIBS) | |||
$(top_builddir)/src/gallium/auxiliary/pipe-loader/libpipe_loader.la | |||
endif # HAVE_GALLIUM_STATIC_TARGETS | |||
@@ -19,7 +19,6 @@ lib@OPENCL_LIBNAME@_la_LIBADD = \ | |||
$(top_builddir)/src/gallium/state_trackers/clover/libclover.la \ | |||
$(top_builddir)/src/gallium/auxiliary/libgallium.la \ | |||
$(top_builddir)/src/util/libmesautil.la \ | |||
$(GALLIUM_PIPE_LOADER_WINSYS_LIBS) \ | |||
$(ELF_LIB) \ | |||
-ldl \ | |||
-lclangCodeGen \ |
@@ -27,6 +27,7 @@ AM_CPPFLAGS = \ | |||
-I$(top_srcdir)/include \ | |||
-I$(top_srcdir)/src/gallium/drivers \ | |||
-I$(top_srcdir)/src/gallium/winsys \ | |||
$(GALLIUM_PIPE_LOADER_DEFINES) \ | |||
$(LIBDRM_CFLAGS) \ | |||
$(VISIBILITY_CFLAGS) \ | |||
-DGALLIUM_RBUG \ | |||
@@ -208,6 +209,10 @@ AM_CPPFLAGS += -DGALLIUM_LLVMPIPE | |||
pipe_swrast_la_LIBADD += \ | |||
$(top_builddir)/src/gallium/drivers/llvmpipe/libllvmpipe.la | |||
endif | |||
pipe_swrast_la_LIBADD += \ | |||
$(GALLIUM_PIPE_LOADER_WINSYS_LIBS) | |||
endif | |||
EXTRA_DIST = pipe.sym |
@@ -1,7 +1,7 @@ | |||
{ | |||
global: | |||
driver_descriptor; | |||
swrast_create_screen; | |||
swrast_driver_descriptor; | |||
local: | |||
*; | |||
}; |
@@ -1,7 +1,11 @@ | |||
#include "target-helpers/inline_sw_helper.h" | |||
#include "target-helpers/inline_debug_helper.h" | |||
#include "state_tracker/drm_driver.h" | |||
#include "state_tracker/sw_driver.h" | |||
#include "sw/dri/dri_sw_winsys.h" | |||
#include "sw/kms-dri/kms_dri_sw_winsys.h" | |||
#include "sw/null/null_sw_winsys.h" | |||
#include "sw/wrapper/wrapper_sw_winsys.h" | |||
PUBLIC struct pipe_screen * | |||
swrast_create_screen(struct sw_winsys *ws); | |||
@@ -17,3 +21,31 @@ swrast_create_screen(struct sw_winsys *ws) | |||
return screen; | |||
} | |||
PUBLIC | |||
struct sw_driver_descriptor swrast_driver_descriptor = { | |||
.create_screen = swrast_create_screen, | |||
.winsys = { | |||
#ifdef HAVE_PIPE_LOADER_DRI | |||
{ | |||
.name = "dri", | |||
.create_winsys = dri_create_sw_winsys, | |||
}, | |||
#endif | |||
#ifdef HAVE_PIPE_LOADER_KMS | |||
{ | |||
.name = "kms_dri", | |||
.create_winsys = kms_dri_create_winsys, | |||
}, | |||
#endif | |||
{ | |||
.name = "null", | |||
.create_winsys = null_sw_create, | |||
}, | |||
{ | |||
.name = "wrapped", | |||
.create_winsys = wrapper_sw_winsys_wrap_pipe_screen, | |||
}, | |||
{ 0 }, | |||
} | |||
}; |
@@ -53,8 +53,7 @@ gallium_drv_video_la_LIBADD += $(TARGET_LIB_DEPS) \ | |||
else # HAVE_GALLIUM_STATIC_TARGETS | |||
gallium_drv_video_la_LIBADD += \ | |||
$(top_builddir)/src/gallium/auxiliary/pipe-loader/libpipe_loader.la \ | |||
$(GALLIUM_PIPE_LOADER_WINSYS_LIBS) | |||
$(top_builddir)/src/gallium/auxiliary/pipe-loader/libpipe_loader.la | |||
endif # HAVE_GALLIUM_STATIC_TARGETS | |||
@@ -65,8 +65,7 @@ libvdpau_gallium_la_LIBADD += $(TARGET_LIB_DEPS) \ | |||
else # HAVE_GALLIUM_STATIC_TARGETS | |||
libvdpau_gallium_la_LIBADD += \ | |||
$(top_builddir)/src/gallium/auxiliary/pipe-loader/libpipe_loader.la \ | |||
$(GALLIUM_PIPE_LOADER_WINSYS_LIBS) | |||
$(top_builddir)/src/gallium/auxiliary/pipe-loader/libpipe_loader.la | |||
endif # HAVE_GALLIUM_STATIC_TARGETS | |||
@@ -79,8 +79,7 @@ libxatracker_la_LIBADD += $(TARGET_LIB_DEPS) | |||
else # HAVE_GALLIUM_STATIC_TARGETS | |||
libxatracker_la_LIBADD += \ | |||
$(top_builddir)/src/gallium/auxiliary/pipe-loader/libpipe_loader.la \ | |||
$(GALLIUM_PIPE_LOADER_WINSYS_LIBS) | |||
$(top_builddir)/src/gallium/auxiliary/pipe-loader/libpipe_loader.la | |||
endif # HAVE_GALLIUM_STATIC_TARGETS | |||
@@ -53,8 +53,7 @@ libXvMCgallium_la_LIBADD += $(TARGET_LIB_DEPS) \ | |||
else # HAVE_GALLIUM_STATIC_TARGETS | |||
libXvMCgallium_la_LIBADD += \ | |||
$(top_builddir)/src/gallium/auxiliary/pipe-loader/libpipe_loader.la \ | |||
$(GALLIUM_PIPE_LOADER_WINSYS_LIBS) | |||
$(top_builddir)/src/gallium/auxiliary/pipe-loader/libpipe_loader.la | |||
endif # HAVE_GALLIUM_STATIC_TARGETS | |||
@@ -9,7 +9,6 @@ LDADD = \ | |||
$(top_builddir)/src/gallium/auxiliary/pipe-loader/libpipe_loader.la \ | |||
$(top_builddir)/src/gallium/auxiliary/libgallium.la \ | |||
$(top_builddir)/src/util/libmesautil.la \ | |||
$(GALLIUM_PIPE_LOADER_WINSYS_LIBS) \ | |||
$(GALLIUM_COMMON_LIB_DEPS) | |||
noinst_PROGRAMS = compute tri quad-tex |