pipe-loader: rework the sw backend

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>
This commit is contained in:
Emil Velikov 2015-10-17 21:51:24 +01:00
parent f58a6f7be3
commit d54ca54faa
14 changed files with 161 additions and 57 deletions

View file

@ -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;
}
*devs = &sdev->base;
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;
}
}
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;
}
*devs = &sdev->base;
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;
}
}
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;
}
*devs = &sdev->base;
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;
}
}
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 = {

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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 \

View file

@ -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

View file

@ -1,7 +1,7 @@
{
global:
driver_descriptor;
swrast_create_screen;
swrast_driver_descriptor;
local:
*;
};

View file

@ -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 },
}
};

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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