mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-01-05 19:50:12 +01:00
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:
parent
f58a6f7be3
commit
d54ca54faa
14 changed files with 161 additions and 57 deletions
|
|
@ -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 = {
|
||||
|
|
|
|||
21
src/gallium/include/state_tracker/sw_driver.h
Normal file
21
src/gallium/include/state_tracker/sw_driver.h
Normal 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
|
||||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue