graw: Dynamically load graw libraries.
This allows to build multiple graws libs simultaneously and avoid unnecessary rebuilds of the tests. Also remove graw_util.c from inside the graw implementation -- it was only being provided by one implementation, and graw tests were linking against gallium anyway.
This commit is contained in:
@@ -0,0 +1,152 @@
|
||||
#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 "pipe/p_compiler.h"
|
||||
#include "pipe/p_format.h"
|
||||
#include "pipe/p_context.h"
|
||||
#include "util/u_dl.h"
|
||||
#include "tgsi/tgsi_text.h"
|
||||
#include <stdio.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
|
||||
@@ -26,7 +26,6 @@ env.Append(CPPPATH = [
|
||||
|
||||
sources = [
|
||||
'graw_xlib.c',
|
||||
'graw_util.c',
|
||||
]
|
||||
|
||||
env.Tool('x11')
|
||||
|
||||
@@ -1,49 +0,0 @@
|
||||
|
||||
#include "pipe/p_compiler.h"
|
||||
#include "pipe/p_context.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);
|
||||
}
|
||||
|
||||
@@ -1,15 +1,8 @@
|
||||
Import('*')
|
||||
|
||||
try:
|
||||
graw
|
||||
except NameError:
|
||||
print 'warning: graw library not avaiable: skipping build of graw test'
|
||||
Return()
|
||||
|
||||
env = env.Clone()
|
||||
|
||||
env.Prepend(LIBPATH = [graw.dir])
|
||||
env.Prepend(LIBS = ['graw'] + gallium)
|
||||
env.Prepend(LIBS = gallium)
|
||||
|
||||
if platform in ('freebsd8', 'sunos5'):
|
||||
env.Append(LIBS = ['m'])
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
* any utility code, just the graw interface and gallium.
|
||||
*/
|
||||
|
||||
#include "state_tracker/graw.h"
|
||||
#include "state_tracker/graw_dl.h"
|
||||
#include "pipe/p_screen.h"
|
||||
#include "pipe/p_context.h"
|
||||
#include "pipe/p_state.h"
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
* any utility code, just the graw interface and gallium.
|
||||
*/
|
||||
|
||||
#include "state_tracker/graw.h"
|
||||
#include "state_tracker/graw_dl.h"
|
||||
#include "pipe/p_screen.h"
|
||||
#include "pipe/p_context.h"
|
||||
#include "pipe/p_shader_tokens.h"
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
* any utility code, just the graw interface and gallium.
|
||||
*/
|
||||
|
||||
#include "state_tracker/graw.h"
|
||||
#include "state_tracker/graw_dl.h"
|
||||
#include "pipe/p_screen.h"
|
||||
#include "pipe/p_context.h"
|
||||
#include "pipe/p_shader_tokens.h"
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
* any utility code, just the graw interface and gallium.
|
||||
*/
|
||||
|
||||
#include "state_tracker/graw.h"
|
||||
#include "state_tracker/graw_dl.h"
|
||||
#include "pipe/p_screen.h"
|
||||
#include "pipe/p_context.h"
|
||||
#include "pipe/p_shader_tokens.h"
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
* any utility code, just the graw interface and gallium.
|
||||
*/
|
||||
|
||||
#include "state_tracker/graw.h"
|
||||
#include "state_tracker/graw_dl.h"
|
||||
#include "pipe/p_screen.h"
|
||||
#include "pipe/p_context.h"
|
||||
#include "pipe/p_state.h"
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "state_tracker/graw.h"
|
||||
#include "state_tracker/graw_dl.h"
|
||||
#include "pipe/p_screen.h"
|
||||
#include "pipe/p_context.h"
|
||||
#include "pipe/p_state.h"
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
* any utility code, just the graw interface and gallium.
|
||||
*/
|
||||
|
||||
#include "state_tracker/graw.h"
|
||||
#include "state_tracker/graw_dl.h"
|
||||
#include "pipe/p_screen.h"
|
||||
#include "pipe/p_context.h"
|
||||
#include "pipe/p_state.h"
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
* any utility code, just the graw interface and gallium.
|
||||
*/
|
||||
|
||||
#include "state_tracker/graw.h"
|
||||
#include "state_tracker/graw_dl.h"
|
||||
#include "pipe/p_screen.h"
|
||||
#include "pipe/p_context.h"
|
||||
#include "pipe/p_shader_tokens.h"
|
||||
|
||||
Reference in New Issue
Block a user