Browse Source

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>
tags/11.1-branchpoint
Emil Velikov 10 years ago
parent
commit
d54ca54faa

+ 91
- 36
src/gallium/auxiliary/pipe-loader/pipe_loader_sw.c 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;
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 = {

+ 21
- 0
src/gallium/include/state_tracker/sw_driver.h 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

+ 1
- 2
src/gallium/targets/d3dadapter9/Makefile.am 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


+ 1
- 2
src/gallium/targets/dri/Makefile.am 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


+ 1
- 2
src/gallium/targets/omx/Makefile.am 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


+ 0
- 1
src/gallium/targets/opencl/Makefile.am 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 \

+ 5
- 0
src/gallium/targets/pipe-loader/Makefile.am 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

+ 1
- 1
src/gallium/targets/pipe-loader/pipe.sym View File

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

+ 33
- 1
src/gallium/targets/pipe-loader/pipe_swrast.c 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 },
}
};

+ 1
- 2
src/gallium/targets/va/Makefile.am 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


+ 1
- 2
src/gallium/targets/vdpau/Makefile.am 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


+ 1
- 2
src/gallium/targets/xa/Makefile.am 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


+ 1
- 2
src/gallium/targets/xvmc/Makefile.am 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


+ 0
- 1
src/gallium/tests/trivial/Makefile.am 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

Loading…
Cancel
Save