mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-24 13:10:10 +01:00
gallium: split driver-independent code out of xlib winsys
Place in new xlib state-tracker. This is a statetracker for the GLX API.
This commit is contained in:
parent
53ce80e7cc
commit
002dfb12fc
30 changed files with 875 additions and 361 deletions
|
|
@ -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;
|
||||
}
|
||||
18
src/gallium/drivers/trace/Makefile
Normal file
18
src/gallium/drivers/trace/Makefile
Normal file
|
|
@ -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:
|
||||
|
||||
25
src/gallium/state_trackers/Makefile
Normal file
25
src/gallium/state_trackers/Makefile
Normal file
|
|
@ -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:
|
||||
25
src/gallium/state_trackers/xlib/Makefile
Normal file
25
src/gallium/state_trackers/xlib/Makefile
Normal file
|
|
@ -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 xmesa_buffer;
|
||||
|
||||
|
||||
/* 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 );
|
||||
|
||||
struct pipe_context *
|
||||
xmesa_create_i965simple( struct pipe_winsys *winsys );
|
||||
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_surface( struct xmesa_buffer *,
|
||||
struct pipe_surface * );
|
||||
|
||||
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);
|
||||
|
||||
void xmesa_commands_aub(struct pipe_winsys *winsys,
|
||||
unsigned *cmds,
|
||||
unsigned nr_dwords);
|
||||
|
||||
|
||||
void xmesa_display_aub( /* struct pipe_winsys *winsys, */
|
||||
struct pipe_surface *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)
|
||||
|
||||
|
||||
|
|
|
|||
165
src/gallium/winsys/xlib/xlib.c
Normal file
165
src/gallium/winsys/xlib/xlib.c
Normal file
|
|
@ -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);
|
||||
}
|
||||
40
src/gallium/winsys/xlib/xlib_brw.h
Normal file
40
src/gallium/winsys/xlib/xlib_brw.h
Normal file
|
|
@ -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"
|
||||
205
src/gallium/winsys/xlib/xlib_brw_context.c
Normal file
205
src/gallium/winsys/xlib/xlib_brw_context.c
Normal file
|
|
@ -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 pipe_screen *
|
||||
xlib_create_brw_screen( struct pipe_winsys *winsys )
|
||||
{
|
||||
struct aub_pipe_winsys *iws = aub_pipe_winsys(winsys);
|
||||
brw_aub_destroy(iws->aubfile);
|
||||
free(iws->pool);
|
||||
free(iws);
|
||||
return brw_create_screen(winsys, 0/* XXX pci_id */);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#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:
|
||||
/* These per-screen functions are acually made available to the driver
|
||||
* through the brw_winsys (per-context) entity.
|
||||
*/
|
||||
static inline struct aub_brw_winsys *
|
||||
aub_brw_winsys( struct brw_winsys *sws )
|
||||
{
|
||||
return (struct aub_brw_winsys *)sws;
|
||||
}
|
||||
|
||||
|
||||
/* Simple batchbuffer interface:
|
||||
*/
|
||||
|
||||
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 )
|
||||
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_alloc);
|
||||
iws->batch_alloc = 0;
|
||||
}
|
||||
|
||||
static void aub_i965_batch_flush( struct brw_winsys *sws,
|
||||
struct pipe_fence_handle **fence )
|
||||
{
|
||||
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 );
|
||||
{
|
||||
struct aub_pipe_winsys *iws = aub_pipe_winsys(pws);
|
||||
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 );
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Create i965 hardware rendering context.
|
||||
*/
|
||||
struct pipe_context *
|
||||
xmesa_create_i965simple( struct pipe_winsys *winsys )
|
||||
|
||||
|
||||
void
|
||||
xlib_brw_display_surface(struct xmesa_buffer *b,
|
||||
struct pipe_surface *surf)
|
||||
{
|
||||
#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;
|
||||
|
||||
iws->pipe_winsys = winsys;
|
||||
|
||||
iws->batch_size = IWS_BATCHBUFFER_SIZE;
|
||||
|
||||
/* Create the i965simple context:
|
||||
*/
|
||||
return brw_create( screen,
|
||||
&iws->winsys,
|
||||
0 );
|
||||
#endif
|
||||
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)
|
||||
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_context *
|
||||
xmesa_create_pipe_context(XMesaContext xmesa, uint pixelformat)
|
||||
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 *
|
||||
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;
|
||||
|
||||
pipe->priv = context_private;
|
||||
return pipe;
|
||||
|
||||
fail:
|
||||
/* Free stuff here */
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
/***********************************************************************
|
||||
* 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
|
||||
if (!getenv("GALLIUM_NOCELL")) {
|
||||
struct cell_winsys *cws = cell_get_winsys(pixelformat);
|
||||
struct pipe_screen *screen = cell_create_screen(pws);
|
||||
struct cell_winsys *cws;
|
||||
struct pipe_context *pipe;
|
||||
|
||||
pipe = cell_create_context(screen, cws);
|
||||
}
|
||||
else
|
||||
#endif
|
||||
{
|
||||
struct pipe_screen *screen = softpipe_create_screen(pws);
|
||||
if (getenv("GALLIUM_NOCELL"))
|
||||
return xlib_create_softpipe_context( screen, priv );
|
||||
|
||||
pipe = softpipe_create(screen, pws, NULL);
|
||||
|
||||
/* 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;
|
||||
|
||||
#ifdef GALLIUM_TRACE
|
||||
screen = trace_screen_create(screen);
|
||||
|
||||
pipe = trace_context_create(screen, pipe);
|
||||
#endif
|
||||
}
|
||||
|
||||
if (pipe)
|
||||
pipe->priv = xmesa;
|
||||
pipe->priv = priv;
|
||||
|
||||
return pipe;
|
||||
|
||||
fail:
|
||||
#endif
|
||||
return NULL;
|
||||
}
|
||||
50
src/gallium/winsys/xlib/xlib_softpipe.h
Normal file
50
src/gallium/winsys/xlib/xlib_softpipe.h
Normal file
|
|
@ -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
|
||||
102
src/gallium/winsys/xlib/xlib_trace.c
Normal file
102
src/gallium/winsys/xlib/xlib_trace.c
Normal file
|
|
@ -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 );
|
||||
}
|
||||
26
src/gallium/winsys/xlib/xlib_trace.h
Normal file
26
src/gallium/winsys/xlib/xlib_trace.h
Normal file
|
|
@ -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
|
||||
Loading…
Add table
Reference in a new issue