forked from KolibriOS/kolibrios
Gallium 3D: pipe loader
git-svn-id: svn://kolibrios.org@3847 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
parent
57d92e4a1f
commit
c398fbbf20
83
drivers/video/Gallium/auxiliary/pipe-loader/pipe_loader.c
Normal file
83
drivers/video/Gallium/auxiliary/pipe-loader/pipe_loader.c
Normal file
@ -0,0 +1,83 @@
|
||||
/**************************************************************************
|
||||
*
|
||||
* Copyright 2012 Francisco Jerez
|
||||
* All Rights Reserved.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the
|
||||
* "Software"), to deal in the Software without restriction, including
|
||||
* without limitation the rights to use, copy, modify, merge, publish,
|
||||
* distribute, sub license, and/or sell copies of the Software, and to
|
||||
* permit persons to whom the Software is furnished to do so, subject to
|
||||
* the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice (including the
|
||||
* next paragraph) shall be included in all copies or substantial portions
|
||||
* of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
|
||||
* IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
|
||||
* ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*
|
||||
**************************************************************************/
|
||||
|
||||
#include "pipe_loader_priv.h"
|
||||
|
||||
#include "util/u_inlines.h"
|
||||
#include "util/u_memory.h"
|
||||
#include "util/u_string.h"
|
||||
#include "util/u_dl.h"
|
||||
|
||||
#define MODULE_PREFIX "pipe_"
|
||||
|
||||
static int (*backends[])(struct pipe_loader_device **, int) = {
|
||||
#ifdef HAVE_PIPE_LOADER_DRM
|
||||
&pipe_loader_drm_probe,
|
||||
#endif
|
||||
&pipe_loader_sw_probe
|
||||
};
|
||||
|
||||
int
|
||||
pipe_loader_probe(struct pipe_loader_device **devs, int ndev)
|
||||
{
|
||||
int i, n = 0;
|
||||
|
||||
for (i = 0; i < Elements(backends); i++)
|
||||
n += backends[i](&devs[n], MAX2(0, ndev - n));
|
||||
|
||||
return n;
|
||||
}
|
||||
|
||||
void
|
||||
pipe_loader_release(struct pipe_loader_device **devs, int ndev)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < ndev; i++)
|
||||
devs[i]->ops->release(&devs[i]);
|
||||
}
|
||||
|
||||
struct pipe_screen *
|
||||
pipe_loader_create_screen(struct pipe_loader_device *dev,
|
||||
const char *library_paths)
|
||||
{
|
||||
return dev->ops->create_screen(dev, library_paths);
|
||||
}
|
||||
|
||||
struct util_dl_library *
|
||||
pipe_loader_find_module(struct pipe_loader_device *dev,
|
||||
const char *library_paths)
|
||||
{
|
||||
struct util_dl_library *lib;
|
||||
const char *next;
|
||||
char path[PATH_MAX];
|
||||
int len, ret;
|
||||
|
||||
lib = load_library("g3dsoft.drv");
|
||||
|
||||
return lib;
|
||||
}
|
140
drivers/video/Gallium/auxiliary/pipe-loader/pipe_loader.h
Normal file
140
drivers/video/Gallium/auxiliary/pipe-loader/pipe_loader.h
Normal file
@ -0,0 +1,140 @@
|
||||
/**************************************************************************
|
||||
*
|
||||
* Copyright 2012 Francisco Jerez
|
||||
* All Rights Reserved.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the
|
||||
* "Software"), to deal in the Software without restriction, including
|
||||
* without limitation the rights to use, copy, modify, merge, publish,
|
||||
* distribute, sub license, and/or sell copies of the Software, and to
|
||||
* permit persons to whom the Software is furnished to do so, subject to
|
||||
* the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice (including the
|
||||
* next paragraph) shall be included in all copies or substantial portions
|
||||
* of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
|
||||
* IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
|
||||
* ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*
|
||||
**************************************************************************/
|
||||
|
||||
/**
|
||||
* \file Library that provides device enumeration and creation of
|
||||
* winsys/pipe_screen instances.
|
||||
*/
|
||||
|
||||
#ifndef PIPE_LOADER_H
|
||||
#define PIPE_LOADER_H
|
||||
|
||||
#include "pipe/p_compiler.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
struct pipe_screen;
|
||||
|
||||
enum pipe_loader_device_type {
|
||||
PIPE_LOADER_DEVICE_SOFTWARE,
|
||||
PIPE_LOADER_DEVICE_PCI,
|
||||
NUM_PIPE_LOADER_DEVICE_TYPES
|
||||
};
|
||||
|
||||
/**
|
||||
* A device known to the pipe loader.
|
||||
*/
|
||||
struct pipe_loader_device {
|
||||
enum pipe_loader_device_type type;
|
||||
|
||||
union {
|
||||
struct {
|
||||
int vendor_id;
|
||||
int chip_id;
|
||||
} pci;
|
||||
} u; /**< Discriminated by \a type */
|
||||
|
||||
const char *driver_name;
|
||||
const struct pipe_loader_ops *ops;
|
||||
};
|
||||
|
||||
/**
|
||||
* Get a list of known devices.
|
||||
*
|
||||
* \param devs Array that will be filled with pointers to the devices
|
||||
* available in the system.
|
||||
* \param ndev Maximum number of devices to return.
|
||||
* \return Number of devices available in the system.
|
||||
*/
|
||||
int
|
||||
pipe_loader_probe(struct pipe_loader_device **devs, int ndev);
|
||||
|
||||
/**
|
||||
* Create a pipe_screen for the specified device.
|
||||
*
|
||||
* \param dev Device the screen will be created for.
|
||||
* \param library_paths Colon-separated list of filesystem paths that
|
||||
* will be used to look for the pipe driver
|
||||
* module that handles this device.
|
||||
*/
|
||||
struct pipe_screen *
|
||||
pipe_loader_create_screen(struct pipe_loader_device *dev,
|
||||
const char *library_paths);
|
||||
|
||||
/**
|
||||
* Release resources allocated for a list of devices.
|
||||
*
|
||||
* Should be called when the specified devices are no longer in use to
|
||||
* release any resources allocated by pipe_loader_probe.
|
||||
*
|
||||
* \param devs Devices to release.
|
||||
* \param ndev Number of devices to release.
|
||||
*/
|
||||
void
|
||||
pipe_loader_release(struct pipe_loader_device **devs, int ndev);
|
||||
|
||||
/**
|
||||
* Get a list of known software devices.
|
||||
*
|
||||
* This function is platform-specific.
|
||||
*
|
||||
* \sa pipe_loader_probe
|
||||
*/
|
||||
int
|
||||
pipe_loader_sw_probe(struct pipe_loader_device **devs, int ndev);
|
||||
|
||||
#ifdef HAVE_PIPE_LOADER_DRM
|
||||
|
||||
/**
|
||||
* Get a list of known DRM devices.
|
||||
*
|
||||
* This function is platform-specific.
|
||||
*
|
||||
* \sa pipe_loader_probe
|
||||
*/
|
||||
int
|
||||
pipe_loader_drm_probe(struct pipe_loader_device **devs, int ndev);
|
||||
|
||||
/**
|
||||
* Initialize a DRM device in an already opened fd.
|
||||
*
|
||||
* This function is platform-specific.
|
||||
*
|
||||
* \sa pipe_loader_probe
|
||||
*/
|
||||
boolean
|
||||
pipe_loader_drm_probe_fd(struct pipe_loader_device **dev, int fd);
|
||||
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* PIPE_LOADER_H */
|
@ -0,0 +1,47 @@
|
||||
/**************************************************************************
|
||||
*
|
||||
* Copyright 2012 Francisco Jerez
|
||||
* All Rights Reserved.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the
|
||||
* "Software"), to deal in the Software without restriction, including
|
||||
* without limitation the rights to use, copy, modify, merge, publish,
|
||||
* distribute, sub license, and/or sell copies of the Software, and to
|
||||
* permit persons to whom the Software is furnished to do so, subject to
|
||||
* the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice (including the
|
||||
* next paragraph) shall be included in all copies or substantial portions
|
||||
* of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
|
||||
* IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
|
||||
* ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*
|
||||
**************************************************************************/
|
||||
|
||||
#ifndef PIPE_LOADER_PRIV_H
|
||||
#define PIPE_LOADER_PRIV_H
|
||||
|
||||
#include "pipe_loader.h"
|
||||
|
||||
struct pipe_loader_ops {
|
||||
struct pipe_screen *(*create_screen)(struct pipe_loader_device *dev,
|
||||
const char *library_paths);
|
||||
|
||||
void (*release)(struct pipe_loader_device **dev);
|
||||
};
|
||||
|
||||
/**
|
||||
* Open the pipe driver module that handles a specified device.
|
||||
*/
|
||||
struct util_dl_library *
|
||||
pipe_loader_find_module(struct pipe_loader_device *dev,
|
||||
const char *library_paths);
|
||||
|
||||
#endif /* PIPE_LOADER_PRIV_H */
|
111
drivers/video/Gallium/auxiliary/pipe-loader/pipe_loader_sw.c
Normal file
111
drivers/video/Gallium/auxiliary/pipe-loader/pipe_loader_sw.c
Normal file
@ -0,0 +1,111 @@
|
||||
/**************************************************************************
|
||||
*
|
||||
* Copyright 2012 Francisco Jerez
|
||||
* All Rights Reserved.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the
|
||||
* "Software"), to deal in the Software without restriction, including
|
||||
* without limitation the rights to use, copy, modify, merge, publish,
|
||||
* distribute, sub license, and/or sell copies of the Software, and to
|
||||
* permit persons to whom the Software is furnished to do so, subject to
|
||||
* the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice (including the
|
||||
* next paragraph) shall be included in all copies or substantial portions
|
||||
* of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
|
||||
* IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
|
||||
* ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*
|
||||
**************************************************************************/
|
||||
|
||||
#include "pipe_loader_priv.h"
|
||||
|
||||
#include "util/u_memory.h"
|
||||
#include "util/u_dl.h"
|
||||
#include "target-helpers/inline_sw_helper.h"
|
||||
#include "sw/kos_sw_winsys.h"
|
||||
|
||||
struct pipe_loader_sw_device {
|
||||
struct pipe_loader_device base;
|
||||
struct util_dl_library *lib;
|
||||
struct sw_winsys *ws;
|
||||
};
|
||||
|
||||
#define pipe_loader_sw_device(dev) ((struct pipe_loader_sw_device *)dev)
|
||||
|
||||
static struct pipe_loader_ops pipe_loader_sw_ops;
|
||||
|
||||
static struct sw_winsys *(*backends[])() = {
|
||||
#ifdef HAVE_WINSYS_XLIB
|
||||
x11_sw_create,
|
||||
#endif
|
||||
kos_create_sw_winsys
|
||||
};
|
||||
|
||||
int
|
||||
pipe_loader_sw_probe(struct pipe_loader_device **devs, int ndev)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < Elements(backends); i++) {
|
||||
if (i < ndev) {
|
||||
struct pipe_loader_sw_device *sdev = CALLOC_STRUCT(pipe_loader_sw_device);
|
||||
|
||||
sdev->base.type = PIPE_LOADER_DEVICE_SOFTWARE;
|
||||
sdev->base.driver_name = "swrast";
|
||||
sdev->base.ops = &pipe_loader_sw_ops;
|
||||
sdev->ws = backends[i]();
|
||||
devs[i] = &sdev->base;
|
||||
}
|
||||
}
|
||||
|
||||
return i;
|
||||
}
|
||||
|
||||
static void
|
||||
pipe_loader_sw_release(struct pipe_loader_device **dev)
|
||||
{
|
||||
struct pipe_loader_sw_device *sdev = pipe_loader_sw_device(*dev);
|
||||
|
||||
// if (sdev->lib)
|
||||
// util_dl_close(sdev->lib);
|
||||
|
||||
FREE(sdev);
|
||||
*dev = NULL;
|
||||
}
|
||||
|
||||
static struct pipe_screen *
|
||||
pipe_loader_sw_create_screen(struct pipe_loader_device *dev,
|
||||
const char *library_paths)
|
||||
{
|
||||
struct pipe_loader_sw_device *sdev = pipe_loader_sw_device(dev);
|
||||
struct pipe_screen *(*init)(struct sw_winsys *);
|
||||
|
||||
printf("%s\n",__FUNCTION__);
|
||||
|
||||
if (!sdev->lib)
|
||||
sdev->lib = pipe_loader_find_module(dev, library_paths);
|
||||
if (!sdev->lib)
|
||||
return NULL;
|
||||
|
||||
init = (void *)get_proc_address(sdev->lib, "swrast_create_screen");
|
||||
|
||||
printf("swrast_create_screen %p\n", init);
|
||||
|
||||
if (!init)
|
||||
return NULL;
|
||||
|
||||
return init(sdev->ws);
|
||||
}
|
||||
|
||||
static struct pipe_loader_ops pipe_loader_sw_ops = {
|
||||
.create_screen = pipe_loader_sw_create_screen,
|
||||
.release = pipe_loader_sw_release
|
||||
};
|
23
drivers/video/Gallium/auxiliary/pipe-loader/pipe_swrast.c
Normal file
23
drivers/video/Gallium/auxiliary/pipe-loader/pipe_swrast.c
Normal file
@ -0,0 +1,23 @@
|
||||
|
||||
#include "target-helpers/inline_sw_helper.h"
|
||||
#include "target-helpers/inline_debug_helper.h"
|
||||
#include "state_tracker/drm_driver.h"
|
||||
|
||||
PUBLIC struct pipe_screen *
|
||||
swrast_create_screen(struct sw_winsys *ws);
|
||||
|
||||
PUBLIC
|
||||
DRM_DRIVER_DESCRIPTOR("swrast", NULL, NULL, NULL)
|
||||
|
||||
struct pipe_screen *
|
||||
swrast_create_screen(struct sw_winsys *ws)
|
||||
{
|
||||
struct pipe_screen *screen;
|
||||
|
||||
ws = kos_create_sw_winsys();
|
||||
if (ws == NULL)
|
||||
return NULL;
|
||||
|
||||
screen = softpipe_create_screen(ws);
|
||||
return screen;
|
||||
}
|
@ -32,27 +32,6 @@
|
||||
#include "target-helpers/inline_debug_helper.h"
|
||||
#include "target-helpers/inline_sw_helper.h"
|
||||
#include <kos32sys.h>
|
||||
//#include <windows.h>
|
||||
|
||||
/*
|
||||
static LRESULT CALLBACK
|
||||
window_proc(HWND hWnd,
|
||||
UINT uMsg,
|
||||
WPARAM wParam,
|
||||
LPARAM lParam)
|
||||
{
|
||||
switch (uMsg) {
|
||||
case WM_DESTROY:
|
||||
PostQuitMessage(0);
|
||||
break;
|
||||
|
||||
default:
|
||||
return DefWindowProc(hWnd, uMsg, wParam, lParam);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
*/
|
||||
|
||||
static struct {
|
||||
void (* draw)(void);
|
||||
@ -66,20 +45,26 @@ graw_create_window_and_screen(int x,
|
||||
enum pipe_format format,
|
||||
void **handle)
|
||||
{
|
||||
struct sw_winsys *winsys = NULL;
|
||||
struct pipe_screen *screen = NULL;
|
||||
struct sw_winsys *winsys = NULL;
|
||||
struct pipe_screen *screen = NULL;
|
||||
struct pipe_loader_device *dev;
|
||||
int ret;
|
||||
|
||||
if (format != PIPE_FORMAT_B8G8R8X8_UNORM)
|
||||
goto fail;
|
||||
if (format != PIPE_FORMAT_B8G8R8X8_UNORM)
|
||||
goto fail;
|
||||
|
||||
winsys = kos_create_sw_winsys();
|
||||
if (winsys == NULL)
|
||||
goto fail;
|
||||
winsys = kos_create_sw_winsys();
|
||||
if (winsys == NULL)
|
||||
goto fail;
|
||||
|
||||
screen = sw_screen_create(winsys);
|
||||
/* find a hardware device */
|
||||
ret = pipe_loader_probe(&dev, 1);
|
||||
|
||||
if (screen == NULL)
|
||||
goto fail;
|
||||
/* init a pipe screen */
|
||||
screen = pipe_loader_create_screen(dev, "drivers");
|
||||
|
||||
if (screen == NULL)
|
||||
goto fail;
|
||||
|
||||
BeginDraw();
|
||||
DrawWindow(x, y,width-1,height-1,
|
||||
|
@ -210,10 +210,6 @@ kos_sw_displaytarget_display(struct sw_winsys *winsys,
|
||||
struct sw_displaytarget *dt,
|
||||
void *context_private)
|
||||
{
|
||||
/* nasty:
|
||||
*/
|
||||
// HDC hDC = (HDC)context_private;
|
||||
|
||||
kos_sw_display(winsys, dt);
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user