diff options
-rw-r--r-- | src/mesa/Makefile | 4 | ||||
-rw-r--r-- | src/mesa/drivers/dri/intel_winsys/Makefile | 3 | ||||
-rw-r--r-- | src/mesa/drivers/dri/intel_winsys/intel_context.c | 45 | ||||
-rw-r--r-- | src/mesa/drivers/dri/intel_winsys/intel_context.h | 8 | ||||
-rw-r--r-- | src/mesa/drivers/dri/intel_winsys/intel_pipe.h | 42 | ||||
-rw-r--r-- | src/mesa/drivers/dri/intel_winsys/intel_pipe_i915simple.c | 248 | ||||
-rw-r--r-- | src/mesa/drivers/dri/intel_winsys/intel_pipe_softpipe.c (renamed from src/mesa/drivers/dri/intel_winsys/intel_softpipe.c) | 0 | ||||
-rw-r--r-- | src/mesa/pipe/Makefile | 2 | ||||
-rw-r--r-- | src/mesa/pipe/i915simple/i915_buffer.c | 6 | ||||
-rw-r--r-- | src/mesa/pipe/i915simple/i915_regions.c | 2 | ||||
-rw-r--r-- | src/mesa/pipe/i915simple/i915_state.c | 5 | ||||
-rw-r--r-- | src/mesa/pipe/i915simple/i915_state_emit.c | 4 | ||||
-rw-r--r-- | src/mesa/pipe/i915simple/i915_winsys.h | 15 |
13 files changed, 337 insertions, 47 deletions
diff --git a/src/mesa/Makefile b/src/mesa/Makefile index 7d4bd22203d..9dde96ee21f 100644 --- a/src/mesa/Makefile +++ b/src/mesa/Makefile @@ -150,7 +150,7 @@ depend: $(ALL_SOURCES) subdirs: @ (cd x86 ; $(MAKE)) @ (cd x86-64 ; $(MAKE)) - (cd pipe/softpipe ; $(MAKE)) + (cd pipe ; $(MAKE)) install: default $(INSTALL) -d $(INSTALL_DIR)/include/GL @@ -183,7 +183,7 @@ clean: (cd drivers/dri && $(MAKE) clean) (cd x86 && $(MAKE) clean) (cd x86-64 && $(MAKE) clean) - (cd pipe/softpipe ; $(MAKE) clean ) + (cd pipe ; $(MAKE) clean ) include depend diff --git a/src/mesa/drivers/dri/intel_winsys/Makefile b/src/mesa/drivers/dri/intel_winsys/Makefile index e4e9cf17b09..c9dc15e088d 100644 --- a/src/mesa/drivers/dri/intel_winsys/Makefile +++ b/src/mesa/drivers/dri/intel_winsys/Makefile @@ -10,7 +10,8 @@ PIPE_DRIVERS = \ $(TOP)/src/mesa/pipe/softpipe/libsoftpipe.a DRIVER_SOURCES = \ - intel_softpipe.c \ + intel_pipe_i915simple.c \ + intel_pipe_softpipe.c \ intel_batchbuffer.c \ intel_tex_layout.c \ intel_buffers.c \ diff --git a/src/mesa/drivers/dri/intel_winsys/intel_context.c b/src/mesa/drivers/dri/intel_winsys/intel_context.c index e6f0d4a0fa9..d748c08f3cb 100644 --- a/src/mesa/drivers/dri/intel_winsys/intel_context.c +++ b/src/mesa/drivers/dri/intel_winsys/intel_context.c @@ -47,13 +47,10 @@ #include "i830_dri.h" #include "intel_buffers.h" -/*#include "intel_tex.h"*/ +#include "intel_pipe.h" #include "intel_ioctl.h" #include "intel_batchbuffer.h" #include "intel_blit.h" -/* -#include "intel_buffer_objects.h" -*/ #include "intel_fbo.h" #include "intel_tex_layout.h" @@ -375,20 +372,34 @@ intelCreateContext(const __GLcontextModes * mesaVis, /* * Pipe-related setup */ - st_create_context( &intel->ctx, - intel_create_softpipe( intel ) ); - - /* KW: Not sure I like this - we should only be talking to the - * state_tracker. The pipe code will need some way of talking to - * us, eg for batchbuffer ioctls, and there will need to be a - * buffer manager interface. So, this is a temporary hack, right? - * BP: Yes, a temporary hack so we can make jumps between old/new code. - */ - intel->pipe = intel->ctx.st->pipe; -// intel->pipe->screen = intelScreen; -// intel->pipe->glctx = ctx; -// intel_init_region_functions(intel->pipe); + if (getenv("INTEL_SOFTPIPE")) { + intel->pipe = intel_create_softpipe( intel ); + } + else { + switch (intel->intelScreen->deviceID) { + case PCI_CHIP_I945_G: + case PCI_CHIP_I945_GM: + case PCI_CHIP_I945_GME: + case PCI_CHIP_G33_G: + case PCI_CHIP_Q33_G: + case PCI_CHIP_Q35_G: + case PCI_CHIP_I915_G: + case PCI_CHIP_I915_GM: + intel->pipe = intel_create_i915simple( intel ); + default: + _mesa_printf("Unknown PCIID %x in %s, using software driver\n", + intel->intelScreen->deviceID, __FUNCTION__); + intel->pipe = intel_create_softpipe( intel ); + break; + } + } + + st_create_context( &intel->ctx, intel->pipe ); + + + /* TODO: Push this down into the pipe driver: + */ switch (intel->intelScreen->deviceID) { case PCI_CHIP_I945_G: case PCI_CHIP_I945_GM: diff --git a/src/mesa/drivers/dri/intel_winsys/intel_context.h b/src/mesa/drivers/dri/intel_winsys/intel_context.h index 1a4e7ca1cd4..727f3b74745 100644 --- a/src/mesa/drivers/dri/intel_winsys/intel_context.h +++ b/src/mesa/drivers/dri/intel_winsys/intel_context.h @@ -194,14 +194,6 @@ extern void intelFinish(GLcontext * ctx); extern void intelFlush(GLcontext * ctx); -/* ================================================================ - * intel_softpipe.c: - */ - -struct pipe_context * -intel_create_softpipe( struct intel_context *intel ); - - #define MI_BATCH_BUFFER_END (0xA<<23) #define FALLBACK( ctx, bit, mode ) diff --git a/src/mesa/drivers/dri/intel_winsys/intel_pipe.h b/src/mesa/drivers/dri/intel_winsys/intel_pipe.h new file mode 100644 index 00000000000..5d3e25aea2a --- /dev/null +++ b/src/mesa/drivers/dri/intel_winsys/intel_pipe.h @@ -0,0 +1,42 @@ +/************************************************************************** + * + * Copyright 2006 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. + * + **************************************************************************/ + +#ifndef INTEL_PIPE_H +#define INTEL_PIPE_H + +struct intel_context; +struct pipe_context; + + +struct pipe_context * +intel_create_softpipe( struct intel_context *intel ); + +struct pipe_context * +intel_create_i915simple( struct intel_context *intel ); + + +#endif diff --git a/src/mesa/drivers/dri/intel_winsys/intel_pipe_i915simple.c b/src/mesa/drivers/dri/intel_winsys/intel_pipe_i915simple.c new file mode 100644 index 00000000000..b456550a8cd --- /dev/null +++ b/src/mesa/drivers/dri/intel_winsys/intel_pipe_i915simple.c @@ -0,0 +1,248 @@ +/************************************************************************** + * + * Copyright 2006 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 <keithw-at-tungstengraphics-dot-com> + */ + +#include <stdlib.h> +#include <xf86drm.h> +#include "dri_bufpool.h" +#include "dri_bufmgr.h" + +#include "intel_context.h" +#include "intel_batchbuffer.h" +#include "intel_pipe.h" + +#include "pipe/i915simple/i915_winsys.h" + + +struct intel_i915_winsys { + struct i915_winsys winsys; + struct intel_context *intel; +}; + + +/* Turn a i915simple winsys into an intel/i915simple winsys: + */ +static inline struct intel_i915_winsys * +intel_i915_winsys( struct i915_winsys *sws ) +{ + return (struct intel_i915_winsys *)sws; +} + + + +/* Many of the winsys's are probably going to have a similar + * buffer-manager interface, as something almost identical is + * currently exposed in the pipe interface. Probably want to avoid + * endless repetition of this code somehow. + */ +static inline struct _DriBufferObject * +dri_bo( struct pipe_buffer_handle *bo ) +{ + return (struct _DriBufferObject *)bo; +} + +static inline struct pipe_buffer_handle * +pipe_bo( struct _DriBufferObject *bo ) +{ + return (struct pipe_buffer_handle *)bo; +} + + +/* Most callbacks map direcly onto dri_bufmgr operations: + */ +static void *intel_i915_buffer_map(struct i915_winsys *sws, + struct pipe_buffer_handle *buf ) +{ + return driBOMap( dri_bo(buf), + DRM_BO_FLAG_READ | DRM_BO_FLAG_WRITE, 0 ); +} + +static void intel_i915_buffer_unmap(struct i915_winsys *sws, + struct pipe_buffer_handle *buf) +{ + driBOUnmap( dri_bo(buf) ); +} + + +static struct pipe_buffer_handle * +intel_i915_buffer_reference(struct i915_winsys *sws, + struct pipe_buffer_handle *buf) +{ + return pipe_bo( driBOReference( dri_bo(buf) ) ); +} + +static void intel_i915_buffer_unreference(struct i915_winsys *sws, + struct pipe_buffer_handle **buf) +{ + if (*buf) { + driBOUnReference( dri_bo(*buf) ); + *buf = NULL; + } +} + +/* Grabs the hardware lock! + */ +static void intel_i915_buffer_data(struct i915_winsys *sws, + struct pipe_buffer_handle *buf, + unsigned size, const void *data ) +{ + struct intel_context *intel = intel_i915_winsys(sws)->intel; + + LOCK_HARDWARE( intel ); + driBOData( dri_bo(buf), size, data, 0 ); + UNLOCK_HARDWARE( intel ); +} + +static void intel_i915_buffer_subdata(struct i915_winsys *sws, + struct pipe_buffer_handle *buf, + unsigned long offset, + unsigned long size, + const void *data) +{ + driBOSubData( dri_bo(buf), offset, size, data ); +} + +static void intel_i915_buffer_get_subdata(struct i915_winsys *sws, + struct pipe_buffer_handle *buf, + unsigned long offset, + unsigned long size, + void *data) +{ + driBOGetSubData( dri_bo(buf), offset, size, data ); +} + +/* I915simple has no concept of pools. We choose the tex/region pool + * for all buffers. + */ +static struct pipe_buffer_handle * +intel_i915_buffer_create(struct i915_winsys *sws, + unsigned alignment) +{ + struct intel_context *intel = intel_i915_winsys(sws)->intel; + struct _DriBufferObject *buffer; + + LOCK_HARDWARE( intel ); + driGenBuffers( intel->intelScreen->regionPool, + "i915simple buffer", 1, &buffer, alignment, 0, 0 ); + UNLOCK_HARDWARE( intel ); + + return pipe_bo(buffer); +} + + +/* Simple batchbuffer interface: + */ + +static unsigned *intel_i915_batch_start( struct i915_winsys *sws, + unsigned dwords, + unsigned relocs ) +{ + struct intel_context *intel = intel_i915_winsys(sws)->intel; + + /* XXX: check relocs. + */ + if (intel_batchbuffer_space( intel->batch ) < dwords * 4) { + /* XXX: Hmm, the driver can't really do much with this pointer: + */ + //return intel->batch->ptr; + return (unsigned *)~0; + } + else + return NULL; +} + +static void intel_i915_batch_dword( struct i915_winsys *sws, + unsigned dword ) +{ + struct intel_context *intel = intel_i915_winsys(sws)->intel; + intel_batchbuffer_emit_dword( intel->batch, dword ); +} + +static void intel_i915_batch_reloc( struct i915_winsys *sws, + struct pipe_buffer_handle *buf, + unsigned access_flags, + unsigned delta ) +{ + struct intel_context *intel = intel_i915_winsys(sws)->intel; + unsigned flags = 0; + unsigned mask = 0; + + intel_batchbuffer_emit_reloc( intel->batch, + dri_bo( buf ), + flags, mask, + delta ); +} + +static void intel_i915_batch_flush( struct i915_winsys *sws ) +{ + struct intel_context *intel = intel_i915_winsys(sws)->intel; + + intel_batchbuffer_flush( intel->batch ); +} + +static void intel_i915_batch_wait_idle( struct i915_winsys *sws ) +{ + struct intel_context *intel = intel_i915_winsys(sws)->intel; + + if (intel->batch->last_fence) { + driFenceFinish(intel->batch->last_fence, + DRM_FENCE_TYPE_EXE | DRM_I915_FENCE_TYPE_RW, GL_FALSE); + driFenceUnReference(intel->batch->last_fence); + intel->batch->last_fence = NULL; + } +} + +struct pipe_context * +intel_create_i915simple( struct intel_context *intel ) +{ + struct intel_i915_winsys *iws = CALLOC_STRUCT( intel_i915_winsys ); + + /* Fill in this struct with callbacks that i915simple will need to + * communicate with the window system, buffer manager, etc. + */ + iws->winsys.buffer_create = intel_i915_buffer_create; + iws->winsys.buffer_map = intel_i915_buffer_map; + iws->winsys.buffer_unmap = intel_i915_buffer_unmap; + iws->winsys.buffer_reference = intel_i915_buffer_reference; + iws->winsys.buffer_unreference = intel_i915_buffer_unreference; + iws->winsys.buffer_data = intel_i915_buffer_data; + iws->winsys.buffer_subdata = intel_i915_buffer_subdata; + iws->winsys.buffer_get_subdata = intel_i915_buffer_get_subdata; + iws->winsys.batch_start = intel_i915_batch_start; + iws->winsys.batch_dword = intel_i915_batch_dword; + iws->winsys.batch_reloc = intel_i915_batch_reloc; + iws->winsys.batch_flush = intel_i915_batch_flush; + iws->winsys.batch_wait_idle = intel_i915_batch_wait_idle; + iws->intel = intel; + + /* Create the i915simple context: + */ + return i915_create( &iws->winsys ); +} diff --git a/src/mesa/drivers/dri/intel_winsys/intel_softpipe.c b/src/mesa/drivers/dri/intel_winsys/intel_pipe_softpipe.c index ef477443586..ef477443586 100644 --- a/src/mesa/drivers/dri/intel_winsys/intel_softpipe.c +++ b/src/mesa/drivers/dri/intel_winsys/intel_pipe_softpipe.c diff --git a/src/mesa/pipe/Makefile b/src/mesa/pipe/Makefile index ab7e09c9918..f5e884e3a01 100644 --- a/src/mesa/pipe/Makefile +++ b/src/mesa/pipe/Makefile @@ -1,6 +1,6 @@ default: - cd .. ; make cd softpipe ; make + cd i915simple ; make clean: rm -f `find . -name \*.[oa]`
\ No newline at end of file diff --git a/src/mesa/pipe/i915simple/i915_buffer.c b/src/mesa/pipe/i915simple/i915_buffer.c index eaaf3c1bebd..680213182b4 100644 --- a/src/mesa/pipe/i915simple/i915_buffer.c +++ b/src/mesa/pipe/i915simple/i915_buffer.c @@ -40,12 +40,12 @@ * evolve in separate directions... Don't try and remove this yet. */ static struct pipe_buffer_handle * -i915_create_buffer(struct pipe_context *pipe, +i915_buffer_create(struct pipe_context *pipe, unsigned alignment, unsigned flags) { struct i915_context *i915 = i915_context( pipe ); - return i915->winsys->create_buffer( i915->winsys, alignment ); + return i915->winsys->buffer_create( i915->winsys, alignment ); } static void *i915_buffer_map(struct pipe_context *pipe, @@ -110,7 +110,7 @@ static void i915_buffer_get_subdata(struct pipe_context *pipe, void i915_init_buffer_functions( struct i915_context *i915 ) { - i915->pipe.create_buffer = i915_create_buffer; + i915->pipe.create_buffer = i915_buffer_create; i915->pipe.buffer_map = i915_buffer_map; i915->pipe.buffer_unmap = i915_buffer_unmap; i915->pipe.buffer_reference = i915_buffer_reference; diff --git a/src/mesa/pipe/i915simple/i915_regions.c b/src/mesa/pipe/i915simple/i915_regions.c index 52181cf9f47..e2b807f959a 100644 --- a/src/mesa/pipe/i915simple/i915_regions.c +++ b/src/mesa/pipe/i915simple/i915_regions.c @@ -89,7 +89,7 @@ i915_region_alloc(struct pipe_context *pipe, region->height = height; /* needed? */ region->refcount = 1; - region->buffer = i915->winsys->create_buffer( i915->winsys, 64 ); + region->buffer = i915->winsys->buffer_create( i915->winsys, 64 ); i915->winsys->buffer_data( i915->winsys, region->buffer, diff --git a/src/mesa/pipe/i915simple/i915_state.c b/src/mesa/pipe/i915simple/i915_state.c index d732e879db0..ebc55eb6346 100644 --- a/src/mesa/pipe/i915simple/i915_state.c +++ b/src/mesa/pipe/i915simple/i915_state.c @@ -135,12 +135,11 @@ static void i915_set_sampler_state(struct pipe_context *pipe, static void i915_set_texture_state(struct pipe_context *pipe, - GLuint unit, - struct pipe_texture_object *texture) + GLuint unit, + struct pipe_mipmap_tree *texture) { struct i915_context *i915 = i915_context(pipe); - assert(unit < PIPE_MAX_SAMPLERS); i915->texture[unit] = texture; /* ptr, not struct */ i915->dirty |= I915_NEW_TEXTURE; diff --git a/src/mesa/pipe/i915simple/i915_state_emit.c b/src/mesa/pipe/i915simple/i915_state_emit.c index ba8cbdacf37..c0539daa6e3 100644 --- a/src/mesa/pipe/i915simple/i915_state_emit.c +++ b/src/mesa/pipe/i915simple/i915_state_emit.c @@ -189,7 +189,7 @@ i915_emit_hardware_state(struct i915_context *i915 ) OUT_RELOC(cbuf_region->buffer, I915_BUFFER_ACCESS_WRITE, - /*cbuf_region->draw_offset*/0); + 0); } /* What happens if no zbuf?? @@ -207,7 +207,7 @@ i915_emit_hardware_state(struct i915_context *i915 ) OUT_RELOC(depth_region->buffer, I915_BUFFER_ACCESS_WRITE, - /*depth_region->draw_offset*/0); + 0); } diff --git a/src/mesa/pipe/i915simple/i915_winsys.h b/src/mesa/pipe/i915simple/i915_winsys.h index 514c53c7b21..50cb231422d 100644 --- a/src/mesa/pipe/i915simple/i915_winsys.h +++ b/src/mesa/pipe/i915simple/i915_winsys.h @@ -51,16 +51,12 @@ struct pipe_buffer_handle; struct i915_winsys { - /* The buffer manager is modeled after the dri_bugmgr interface, - * but this is the subset that i915 cares about. Remember that - * i915 gets to choose the interface it needs, and the window - * systems must then implement that interface (rather than the - * other way around...). - * - * I915 only really wants to make system memory allocations, - * right?? + /* Many of the winsys's are probably going to have a similar + * buffer-manager interface, as something almost identical is + * currently exposed in the pipe interface. Probably want to avoid + * endless repetition of this code somehow. */ - struct pipe_buffer_handle *(*create_buffer)(struct i915_winsys *sws, + struct pipe_buffer_handle *(*buffer_create)(struct i915_winsys *sws, unsigned alignment ); void *(*buffer_map)( struct i915_winsys *sws, @@ -110,6 +106,7 @@ struct i915_winsys { unsigned access_flags, unsigned delta ); void (*batch_flush)( struct i915_winsys *sws ); + void (*batch_wait_idle)( struct i915_winsys *sws ); /* Printf??? |