2 * Author: Max Lingua <sunmax@libero.it>
5 #include "main/glheader.h"
6 #include "main/context.h"
7 #include "main/macros.h"
8 #include "main/mtypes.h"
10 #include "tnl/t_context.h"
12 #include "s3v_context.h"
19 #define HAVE_LINE_STRIPS 0
20 #define HAVE_TRIANGLES 0
21 #define HAVE_TRI_STRIPS 0
22 #define HAVE_TRI_STRIP_1 0
23 #define HAVE_TRI_FANS 0
25 #define HAVE_QUAD_STRIPS 0
26 #define HAVE_POLYGONS 0
31 static void VERT_FALLBACK( GLcontext
*ctx
,
36 TNLcontext
*tnl
= TNL_CONTEXT(ctx
);
37 /* s3vContextPtr vmesa = S3V_CONTEXT(ctx); */
40 DEBUG(("VERT_FALLBACK: flags & PRIM_MODE_MASK = %i\n",
41 flags
& PRIM_MODE_MASK
));
42 DEBUG(("VERT_FALLBACK: flags=%i PRIM_MODE_MASK=%i\n",
43 flags
, PRIM_MODE_MASK
));
45 tnl
->Driver
.Render
.PrimitiveNotify( ctx
, flags
& PRIM_MODE_MASK
);
47 tnl
->Driver
.Render
.BuildVertices( ctx
, start
, count
, ~0 );
49 _flags
= flags
& PRIM_MODE_MASK
;
51 tnl
->Driver
.Render
.PrimTabVerts
[_flags
]( ctx
, start
, count
, flags
);
52 S3V_CONTEXT(ctx
)->SetupNewInputs
= VERT_BIT_POS
;
56 static const GLuint hw_prim
[GL_POLYGON
+1] = {
62 PrimType_TriangleStrip
,
69 static INLINE
void s3vStartPrimitive( s3vContextPtr vmesa
, GLenum prim
)
71 __DRIdrawablePrivate
*dPriv
= vmesa
->driDrawable
;
73 int _hw_prim
= hw_prim
[prim
];
75 DEBUG(("s3vStartPrimitive (new #%i) ", prim
));
77 if (_hw_prim
!= vmesa
->restore_primitive
) {
79 if (prim
== 4) { /* TRI */
80 DEBUG(("switching to tri\n"));
81 vmesa
->prim_cmd
= vmesa
->_tri
[vmesa
->_3d_mode
];
82 vmesa
->alpha_cmd
= vmesa
->_alpha
[vmesa
->_3d_mode
];
83 DMAOUT_CHECK(3DTRI_Z_BASE
, 12);
84 } else if (prim
== 1) { /* LINE */
85 DEBUG(("switching to line\n"));
86 vmesa
->prim_cmd
= DO_3D_LINE
;
87 vmesa
->alpha_cmd
= vmesa
->_alpha
[0];
88 DMAOUT_CHECK(3DLINE_Z_BASE
, 12);
90 DEBUG(("Never mind the bollocks!\n"));
93 DMAOUT(vmesa
->s3vScreen
->depthOffset
& 0x003FFFF8);
94 DMAOUT(vmesa
->DestBase
);
95 /* DMAOUT(vmesa->ScissorLR); */
96 /* DMAOUT(vmesa->ScissorTB); */
97 DMAOUT( (0 << 16) | (dPriv
->w
-1) );
98 DMAOUT( (0 << 16) | (dPriv
->h
-1) );
99 DMAOUT( (vmesa
->SrcStride
<< 16) | vmesa
->TexStride
);
100 DMAOUT(vmesa
->SrcStride
);
101 DMAOUT(vmesa
->TexOffset
);
102 DMAOUT(vmesa
->TextureBorderColor
);
106 DMAOUT(vmesa
->CMD
| vmesa
->prim_cmd
| vmesa
->alpha_cmd
);
110 vmesa
->restore_primitive
= _hw_prim
;
113 static INLINE
void s3vEndPrimitive( s3vContextPtr vmesa
)
115 /* GLcontext *ctx = vmesa->glCtx; */
116 DEBUG(("s3vEndPrimitive\n"));
119 #define LOCAL_VARS s3vContextPtr vmesa = S3V_CONTEXT(ctx)
120 #define INIT( prim ) s3vStartPrimitive( vmesa, prim )
121 #define FINISH s3vEndPrimitive( vmesa )
122 #define NEW_PRIMITIVE() (void) vmesa
123 #define NEW_BUFFER() (void) vmesa
124 #define FIRE_VERTICES() (void) vmesa
125 #define GET_CURRENT_VB_MAX_VERTS() \
126 (vmesa->bufSize - vmesa->bufCount) / 2
127 #define GET_SUBSEQUENT_VB_MAX_VERTS() \
130 #define ALLOC_VERTS(nr) NULL
131 #define EMIT_VERTS(ctx, start, count, buf) NULL
132 #define FLUSH() s3vEndPrimitive( vmesa )
134 #define TAG(x) s3v_##x
136 #include "tnl_dd/t_dd_dmatmp.h"
138 /**********************************************************************/
139 /* Render pipeline stage */
140 /**********************************************************************/
143 static GLboolean
s3v_run_render( GLcontext
*ctx
,
144 struct tnl_pipeline_stage
*stage
)
146 s3vContextPtr vmesa
= S3V_CONTEXT(ctx
);
147 TNLcontext
*tnl
= TNL_CONTEXT(ctx
);
148 struct vertex_buffer
*VB
= &tnl
->vb
;
150 tnl_render_func
*tab
;
152 DEBUG(("s3v_run_render\n"));
155 if (VB
->ClipOrMask
|| vmesa
->RenderIndex
!= 0) {
156 DEBUG(("*** CLIPPED in render ***\n"));
158 return GL_TRUE
; /* don't handle clipping here */
163 /* We don't do elts */
167 tab
= TAG(render_tab_verts
);
169 tnl
->Driver
.Render
.Start( ctx
);
171 for (i
= 0 ; i
< VB
->PrimitiveCount
; i
++ )
173 GLuint prim
= _tnl_translate_prim(&VB
->Primitive
[i
]);
174 GLuint start
= VB
->Primitive
[i
].start
;
175 GLuint length
= VB
->Primitive
[i
].count
;
177 DEBUG(("s3v_run_render (loop=%i) (lenght=%i)\n", i
, length
));
180 tnl
->Driver
.Render
.BuildVertices( ctx
, start
,
181 start
+length
, ~0 /*stage->inputs*/); /* XXX */
182 tnl
->Driver
.Render
.PrimTabVerts
[prim
& PRIM_MODE_MASK
]
183 ( ctx
, start
, start
+ length
, prim
);
184 vmesa
->SetupNewInputs
= VERT_BIT_POS
;
188 tnl
->Driver
.Render
.Finish( ctx
);
190 return GL_FALSE
; /* finished the pipe */
195 const struct tnl_pipeline_stage _s3v_render_stage
=
202 s3v_run_render
/* run */