graw: Undo late loading of graw drivers.

Keith prefers a clean separation between graw applications and
implementations, where apps do not link libgallium.a but instead
get all functionality they need via graw interface.

Although this is not incompatible with late loading of graw drivers, it
it would make it very hard to maintain, as wrappers for every utility
symbol exposed in graw would have to be written or generated somehow.
This commit is contained in:
José Fonseca
2010-08-26 11:37:42 +01:00
parent 0f74efdef0
commit 90437330e2
16 changed files with 227 additions and 163 deletions

View File

@@ -31,7 +31,7 @@ import common
# Configuration options
default_statetrackers = 'mesa'
default_targets = 'none'
default_targets = 'graw-null'
if common.default_platform in ('linux', 'freebsd', 'darwin'):
default_drivers = 'softpipe,failover,svga,i915,i965,trace,identity,llvmpipe'
@@ -69,6 +69,7 @@ opts.Add(ListVariable('targets', 'driver targets to build', default_targets,
'egl-swrast',
'egl-vmwgfx',
'graw-xlib',
'graw-null',
'libgl-gdi',
'libgl-xlib',
'xorg-i915',

View File

@@ -1,153 +0,0 @@
#ifndef GALLIUM_RAW_DL_H
#define GALLIUM_RAW_DL_H
/* This is an API for exercising gallium functionality in a
* platform-neutral fashion. Whatever platform integration is
* necessary to implement this interface is orchestrated by the
* individual target building this entity.
*
* For instance, the graw-xlib target includes code to implent these
* interfaces on top of the X window system.
*
* Programs using this interface may additionally benefit from some of
* the utilities currently in the libgallium.a library, especially
* those for parsing text representations of TGSI shaders.
*/
#include <stdio.h>
#include "pipe/p_compiler.h"
#include "pipe/p_context.h"
#include "pipe/p_format.h"
#include "pipe/p_state.h"
#include "util/u_dl.h"
#include "tgsi/tgsi_text.h"
struct pipe_screen;
struct pipe_context;
typedef void *
(*pfn_graw_create_window_and_screen_t)( int x,
int y,
unsigned width,
unsigned height,
enum pipe_format format,
void **handle );
typedef void
(*pfn_graw_set_display_func_t)( void (*func)( void ) );
typedef void
(*pfn_graw_main_loop_t)( void );
static pfn_graw_create_window_and_screen_t
pfn_graw_create_window_and_screen = NULL;
static pfn_graw_set_display_func_t
pfn_graw_set_display_func = NULL;
static pfn_graw_main_loop_t
pfn_graw_main_loop = NULL;
static INLINE void *
graw_create_window_and_screen( int x,
int y,
unsigned width,
unsigned height,
enum pipe_format format,
void **handle )
{
static struct util_dl_library *lib;
lib = util_dl_open(UTIL_DL_PREFIX "graw" UTIL_DL_EXT);
if (!lib)
goto error;
pfn_graw_create_window_and_screen = (pfn_graw_create_window_and_screen_t)
util_dl_get_proc_address(lib, "graw_create_window_and_screen");
if (!pfn_graw_create_window_and_screen)
goto error;
pfn_graw_set_display_func = (pfn_graw_set_display_func_t)
util_dl_get_proc_address(lib, "graw_set_display_func");
if (!pfn_graw_set_display_func)
goto error;
pfn_graw_main_loop = (pfn_graw_main_loop_t)
util_dl_get_proc_address(lib, "graw_main_loop");
if (!pfn_graw_main_loop)
goto error;
return pfn_graw_create_window_and_screen(x, y, width, height, format, handle );
error:
fprintf(stderr, "failed to open " UTIL_DL_PREFIX "graw" UTIL_DL_EXT "\n");
return NULL;
}
static INLINE void
graw_set_display_func( void (*func)( void ) )
{
if (!pfn_graw_set_display_func)
return;
pfn_graw_set_display_func(func);
}
static INLINE void
graw_main_loop( void )
{
if (!pfn_graw_main_loop)
return;
pfn_graw_main_loop();
}
/*
* Helper functions. These are the same for all graw implementations.
*
* XXX: These aren't graw related. If they are useful then should go somwhere
* inside auxiliary/util.
*/
#define GRAW_MAX_NUM_TOKENS 1024
static INLINE void *
graw_parse_geometry_shader(struct pipe_context *pipe,
const char *text)
{
struct tgsi_token tokens[GRAW_MAX_NUM_TOKENS];
struct pipe_shader_state state;
if (!tgsi_text_translate(text, tokens, GRAW_MAX_NUM_TOKENS))
return NULL;
state.tokens = tokens;
return pipe->create_gs_state(pipe, &state);
}
static INLINE void *
graw_parse_vertex_shader(struct pipe_context *pipe,
const char *text)
{
struct tgsi_token tokens[GRAW_MAX_NUM_TOKENS];
struct pipe_shader_state state;
if (!tgsi_text_translate(text, tokens, GRAW_MAX_NUM_TOKENS))
return NULL;
state.tokens = tokens;
return pipe->create_vs_state(pipe, &state);
}
static INLINE void *
graw_parse_fragment_shader(struct pipe_context *pipe,
const char *text)
{
struct tgsi_token tokens[GRAW_MAX_NUM_TOKENS];
struct pipe_shader_state state;
if (!tgsi_text_translate(text, tokens, GRAW_MAX_NUM_TOKENS))
return NULL;
state.tokens = tokens;
return pipe->create_fs_state(pipe, &state);
}
#endif

View File

@@ -9,6 +9,11 @@ if 'mesa' in env['statetrackers']:
if 'gdi' in env['winsys'] and 'libgl-gdi' not in env['targets']:
env['targets'].append('libgl-gdi')
if not 'graw-xlib' in env['targets'] and not 'graw-null' in env['targets'] and not env['msvc']:
# XXX: disable until MSVC can link correctly
SConscript('graw-null/SConscript')
if env['dri']:
SConscript([
'SConscript.dri'

View File

@@ -0,0 +1,58 @@
#######################################################################
# SConscript for xlib winsys
Import('*')
env = env.Clone()
env.Prepend(LIBS = [
ws_null,
trace,
rbug,
identity,
# gallium,
])
env.Append(CPPPATH = [
'#src/gallium/drivers',
])
if env['platform'] == 'windows':
# For trace
env.Append(LIBS = [
'ws2_32',
])
sources = [
'graw_null.c',
'../graw-xlib/graw_util.c',
]
if True:
env.Append(CPPDEFINES = 'GALLIUM_SOFTPIPE')
env.Prepend(LIBS = [softpipe])
if env['llvm']:
env.Append(CPPDEFINES = 'GALLIUM_LLVMPIPE')
env.Tool('udis86')
env.Prepend(LIBS = [llvmpipe])
# Need this for trace, identity drivers referenced by
# gallium_wrap_screen().
#
env.Prepend(LIBS = [gallium])
# TODO: write a wrapper function http://www.scons.org/wiki/WrapperFunctions
graw = env.SharedLibrary(
target ='graw',
source = sources,
)
env.InstallSharedLibrary(graw, version=(1, 0))
if env['platform'] == 'windows':
graw = env.FindIxes(graw, 'LIBPREFIX', 'LIBSUFFIX')
else:
graw = env.FindIxes(graw, 'SHLIBPREFIX', 'SHLIBSUFFIX')
Export('graw')

View File

@@ -0,0 +1,95 @@
#include "pipe/p_compiler.h"
#include "util/u_debug.h"
#include "util/u_memory.h"
#include "target-helpers/wrap_screen.h"
#include "sw/null/null_sw_winsys.h"
#include "os/os_time.h"
#include "state_tracker/graw.h"
#ifdef GALLIUM_SOFTPIPE
#include "softpipe/sp_public.h"
#endif
#ifdef GALLIUM_LLVMPIPE
#include "llvmpipe/lp_public.h"
#endif
/* Haven't figured out a decent way to build the helper code yet -
* #include it here temporarily.
*/
#include "sw/sw_public.h"
#include "sw/sw.c"
#include <stdio.h>
static struct {
void (*draw)(void);
} graw;
struct pipe_screen *
graw_create_window_and_screen( int x,
int y,
unsigned width,
unsigned height,
enum pipe_format format,
void **handle)
{
const char *default_driver;
const char *driver;
struct pipe_screen *screen = NULL;
struct sw_winsys *winsys = NULL;
static int dummy;
/* Create the underlying winsys, which performs presents to Xlib
* drawables:
*/
winsys = null_sw_create();
if (winsys == NULL)
return NULL;
#if defined(GALLIUM_LLVMPIPE)
default_driver = "llvmpipe";
#elif defined(GALLIUM_SOFTPIPE)
default_driver = "softpipe";
#else
default_driver = "";
#endif
driver = debug_get_option("GALLIUM_DRIVER", default_driver);
#if defined(GALLIUM_LLVMPIPE)
if (screen == NULL && strcmp(driver, "llvmpipe") == 0)
screen = llvmpipe_create_screen( winsys );
#endif
#if defined(GALLIUM_SOFTPIPE)
if (screen == NULL)
screen = softpipe_create_screen( winsys );
#endif
*handle = &dummy;
/* Inject any wrapping layers we want to here:
*/
return gallium_wrap_screen( screen );
}
void
graw_set_display_func( void (*draw)( void ) )
{
graw.draw = draw;
}
void
graw_main_loop( void )
{
graw.draw();
os_time_sleep(100000);
}

View File

@@ -26,6 +26,7 @@ env.Append(CPPPATH = [
sources = [
'graw_xlib.c',
'graw_util.c',
]
env.Tool('x11')

View File

@@ -0,0 +1,50 @@
#include "pipe/p_compiler.h"
#include "pipe/p_context.h"
#include "pipe/p_state.h"
#include "tgsi/tgsi_text.h"
#include "util/u_memory.h"
#include "state_tracker/graw.h"
/* Helper functions. These are the same for all graw implementations.
*/
void *graw_parse_geometry_shader(struct pipe_context *pipe,
const char *text)
{
struct tgsi_token tokens[1024];
struct pipe_shader_state state;
if (!tgsi_text_translate(text, tokens, Elements(tokens)))
return NULL;
state.tokens = tokens;
return pipe->create_gs_state(pipe, &state);
}
void *graw_parse_vertex_shader(struct pipe_context *pipe,
const char *text)
{
struct tgsi_token tokens[1024];
struct pipe_shader_state state;
if (!tgsi_text_translate(text, tokens, Elements(tokens)))
return NULL;
state.tokens = tokens;
return pipe->create_vs_state(pipe, &state);
}
void *graw_parse_fragment_shader(struct pipe_context *pipe,
const char *text)
{
struct tgsi_token tokens[1024];
struct pipe_shader_state state;
if (!tgsi_text_translate(text, tokens, Elements(tokens)))
return NULL;
state.tokens = tokens;
return pipe->create_fs_state(pipe, &state);
}

View File

@@ -1,8 +1,15 @@
Import('*')
try:
graw
except NameError:
print 'warning: graw library not avaiable: skipping build of graw test'
Return()
env = env.Clone()
env.Prepend(LIBS = gallium)
env.Prepend(LIBPATH = [graw.dir])
env.Prepend(LIBS = ['graw'] + gallium)
if platform in ('freebsd8', 'sunos5'):
env.Append(LIBS = ['m'])

View File

@@ -2,7 +2,7 @@
* any utility code, just the graw interface and gallium.
*/
#include "state_tracker/graw_dl.h"
#include "state_tracker/graw.h"
#include "pipe/p_screen.h"
#include "pipe/p_context.h"
#include "pipe/p_state.h"

View File

@@ -2,7 +2,7 @@
* any utility code, just the graw interface and gallium.
*/
#include "state_tracker/graw_dl.h"
#include "state_tracker/graw.h"
#include "pipe/p_screen.h"
#include "pipe/p_context.h"
#include "pipe/p_shader_tokens.h"

View File

@@ -2,7 +2,7 @@
* any utility code, just the graw interface and gallium.
*/
#include "state_tracker/graw_dl.h"
#include "state_tracker/graw.h"
#include "pipe/p_screen.h"
#include "pipe/p_context.h"
#include "pipe/p_shader_tokens.h"

View File

@@ -2,7 +2,7 @@
* any utility code, just the graw interface and gallium.
*/
#include "state_tracker/graw_dl.h"
#include "state_tracker/graw.h"
#include "pipe/p_screen.h"
#include "pipe/p_context.h"
#include "pipe/p_shader_tokens.h"

View File

@@ -2,7 +2,7 @@
* any utility code, just the graw interface and gallium.
*/
#include "state_tracker/graw_dl.h"
#include "state_tracker/graw.h"
#include "pipe/p_screen.h"
#include "pipe/p_context.h"
#include "pipe/p_state.h"

View File

@@ -5,7 +5,7 @@
#include <stdio.h>
#include <string.h>
#include "state_tracker/graw_dl.h"
#include "state_tracker/graw.h"
#include "pipe/p_screen.h"
#include "pipe/p_context.h"
#include "pipe/p_state.h"

View File

@@ -2,7 +2,7 @@
* any utility code, just the graw interface and gallium.
*/
#include "state_tracker/graw_dl.h"
#include "state_tracker/graw.h"
#include "pipe/p_screen.h"
#include "pipe/p_context.h"
#include "pipe/p_state.h"

View File

@@ -2,7 +2,7 @@
* any utility code, just the graw interface and gallium.
*/
#include "state_tracker/graw_dl.h"
#include "state_tracker/graw.h"
#include "pipe/p_screen.h"
#include "pipe/p_context.h"
#include "pipe/p_shader_tokens.h"