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"
35 #include "via_ioctl.h"
36 #include "via_state.h"
39 #include <sys/ioctl.h>
41 GLuint FrameCount
= 0;
43 /*=* John Sheng [2003.5.31] flip *=*/
44 GLuint nFirstSwap
= GL_TRUE
;
45 GLuint nFirstFlip
= GL_TRUE
;
46 #define SetReg2DAGP(nReg, nData) { \
47 *((GLuint *)(vb)) = ((nReg) >> 2) | 0xF0000000; \
48 *((GLuint *)(vb) + 1) = (nData); \
49 vb = ((GLuint *)vb) + 2; \
53 #define DEPTH_SCALE ((1 << 16) - 1)
55 static void viaClear(GLcontext
*ctx
, GLbitfield mask
, GLboolean all
,
56 GLint cx
, GLint cy
, GLint cw
, GLint ch
)
58 viaContextPtr vmesa
= VIA_CONTEXT(ctx
);
59 __DRIdrawablePrivate
*dPriv
= vmesa
->driDrawable
;
60 const GLuint colorMask
= *((GLuint
*)&ctx
->Color
.ColorMask
);
62 GLuint scrn
= 0, i
= 0, side
= 0;
63 scrn
= vmesa
->saam
& S_MASK
;
64 side
= vmesa
->saam
& P_MASK
;
66 if (VIA_DEBUG
) fprintf(stderr
, "%s in\n", __FUNCTION__
);
68 VIA_FIREVERTICES(vmesa
);
70 if ((mask
& DD_FRONT_LEFT_BIT
) && colorMask
== ~0) {
72 mask
&= ~DD_FRONT_LEFT_BIT
;
75 if ((mask
& DD_BACK_LEFT_BIT
) && colorMask
== ~0) {
77 mask
&= ~DD_BACK_LEFT_BIT
;
80 if (mask
& DD_DEPTH_BIT
) {
83 mask
&= ~DD_DEPTH_BIT
;
86 if (mask
& DD_STENCIL_BIT
) {
87 if (ctx
->Stencil
.Enabled
)
89 mask
&= ~DD_STENCIL_BIT
;
92 /*=* [DBG] make draw to front buffer *=*/
100 /* flip top to bottom */
101 cy
= dPriv
->h
- cy
- ch
;
105 if (vmesa
->numClipRects
) {
106 int nr
= MIN2(i
+ VIA_NR_SAREA_CLIPRECTS
, vmesa
->numClipRects
);
107 drm_clip_rect_t
*box
= vmesa
->pClipRects
;
108 drm_clip_rect_t
*b
= vmesa
->sarea
->boxes
;
114 if (VIA_DEBUG
) fprintf(stderr
,"!all");
116 for (; i
< nr
; i
++) {
119 GLint w
= box
[i
].x2
- x
;
120 GLint h
= box
[i
].y2
- y
;
122 if (x
< cx
) w
-= cx
- x
, x
= cx
;
123 if (y
< cy
) h
-= cy
- y
, y
= cy
;
124 if (x
+ w
> cx
+ cw
) w
= cx
+ cw
- x
;
125 if (y
+ h
> cy
+ ch
) h
= cy
+ ch
- y
;
126 if (w
<= 0) continue;
127 if (h
<= 0) continue;
138 for (; i
< nr
; i
++) {
139 *b
++ = *(drm_clip_rect_t
*)&box
[i
];
143 vmesa
->sarea
->nbox
= n
;
147 scrn
= vmesa
->saam
& S_MASK
;
149 if (scrn
== S0
|| scrn
== S1
) {
151 for (; i
< nr
; i
++) {
154 GLint w
= box
[i
].x2
- x
;
155 GLint h
= box
[i
].y2
- y
;
157 if (x
< cx
) w
-= cx
- x
, x
= cx
;
158 if (y
< cy
) h
-= cy
- y
, y
= cy
;
159 if (x
+ w
> cx
+ cw
) w
= cx
+ cw
- x
;
160 if (y
+ h
> cy
+ ch
) h
= cy
+ ch
- y
;
161 if (w
<= 0) continue;
162 if (h
<= 0) continue;
173 for (; i
< nr
; i
++) {
174 *b
++ = *(drm_clip_rect_t
*)&box
[i
];
178 vmesa
->sarea
->nbox
= n
;
183 for (; i
< nr
; i
++) {
186 GLint w
= box
[i
].x2
- x
;
187 GLint h
= box
[i
].y2
- y
;
189 if (x
< cx
) w
-= cx
- x
, x
= cx
;
190 if (y
< cy
) h
-= cy
- y
, y
= cy
;
191 if (x
+ w
> cx
+ cw
) w
= cx
+ cw
- x
;
192 if (y
+ h
> cy
+ ch
) h
= cy
+ ch
- y
;
193 if (w
<= 0) continue;
194 if (h
<= 0) continue;
206 for (; i
< nr
; i
++) {
207 *b
++ = *(drm_clip_rect_t
*)&box
[n
];
211 *b
++ = *(drm_clip_rect_t
*)vmesa
->pSaamRects
;
212 vmesa
->sarea
->nbox
= n
;
217 if (flag
& VIA_FRONT
) {
219 if (vmesa
->drawType
== GLX_PBUFFER_BIT
)
220 viaFillFrontPBuffer(vmesa
);
222 viaFillFrontBuffer(vmesa
);
224 if (vmesa
->saam
&& (scrn
== (S0
| S1
))) {
225 nr
= MIN2(i
+ VIA_NR_SAREA_CLIPRECTS
, vmesa
->numSaamRects
);
226 box
= vmesa
->pSaamRects
;
227 b
= vmesa
->sarea
->boxes
;
230 for (i
= 0; i
< nr
; i
++) {
231 *b
++ = *(drm_clip_rect_t
*)&box
[n
];
235 vmesa
->sarea
->nbox
= n
;
236 viaFillFrontBufferSaam(vmesa
);
240 if (flag
& VIA_BACK
) {
241 viaFillBackBuffer(vmesa
);
244 if (flag
& VIA_DEPTH
) {
245 double depth_clamp
, range
= 0xffffffff;
246 if (vmesa
->hasStencil
== 0) {
247 if (vmesa
->depthBits
== 32) {
248 depth_clamp
= ((double)ctx
->Depth
.Clear
)*range
;
249 viaFillDepthBuffer(vmesa
, (GLuint
)depth_clamp
);
252 depth_clamp
= ((double)ctx
->Depth
.Clear
)*range
;
253 viaFillDepthBuffer(vmesa
, (GLuint
)depth_clamp
);
257 depth_clamp
= ((double)ctx
->Depth
.Clear
)*range
;
258 viaFillStencilDepthBuffer(vmesa
, (GLuint
)depth_clamp
);
261 /*=* [DBG] Fix tuxracer depth error *=*/
262 else if (flag
& VIA_STENCIL
) {
263 viaFillStencilBuffer(vmesa
, (GLuint
)ctx
->Stencil
.Clear
);
267 UNLOCK_HARDWARE(vmesa
);
268 vmesa
->uploadCliprects
= GL_TRUE
;
272 _swrast_Clear(ctx
, mask
, all
, cx
, cy
, cw
, ch
);
274 if (VIA_DEBUG
) fprintf(stderr
, "%s out\n", __FUNCTION__
);
279 * Copy the back buffer to the front buffer.
281 void viaCopyBuffer(const __DRIdrawablePrivate
*dPriv
)
284 drm_clip_rect_t
*pbox
;
286 GLuint scrn
= 0, side
= 0;
288 if (VIA_DEBUG
) fprintf(stderr
, "%s in\n", __FUNCTION__
);
291 assert(dPriv
->driContextPriv
);
292 assert(dPriv
->driContextPriv
->driverPrivate
);
294 vmesa
= (viaContextPtr
)dPriv
->driContextPriv
->driverPrivate
;
296 VIA_FIREVERTICES(vmesa
);
297 LOCK_HARDWARE(vmesa
);
299 scrn
= vmesa
->saam
& S_MASK
;
300 side
= vmesa
->saam
& P_MASK
;
302 pbox
= vmesa
->pClipRects
;
303 nbox
= vmesa
->numClipRects
;
306 if (VIA_DEBUG
) fprintf(stderr
, "%s %d cliprects (%d), SAAM (%d)\n",
307 __FUNCTION__
, nbox
, vmesa
->drawType
, vmesa
->saam
);
311 if (vmesa
->drawType
== GLX_PBUFFER_BIT
) {
312 viaDoSwapPBuffers(vmesa
);
314 if (VIA_DEBUG
) fprintf(stderr
, "%s SwapPBuffers\n", __FUNCTION__
);
315 #endif /*=* [DBG] for pbuffer *=*/
316 /*viaDoSwapBufferSoftFront(vmesa);*/
320 scrn
= vmesa
->saam
& S_MASK
;
322 for (i
= 0; i
< nbox
; ) {
323 int nr
= MIN2(i
+ VIA_NR_SAREA_CLIPRECTS
, dPriv
->numClipRects
);
324 drm_clip_rect_t
*b
= (drm_clip_rect_t
*)vmesa
->sarea
->boxes
;
326 vmesa
->sarea
->nbox
= nr
- i
;
330 viaDoSwapBuffers(vmesa
);
332 if (VIA_DEBUG
) fprintf(stderr
, "%s SwapBuffers\n", __FUNCTION__
);
336 else if (scrn
== S0
|| scrn
== S1
) {
337 for (i
= 0; i
< nbox
; ) {
338 int nr
= MIN2(i
+ VIA_NR_SAREA_CLIPRECTS
, vmesa
->numClipRects
);
339 drm_clip_rect_t
*b
= (drm_clip_rect_t
*)vmesa
->sarea
->boxes
;
341 vmesa
->sarea
->nbox
= nr
- i
;
343 for (; i
< nr
; i
++) {
346 viaDoSwapBuffers(vmesa
);
351 for (i
= 0; i
< nbox
; ) {
352 int nr
= MIN2(i
+ VIA_NR_SAREA_CLIPRECTS
, dPriv
->numClipRects
);
353 drm_clip_rect_t
*b
= (drm_clip_rect_t
*)vmesa
->sarea
->boxes
;
355 vmesa
->sarea
->nbox
= nr
- i
;
359 viaDoSwapBuffers(vmesa
);
362 pbox
= vmesa
->pSaamRects
;
363 nbox
= vmesa
->numSaamRects
;
365 for (i
= 0; i
< nbox
; ) {
366 int nr
= MIN2(i
+ VIA_NR_SAREA_CLIPRECTS
, vmesa
->numSaamRects
);
367 drm_clip_rect_t
*b
= (drm_clip_rect_t
*)vmesa
->sarea
->boxes
;
369 vmesa
->sarea
->nbox
= nr
- i
;
374 viaDoSwapBuffersSaam(vmesa
);
378 UNLOCK_HARDWARE(vmesa
);
379 vmesa
->uploadCliprects
= GL_TRUE
;
381 if (VIA_DEBUG
) fprintf(stderr
, "%s out\n", __FUNCTION__
);
386 * XXX implement when full-screen extension is done.
388 void viaPageFlip(const __DRIdrawablePrivate
*dPriv
)
390 /*=* John Sheng [2003.5.31] flip *=*/
391 viaContextPtr vmesa
= (viaContextPtr
)dPriv
->driContextPriv
->driverPrivate
;
392 GLuint
*vb
= viaCheckDma(vmesa
, vmesa
->sarea
->nbox
*56);
394 viaBuffer buffer_tmp
;
398 if (VIA_DEBUG
) fprintf(stderr
, "%s - in\n", __FUNCTION__
);
401 assert(dPriv
->driContextPriv
);
402 assert(dPriv
->driContextPriv
->driverPrivate
);
406 /*=* [DBG] make draw to front buffer *=*/
412 viaFlushPrimsLocked(vmesa
);
413 while ((*(volatile GLuint
*)((GLuint
)vmesa
->regMMIOBase
+ 0x200) & 0x2) != 0x2);
414 while (*(volatile GLuint
*)((GLuint
)vmesa
->regMMIOBase
+ 0x200) & 0x2);
415 nBackBase
= vmesa
->back
.offset
>> 1;
418 *vb++ = HALCYON_HEADER2;
424 nFirstFlip = GL_FALSE;
426 SetReg2DAGP(0x214, nBackBase);
427 viaFlushPrimsLocked(vmesa);*/
429 *((volatile GLuint
*)((GLuint
)vmesa
->regMMIOBase
+ 0x43c)) = 0x00fe0000;
430 *((volatile GLuint
*)((GLuint
)vmesa
->regMMIOBase
+ 0x440)) = 0x00001004;
431 nFirstFlip
= GL_FALSE
;
433 *((GLuint
*)((GLuint
)vmesa
->regMMIOBase
+ 0x214)) = nBackBase
;
437 viaFlushPrimsLocked(vmesa
);
438 vb
= viaCheckDma(vmesa
, vmesa
->sarea
->nbox
*56);
440 *vb
++ = HALCYON_HEADER2
;
446 nFirstSwap
= GL_FALSE
;
448 nBackBase
= (vmesa
->back
.offset
<< 1);
450 *vb
++ = HALCYON_HEADER2
;
452 *vb
++ = (HC_SubA_HFBBasL
<< 24) | (nBackBase
& 0xFFFFF8) | 0x2;
453 *vb
++ = (HC_SubA_HFBDrawFirst
<< 24) |
454 ((nBackBase
& 0xFF000000) >> 24) | 0x0100;
456 viaFlushPrimsLocked(vmesa
);
460 memcpy(&buffer_tmp
, &vmesa
->back
, sizeof(viaBuffer
));
461 memcpy(&vmesa
->back
, &vmesa
->front
, sizeof(viaBuffer
));
462 memcpy(&vmesa
->front
, &buffer_tmp
, sizeof(viaBuffer
));
464 if(vmesa
->currentPage
) {
465 vmesa
->currentPage
= 0;
466 if (vmesa
->glCtx
->Color
._DrawDestMask
== __GL_BACK_BUFFER_MASK
) {
467 ctx
->Driver
.DrawBuffer(ctx
, GL_BACK
);
470 ctx
->Driver
.DrawBuffer(ctx
, GL_FRONT
);
474 vmesa
->currentPage
= 1;
475 if (vmesa
->glCtx
->Color
._DrawDestMask
== __GL_BACK_BUFFER_MASK
) {
476 ctx
->Driver
.DrawBuffer(ctx
, GL_BACK
);
479 ctx
->Driver
.DrawBuffer(ctx
, GL_FRONT
);
483 if (VIA_DEBUG
) fprintf(stderr
, "%s - out\n", __FUNCTION__
);
488 /* This waits for *everybody* to finish rendering -- overkill.
490 void viaDmaFinish(viaContextPtr vmesa
)
493 if (VIA_DEBUG
) fprintf(stderr
, "%s in\n", __FUNCTION__
);
495 VIA_FIREVERTICES(vmesa
);
496 LOCK_HARDWARE(vmesa
);
497 UNLOCK_HARDWARE(vmesa
);
499 if (VIA_DEBUG
) fprintf(stderr
, "%s out\n", __FUNCTION__
);
503 void viaRegetLockQuiescent(viaContextPtr vmesa
)
505 drmUnlock(vmesa
->driFd
, vmesa
->hHWContext
);
508 static int intersect_rect(drm_clip_rect_t
*out
,
514 if (b
->x1
> out
->x1
) out
->x1
= b
->x1
;
515 if (b
->x2
< out
->x2
) out
->x2
= b
->x2
;
516 if (out
->x1
>= out
->x2
) return 0;
518 if (b
->y1
> out
->y1
) out
->y1
= b
->y1
;
519 if (b
->y2
< out
->y2
) out
->y2
= b
->y2
;
520 if (out
->y1
>= out
->y2
) return 0;
525 void viaFlushPrimsLocked(viaContextPtr vmesa
)
527 drm_clip_rect_t
*pbox
= (drm_clip_rect_t
*)vmesa
->pClipRects
;
528 int nbox
= vmesa
->numClipRects
;
529 drm_via_sarea_t
*sarea
= vmesa
->sarea
;
530 drm_via_flush_agp_t agpCmd
;
531 drm_via_flush_sys_t sysCmd
;
532 GLuint
*vb
= viaCheckDma(vmesa
, 0);
535 if (vmesa
->dmaLow
== DMA_OFFSET
) {
538 if (vmesa
->dmaLow
> 2097152)
539 fprintf(stderr
, "buffer overflow in Flush Prims = %d\n",vmesa
->dmaLow
);
541 switch (vmesa
->dmaLow
& 0x1F) {
544 *vb
++ = (HC_ParaType_NotTex
<< 16);
553 *vb
++ = (HC_ParaType_NotTex
<< 16);
560 *vb
++ = (HC_ParaType_NotTex
<< 16);
579 agpCmd
.size
= vmesa
->dmaLow
;
580 agpCmd
.index
= vmesa
->dma
[vmesa
->dmaIndex
].index
;
585 sysCmd
.size
= vmesa
->dmaLow
;
586 sysCmd
.index
= (GLuint
)vmesa
->dma
[vmesa
->dmaIndex
].map
;
590 sarea
->vertexPrim
= vmesa
->hwPrimitive
;
598 else if (nbox
> VIA_NR_SAREA_CLIPRECTS
) {
599 vmesa
->uploadCliprects
= GL_TRUE
;
601 /*=* John Sheng [2003.5.31] flip *=*/
605 GLuint *data = (GLuint *)vmesa->dmaAddr;
606 for (i = 0; i < vmesa->dmaLow; i += 16) {
607 fprintf(stderr, "%08x ", *data++);
608 fprintf(stderr, "%08x ", *data++);
609 fprintf(stderr, "%08x ", *data++);
610 fprintf(stderr, "%08x\n", *data++);
612 fprintf(stderr, "******************************************\n");
615 if (!nbox
|| !vmesa
->uploadCliprects
) {
623 flush_agp(vmesa
, &agpCmd
);
627 flush_sys(vmesa
, &sysCmd
);
633 scrn
= vmesa
->saam
& S_MASK
;
634 side
= vmesa
->saam
& P_MASK
;
636 for (i
= 0; i
< nbox
; ) {
637 int nr
= MIN2(i
+ VIA_NR_SAREA_CLIPRECTS
, nbox
);
638 drm_clip_rect_t
*b
= sarea
->boxes
;
641 if (vmesa
->glCtx
->Scissor
.Enabled
) {
644 for (; i
< nr
; i
++) {
645 b
->x1
= pbox
[i
].x1
- vmesa
->drawX
;
646 b
->y1
= pbox
[i
].y1
- vmesa
->drawY
;
647 b
->x2
= pbox
[i
].x2
- vmesa
->drawX
;
648 b
->y2
= pbox
[i
].y2
- vmesa
->drawY
;
649 if (intersect_rect(b
, b
, &vmesa
->scissorRect
)) {
655 if (nr
< nbox
) continue;
660 sarea
->nbox
= nr
- i
;
661 for (; i
< nr
; i
++, b
++) {
662 b
->x1
= pbox
[i
].x1
- vmesa
->drawX
;
663 b
->y1
= pbox
[i
].y1
- vmesa
->drawY
;
664 b
->x2
= pbox
[i
].x2
- vmesa
->drawX
;
665 b
->y2
= pbox
[i
].y2
- vmesa
->drawY
;
669 else if (scrn
== S0
|| scrn
== S1
){
670 if (vmesa
->scissor
) {
672 for (; i
< nr
; i
++) {
673 b
->x1
= pbox
[i
].x1
- vmesa
->drawX
;
674 b
->y1
= pbox
[i
].y1
- vmesa
->drawY
;
675 b
->x2
= pbox
[i
].x2
- vmesa
->drawX
;
676 b
->y2
= pbox
[i
].y2
- vmesa
->drawY
;
677 if (intersect_rect(b
, b
, &vmesa
->scissorRect
)) {
683 if (nr
< nbox
) continue;
688 sarea
->nbox
= nr
- i
;
689 for (; i
< nr
; i
++, b
++) {
690 b
->x1
= pbox
[i
].x1
- vmesa
->drawX
;
691 b
->y1
= pbox
[i
].y1
- vmesa
->drawY
;
692 b
->x2
= pbox
[i
].x2
- vmesa
->drawX
;
693 b
->y2
= pbox
[i
].y2
- vmesa
->drawY
;
700 if (vmesa
->scissor
) {
702 for (; i
< nr
; i
++) {
703 b
->x1
= pbox
[i
].x1
- vmesa
->drawX
;
704 b
->y1
= pbox
[i
].y1
- vmesa
->drawY
;
705 b
->x2
= pbox
[i
].x2
- vmesa
->drawX
;
706 b
->y2
= pbox
[i
].y2
- vmesa
->drawY
;
708 if (intersect_rect(b
, b
, &vmesa
->scissorRect
)) {
714 if (nr
< nbox
) continue;
719 sarea
->nbox
= nr
- i
;
720 for (; i
< nr
; i
++, b
++) {
721 b
->x1
= pbox
[i
].x1
- vmesa
->drawX
;
722 b
->y1
= pbox
[i
].y1
- vmesa
->drawY
;
723 b
->x2
= pbox
[i
].x2
- vmesa
->drawX
;
724 b
->y2
= pbox
[i
].y2
- vmesa
->drawY
;
732 flush_agp(vmesa
, &agpCmd
);
736 flush_sys(vmesa
, &sysCmd
);
740 if (scrn
== (S0
| S1
)) {
741 pbox
= (drm_clip_rect_t
*)vmesa
->pSaamRects
;
742 nbox
= vmesa
->numSaamRects
;
743 for (i
= 0; i
< nbox
; ) {
744 int nr
= MIN2(i
+ VIA_NR_SAREA_CLIPRECTS
, nbox
);
745 drm_clip_rect_t
*b
= sarea
->boxes
;
746 if (vmesa
->scissor
) {
748 for (; i
< nr
; i
++) {
749 b
->x1
= pbox
[i
].x1
- vmesa
->drawXSaam
;
750 b
->y1
= pbox
[i
].y1
- vmesa
->drawYSaam
;
751 b
->x2
= pbox
[i
].x2
- vmesa
->drawXSaam
;
752 b
->y2
= pbox
[i
].y2
- vmesa
->drawYSaam
;
754 if (intersect_rect(b
, b
, &vmesa
->scissorRect
)) {
760 if (nr
< nbox
) continue;
765 sarea
->nbox
= nr
- i
;
766 for (; i
< nr
; i
++, b
++) {
767 b
->x1
= pbox
[i
].x1
- vmesa
->drawXSaam
;
768 b
->y1
= pbox
[i
].y1
- vmesa
->drawYSaam
;
769 b
->x2
= pbox
[i
].x2
- vmesa
->drawXSaam
;
770 b
->y2
= pbox
[i
].y2
- vmesa
->drawYSaam
;
774 flush_agp_saam(vmesa
, &agpCmd
);
781 GLuint
*data
= (GLuint
*)vmesa
->dmaAddr
;
782 for (i
= 0; i
< vmesa
->dmaLow
; i
+= 16) {
783 fprintf(stderr
, "%08x ", *data
++);
784 fprintf(stderr
, "%08x ", *data
++);
785 fprintf(stderr
, "%08x ", *data
++);
786 fprintf(stderr
, "%08x\n", *data
++);
788 fprintf(stderr
, "******************************************\n");
793 vmesa
->dmaLow
= DMA_OFFSET
;
794 if (vmesa
->dmaIndex
) {
795 vmesa
->dmaAddr
= vmesa
->dma
[0].map
;
796 vmesa
->dmaHigh
= vmesa
->dma
[0].size
;
797 vmesa
->dmaLastPrim
= DMA_OFFSET
;
801 vmesa
->dmaAddr
= vmesa
->dma
[1].map
;
802 vmesa
->dmaHigh
= vmesa
->dma
[1].size
;
803 vmesa
->dmaLastPrim
= DMA_OFFSET
;
808 void viaFlushPrims(viaContextPtr vmesa
)
811 if (VIA_DEBUG
) fprintf(stderr
, "%s in\n", __FUNCTION__
);
814 LOCK_HARDWARE(vmesa
);
815 viaFlushPrimsLocked(vmesa
);
816 UNLOCK_HARDWARE(vmesa
);
819 if (VIA_DEBUG
) fprintf(stderr
, "%s in\n", __FUNCTION__
);
823 static void viaFlush(GLcontext
*ctx
)
825 viaContextPtr vmesa
= VIA_CONTEXT(ctx
);
827 if (VIA_DEBUG
) fprintf(stderr
, "%s in\n", __FUNCTION__
);
829 VIA_FIREVERTICES(vmesa
);
831 if (VIA_DEBUG
) fprintf(stderr
, "%s out\n", __FUNCTION__
);
835 static void viaFinish(GLcontext
*ctx
)
838 if (VIA_DEBUG
) fprintf(stderr
, "%s in\n", __FUNCTION__
);
839 if (VIA_DEBUG
) fprintf(stderr
, "%s out\n", __FUNCTION__
);
844 static void viaClearStencil(GLcontext
*ctx
, int s
)
849 void viaInitIoctlFuncs(GLcontext
*ctx
)
851 ctx
->Driver
.Flush
= viaFlush
;
852 ctx
->Driver
.Clear
= viaClear
;
853 ctx
->Driver
.Finish
= viaFinish
;
854 ctx
->Driver
.ClearStencil
= viaClearStencil
;
857 void viaFillFrontBuffer(viaContextPtr vmesa
)
859 GLuint nDestBase
, nDestPitch
, nDestWidth
, nDestHeight
, offsetX
, offset
,i
;
860 drm_clip_rect_t
*b
= vmesa
->sarea
->boxes
;
861 GLuint
*vb
= viaCheckDma(vmesa
, vmesa
->sarea
->nbox
*48);
862 GLuint bytePerPixel
= vmesa
->viaScreen
->bitsPerPixel
>> 3;
863 GLuint pixel
= (GLuint
)vmesa
->ClearColor
;
865 offset
= vmesa
->viaScreen
->fbOffset
+ (vmesa
->drawY
* vmesa
->front
.pitch
+ vmesa
->drawX
* bytePerPixel
);
867 if (VIA_DEBUG
) fprintf(stderr
, "Fill Front offset = %08x\n", offset
);
869 nDestBase
= offset
& 0xffffffe0;
870 nDestPitch
= vmesa
->front
.pitch
;
872 for (i
= 0; i
< vmesa
->sarea
->nbox
; i
++) {
873 nDestWidth
= b
->x2
- b
->x1
- 1;
874 nDestHeight
= b
->y2
- b
->y1
- 1;
876 if (bytePerPixel
== 4)
877 offsetX
= (b
->x1
- vmesa
->drawX
) + (vmesa
->drawX
& 7);
879 offsetX
= (b
->x1
- vmesa
->drawX
) + (vmesa
->drawX
& 15);
884 SetReg2DAGP(0x18, pixel
| 0x00000000);
886 SetReg2DAGP(0x10, nDestWidth
| (nDestHeight
<< 16));
888 SetReg2DAGP(0x0C, (offsetX
| ((b
->y1
- vmesa
->drawY
) << 16)));
890 SetReg2DAGP(0x34, (nDestBase
>> 3));
892 SetReg2DAGP(0x38, (((nDestPitch
>> 3) << 16) & 0x7FF0000) | 0x80000000);
894 SetReg2DAGP(0x0, 0x1 | 0x2000 | 0xF0000000);
899 viaFlushPrimsLocked(vmesa
);
902 void viaFillFrontBufferSaam(viaContextPtr vmesa
)
904 GLuint nDestBase
, nDestPitch
, nDestWidth
, nDestHeight
, offsetX
, offset
,i
;
905 drm_clip_rect_t
*b
= vmesa
->sarea
->boxes
;
906 GLuint
*vb
= viaCheckDma(vmesa
, vmesa
->sarea
->nbox
*48);
907 GLuint bytePerPixel
= vmesa
->viaScreen
->bitsPerPixel
>> 3;
908 GLuint pixel
= (GLuint
)vmesa
->ClearColor
;
910 offset
= vmesa
->viaScreen
->fbSize
+
911 (vmesa
->drawYSaam
* vmesa
->front
.pitch
+ vmesa
->drawXSaam
* bytePerPixel
);
912 nDestBase
= offset
& 0xffffffe0;
913 nDestPitch
= vmesa
->front
.pitch
;
915 for (i
= 0; i
< vmesa
->sarea
->nbox
; i
++) {
916 nDestWidth
= b
->x2
- b
->x1
- 1;
917 nDestHeight
= b
->y2
- b
->y1
- 1;
919 if (bytePerPixel
== 4)
920 offsetX
= (b
->x1
- vmesa
->drawXSaam
) + (vmesa
->drawXSaam
& 7);
922 offsetX
= (b
->x1
- vmesa
->drawXSaam
) + (vmesa
->drawXSaam
& 15);
926 SetReg2DAGP(0x18, pixel
| 0x00000000);
928 SetReg2DAGP(0x10, nDestWidth
| (nDestHeight
<< 16));
930 SetReg2DAGP(0x0C, (offsetX
| ((b
->y1
- vmesa
->drawYSaam
) << 16)));
932 SetReg2DAGP(0x34, (nDestBase
>> 3));
934 SetReg2DAGP(0x38, (((nDestPitch
>> 3) << 16) & 0x7FF0000) | 0x80000000);
936 SetReg2DAGP(0x0, 0x1 | 0x2000 | 0xF0000000);
941 viaFlushPrimsLocked(vmesa
);
944 void viaFillFrontPBuffer(viaContextPtr vmesa
)
946 GLuint nDestBase
, nDestPitch
, nDestWidth
, nDestHeight
, offsetX
, offset
;
947 GLuint
*vb
= viaCheckDma(vmesa
, vmesa
->sarea
->nbox
*48);
948 GLuint pixel
= (GLuint
)vmesa
->ClearColor
;
950 offset
= vmesa
->front
.offset
;
952 if (VIA_DEBUG
) fprintf(stderr
, "Fill PFront offset = %08x\n", offset
);
955 nDestPitch
= vmesa
->front
.pitch
;
957 nDestWidth
= vmesa
->driDrawable
->w
- 1;
958 nDestHeight
= vmesa
->driDrawable
->h
- 1;
963 SetReg2DAGP(0x18, pixel
| 0x00000000);
965 SetReg2DAGP(0x10, nDestWidth
| (nDestHeight
<< 16));
967 SetReg2DAGP(0x0C, (offsetX
| (0 << 16)));
969 SetReg2DAGP(0x34, (nDestBase
>> 3));
971 SetReg2DAGP(0x38, (((nDestPitch
>> 3) << 16) & 0x7FF0000) | 0x80000000);
973 SetReg2DAGP(0x0, 0x1 | 0x2000 | 0xF0000000);
975 viaFlushPrimsLocked(vmesa
);
978 void viaFillBackBuffer(viaContextPtr vmesa
)
980 GLuint nDestBase
, nDestPitch
, nDestWidth
, nDestHeight
, offsetX
, offset
;
981 GLcontext
*ctx
= vmesa
->glCtx
;
982 GLuint
*vb
= viaCheckDma(vmesa
, 48);
983 GLuint pixel
= (GLuint
)vmesa
->ClearColor
;
984 GLuint bytePerPixel
= vmesa
->viaScreen
->bitsPerPixel
>> 3;
986 offset
= vmesa
->back
.offset
;
988 if (VIA_DEBUG
) fprintf(stderr
, "Fill Back offset = %08x\n", offset
);
991 nDestPitch
= vmesa
->back
.pitch
;
992 offsetX
= vmesa
->drawXoff
;
995 if (!ctx
->Scissor
.Enabled
) {
997 nDestWidth
= (vmesa
->back
.pitch
/ vmesa
->viaScreen
->bitsPerPixel
* 8) - 1;
998 nDestHeight
= vmesa
->driDrawable
->h
-1;
1001 SetReg2DAGP(0x18, pixel
| 0x00000000);
1003 SetReg2DAGP(0x10, nDestWidth
| (nDestHeight
<< 16));
1005 SetReg2DAGP(0x0C, (offsetX
| (0 << 16)));
1007 SetReg2DAGP(0x34, (nDestBase
>> 3));
1009 SetReg2DAGP(0x38, (((nDestPitch
>> 3) << 16) & 0x7FF0000) | 0x80000000);
1011 SetReg2DAGP(0x0, 0x1 | 0x2000 | 0xF0000000);
1013 /*=* John Sheng [2003.7.18] texenv *=*/
1016 drm_clip_rect_t
*b
= vmesa
->sarea
->boxes
;
1017 for (i
= 0; i
< vmesa
->sarea
->nbox
; i
++) {
1018 nDestWidth
= b
->x2
- b
->x1
- 1;
1019 nDestHeight
= b
->y2
- b
->y1
- 1;
1021 if (bytePerPixel
== 4)
1022 offsetX
= (b
->x1
- vmesa
->drawX
) + (vmesa
->drawX
& 7);
1024 offsetX
= (b
->x1
- vmesa
->drawX
) + (vmesa
->drawX
& 15);
1027 SetReg2DAGP(0x18, pixel
| 0x00000000);
1029 SetReg2DAGP(0x10, nDestWidth
| (nDestHeight
<< 16));
1031 SetReg2DAGP(0x0C, ((offsetX
+ (b
->x1
- vmesa
->drawX
)) | ((b
->y1
- vmesa
->drawY
) << 16)));
1033 SetReg2DAGP(0x34, (nDestBase
>> 3));
1035 SetReg2DAGP(0x38, (((nDestPitch
>> 3) << 16) & 0x7FF0000) | 0x80000000);
1037 SetReg2DAGP(0x0, 0x1 | 0x2000 | 0xF0000000);
1043 fprintf(stderr
," width = %08x\n", nDestWidth
);
1044 fprintf(stderr
," height = %08x\n", nDestHeight
);
1050 void viaFillStencilDepthBuffer(viaContextPtr vmesa
, GLuint pixel
)
1052 GLuint nDestBase
, nDestPitch
, nDestWidth
, nDestHeight
, offsetX
, offset
;
1053 GLuint
*vb
= viaCheckDma(vmesa
, 80);
1056 offset
= vmesa
->depth
.offset
;
1058 if (VIA_DEBUG
) fprintf(stderr
, "Fill Stencil Depth offset = %08x\n", offset
);
1061 nDestPitch
= vmesa
->depth
.pitch
;
1062 offsetX
= vmesa
->drawXoff
;
1063 pixel
= pixel
& 0xffffff00;
1067 nDestWidth
= (vmesa
->depth
.pitch
/ vmesa
->depthBits
* 8) - 1 - offsetX
;
1068 nDestHeight
= vmesa
->driDrawable
->h
-1;
1070 if (vmesa
->viaScreen
->bitsPerPixel
== vmesa
->depth
.bpp
) {
1072 SetReg2DAGP(0x18, pixel
);
1074 SetReg2DAGP(0x2C, nMask
);
1076 SetReg2DAGP(0x10, nDestWidth
| (nDestHeight
<< 16));
1078 SetReg2DAGP(0x0C, (offsetX
| (0 << 16)));
1080 SetReg2DAGP(0x34, (nDestBase
>> 3));
1082 SetReg2DAGP(0x38, (((nDestPitch
>> 3) << 16) & 0x7FF0000) | 0x80000000);
1084 SetReg2DAGP(0x0, 0x1 | 0x2000 | 0xF0000000);
1086 SetReg2DAGP(0x2C, 0x00000000);
1089 GLuint EngStatus
= *(vmesa
->pnGEMode
);
1091 SetReg2DAGP(0x04, (EngStatus
& 0xFFFFFCFF) | 0x300);
1093 SetReg2DAGP(0x18, pixel
);
1095 SetReg2DAGP(0x2C, nMask
);
1097 SetReg2DAGP(0x10, nDestWidth
| (nDestHeight
<< 16));
1099 SetReg2DAGP(0x0C, (offsetX
| (0 << 16)));
1101 SetReg2DAGP(0x34, (nDestBase
>> 3));
1103 SetReg2DAGP(0x38, (((nDestPitch
>> 3) << 16) & 0x7FF0000) | 0x80000000);
1105 SetReg2DAGP(0x0, 0x1 | 0x2000 | 0xF0000000);
1107 SetReg2DAGP(0x04, EngStatus
);
1109 SetReg2DAGP(0x2C, 0x00000000);
1115 if (vmesa
->glCtx
->Color
._DrawDestMask
== __GL_BACK_BUFFER_MASK
) {
1116 viaFlushPrimsLocked(vmesa
);
1120 void viaFillStencilBuffer(viaContextPtr vmesa
, GLuint pixel
)
1122 GLuint nDestBase
, nDestPitch
, nDestWidth
, nDestHeight
, offsetX
, offset
;
1123 GLuint
*vb
= viaCheckDma(vmesa
, 80);
1126 offset
= vmesa
->depth
.offset
;
1128 if (VIA_DEBUG
) fprintf(stderr
, "Fill Stencil offset = %08x\n", offset
);
1131 nDestPitch
= vmesa
->depth
.pitch
;
1132 offsetX
= vmesa
->drawXoff
;
1133 pixel
= pixel
& 0x000000ff;
1137 nDestWidth
= (vmesa
->depth
.pitch
/ vmesa
->depthBits
* 8) - 1 - offsetX
;
1138 nDestHeight
= vmesa
->driDrawable
->h
-1;
1140 if (vmesa
->viaScreen
->bitsPerPixel
== vmesa
->depth
.bpp
) {
1142 SetReg2DAGP(0x18, pixel
);
1144 SetReg2DAGP(0x2C, nMask
);
1146 SetReg2DAGP(0x10, nDestWidth
| (nDestHeight
<< 16));
1148 SetReg2DAGP(0x0C, (offsetX
| (0 << 16)));
1150 SetReg2DAGP(0x34, (nDestBase
>> 3));
1152 SetReg2DAGP(0x38, (((nDestPitch
>> 3) << 16) & 0x7FF0000) | 0x80000000);
1154 SetReg2DAGP(0x0, 0x1 | 0x2000 | 0xF0000000);
1156 SetReg2DAGP(0x2C, 0x00000000);
1159 GLuint EngStatus
= *(vmesa
->pnGEMode
);
1161 SetReg2DAGP(0x04, (EngStatus
& 0xFFFFFCFF) | 0x300);
1163 SetReg2DAGP(0x18, pixel
);
1165 SetReg2DAGP(0x2C, nMask
);
1167 SetReg2DAGP(0x10, nDestWidth
| (nDestHeight
<< 16));
1169 SetReg2DAGP(0x0C, (offsetX
| (0 << 16)));
1171 SetReg2DAGP(0x34, (nDestBase
>> 3));
1173 SetReg2DAGP(0x38, (((nDestPitch
>> 3) << 16) & 0x7FF0000) | 0x80000000);
1175 SetReg2DAGP(0x0, 0x1 | 0x2000 | 0xF0000000);
1177 SetReg2DAGP(0x04, EngStatus
);
1179 SetReg2DAGP(0x2C, 0x00000000);
1183 if (vmesa
->glCtx
->Color
._DrawDestMask
== __GL_BACK_BUFFER_MASK
) {
1184 viaFlushPrimsLocked(vmesa
);
1188 void viaFillDepthBuffer(viaContextPtr vmesa
, GLuint pixel
)
1190 GLuint nDestBase
, nDestPitch
, nDestWidth
, nDestHeight
, offsetX
, offset
;
1191 GLuint
*vb
= viaCheckDma(vmesa
, 72);
1192 offset
= vmesa
->depth
.offset
;
1194 if (VIA_DEBUG
) fprintf(stderr
, "Fill Depth offset = %08x\n", offset
);
1197 nDestPitch
= vmesa
->depth
.pitch
;
1198 offsetX
= vmesa
->drawXoff
;
1201 nDestWidth
= (vmesa
->depth
.pitch
/ vmesa
->depthBits
* 8) - 1 - offsetX
;
1202 nDestHeight
= vmesa
->driDrawable
->h
-1;
1204 if (vmesa
->viaScreen
->bitsPerPixel
== vmesa
->depth
.bpp
) {
1206 SetReg2DAGP(0x18, pixel
);
1208 SetReg2DAGP(0x2C, 0x0);
1210 SetReg2DAGP(0x10, nDestWidth
| (nDestHeight
<< 16));
1212 SetReg2DAGP(0x0C, (offsetX
| (0 << 16)));
1214 SetReg2DAGP(0x34, (nDestBase
>> 3));
1216 SetReg2DAGP(0x38, (((nDestPitch
>> 3) << 16) & 0x7FF0000) | 0x80000000);
1218 SetReg2DAGP(0x0, 0x1 | 0x2000 | 0xF0000000);
1220 /* depth = 16, color = 32 */
1221 else if (vmesa
->depth
.bpp
== 16) {
1222 GLuint EngStatus
= *(vmesa
->pnGEMode
);
1225 SetReg2DAGP(0x04, (EngStatus
& 0xFFFFFCFF) | 0x100);
1227 SetReg2DAGP(0x2C, 0x0);
1229 SetReg2DAGP(0x18, pixel
);
1231 SetReg2DAGP(0x10, nDestWidth
| (nDestHeight
<< 16));
1233 SetReg2DAGP(0x0C, (offsetX
| (0 << 16)));
1235 SetReg2DAGP(0x34, (nDestBase
>> 3));
1237 SetReg2DAGP(0x38, (((nDestPitch
>> 3) << 16) & 0x7FF0000) | 0x80000000);
1239 SetReg2DAGP(0x0, 0x1 | 0x2000 | 0xF0000000);
1241 SetReg2DAGP(0x04, EngStatus
);
1243 /* depth = 32, color = 16 */
1245 GLuint EngStatus
= *(vmesa
->pnGEMode
);
1248 SetReg2DAGP(0x04, (EngStatus
& 0xFFFFFCFF) | 0x300);
1250 SetReg2DAGP(0x2C, 0x0);
1252 SetReg2DAGP(0x18, pixel
);
1254 SetReg2DAGP(0x10, nDestWidth
| (nDestHeight
<< 16));
1256 SetReg2DAGP(0x0C, (offsetX
| (0 << 16)));
1258 SetReg2DAGP(0x34, (nDestBase
>> 3));
1260 SetReg2DAGP(0x38, (((nDestPitch
>> 3) << 16) & 0x7FF0000) | 0x80000000);
1262 SetReg2DAGP(0x0, 0x1 | 0x2000 | 0xF0000000);
1264 SetReg2DAGP(0x04, EngStatus
);
1268 if (vmesa
->glCtx
->Color
._DrawDestMask
== __GL_BACK_BUFFER_MASK
) {
1269 viaFlushPrimsLocked(vmesa
);
1273 void viaDoSwapBuffers(viaContextPtr vmesa
)
1275 GLuint
*vb
= viaCheckDma(vmesa
, vmesa
->sarea
->nbox
*56);
1278 GLuint nFrontWidth
, nFrontHeight
, nBackWidth
, nBackHeight
;
1279 GLuint nFrontBase
, nBackBase
;
1280 GLuint nFrontOffsetX
, nFrontOffsetY
, nBackOffsetX
, nBackOffsetY
;
1281 drm_clip_rect_t
*b
= vmesa
->sarea
->boxes
;
1282 GLuint bytePerPixel
= vmesa
->viaScreen
->bitsPerPixel
>> 3;
1285 nFrontPitch
= vmesa
->front
.pitch
;
1286 nBackPitch
= vmesa
->back
.pitch
;
1289 nFrontBase
= vmesa
->viaScreen
->fbOffset
+ (vmesa
->drawY
* nFrontPitch
+ vmesa
->drawX
* bytePerPixel
);
1290 nBackBase
= vmesa
->back
.offset
;
1291 /* 128 bit alignment*/
1292 nFrontBase
= nFrontBase
& 0xffffffe0;
1294 /*=* [DBG] make draw to front buffer *=*/
1298 for (i
= 0; i
< vmesa
->sarea
->nbox
; i
++) {
1300 nFrontWidth
= nBackWidth
= b
->x2
- b
->x1
- 1;
1301 nFrontHeight
= nBackHeight
= b
->y2
- b
->y1
- 1;
1303 nFrontOffsetX
= (b
->x1
- vmesa
->drawX
) + vmesa
->drawXoff
;
1304 nFrontOffsetY
= b
->y1
- vmesa
->drawY
;
1306 nBackOffsetX
= nFrontOffsetX
;
1307 nBackOffsetY
= nFrontOffsetY
;
1309 SetReg2DAGP(0x10, nFrontWidth
| (nFrontHeight
<< 16));
1311 SetReg2DAGP(0x0C, nFrontOffsetX
| (nFrontOffsetY
<< 16));
1313 SetReg2DAGP(0x08, nBackOffsetX
| (nBackOffsetY
<< 16));
1315 SetReg2DAGP(0x34, (nFrontBase
>> 3));
1317 SetReg2DAGP(0x30, (nBackBase
>> 3));
1319 SetReg2DAGP(0x38, (((nFrontPitch
>> 3) << 16) & 0x7FF0000) | 0x80000000 |
1320 ((nBackPitch
>> 3) & 0x7FF));
1322 SetReg2DAGP(0x0, 0x1 | 0xCC000000);
1326 viaFlushPrimsLocked(vmesa
);
1328 if (VIA_DEBUG
) fprintf(stderr
, "Do Swap Buffer\n");
1332 void viaDoSwapBuffersSaam(viaContextPtr vmesa
)
1334 GLuint
*vb
= viaCheckDma(vmesa
, vmesa
->sarea
->nbox
*56);
1337 GLuint nFrontWidth
, nFrontHeight
, nBackWidth
, nBackHeight
;
1338 GLuint nFrontBase
, nBackBase
;
1339 GLuint nFrontOffsetX
, nFrontOffsetY
, nBackOffsetX
, nBackOffsetY
;
1340 drm_clip_rect_t
*b
= vmesa
->sarea
->boxes
;
1341 GLuint bytePerPixel
= vmesa
->viaScreen
->bitsPerPixel
>> 3;
1344 nFrontPitch
= vmesa
->front
.pitch
;
1345 nBackPitch
= vmesa
->back
.pitch
;
1348 nFrontBase
= vmesa
->viaScreen
->fbSize
+ (vmesa
->drawYSaam
* nFrontPitch
+ vmesa
->drawXSaam
* bytePerPixel
);
1349 nBackBase
= vmesa
->back
.offset
;
1350 /* 128 bit alignment*/
1351 nFrontBase
= nFrontBase
& 0xffffffe0;
1353 /*=* [DBG] make draw to front buffer *=*/
1357 for (i
= 0; i
< vmesa
->sarea
->nbox
; i
++) {
1359 nFrontWidth
= nBackWidth
= b
->x2
- b
->x1
- 1;
1360 nFrontHeight
= nBackHeight
= b
->y2
- b
->y1
- 1;
1362 nFrontOffsetX
= (b
->x1
- vmesa
->drawXSaam
) + vmesa
->drawXoff
;
1363 nFrontOffsetY
= b
->y1
- vmesa
->drawYSaam
;
1365 nBackOffsetX
= nFrontOffsetX
;
1366 nBackOffsetY
= nFrontOffsetY
;
1368 SetReg2DAGP(0x10, nFrontWidth
| (nFrontHeight
<< 16));
1370 SetReg2DAGP(0x0C, nFrontOffsetX
| (nFrontOffsetY
<< 16));
1372 SetReg2DAGP(0x08, nBackOffsetX
| (nBackOffsetY
<< 16));
1374 SetReg2DAGP(0x34, (nFrontBase
>> 3));
1376 SetReg2DAGP(0x30, (nBackBase
>> 3));
1378 SetReg2DAGP(0x38, (((nFrontPitch
>> 3) << 16) & 0x7FF0000) | 0x80000000 |
1379 ((nBackPitch
>> 3) & 0x7FF));
1381 SetReg2DAGP(0x0, 0x1 | 0xCC000000);
1385 viaFlushPrimsLocked(vmesa
);
1387 if (VIA_DEBUG
) fprintf(stderr
, "Do Swap Buffer\n");
1391 void viaDoSwapPBuffers(viaContextPtr vmesa
)
1393 GLuint
*vb
= viaCheckDma(vmesa
, vmesa
->sarea
->nbox
*56);
1396 GLuint nFrontWidth
, nFrontHeight
;
1397 GLuint nFrontBase
, nBackBase
;
1398 GLuint nFrontOffsetX
, nFrontOffsetY
, nBackOffsetX
, nBackOffsetY
;
1399 GLuint bytePerPixel
= vmesa
->viaScreen
->bitsPerPixel
>> 3;
1401 nFrontPitch
= vmesa
->front
.pitch
;
1402 nBackPitch
= vmesa
->back
.pitch
;
1405 nFrontBase
= vmesa
->front
.offset
;
1406 nBackBase
= vmesa
->back
.offset
;
1409 nFrontWidth
= nFrontPitch
/ bytePerPixel
;
1410 nFrontHeight
= nBackPitch
/ bytePerPixel
;
1415 nBackOffsetX
= nFrontOffsetX
;
1416 nBackOffsetY
= nFrontOffsetY
;
1418 SetReg2DAGP(0x10, nFrontWidth
| (nFrontHeight
<< 16));
1420 SetReg2DAGP(0x0C, nFrontOffsetX
| (nFrontOffsetY
<< 16));
1422 SetReg2DAGP(0x08, nBackOffsetX
| (nBackOffsetY
<< 16));
1424 SetReg2DAGP(0x34, (nFrontBase
>> 3));
1426 SetReg2DAGP(0x30, (nBackBase
>> 3));
1428 SetReg2DAGP(0x38, (((nFrontPitch
>> 3) << 16) & 0x7FF0000) | 0x80000000 |
1429 ((nBackPitch
>> 3) & 0x7FF));
1431 SetReg2DAGP(0x0, 0x1 | 0xCC000000);
1433 viaFlushPrimsLocked(vmesa
);
1435 if (VIA_DEBUG
) fprintf(stderr
, "Do Swap PBuffer\n");
1439 void viaDoSwapBufferSoft(viaContextPtr vmesa
)
1443 GLuint nFrontBase
, nBackBase
;
1448 w
= vmesa
->viaScreen
->width
;
1449 w
= BUFFER_ALIGN_WIDTH(w
, BUFFER_ALIGNMENT
);
1451 if (vmesa
->viaScreen
->bitsPerPixel
== 0x20)
1452 nFrontPitch
= w
<< 2;
1454 nFrontPitch
= w
<< 1;
1456 nBackPitch
= vmesa
->back
.pitch
;
1459 nFrontBase
= (GLuint
) vmesa
->driScreen
->pFB
;
1460 nBackBase
= ((GLuint
) vmesa
->back
.offset
) + ((GLuint
) vmesa
->driScreen
->pFB
);
1461 by
= (GLubyte
*) nBackBase
;
1462 fy
= (GLubyte
*) nFrontBase
;
1464 viaFlushPrimsLocked(vmesa
);
1466 for (i
= 0; i
< vmesa
->driDrawable
->h
; i
++) {
1467 fy
= (GLubyte
*)(nFrontBase
+ i
* nFrontPitch
);
1468 for (j
= 0; j
< nBackPitch
; j
++) {
1469 *((GLubyte
*)fy
) = *((GLubyte
*)by
);
1478 void viaDoSwapBufferSoftFront(viaContextPtr vmesa
)
1482 GLuint nFrontBase
, nBackBase
;
1487 w
= vmesa
->viaScreen
->width
;
1488 w
= BUFFER_ALIGN_WIDTH(w
, BUFFER_ALIGNMENT
);
1490 if (vmesa
->viaScreen
->bitsPerPixel
== 0x20)
1491 nFrontPitch
= w
<< 2;
1493 nFrontPitch
= w
<< 1;
1495 nBackPitch
= vmesa
->front
.pitch
;
1498 nFrontBase
= (GLuint
) vmesa
->driScreen
->pFB
;
1499 nBackBase
= ((GLuint
) vmesa
->front
.offset
) + ((GLuint
) vmesa
->driScreen
->pFB
);
1500 by
= (GLubyte
*) nBackBase
;
1501 fy
= (GLubyte
*) nFrontBase
;
1503 viaFlushPrimsLocked(vmesa
);
1505 for (i
= 0; i
< vmesa
->driDrawable
->h
; i
++) {
1506 fy
= (GLubyte
*)(nFrontBase
+ i
* nFrontPitch
);
1507 for (j
= 0; j
< nBackPitch
; j
++) {
1508 *((GLubyte
*)fy
) = *((GLubyte
*)by
);
1516 int flush_agp(viaContextPtr vmesa
, drm_via_flush_agp_t
* agpCmd
)
1518 GLuint
*pnAGPCurrentPhysStart
;
1519 GLuint
*pnAGPCurrentPhysEnd
;
1520 GLuint
*pnAGPCurrentStart
;
1521 GLuint
*pnAGPCurrentEnd
;
1522 volatile GLuint
*pnMMIOBase
;
1523 volatile GLuint
*pnEngBaseTranSet
;
1524 volatile GLuint
*pnEngBaseTranSpace
;
1526 GLuint ofs
= vmesa
->dma
[vmesa
->dmaIndex
].offset
;
1527 GLuint
*vb
= (GLuint
*)vmesa
->dmaAddr
;
1530 pnMMIOBase
= vmesa
->regMMIOBase
;
1531 pnEngBaseTranSet
= vmesa
->regTranSet
;
1532 pnEngBaseTranSpace
= vmesa
->regTranSpace
;
1533 *pnEngBaseTranSet
= (0x0010 << 16);
1534 agpBase
= vmesa
->agpBase
;
1536 if (!agpCmd
->size
) {
1541 volatile GLuint
*pnEngBase
= vmesa
->regEngineStatus
;
1545 nStatus
= *pnEngBase
;
1546 if ((nStatus
& 0xFFFEFFFF) == 0x00020000)
1552 pnAGPCurrentStart
= (GLuint
*)(ofs
+ agpCmd
->offset
);
1553 pnAGPCurrentEnd
= (GLuint
*)((GLuint
)pnAGPCurrentStart
+ vmesa
->dmaHigh
);
1554 pnAGPCurrentPhysStart
= (GLuint
*)( (GLuint
)pnAGPCurrentStart
+ (GLuint
)agpBase
);
1555 pnAGPCurrentPhysEnd
= (GLuint
*)( (GLuint
)pnAGPCurrentEnd
+ (GLuint
)agpBase
);
1557 /*=* [DBG] make draw to front buffer *=*/
1559 vmesa
->glCtx
->Color
._DrawDestMask
= __GL_FRONT_BUFFER_MASK
;
1561 if (vmesa
->glCtx
->Color
._DrawDestMask
== __GL_BACK_BUFFER_MASK
) {
1564 *vb
++ = (HC_ParaType_NotTex
<< 16);
1565 if (vmesa
->driDrawable
->w
== 0 || vmesa
->driDrawable
->h
== 0) {
1566 *vb
++ = (HC_SubA_HClipTB
<< 24) | 0x0;
1567 *vb
++ = (HC_SubA_HClipLR
<< 24) | 0x0;
1570 *vb
++ = ((HC_SubA_HClipTB
<< 24) | (0x0 << 12) | vmesa
->driDrawable
->h
);
1571 *vb
++ = ((HC_SubA_HClipLR
<< 24) | (vmesa
->drawXoff
<< 12) | (vmesa
->driDrawable
->w
+ vmesa
->drawXoff
));
1575 GLuint pitch
, format
, offset
;
1577 if (vmesa
->viaScreen
->bitsPerPixel
== 0x20) {
1578 format
= HC_HDBFM_ARGB8888
;
1580 else if (vmesa
->viaScreen
->bitsPerPixel
== 0x10) {
1581 format
= HC_HDBFM_RGB565
;
1588 offset
= vmesa
->back
.offset
;
1589 pitch
= vmesa
->back
.pitch
;
1591 *vb
++ = ((HC_SubA_HDBBasL
<< 24) | (offset
& 0xFFFFFF));
1592 *vb
++ = ((HC_SubA_HDBBasH
<< 24) | ((offset
& 0xFF000000)) >> 24);
1593 *vb
++ = ((HC_SubA_HDBFM
<< 24) | HC_HDBLoc_Local
| format
| pitch
);
1597 *pnEngBaseTranSpace
= (HC_SubA_HAGPBstL
<< 24) |
1598 ((GLuint
)(pnAGPCurrentPhysStart
) & 0xFFFFFF);
1599 *pnEngBaseTranSpace
= (HC_SubA_HAGPBendL
<< 24) |
1600 ((GLuint
)(pnAGPCurrentPhysEnd
) & 0xFFFFFF);
1601 *pnEngBaseTranSpace
= (HC_SubA_HAGPCMNT
<< 24) |
1602 ((GLuint
)(pnAGPCurrentPhysEnd
) & 0xFF000000) >> 16 |
1603 ((GLuint
)(pnAGPCurrentPhysStart
) & 0xFF000000) >> 24;
1604 *pnEngBaseTranSpace
= (HC_SubA_HAGPBpH
<< 24) |
1605 ((GLuint
)((GLbyte
*)pnAGPCurrentPhysStart
+ agpCmd
->size
- 4) & 0xFF000000) >> 24;
1606 *pnEngBaseTranSpace
= (HC_SubA_HAGPBpL
<< 24) |
1607 ((GLuint
)((GLbyte
*)pnAGPCurrentPhysStart
+ agpCmd
->size
- 4) & 0xFFFFFF) |
1609 *pnEngBaseTranSpace
= (HC_SubA_HAGPCMNT
<< 24) |
1610 ((GLuint
)(pnAGPCurrentPhysEnd
) & 0xFF000000) >> 16 |
1611 ((GLuint
)(pnAGPCurrentPhysStart
) & 0xFF000000) >> 24 |
1616 GLuint clipL
, clipR
, clipT
, clipB
;
1617 drm_clip_rect_t
*b
= vmesa
->sarea
->boxes
;
1619 *vb
++ = (HC_ParaType_NotTex
<< 16);
1622 *pnEngBaseTranSpace
= (HC_SubA_HAGPBstL
<< 24) |
1623 ((GLuint
)(pnAGPCurrentPhysStart
) & 0xFFFFFF);
1624 *pnEngBaseTranSpace
= (HC_SubA_HAGPBendL
<< 24) |
1625 ((GLuint
)(pnAGPCurrentPhysEnd
) & 0xFFFFFF);
1626 *pnEngBaseTranSpace
= (HC_SubA_HAGPCMNT
<< 24) |
1627 ((GLuint
)(pnAGPCurrentPhysEnd
) & 0xFF000000) >> 16 |
1628 ((GLuint
)(pnAGPCurrentPhysStart
) & 0xFF000000) >> 24;
1629 *pnEngBaseTranSpace
= (HC_SubA_HAGPBpH
<< 24) |
1630 ((GLuint
)((GLbyte
*)pnAGPCurrentPhysStart
+ agpCmd
->size
- 4) & 0xFF000000) >> 24;
1631 *pnEngBaseTranSpace
= (HC_SubA_HAGPBpL
<< 24) |
1632 ((GLuint
)((GLbyte
*)pnAGPCurrentPhysStart
+ agpCmd
->size
- 4) & 0xFFFFFF) |
1635 for (i
= 0; i
< vmesa
->sarea
->nbox
; i
++) {
1637 volatile GLuint
*pnEngBase
= vmesa
->regEngineStatus
;
1641 nStatus
= *pnEngBase
;
1642 if ((nStatus
& 0xFFFEFFFF) == 0x00020000)
1647 clipL
= b
->x1
+ vmesa
->drawXoff
;
1652 if (VIA_DEBUG
) fprintf(stderr
, "clip = %d\n", i
);
1654 if (vmesa
->driDrawable
->w
== 0 || vmesa
->driDrawable
->h
== 0) {
1656 *vb
= (HC_SubA_HClipTB
<< 24) | 0x0;
1659 *vb
= (HC_SubA_HClipLR
<< 24) | 0x0;
1663 *vb
= (HC_SubA_HClipTB
<< 24) | (clipT
<< 12) | clipB
;
1666 *vb
= (HC_SubA_HClipLR
<< 24) | (clipL
<< 12) | clipR
;
1671 GLuint pitch
, format
, offset
;
1672 GLuint bytePerPixel
= vmesa
->viaScreen
->bitsPerPixel
>> 3;
1674 if (vmesa
->viaScreen
->bitsPerPixel
== 0x20) {
1675 format
= HC_HDBFM_ARGB8888
;
1677 else if (vmesa
->viaScreen
->bitsPerPixel
== 0x10) {
1678 format
= HC_HDBFM_RGB565
;
1683 pitch
= vmesa
->front
.pitch
;
1684 offset
= vmesa
->viaScreen
->fbOffset
+ (vmesa
->drawY
* pitch
+ vmesa
->drawX
* bytePerPixel
);
1685 offset
= offset
& 0xffffffe0;
1687 *vb
++ = ((HC_SubA_HDBBasL
<< 24) | (offset
& 0xFFFFFF));
1688 *vb
++ = ((HC_SubA_HDBBasH
<< 24) | ((offset
& 0xFF000000)) >> 24);
1689 *vb
++ = ((HC_SubA_HDBFM
<< 24) | HC_HDBLoc_Local
| format
| pitch
);
1692 *pnEngBaseTranSpace
= (HC_SubA_HAGPCMNT
<< 24) |
1693 ((GLuint
)(pnAGPCurrentPhysEnd
) & 0xFF000000) >> 16 |
1694 ((GLuint
)(pnAGPCurrentPhysStart
) & 0xFF000000) >> 24 |
1699 GLuint
*data
= (GLuint
*)vmesa
->dmaAddr
;
1700 for (i
= 0; i
< vmesa
->dmaLow
; i
+= 16) {
1701 fprintf(stderr
, "%08x ", *data
++);
1702 fprintf(stderr
, "%08x ", *data
++);
1703 fprintf(stderr
, "%08x ", *data
++);
1704 fprintf(stderr
, "%08x\n", *data
++);
1706 fprintf(stderr
, "******************************************\n");
1716 volatile GLuint
*pnEngBase
= (volatile GLuint
*)((GLuint
)pnMMIOBase
+ 0x400);
1721 nStatus
= *pnEngBase
;
1722 if ((nStatus
& 0xFFFEFFFF) == 0x00020000) {
1728 /* dump current command buffer */
1729 data
= (GLuint
*)vmesa
->dmaAddr
;
1732 fprintf(stderr
, "current command buffer");
1733 fprintf(stderr
, "i = %d\n", i
);
1734 for (j
= 0; j
< vmesa
->dmaLow
; j
+= 16) {
1735 fprintf(stderr
, "%08x ", *data
++);
1736 fprintf(stderr
, "%08x ", *data
++);
1737 fprintf(stderr
, "%08x ", *data
++);
1738 fprintf(stderr
, "%08x\n", *data
++);
1741 /* dump previous command buffer */
1742 if (vmesa
->dmaIndex
) {
1743 data
= (GLuint
*)vmesa
->dma
[0].map
;
1746 data
= (GLuint
*)vmesa
->dma
[1].map
;
1749 fprintf(stderr
, "previous command buffer");
1750 fprintf(stderr
, "i = %d\n", i
);
1751 for (j
= 0; j
< dmaLow
; j
+= 16) {
1752 fprintf(stderr
, "%08x ", *data
++);
1753 fprintf(stderr
, "%08x ", *data
++);
1754 fprintf(stderr
, "%08x ", *data
++);
1755 fprintf(stderr
, "%08x\n", *data
++);
1763 dmaLow
= vmesa
->dmaLow
;
1767 int flush_agp_saam(viaContextPtr vmesa
, drm_via_flush_agp_t
* agpCmd
)
1769 GLuint
*pnAGPCurrentPhysStart
;
1770 GLuint
*pnAGPCurrentPhysEnd
;
1771 GLuint
*pnAGPCurrentStart
;
1772 GLuint
*pnAGPCurrentEnd
;
1773 volatile GLuint
*pnMMIOBase
;
1774 volatile GLuint
*pnEngBaseTranSet
;
1775 volatile GLuint
*pnEngBaseTranSpace
;
1777 GLuint ofs
= vmesa
->dma
[vmesa
->dmaIndex
].offset
;
1778 GLuint
*vb
= (GLuint
*)vmesa
->dmaAddr
;
1781 pnMMIOBase
= vmesa
->regMMIOBase
;
1782 pnEngBaseTranSet
= vmesa
->regTranSet
;
1783 pnEngBaseTranSpace
= vmesa
->regTranSpace
;
1784 *pnEngBaseTranSet
= (0x0010 << 16);
1785 agpBase
= vmesa
->agpBase
;
1787 if (!agpCmd
->size
) {
1792 volatile GLuint
*pnEngBase
= vmesa
->regEngineStatus
;
1796 nStatus
= *pnEngBase
;
1797 if ((nStatus
& 0xFFFEFFFF) == 0x00020000)
1803 pnAGPCurrentStart
= (GLuint
*)(ofs
+ agpCmd
->offset
);
1804 pnAGPCurrentEnd
= (GLuint
*)((GLuint
)pnAGPCurrentStart
+ vmesa
->dmaHigh
);
1805 pnAGPCurrentPhysStart
= (GLuint
*)( (GLuint
)pnAGPCurrentStart
+ (GLuint
)agpBase
);
1806 pnAGPCurrentPhysEnd
= (GLuint
*)( (GLuint
)pnAGPCurrentEnd
+ (GLuint
)agpBase
);
1808 /*=* [DBG] make draw to front buffer *=*/
1810 vmesa
->glCtx
->Color
._DrawDestMask
= __GL_FRONT_BUFFER_MASK
;
1812 if (vmesa
->glCtx
->Color
._DrawDestMask
== __GL_BACK_BUFFER_MASK
) {
1815 *vb
++ = (HC_ParaType_NotTex
<< 16);
1816 if (vmesa
->driDrawable
->w
== 0 || vmesa
->driDrawable
->h
== 0) {
1817 *vb
++ = (HC_SubA_HClipTB
<< 24) | 0x0;
1818 *vb
++ = (HC_SubA_HClipLR
<< 24) | 0x0;
1821 *vb
++ = ((HC_SubA_HClipTB
<< 24) | (0x0 << 12) | vmesa
->driDrawable
->h
);
1822 *vb
++ = ((HC_SubA_HClipLR
<< 24) | (vmesa
->drawXoff
<< 12) | (vmesa
->driDrawable
->w
+ vmesa
->drawXoff
));
1826 GLuint pitch
, format
, offset
;
1828 if (vmesa
->viaScreen
->bitsPerPixel
== 0x20) {
1829 format
= HC_HDBFM_ARGB8888
;
1831 else if (vmesa
->viaScreen
->bitsPerPixel
== 0x10) {
1832 format
= HC_HDBFM_RGB565
;
1837 offset
= vmesa
->back
.offset
;
1838 pitch
= vmesa
->back
.pitch
;
1840 *vb
++ = ((HC_SubA_HDBBasL
<< 24) | (offset
& 0xFFFFFF));
1841 *vb
++ = ((HC_SubA_HDBBasH
<< 24) | ((offset
& 0xFF000000)) >> 24);
1842 *vb
++ = ((HC_SubA_HDBFM
<< 24) | HC_HDBLoc_Local
| format
| pitch
);
1846 *pnEngBaseTranSpace
= (HC_SubA_HAGPBstL
<< 24) |
1847 ((GLuint
)(pnAGPCurrentPhysStart
) & 0xFFFFFF);
1848 *pnEngBaseTranSpace
= (HC_SubA_HAGPBendL
<< 24) |
1849 ((GLuint
)(pnAGPCurrentPhysEnd
) & 0xFFFFFF);
1850 *pnEngBaseTranSpace
= (HC_SubA_HAGPCMNT
<< 24) |
1851 ((GLuint
)(pnAGPCurrentPhysEnd
) & 0xFF000000) >> 16 |
1852 ((GLuint
)(pnAGPCurrentPhysStart
) & 0xFF000000) >> 24;
1853 *pnEngBaseTranSpace
= (HC_SubA_HAGPBpH
<< 24) |
1854 ((GLuint
)((GLbyte
*)pnAGPCurrentPhysStart
+ agpCmd
->size
- 4) & 0xFF000000) >> 24;
1855 *pnEngBaseTranSpace
= (HC_SubA_HAGPBpL
<< 24) |
1856 ((GLuint
)((GLbyte
*)pnAGPCurrentPhysStart
+ agpCmd
->size
- 4) & 0xFFFFFF) |
1858 *pnEngBaseTranSpace
= (HC_SubA_HAGPCMNT
<< 24) |
1859 ((GLuint
)(pnAGPCurrentPhysEnd
) & 0xFF000000) >> 16 |
1860 ((GLuint
)(pnAGPCurrentPhysStart
) & 0xFF000000) >> 24 |
1865 GLuint clipL
, clipR
, clipT
, clipB
;
1866 drm_clip_rect_t
*b
= vmesa
->sarea
->boxes
;
1868 *vb
++ = (HC_ParaType_NotTex
<< 16);
1871 *pnEngBaseTranSpace
= (HC_SubA_HAGPBstL
<< 24) |
1872 ((GLuint
)(pnAGPCurrentPhysStart
) & 0xFFFFFF);
1873 *pnEngBaseTranSpace
= (HC_SubA_HAGPBendL
<< 24) |
1874 ((GLuint
)(pnAGPCurrentPhysEnd
) & 0xFFFFFF);
1875 *pnEngBaseTranSpace
= (HC_SubA_HAGPCMNT
<< 24) |
1876 ((GLuint
)(pnAGPCurrentPhysEnd
) & 0xFF000000) >> 16 |
1877 ((GLuint
)(pnAGPCurrentPhysStart
) & 0xFF000000) >> 24;
1878 *pnEngBaseTranSpace
= (HC_SubA_HAGPBpH
<< 24) |
1879 ((GLuint
)((GLbyte
*)pnAGPCurrentPhysStart
+ agpCmd
->size
- 4) & 0xFF000000) >> 24;
1880 *pnEngBaseTranSpace
= (HC_SubA_HAGPBpL
<< 24) |
1881 ((GLuint
)((GLbyte
*)pnAGPCurrentPhysStart
+ agpCmd
->size
- 4) & 0xFFFFFF) |
1884 for (i
= 0; i
< vmesa
->sarea
->nbox
; i
++) {
1886 volatile GLuint
*pnEngBase
= vmesa
->regEngineStatus
;
1890 nStatus
= *pnEngBase
;
1891 if ((nStatus
& 0xFFFEFFFF) == 0x00020000)
1896 clipL
= b
->x1
+ vmesa
->drawXoff
;
1901 if (VIA_DEBUG
) fprintf(stderr
, "clip = %d\n", i
);
1903 if (vmesa
->driDrawable
->w
== 0 || vmesa
->driDrawable
->h
== 0) {
1905 *vb
= (HC_SubA_HClipTB
<< 24) | 0x0;
1908 *vb
= (HC_SubA_HClipLR
<< 24) | 0x0;
1912 *vb
= (HC_SubA_HClipTB
<< 24) | (clipT
<< 12) | clipB
;
1915 *vb
= (HC_SubA_HClipLR
<< 24) | (clipL
<< 12) | clipR
;
1920 GLuint pitch
, format
, offset
;
1921 GLuint bytePerPixel
= vmesa
->viaScreen
->bitsPerPixel
>> 3;
1923 if (vmesa
->viaScreen
->bitsPerPixel
== 0x20) {
1924 format
= HC_HDBFM_ARGB8888
;
1926 else if (vmesa
->viaScreen
->bitsPerPixel
== 0x10) {
1927 format
= HC_HDBFM_RGB565
;
1932 pitch
= vmesa
->front
.pitch
;
1933 offset
= vmesa
->viaScreen
->fbOffset
+ (vmesa
->drawY
* pitch
+ vmesa
->drawX
* bytePerPixel
);
1934 offset
= offset
& 0xffffffe0;
1936 *vb
++ = ((HC_SubA_HDBBasL
<< 24) | (offset
& 0xFFFFFF));
1937 *vb
++ = ((HC_SubA_HDBBasH
<< 24) | ((offset
& 0xFF000000)) >> 24);
1938 *vb
++ = ((HC_SubA_HDBFM
<< 24) | HC_HDBLoc_Local
| format
| pitch
);
1941 *pnEngBaseTranSpace
= (HC_SubA_HAGPCMNT
<< 24) |
1942 ((GLuint
)(pnAGPCurrentPhysEnd
) & 0xFF000000) >> 16 |
1943 ((GLuint
)(pnAGPCurrentPhysStart
) & 0xFF000000) >> 24 |
1948 GLuint
*data
= (GLuint
*)vmesa
->dmaAddr
;
1949 for (i
= 0; i
< vmesa
->dmaLow
; i
+= 16) {
1950 fprintf(stderr
, "%08x ", *data
++);
1951 fprintf(stderr
, "%08x ", *data
++);
1952 fprintf(stderr
, "%08x ", *data
++);
1953 fprintf(stderr
, "%08x\n", *data
++);
1955 fprintf(stderr
, "******************************************\n");
1965 volatile GLuint
*pnEngBase
= (GLuint
*)((GLuint
)pnMMIOBase
+ 0x400);
1970 nStatus
= *pnEngBase
;
1971 if ((nStatus
& 0xFFFEFFFF) == 0x00020000) {
1977 /* dump current command buffer */
1978 data
= (GLuint
*)vmesa
->dmaAddr
;
1981 fprintf(stderr
, "current command buffer");
1982 fprintf(stderr
, "i = %d\n", i
);
1983 for (j
= 0; j
< vmesa
->dmaLow
; j
+= 16) {
1984 fprintf(stderr
, "%08x ", *data
++);
1985 fprintf(stderr
, "%08x ", *data
++);
1986 fprintf(stderr
, "%08x ", *data
++);
1987 fprintf(stderr
, "%08x\n", *data
++);
1990 /* dump previous command buffer */
1991 if (vmesa
->dmaIndex
) {
1992 data
= (GLuint
*)vmesa
->dma
[0].map
;
1995 data
= (GLuint
*)vmesa
->dma
[1].map
;
1998 fprintf(stderr
, "previous command buffer");
1999 fprintf(stderr
, "i = %d\n", i
);
2000 for (j
= 0; j
< dmaLow
; j
+= 16) {
2001 fprintf(stderr
, "%08x ", *data
++);
2002 fprintf(stderr
, "%08x ", *data
++);
2003 fprintf(stderr
, "%08x ", *data
++);
2004 fprintf(stderr
, "%08x\n", *data
++);
2012 dmaLow
= vmesa
->dmaLow
;
2016 int flush_sys(viaContextPtr vmesa
, drm_via_flush_sys_t
* buf
)
2021 volatile GLuint
*pnMMIOBase
;
2022 volatile GLuint
*pnEngBaseTranSet
;
2023 volatile GLuint
*pnEngBaseTranSpace
;
2024 GLuint uCheck2DCmd
= GL_TRUE
;
2026 GLuint
*vb
= (GLuint
*)vmesa
->dmaAddr
;
2029 pnMMIOBase
= vmesa
->regMMIOBase
;
2030 pnEngBaseTranSet
= vmesa
->regTranSet
;
2031 pnEngBaseTranSpace
= vmesa
->regTranSpace
;
2033 pnBuf
= (GLuint
*)(buf
->index
+ buf
->offset
);
2034 pnEnd
= (GLuint
*)((GLuint
)pnBuf
+ buf
->size
);
2036 /*=* [DBG] make draw to front buffer *=*/
2038 vmesa
->glCtx
->Color
._DrawDestMask
= __GL_FRONT_BUFFER_MASK
;
2041 /*=* John Sheng [2003.6.20] fix pci *=*/
2043 volatile GLuint
*pnEngBase
= vmesa
->regEngineStatus
;
2047 nStatus
= *pnEngBase
;
2048 if ((nStatus
& 0xFFFEFFFF) == 0x00020000)
2053 /*=* John Sheng [2003.12.9] Tuxracer & VQ *=*/
2054 /*=* Disable VQ *=*/
2055 if (vmesa
->VQEnable
)
2058 *vmesa
->regTranSet
= 0x00fe0000;
2059 *vmesa
->regTranSet
= 0x00fe0000;
2060 *vmesa
->regTranSpace
= 0x00000004;
2061 *vmesa
->regTranSpace
= 0x40008c0f;
2062 *vmesa
->regTranSpace
= 0x44000000;
2063 *vmesa
->regTranSpace
= 0x45080c04;
2064 *vmesa
->regTranSpace
= 0x46800408;
2065 vmesa
->VQEnable
= 0;
2067 if (vmesa
->glCtx
->Color
._DrawDestMask
== __GL_BACK_BUFFER_MASK
) {
2069 *vb
++ = (HC_ParaType_NotTex
<< 16);
2071 if (vmesa
->driDrawable
->w
== 0 || vmesa
->driDrawable
->h
== 0) {
2072 *vb
++ = (HC_SubA_HClipTB
<< 24) | 0x0;
2073 *vb
++ = (HC_SubA_HClipLR
<< 24) | 0x0;
2076 *vb
++ = ((HC_SubA_HClipTB
<< 24) | (0x0 << 12) | vmesa
->driDrawable
->h
);
2077 *vb
++ = ((HC_SubA_HClipLR
<< 24) | (vmesa
->drawXoff
<< 12) | (vmesa
->driDrawable
->w
+ vmesa
->drawXoff
));
2080 /*=* John Sheng [2003.6.16] fix pci path *=*/
2082 GLuint pitch
, format
, offset
;
2084 if (vmesa
->viaScreen
->bitsPerPixel
== 0x20) {
2085 format
= HC_HDBFM_ARGB8888
;
2087 else if (vmesa
->viaScreen
->bitsPerPixel
== 0x10) {
2088 format
= HC_HDBFM_RGB565
;
2093 offset
= vmesa
->back
.offset
;
2094 pitch
= vmesa
->back
.pitch
;
2096 *vb
++ = ((HC_SubA_HDBBasL
<< 24) | (offset
& 0xFFFFFF));
2097 *vb
++ = ((HC_SubA_HDBBasH
<< 24) | ((offset
& 0xFF000000)) >> 24);
2098 *vb
++ = ((HC_SubA_HDBFM
<< 24) | HC_HDBLoc_Local
| format
| pitch
);
2102 while (pnBuf
!= pnEnd
) {
2103 if (*pnBuf
== HALCYON_HEADER2
) {
2105 if (*pnBuf
== HALCYON_SUB_ADDR0
) {
2106 *pnEngBaseTranSet
= *pnBuf
;
2108 uCheck2DCmd
= GL_FALSE
;
2111 *pnEngBaseTranSet
= *pnBuf
;
2113 uCheck2DCmd
= GL_TRUE
;
2116 else if (uCheck2DCmd
&& ((*pnBuf
&HALCYON_HEADER1MASK
)==HALCYON_HEADER1
)) {
2117 addr
= ((*pnBuf
)&0x0000001f) << 2;
2119 *((GLuint
*)((GLuint
)pnMMIOBase
+addr
)) = *pnBuf
;
2122 else if ((*pnBuf
&HALCYON_FIREMASK
) == HALCYON_FIRECMD
) {
2123 *pnEngBaseTranSpace
= *pnBuf
;
2125 if ((pnBuf
!=pnEnd
)&&((*pnBuf
&HALCYON_FIREMASK
)==HALCYON_FIRECMD
))
2127 if ((*pnBuf
&HALCYON_CMDBMASK
) != HC_ACMD_HCmdB
)
2128 uCheck2DCmd
= GL_TRUE
;
2131 *pnEngBaseTranSpace
= *pnBuf
;
2138 GLuint clipL
, clipR
, clipT
, clipB
;
2139 drm_clip_rect_t
*b
= vmesa
->sarea
->boxes
;
2143 *vb
++ = (HC_ParaType_NotTex
<< 16);
2148 for (i
= 0; i
< vmesa
->sarea
->nbox
; i
++) {
2149 clipL
= b
->x1
+ vmesa
->drawXoff
;
2150 clipR
= b
->x2
+ vmesa
->drawXoff
;
2154 if (vmesa
->driDrawable
->w
== 0 || vmesa
->driDrawable
->h
== 0) {
2155 *vb
= (HC_SubA_HClipTB
<< 24) | 0x0;
2157 *vb
= (HC_SubA_HClipLR
<< 24) | 0x0;
2161 *vb
= (HC_SubA_HClipTB
<< 24) | (clipT
<< 12) | clipB
;
2163 *vb
= (HC_SubA_HClipLR
<< 24) | (clipL
<< 12) | clipR
;
2167 /*=* John Sheng [2003.6.16] fix pci path *=*/
2169 GLuint pitch
, format
, offset
;
2170 GLuint bytePerPixel
= vmesa
->viaScreen
->bitsPerPixel
>> 3;
2172 if (vmesa
->viaScreen
->bitsPerPixel
== 0x20) {
2173 format
= HC_HDBFM_ARGB8888
;
2175 else if (vmesa
->viaScreen
->bitsPerPixel
== 0x10) {
2176 format
= HC_HDBFM_RGB565
;
2181 pitch
= vmesa
->front
.pitch
;
2182 offset
= vmesa
->viaScreen
->fbOffset
+ (vmesa
->drawY
* pitch
+ vmesa
->drawX
* bytePerPixel
);
2183 offset
= offset
& 0xffffffe0;
2185 *vb
++ = ((HC_SubA_HDBBasL
<< 24) | (offset
& 0xFFFFFF));
2186 *vb
++ = ((HC_SubA_HDBBasH
<< 24) | ((offset
& 0xFF000000)) >> 24);
2187 *vb
++ = ((HC_SubA_HDBFM
<< 24) | HC_HDBLoc_Local
| format
| pitch
);
2193 while (pnBuf
!= pnEnd
) {
2194 if (*pnBuf
== HALCYON_HEADER2
) {
2196 if (*pnBuf
== HALCYON_SUB_ADDR0
) {
2197 *pnEngBaseTranSet
= *pnBuf
;
2199 uCheck2DCmd
= GL_FALSE
;
2202 *pnEngBaseTranSet
= *pnBuf
;
2204 uCheck2DCmd
= GL_TRUE
;
2207 else if (uCheck2DCmd
&& ((*pnBuf
&HALCYON_HEADER1MASK
)==HALCYON_HEADER1
)) {
2208 addr
= ((*pnBuf
)&0x0000001f) << 2;
2210 *((GLuint
*)((GLuint
)pnMMIOBase
+addr
)) = *pnBuf
;
2213 else if ((*pnBuf
&HALCYON_FIREMASK
) == HALCYON_FIRECMD
) {
2214 *pnEngBaseTranSpace
= *pnBuf
;
2216 if ((pnBuf
!=pnEnd
)&&((*pnBuf
&HALCYON_FIREMASK
)==HALCYON_FIRECMD
))
2218 if ((*pnBuf
&HALCYON_CMDBMASK
) != HC_ACMD_HCmdB
)
2219 uCheck2DCmd
= GL_TRUE
;
2222 *pnEngBaseTranSpace
= *pnBuf
;
2230 /*=* John Sheng [2003.6.20] debug pci *=*/
2232 GLuint
*pnEngBase
= (GLuint
*)((GLuint
)pnMMIOBase
+ 0x400);
2237 nStatus
= *pnEngBase
;
2238 if ((nStatus
& 0xFFFEFFFF) == 0x00020000) {
2244 data
= (GLuint
*)vmesa
->dmaAddr
;
2245 /*=* John Sheng [2003.12.9] Tuxracer & VQ *=*/
2251 /*=* John Sheng [2003.12.9] Tuxracer & VQ *=*/
2252 for (k
=0 ; k
< 35; k
++) {
2253 fprintf(stderr
, "%02xh - %02xh\n", k
*4 + 3, k
*4);
2254 fprintf(stderr
, "%08x\n", *ES
);
2257 fprintf(stderr
, "current command buffer");
2258 fprintf(stderr
, "i = %d\n", i
);
2259 for (j
= 0; j
< vmesa
->dmaLow
; j
+= 16) {
2260 fprintf(stderr
, "%08x ", *data
++);
2261 fprintf(stderr
, "%08x ", *data
++);
2262 fprintf(stderr
, "%08x ", *data
++);
2263 fprintf(stderr
, "%08x\n", *data
++);
2266 if (vmesa
->dmaIndex
) {
2267 data
= (GLuint
*)vmesa
->dma
[0].map
;
2270 data
= (GLuint
*)vmesa
->dma
[1].map
;
2273 fprintf(stderr
, "previous command buffer");
2274 fprintf(stderr
, "i = %d\n", i
);
2275 for (j
= 0; j
< dmaLow
; j
+= 16) {
2276 fprintf(stderr
, "%08x ", *data
++);
2277 fprintf(stderr
, "%08x ", *data
++);
2278 fprintf(stderr
, "%08x ", *data
++);
2279 fprintf(stderr
, "%08x\n", *data
++);
2286 dmaLow
= vmesa
->dmaLow
;