2 * Copyright 1998-2003 VIA Technologies, Inc. All Rights Reserved.
3 * Copyright 2001-2003 S3 Graphics, Inc. All Rights Reserved.
5 * Permission is hereby granted, free of charge, to any person obtaining a
6 * copy of this software and associated documentation files (the "Software"),
7 * to deal in the Software without restriction, including without limitation
8 * the rights to use, copy, modify, merge, publish, distribute, sub license,
9 * and/or sell copies of the Software, and to permit persons to whom the
10 * Software is furnished to do so, subject to the following conditions:
12 * The above copyright notice and this permission notice (including the
13 * next paragraph) shall be included in all copies or substantial portions
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
19 * VIA, S3 GRAPHICS, AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
20 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
21 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
22 * DEALINGS IN THE SOFTWARE.
31 #include "swrast/swrast.h"
34 #include "via_context.h"
36 #include "via_ioctl.h"
37 #include "via_state.h"
42 #include <sys/ioctl.h>
46 #define VIA_REG_STATUS 0x400
47 #define VIA_REG_GEMODE 0x004
48 #define VIA_REG_SRCBASE 0x030
49 #define VIA_REG_DSTBASE 0x034
50 #define VIA_REG_PITCH 0x038
51 #define VIA_REG_SRCCOLORKEY 0x01C
52 #define VIA_REG_KEYCONTROL 0x02C
53 #define VIA_REG_SRCPOS 0x008
54 #define VIA_REG_DSTPOS 0x00C
55 #define VIA_REG_GECMD 0x000
56 #define VIA_REG_DIMENSION 0x010 /* width and height */
57 #define VIA_REG_FGCOLOR 0x018
59 #define VIA_GEM_8bpp 0x00000000
60 #define VIA_GEM_16bpp 0x00000100
61 #define VIA_GEM_32bpp 0x00000300
62 #define VIA_GEC_BLT 0x00000001
63 #define VIA_PITCH_ENABLE 0x80000000
64 #define VIA_GEC_INCX 0x00000000
65 #define VIA_GEC_DECY 0x00004000
66 #define VIA_GEC_INCY 0x00000000
67 #define VIA_GEC_DECX 0x00008000
68 #define VIA_GEC_FIXCOLOR_PAT 0x00002000
71 #define VIA_BLIT_CLEAR 0x00
72 #define VIA_BLIT_COPY 0xCC
73 #define VIA_BLIT_FILL 0xF0
74 #define VIA_BLIT_SET 0xFF
76 static void dump_dma( viaContextPtr vmesa
)
79 GLuint
*data
= (GLuint
*)vmesa
->dma
;
80 for (i
= 0; i
< vmesa
->dmaLow
; i
+= 16) {
81 fprintf(stderr
, "%04x: ", i
);
82 fprintf(stderr
, "%08x ", *data
++);
83 fprintf(stderr
, "%08x ", *data
++);
84 fprintf(stderr
, "%08x ", *data
++);
85 fprintf(stderr
, "%08x\n", *data
++);
87 fprintf(stderr
, "******************************************\n");
92 void viaCheckDma(viaContextPtr vmesa
, GLuint bytes
)
94 VIA_FINISH_PRIM( vmesa
);
95 if (vmesa
->dmaLow
+ bytes
> VIA_DMA_HIGHWATER
) {
102 #define SetReg2DAGP(nReg, nData) do { \
103 OUT_RING( ((nReg) >> 2) | 0xF0000000 ); \
108 static void viaBlit(viaContextPtr vmesa
, GLuint bpp
,
109 GLuint srcBase
, GLuint srcPitch
,
110 GLuint dstBase
, GLuint dstPitch
,
113 GLuint color
, GLuint nMask
)
116 GLuint dwGEMode
, srcX
, dstX
, cmd
;
120 fprintf(stderr
, "%s bpp %d src %x/%x dst %x/%x w %d h %d mode: %x color: 0x%08x mask 0x%08x\n",
121 __FUNCTION__
, bpp
, srcBase
, srcPitch
, dstBase
, dstPitch
, w
,h
, blitMode
, color
, nMask
);
129 dwGEMode
= VIA_GEM_16bpp
;
130 srcX
= (srcBase
& 0x1f) >> 1;
131 dstX
= (dstBase
& 0x1f) >> 1;
134 dwGEMode
= VIA_GEM_32bpp
;
135 srcX
= (srcBase
& 0x1f) >> 2;
136 dstX
= (dstBase
& 0x1f) >> 2;
144 cmd
= VIA_GEC_BLT
| VIA_GEC_FIXCOLOR_PAT
| (VIA_BLIT_FILL
<< 24);
147 cmd
= VIA_GEC_BLT
| (VIA_BLIT_COPY
<< 24);
154 SetReg2DAGP( VIA_REG_GEMODE
, dwGEMode
);
155 SetReg2DAGP( VIA_REG_FGCOLOR
, color
);
156 SetReg2DAGP( 0x2C, nMask
);
157 SetReg2DAGP( VIA_REG_SRCBASE
, (srcBase
& ~0x1f) >> 3);
158 SetReg2DAGP( VIA_REG_DSTBASE
, (dstBase
& ~0x1f) >> 3);
159 SetReg2DAGP( VIA_REG_PITCH
, VIA_PITCH_ENABLE
|
160 (srcPitch
>> 3) | ((dstPitch
>> 3) << 16));
161 SetReg2DAGP( VIA_REG_SRCPOS
, srcX
);
162 SetReg2DAGP( VIA_REG_DSTPOS
, dstX
);
163 SetReg2DAGP( VIA_REG_DIMENSION
, (((h
- 1) << 16) | (w
- 1)));
164 SetReg2DAGP( VIA_REG_GECMD
, cmd
);
165 SetReg2DAGP( 0x2C, 0x00000000);
169 static void viaFillBuffer(viaContextPtr vmesa
,
171 drm_clip_rect_t
*pbox
,
176 GLuint bytePerPixel
= buffer
->bpp
>> 3;
179 for (i
= 0; i
< nboxes
; i
++) {
180 int x
= pbox
[i
].x1
- vmesa
->drawX
;
181 int y
= pbox
[i
].y1
- vmesa
->drawY
;
182 int w
= pbox
[i
].x2
- pbox
[i
].x1
;
183 int h
= pbox
[i
].y2
- pbox
[i
].y1
;
185 int offset
= (buffer
->orig
+
191 offset
, buffer
->pitch
,
192 offset
, buffer
->pitch
,
194 VIA_BLIT_FILL
, pixel
, mask
);
200 static void viaClear(GLcontext
*ctx
, GLbitfield mask
, GLboolean all
,
201 GLint cx
, GLint cy
, GLint cw
, GLint ch
)
203 viaContextPtr vmesa
= VIA_CONTEXT(ctx
);
204 __DRIdrawablePrivate
*dPriv
= vmesa
->driDrawable
;
207 GLuint clear_depth_mask
= 0xf << 28;
208 GLuint clear_depth
= 0;
210 VIA_FLUSH_DMA(vmesa
);
212 if (mask
& DD_FRONT_LEFT_BIT
) {
214 mask
&= ~DD_FRONT_LEFT_BIT
;
217 if (mask
& DD_BACK_LEFT_BIT
) {
219 mask
&= ~DD_BACK_LEFT_BIT
;
222 if (mask
& DD_DEPTH_BIT
) {
224 clear_depth
= (GLuint
)(ctx
->Depth
.Clear
* vmesa
->ClearDepth
);
225 clear_depth_mask
&= ~vmesa
->depth_clear_mask
;
226 mask
&= ~DD_DEPTH_BIT
;
229 if (mask
& DD_STENCIL_BIT
) {
230 if (vmesa
->have_hw_stencil
) {
231 if (ctx
->Stencil
.WriteMask
[0] == 0xff) {
233 clear_depth
&= ~0xff;
234 clear_depth
|= (ctx
->Stencil
.Clear
& 0xff);
235 clear_depth_mask
&= ~vmesa
->stencil_clear_mask
;
236 mask
&= ~DD_STENCIL_BIT
;
240 fprintf(stderr
, "XXX: Clear stencil writemask %x -- need triangles (or a ROP?)\n",
241 ctx
->Stencil
.WriteMask
[0]);
247 drm_clip_rect_t
*boxes
, *tmp_boxes
= 0;
250 LOCK_HARDWARE(vmesa
);
252 /* flip top to bottom */
253 cy
= dPriv
->h
- cy
- ch
;
254 cx
+= vmesa
->drawX
+ vmesa
->drawXoff
;
258 drm_clip_rect_t
*b
= vmesa
->pClipRects
;
260 boxes
= tmp_boxes
= (drm_clip_rect_t
*)malloc(vmesa
->numClipRects
*
261 sizeof(drm_clip_rect_t
));
263 UNLOCK_HARDWARE(vmesa
);
267 for (; i
< vmesa
->numClipRects
; i
++) {
270 GLint w
= b
[i
].x2
- x
;
271 GLint h
= b
[i
].y2
- y
;
273 if (x
< cx
) w
-= cx
- x
, x
= cx
;
274 if (y
< cy
) h
-= cy
- y
, y
= cy
;
275 if (x
+ w
> cx
+ cw
) w
= cx
+ cw
- x
;
276 if (y
+ h
> cy
+ ch
) h
= cy
+ ch
- y
;
277 if (w
<= 0) continue;
278 if (h
<= 0) continue;
282 boxes
[nr
].x2
= x
+ w
;
283 boxes
[nr
].y2
= y
+ h
;
288 boxes
= vmesa
->pClipRects
;
289 nr
= vmesa
->numClipRects
;
292 if (flag
& VIA_FRONT
) {
293 viaFillBuffer(vmesa
, &vmesa
->front
, boxes
, nr
, vmesa
->ClearColor
, vmesa
->ClearMask
);
296 if (flag
& VIA_BACK
) {
297 viaFillBuffer(vmesa
, &vmesa
->back
, boxes
, nr
, vmesa
->ClearColor
, vmesa
->ClearMask
);
300 if (flag
& VIA_DEPTH
) {
301 viaFillBuffer(vmesa
, &vmesa
->depth
, boxes
, nr
, clear_depth
, clear_depth_mask
);
304 viaFlushDmaLocked(vmesa
, VIA_NO_CLIPRECTS
);
305 UNLOCK_HARDWARE(vmesa
);
312 _swrast_Clear(ctx
, mask
, all
, cx
, cy
, cw
, ch
);
318 static void viaDoSwapBuffers(viaContextPtr vmesa
,
322 GLuint bytePerPixel
= vmesa
->viaScreen
->bitsPerPixel
>> 3;
323 viaBuffer
*front
= &vmesa
->front
;
324 viaBuffer
*back
= &vmesa
->back
;
327 for (i
= 0; i
< nbox
; i
++, b
++) {
328 GLint x
= b
->x1
- vmesa
->drawX
;
329 GLint y
= b
->y1
- vmesa
->drawY
;
330 GLint w
= b
->x2
- b
->x1
;
331 GLint h
= b
->y2
- b
->y1
;
333 GLuint src
= back
->orig
+ y
* back
->pitch
+ x
* bytePerPixel
;
334 GLuint dest
= front
->orig
+ y
* front
->pitch
+ x
* bytePerPixel
;
341 VIA_BLIT_COPY
, 0, 0);
349 * Copy the back buffer to the front buffer.
351 void viaCopyBuffer(const __DRIdrawablePrivate
*dPriv
)
353 viaContextPtr vmesa
= (viaContextPtr
)dPriv
->driContextPriv
->driverPrivate
;
354 GLboolean missed_target
;
356 VIA_FLUSH_DMA(vmesa
);
357 driWaitForVBlank( dPriv
, & vmesa
->vbl_seq
, vmesa
->vblank_flags
, & missed_target
);
358 if ( missed_target
) {
359 vmesa
->swap_missed_count
++;
360 vmesa
->get_ust( &vmesa
->swap_missed_ust
);
362 LOCK_HARDWARE(vmesa
);
364 viaDoSwapBuffers(vmesa
, dPriv
->pClipRects
, dPriv
->numClipRects
);
365 viaFlushDmaLocked(vmesa
, VIA_NO_CLIPRECTS
);
367 UNLOCK_HARDWARE(vmesa
);
369 vmesa
->get_ust( &vmesa
->swap_ust
);
373 * XXX implement when full-screen extension is done.
375 void viaPageFlip(const __DRIdrawablePrivate
*dPriv
)
377 viaContextPtr vmesa
= (viaContextPtr
)dPriv
->driContextPriv
->driverPrivate
;
378 viaBuffer buffer_tmp
;
379 GLboolean missed_target
;
382 VIA_FLUSH_DMA(vmesa
);
383 driWaitForVBlank( dPriv
, &vmesa
->vbl_seq
, vmesa
->vblank_flags
, &missed_target
);
384 if ( missed_target
) {
385 vmesa
->swap_missed_count
++;
386 vmesa
->get_ust( &vmesa
->swap_missed_ust
);
388 LOCK_HARDWARE(vmesa
);
393 if (!vmesa
->nDoneFirstFlip
) {
394 vmesa
->nDoneFirstFlip
= GL_FALSE
; /* XXX: FIXME LATER!!! */
396 OUT_RING(HALCYON_HEADER2
);
397 OUT_RING(0x00fe0000);
398 OUT_RING(0x0000000e);
399 OUT_RING(0x0000000e);
404 OUT_RING( HALCYON_HEADER2
);
405 OUT_RING( 0x00fe0000 );
406 OUT_RING((HC_SubA_HFBBasL
<< 24) | (vmesa
->back
.offset
& 0xFFFFF8) | 0x2);
407 OUT_RING((HC_SubA_HFBDrawFirst
<< 24) |
408 ((vmesa
->back
.offset
& 0xFF000000) >> 24) | 0x0100);
413 viaFlushDmaLocked(vmesa
, VIA_NO_CLIPRECTS
);
414 UNLOCK_HARDWARE(vmesa
);
416 vmesa
->get_ust( &vmesa
->swap_ust
);
418 /* KW: FIXME: When buffers are freed, could free frontbuffer by
421 memcpy(&buffer_tmp
, &vmesa
->back
, sizeof(viaBuffer
));
422 memcpy(&vmesa
->back
, &vmesa
->front
, sizeof(viaBuffer
));
423 memcpy(&vmesa
->front
, &buffer_tmp
, sizeof(viaBuffer
));
425 if(vmesa
->currentPage
) {
426 vmesa
->currentPage
= 0;
429 vmesa
->currentPage
= 1;
432 if (VIA_DEBUG
) fprintf(stderr
, "%s - out\n", __FUNCTION__
);
438 #define VIA_CMDBUF_MAX_LAG 50000
440 static int fire_buffer(viaContextPtr vmesa
)
442 drm_via_cmdbuffer_t bufI
;
445 bufI
.buf
= (char *)vmesa
->dma
;
446 bufI
.size
= vmesa
->dmaLow
;
449 drm_via_cmdbuf_size_t bSiz
;
451 /* Do the CMDBUF_SIZE ioctl:
453 bSiz
.func
= VIA_CMDBUF_LAG
;
455 bSiz
.size
= VIA_CMDBUF_MAX_LAG
;
457 ret
= drmCommandWriteRead(vmesa
->driFd
, DRM_VIA_CMDBUF_SIZE
,
458 &bSiz
, sizeof(bSiz
));
459 } while (ret
== -EAGAIN
);
461 UNLOCK_HARDWARE(vmesa
);
462 fprintf(stderr
, "%s: DRM_VIA_CMDBUF_SIZE returned %d\n", __FUNCTION__
, ret
);
467 /* Actually fire the buffer:
470 ret
= drmCommandWrite(vmesa
->driFd
, DRM_VIA_CMDBUFFER
,
471 &bufI
, sizeof(bufI
));
472 } while (ret
== -EAGAIN
);
474 UNLOCK_HARDWARE(vmesa
);
475 fprintf(stderr
, "%s: DRM_VIA_CMDBUFFER returned %d\n", __FUNCTION__
, ret
);
477 /* If this fails, the original code fell back to the PCI path.
483 /* Fall through to PCI handling?!?
488 ret
= drmCommandWrite(vmesa
->driFd
, DRM_VIA_PCICMD
, &bufI
, sizeof(bufI
));
490 UNLOCK_HARDWARE(vmesa
);
492 fprintf(stderr
, "%s: DRM_VIA_PCICMD returned %d\n", __FUNCTION__
, ret
);
500 /* Inserts the surface addresss and active cliprects one at a time
501 * into the head of the DMA buffer being flushed. Fires the buffer
504 static void via_emit_cliprect(viaContextPtr vmesa
,
507 viaBuffer
*buffer
= vmesa
->drawBuffer
;
508 GLuint
*vb
= (GLuint
*)(vmesa
->dma
+ vmesa
->dmaCliprectAddr
);
510 GLuint format
= (vmesa
->viaScreen
->bitsPerPixel
== 0x20
514 GLuint pitch
= buffer
->pitch
;
515 GLuint offset
= buffer
->orig
;
518 fprintf(stderr
, "emit cliprect for box %d,%d %d,%d\n", b
->x1
, b
->y1
, b
->x2
, b
->y2
);
521 vb
[1] = (HC_ParaType_NotTex
<< 16);
523 if (vmesa
->driDrawable
->w
== 0 || vmesa
->driDrawable
->h
== 0) {
524 vb
[2] = (HC_SubA_HClipTB
<< 24) | 0x0;
525 vb
[3] = (HC_SubA_HClipLR
<< 24) | 0x0;
528 vb
[2] = (HC_SubA_HClipTB
<< 24) | (b
->y1
<< 12) | b
->y2
;
529 vb
[3] = (HC_SubA_HClipLR
<< 24) | (b
->x1
<< 12) | b
->x2
;
532 vb
[4] = ((HC_SubA_HDBBasL
<< 24) | (offset
& 0xFFFFFF));
533 vb
[5] = ((HC_SubA_HDBBasH
<< 24) | ((offset
& 0xFF000000)) >> 24);
535 /* HSPXYOS seems to be ignored on CLE266, don't emit. This is
536 * required for hardware stipple conformance (as long as we still
539 if (vmesa
->viaScreen
->deviceID
== VIA_CLE266
) {
541 vb
[7] = ((HC_SubA_HDBFM
<< 24) | HC_HDBLoc_Local
| format
| pitch
);
544 vb
[6] = ((HC_SubA_HDBFM
<< 24) | HC_HDBLoc_Local
| format
| pitch
);
545 vb
[7] = ((HC_SubA_HSPXYOS
<< 24) | ((32 - vmesa
->drawXoff
) << HC_HSPXOS_SHIFT
));
551 static int intersect_rect(drm_clip_rect_t
*out
,
558 fprintf(stderr
, "intersect %d,%d %d,%d and %d,%d %d,%d\n",
559 a
->x1
, a
->y1
, a
->x2
, a
->y2
,
560 b
->x1
, b
->y1
, b
->x2
, b
->y2
);
562 if (b
->x1
> out
->x1
) out
->x1
= b
->x1
;
563 if (b
->x2
< out
->x2
) out
->x2
= b
->x2
;
564 if (out
->x1
>= out
->x2
) return 0;
566 if (b
->y1
> out
->y1
) out
->y1
= b
->y1
;
567 if (b
->y2
< out
->y2
) out
->y2
= b
->y2
;
568 if (out
->y1
>= out
->y2
) return 0;
573 void viaFlushDmaLocked(viaContextPtr vmesa
, GLuint flags
)
579 fprintf(stderr
, "%s\n", __FUNCTION__
);
581 if (*(GLuint
*)vmesa
->driHwLock
!= (DRM_LOCK_HELD
|vmesa
->hHWContext
) &&
582 *(GLuint
*)vmesa
->driHwLock
!= (DRM_LOCK_HELD
|DRM_LOCK_CONT
|vmesa
->hHWContext
)) {
583 fprintf(stderr
, "%s called without lock held\n", __FUNCTION__
);
587 if (vmesa
->dmaLow
== 0) {
591 assert(vmesa
->dmaLastPrim
== 0);
593 /* viaFinishPrimitive can add up to 8 bytes beyond VIA_DMA_HIGHWATER:
595 if (vmesa
->dmaLow
> VIA_DMA_HIGHWATER
+ 8) {
596 fprintf(stderr
, "buffer overflow in Flush Prims = %d\n",vmesa
->dmaLow
);
600 switch (vmesa
->dmaLow
& 0x1F) {
602 BEGIN_RING_NOCHECK( 6 );
603 OUT_RING( HC_HEADER2
);
604 OUT_RING( (HC_ParaType_NotTex
<< 16) );
605 OUT_RING( HC_DUMMY
);
606 OUT_RING( HC_DUMMY
);
607 OUT_RING( HC_DUMMY
);
608 OUT_RING( HC_DUMMY
);
612 BEGIN_RING_NOCHECK( 4 );
613 OUT_RING( HC_HEADER2
);
614 OUT_RING( (HC_ParaType_NotTex
<< 16) );
615 OUT_RING( HC_DUMMY
);
616 OUT_RING( HC_DUMMY
);
620 BEGIN_RING_NOCHECK( 10 );
621 OUT_RING( HC_HEADER2
);
622 OUT_RING( (HC_ParaType_NotTex
<< 16) );
623 OUT_RING( HC_DUMMY
);
624 OUT_RING( HC_DUMMY
);
625 OUT_RING( HC_DUMMY
);
626 OUT_RING( HC_DUMMY
);
627 OUT_RING( HC_DUMMY
);
628 OUT_RING( HC_DUMMY
);
629 OUT_RING( HC_DUMMY
);
630 OUT_RING( HC_DUMMY
);
637 fprintf(stderr
, "%s: unaligned value for vmesa->dmaLow: %x\n",
638 __FUNCTION__
, vmesa
->dmaLow
);
645 if (flags
& VIA_NO_CLIPRECTS
) {
646 if (0) fprintf(stderr
, "%s VIA_NO_CLIPRECTS\n", __FUNCTION__
);
647 assert(vmesa
->dmaCliprectAddr
== ~0);
648 fire_buffer( vmesa
);
650 else if (vmesa
->dmaCliprectAddr
== ~0) {
651 /* Contains only state. Could just dump the packet?
653 if (0) fprintf(stderr
, "%s: no dmaCliprectAddr\n", __FUNCTION__
);
654 if (0) fire_buffer( vmesa
);
656 else if (vmesa
->numClipRects
) {
657 drm_clip_rect_t
*pbox
= vmesa
->pClipRects
;
658 if (0) fprintf(stderr
, "%s: %d cliprects\n", __FUNCTION__
, vmesa
->numClipRects
);
660 for (i
= 0; i
< vmesa
->numClipRects
; i
++) {
663 b
.x1
= pbox
[i
].x1
- (vmesa
->drawX
+ vmesa
->drawXoff
);
664 b
.x2
= pbox
[i
].x2
- (vmesa
->drawX
+ vmesa
->drawXoff
);
665 b
.y1
= pbox
[i
].y1
- vmesa
->drawY
;
666 b
.y2
= pbox
[i
].y2
- vmesa
->drawY
;
668 if (vmesa
->glCtx
->Scissor
.Enabled
&&
669 !intersect_rect(&b
, &b
, &vmesa
->scissorRect
))
672 b
.x1
+= vmesa
->drawXoff
;
673 b
.x2
+= vmesa
->drawXoff
;
675 via_emit_cliprect(vmesa
, &b
);
677 if (fire_buffer(vmesa
) != 0) {
683 if (0) fprintf(stderr
, "%s: no cliprects\n", __FUNCTION__
);
684 UNLOCK_HARDWARE(vmesa
);
686 LOCK_HARDWARE(vmesa
);
693 vmesa
->dmaCliprectAddr
= ~0;
694 vmesa
->newEmitState
= ~0;
697 void viaWrapPrimitive( viaContextPtr vmesa
)
699 GLenum renderPrimitive
= vmesa
->renderPrimitive
;
700 GLenum hwPrimitive
= vmesa
->hwPrimitive
;
702 if (VIA_DEBUG
) fprintf(stderr
, "%s\n", __FUNCTION__
);
704 if (vmesa
->dmaLastPrim
)
705 viaFinishPrimitive( vmesa
);
709 if (renderPrimitive
!= GL_POLYGON
+ 1)
710 viaRasterPrimitive( vmesa
->glCtx
,
716 void viaFlushDma(viaContextPtr vmesa
)
719 assert(!vmesa
->dmaLastPrim
);
721 LOCK_HARDWARE(vmesa
);
722 viaFlushDmaLocked(vmesa
, 0);
723 UNLOCK_HARDWARE(vmesa
);
727 static void viaFlush(GLcontext
*ctx
)
729 viaContextPtr vmesa
= VIA_CONTEXT(ctx
);
730 VIA_FLUSH_DMA(vmesa
);
733 static void viaFinish(GLcontext
*ctx
)
735 viaContextPtr vmesa
= VIA_CONTEXT(ctx
);
736 VIA_FLUSH_DMA(vmesa
);
740 static void viaClearStencil(GLcontext
*ctx
, int s
)
745 void viaInitIoctlFuncs(GLcontext
*ctx
)
747 ctx
->Driver
.Flush
= viaFlush
;
748 ctx
->Driver
.Clear
= viaClear
;
749 ctx
->Driver
.Finish
= viaFinish
;
750 ctx
->Driver
.ClearStencil
= viaClearStencil
;