Browse Source

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.
tags/mesa-7.9-rc1
José Fonseca 16 years ago
parent
commit
f0eb02af80

+ 152
- 0
src/gallium/include/state_tracker/graw_dl.h View File

@@ -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

+ 0
- 1
src/gallium/targets/graw-xlib/SConscript View File

@@ -26,7 +26,6 @@ env.Append(CPPPATH = [

sources = [
'graw_xlib.c',
'graw_util.c',
]

env.Tool('x11')

+ 0
- 49
src/gallium/targets/graw-xlib/graw_util.c View File

@@ -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
- 8
src/gallium/tests/graw/SConscript View File

@@ -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'])

+ 1
- 1
src/gallium/tests/graw/clear.c View File

@@ -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"

+ 1
- 1
src/gallium/tests/graw/fs-test.c View File

@@ -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"

+ 1
- 1
src/gallium/tests/graw/gs-test.c View File

@@ -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"

+ 1
- 1
src/gallium/tests/graw/quad-tex.c View File

@@ -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"

+ 1
- 1
src/gallium/tests/graw/tri-gs.c View File

@@ -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"

+ 1
- 1
src/gallium/tests/graw/tri-instanced.c View File

@@ -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"

+ 1
- 1
src/gallium/tests/graw/tri.c View File

@@ -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"

+ 1
- 1
src/gallium/tests/graw/vs-test.c View File

@@ -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"

Loading…
Cancel
Save