diff options
| -rw-r--r-- | src/mesa/drivers/dri/r300/Makefile | 1 | ||||
| -rw-r--r-- | src/mesa/drivers/dri/r300/r300_context.c | 10 | ||||
| -rw-r--r-- | src/mesa/drivers/dri/r300/r300_context.h | 19 | ||||
| -rw-r--r-- | src/mesa/drivers/dri/r300/r300_ioctl.c | 8 | ||||
| -rw-r--r-- | src/mesa/drivers/dri/r300/r300_maos.c | 26 | ||||
| -rw-r--r-- | src/mesa/drivers/dri/r300/r300_render.c | 44 | ||||
| -rw-r--r-- | src/mesa/drivers/dri/r300/r300_state.c | 4 | ||||
| -rw-r--r-- | src/mesa/drivers/dri/r300/radeon_vtxfmt_a.c | 662 | 
8 files changed, 45 insertions, 729 deletions
| diff --git a/src/mesa/drivers/dri/r300/Makefile b/src/mesa/drivers/dri/r300/Makefile index 65a6b03b74..cd05927e5e 100644 --- a/src/mesa/drivers/dri/r300/Makefile +++ b/src/mesa/drivers/dri/r300/Makefile @@ -28,7 +28,6 @@ DRIVER_SOURCES = \  		 radeon_span.c \  		 radeon_state.c \  		 radeon_mm.c \ -		 radeon_vtxfmt_a.c \  		 \  		 r300_context.c \  		 r300_ioctl.c \ diff --git a/src/mesa/drivers/dri/r300/r300_context.c b/src/mesa/drivers/dri/r300/r300_context.c index 4092ebe010..12308af45f 100644 --- a/src/mesa/drivers/dri/r300/r300_context.c +++ b/src/mesa/drivers/dri/r300/r300_context.c @@ -214,11 +214,7 @@ GLboolean r300CreateContext(const __GLcontextModes * glVisual,  #ifdef USER_BUFFERS  	radeon_mm_init(r300);  #endif -#ifdef HW_VBOS -	if (hw_tcl_on) { -		r300InitVBOFuncs(&functions); -	} -#endif +  	if (!radeonInitContext(&r300->radeon, &functions,  			       glVisual, driContextPriv,  			       sharedContextPrivate)) { @@ -367,10 +363,6 @@ GLboolean r300CreateContext(const __GLcontextModes * glVisual,  	r300InitCmdBuf(r300);  	r300InitState(r300); -#ifdef RADEON_VTXFMT_A -	radeon_init_vtxfmt_a(r300); -#endif -  	TNL_CONTEXT(ctx)->Driver.RunPipeline = _tnl_run_pipeline;  	tcl_mode = driQueryOptioni(&r300->radeon.optionCache, "tcl_mode"); diff --git a/src/mesa/drivers/dri/r300/r300_context.h b/src/mesa/drivers/dri/r300/r300_context.h index 31ce210f8d..9bda2409bd 100644 --- a/src/mesa/drivers/dri/r300/r300_context.h +++ b/src/mesa/drivers/dri/r300/r300_context.h @@ -48,13 +48,6 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  #include "radeon_context.h"  #define USER_BUFFERS -/* KW: Disable this code.  Driver should hook into vbo module - * directly, see i965 driver for example. - */ -/* #define RADEON_VTXFMT_A */ -#ifdef RADEON_VTXFMT_A -#define HW_VBOS -#endif  /* We don't handle 16 bits elts swapping yet */  #ifdef MESA_BIG_ENDIAN @@ -911,21 +904,9 @@ extern int r300VertexProgUpdateParams(GLcontext * ctx,  				      float *dst);  extern int r300Fallback(GLcontext * ctx); -extern void radeon_vb_to_rvb(r300ContextPtr rmesa, -			     struct radeon_vertex_buffer *rvb, -			     struct vertex_buffer *vb);  extern GLboolean r300RunRender(GLcontext * ctx,  			       struct tnl_pipeline_stage *stage); -#ifdef RADEON_VTXFMT_A -extern void radeon_init_vtxfmt_a(r300ContextPtr rmesa); -#endif - -#ifdef HW_VBOS -extern void r300InitVBOFuncs(struct dd_function_table *functions); -extern void r300EvictVBOs(GLcontext * ctx, int amount); -#endif -  #define RADEON_D_CAPTURE 0  #define RADEON_D_PLAYBACK 1  #define RADEON_D_PLAYBACK_RAW 2 diff --git a/src/mesa/drivers/dri/r300/r300_ioctl.c b/src/mesa/drivers/dri/r300/r300_ioctl.c index 884a7d49e4..ace9131b33 100644 --- a/src/mesa/drivers/dri/r300/r300_ioctl.c +++ b/src/mesa/drivers/dri/r300/r300_ioctl.c @@ -446,14 +446,6 @@ static void r300RefillCurrentDmaRegion(r300ContextPtr rmesa, int size)  		dmabuf->id = radeon_mm_alloc(rmesa, 4, size); -#ifdef HW_VBOS -		if (dmabuf->id == 0) { -			/* Just kick all */ -			r300EvictVBOs(rmesa->radeon.glCtx, -				      /*RADEON_BUFFER_SIZE*16 */ 1 << 30); -			dmabuf->id = radeon_mm_alloc(rmesa, 4, size); -		} -#endif  		UNLOCK_HARDWARE(&rmesa->radeon);  		if (dmabuf->id == 0) { diff --git a/src/mesa/drivers/dri/r300/r300_maos.c b/src/mesa/drivers/dri/r300/r300_maos.c index 15bb41ddc0..3beeb7b1ab 100644 --- a/src/mesa/drivers/dri/r300/r300_maos.c +++ b/src/mesa/drivers/dri/r300/r300_maos.c @@ -649,32 +649,6 @@ void r300UseArrays(GLcontext * ctx)  		if (rmesa->state.aos[i].buf)  			radeon_mm_use(rmesa, rmesa->state.aos[i].buf->id);  	} - -#ifdef HW_VBOS - -#define USE_VBO(a) \ -    do { \ -	if (ctx->Array.ArrayObj->a.BufferObj->Name \ -	    && ctx->Array.ArrayObj->a.Enabled) \ -	    radeon_mm_use(rmesa, ((struct r300_buffer_object *)ctx->Array.ArrayObj->a.BufferObj)->id); \ -    } while(0) - -	if (ctx->Array.ElementArrayBufferObj->Name -	    && ctx->Array.ElementArrayBufferObj->OnCard) -		radeon_mm_use(rmesa, -			      ((struct r300_buffer_object *)ctx->Array. -			       ElementArrayBufferObj)->id); - -	USE_VBO(Vertex); -	USE_VBO(Normal); -	USE_VBO(Color); -	USE_VBO(SecondaryColor); -	USE_VBO(FogCoord); - -	for (i = 0; i < MAX_TEXTURE_COORD_UNITS; i++) -		USE_VBO(TexCoord[i]); -#endif -  }  #endif diff --git a/src/mesa/drivers/dri/r300/r300_render.c b/src/mesa/drivers/dri/r300/r300_render.c index 8799024745..1dac3142ee 100644 --- a/src/mesa/drivers/dri/r300/r300_render.c +++ b/src/mesa/drivers/dri/r300/r300_render.c @@ -270,6 +270,50 @@ static void r300RunRenderPrimitive(r300ContextPtr rmesa, GLcontext * ctx,  	}  } +#define CONV_VB(a, b) rvb->AttribPtr[(a)].size = vb->b->size, \ +			rvb->AttribPtr[(a)].type = GL_FLOAT, \ +			rvb->AttribPtr[(a)].stride = vb->b->stride, \ +			rvb->AttribPtr[(a)].data = vb->b->data + +static void radeon_vb_to_rvb(r300ContextPtr rmesa, struct radeon_vertex_buffer *rvb, struct vertex_buffer *vb) +{ +	int i; +	GLcontext *ctx; +	ctx = rmesa->radeon.glCtx; +	 +	memset(rvb, 0, sizeof(*rvb)); +	 +	rvb->Elts = vb->Elts; +	rvb->elt_size = 4; +	rvb->elt_min = 0; +	rvb->elt_max = vb->Count; +	 +	rvb->Count = vb->Count; +	 +	if (hw_tcl_on) { +		CONV_VB(VERT_ATTRIB_POS, ObjPtr); +	} else { +		assert(vb->ClipPtr); +		CONV_VB(VERT_ATTRIB_POS, ClipPtr); +	}	 +	 +	CONV_VB(VERT_ATTRIB_NORMAL, NormalPtr); +	CONV_VB(VERT_ATTRIB_COLOR0, ColorPtr[0]); +	CONV_VB(VERT_ATTRIB_COLOR1, SecondaryColorPtr[0]); +	CONV_VB(VERT_ATTRIB_FOG, FogCoordPtr); +	 +	for (i=0; i < ctx->Const.MaxTextureCoordUnits; i++) +		CONV_VB(VERT_ATTRIB_TEX0 + i, TexCoordPtr[i]); + +	for (i=0; i < MAX_VERTEX_PROGRAM_ATTRIBS; i++) +		CONV_VB(VERT_ATTRIB_GENERIC0 + i, AttribPtr[VERT_ATTRIB_GENERIC0 + i]); +	 +	rvb->Primitive = vb->Primitive; +	rvb->PrimitiveCount = vb->PrimitiveCount; +	rvb->LockFirst = rvb->LockCount = 0; +	rvb->lock_uptodate = GL_FALSE; +} +  GLboolean r300RunRender(GLcontext * ctx,  			       struct tnl_pipeline_stage *stage)  { diff --git a/src/mesa/drivers/dri/r300/r300_state.c b/src/mesa/drivers/dri/r300/r300_state.c index af4326ed7e..3b595d98fa 100644 --- a/src/mesa/drivers/dri/r300/r300_state.c +++ b/src/mesa/drivers/dri/r300/r300_state.c @@ -1999,10 +1999,6 @@ static void r300InvalidateState(GLcontext * ctx, GLuint new_state)  	r300UpdateStateParameters(ctx, new_state); -#ifdef HW_VBOS -	if (new_state & _NEW_ARRAY) -		r300->state.VB.lock_uptodate = GL_FALSE; -#endif  	r300->NewGLState |= new_state;  } diff --git a/src/mesa/drivers/dri/r300/radeon_vtxfmt_a.c b/src/mesa/drivers/dri/r300/radeon_vtxfmt_a.c deleted file mode 100644 index f9c4e2db0c..0000000000 --- a/src/mesa/drivers/dri/r300/radeon_vtxfmt_a.c +++ /dev/null @@ -1,662 +0,0 @@ -/* - * Copyright (C) 2005 Aapo Tahkola. - * - * 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, sublicense, 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 NONINFRINGEMENT. - * IN NO EVENT SHALL THE COPYRIGHT OWNER(S) 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. - * - */ -  -/* - * Authors: - *   Aapo Tahkola <aet@rasterburn.org> - */ - -#include "context.h" -#include "r300_context.h" -#include "r300_cmdbuf.h" -#include "r300_ioctl.h" -#include "r300_maos.h" -#include "r300_state.h" -#include "radeon_mm.h" - -#include "hash.h" -#include "dispatch.h" -#include "bufferobj.h" -#include "vtxfmt.h" -#include "api_validate.h" -#include "state.h" -#include "image.h" - -#include "vbo/vbo_context.h" - -#define CONV_VB(a, b) rvb->AttribPtr[(a)].size = vb->b->size, \ -			rvb->AttribPtr[(a)].type = GL_FLOAT, \ -			rvb->AttribPtr[(a)].stride = vb->b->stride, \ -			rvb->AttribPtr[(a)].data = vb->b->data - -void radeon_vb_to_rvb(r300ContextPtr rmesa, struct radeon_vertex_buffer *rvb, struct vertex_buffer *vb) -{ -	int i; -	GLcontext *ctx; -	ctx = rmesa->radeon.glCtx; -	 -	memset(rvb, 0, sizeof(*rvb)); -	 -	rvb->Elts = vb->Elts; -	rvb->elt_size = 4; -	rvb->elt_min = 0; -	rvb->elt_max = vb->Count; -	 -	rvb->Count = vb->Count; -	 -	if (hw_tcl_on) { -		CONV_VB(VERT_ATTRIB_POS, ObjPtr); -	} else { -		assert(vb->ClipPtr); -		CONV_VB(VERT_ATTRIB_POS, ClipPtr); -	}	 -	 -	CONV_VB(VERT_ATTRIB_NORMAL, NormalPtr); -	CONV_VB(VERT_ATTRIB_COLOR0, ColorPtr[0]); -	CONV_VB(VERT_ATTRIB_COLOR1, SecondaryColorPtr[0]); -	CONV_VB(VERT_ATTRIB_FOG, FogCoordPtr); -	 -	for (i=0; i < ctx->Const.MaxTextureCoordUnits; i++) -		CONV_VB(VERT_ATTRIB_TEX0 + i, TexCoordPtr[i]); - -	for (i=0; i < MAX_VERTEX_PROGRAM_ATTRIBS; i++) -		CONV_VB(VERT_ATTRIB_GENERIC0 + i, AttribPtr[VERT_ATTRIB_GENERIC0 + i]); -	 -	rvb->Primitive = vb->Primitive; -	rvb->PrimitiveCount = vb->PrimitiveCount; -	rvb->LockFirst = rvb->LockCount = 0; -	rvb->lock_uptodate = GL_FALSE; -} - -#ifdef RADEON_VTXFMT_A - -extern void _tnl_array_init( GLcontext *ctx ); - -#define CONV(a, b) \ -    do { \ -	if (ctx->Array.ArrayObj->b.Enabled) { \ -	    rmesa->state.VB.AttribPtr[(a)].size = ctx->Array.ArrayObj->b.Size; \ -	    rmesa->state.VB.AttribPtr[(a)].data = ctx->Array.ArrayObj->b.BufferObj->Name \ -	      ? (void *)ADD_POINTERS(ctx->Array.ArrayObj->b.Ptr, ctx->Array.ArrayObj->b.BufferObj->Data) \ -	      : (void *)ctx->Array.ArrayObj->b.Ptr; \ -	    rmesa->state.VB.AttribPtr[(a)].stride = ctx->Array.ArrayObj->b.StrideB; \ -	    rmesa->state.VB.AttribPtr[(a)].type = ctx->Array.ArrayObj->b.Type; \ -	    enabled |= 1 << (a); \ -	} \ -    } while (0) - -static int setup_arrays(r300ContextPtr rmesa, GLint start) -{ -	int i; -	struct dt def = { 4, GL_FLOAT, 0, NULL }; -	GLcontext *ctx; -	GLuint enabled = 0; -	 -	ctx = rmesa->radeon.glCtx; -	i = r300Fallback(ctx); -	if (i) -		return i; - -	memset(rmesa->state.VB.AttribPtr, 0, VERT_ATTRIB_MAX*sizeof(struct dt)); -	 -	CONV(VERT_ATTRIB_POS, Vertex); -	CONV(VERT_ATTRIB_NORMAL, Normal); -	CONV(VERT_ATTRIB_COLOR0, Color); -	CONV(VERT_ATTRIB_COLOR1, SecondaryColor); -	CONV(VERT_ATTRIB_FOG, FogCoord); -	 -	for (i=0; i < MAX_TEXTURE_COORD_UNITS; i++) -		CONV(VERT_ATTRIB_TEX0 + i, TexCoord[i]); -	 -	if (ctx->VertexProgram._Enabled) -		for (i=0; i < VERT_ATTRIB_MAX; i++) -			CONV(i, VertexAttrib[i]); -	 -	for (i=0; i < VERT_ATTRIB_MAX; i++) { -	   rmesa->state.VB.AttribPtr[i].data += rmesa->state.VB.AttribPtr[i].stride * start; -	} -	 -	for(i=0; i < VERT_ATTRIB_MAX; i++){ -		if(rmesa->state.VB.AttribPtr[i].type != GL_UNSIGNED_BYTE && -#if MESA_LITTLE_ENDIAN -		   rmesa->state.VB.AttribPtr[i].type != GL_SHORT && -#endif -		   rmesa->state.VB.AttribPtr[i].type != GL_FLOAT){ -			WARN_ONCE("Unsupported format %d at index %d\n", rmesa->state.VB.AttribPtr[i].type, i); -			return R300_FALLBACK_TCL; -		} -		 -		/*fprintf(stderr, "%d: ", i); -		 -		switch(rmesa->state.VB.AttribPtr[i].type){ -		case GL_BYTE: fprintf(stderr, "byte "); break; -		case GL_UNSIGNED_BYTE: fprintf(stderr, "u byte "); break; -		case GL_SHORT: fprintf(stderr, "short "); break; -		case GL_UNSIGNED_SHORT: fprintf(stderr, "u short "); break; -		case GL_INT: fprintf(stderr, "int "); break; -		case GL_UNSIGNED_INT: fprintf(stderr, "u int "); break; -		case GL_FLOAT: fprintf(stderr, "float "); break; -		case GL_2_BYTES: fprintf(stderr, "2 bytes "); break; -		case GL_3_BYTES: fprintf(stderr, "3 bytes "); break; -		case GL_4_BYTES: fprintf(stderr, "4 bytes "); break; -		case GL_DOUBLE: fprintf(stderr, "double "); break; -		default: fprintf(stderr, "unknown "); break; -		} - -		fprintf(stderr, "Size %d ", rmesa->state.VB.AttribPtr[i].size); -		fprintf(stderr, "Ptr %p ", rmesa->state.VB.AttribPtr[i].data); -		fprintf(stderr, "Stride %d ", rmesa->state.VB.AttribPtr[i].stride); -		fprintf(stderr, "\n");*/ -	} -	return R300_FALLBACK_NONE; -} - -void radeon_init_vtxfmt_a(r300ContextPtr rmesa); - - -static void radeonDrawRangeElements(GLcontext *ctx, -				    GLenum mode, -				    GLuint min, -				    GLuint max, -				    GLsizei count,  -				    GLenum type, -				    const GLvoid *c_indices) -{ -#if 1 -	return GL_FALSE; -#else -	r300ContextPtr rmesa = R300_CONTEXT(ctx); -	struct tnl_prim prim; -	int elt_size; -	int i; -	void *ptr = NULL; -	struct r300_dma_region rvb; -	const GLvoid *indices = c_indices; -	 -	if (count > 65535) { -		/* TODO */ -		if (mode == GL_POINTS || -		    mode == GL_LINES || -		    mode == GL_QUADS || -		    mode == GL_TRIANGLES) { -			 -			while (count) { -				i = r300NumVerts(rmesa, MIN2(count, 65535), mode); -				 -				radeonDrawRangeElements(mode, min, max, i, type, indices); -				 -				indices += i * _mesa_sizeof_type(type); -				count -= i; -			} -			return GL_TRUE; -		} -		WARN_ONCE("Too many verts!\n"); -		return GL_FALSE; -	} -	 -	if (ctx->Array.ElementArrayBufferObj->Name) { -		/* use indices in the buffer object */ -		if (!ctx->Array.ElementArrayBufferObj->Data) { -			_mesa_warning(ctx, "DrawRangeElements with empty vertex elements buffer!"); -			return GL_TRUE; -		} -		/* actual address is the sum of pointers */ -		indices = (GLvoid *) -		ADD_POINTERS(ctx->Array.ElementArrayBufferObj->Data, (const GLubyte *) c_indices); -	} -	 -	FLUSH_CURRENT( ctx, 0 ); -#ifdef OPTIMIZE_ELTS -	min = 0; -#endif -	 -	memset(&rvb, 0, sizeof(rvb)); -	switch (type){ -	case GL_UNSIGNED_BYTE: -#ifdef FORCE_32BITS_ELTS -		elt_size = 4; -#else -		elt_size = 2; -#endif	 -		r300AllocDmaRegion(rmesa, &rvb, count * elt_size, elt_size); -		rvb.aos_offset = GET_START(&rvb); -		ptr = rvb.address + rvb.start; -		 -#ifdef FORCE_32BITS_ELTS -		for(i=0; i < count; i++) -			((unsigned int *)ptr)[i] = ((unsigned char *)indices)[i] - min; -#else -		for(i=0; i < count; i++) -			((unsigned short int *)ptr)[i] = ((unsigned char *)indices)[i] - min; -#endif -	break; -	 -	case GL_UNSIGNED_SHORT: -#ifdef FORCE_32BITS_ELTS -		elt_size = 4; -#else -		elt_size = 2; -#endif	 -#ifdef OPTIMIZE_ELTS -		if (min == 0 && ctx->Array.ElementArrayBufferObj->Name){ -			ptr = indices; -			break; -		} -#endif -		r300AllocDmaRegion(rmesa, &rvb, count * elt_size, elt_size); -		rvb.aos_offset = GET_START(&rvb); -		ptr = rvb.address + rvb.start; - -#ifdef FORCE_32BITS_ELTS -		for(i=0; i < count; i++) -			((unsigned int *)ptr)[i] = ((unsigned short int *)indices)[i] - min; -#else -		for(i=0; i < count; i++) -			((unsigned short int *)ptr)[i] = ((unsigned short int *)indices)[i] - min; -#endif -	break; -	 -	case GL_UNSIGNED_INT: -#ifdef FORCE_32BITS_ELTS -		elt_size = 4; -#else -		if (max - min <= 65535) -			elt_size = 2; -		else  -			elt_size = 4; -#endif	 -		r300AllocDmaRegion(rmesa, &rvb, count * elt_size, elt_size); -		rvb.aos_offset = GET_START(&rvb); -		ptr = rvb.address + rvb.start; -		 -		if (elt_size == 2) -			for (i=0; i < count; i++) -				((unsigned short int *)ptr)[i] = ((unsigned int *)indices)[i] - min; -		else -			for (i=0; i < count; i++) -				((unsigned int *)ptr)[i] = ((unsigned int *)indices)[i] - min; -	break; -	 -	default: -		WARN_ONCE("Unknown elt type!\n"); -		return GL_FALSE; -	} -	 -	/* XXX: setup_arrays before state update? */ -	 -	if (ctx->NewState)  -		_mesa_update_state( ctx ); -	 -	r300UpdateShaders(rmesa); - -	if (setup_arrays(rmesa, min) >= R300_FALLBACK_TCL) { -		r300ReleaseDmaRegion(rmesa, &rvb, __FUNCTION__); -		return GL_FALSE; -	} - -	rmesa->state.VB.Count = max - min + 1; -	 -	r300UpdateShaderStates(rmesa); -	 -	rmesa->state.VB.Primitive = &prim; -	rmesa->state.VB.PrimitiveCount = 1; -	 -	prim.mode = mode | PRIM_BEGIN | PRIM_END; -	if (rmesa->state.VB.LockCount) -		prim.start = min - rmesa->state.VB.LockFirst; -	else -		prim.start = 0; -	prim.count = count; -	 -	rmesa->state.VB.Elts = ptr; -	rmesa->state.VB.elt_size = elt_size; -	rmesa->state.VB.elt_min = min; -	rmesa->state.VB.elt_max = max; -	 -	if (r300RunRender(ctx, NULL)) { -		r300ReleaseDmaRegion(rmesa, &rvb, __FUNCTION__); -		return GL_FALSE; -	} -	 -	if(rvb.buf) -		radeon_mm_use(rmesa, rvb.buf->id); -	 -	r300ReleaseDmaRegion(rmesa, &rvb, __FUNCTION__); -	return GL_TRUE; -#endif -} - -static GLboolean radeonDrawArrays( GLcontext *ctx, -				   GLenum mode, GLint start, GLsizei count ) -{ -#if 1 -	return GL_FALSE; -#else -	GET_CURRENT_CONTEXT(ctx); -	r300ContextPtr rmesa = R300_CONTEXT(ctx); -	struct tnl_prim prim; -	 -	if (count > 65535) { -	   /* TODO: split into multiple draws. -	    */ -		WARN_ONCE("Too many verts!\n"); -		return GL_FALSE; -	} -	 -	FLUSH_CURRENT( ctx, 0 ); -	 -	if (ctx->NewState)  -		_mesa_update_state( ctx ); -	 -	/* XXX: setup_arrays before state update? */ -	 -	r300UpdateShaders(rmesa); - -	if (setup_arrays(rmesa, start) >= R300_FALLBACK_TCL) -		return GL_FALSE; - -	rmesa->state.VB.Count = count; - -	r300UpdateShaderStates(rmesa); -	 -	rmesa->state.VB.Primitive = &prim; -	rmesa->state.VB.PrimitiveCount = 1; -	 -	prim.mode = mode | PRIM_BEGIN | PRIM_END; -	if (rmesa->state.VB.LockCount) -		prim.start = start - rmesa->state.VB.LockFirst; -	else -		prim.start = 0; -	prim.count = count; -	 -	rmesa->state.VB.Elts = NULL; -	rmesa->state.VB.elt_size = 0; -	rmesa->state.VB.elt_min = 0; -	rmesa->state.VB.elt_max = 0; -	 -	if (r300RunRender(ctx, NULL)) -	   return GL_FALSE; - -	return GL_TRUE; -#endif -} - -static void radeon_draw_prims( GLcontext *ctx, -			       const struct gl_client_array *arrays[], -			       const struct _mesa_prim *prim, -			       GLuint nr_prims, -			       const struct _mesa_index_buffer *ib, -			       GLuint min_index, -			       GLuint max_index) -{ -	if (ib == NULL) { -		for (i = 0; i < nr_prims; i++) { -			if (!radeonDrawArrays(ctx, -					      prim->mode, -					      prim->start, -					      prim->count)) { -				/* Fallback -				 */ -				_tnl_draw_prims(ctx, -						arrays, -						prim + i, -						nr_prims - i, -						ib,  -						min_index, -						max_index); -				return; -			} -		} -	} else { -		for (i = 0; i < nr_prims; i++) { -			if (!radeonDrawRangeElements(ctx, -						     prim->mode, -						     min_index, -						     max_index, -						     prim->count, -						     ib->types, -						     ib->ptr)) { -				/* Fallback -				 */ -				_tnl_draw_prims(ctx, -						arrays, -						prim + i, -						nr_prims - i, -						ib,  -						min_index, -						max_index); -				return; -			} -		} -	} -} -	    -void radeon_init_vtxfmt_a(r300ContextPtr rmesa) -{ -	GLcontext *ctx; -	struct vbo_context *vbo = vbo_context(ctx); -	 -	vbo->draw_prims = radeon_draw_prims; -} - -#endif - -#ifdef HW_VBOS - -static struct gl_buffer_object * -r300NewBufferObject(GLcontext *ctx, GLuint name, GLenum target ) -{ -	struct r300_buffer_object *obj; - -	(void) ctx; - -	obj = MALLOC_STRUCT(r300_buffer_object); -	_mesa_initialize_buffer_object(&obj->mesa_obj, name, target); -	return &obj->mesa_obj; -} - -static void r300BufferData(GLcontext *ctx, GLenum target, GLsizeiptrARB size, -		const GLvoid *data, GLenum usage, struct gl_buffer_object *obj) -{ -	r300ContextPtr rmesa = R300_CONTEXT(ctx); -	struct r300_buffer_object *r300_obj = (struct r300_buffer_object *)obj; - -	/* Free previous buffer */ -	if (obj->OnCard) { -		radeon_mm_free(rmesa, r300_obj->id); -		obj->OnCard = GL_FALSE; -	} else { -		if (obj->Data) -			_mesa_free(obj->Data); -	} -#ifdef OPTIMIZE_ELTS -	if (0) { -#else -	if (target == GL_ELEMENT_ARRAY_BUFFER_ARB) { -#endif -		fallback: -		obj->Data = malloc(size); -		 -		if (data) -			_mesa_memcpy(obj->Data, data, size); -		 -		obj->OnCard = GL_FALSE; -	} else { -		r300_obj->id = radeon_mm_alloc(rmesa, 4, size); -		if (r300_obj->id == 0) -			goto fallback; -		 -		obj->Data = radeon_mm_map(rmesa, r300_obj->id, RADEON_MM_W); -	 -		if (data) -			_mesa_memcpy(obj->Data, data, size); -	 -		radeon_mm_unmap(rmesa, r300_obj->id); -		obj->OnCard = GL_TRUE; -	} -	 -	obj->Size = size; -	obj->Usage = usage; -} - -static void r300BufferSubData(GLcontext *ctx, GLenum target, GLintptrARB offset, -		GLsizeiptrARB size, const GLvoid * data, struct gl_buffer_object * bufObj) -{ -	r300ContextPtr rmesa = R300_CONTEXT(ctx); -	struct r300_buffer_object *r300_obj = (struct r300_buffer_object *)bufObj; -	(void) ctx; (void) target; -	void *ptr; - -	if (bufObj->Data && ((GLuint) (size + offset) <= bufObj->Size)) { -		if (bufObj->OnCard){ -			ptr = radeon_mm_map(rmesa, r300_obj->id, RADEON_MM_W); -		 -			_mesa_memcpy( (GLubyte *) ptr + offset, data, size ); -		 -			radeon_mm_unmap(rmesa, r300_obj->id); -		} else { -			_mesa_memcpy( (GLubyte *) bufObj->Data + offset, data, size ); -		} -	} -} - -static void *r300MapBuffer(GLcontext *ctx, GLenum target, GLenum access, -		struct gl_buffer_object *bufObj) -{ -	r300ContextPtr rmesa = R300_CONTEXT(ctx); -	struct r300_buffer_object *r300_obj = (struct r300_buffer_object *)bufObj; -	 -	(void) ctx; -	(void) target; -	(void) access; -	//ASSERT(!bufObj->OnCard); -	/* Just return a direct pointer to the data */ -	if (bufObj->Pointer) { -		/* already mapped! */ -		return NULL; -	} -	 -	if (!bufObj->OnCard) { -		bufObj->Pointer = bufObj->Data; -		return bufObj->Pointer; -	} -	 -	switch (access) { -	case GL_READ_ONLY: -		bufObj->Pointer = radeon_mm_map(rmesa, r300_obj->id, RADEON_MM_R); -	break; -	 -	case GL_WRITE_ONLY: -		bufObj->Pointer = radeon_mm_map(rmesa, r300_obj->id, RADEON_MM_W); -	break; -	 -	case GL_READ_WRITE: -		bufObj->Pointer = radeon_mm_map(rmesa, r300_obj->id, RADEON_MM_RW); -	break; -	 -	default: -		WARN_ONCE("Unknown access type\n"); -		bufObj->Pointer = NULL; -	break; -	} -	 -	return bufObj->Pointer; -} - -static GLboolean r300UnmapBuffer(GLcontext *ctx, GLenum target, struct gl_buffer_object *bufObj) -{ -	r300ContextPtr rmesa = R300_CONTEXT(ctx); -	struct r300_buffer_object *r300_obj = (struct r300_buffer_object *)bufObj; -	 -	(void) ctx; -	(void) target; -	//ASSERT(!bufObj->OnCard); -	/* XXX we might assert here that bufObj->Pointer is non-null */ -	if (!bufObj->OnCard) { -		bufObj->Pointer = NULL; -		return GL_TRUE; -	} -	radeon_mm_unmap(rmesa, r300_obj->id); -	 -	bufObj->Pointer = NULL; -	return GL_TRUE; -} - -static void r300DeleteBuffer(GLcontext *ctx, struct gl_buffer_object *obj) -{ -	r300ContextPtr rmesa = R300_CONTEXT(ctx); -	struct r300_buffer_object *r300_obj = (struct r300_buffer_object *)obj; -	 -	if (obj->OnCard) { -		radeon_mm_free(rmesa, r300_obj->id); -		obj->Data = NULL; -	} -	_mesa_delete_buffer_object(ctx, obj); -} - -void r300EvictVBOs(GLcontext *ctx, int amount) -{ -	r300ContextPtr rmesa = R300_CONTEXT(ctx); -	struct _mesa_HashTable *hash = ctx->Shared->BufferObjects; -	GLuint k = _mesa_HashFirstEntry(hash); -	 -	while (amount > 0 && k) { -		struct gl_buffer_object *obj = _mesa_lookup_bufferobj(ctx, k); -		struct r300_buffer_object *r300_obj -			= (struct r300_buffer_object *) obj; -		 -		if (obj->OnCard && obj->Size) { -			GLvoid *data; -			obj->Data = _mesa_malloc(obj->Size); -			 -			data = radeon_mm_map(rmesa, r300_obj->id, RADEON_MM_R); -			_mesa_memcpy(obj->Data, data, obj->Size); -			radeon_mm_unmap(rmesa, r300_obj->id); -			 -			radeon_mm_free(rmesa, r300_obj->id); -			r300_obj->id = 0; -			obj->OnCard = GL_FALSE; -			 -			amount -= obj->Size; -		} -		 -		k = _mesa_HashNextEntry(hash, k); -	} -	 -} - -void r300InitVBOFuncs(struct dd_function_table *functions) -{ -	functions->NewBufferObject = r300NewBufferObject; -	functions->BufferData = r300BufferData; -	functions->BufferSubData = r300BufferSubData; -	functions->MapBuffer = r300MapBuffer; -	functions->UnmapBuffer = r300UnmapBuffer; -	functions->DeleteBuffer = r300DeleteBuffer; -} - -#endif | 
