Place in new xlib state-tracker. This is a statetracker for the GLX API.tags/mesa_20090313
@@ -89,7 +89,7 @@ EGL_DRIVERS_DIRS = demo | |||
# Gallium directories and | |||
GALLIUM_AUXILIARY_DIRS = draw translate cso_cache pipebuffer tgsi sct rtasm util | |||
GALLIUM_AUXILIARIES = $(foreach DIR,$(GALLIUM_AUXILIARY_DIRS),$(TOP)/src/gallium/auxiliary/$(DIR)/lib$(DIR).a) | |||
GALLIUM_DRIVER_DIRS = softpipe i915simple i965simple nv04 nv10 nv20 nv30 nv40 nv50 failover | |||
GALLIUM_DRIVER_DIRS = softpipe i915simple i965simple nv04 nv10 nv20 nv30 nv40 nv50 failover trace | |||
GALLIUM_DRIVERS = $(foreach DIR,$(GALLIUM_DRIVER_DIRS),$(TOP)/src/gallium/drivers/$(DIR)/lib$(DIR).a) | |||
GALLIUM_WINSYS_DIRS = xlib egl_xlib | |||
@@ -2,7 +2,7 @@ TOP = ../.. | |||
include $(TOP)/configs/current | |||
SUBDIRS = auxiliary drivers | |||
SUBDIRS = auxiliary drivers state_trackers | |||
# Note winsys/ needs to be built after src/mesa | |||
@@ -1,40 +0,0 @@ | |||
/************************************************************************** | |||
* | |||
* Copyright 2007 Tungsten Graphics, Inc., Cedar Park, Texas. | |||
* 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 "util/u_memory.h" | |||
#include "cell_winsys.h" | |||
struct cell_winsys * | |||
cell_get_winsys(uint format) | |||
{ | |||
struct cell_winsys *cws = CALLOC_STRUCT(cell_winsys); | |||
if (cws) | |||
cws->preferredFormat = format; | |||
return cws; | |||
} |
@@ -0,0 +1,18 @@ | |||
TOP = ../../../.. | |||
include $(TOP)/configs/current | |||
LIBNAME = trace | |||
C_SOURCES = \ | |||
tr_context.c \ | |||
tr_dump.c \ | |||
tr_screen.c \ | |||
tr_state.c \ | |||
tr_texture.c \ | |||
tr_winsys.c | |||
include ../../Makefile.template | |||
symlinks: | |||
@@ -0,0 +1,25 @@ | |||
TOP = ../../.. | |||
include $(TOP)/configs/current | |||
SUBDIRS = xlib | |||
default: subdirs | |||
subdirs: | |||
@for dir in $(SUBDIRS) ; do \ | |||
if [ -d $$dir ] ; then \ | |||
(cd $$dir && $(MAKE)) || exit 1 ; \ | |||
fi \ | |||
done | |||
clean: | |||
rm -f `find . -name \*.[oa]` | |||
rm -f `find . -name depend` | |||
# Dummy install target | |||
install: |
@@ -0,0 +1,25 @@ | |||
TOP = ../../../.. | |||
include $(TOP)/configs/current | |||
LIBNAME = xlib | |||
DRIVER_INCLUDES = \ | |||
-I$(TOP)/include \ | |||
-I$(TOP)/src/mesa \ | |||
-I$(TOP)/src/mesa/main \ | |||
-I$(TOP)/src/gallium/include \ | |||
-I$(TOP)/src/gallium/drivers \ | |||
-I$(TOP)/src/gallium/auxiliary | |||
C_SOURCES = \ | |||
glxapi.c \ | |||
fakeglx.c \ | |||
xfonts.c \ | |||
xm_api.c | |||
include ../../Makefile.template | |||
symlinks: | |||
@@ -67,9 +67,10 @@ | |||
#include "state_tracker/st_context.h" | |||
#include "pipe/p_defines.h" | |||
#include "pipe/p_screen.h" | |||
#include "pipe/p_winsys.h" | |||
#include "pipe/p_context.h" | |||
#include "xm_winsys_aub.h" | |||
#include "xm_winsys.h" | |||
/** | |||
* Global X driver lock | |||
@@ -77,8 +78,6 @@ | |||
pipe_mutex _xmesa_lock; | |||
int xmesa_mode; | |||
/**********************************************************************/ | |||
/***** X Utility Functions *****/ | |||
@@ -777,6 +776,8 @@ PUBLIC | |||
XMesaContext XMesaCreateContext( XMesaVisual v, XMesaContext share_list ) | |||
{ | |||
static GLboolean firstTime = GL_TRUE; | |||
struct pipe_winsys *winsys; | |||
struct pipe_screen *screen; | |||
struct pipe_context *pipe; | |||
XMesaContext c; | |||
GLcontext *mesaCtx; | |||
@@ -797,24 +798,30 @@ XMesaContext XMesaCreateContext( XMesaVisual v, XMesaContext share_list ) | |||
c->xm_visual = v; | |||
c->xm_buffer = NULL; /* set later by XMesaMakeCurrent */ | |||
/* XXX: create once per Xlib Display. | |||
*/ | |||
winsys = xmesa_create_pipe_winsys(); | |||
if (winsys == NULL) | |||
goto fail; | |||
if (!getenv("XM_AUB")) { | |||
xmesa_mode = XMESA_SOFTPIPE; | |||
pipe = xmesa_create_pipe_context( c, pf ); | |||
} | |||
else { | |||
xmesa_mode = XMESA_AUB; | |||
pipe = xmesa_create_i965simple(xmesa_get_pipe_winsys_aub(v)); | |||
} | |||
/* XXX: create once per Xlib Display. | |||
*/ | |||
screen = xmesa_create_pipe_screen( winsys ); | |||
if (screen == NULL) | |||
goto fail; | |||
pipe = xmesa_create_pipe_context( screen, | |||
(void *)c ); | |||
if (pipe == NULL) | |||
goto fail; | |||
c->st = st_create_context(pipe, &v->mesa_visual, | |||
c->st = st_create_context(pipe, | |||
&v->mesa_visual, | |||
share_list ? share_list->st : NULL); | |||
if (c->st == NULL) | |||
goto fail; | |||
mesaCtx = c->st->ctx; | |||
c->st->ctx->DriverCtx = c; | |||
@@ -840,6 +847,13 @@ XMesaContext XMesaCreateContext( XMesaVisual v, XMesaContext share_list ) | |||
st_destroy_context(c->st); | |||
else if (pipe) | |||
pipe->destroy(pipe); | |||
if (screen) | |||
screen->destroy( screen ); | |||
if (winsys) | |||
winsys->destroy( winsys ); | |||
FREE(c); | |||
return NULL; | |||
} | |||
@@ -849,12 +863,14 @@ XMesaContext XMesaCreateContext( XMesaVisual v, XMesaContext share_list ) | |||
PUBLIC | |||
void XMesaDestroyContext( XMesaContext c ) | |||
{ | |||
struct pipe_screen *screen = c->st->pipe->screen; | |||
st_destroy_context(c->st); | |||
/* FIXME: We should destroy the screen here, but if we do so, surfaces may | |||
* outlive it, causing segfaults | |||
struct pipe_screen *screen = c->st->pipe->screen; | |||
screen->destroy(screen); | |||
*/ | |||
_mesa_free(c); | |||
} | |||
@@ -1244,10 +1260,8 @@ void XMesaSwapBuffers( XMesaBuffer b ) | |||
surf = st_get_framebuffer_surface(b->stfb, ST_SURFACE_BACK_LEFT); | |||
if (surf) { | |||
if (xmesa_mode == XMESA_AUB) | |||
xmesa_display_aub( surf ); | |||
else | |||
xmesa_display_surface(b, surf); | |||
xmesa_display_surface(b, surf); | |||
// xmesa_display_surface(b, surf); | |||
} | |||
xmesa_check_and_update_buffer_size(NULL, b); |
@@ -1,3 +1,4 @@ | |||
/************************************************************************** | |||
* | |||
* Copyright 2006 Tungsten Graphics, Inc., Cedar Park, Texas. | |||
@@ -25,44 +26,32 @@ | |||
* | |||
**************************************************************************/ | |||
#ifndef AUB_WINSYS_H | |||
#define AUB_WINSYS_H | |||
#ifndef XM_WINSYS_H | |||
#define XM_WINSYS_H | |||
struct pipe_context; | |||
struct pipe_screen; | |||
struct pipe_winsys; | |||
struct pipe_buffer; | |||
struct pipe_surface; | |||
struct pipe_winsys * | |||
xmesa_create_pipe_winsys_aub( void ); | |||
void | |||
xmesa_destroy_pipe_winsys_aub( struct pipe_winsys *winsys ); | |||
struct pipe_context * | |||
xmesa_create_i965simple( struct pipe_winsys *winsys ); | |||
struct xmesa_buffer; | |||
void xmesa_buffer_subdata_aub(struct pipe_winsys *winsys, | |||
struct pipe_buffer *buf, | |||
unsigned long offset, | |||
unsigned long size, | |||
const void *data, | |||
unsigned aub_type, | |||
unsigned aub_sub_type); | |||
/* Will turn this into a callback-style interface. For now, these | |||
* have fixed names, and are implemented in the winsys/xlib directory. | |||
*/ | |||
struct pipe_winsys *xmesa_create_pipe_winsys( void ); | |||
void xmesa_commands_aub(struct pipe_winsys *winsys, | |||
unsigned *cmds, | |||
unsigned nr_dwords); | |||
struct pipe_screen *xmesa_create_pipe_screen( struct pipe_winsys * ); | |||
/* The context_private argument needs to go away. Is currently used | |||
* in a round-about way to associate a display-target surface with its | |||
* Xlib window. | |||
*/ | |||
struct pipe_context *xmesa_create_pipe_context( struct pipe_screen *, | |||
void *context_private ); | |||
void xmesa_display_aub( /* struct pipe_winsys *winsys, */ | |||
struct pipe_surface *surface ); | |||
void xmesa_display_surface( struct xmesa_buffer *, | |||
struct pipe_surface * ); | |||
extern struct pipe_winsys * | |||
xmesa_get_pipe_winsys_aub(struct xmesa_visual *xm_vis); | |||
#endif |
@@ -42,12 +42,6 @@ extern pipe_mutex _xmesa_lock; | |||
extern XMesaBuffer XMesaBufferList; | |||
/* | |||
*/ | |||
#define XMESA_SOFTPIPE 1 | |||
#define XMESA_AUB 2 | |||
extern int xmesa_mode; | |||
/** | |||
* Visual inforation, derived from GLvisual. | |||
@@ -156,9 +150,6 @@ xmesa_check_and_update_buffer_size(XMesaContext xmctx, XMesaBuffer drawBuffer); | |||
extern void | |||
xmesa_destroy_buffers_on_display(XMesaDisplay *dpy); | |||
extern struct pipe_context * | |||
xmesa_create_pipe_context(XMesaContext xm, uint pixelformat); | |||
static INLINE GLuint | |||
xmesa_buffer_width(XMesaBuffer b) | |||
{ | |||
@@ -171,9 +162,6 @@ xmesa_buffer_height(XMesaBuffer b) | |||
return b->stfb->Base.Height; | |||
} | |||
extern void | |||
xmesa_display_surface(XMesaBuffer b, const struct pipe_surface *surf); | |||
extern int | |||
xmesa_check_for_xshm(XMesaDisplay *display); | |||
@@ -19,16 +19,17 @@ INCLUDE_DIRS = \ | |||
-I$(TOP)/src/mesa/main \ | |||
-I$(TOP)/src/gallium/include \ | |||
-I$(TOP)/src/gallium/drivers \ | |||
-I$(TOP)/src/gallium/state_trackers/xlib \ | |||
-I$(TOP)/src/gallium/auxiliary | |||
XLIB_WINSYS_SOURCES = \ | |||
glxapi.c \ | |||
fakeglx.c \ | |||
xfonts.c \ | |||
xm_api.c \ | |||
xm_winsys.c \ | |||
xm_winsys_aub.c \ | |||
brw_aub.c | |||
xlib.c \ | |||
xlib_brw_aub.c \ | |||
xlib_brw_context.c \ | |||
xlib_brw_screen.c \ | |||
xlib_softpipe.c \ | |||
xlib_trace.c | |||
XLIB_WINSYS_OBJECTS = $(XLIB_WINSYS_SOURCES:.c=.o) | |||
@@ -63,6 +64,7 @@ $(TOP)/$(LIB_DIR)/$(GL_LIB_NAME): $(XLIB_WINSYS_OBJECTS) $(LIBS) | |||
-major $(GL_MAJOR) -minor $(GL_MINOR) -patch $(GL_TINY) \ | |||
-install $(TOP)/$(LIB_DIR) \ | |||
$(MKLIB_OPTIONS) $(XLIB_WINSYS_OBJECTS) \ | |||
$(TOP)/src/gallium/state_trackers/xlib/*.o \ | |||
--start-group $(LIBS) --end-group $(GL_LIB_DEPS) | |||
@@ -0,0 +1,165 @@ | |||
/************************************************************************** | |||
* | |||
* Copyright 2007 Tungsten Graphics, Inc., Bismarck, ND., USA | |||
* 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 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 | |||
* THE COPYRIGHT HOLDERS, AUTHORS 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. | |||
* | |||
* The above copyright notice and this permission notice (including the | |||
* next paragraph) shall be included in all copies or substantial portions | |||
* of the Software. | |||
* | |||
* | |||
**************************************************************************/ | |||
/* | |||
* Authors: | |||
* Keith Whitwell | |||
*/ | |||
#include "xlib_trace.h" | |||
#include "xlib_softpipe.h" | |||
#include "xlib_brw.h" | |||
#include "xm_winsys.h" | |||
#include <stdlib.h> | |||
#include <assert.h> | |||
/* Todo, replace all this with callback-structs provided by the | |||
* individual implementations. | |||
*/ | |||
enum mode { | |||
MODE_TRACE, | |||
MODE_BRW, | |||
MODE_CELL, | |||
MODE_SOFTPIPE | |||
}; | |||
static enum mode xlib_mode; | |||
static enum mode get_mode() | |||
{ | |||
if (getenv("XMESA_TRACE")) | |||
return MODE_TRACE; | |||
if (getenv("XMESA_BRW")) | |||
return MODE_BRW; | |||
#ifdef GALLIUM_CELL | |||
if (!getenv("GALLIUM_NOCELL")) | |||
return MODE_CELL; | |||
#endif | |||
return MODE_SOFTPIPE; | |||
} | |||
struct pipe_winsys * | |||
xmesa_create_pipe_winsys( void ) | |||
{ | |||
xlib_mode = get_mode(); | |||
switch (xlib_mode) { | |||
case MODE_TRACE: | |||
return xlib_create_trace_winsys(); | |||
case MODE_BRW: | |||
return xlib_create_brw_winsys(); | |||
case MODE_CELL: | |||
return xlib_create_cell_winsys(); | |||
case MODE_SOFTPIPE: | |||
return xlib_create_softpipe_winsys(); | |||
default: | |||
assert(0); | |||
return NULL; | |||
} | |||
} | |||
struct pipe_screen * | |||
xmesa_create_pipe_screen( struct pipe_winsys *winsys ) | |||
{ | |||
switch (xlib_mode) { | |||
case MODE_TRACE: | |||
return xlib_create_trace_screen( winsys ); | |||
case MODE_BRW: | |||
return xlib_create_brw_screen( winsys ); | |||
case MODE_CELL: | |||
return xlib_create_cell_screen( winsys ); | |||
case MODE_SOFTPIPE: | |||
return xlib_create_softpipe_screen( winsys ); | |||
default: | |||
assert(0); | |||
return NULL; | |||
} | |||
} | |||
struct pipe_context * | |||
xmesa_create_pipe_context( struct pipe_screen *screen, | |||
void *priv ) | |||
{ | |||
switch (xlib_mode) { | |||
case MODE_TRACE: | |||
return xlib_create_trace_context( screen, priv ); | |||
case MODE_BRW: | |||
return xlib_create_brw_context( screen, priv ); | |||
case MODE_CELL: | |||
return xlib_create_cell_context( screen, priv ); | |||
case MODE_SOFTPIPE: | |||
return xlib_create_softpipe_context( screen, priv ); | |||
default: | |||
assert(0); | |||
return NULL; | |||
} | |||
} | |||
void | |||
xmesa_display_surface( struct xmesa_buffer *buffer, | |||
struct pipe_surface *surf ) | |||
{ | |||
switch (xlib_mode) { | |||
case MODE_TRACE: | |||
xlib_trace_display_surface( buffer, surf ); | |||
break; | |||
case MODE_BRW: | |||
xlib_brw_display_surface( buffer, surf ); | |||
break; | |||
case MODE_CELL: | |||
xlib_cell_display_surface( buffer, surf ); | |||
break; | |||
case MODE_SOFTPIPE: | |||
xlib_softpipe_display_surface( buffer, surf ); | |||
break; | |||
default: | |||
assert(0); | |||
break; | |||
} | |||
} | |||
/*********************************************************************** | |||
* | |||
* Butt-ugly hack to convince the linker not to throw away public GL | |||
* symbols (they are all referenced from getprocaddress, I guess). | |||
*/ | |||
extern void (*linker_foo(const unsigned char *procName))(); | |||
extern void (*glXGetProcAddress(const unsigned char *procName))(); | |||
extern void (*linker_foo(const unsigned char *procName))() | |||
{ | |||
return glXGetProcAddress(procName); | |||
} |
@@ -0,0 +1,40 @@ | |||
#ifndef XLIB_BRW_H | |||
#define XLIB_BRW_H | |||
struct pipe_winsys; | |||
struct pipe_buffer; | |||
struct pipe_surface; | |||
struct xmesa_buffer; | |||
struct pipe_winsys *xlib_create_brw_winsys( void ); | |||
struct pipe_screen *xlib_create_brw_screen( struct pipe_winsys * ); | |||
struct pipe_context *xlib_create_brw_context( struct pipe_screen *, | |||
void *priv ); | |||
void xlib_brw_display_surface(struct xmesa_buffer *b, | |||
struct pipe_surface *surf); | |||
/*********************************************************************** | |||
* Internal functions | |||
*/ | |||
unsigned xlib_brw_get_buffer_offset( struct pipe_winsys *pws, | |||
struct pipe_buffer *buf, | |||
unsigned access_flags ); | |||
void xlib_brw_buffer_subdata_typed( struct pipe_winsys *pws, | |||
struct pipe_buffer *buf, | |||
unsigned long offset, | |||
unsigned long size, | |||
const void *data, | |||
unsigned data_type ); | |||
void xlib_brw_commands_aub(struct pipe_winsys *winsys, | |||
unsigned *cmds, | |||
unsigned nr_dwords); | |||
#endif |
@@ -31,7 +31,7 @@ | |||
#include <stdio.h> | |||
#include <stdlib.h> | |||
#include "brw_aub.h" | |||
#include "xlib_brw_aub.h" | |||
#include "pipe/p_context.h" | |||
#include "pipe/p_state.h" | |||
#include "pipe/p_debug.h" |
@@ -0,0 +1,205 @@ | |||
/************************************************************************** | |||
* | |||
* Copyright 2007 Tungsten Graphics, Inc., Bismarck, ND., USA | |||
* 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 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 | |||
* THE COPYRIGHT HOLDERS, AUTHORS 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. | |||
* | |||
* The above copyright notice and this permission notice (including the | |||
* next paragraph) shall be included in all copies or substantial portions | |||
* of the Software. | |||
* | |||
* | |||
**************************************************************************/ | |||
/* | |||
* Authors: | |||
* Keith Whitwell | |||
* Brian Paul | |||
*/ | |||
//#include "glxheader.h" | |||
//#include "xmesaP.h" | |||
#include "pipe/p_winsys.h" | |||
#include "pipe/p_inlines.h" | |||
#include "util/u_math.h" | |||
#include "util/u_memory.h" | |||
#include "i965simple/brw_winsys.h" | |||
#include "xlib_brw_aub.h" | |||
#include "xlib_brw.h" | |||
#define XBCWS_BATCHBUFFER_SIZE 1024 | |||
/* The backend to the brw driver (ie struct brw_winsys) is actually a | |||
* per-context entity. | |||
*/ | |||
struct xlib_brw_context_winsys { | |||
struct brw_winsys brw_context_winsys; /**< batch buffer funcs */ | |||
struct aub_context *aub; | |||
struct pipe_winsys *pipe_winsys; | |||
unsigned batch_data[XBCWS_BATCHBUFFER_SIZE]; | |||
unsigned batch_nr; | |||
unsigned batch_size; | |||
unsigned batch_alloc; | |||
}; | |||
/* Turn a brw_winsys into an xlib_brw_context_winsys: | |||
*/ | |||
static inline struct xlib_brw_context_winsys * | |||
xlib_brw_context_winsys( struct brw_winsys *sws ) | |||
{ | |||
return (struct xlib_brw_context_winsys *)sws; | |||
} | |||
/* Simple batchbuffer interface: | |||
*/ | |||
static unsigned *xbcws_batch_start( struct brw_winsys *sws, | |||
unsigned dwords, | |||
unsigned relocs ) | |||
{ | |||
struct xlib_brw_context_winsys *xbcws = xlib_brw_context_winsys(sws); | |||
if (xbcws->batch_size < xbcws->batch_nr + dwords) | |||
return NULL; | |||
xbcws->batch_alloc = xbcws->batch_nr + dwords; | |||
return (void *)1; /* not a valid pointer! */ | |||
} | |||
static void xbcws_batch_dword( struct brw_winsys *sws, | |||
unsigned dword ) | |||
{ | |||
struct xlib_brw_context_winsys *xbcws = xlib_brw_context_winsys(sws); | |||
assert(xbcws->batch_nr < xbcws->batch_alloc); | |||
xbcws->batch_data[xbcws->batch_nr++] = dword; | |||
} | |||
static void xbcws_batch_reloc( struct brw_winsys *sws, | |||
struct pipe_buffer *buf, | |||
unsigned access_flags, | |||
unsigned delta ) | |||
{ | |||
struct xlib_brw_context_winsys *xbcws = xlib_brw_context_winsys(sws); | |||
assert(xbcws->batch_nr < xbcws->batch_alloc); | |||
xbcws->batch_data[xbcws->batch_nr++] = | |||
( xlib_brw_get_buffer_offset( NULL, buf, access_flags ) + | |||
delta ); | |||
} | |||
static void xbcws_batch_end( struct brw_winsys *sws ) | |||
{ | |||
struct xlib_brw_context_winsys *xbcws = xlib_brw_context_winsys(sws); | |||
assert(xbcws->batch_nr <= xbcws->batch_alloc); | |||
xbcws->batch_alloc = 0; | |||
} | |||
static void xbcws_batch_flush( struct brw_winsys *sws, | |||
struct pipe_fence_handle **fence ) | |||
{ | |||
struct xlib_brw_context_winsys *xbcws = xlib_brw_context_winsys(sws); | |||
assert(xbcws->batch_nr <= xbcws->batch_size); | |||
if (xbcws->batch_nr) { | |||
xlib_brw_commands_aub( xbcws->pipe_winsys, | |||
xbcws->batch_data, | |||
xbcws->batch_nr ); | |||
} | |||
xbcws->batch_nr = 0; | |||
} | |||
/* Really a per-device function, just pass through: | |||
*/ | |||
static unsigned xbcws_get_buffer_offset( struct brw_winsys *sws, | |||
struct pipe_buffer *buf, | |||
unsigned access_flags ) | |||
{ | |||
struct xlib_brw_context_winsys *xbcws = xlib_brw_context_winsys(sws); | |||
return xlib_brw_get_buffer_offset( xbcws->pipe_winsys, | |||
buf, | |||
access_flags ); | |||
} | |||
/* Really a per-device function, just pass through: | |||
*/ | |||
static void xbcws_buffer_subdata_typed( struct brw_winsys *sws, | |||
struct pipe_buffer *buf, | |||
unsigned long offset, | |||
unsigned long size, | |||
const void *data, | |||
unsigned data_type ) | |||
{ | |||
struct xlib_brw_context_winsys *xbcws = xlib_brw_context_winsys(sws); | |||
xlib_brw_buffer_subdata_typed( xbcws->pipe_winsys, | |||
buf, | |||
offset, | |||
size, | |||
data, | |||
data_type ); | |||
} | |||
/** | |||
* Create i965 hardware rendering context, but plugged into a | |||
* dump-to-aubfile backend. | |||
*/ | |||
struct pipe_context * | |||
xlib_create_brw_context( struct pipe_screen *screen, | |||
void *unused ) | |||
{ | |||
struct xlib_brw_context_winsys *xbcws = CALLOC_STRUCT( xlib_brw_context_winsys ); | |||
/* Fill in this struct with callbacks that i965simple will need to | |||
* communicate with the window system, buffer manager, etc. | |||
*/ | |||
xbcws->brw_context_winsys.batch_start = xbcws_batch_start; | |||
xbcws->brw_context_winsys.batch_dword = xbcws_batch_dword; | |||
xbcws->brw_context_winsys.batch_reloc = xbcws_batch_reloc; | |||
xbcws->brw_context_winsys.batch_end = xbcws_batch_end; | |||
xbcws->brw_context_winsys.batch_flush = xbcws_batch_flush; | |||
xbcws->brw_context_winsys.buffer_subdata_typed = xbcws_buffer_subdata_typed; | |||
xbcws->brw_context_winsys.get_buffer_offset = xbcws_get_buffer_offset; | |||
xbcws->pipe_winsys = screen->winsys; /* redundant */ | |||
xbcws->batch_size = XBCWS_BATCHBUFFER_SIZE; | |||
/* Create the i965simple context: | |||
*/ | |||
return brw_create( screen, | |||
&xbcws->brw_context_winsys, | |||
0 ); | |||
} |
@@ -33,8 +33,8 @@ | |||
*/ | |||
#include "glxheader.h" | |||
#include "xmesaP.h" | |||
//#include "state_trackers/xlib/glxheader.h" | |||
//#include "state_trackers/xlib/xmesaP.h" | |||
#include "pipe/p_winsys.h" | |||
#include "pipe/p_inlines.h" | |||
@@ -42,8 +42,9 @@ | |||
#include "util/u_memory.h" | |||
#include "i965simple/brw_winsys.h" | |||
#include "i965simple/brw_screen.h" | |||
#include "brw_aub.h" | |||
#include "xm_winsys_aub.h" | |||
#include "xlib_brw_aub.h" | |||
#include "xlib_brw.h" | |||
@@ -142,29 +143,8 @@ aub_buffer_destroy(struct pipe_winsys *winsys, | |||
} | |||
void xmesa_buffer_subdata_aub(struct pipe_winsys *winsys, | |||
struct pipe_buffer *buf, | |||
unsigned long offset, | |||
unsigned long size, | |||
const void *data, | |||
unsigned aub_type, | |||
unsigned aub_sub_type) | |||
{ | |||
struct aub_pipe_winsys *iws = aub_pipe_winsys(winsys); | |||
struct aub_buffer *sbo = aub_bo(buf); | |||
assert(sbo->size > offset + size); | |||
memcpy(sbo->data + offset, data, size); | |||
brw_aub_gtt_data( iws->aubfile, | |||
sbo->offset + offset, | |||
sbo->data + offset, | |||
size, | |||
aub_type, | |||
aub_sub_type ); | |||
} | |||
void xmesa_commands_aub(struct pipe_winsys *winsys, | |||
void xlib_brw_commands_aub(struct pipe_winsys *winsys, | |||
unsigned *cmds, | |||
unsigned nr_dwords) | |||
{ | |||
@@ -182,16 +162,10 @@ void xmesa_commands_aub(struct pipe_winsys *winsys, | |||
} | |||
/* XXX: fix me: | |||
*/ | |||
static struct aub_pipe_winsys *global_winsys = NULL; | |||
void xmesa_display_aub( /* struct pipe_winsys *winsys, */ | |||
struct pipe_surface *surface ) | |||
{ | |||
// struct aub_pipe_winsys *iws = aub_pipe_winsys(winsys); | |||
brw_aub_dump_bmp( global_winsys->aubfile, | |||
surface, | |||
aub_bo(surface->buffer)->offset ); | |||
} | |||
@@ -245,10 +219,13 @@ aub_user_buffer_create(struct pipe_winsys *winsys, void *ptr, unsigned bytes) | |||
*/ | |||
static void | |||
aub_flush_frontbuffer( struct pipe_winsys *winsys, | |||
struct pipe_surface *surf, | |||
void *context_private) | |||
struct pipe_surface *surface, | |||
void *context_private) | |||
{ | |||
xmesa_display_aub( surf ); | |||
// struct aub_pipe_winsys *iws = aub_pipe_winsys(winsys); | |||
brw_aub_dump_bmp( global_winsys->aubfile, | |||
surface, | |||
aub_bo(surface->buffer)->offset ); | |||
} | |||
static struct pipe_surface * | |||
@@ -322,8 +299,20 @@ aub_get_name( struct pipe_winsys *winsys ) | |||
return "Aub/xlib"; | |||
} | |||
static void | |||
xlib_brw_destroy_pipe_winsys_aub( struct pipe_winsys *winsys ) | |||
{ | |||
struct aub_pipe_winsys *iws = aub_pipe_winsys(winsys); | |||
brw_aub_destroy(iws->aubfile); | |||
free(iws->pool); | |||
free(iws); | |||
} | |||
struct pipe_winsys * | |||
xmesa_create_pipe_winsys_aub( void ) | |||
xlib_create_brw_winsys( void ) | |||
{ | |||
struct aub_pipe_winsys *iws = CALLOC_STRUCT( aub_pipe_winsys ); | |||
@@ -341,6 +330,7 @@ xmesa_create_pipe_winsys_aub( void ) | |||
iws->winsys.buffer_destroy = aub_buffer_destroy; | |||
iws->winsys.flush_frontbuffer = aub_flush_frontbuffer; | |||
iws->winsys.get_name = aub_get_name; | |||
iws->winsys.destroy = xlib_brw_destroy_pipe_winsys_aub; | |||
iws->winsys.surface_alloc = aub_i915_surface_alloc; | |||
iws->winsys.surface_alloc_storage = aub_i915_surface_alloc_storage; | |||
@@ -359,122 +349,30 @@ xmesa_create_pipe_winsys_aub( void ) | |||
} | |||
void | |||
xmesa_destroy_pipe_winsys_aub( struct pipe_winsys *winsys ) | |||
{ | |||
struct aub_pipe_winsys *iws = aub_pipe_winsys(winsys); | |||
brw_aub_destroy(iws->aubfile); | |||
free(iws->pool); | |||
free(iws); | |||
} | |||
#define IWS_BATCHBUFFER_SIZE 1024 | |||
struct aub_brw_winsys { | |||
struct brw_winsys winsys; /**< batch buffer funcs */ | |||
struct aub_context *aub; | |||
struct pipe_winsys *pipe_winsys; | |||
unsigned batch_data[IWS_BATCHBUFFER_SIZE]; | |||
unsigned batch_nr; | |||
unsigned batch_size; | |||
unsigned batch_alloc; | |||
}; | |||
/* Turn a i965simple winsys into an aub/i965simple winsys: | |||
*/ | |||
static inline struct aub_brw_winsys * | |||
aub_brw_winsys( struct brw_winsys *sws ) | |||
struct pipe_screen * | |||
xlib_create_brw_screen( struct pipe_winsys *winsys ) | |||
{ | |||
return (struct aub_brw_winsys *)sws; | |||
return brw_create_screen(winsys, 0/* XXX pci_id */); | |||
} | |||
/* Simple batchbuffer interface: | |||
/* These per-screen functions are acually made available to the driver | |||
* through the brw_winsys (per-context) entity. | |||
*/ | |||
static unsigned *aub_i965_batch_start( struct brw_winsys *sws, | |||
unsigned dwords, | |||
unsigned relocs ) | |||
{ | |||
struct aub_brw_winsys *iws = aub_brw_winsys(sws); | |||
if (iws->batch_size < iws->batch_nr + dwords) | |||
return NULL; | |||
iws->batch_alloc = iws->batch_nr + dwords; | |||
return (void *)1; /* not a valid pointer! */ | |||
} | |||
static void aub_i965_batch_dword( struct brw_winsys *sws, | |||
unsigned dword ) | |||
{ | |||
struct aub_brw_winsys *iws = aub_brw_winsys(sws); | |||
assert(iws->batch_nr < iws->batch_alloc); | |||
iws->batch_data[iws->batch_nr++] = dword; | |||
} | |||
static void aub_i965_batch_reloc( struct brw_winsys *sws, | |||
struct pipe_buffer *buf, | |||
unsigned access_flags, | |||
unsigned delta ) | |||
{ | |||
struct aub_brw_winsys *iws = aub_brw_winsys(sws); | |||
assert(iws->batch_nr < iws->batch_alloc); | |||
iws->batch_data[iws->batch_nr++] = aub_bo(buf)->offset + delta; | |||
} | |||
static unsigned aub_i965_get_buffer_offset( struct brw_winsys *sws, | |||
struct pipe_buffer *buf, | |||
unsigned access_flags ) | |||
unsigned xlib_brw_get_buffer_offset( struct pipe_winsys *pws, | |||
struct pipe_buffer *buf, | |||
unsigned access_flags ) | |||
{ | |||
return aub_bo(buf)->offset; | |||
} | |||
static void aub_i965_batch_end( struct brw_winsys *sws ) | |||
{ | |||
struct aub_brw_winsys *iws = aub_brw_winsys(sws); | |||
assert(iws->batch_nr <= iws->batch_alloc); | |||
iws->batch_alloc = 0; | |||
} | |||
static void aub_i965_batch_flush( struct brw_winsys *sws, | |||
struct pipe_fence_handle **fence ) | |||
void xlib_brw_buffer_subdata_typed( struct pipe_winsys *pws, | |||
struct pipe_buffer *buf, | |||
unsigned long offset, | |||
unsigned long size, | |||
const void *data, | |||
unsigned data_type ) | |||
{ | |||
struct aub_brw_winsys *iws = aub_brw_winsys(sws); | |||
assert(iws->batch_nr <= iws->batch_size); | |||
if (iws->batch_nr) { | |||
xmesa_commands_aub( iws->pipe_winsys, | |||
iws->batch_data, | |||
iws->batch_nr ); | |||
} | |||
iws->batch_nr = 0; | |||
} | |||
static void aub_i965_buffer_subdata_typed(struct brw_winsys *winsys, | |||
struct pipe_buffer *buf, | |||
unsigned long offset, | |||
unsigned long size, | |||
const void *data, | |||
unsigned data_type) | |||
{ | |||
struct aub_brw_winsys *iws = aub_brw_winsys(winsys); | |||
unsigned aub_type = DW_GENERAL_STATE; | |||
unsigned aub_sub_type; | |||
@@ -545,46 +443,28 @@ static void aub_i965_buffer_subdata_typed(struct brw_winsys *winsys, | |||
break; | |||
} | |||
xmesa_buffer_subdata_aub( iws->pipe_winsys, | |||
buf, | |||
offset, | |||
size, | |||
data, | |||
aub_type, | |||
aub_sub_type ); | |||
} | |||
/** | |||
* Create i965 hardware rendering context. | |||
*/ | |||
struct pipe_context * | |||
xmesa_create_i965simple( struct pipe_winsys *winsys ) | |||
{ | |||
#ifdef GALLIUM_CELL | |||
return NULL; | |||
#else | |||
struct aub_brw_winsys *iws = CALLOC_STRUCT( aub_brw_winsys ); | |||
struct pipe_screen *screen = brw_create_screen(winsys, 0/* XXX pci_id */); | |||
/* Fill in this struct with callbacks that i965simple will need to | |||
* communicate with the window system, buffer manager, etc. | |||
*/ | |||
iws->winsys.batch_start = aub_i965_batch_start; | |||
iws->winsys.batch_dword = aub_i965_batch_dword; | |||
iws->winsys.batch_reloc = aub_i965_batch_reloc; | |||
iws->winsys.batch_end = aub_i965_batch_end; | |||
iws->winsys.batch_flush = aub_i965_batch_flush; | |||
iws->winsys.buffer_subdata_typed = aub_i965_buffer_subdata_typed; | |||
iws->winsys.get_buffer_offset = aub_i965_get_buffer_offset; | |||
{ | |||
struct aub_pipe_winsys *iws = aub_pipe_winsys(pws); | |||
struct aub_buffer *sbo = aub_bo(buf); | |||
iws->pipe_winsys = winsys; | |||
assert(sbo->size > offset + size); | |||
memcpy(sbo->data + offset, data, size); | |||
iws->batch_size = IWS_BATCHBUFFER_SIZE; | |||
brw_aub_gtt_data( iws->aubfile, | |||
sbo->offset + offset, | |||
sbo->data + offset, | |||
size, | |||
aub_type, | |||
aub_sub_type ); | |||
} | |||
} | |||
/* Create the i965simple context: | |||
*/ | |||
return brw_create( screen, | |||
&iws->winsys, | |||
0 ); | |||
#endif | |||
void | |||
xlib_brw_display_surface(struct xmesa_buffer *b, | |||
struct pipe_surface *surf) | |||
{ | |||
brw_aub_dump_bmp( global_winsys->aubfile, | |||
surf, | |||
aub_bo(surf->buffer)->offset ); | |||
} |
@@ -55,13 +55,7 @@ | |||
#define TILE_SIZE 32 /* avoid compilation errors */ | |||
#endif | |||
#ifdef GALLIUM_TRACE | |||
#include "trace/tr_screen.h" | |||
#include "trace/tr_context.h" | |||
#endif | |||
#include "xm_winsys_aub.h" | |||
#include "xlib_softpipe.h" | |||
/** | |||
* Subclass of pipe_buffer for Xlib winsys. | |||
@@ -76,7 +70,7 @@ struct xm_buffer | |||
XImage *tempImage; | |||
int shm; | |||
#if defined(USE_XSHM) && !defined(XFree86Server) | |||
#if defined(USE_XSHM) | |||
XShmSegmentInfo shminfo; | |||
#endif | |||
}; | |||
@@ -88,7 +82,7 @@ struct xm_buffer | |||
struct xmesa_pipe_winsys | |||
{ | |||
struct pipe_winsys base; | |||
struct xmesa_visual *xm_visual; | |||
/* struct xmesa_visual *xm_visual; */ | |||
int shm; | |||
}; | |||
@@ -105,7 +99,7 @@ xm_buffer( struct pipe_buffer *buf ) | |||
/** | |||
* X Shared Memory Image extension code | |||
*/ | |||
#if defined(USE_XSHM) && !defined(XFree86Server) | |||
#if defined(USE_XSHM) | |||
#define XSHM_ENABLED(b) ((b)->shm) | |||
@@ -252,7 +246,7 @@ xm_buffer_destroy(struct pipe_winsys *pws, | |||
struct xm_buffer *oldBuf = xm_buffer(buf); | |||
if (oldBuf->data) { | |||
#if defined(USE_XSHM) && !defined(XFree86Server) | |||
#if defined(USE_XSHM) | |||
if (oldBuf->shminfo.shmid >= 0) { | |||
shmdt(oldBuf->shminfo.shmaddr); | |||
shmctl(oldBuf->shminfo.shmid, IPC_RMID, 0); | |||
@@ -310,8 +304,8 @@ twiddle_tile(const uint *tileIn, uint *tileOut) | |||
* Display a surface that's in a tiled configuration. That is, all the | |||
* pixels for a TILE_SIZExTILE_SIZE block are contiguous in memory. | |||
*/ | |||
static void | |||
xmesa_display_surface_tiled(XMesaBuffer b, const struct pipe_surface *surf) | |||
void | |||
xlib_cell_display_surface(struct xmesa_buffer *b, struct pipe_surface *surf) | |||
{ | |||
XImage *ximage; | |||
struct xm_buffer *xm_buf = xm_buffer(surf->buffer); | |||
@@ -359,7 +353,7 @@ xmesa_display_surface_tiled(XMesaBuffer b, const struct pipe_surface *surf) | |||
/* twiddle from temp to ximage in shared memory */ | |||
twiddle_tile(tmpTile, (uint *) ximage->data); | |||
/* display image in shared memory */ | |||
#if defined(USE_XSHM) && !defined(XFree86Server) | |||
#if defined(USE_XSHM) | |||
XShmPutImage(b->xm_visual->display, b->drawable, b->gc, | |||
ximage, 0, 0, x, y, w, h, False); | |||
#endif | |||
@@ -382,7 +376,8 @@ xmesa_display_surface_tiled(XMesaBuffer b, const struct pipe_surface *surf) | |||
* by the XMesaBuffer. | |||
*/ | |||
void | |||
xmesa_display_surface(XMesaBuffer b, const struct pipe_surface *surf) | |||
xlib_softpipe_display_surface(struct xmesa_buffer *b, | |||
struct pipe_surface *surf) | |||
{ | |||
XImage *ximage; | |||
struct xm_buffer *xm_buf = xm_buffer(surf->buffer); | |||
@@ -404,7 +399,7 @@ xmesa_display_surface(XMesaBuffer b, const struct pipe_surface *surf) | |||
return; | |||
if (tileSize) { | |||
xmesa_display_surface_tiled(b, surf); | |||
xlib_cell_display_surface(b, surf); | |||
return; | |||
} | |||
@@ -419,7 +414,7 @@ xmesa_display_surface(XMesaBuffer b, const struct pipe_surface *surf) | |||
/* display image in Window */ | |||
if (XSHM_ENABLED(xm_buf)) { | |||
#if defined(USE_XSHM) && !defined(XFree86Server) | |||
#if defined(USE_XSHM) | |||
XShmPutImage(b->xm_visual->display, b->drawable, b->gc, | |||
ximage, 0, 0, 0, 0, surf->width, surf->height, False); | |||
#endif | |||
@@ -449,7 +444,7 @@ xm_flush_frontbuffer(struct pipe_winsys *pws, | |||
* This function copies that XImage to the actual X Window. | |||
*/ | |||
XMesaContext xmctx = (XMesaContext) context_private; | |||
xmesa_display_surface(xmctx->xm_buffer, surf); | |||
xlib_softpipe_display_surface(xmctx->xm_buffer, surf); | |||
} | |||
@@ -468,7 +463,7 @@ xm_buffer_create(struct pipe_winsys *pws, | |||
unsigned size) | |||
{ | |||
struct xm_buffer *buffer = CALLOC_STRUCT(xm_buffer); | |||
#if defined(USE_XSHM) && !defined(XFree86Server) | |||
#if defined(USE_XSHM) | |||
struct xmesa_pipe_winsys *xpws = (struct xmesa_pipe_winsys *) pws; | |||
#endif | |||
@@ -478,7 +473,7 @@ xm_buffer_create(struct pipe_winsys *pws, | |||
buffer->base.size = size; | |||
#if defined(USE_XSHM) && !defined(XFree86Server) | |||
#if defined(USE_XSHM) | |||
buffer->shminfo.shmid = -1; | |||
buffer->shminfo.shmaddr = (char *) -1; | |||
@@ -625,33 +620,16 @@ xm_fence_finish(struct pipe_winsys *sws, struct pipe_fence_handle *fence, | |||
} | |||
/** | |||
* Return pointer to a pipe_winsys object. | |||
* For Xlib, this is a singleton object. | |||
* Nothing special for the Xlib driver so no subclassing or anything. | |||
*/ | |||
struct pipe_winsys * | |||
xmesa_get_pipe_winsys_aub(struct xmesa_visual *xm_vis) | |||
{ | |||
static struct xmesa_pipe_winsys *ws = NULL; | |||
if (!ws) { | |||
ws = (struct xmesa_pipe_winsys *) xmesa_create_pipe_winsys_aub(); | |||
} | |||
return &ws->base; | |||
} | |||
static struct pipe_winsys * | |||
xmesa_get_pipe_winsys(struct xmesa_visual *xm_vis) | |||
struct pipe_winsys * | |||
xlib_create_softpipe_winsys( void ) | |||
{ | |||
static struct xmesa_pipe_winsys *ws = NULL; | |||
if (!ws) { | |||
ws = CALLOC_STRUCT(xmesa_pipe_winsys); | |||
ws->xm_visual = xm_vis; | |||
ws->shm = xmesa_check_for_xshm(xm_vis->display); | |||
//ws->shm = xmesa_check_for_xshm( display ); | |||
/* Fill in this struct with callbacks that pipe will need to | |||
* communicate with the window system, buffer manager, etc. | |||
@@ -678,42 +656,89 @@ xmesa_get_pipe_winsys(struct xmesa_visual *xm_vis) | |||
} | |||
struct pipe_screen * | |||
xlib_create_softpipe_screen( struct pipe_winsys *pws ) | |||
{ | |||
struct pipe_screen *screen; | |||
screen = softpipe_create_screen(pws); | |||
if (screen == NULL) | |||
goto fail; | |||
return screen; | |||
fail: | |||
return NULL; | |||
} | |||
struct pipe_context * | |||
xmesa_create_pipe_context(XMesaContext xmesa, uint pixelformat) | |||
xlib_create_softpipe_context( struct pipe_screen *screen, | |||
void *context_private ) | |||
{ | |||
struct pipe_winsys *pws; | |||
struct pipe_context *pipe; | |||
if (getenv("XM_AUB")) { | |||
pws = xmesa_get_pipe_winsys_aub(xmesa->xm_visual); | |||
} | |||
else { | |||
pws = xmesa_get_pipe_winsys(xmesa->xm_visual); | |||
} | |||
pipe = softpipe_create(screen, screen->winsys, NULL); | |||
if (pipe == NULL) | |||
goto fail; | |||
#ifdef GALLIUM_CELL | |||
if (!getenv("GALLIUM_NOCELL")) { | |||
struct cell_winsys *cws = cell_get_winsys(pixelformat); | |||
struct pipe_screen *screen = cell_create_screen(pws); | |||
pipe->priv = context_private; | |||
return pipe; | |||
pipe = cell_create_context(screen, cws); | |||
} | |||
else | |||
#endif | |||
{ | |||
struct pipe_screen *screen = softpipe_create_screen(pws); | |||
fail: | |||
/* Free stuff here */ | |||
return NULL; | |||
} | |||
pipe = softpipe_create(screen, pws, NULL); | |||
#ifdef GALLIUM_TRACE | |||
screen = trace_screen_create(screen); | |||
pipe = trace_context_create(screen, pipe); | |||
#endif | |||
} | |||
/*********************************************************************** | |||
* Cell piggybacks on softpipe code still. | |||
* | |||
* Should be untangled sufficiently to live in a separate file, at | |||
* least. That would mean removing #ifdef GALLIUM_CELL's from above | |||
* and creating cell-specific versions of either those functions or | |||
* the entire file. | |||
*/ | |||
struct pipe_winsys * | |||
xlib_create_cell_winsys( void ) | |||
{ | |||
return xlib_create_softpipe_winsys(); | |||
} | |||
struct pipe_screen * | |||
xlib_create_cell_screen( struct pipe_winsys *pws ) | |||
{ | |||
return xlib_create_softpipe_screen( pws ); | |||
} | |||
struct pipe_context * | |||
xlib_create_cell_context( struct pipe_screen *screen, | |||
void *priv ) | |||
{ | |||
#ifdef GALLIUM_CELL | |||
struct cell_winsys *cws; | |||
struct pipe_context *pipe; | |||
if (pipe) | |||
pipe->priv = xmesa; | |||
if (getenv("GALLIUM_NOCELL")) | |||
return xlib_create_softpipe_context( screen, priv ); | |||
/* This takes a cell_winsys pointer, but probably that should be | |||
* created and stored at screen creation, not context creation. | |||
* | |||
* The actual cell_winsys value isn't used for anything, so just | |||
* passing NULL for now. | |||
*/ | |||
pipe = cell_create_context( screen, NULL); | |||
if (pipe == NULL) | |||
goto fail; | |||
pipe->priv = priv; | |||
return pipe; | |||
fail: | |||
#endif | |||
return NULL; | |||
} |
@@ -0,0 +1,50 @@ | |||
#ifndef XLIB_SOFTPIPE_H | |||
#define XLIB_SOFTPIPE_H | |||
struct pipe_winsys; | |||
struct pipe_screen; | |||
struct pipe_context; | |||
struct pipe_surface; | |||
struct xmesa_buffer; | |||
struct pipe_winsys * | |||
xlib_create_softpipe_winsys( void ); | |||
struct pipe_screen * | |||
xlib_create_softpipe_screen( struct pipe_winsys *pws ); | |||
struct pipe_context * | |||
xlib_create_softpipe_context( struct pipe_screen *screen, | |||
void *context_priv ); | |||
void | |||
xlib_softpipe_display_surface( struct xmesa_buffer *, | |||
struct pipe_surface * ); | |||
/*********************************************************************** | |||
* Cell piggybacks on softpipe code still. | |||
* | |||
* Should be untangled sufficiently to live in a separate file, at | |||
* least. That would mean removing #ifdef GALLIUM_CELL's from above | |||
* and creating cell-specific versions of either those functions or | |||
* the entire file. | |||
*/ | |||
struct pipe_winsys * | |||
xlib_create_cell_winsys( void ); | |||
struct pipe_screen * | |||
xlib_create_cell_screen( struct pipe_winsys *pws ); | |||
struct pipe_context * | |||
xlib_create_cell_context( struct pipe_screen *screen, | |||
void *priv ); | |||
void | |||
xlib_cell_display_surface( struct xmesa_buffer *, | |||
struct pipe_surface * ); | |||
#endif |
@@ -0,0 +1,102 @@ | |||
/************************************************************************** | |||
* | |||
* Copyright 2007 Tungsten Graphics, Inc., Bismarck, ND., USA | |||
* 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 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 | |||
* THE COPYRIGHT HOLDERS, AUTHORS 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. | |||
* | |||
* The above copyright notice and this permission notice (including the | |||
* next paragraph) shall be included in all copies or substantial portions | |||
* of the Software. | |||
* | |||
* | |||
**************************************************************************/ | |||
/* | |||
* Authors: | |||
* Keith Whitwell | |||
* Brian Paul | |||
*/ | |||
#include "xlib_softpipe.h" | |||
#include "xlib_trace.h" | |||
#include "trace/tr_screen.h" | |||
#include "trace/tr_context.h" | |||
struct pipe_winsys * | |||
xlib_create_trace_winsys( void ) | |||
{ | |||
return xlib_create_softpipe_winsys(); | |||
} | |||
struct pipe_screen * | |||
xlib_create_trace_screen( struct pipe_winsys *winsys ) | |||
{ | |||
struct pipe_screen *screen, *trace_screen; | |||
screen = xlib_create_softpipe_screen( winsys ); | |||
if (screen == NULL) | |||
goto fail; | |||
/* Wrap it: | |||
*/ | |||
trace_screen = trace_screen_create(screen); | |||
if (trace_screen == NULL) | |||
goto fail; | |||
return trace_screen; | |||
fail: | |||
/* free stuff */ | |||
return NULL; | |||
} | |||
struct pipe_context * | |||
xlib_create_trace_context( struct pipe_screen *screen, | |||
void *priv ) | |||
{ | |||
struct pipe_context *pipe, *trace_pipe; | |||
pipe = xlib_create_softpipe_context( screen, priv ); | |||
if (pipe == NULL) | |||
goto fail; | |||
/* Wrap it: | |||
*/ | |||
trace_pipe = trace_context_create(screen, pipe); | |||
if (trace_pipe == NULL) | |||
goto fail; | |||
trace_pipe->priv = priv; | |||
return trace_pipe; | |||
fail: | |||
return NULL; | |||
} | |||
void | |||
xlib_trace_display_surface( struct xmesa_buffer *buffer, | |||
struct pipe_surface *surf ) | |||
{ | |||
/* ?? | |||
*/ | |||
xlib_softpipe_display_surface( buffer, surf ); | |||
} |
@@ -0,0 +1,26 @@ | |||
#ifndef XLIB_TRACE_H | |||
#define XLIB_TRACE_H | |||
struct pipe_winsys; | |||
struct pipe_screen; | |||
struct pipe_context; | |||
struct pipe_surface; | |||
struct xmesa_buffer; | |||
struct pipe_winsys * | |||
xlib_create_trace_winsys( void ); | |||
struct pipe_screen * | |||
xlib_create_trace_screen( struct pipe_winsys *winsys ); | |||
struct pipe_context * | |||
xlib_create_trace_context( struct pipe_screen *screen, | |||
void *priv ); | |||
void | |||
xlib_trace_display_surface( struct xmesa_buffer *buffer, | |||
struct pipe_surface *surf ); | |||
#endif |