2 Copyright (C) The Weather Channel, Inc. 2002. All Rights Reserved.
4 The Weather Channel (TM) funded Tungsten Graphics to develop the
5 initial release of the Radeon 8500 driver under the XFree86 license.
6 This notice must be preserved.
8 Permission is hereby granted, free of charge, to any person obtaining
9 a copy of this software and associated documentation files (the
10 "Software"), to deal in the Software without restriction, including
11 without limitation the rights to use, copy, modify, merge, publish,
12 distribute, sublicense, and/or sell copies of the Software, and to
13 permit persons to whom the Software is furnished to do so, subject to
14 the following conditions:
16 The above copyright notice and this permission notice (including the
17 next paragraph) shall be included in all copies or substantial
18 portions of the Software.
20 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
21 EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
22 MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
23 IN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE
24 LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
25 OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
26 WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
28 **************************************************************************/
32 * Keith Whitwell <keith@tungstengraphics.com>
35 #include "main/glheader.h"
36 #include "main/mtypes.h"
37 #include "main/colormac.h"
38 #include "main/imports.h"
39 #include "main/macros.h"
41 #include "swrast_setup/swrast_setup.h"
42 #include "math/m_translate.h"
44 #include "tnl/t_context.h"
46 #include "r200_context.h"
47 #include "r200_ioctl.h"
48 #include "r200_state.h"
49 #include "r200_swtcl.h"
50 #include "r200_maos.h"
56 * - from r200_tcl_render
57 * - call r200EmitArrays to ensure uptodate arrays in dma
58 * - emit primitives (new type?) which reference the data
59 * -- need to use elts for lineloop, quads, quadstrip/flat
60 * -- other primitives are all well-formed (need tristrip-1,fake-poly)
63 static void emit_ubyte_rgba3( GLcontext
*ctx
,
64 struct radeon_dma_region
*rvb
,
70 r200_color_t
*out
= (r200_color_t
*)(rvb
->start
+ rvb
->address
);
72 if (R200_DEBUG
& DEBUG_VERTS
)
73 fprintf(stderr
, "%s count %d stride %d out %p\n",
74 __FUNCTION__
, count
, stride
, (void *)out
);
76 for (i
= 0; i
< count
; i
++) {
78 out
->green
= *(data
+1);
79 out
->blue
= *(data
+2);
86 static void emit_ubyte_rgba4( GLcontext
*ctx
,
87 struct radeon_dma_region
*rvb
,
93 int *out
= (int *)(rvb
->address
+ rvb
->start
);
95 if (R200_DEBUG
& DEBUG_VERTS
)
96 fprintf(stderr
, "%s count %d stride %d\n",
97 __FUNCTION__
, count
, stride
);
100 for (i
= 0; i
< count
; i
++)
101 ((int *)out
)[i
] = LE32_TO_CPU(((int *)data
)[i
]);
103 for (i
= 0; i
< count
; i
++) {
104 *(int *)out
++ = LE32_TO_CPU(*(int *)data
);
111 static void emit_ubyte_rgba( GLcontext
*ctx
,
112 struct radeon_dma_region
*rvb
,
118 r200ContextPtr rmesa
= R200_CONTEXT(ctx
);
120 if (R200_DEBUG
& DEBUG_VERTS
)
121 fprintf(stderr
, "%s %d/%d\n", __FUNCTION__
, count
, size
);
126 // r200AllocDmaRegion( rmesa, rvb, 4, 4 );
128 rvb
->aos_start
= GET_START(rvb
);
133 // r200AllocDmaRegion( rmesa, rvb, 4 * count, 4 ); /* alignment? */
134 rvb
->aos_start
= GET_START(rvb
);
143 emit_ubyte_rgba3( ctx
, rvb
, data
, stride
, count
);
146 emit_ubyte_rgba4( ctx
, rvb
, data
, stride
, count
);
157 #if defined(USE_X86_ASM)
158 #define COPY_DWORDS( dst, src, nr ) \
161 __asm__ __volatile__( "rep ; movsl" \
162 : "=%c" (__tmp), "=D" (dst), "=S" (__tmp) \
168 #define COPY_DWORDS( dst, src, nr ) \
171 for ( j = 0 ; j < nr ; j++ ) \
172 dst[j] = ((int *)src)[j]; \
177 static void r200_emit_vecfog(GLcontext
*ctx
, struct radeon_aos
*aos
,
178 GLvoid
*data
, int stride
, int count
)
180 radeonContextPtr rmesa
= RADEON_CONTEXT(ctx
);
186 memset(aos
, 0, sizeof(struct radeon_aos
));
192 bo_size
= size
* count
* 4;
195 aos
->bo
= radeon_bo_open(rmesa
->radeonScreen
->bom
,
196 0, bo_size
, 32, RADEON_GEM_DOMAIN_GTT
, 0);
198 aos
->components
= size
;
201 radeon_bo_map(aos
->bo
, 1);
202 out
= (uint32_t*)((char*)aos
->bo
->ptr
+ aos
->offset
);
203 for (i
= 0; i
< count
; i
++) {
204 out
[0] = r200ComputeFogBlendFactor( ctx
, *(GLfloat
*)data
);
208 radeon_bo_unmap(aos
->bo
);
213 /* Emit any changed arrays to new GART memory, re-emit a packet to
216 void r200EmitArrays( GLcontext
*ctx
, GLubyte
*vimap_rev
)
218 r200ContextPtr rmesa
= R200_CONTEXT( ctx
);
219 struct vertex_buffer
*VB
= &TNL_CONTEXT( ctx
)->vb
;
220 // struct radeon_dma_region **component = rmesa->tcl.aos_components;
222 GLuint vfmt0
= 0, vfmt1
= 0;
223 GLuint count
= VB
->Count
;
226 fprintf(stderr
,"emit arrays\n");
227 for ( i
= 0; i
< 15; i
++ ) {
228 GLubyte attrib
= vimap_rev
[i
];
232 emitsize
= (VB
->AttribPtr
[attrib
]->size
);
235 vfmt0
|= R200_VTX_W0
;
238 vfmt0
|= R200_VTX_Z0
;
246 assert(attrib
== VERT_ATTRIB_WEIGHT
);
247 emitsize
= (VB
->AttribPtr
[attrib
]->size
);
248 vfmt0
|= emitsize
<< R200_VTX_WEIGHT_COUNT_SHIFT
;
251 assert(attrib
== VERT_ATTRIB_NORMAL
);
253 vfmt0
|= R200_VTX_N0
;
256 /* special handling to fix up fog. Will get us into trouble with vbos...*/
257 assert(attrib
== VERT_ATTRIB_FOG
);
258 if (!rmesa
->tcl
.vertex_data
[i
].buf
) {
259 if (ctx
->VertexProgram
._Enabled
)
260 rcommon_emit_vector( ctx
,
261 &(rmesa
->tcl
.aos
[nr
]),
262 (char *)VB
->AttribPtr
[attrib
]->data
,
264 VB
->AttribPtr
[attrib
]->stride
,
267 r200_emit_vecfog( ctx
,
268 &(rmesa
->tcl
.aos
[nr
]),
269 (char *)VB
->AttribPtr
[attrib
]->data
,
270 VB
->AttribPtr
[attrib
]->stride
,
273 vfmt0
|= R200_VTX_DISCRETE_FOG
;
280 if (VB
->AttribPtr
[attrib
]->size
== 4 &&
281 (VB
->AttribPtr
[attrib
]->stride
!= 0 ||
282 VB
->AttribPtr
[attrib
]->data
[0][3] != 1.0)) emitsize
= 4;
285 vfmt0
|= R200_VTX_FP_RGBA
<< (R200_VTX_COLOR_0_SHIFT
+ (i
- 4) * 2);
287 vfmt0
|= R200_VTX_FP_RGB
<< (R200_VTX_COLOR_0_SHIFT
+ (i
- 4) * 2);
296 emitsize
= VB
->AttribPtr
[attrib
]->size
;
297 vfmt1
|= emitsize
<< (R200_VTX_TEX0_COMP_CNT_SHIFT
+ (i
- 8) * 3);
300 emitsize
= VB
->AttribPtr
[attrib
]->size
>= 2 ? VB
->AttribPtr
[attrib
]->size
: 2;
303 vfmt0
|= R200_VTX_XY1
;
306 vfmt0
|= R200_VTX_Z1
;
309 vfmt0
|= R200_VTX_W1
;
315 if (!rmesa
->tcl
.vertex_data
[i
].buf
) {
316 rcommon_emit_vector( ctx
,
317 &(rmesa
->tcl
.aos
[nr
]),
318 (char *)VB
->AttribPtr
[attrib
]->data
,
320 VB
->AttribPtr
[attrib
]->stride
,
326 // component[nr++] = &rmesa->tcl.vertex_data[i];
330 if (vfmt0
!= rmesa
->hw
.vtx
.cmd
[VTX_VTXFMT_0
] ||
331 vfmt1
!= rmesa
->hw
.vtx
.cmd
[VTX_VTXFMT_1
]) {
332 R200_STATECHANGE( rmesa
, vtx
);
333 rmesa
->hw
.vtx
.cmd
[VTX_VTXFMT_0
] = vfmt0
;
334 rmesa
->hw
.vtx
.cmd
[VTX_VTXFMT_1
] = vfmt1
;
337 rmesa
->tcl
.nr_aos_components
= nr
;
341 void r200ReleaseArrays( GLcontext
*ctx
, GLuint newinputs
)
343 r200ContextPtr rmesa
= R200_CONTEXT( ctx
);
345 for (i
= 0; i
< rmesa
->tcl
.nr_aos_components
; i
++) {
346 if (rmesa
->tcl
.aos
[i
].bo
) {
347 rmesa
->tcl
.aos
[i
].bo
= radeon_bo_unref(rmesa
->tcl
.aos
[i
].bo
);