mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-05 05:18:08 +02:00
Move the few definitions from r300_lib.h still in use to r300_emit.h.
Rework *vb* function to not use AOS_ARRAY structure, but rather work directly with r300->state.aos. Remove references to r300_lib.h and r300_lib.c Remove r300_lib.[c,h].
This commit is contained in:
parent
086ca3dffb
commit
864137984a
4 changed files with 90 additions and 60 deletions
|
|
@ -32,7 +32,6 @@ DRIVER_SOURCES = \
|
|||
r300_cmdbuf.c \
|
||||
r300_state.c \
|
||||
r300_render.c \
|
||||
r300_lib.c \
|
||||
r300_texmem.c \
|
||||
r300_tex.c \
|
||||
r300_texstate.c \
|
||||
|
|
|
|||
|
|
@ -202,4 +202,45 @@ cmd=(drm_radeon_cmd_header_t *) r300AllocCmdBuf(rmesa, \
|
|||
cmd[0].i=cmdcpdelay(count);
|
||||
}
|
||||
|
||||
/* fire vertex buffer */
|
||||
static void inline fire_AOS(PREFIX int vertex_count, int type)
|
||||
{
|
||||
LOCAL_VARS
|
||||
check_space(9);
|
||||
|
||||
start_packet3(RADEON_CP_PACKET3_3D_DRAW_VBUF_2, 0);
|
||||
/* e32(0x840c0024); */
|
||||
e32(R300_VAP_VF_CNTL__PRIM_WALK_VERTEX_LIST | (vertex_count<<16) | type);
|
||||
}
|
||||
|
||||
/* these are followed by the corresponding data */
|
||||
#define start_index32_packet(vertex_count, type) \
|
||||
{\
|
||||
int _vc;\
|
||||
_vc=(vertex_count); \
|
||||
start_packet3(RADEON_CP_PACKET3_3D_DRAW_INDX_2, _vc); \
|
||||
e32(R300_VAP_VF_CNTL__PRIM_WALK_INDICES | (_vc<<16) | type \
|
||||
| R300_VAP_VF_CNTL__INDEX_SIZE_32bit); \
|
||||
}
|
||||
|
||||
#define start_index16_packet(vertex_count, type) \
|
||||
{\
|
||||
int _vc, _n;\
|
||||
_vc=(vertex_count); \
|
||||
_n=(vertex_count+1)>>1; \
|
||||
start_packet3(RADEON_CP_PACKET3_3D_DRAW_INDX_2, _n); \
|
||||
e32(R300_VAP_VF_CNTL__PRIM_WALK_INDICES | (_vc<<16) | type); \
|
||||
}
|
||||
|
||||
/* Interestingly enough this ones needs the call to setup_AOS, even thought
|
||||
some of the data so setup is not needed and some is not as arbitrary
|
||||
as when used by DRAW_VBUF_2 or DRAW_INDX_2 */
|
||||
#define start_immediate_packet(vertex_count, type, vertex_size) \
|
||||
{\
|
||||
int _vc; \
|
||||
_vc=(vertex_count); \
|
||||
start_packet3(RADEON_CP_PACKET3_3D_DRAW_IMMD_2, _vc*(vertex_size)); \
|
||||
e32(R300_VAP_VF_CNTL__PRIM_WALK_VERTEX_EMBEDDED | (_vc<<16) | type); \
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -56,8 +56,7 @@ USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|||
#include "r300_program.h"
|
||||
#include "r300_tex.h"
|
||||
|
||||
#include "r300_lib.h"
|
||||
|
||||
#include "r300_emit.h"
|
||||
|
||||
/**********************************************************************
|
||||
* Hardware rasterization
|
||||
|
|
@ -335,64 +334,57 @@ static GLboolean r300_run_immediate_render(GLcontext *ctx,
|
|||
/* We use the start part of GART texture buffer for vertices */
|
||||
|
||||
|
||||
static void upload_vertex_buffer(r300ContextPtr rmesa,
|
||||
GLcontext *ctx, AOS_DATA *array, int *n_arrays)
|
||||
static void upload_vertex_buffer(r300ContextPtr rmesa, GLcontext *ctx)
|
||||
{
|
||||
TNLcontext *tnl = TNL_CONTEXT(ctx);
|
||||
struct vertex_buffer *VB = &tnl->vb;
|
||||
int idx=0;
|
||||
int i,j,k;
|
||||
radeonScreenPtr rsp=rmesa->radeon.radeonScreen;
|
||||
|
||||
/* A hack - we don't want to overwrite vertex buffers, so we
|
||||
just use AGP space for them.. Fix me ! */
|
||||
static int offset=0;
|
||||
if(offset>2*1024*1024){
|
||||
//fprintf(stderr, "Wrapping agp vertex buffer offset\n");
|
||||
offset=0;
|
||||
}
|
||||
/* Not the most efficient implementation, but, for now, I just want something that
|
||||
works */
|
||||
/* to do - make single memcpy per column (is it possible ?) */
|
||||
/* to do - use dirty flags to avoid redundant copies */
|
||||
#define UPLOAD_VECTOR(v, r, f)\
|
||||
{ \
|
||||
/* Is the data dirty ? */ \
|
||||
if (v->flags & ((1<<v->size)-1)) { \
|
||||
/* fprintf(stderr, "size=%d vs stride=%d\n", v->size, v->stride); */ \
|
||||
if(v->size*4==v->stride){\
|
||||
/* fast path */ \
|
||||
memcpy(rsp->gartTextures.map+offset, v->data, v->stride*VB->Count); \
|
||||
} else { \
|
||||
for(i=0;i<VB->Count;i++){ \
|
||||
/* copy one vertex at a time*/ \
|
||||
memcpy(rsp->gartTextures.map+offset+i*v->size*4, VEC_ELT(v, GLfloat, i), v->size*4); \
|
||||
} \
|
||||
} \
|
||||
/* v->flags &= ~((1<<v->size)-1);*/ \
|
||||
} \
|
||||
array[idx].element_size=v->size; \
|
||||
array[idx].stride=v->size; \
|
||||
array[idx].format=(f); \
|
||||
array[idx].ncomponents=v->size; \
|
||||
array[idx].offset=rsp->gartTextures.handle+offset; \
|
||||
array[idx].reg=r; \
|
||||
offset+=v->size*4*VB->Count; \
|
||||
idx++; \
|
||||
}
|
||||
TNLcontext *tnl = TNL_CONTEXT(ctx);
|
||||
struct vertex_buffer *VB = &tnl->vb;
|
||||
int idx=0;
|
||||
int i,j,k;
|
||||
radeonScreenPtr rsp=rmesa->radeon.radeonScreen;
|
||||
|
||||
UPLOAD_VECTOR(VB->ObjPtr, REG_COORDS, AOS_FORMAT_FLOAT);
|
||||
UPLOAD_VECTOR(VB->ColorPtr[0], REG_COLOR0, AOS_FORMAT_FLOAT_COLOR);
|
||||
/* A hack - we don't want to overwrite vertex buffers, so we
|
||||
just use AGP space for them.. Fix me ! */
|
||||
static int offset=0;
|
||||
if(offset>2*1024*1024){
|
||||
//fprintf(stderr, "Wrapping agp vertex buffer offset\n");
|
||||
offset=0;
|
||||
}
|
||||
/* Not the most efficient implementation, but, for now, I just want something that
|
||||
works */
|
||||
/* to do - make single memcpy per column (is it possible ?) */
|
||||
/* to do - use dirty flags to avoid redundant copies */
|
||||
#define UPLOAD_VECTOR(v)\
|
||||
{ \
|
||||
/* Is the data dirty ? */ \
|
||||
if (v->flags & ((1<<v->size)-1)) { \
|
||||
/* fprintf(stderr, "size=%d vs stride=%d\n", v->size, v->stride); */ \
|
||||
if(v->size*4==v->stride){\
|
||||
/* fast path */ \
|
||||
memcpy(rsp->gartTextures.map+offset, v->data, v->stride*VB->Count); \
|
||||
} else { \
|
||||
for(i=0;i<VB->Count;i++){ \
|
||||
/* copy one vertex at a time*/ \
|
||||
memcpy(rsp->gartTextures.map+offset+i*v->size*4, VEC_ELT(v, GLfloat, i), v->size*4); \
|
||||
} \
|
||||
} \
|
||||
/* v->flags &= ~((1<<v->size)-1);*/ \
|
||||
} \
|
||||
rmesa->state.aos[idx].offset=rsp->gartTextures.handle+offset; \
|
||||
offset+=v->size*4*VB->Count; \
|
||||
idx++; \
|
||||
}
|
||||
|
||||
UPLOAD_VECTOR(VB->ObjPtr);
|
||||
UPLOAD_VECTOR(VB->ColorPtr[0]);
|
||||
/* texture coordinates */
|
||||
for(k=0;k < ctx->Const.MaxTextureUnits;k++)
|
||||
if(ctx->Texture.Unit[k].Enabled)
|
||||
UPLOAD_VECTOR(VB->TexCoordPtr[k], REG_TEX0+i, AOS_FORMAT_FLOAT);
|
||||
UPLOAD_VECTOR(VB->TexCoordPtr[k]);
|
||||
|
||||
*n_arrays=idx;
|
||||
if(idx>=R300_MAX_AOS_ARRAYS){
|
||||
fprintf(stderr, "Aieee ! Maximum AOS arrays count exceeded.. \n");
|
||||
exit(-1);
|
||||
}
|
||||
if(idx>=R300_MAX_AOS_ARRAYS){
|
||||
fprintf(stderr, "Aieee ! Maximum AOS arrays count exceeded.. \n");
|
||||
exit(-1);
|
||||
}
|
||||
}
|
||||
|
||||
static void r300_render_vb_primitive(r300ContextPtr rmesa,
|
||||
|
|
@ -418,8 +410,7 @@ static GLboolean r300_run_vb_render(GLcontext *ctx,
|
|||
r300ContextPtr rmesa = R300_CONTEXT(ctx);
|
||||
TNLcontext *tnl = TNL_CONTEXT(ctx);
|
||||
struct vertex_buffer *VB = &tnl->vb;
|
||||
int i, j, n_arrays;
|
||||
AOS_DATA vb_arrays[R300_MAX_AOS_ARRAYS];
|
||||
int i, j;
|
||||
LOCAL_VARS
|
||||
|
||||
if (RADEON_DEBUG == DEBUG_PRIMS)
|
||||
|
|
@ -439,10 +430,8 @@ static GLboolean r300_run_vb_render(GLcontext *ctx,
|
|||
/* setup array of structures data */
|
||||
LOCK_HARDWARE(&(rmesa->radeon));
|
||||
|
||||
upload_vertex_buffer(rmesa, ctx, vb_arrays, &n_arrays);
|
||||
upload_vertex_buffer(rmesa, ctx);
|
||||
//fprintf(stderr, "Using %d AOS arrays\n", n_arrays);
|
||||
for(i=0;i<n_arrays;i++)
|
||||
rmesa->state.aos[i].offset=vb_arrays[i].offset;
|
||||
|
||||
for(i=0; i < VB->PrimitiveCount; i++){
|
||||
GLuint prim = VB->Primitive[i].mode;
|
||||
|
|
|
|||
|
|
@ -56,6 +56,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|||
#include "r300_state.h"
|
||||
#include "r300_reg.h"
|
||||
#include "r300_program.h"
|
||||
#include "r300_emit.h"
|
||||
#include "r300_fixed_pipelines.h"
|
||||
|
||||
static void r300AlphaFunc(GLcontext * ctx, GLenum func, GLfloat ref)
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue