2 #include "r300_context.h"
3 #include "r300_cmdbuf.h"
8 #define CONV(a, b) rmesa->state.VB.AttribPtr[(a)].size = ctx->Array.b.Size, \
9 rmesa->state.VB.AttribPtr[(a)].data = ctx->Array.b.BufferObj->Name ? \
10 ADD_POINTERS(ctx->Array.b.Ptr, ctx->Array.b.BufferObj->Data) : ctx->Array.b.Ptr, \
11 rmesa->state.VB.AttribPtr[(a)].stride = ctx->Array.b.StrideB, \
12 rmesa->state.VB.AttribPtr[(a)].type = ctx->Array.b.Type
14 static int setup_arrays(r300ContextPtr rmesa
, GLint start
)
17 struct dt def
= { 4, GL_FLOAT
, 0, NULL
};
21 ctx
= rmesa
->radeon
.glCtx
;
23 memset(rmesa
->state
.VB
.AttribPtr
, 0, VERT_ATTRIB_MAX
*sizeof(struct dt
));
25 CONV(VERT_ATTRIB_POS
, Vertex
);
26 if (ctx
->Array
.Vertex
.Enabled
)
27 enabled
|= 1 << VERT_ATTRIB_POS
;
29 CONV(VERT_ATTRIB_NORMAL
, Normal
);
30 if (ctx
->Array
.Normal
.Enabled
)
31 enabled
|= 1 << VERT_ATTRIB_NORMAL
;
33 CONV(VERT_ATTRIB_COLOR0
, Color
);
34 if (ctx
->Array
.Color
.Enabled
)
35 enabled
|= 1 << VERT_ATTRIB_COLOR0
;
37 CONV(VERT_ATTRIB_COLOR1
, SecondaryColor
);
38 if (ctx
->Array
.SecondaryColor
.Enabled
)
39 enabled
|= 1 << VERT_ATTRIB_COLOR1
;
41 CONV(VERT_ATTRIB_FOG
, FogCoord
);
42 if (ctx
->Array
.FogCoord
.Enabled
)
43 enabled
|= 1 << VERT_ATTRIB_FOG
;
45 for (i
=0; i
< MAX_TEXTURE_COORD_UNITS
; i
++) {
46 CONV(VERT_ATTRIB_TEX0
+ i
, TexCoord
[i
]);
48 if(ctx
->Array
.TexCoord
[i
].Enabled
) {
49 enabled
|= 1 << (VERT_ATTRIB_TEX0
+i
);
54 for (i
=0; i
< VERT_ATTRIB_MAX
; i
++) {
55 if (enabled
& (1 << i
)) {
56 rmesa
->state
.VB
.AttribPtr
[i
].data
+= rmesa
->state
.VB
.AttribPtr
[i
].stride
* start
;
58 def
.data
= ctx
->Current
.Attrib
[i
];
59 memcpy(&rmesa
->state
.VB
.AttribPtr
[i
], &def
, sizeof(struct dt
));
62 /*if(rmesa->state.VB.AttribPtr[i].data == ctx->Current.Attrib[i])
63 fprintf(stderr, "%d is default coord\n", i);*/
66 for(i
=0; i
< VERT_ATTRIB_MAX
; i
++){
67 if(rmesa
->state
.VB
.AttribPtr
[i
].type
!= GL_UNSIGNED_BYTE
&&
68 rmesa
->state
.VB
.AttribPtr
[i
].type
!= GL_FLOAT
){
69 WARN_ONCE("Unsupported format %d at index %d\n", rmesa
->state
.VB
.AttribPtr
[i
].type
, i
);
72 if(rmesa
->state
.VB
.AttribPtr
[i
].type
== GL_UNSIGNED_BYTE
&&
73 rmesa
->state
.VB
.AttribPtr
[i
].size
!= 4){
74 WARN_ONCE("Unsupported component count for ub colors\n");
78 /*fprintf(stderr, "%d: ", i);
80 switch(rmesa->state.VB.AttribPtr[i].type){
81 case GL_BYTE: fprintf(stderr, "byte "); break;
82 case GL_UNSIGNED_BYTE: fprintf(stderr, "u byte "); break;
83 case GL_SHORT: fprintf(stderr, "short "); break;
84 case GL_UNSIGNED_SHORT: fprintf(stderr, "u short "); break;
85 case GL_INT: fprintf(stderr, "int "); break;
86 case GL_UNSIGNED_INT: fprintf(stderr, "u int "); break;
87 case GL_FLOAT: fprintf(stderr, "float "); break;
88 case GL_2_BYTES: fprintf(stderr, "2 bytes "); break;
89 case GL_3_BYTES: fprintf(stderr, "3 bytes "); break;
90 case GL_4_BYTES: fprintf(stderr, "4 bytes "); break;
91 case GL_DOUBLE: fprintf(stderr, "double "); break;
92 default: fprintf(stderr, "unknown "); break;
95 fprintf(stderr, "Size %d ", rmesa->state.VB.AttribPtr[i].size);
96 fprintf(stderr, "Ptr %p ", rmesa->state.VB.AttribPtr[i].data);
97 fprintf(stderr, "Stride %d ", rmesa->state.VB.AttribPtr[i].stride);
98 fprintf(stderr, "\n");*/
103 void radeonDrawElements( GLenum mode
, GLsizei count
, GLenum type
, const GLvoid
*indices
)
105 GET_CURRENT_CONTEXT(ctx
);
106 r300ContextPtr rmesa
= R300_CONTEXT(ctx
);
109 unsigned int min
= ~0, max
= 0;
110 struct tnl_prim prim
;
111 static void *ptr
= NULL
;
112 static struct r300_dma_region rvb
;
114 if (ctx
->Array
.ElementArrayBufferObj
->Name
) {
115 /* use indices in the buffer object */
116 if (!ctx
->Array
.ElementArrayBufferObj
->Data
) {
117 _mesa_warning(ctx
, "DrawRangeElements with empty vertex elements buffer!");
120 /* actual address is the sum of pointers */
121 indices
= (const GLvoid
*)
122 ADD_POINTERS(ctx
->Array
.ElementArrayBufferObj
->Data
, (const GLubyte
*) indices
);
125 if (!_mesa_validate_DrawElements( ctx
, mode
, count
, type
, indices
))
128 FLUSH_CURRENT( ctx
, 0 );
130 fprintf(stderr, "dt at %s:\n", __FUNCTION__);
131 for(i=0; i < VERT_ATTRIB_MAX; i++){
132 fprintf(stderr, "dt %d:", i);
133 dump_dt(&rmesa->state.VB.AttribPtr[i], rmesa->state.VB.Count);
135 r300ReleaseDmaRegion(rmesa
, &rvb
, __FUNCTION__
);
138 case GL_UNSIGNED_BYTE
:
139 for (i
=0; i
< count
; i
++) {
140 if(((unsigned char *)indices
)[i
] < min
)
141 min
= ((unsigned char *)indices
)[i
];
142 if(((unsigned char *)indices
)[i
] > max
)
143 max
= ((unsigned char *)indices
)[i
];
148 r300AllocDmaRegion(rmesa
, &rvb
, count
* elt_size
, elt_size
);
149 rvb
.aos_offset
= GET_START(&rvb
);
150 ptr
= rvb
.address
+ rvb
.start
;
152 for (i
=0; i
< count
; i
++)
153 ((unsigned short int *)ptr
)[i
] = ((unsigned char *)indices
)[i
] - min
;
156 case GL_UNSIGNED_SHORT
:
157 for (i
=0; i
< count
; i
++) {
158 if(((unsigned short int *)indices
)[i
] < min
)
159 min
= ((unsigned short int *)indices
)[i
];
160 if(((unsigned short int *)indices
)[i
] > max
)
161 max
= ((unsigned short int *)indices
)[i
];
166 r300AllocDmaRegion(rmesa
, &rvb
, count
* elt_size
, elt_size
);
167 rvb
.aos_offset
= GET_START(&rvb
);
168 ptr
= rvb
.address
+ rvb
.start
;
170 for (i
=0; i
< count
; i
++)
171 ((unsigned short int *)ptr
)[i
] = ((unsigned short int *)indices
)[i
] - min
;
174 case GL_UNSIGNED_INT
:
175 for (i
=0; i
< count
; i
++) {
176 if(((unsigned int *)indices
)[i
] < min
)
177 min
= ((unsigned int *)indices
)[i
];
178 if(((unsigned int *)indices
)[i
] > max
)
179 max
= ((unsigned int *)indices
)[i
];
182 if (max
- min
<= 65535)
187 r300AllocDmaRegion(rmesa
, &rvb
, count
* elt_size
, elt_size
);
188 rvb
.aos_offset
= GET_START(&rvb
);
189 ptr
= rvb
.address
+ rvb
.start
;
192 if (max
- min
<= 65535)
193 for (i
=0; i
< count
; i
++)
194 ((unsigned short int *)ptr
)[i
] = ((unsigned int *)indices
)[i
] - min
;
196 for (i
=0; i
< count
; i
++)
197 ((unsigned int *)ptr
)[i
] = ((unsigned int *)indices
)[i
] - min
;
201 fprintf(stderr
, "Unknown elt type!\n");
208 _mesa_update_state( ctx
);
210 r300UpdateShaders(rmesa
);
212 if (rmesa
->state
.VB
.LockCount
) {
213 if (rmesa
->state
.VB
.lock_uptodate
== GL_FALSE
) {
214 if (setup_arrays(rmesa
, rmesa
->state
.VB
.LockFirst
))
217 rmesa
->state
.VB
.Count
= rmesa
->state
.VB
.LockCount
;
219 r300ReleaseArrays(ctx
);
220 r300EmitArraysVtx(ctx
, GL_FALSE
);
222 rmesa
->state
.VB
.lock_uptodate
= GL_TRUE
;
225 if (min
< rmesa
->state
.VB
.LockFirst
) {
226 WARN_ONCE("Out of range min %d vs %d!\n", min
, rmesa
->state
.VB
.LockFirst
);
230 if (max
>= rmesa
->state
.VB
.LockFirst
+ rmesa
->state
.VB
.LockCount
) {
231 WARN_ONCE("Out of range max %d vs %d!\n", max
, rmesa
->state
.VB
.LockFirst
+
232 rmesa
->state
.VB
.LockCount
);
236 if (setup_arrays(rmesa
, min
))
238 rmesa
->state
.VB
.Count
= max
- min
+ 1;
241 r300UpdateShaderStates(rmesa
);
243 rmesa
->state
.VB
.Primitive
= &prim
;
244 rmesa
->state
.VB
.PrimitiveCount
= 1;
246 prim
.mode
= mode
| PRIM_BEGIN
| PRIM_END
;
247 if (rmesa
->state
.VB
.LockCount
)
248 prim
.start
= min
- rmesa
->state
.VB
.LockFirst
;
253 rmesa
->state
.VB
.Elts
= ptr
;
254 rmesa
->state
.VB
.elt_size
= elt_size
;
256 r300_run_vb_render_vtxfmt_a(ctx
, NULL
);
259 radeon_mm_use(rmesa
, rvb
.buf
->id
);
262 void radeonDrawRangeElements(GLenum mode
, GLuint min
, GLuint max
, GLsizei count
, GLenum type
, const GLvoid
*indices
)
264 GET_CURRENT_CONTEXT(ctx
);
265 r300ContextPtr rmesa
= R300_CONTEXT(ctx
);
266 struct tnl_prim prim
;
270 static struct r300_dma_region rvb
;
272 if (ctx
->Array
.ElementArrayBufferObj
->Name
) {
273 /* use indices in the buffer object */
274 if (!ctx
->Array
.ElementArrayBufferObj
->Data
) {
275 _mesa_warning(ctx
, "DrawRangeElements with empty vertex elements buffer!");
278 /* actual address is the sum of pointers */
279 indices
= (const GLvoid
*)
280 ADD_POINTERS(ctx
->Array
.ElementArrayBufferObj
->Data
, (const GLubyte
*) indices
);
283 if (!_mesa_validate_DrawRangeElements( ctx
, mode
, min
, max
, count
, type
, indices
))
286 FLUSH_CURRENT( ctx
, 0 );
290 r300ReleaseDmaRegion(rmesa
, &rvb
, __FUNCTION__
);
293 case GL_UNSIGNED_BYTE
:
296 r300AllocDmaRegion(rmesa
, &rvb
, count
* elt_size
, elt_size
);
297 rvb
.aos_offset
= GET_START(&rvb
);
298 ptr
= rvb
.address
+ rvb
.start
;
300 for(i
=0; i
< count
; i
++)
301 ((unsigned short int *)ptr
)[i
] = ((unsigned char *)indices
)[i
] - min
;
304 case GL_UNSIGNED_SHORT
:
308 if (min
== 0 && ctx
->Array
.ElementArrayBufferObj
->Name
){
313 r300AllocDmaRegion(rmesa
, &rvb
, count
* elt_size
, elt_size
);
314 rvb
.aos_offset
= GET_START(&rvb
);
315 ptr
= rvb
.address
+ rvb
.start
;
317 for(i
=0; i
< count
; i
++)
318 ((unsigned short int *)ptr
)[i
] = ((unsigned short int *)indices
)[i
] - min
;
321 case GL_UNSIGNED_INT
:
322 if (max
- min
<= 65535)
327 r300AllocDmaRegion(rmesa
, &rvb
, count
* elt_size
, elt_size
);
328 rvb
.aos_offset
= GET_START(&rvb
);
329 ptr
= rvb
.address
+ rvb
.start
;
331 if (max
- min
<= 65535)
332 for (i
=0; i
< count
; i
++)
333 ((unsigned short int *)ptr
)[i
] = ((unsigned int *)indices
)[i
] - min
;
335 for (i
=0; i
< count
; i
++)
336 ((unsigned int *)ptr
)[i
] = ((unsigned int *)indices
)[i
] - min
;
340 fprintf(stderr
, "Unknown elt type!\n");
345 /* XXX: setup_arrays before state update? */
348 _mesa_update_state( ctx
);
350 r300UpdateShaders(rmesa
);
352 if (rmesa
->state
.VB
.LockCount
) {
353 if (rmesa
->state
.VB
.lock_uptodate
== GL_FALSE
) {
354 if (setup_arrays(rmesa
, rmesa
->state
.VB
.LockFirst
))
357 rmesa
->state
.VB
.Count
= rmesa
->state
.VB
.LockCount
;
359 r300ReleaseArrays(ctx
);
360 r300EmitArraysVtx(ctx
, GL_FALSE
);
362 rmesa
->state
.VB
.lock_uptodate
= GL_TRUE
;
365 if (min
< rmesa
->state
.VB
.LockFirst
) {
366 WARN_ONCE("Out of range min %d vs %d!\n", min
, rmesa
->state
.VB
.LockFirst
);
370 /*if (max >= rmesa->state.VB.LockFirst + rmesa->state.VB.LockCount) {
371 WARN_ONCE("Out of range max %d vs %d!\n", max, rmesa->state.VB.LockFirst +
372 rmesa->state.VB.LockCount);
376 if (setup_arrays(rmesa
, min
))
378 rmesa
->state
.VB
.Count
= max
- min
+ 1;
381 r300UpdateShaderStates(rmesa
);
383 rmesa
->state
.VB
.Primitive
= &prim
;
384 rmesa
->state
.VB
.PrimitiveCount
= 1;
386 prim
.mode
= mode
| PRIM_BEGIN
| PRIM_END
;
387 if (rmesa
->state
.VB
.LockCount
)
388 prim
.start
= min
- rmesa
->state
.VB
.LockFirst
;
393 rmesa
->state
.VB
.Elts
= ptr
;
394 rmesa
->state
.VB
.elt_size
= elt_size
;
395 rmesa
->state
.VB
.elt_min
= min
;
396 rmesa
->state
.VB
.elt_max
= max
;
398 r300_run_vb_render_vtxfmt_a(ctx
, NULL
);
401 radeon_mm_use(rmesa
, rvb
.buf
->id
);
404 void radeonDrawArrays( GLenum mode
, GLint start
, GLsizei count
)
406 GET_CURRENT_CONTEXT(ctx
);
407 r300ContextPtr rmesa
= R300_CONTEXT(ctx
);
408 struct tnl_prim prim
;
410 if (!_mesa_validate_DrawArrays( ctx
, mode
, start
, count
))
413 FLUSH_CURRENT( ctx
, 0 );
416 _mesa_update_state( ctx
);
418 /* XXX: setup_arrays before state update? */
420 r300UpdateShaders(rmesa
);
422 if (rmesa
->state
.VB
.LockCount
) {
423 if (rmesa
->state
.VB
.lock_uptodate
== GL_FALSE
) {
424 if (setup_arrays(rmesa
, rmesa
->state
.VB
.LockFirst
))
427 rmesa
->state
.VB
.Count
= rmesa
->state
.VB
.LockCount
;
429 r300ReleaseArrays(ctx
);
430 r300EmitArraysVtx(ctx
, GL_FALSE
);
432 rmesa
->state
.VB
.lock_uptodate
= GL_TRUE
;
435 if (start
< rmesa
->state
.VB
.LockFirst
) {
436 WARN_ONCE("Out of range min %d vs %d!\n", start
, rmesa
->state
.VB
.LockFirst
);
440 if (start
+ count
- 1 >= rmesa
->state
.VB
.LockFirst
+ rmesa
->state
.VB
.LockCount
) { /* XXX */
441 WARN_ONCE("Out of range max %d vs %d!\n", start
+ count
- 1, rmesa
->state
.VB
.LockFirst
+
442 rmesa
->state
.VB
.LockCount
);
446 if (setup_arrays(rmesa
, start
))
448 rmesa
->state
.VB
.Count
= count
;
451 r300UpdateShaderStates(rmesa
);
453 rmesa
->state
.VB
.Primitive
= &prim
;
454 rmesa
->state
.VB
.PrimitiveCount
= 1;
456 prim
.mode
= mode
| PRIM_BEGIN
| PRIM_END
;
457 if (rmesa
->state
.VB
.LockCount
)
458 prim
.start
= start
- rmesa
->state
.VB
.LockFirst
;
463 rmesa
->state
.VB
.Elts
= NULL
;
464 rmesa
->state
.VB
.elt_size
= 0;
465 rmesa
->state
.VB
.elt_min
= 0;
466 rmesa
->state
.VB
.elt_max
= 0;
468 r300_run_vb_render_vtxfmt_a(ctx
, NULL
);
471 void radeon_init_vtxfmt_a(r300ContextPtr rmesa
)
474 GLvertexformat
*vfmt
;
476 ctx
= rmesa
->radeon
.glCtx
;
477 vfmt
= ctx
->TnlModule
.Current
;
479 vfmt
->DrawElements
= radeonDrawElements
;
480 vfmt
->DrawArrays
= radeonDrawArrays
;
481 vfmt
->DrawRangeElements
= radeonDrawRangeElements
;
488 void radeonLockArraysEXT(GLcontext
*ctx
, GLint first
, GLsizei count
)
490 r300ContextPtr rmesa
= R300_CONTEXT(ctx
);
493 /* Only when CB_DPATH is defined.
494 r300Clear tampers over the aos setup without it.
495 (r300ResetHwState cannot call r300EmitArrays)
498 first
= 0; count
= 0;
501 if (first
< 0 || count
<= 0) {
502 rmesa
->state
.VB
.LockFirst
= 0;
503 rmesa
->state
.VB
.LockCount
= 0;
504 rmesa
->state
.VB
.lock_uptodate
= GL_FALSE
;
508 rmesa
->state
.VB
.LockFirst
= first
;
509 rmesa
->state
.VB
.LockCount
= count
;
510 rmesa
->state
.VB
.lock_uptodate
= GL_FALSE
;
513 void radeonUnlockArraysEXT(GLcontext
*ctx
)
515 r300ContextPtr rmesa
= R300_CONTEXT(ctx
);
517 rmesa
->state
.VB
.LockFirst
= 0;
518 rmesa
->state
.VB
.LockCount
= 0;
519 rmesa
->state
.VB
.lock_uptodate
= GL_FALSE
;
522 struct gl_buffer_object
*
523 r300NewBufferObject(GLcontext
*ctx
, GLuint name
, GLenum target
)
525 struct r300_buffer_object
*obj
;
529 obj
= MALLOC_STRUCT(r300_buffer_object
);
530 _mesa_initialize_buffer_object(&obj
->mesa_obj
, name
, target
);
531 return &obj
->mesa_obj
;
534 void r300BufferData(GLcontext
*ctx
, GLenum target
, GLsizeiptrARB size
,
535 const GLvoid
*data
, GLenum usage
, struct gl_buffer_object
*obj
)
537 r300ContextPtr rmesa
= R300_CONTEXT(ctx
);
538 struct r300_buffer_object
*r300_obj
= (struct r300_buffer_object
*)obj
;
539 drm_radeon_mem_alloc_t alloc
;
542 /* Free previous buffer */
544 radeon_mm_free(rmesa
, r300_obj
->id
);
545 obj
->OnCard
= GL_FALSE
;
553 if (target
== GL_ELEMENT_ARRAY_BUFFER_ARB
) {
555 obj
->Data
= malloc(size
);
558 memcpy(obj
->Data
, data
, size
);
560 obj
->OnCard
= GL_FALSE
;
562 r300_obj
->id
= radeon_mm_alloc(rmesa
, 4, size
);
563 obj
->Data
= radeon_mm_map(rmesa
, r300_obj
->id
, RADEON_MM_W
);
566 memcpy(obj
->Data
, data
, size
);
568 radeon_mm_unmap(rmesa
, r300_obj
->id
);
569 obj
->OnCard
= GL_TRUE
;
576 void r300BufferSubData(GLcontext
*ctx
, GLenum target
, GLintptrARB offset
,
577 GLsizeiptrARB size
, const GLvoid
* data
, struct gl_buffer_object
* bufObj
)
579 r300ContextPtr rmesa
= R300_CONTEXT(ctx
);
580 struct r300_buffer_object
*r300_obj
= (struct r300_buffer_object
*)bufObj
;
581 (void) ctx
; (void) target
;
584 if (bufObj
->Data
&& ((GLuint
) (size
+ offset
) <= bufObj
->Size
)) {
586 ptr
= radeon_mm_map(rmesa
, r300_obj
->id
, RADEON_MM_W
);
588 _mesa_memcpy( (GLubyte
*) ptr
+ offset
, data
, size
);
590 radeon_mm_unmap(rmesa
, r300_obj
->id
);
592 _mesa_memcpy( (GLubyte
*) bufObj
->Data
+ offset
, data
, size
);
597 void *r300MapBuffer(GLcontext
*ctx
, GLenum target
, GLenum access
,
598 struct gl_buffer_object
*bufObj
)
600 r300ContextPtr rmesa
= R300_CONTEXT(ctx
);
601 struct r300_buffer_object
*r300_obj
= (struct r300_buffer_object
*)bufObj
;
606 //ASSERT(!bufObj->OnCard);
607 /* Just return a direct pointer to the data */
608 if (bufObj
->Pointer
) {
609 /* already mapped! */
613 if (!bufObj
->OnCard
) {
614 bufObj
->Pointer
= bufObj
->Data
;
615 return bufObj
->Pointer
;
620 bufObj
->Pointer
= radeon_mm_map(rmesa
, r300_obj
->id
, RADEON_MM_R
);
624 bufObj
->Pointer
= radeon_mm_map(rmesa
, r300_obj
->id
, RADEON_MM_W
);
628 bufObj
->Pointer
= radeon_mm_map(rmesa
, r300_obj
->id
, RADEON_MM_RW
);
632 WARN_ONCE("Unknown access type\n");
633 bufObj
->Pointer
= NULL
;
637 return bufObj
->Pointer
;
640 GLboolean
r300UnmapBuffer(GLcontext
*ctx
, GLenum target
, struct gl_buffer_object
*bufObj
)
642 r300ContextPtr rmesa
= R300_CONTEXT(ctx
);
643 struct r300_buffer_object
*r300_obj
= (struct r300_buffer_object
*)bufObj
;
647 //ASSERT(!bufObj->OnCard);
648 /* XXX we might assert here that bufObj->Pointer is non-null */
649 if (!bufObj
->OnCard
) {
650 bufObj
->Pointer
= NULL
;
653 radeon_mm_unmap(rmesa
, r300_obj
->id
);
655 bufObj
->Pointer
= NULL
;
659 void r300DeleteBuffer(GLcontext
*ctx
, struct gl_buffer_object
*obj
)
661 r300ContextPtr rmesa
= R300_CONTEXT(ctx
);
662 struct r300_buffer_object
*r300_obj
= (struct r300_buffer_object
*)obj
;
665 radeon_mm_free(rmesa
, r300_obj
->id
);
668 _mesa_delete_buffer_object(ctx
, obj
);
671 void r300_init_vbo_funcs(struct dd_function_table
*functions
)
673 functions
->NewBufferObject
= r300NewBufferObject
;
674 functions
->BufferData
= r300BufferData
;
675 functions
->BufferSubData
= r300BufferSubData
;
676 functions
->MapBuffer
= r300MapBuffer
;
677 functions
->UnmapBuffer
= r300UnmapBuffer
;
678 functions
->DeleteBuffer
= r300DeleteBuffer
;
680 functions
->LockArraysEXT
= radeonLockArraysEXT
;
681 functions
->UnlockArraysEXT
= radeonUnlockArraysEXT
;