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 *=*/
319 scrn
= vmesa
->saam
& S_MASK
;
321 for (i
= 0; i
< nbox
; ) {
322 int nr
= MIN2(i
+ VIA_NR_SAREA_CLIPRECTS
, dPriv
->numClipRects
);
323 drm_clip_rect_t
*b
= (drm_clip_rect_t
*)vmesa
->sarea
->boxes
;
325 vmesa
->sarea
->nbox
= nr
- i
;
329 viaDoSwapBuffers(vmesa
);
331 if (VIA_DEBUG
) fprintf(stderr
, "%s SwapBuffers\n", __FUNCTION__
);
335 else if (scrn
== S0
|| scrn
== S1
) {
336 for (i
= 0; i
< nbox
; ) {
337 int nr
= MIN2(i
+ VIA_NR_SAREA_CLIPRECTS
, vmesa
->numClipRects
);
338 drm_clip_rect_t
*b
= (drm_clip_rect_t
*)vmesa
->sarea
->boxes
;
340 vmesa
->sarea
->nbox
= nr
- i
;
342 for (; i
< nr
; i
++) {
345 viaDoSwapBuffers(vmesa
);
350 for (i
= 0; i
< nbox
; ) {
351 int nr
= MIN2(i
+ VIA_NR_SAREA_CLIPRECTS
, dPriv
->numClipRects
);
352 drm_clip_rect_t
*b
= (drm_clip_rect_t
*)vmesa
->sarea
->boxes
;
354 vmesa
->sarea
->nbox
= nr
- i
;
358 viaDoSwapBuffers(vmesa
);
361 pbox
= vmesa
->pSaamRects
;
362 nbox
= vmesa
->numSaamRects
;
364 for (i
= 0; i
< nbox
; ) {
365 int nr
= MIN2(i
+ VIA_NR_SAREA_CLIPRECTS
, vmesa
->numSaamRects
);
366 drm_clip_rect_t
*b
= (drm_clip_rect_t
*)vmesa
->sarea
->boxes
;
368 vmesa
->sarea
->nbox
= nr
- i
;
373 viaDoSwapBuffersSaam(vmesa
);
377 UNLOCK_HARDWARE(vmesa
);
378 vmesa
->uploadCliprects
= GL_TRUE
;
380 if (VIA_DEBUG
) fprintf(stderr
, "%s out\n", __FUNCTION__
);
385 * XXX implement when full-screen extension is done.
387 void viaPageFlip(const __DRIdrawablePrivate
*dPriv
)
389 /*=* John Sheng [2003.5.31] flip *=*/
390 viaContextPtr vmesa
= (viaContextPtr
)dPriv
->driContextPriv
->driverPrivate
;
391 GLuint
*vb
= viaCheckDma(vmesa
, vmesa
->sarea
->nbox
*56);
393 viaBuffer buffer_tmp
;
397 if (VIA_DEBUG
) fprintf(stderr
, "%s - in\n", __FUNCTION__
);
400 assert(dPriv
->driContextPriv
);
401 assert(dPriv
->driContextPriv
->driverPrivate
);
405 /*=* [DBG] make draw to front buffer *=*/
411 viaFlushPrimsLocked(vmesa
);
412 while ((*(volatile GLuint
*)((GLuint
)vmesa
->regMMIOBase
+ 0x200) & 0x2) != 0x2);
413 while (*(volatile GLuint
*)((GLuint
)vmesa
->regMMIOBase
+ 0x200) & 0x2);
414 nBackBase
= vmesa
->back
.offset
>> 1;
417 *vb++ = HALCYON_HEADER2;
423 nFirstFlip = GL_FALSE;
425 SetReg2DAGP(0x214, nBackBase);
426 viaFlushPrimsLocked(vmesa);*/
428 *((volatile GLuint
*)((GLuint
)vmesa
->regMMIOBase
+ 0x43c)) = 0x00fe0000;
429 *((volatile GLuint
*)((GLuint
)vmesa
->regMMIOBase
+ 0x440)) = 0x00001004;
430 nFirstFlip
= GL_FALSE
;
432 *((GLuint
*)((GLuint
)vmesa
->regMMIOBase
+ 0x214)) = nBackBase
;
436 viaFlushPrimsLocked(vmesa
);
437 vb
= viaCheckDma(vmesa
, vmesa
->sarea
->nbox
*56);
439 *vb
++ = HALCYON_HEADER2
;
445 nFirstSwap
= GL_FALSE
;
447 nBackBase
= (vmesa
->back
.offset
<< 1);
449 *vb
++ = HALCYON_HEADER2
;
451 *vb
++ = (HC_SubA_HFBBasL
<< 24) | (nBackBase
& 0xFFFFF8) | 0x2;
452 *vb
++ = (HC_SubA_HFBDrawFirst
<< 24) |
453 ((nBackBase
& 0xFF000000) >> 24) | 0x0100;
455 viaFlushPrimsLocked(vmesa
);
459 memcpy(&buffer_tmp
, &vmesa
->back
, sizeof(viaBuffer
));
460 memcpy(&vmesa
->back
, &vmesa
->front
, sizeof(viaBuffer
));
461 memcpy(&vmesa
->front
, &buffer_tmp
, sizeof(viaBuffer
));
463 if(vmesa
->currentPage
) {
464 vmesa
->currentPage
= 0;
465 if (vmesa
->glCtx
->Color
._DrawDestMask
[0] == __GL_BACK_BUFFER_MASK
) {
466 ctx
->Driver
.DrawBuffer(ctx
, GL_BACK
);
469 ctx
->Driver
.DrawBuffer(ctx
, GL_FRONT
);
473 vmesa
->currentPage
= 1;
474 if (vmesa
->glCtx
->Color
._DrawDestMask
[0] == __GL_BACK_BUFFER_MASK
) {
475 ctx
->Driver
.DrawBuffer(ctx
, GL_BACK
);
478 ctx
->Driver
.DrawBuffer(ctx
, GL_FRONT
);
482 if (VIA_DEBUG
) fprintf(stderr
, "%s - out\n", __FUNCTION__
);
487 /* This waits for *everybody* to finish rendering -- overkill.
489 void viaDmaFinish(viaContextPtr vmesa
)
492 if (VIA_DEBUG
) fprintf(stderr
, "%s in\n", __FUNCTION__
);
494 VIA_FIREVERTICES(vmesa
);
495 LOCK_HARDWARE(vmesa
);
496 UNLOCK_HARDWARE(vmesa
);
498 if (VIA_DEBUG
) fprintf(stderr
, "%s out\n", __FUNCTION__
);
502 void viaRegetLockQuiescent(viaContextPtr vmesa
)
504 drmUnlock(vmesa
->driFd
, vmesa
->hHWContext
);
507 static int intersect_rect(drm_clip_rect_t
*out
,
513 if (b
->x1
> out
->x1
) out
->x1
= b
->x1
;
514 if (b
->x2
< out
->x2
) out
->x2
= b
->x2
;
515 if (out
->x1
>= out
->x2
) return 0;
517 if (b
->y1
> out
->y1
) out
->y1
= b
->y1
;
518 if (b
->y2
< out
->y2
) out
->y2
= b
->y2
;
519 if (out
->y1
>= out
->y2
) return 0;
524 void viaFlushPrimsLocked(viaContextPtr vmesa
)
526 drm_clip_rect_t
*pbox
= (drm_clip_rect_t
*)vmesa
->pClipRects
;
527 int nbox
= vmesa
->numClipRects
;
528 drm_via_sarea_t
*sarea
= vmesa
->sarea
;
529 drm_via_flush_agp_t agpCmd
;
530 drm_via_flush_sys_t sysCmd
;
531 GLuint
*vb
= viaCheckDma(vmesa
, 0);
534 if (vmesa
->dmaLow
== DMA_OFFSET
) {
537 if (vmesa
->dmaLow
> 2097152)
538 fprintf(stderr
, "buffer overflow in Flush Prims = %d\n",vmesa
->dmaLow
);
540 switch (vmesa
->dmaLow
& 0x1F) {
543 *vb
++ = (HC_ParaType_NotTex
<< 16);
552 *vb
++ = (HC_ParaType_NotTex
<< 16);
559 *vb
++ = (HC_ParaType_NotTex
<< 16);
578 agpCmd
.size
= vmesa
->dmaLow
;
579 agpCmd
.index
= vmesa
->dma
[vmesa
->dmaIndex
].index
;
584 sysCmd
.size
= vmesa
->dmaLow
;
585 sysCmd
.index
= (GLuint
)vmesa
->dma
[vmesa
->dmaIndex
].map
;
589 sarea
->vertexPrim
= vmesa
->hwPrimitive
;
597 else if (nbox
> VIA_NR_SAREA_CLIPRECTS
) {
598 vmesa
->uploadCliprects
= GL_TRUE
;
600 /*=* John Sheng [2003.5.31] flip *=*/
604 GLuint *data = (GLuint *)vmesa->dmaAddr;
605 for (i = 0; i < vmesa->dmaLow; i += 16) {
606 fprintf(stderr, "%08x ", *data++);
607 fprintf(stderr, "%08x ", *data++);
608 fprintf(stderr, "%08x ", *data++);
609 fprintf(stderr, "%08x\n", *data++);
611 fprintf(stderr, "******************************************\n");
614 if (!nbox
|| !vmesa
->uploadCliprects
) {
622 flush_agp(vmesa
, &agpCmd
);
626 flush_sys(vmesa
, &sysCmd
);
632 scrn
= vmesa
->saam
& S_MASK
;
633 side
= vmesa
->saam
& P_MASK
;
635 for (i
= 0; i
< nbox
; ) {
636 int nr
= MIN2(i
+ VIA_NR_SAREA_CLIPRECTS
, nbox
);
637 drm_clip_rect_t
*b
= sarea
->boxes
;
640 if (vmesa
->glCtx
->Scissor
.Enabled
) {
643 for (; i
< nr
; i
++) {
644 b
->x1
= pbox
[i
].x1
- vmesa
->drawX
;
645 b
->y1
= pbox
[i
].y1
- vmesa
->drawY
;
646 b
->x2
= pbox
[i
].x2
- vmesa
->drawX
;
647 b
->y2
= pbox
[i
].y2
- vmesa
->drawY
;
648 if (intersect_rect(b
, b
, &vmesa
->scissorRect
)) {
654 if (nr
< nbox
) continue;
659 sarea
->nbox
= nr
- i
;
660 for (; i
< nr
; i
++, b
++) {
661 b
->x1
= pbox
[i
].x1
- vmesa
->drawX
;
662 b
->y1
= pbox
[i
].y1
- vmesa
->drawY
;
663 b
->x2
= pbox
[i
].x2
- vmesa
->drawX
;
664 b
->y2
= pbox
[i
].y2
- vmesa
->drawY
;
668 else if (scrn
== S0
|| scrn
== S1
){
669 if (vmesa
->scissor
) {
671 for (; i
< nr
; i
++) {
672 b
->x1
= pbox
[i
].x1
- vmesa
->drawX
;
673 b
->y1
= pbox
[i
].y1
- vmesa
->drawY
;
674 b
->x2
= pbox
[i
].x2
- vmesa
->drawX
;
675 b
->y2
= pbox
[i
].y2
- vmesa
->drawY
;
676 if (intersect_rect(b
, b
, &vmesa
->scissorRect
)) {
682 if (nr
< nbox
) continue;
687 sarea
->nbox
= nr
- i
;
688 for (; i
< nr
; i
++, b
++) {
689 b
->x1
= pbox
[i
].x1
- vmesa
->drawX
;
690 b
->y1
= pbox
[i
].y1
- vmesa
->drawY
;
691 b
->x2
= pbox
[i
].x2
- vmesa
->drawX
;
692 b
->y2
= pbox
[i
].y2
- vmesa
->drawY
;
699 if (vmesa
->scissor
) {
701 for (; i
< nr
; i
++) {
702 b
->x1
= pbox
[i
].x1
- vmesa
->drawX
;
703 b
->y1
= pbox
[i
].y1
- vmesa
->drawY
;
704 b
->x2
= pbox
[i
].x2
- vmesa
->drawX
;
705 b
->y2
= pbox
[i
].y2
- vmesa
->drawY
;
707 if (intersect_rect(b
, b
, &vmesa
->scissorRect
)) {
713 if (nr
< nbox
) continue;
718 sarea
->nbox
= nr
- i
;
719 for (; i
< nr
; i
++, b
++) {
720 b
->x1
= pbox
[i
].x1
- vmesa
->drawX
;
721 b
->y1
= pbox
[i
].y1
- vmesa
->drawY
;
722 b
->x2
= pbox
[i
].x2
- vmesa
->drawX
;
723 b
->y2
= pbox
[i
].y2
- vmesa
->drawY
;
731 flush_agp(vmesa
, &agpCmd
);
735 flush_sys(vmesa
, &sysCmd
);
739 if (scrn
== (S0
| S1
)) {
740 pbox
= (drm_clip_rect_t
*)vmesa
->pSaamRects
;
741 nbox
= vmesa
->numSaamRects
;
742 for (i
= 0; i
< nbox
; ) {
743 int nr
= MIN2(i
+ VIA_NR_SAREA_CLIPRECTS
, nbox
);
744 drm_clip_rect_t
*b
= sarea
->boxes
;
745 if (vmesa
->scissor
) {
747 for (; i
< nr
; i
++) {
748 b
->x1
= pbox
[i
].x1
- vmesa
->drawXSaam
;
749 b
->y1
= pbox
[i
].y1
- vmesa
->drawYSaam
;
750 b
->x2
= pbox
[i
].x2
- vmesa
->drawXSaam
;
751 b
->y2
= pbox
[i
].y2
- vmesa
->drawYSaam
;
753 if (intersect_rect(b
, b
, &vmesa
->scissorRect
)) {
759 if (nr
< nbox
) continue;
764 sarea
->nbox
= nr
- i
;
765 for (; i
< nr
; i
++, b
++) {
766 b
->x1
= pbox
[i
].x1
- vmesa
->drawXSaam
;
767 b
->y1
= pbox
[i
].y1
- vmesa
->drawYSaam
;
768 b
->x2
= pbox
[i
].x2
- vmesa
->drawXSaam
;
769 b
->y2
= pbox
[i
].y2
- vmesa
->drawYSaam
;
773 flush_agp_saam(vmesa
, &agpCmd
);
780 GLuint
*data
= (GLuint
*)vmesa
->dmaAddr
;
781 for (i
= 0; i
< vmesa
->dmaLow
; i
+= 16) {
782 fprintf(stderr
, "%08x ", *data
++);
783 fprintf(stderr
, "%08x ", *data
++);
784 fprintf(stderr
, "%08x ", *data
++);
785 fprintf(stderr
, "%08x\n", *data
++);
787 fprintf(stderr
, "******************************************\n");
792 vmesa
->dmaLow
= DMA_OFFSET
;
793 if (vmesa
->dmaIndex
) {
794 vmesa
->dmaAddr
= vmesa
->dma
[0].map
;
795 vmesa
->dmaHigh
= vmesa
->dma
[0].size
;
796 vmesa
->dmaLastPrim
= DMA_OFFSET
;
800 vmesa
->dmaAddr
= vmesa
->dma
[1].map
;
801 vmesa
->dmaHigh
= vmesa
->dma
[1].size
;
802 vmesa
->dmaLastPrim
= DMA_OFFSET
;
807 void viaFlushPrims(viaContextPtr vmesa
)
810 if (VIA_DEBUG
) fprintf(stderr
, "%s in\n", __FUNCTION__
);
813 LOCK_HARDWARE(vmesa
);
814 viaFlushPrimsLocked(vmesa
);
815 UNLOCK_HARDWARE(vmesa
);
818 if (VIA_DEBUG
) fprintf(stderr
, "%s in\n", __FUNCTION__
);
822 static void viaFlush(GLcontext
*ctx
)
824 viaContextPtr vmesa
= VIA_CONTEXT(ctx
);
826 if (VIA_DEBUG
) fprintf(stderr
, "%s in\n", __FUNCTION__
);
828 VIA_FIREVERTICES(vmesa
);
830 if (VIA_DEBUG
) fprintf(stderr
, "%s out\n", __FUNCTION__
);
834 static void viaFinish(GLcontext
*ctx
)
837 if (VIA_DEBUG
) fprintf(stderr
, "%s in\n", __FUNCTION__
);
838 if (VIA_DEBUG
) fprintf(stderr
, "%s out\n", __FUNCTION__
);
843 static void viaClearStencil(GLcontext
*ctx
, int s
)
848 void viaInitIoctlFuncs(GLcontext
*ctx
)
850 ctx
->Driver
.Flush
= viaFlush
;
851 ctx
->Driver
.Clear
= viaClear
;
852 ctx
->Driver
.Finish
= viaFinish
;
853 ctx
->Driver
.ClearStencil
= viaClearStencil
;
856 void viaFillFrontBuffer(viaContextPtr vmesa
)
858 GLuint nDestBase
, nDestPitch
, nDestWidth
, nDestHeight
, offsetX
, offset
,i
;
859 drm_clip_rect_t
*b
= vmesa
->sarea
->boxes
;
860 GLuint
*vb
= viaCheckDma(vmesa
, vmesa
->sarea
->nbox
*48);
861 GLuint bytePerPixel
= vmesa
->viaScreen
->bitsPerPixel
>> 3;
862 GLuint pixel
= (GLuint
)vmesa
->ClearColor
;
864 offset
= vmesa
->viaScreen
->fbOffset
+ (vmesa
->drawY
* vmesa
->front
.pitch
+ vmesa
->drawX
* bytePerPixel
);
866 if (VIA_DEBUG
) fprintf(stderr
, "Fill Front offset = %08x\n", offset
);
868 nDestBase
= offset
& 0xffffffe0;
869 nDestPitch
= vmesa
->front
.pitch
;
871 for (i
= 0; i
< vmesa
->sarea
->nbox
; i
++) {
872 nDestWidth
= b
->x2
- b
->x1
- 1;
873 nDestHeight
= b
->y2
- b
->y1
- 1;
875 if (bytePerPixel
== 4)
876 offsetX
= (b
->x1
- vmesa
->drawX
) + (vmesa
->drawX
& 7);
878 offsetX
= (b
->x1
- vmesa
->drawX
) + (vmesa
->drawX
& 15);
883 SetReg2DAGP(0x18, pixel
| 0x00000000);
885 SetReg2DAGP(0x10, nDestWidth
| (nDestHeight
<< 16));
887 SetReg2DAGP(0x0C, (offsetX
| ((b
->y1
- vmesa
->drawY
) << 16)));
889 SetReg2DAGP(0x34, (nDestBase
>> 3));
891 SetReg2DAGP(0x38, (((nDestPitch
>> 3) << 16) & 0x7FF0000) | 0x80000000);
893 SetReg2DAGP(0x0, 0x1 | 0x2000 | 0xF0000000);
898 viaFlushPrimsLocked(vmesa
);
901 void viaFillFrontBufferSaam(viaContextPtr vmesa
)
903 GLuint nDestBase
, nDestPitch
, nDestWidth
, nDestHeight
, offsetX
, offset
,i
;
904 drm_clip_rect_t
*b
= vmesa
->sarea
->boxes
;
905 GLuint
*vb
= viaCheckDma(vmesa
, vmesa
->sarea
->nbox
*48);
906 GLuint bytePerPixel
= vmesa
->viaScreen
->bitsPerPixel
>> 3;
907 GLuint pixel
= (GLuint
)vmesa
->ClearColor
;
909 offset
= vmesa
->viaScreen
->fbSize
+
910 (vmesa
->drawYSaam
* vmesa
->front
.pitch
+ vmesa
->drawXSaam
* bytePerPixel
);
911 nDestBase
= offset
& 0xffffffe0;
912 nDestPitch
= vmesa
->front
.pitch
;
914 for (i
= 0; i
< vmesa
->sarea
->nbox
; i
++) {
915 nDestWidth
= b
->x2
- b
->x1
- 1;
916 nDestHeight
= b
->y2
- b
->y1
- 1;
918 if (bytePerPixel
== 4)
919 offsetX
= (b
->x1
- vmesa
->drawXSaam
) + (vmesa
->drawXSaam
& 7);
921 offsetX
= (b
->x1
- vmesa
->drawXSaam
) + (vmesa
->drawXSaam
& 15);
925 SetReg2DAGP(0x18, pixel
| 0x00000000);
927 SetReg2DAGP(0x10, nDestWidth
| (nDestHeight
<< 16));
929 SetReg2DAGP(0x0C, (offsetX
| ((b
->y1
- vmesa
->drawYSaam
) << 16)));
931 SetReg2DAGP(0x34, (nDestBase
>> 3));
933 SetReg2DAGP(0x38, (((nDestPitch
>> 3) << 16) & 0x7FF0000) | 0x80000000);
935 SetReg2DAGP(0x0, 0x1 | 0x2000 | 0xF0000000);
940 viaFlushPrimsLocked(vmesa
);
943 void viaFillFrontPBuffer(viaContextPtr vmesa
)
945 GLuint nDestBase
, nDestPitch
, nDestWidth
, nDestHeight
, offsetX
, offset
;
946 GLuint
*vb
= viaCheckDma(vmesa
, vmesa
->sarea
->nbox
*48);
947 GLuint pixel
= (GLuint
)vmesa
->ClearColor
;
949 offset
= vmesa
->front
.offset
;
951 if (VIA_DEBUG
) fprintf(stderr
, "Fill PFront offset = %08x\n", offset
);
954 nDestPitch
= vmesa
->front
.pitch
;
956 nDestWidth
= vmesa
->driDrawable
->w
- 1;
957 nDestHeight
= vmesa
->driDrawable
->h
- 1;
962 SetReg2DAGP(0x18, pixel
| 0x00000000);
964 SetReg2DAGP(0x10, nDestWidth
| (nDestHeight
<< 16));
966 SetReg2DAGP(0x0C, (offsetX
| (0 << 16)));
968 SetReg2DAGP(0x34, (nDestBase
>> 3));
970 SetReg2DAGP(0x38, (((nDestPitch
>> 3) << 16) & 0x7FF0000) | 0x80000000);
972 SetReg2DAGP(0x0, 0x1 | 0x2000 | 0xF0000000);
974 viaFlushPrimsLocked(vmesa
);
977 void viaFillBackBuffer(viaContextPtr vmesa
)
979 GLuint nDestBase
, nDestPitch
, nDestWidth
, nDestHeight
, offsetX
, offset
;
980 GLcontext
*ctx
= vmesa
->glCtx
;
981 GLuint
*vb
= viaCheckDma(vmesa
, 48);
982 GLuint pixel
= (GLuint
)vmesa
->ClearColor
;
983 GLuint bytePerPixel
= vmesa
->viaScreen
->bitsPerPixel
>> 3;
985 offset
= vmesa
->back
.offset
;
987 if (VIA_DEBUG
) fprintf(stderr
, "Fill Back offset = %08x\n", offset
);
990 nDestPitch
= vmesa
->back
.pitch
;
991 offsetX
= vmesa
->drawXoff
;
994 if (!ctx
->Scissor
.Enabled
) {
996 nDestWidth
= (vmesa
->back
.pitch
/ vmesa
->viaScreen
->bitsPerPixel
* 8) - 1;
997 nDestHeight
= vmesa
->driDrawable
->h
-1;
1000 SetReg2DAGP(0x18, pixel
| 0x00000000);
1002 SetReg2DAGP(0x10, nDestWidth
| (nDestHeight
<< 16));
1004 SetReg2DAGP(0x0C, (offsetX
| (0 << 16)));
1006 SetReg2DAGP(0x34, (nDestBase
>> 3));
1008 SetReg2DAGP(0x38, (((nDestPitch
>> 3) << 16) & 0x7FF0000) | 0x80000000);
1010 SetReg2DAGP(0x0, 0x1 | 0x2000 | 0xF0000000);
1012 /*=* John Sheng [2003.7.18] texenv *=*/
1015 drm_clip_rect_t
*b
= vmesa
->sarea
->boxes
;
1016 for (i
= 0; i
< vmesa
->sarea
->nbox
; i
++) {
1017 nDestWidth
= b
->x2
- b
->x1
- 1;
1018 nDestHeight
= b
->y2
- b
->y1
- 1;
1020 if (bytePerPixel
== 4)
1021 offsetX
= (b
->x1
- vmesa
->drawX
) + (vmesa
->drawX
& 7);
1023 offsetX
= (b
->x1
- vmesa
->drawX
) + (vmesa
->drawX
& 15);
1026 SetReg2DAGP(0x18, pixel
| 0x00000000);
1028 SetReg2DAGP(0x10, nDestWidth
| (nDestHeight
<< 16));
1030 SetReg2DAGP(0x0C, ((offsetX
+ (b
->x1
- vmesa
->drawX
)) | ((b
->y1
- vmesa
->drawY
) << 16)));
1032 SetReg2DAGP(0x34, (nDestBase
>> 3));
1034 SetReg2DAGP(0x38, (((nDestPitch
>> 3) << 16) & 0x7FF0000) | 0x80000000);
1036 SetReg2DAGP(0x0, 0x1 | 0x2000 | 0xF0000000);
1042 fprintf(stderr
," width = %08x\n", nDestWidth
);
1043 fprintf(stderr
," height = %08x\n", nDestHeight
);
1049 void viaFillStencilDepthBuffer(viaContextPtr vmesa
, GLuint pixel
)
1051 GLuint nDestBase
, nDestPitch
, nDestWidth
, nDestHeight
, offsetX
, offset
;
1052 GLuint
*vb
= viaCheckDma(vmesa
, 80);
1055 offset
= vmesa
->depth
.offset
;
1057 if (VIA_DEBUG
) fprintf(stderr
, "Fill Stencil Depth offset = %08x\n", offset
);
1060 nDestPitch
= vmesa
->depth
.pitch
;
1061 offsetX
= vmesa
->drawXoff
;
1062 pixel
= pixel
& 0xffffff00;
1066 nDestWidth
= (vmesa
->depth
.pitch
/ vmesa
->depthBits
* 8) - 1 - offsetX
;
1067 nDestHeight
= vmesa
->driDrawable
->h
-1;
1069 if (vmesa
->viaScreen
->bitsPerPixel
== vmesa
->depth
.bpp
) {
1071 SetReg2DAGP(0x18, pixel
);
1073 SetReg2DAGP(0x2C, nMask
);
1075 SetReg2DAGP(0x10, nDestWidth
| (nDestHeight
<< 16));
1077 SetReg2DAGP(0x0C, (offsetX
| (0 << 16)));
1079 SetReg2DAGP(0x34, (nDestBase
>> 3));
1081 SetReg2DAGP(0x38, (((nDestPitch
>> 3) << 16) & 0x7FF0000) | 0x80000000);
1083 SetReg2DAGP(0x0, 0x1 | 0x2000 | 0xF0000000);
1085 SetReg2DAGP(0x2C, 0x00000000);
1088 GLuint EngStatus
= *(vmesa
->pnGEMode
);
1090 SetReg2DAGP(0x04, (EngStatus
& 0xFFFFFCFF) | 0x300);
1092 SetReg2DAGP(0x18, pixel
);
1094 SetReg2DAGP(0x2C, nMask
);
1096 SetReg2DAGP(0x10, nDestWidth
| (nDestHeight
<< 16));
1098 SetReg2DAGP(0x0C, (offsetX
| (0 << 16)));
1100 SetReg2DAGP(0x34, (nDestBase
>> 3));
1102 SetReg2DAGP(0x38, (((nDestPitch
>> 3) << 16) & 0x7FF0000) | 0x80000000);
1104 SetReg2DAGP(0x0, 0x1 | 0x2000 | 0xF0000000);
1106 SetReg2DAGP(0x04, EngStatus
);
1108 SetReg2DAGP(0x2C, 0x00000000);
1114 if (vmesa
->glCtx
->Color
._DrawDestMask
[0] == __GL_BACK_BUFFER_MASK
) {
1115 viaFlushPrimsLocked(vmesa
);
1119 void viaFillStencilBuffer(viaContextPtr vmesa
, GLuint pixel
)
1121 GLuint nDestBase
, nDestPitch
, nDestWidth
, nDestHeight
, offsetX
, offset
;
1122 GLuint
*vb
= viaCheckDma(vmesa
, 80);
1125 offset
= vmesa
->depth
.offset
;
1127 if (VIA_DEBUG
) fprintf(stderr
, "Fill Stencil offset = %08x\n", offset
);
1130 nDestPitch
= vmesa
->depth
.pitch
;
1131 offsetX
= vmesa
->drawXoff
;
1132 pixel
= pixel
& 0x000000ff;
1136 nDestWidth
= (vmesa
->depth
.pitch
/ vmesa
->depthBits
* 8) - 1 - offsetX
;
1137 nDestHeight
= vmesa
->driDrawable
->h
-1;
1139 if (vmesa
->viaScreen
->bitsPerPixel
== vmesa
->depth
.bpp
) {
1141 SetReg2DAGP(0x18, pixel
);
1143 SetReg2DAGP(0x2C, nMask
);
1145 SetReg2DAGP(0x10, nDestWidth
| (nDestHeight
<< 16));
1147 SetReg2DAGP(0x0C, (offsetX
| (0 << 16)));
1149 SetReg2DAGP(0x34, (nDestBase
>> 3));
1151 SetReg2DAGP(0x38, (((nDestPitch
>> 3) << 16) & 0x7FF0000) | 0x80000000);
1153 SetReg2DAGP(0x0, 0x1 | 0x2000 | 0xF0000000);
1155 SetReg2DAGP(0x2C, 0x00000000);
1158 GLuint EngStatus
= *(vmesa
->pnGEMode
);
1160 SetReg2DAGP(0x04, (EngStatus
& 0xFFFFFCFF) | 0x300);
1162 SetReg2DAGP(0x18, pixel
);
1164 SetReg2DAGP(0x2C, nMask
);
1166 SetReg2DAGP(0x10, nDestWidth
| (nDestHeight
<< 16));
1168 SetReg2DAGP(0x0C, (offsetX
| (0 << 16)));
1170 SetReg2DAGP(0x34, (nDestBase
>> 3));
1172 SetReg2DAGP(0x38, (((nDestPitch
>> 3) << 16) & 0x7FF0000) | 0x80000000);
1174 SetReg2DAGP(0x0, 0x1 | 0x2000 | 0xF0000000);
1176 SetReg2DAGP(0x04, EngStatus
);
1178 SetReg2DAGP(0x2C, 0x00000000);
1182 if (vmesa
->glCtx
->Color
._DrawDestMask
[0] == __GL_BACK_BUFFER_MASK
) {
1183 viaFlushPrimsLocked(vmesa
);
1187 void viaFillDepthBuffer(viaContextPtr vmesa
, GLuint pixel
)
1189 GLuint nDestBase
, nDestPitch
, nDestWidth
, nDestHeight
, offsetX
, offset
;
1190 GLuint
*vb
= viaCheckDma(vmesa
, 72);
1191 offset
= vmesa
->depth
.offset
;
1193 if (VIA_DEBUG
) fprintf(stderr
, "Fill Depth offset = %08x\n", offset
);
1196 nDestPitch
= vmesa
->depth
.pitch
;
1197 offsetX
= vmesa
->drawXoff
;
1200 nDestWidth
= (vmesa
->depth
.pitch
/ vmesa
->depthBits
* 8) - 1 - offsetX
;
1201 nDestHeight
= vmesa
->driDrawable
->h
-1;
1203 if (vmesa
->viaScreen
->bitsPerPixel
== vmesa
->depth
.bpp
) {
1205 SetReg2DAGP(0x18, pixel
);
1207 SetReg2DAGP(0x2C, 0x0);
1209 SetReg2DAGP(0x10, nDestWidth
| (nDestHeight
<< 16));
1211 SetReg2DAGP(0x0C, (offsetX
| (0 << 16)));
1213 SetReg2DAGP(0x34, (nDestBase
>> 3));
1215 SetReg2DAGP(0x38, (((nDestPitch
>> 3) << 16) & 0x7FF0000) | 0x80000000);
1217 SetReg2DAGP(0x0, 0x1 | 0x2000 | 0xF0000000);
1219 /* depth = 16, color = 32 */
1220 else if (vmesa
->depth
.bpp
== 16) {
1221 GLuint EngStatus
= *(vmesa
->pnGEMode
);
1224 SetReg2DAGP(0x04, (EngStatus
& 0xFFFFFCFF) | 0x100);
1226 SetReg2DAGP(0x2C, 0x0);
1228 SetReg2DAGP(0x18, pixel
);
1230 SetReg2DAGP(0x10, nDestWidth
| (nDestHeight
<< 16));
1232 SetReg2DAGP(0x0C, (offsetX
| (0 << 16)));
1234 SetReg2DAGP(0x34, (nDestBase
>> 3));
1236 SetReg2DAGP(0x38, (((nDestPitch
>> 3) << 16) & 0x7FF0000) | 0x80000000);
1238 SetReg2DAGP(0x0, 0x1 | 0x2000 | 0xF0000000);
1240 SetReg2DAGP(0x04, EngStatus
);
1242 /* depth = 32, color = 16 */
1244 GLuint EngStatus
= *(vmesa
->pnGEMode
);
1247 SetReg2DAGP(0x04, (EngStatus
& 0xFFFFFCFF) | 0x300);
1249 SetReg2DAGP(0x2C, 0x0);
1251 SetReg2DAGP(0x18, pixel
);
1253 SetReg2DAGP(0x10, nDestWidth
| (nDestHeight
<< 16));
1255 SetReg2DAGP(0x0C, (offsetX
| (0 << 16)));
1257 SetReg2DAGP(0x34, (nDestBase
>> 3));
1259 SetReg2DAGP(0x38, (((nDestPitch
>> 3) << 16) & 0x7FF0000) | 0x80000000);
1261 SetReg2DAGP(0x0, 0x1 | 0x2000 | 0xF0000000);
1263 SetReg2DAGP(0x04, EngStatus
);
1267 if (vmesa
->glCtx
->Color
._DrawDestMask
[0] == __GL_BACK_BUFFER_MASK
) {
1268 viaFlushPrimsLocked(vmesa
);
1272 void viaDoSwapBuffers(viaContextPtr vmesa
)
1274 GLuint
*vb
= viaCheckDma(vmesa
, vmesa
->sarea
->nbox
*56);
1277 GLuint nFrontWidth
, nFrontHeight
, nBackWidth
, nBackHeight
;
1278 GLuint nFrontBase
, nBackBase
;
1279 GLuint nFrontOffsetX
, nFrontOffsetY
, nBackOffsetX
, nBackOffsetY
;
1280 drm_clip_rect_t
*b
= vmesa
->sarea
->boxes
;
1281 GLuint bytePerPixel
= vmesa
->viaScreen
->bitsPerPixel
>> 3;
1284 nFrontPitch
= vmesa
->front
.pitch
;
1285 nBackPitch
= vmesa
->back
.pitch
;
1288 nFrontBase
= vmesa
->viaScreen
->fbOffset
+ (vmesa
->drawY
* nFrontPitch
+ vmesa
->drawX
* bytePerPixel
);
1289 nBackBase
= vmesa
->back
.offset
;
1290 /* 128 bit alignment*/
1291 nFrontBase
= nFrontBase
& 0xffffffe0;
1293 /*=* [DBG] make draw to front buffer *=*/
1297 for (i
= 0; i
< vmesa
->sarea
->nbox
; i
++) {
1299 nFrontWidth
= nBackWidth
= b
->x2
- b
->x1
- 1;
1300 nFrontHeight
= nBackHeight
= b
->y2
- b
->y1
- 1;
1302 nFrontOffsetX
= (b
->x1
- vmesa
->drawX
) + vmesa
->drawXoff
;
1303 nFrontOffsetY
= b
->y1
- vmesa
->drawY
;
1305 nBackOffsetX
= nFrontOffsetX
;
1306 nBackOffsetY
= nFrontOffsetY
;
1308 SetReg2DAGP(0x10, nFrontWidth
| (nFrontHeight
<< 16));
1310 SetReg2DAGP(0x0C, nFrontOffsetX
| (nFrontOffsetY
<< 16));
1312 SetReg2DAGP(0x08, nBackOffsetX
| (nBackOffsetY
<< 16));
1314 SetReg2DAGP(0x34, (nFrontBase
>> 3));
1316 SetReg2DAGP(0x30, (nBackBase
>> 3));
1318 SetReg2DAGP(0x38, (((nFrontPitch
>> 3) << 16) & 0x7FF0000) | 0x80000000 |
1319 ((nBackPitch
>> 3) & 0x7FF));
1321 SetReg2DAGP(0x0, 0x1 | 0xCC000000);
1325 viaFlushPrimsLocked(vmesa
);
1327 if (VIA_DEBUG
) fprintf(stderr
, "Do Swap Buffer\n");
1331 void viaDoSwapBuffersSaam(viaContextPtr vmesa
)
1333 GLuint
*vb
= viaCheckDma(vmesa
, vmesa
->sarea
->nbox
*56);
1336 GLuint nFrontWidth
, nFrontHeight
, nBackWidth
, nBackHeight
;
1337 GLuint nFrontBase
, nBackBase
;
1338 GLuint nFrontOffsetX
, nFrontOffsetY
, nBackOffsetX
, nBackOffsetY
;
1339 drm_clip_rect_t
*b
= vmesa
->sarea
->boxes
;
1340 GLuint bytePerPixel
= vmesa
->viaScreen
->bitsPerPixel
>> 3;
1343 nFrontPitch
= vmesa
->front
.pitch
;
1344 nBackPitch
= vmesa
->back
.pitch
;
1347 nFrontBase
= vmesa
->viaScreen
->fbSize
+ (vmesa
->drawYSaam
* nFrontPitch
+ vmesa
->drawXSaam
* bytePerPixel
);
1348 nBackBase
= vmesa
->back
.offset
;
1349 /* 128 bit alignment*/
1350 nFrontBase
= nFrontBase
& 0xffffffe0;
1352 /*=* [DBG] make draw to front buffer *=*/
1356 for (i
= 0; i
< vmesa
->sarea
->nbox
; i
++) {
1358 nFrontWidth
= nBackWidth
= b
->x2
- b
->x1
- 1;
1359 nFrontHeight
= nBackHeight
= b
->y2
- b
->y1
- 1;
1361 nFrontOffsetX
= (b
->x1
- vmesa
->drawXSaam
) + vmesa
->drawXoff
;
1362 nFrontOffsetY
= b
->y1
- vmesa
->drawYSaam
;
1364 nBackOffsetX
= nFrontOffsetX
;
1365 nBackOffsetY
= nFrontOffsetY
;
1367 SetReg2DAGP(0x10, nFrontWidth
| (nFrontHeight
<< 16));
1369 SetReg2DAGP(0x0C, nFrontOffsetX
| (nFrontOffsetY
<< 16));
1371 SetReg2DAGP(0x08, nBackOffsetX
| (nBackOffsetY
<< 16));
1373 SetReg2DAGP(0x34, (nFrontBase
>> 3));
1375 SetReg2DAGP(0x30, (nBackBase
>> 3));
1377 SetReg2DAGP(0x38, (((nFrontPitch
>> 3) << 16) & 0x7FF0000) | 0x80000000 |
1378 ((nBackPitch
>> 3) & 0x7FF));
1380 SetReg2DAGP(0x0, 0x1 | 0xCC000000);
1384 viaFlushPrimsLocked(vmesa
);
1386 if (VIA_DEBUG
) fprintf(stderr
, "Do Swap Buffer\n");
1390 void viaDoSwapPBuffers(viaContextPtr vmesa
)
1392 GLuint
*vb
= viaCheckDma(vmesa
, vmesa
->sarea
->nbox
*56);
1395 GLuint nFrontWidth
, nFrontHeight
;
1396 GLuint nFrontBase
, nBackBase
;
1397 GLuint nFrontOffsetX
, nFrontOffsetY
, nBackOffsetX
, nBackOffsetY
;
1398 GLuint bytePerPixel
= vmesa
->viaScreen
->bitsPerPixel
>> 3;
1400 nFrontPitch
= vmesa
->front
.pitch
;
1401 nBackPitch
= vmesa
->back
.pitch
;
1404 nFrontBase
= vmesa
->front
.offset
;
1405 nBackBase
= vmesa
->back
.offset
;
1408 nFrontWidth
= nFrontPitch
/ bytePerPixel
;
1409 nFrontHeight
= nBackPitch
/ bytePerPixel
;
1414 nBackOffsetX
= nFrontOffsetX
;
1415 nBackOffsetY
= nFrontOffsetY
;
1417 SetReg2DAGP(0x10, nFrontWidth
| (nFrontHeight
<< 16));
1419 SetReg2DAGP(0x0C, nFrontOffsetX
| (nFrontOffsetY
<< 16));
1421 SetReg2DAGP(0x08, nBackOffsetX
| (nBackOffsetY
<< 16));
1423 SetReg2DAGP(0x34, (nFrontBase
>> 3));
1425 SetReg2DAGP(0x30, (nBackBase
>> 3));
1427 SetReg2DAGP(0x38, (((nFrontPitch
>> 3) << 16) & 0x7FF0000) | 0x80000000 |
1428 ((nBackPitch
>> 3) & 0x7FF));
1430 SetReg2DAGP(0x0, 0x1 | 0xCC000000);
1432 viaFlushPrimsLocked(vmesa
);
1434 if (VIA_DEBUG
) fprintf(stderr
, "Do Swap PBuffer\n");
1439 int flush_agp(viaContextPtr vmesa
, drm_via_flush_agp_t
* agpCmd
)
1441 GLuint
*pnAGPCurrentPhysStart
;
1442 GLuint
*pnAGPCurrentPhysEnd
;
1443 GLuint
*pnAGPCurrentStart
;
1444 GLuint
*pnAGPCurrentEnd
;
1445 volatile GLuint
*pnMMIOBase
;
1446 volatile GLuint
*pnEngBaseTranSet
;
1447 volatile GLuint
*pnEngBaseTranSpace
;
1449 GLuint ofs
= vmesa
->dma
[vmesa
->dmaIndex
].offset
;
1450 GLuint
*vb
= (GLuint
*)vmesa
->dmaAddr
;
1453 pnMMIOBase
= vmesa
->regMMIOBase
;
1454 pnEngBaseTranSet
= vmesa
->regTranSet
;
1455 pnEngBaseTranSpace
= vmesa
->regTranSpace
;
1456 *pnEngBaseTranSet
= (0x0010 << 16);
1457 agpBase
= vmesa
->agpBase
;
1459 if (!agpCmd
->size
) {
1464 volatile GLuint
*pnEngBase
= vmesa
->regEngineStatus
;
1468 nStatus
= *pnEngBase
;
1469 if ((nStatus
& 0xFFFEFFFF) == 0x00020000)
1475 pnAGPCurrentStart
= (GLuint
*)(ofs
+ agpCmd
->offset
);
1476 pnAGPCurrentEnd
= (GLuint
*)((GLuint
)pnAGPCurrentStart
+ vmesa
->dmaHigh
);
1477 pnAGPCurrentPhysStart
= (GLuint
*)( (GLuint
)pnAGPCurrentStart
+ (GLuint
)agpBase
);
1478 pnAGPCurrentPhysEnd
= (GLuint
*)( (GLuint
)pnAGPCurrentEnd
+ (GLuint
)agpBase
);
1480 /*=* [DBG] make draw to front buffer *=*/
1482 vmesa
->glCtx
->Color
._DrawDestMask
[0] = __GL_FRONT_BUFFER_MASK
;
1484 if (vmesa
->glCtx
->Color
._DrawDestMask
[0] == __GL_BACK_BUFFER_MASK
) {
1487 *vb
++ = (HC_ParaType_NotTex
<< 16);
1488 if (vmesa
->driDrawable
->w
== 0 || vmesa
->driDrawable
->h
== 0) {
1489 *vb
++ = (HC_SubA_HClipTB
<< 24) | 0x0;
1490 *vb
++ = (HC_SubA_HClipLR
<< 24) | 0x0;
1493 *vb
++ = ((HC_SubA_HClipTB
<< 24) | (0x0 << 12) | vmesa
->driDrawable
->h
);
1494 *vb
++ = ((HC_SubA_HClipLR
<< 24) | (vmesa
->drawXoff
<< 12) | (vmesa
->driDrawable
->w
+ vmesa
->drawXoff
));
1498 GLuint pitch
, format
, offset
;
1500 if (vmesa
->viaScreen
->bitsPerPixel
== 0x20) {
1501 format
= HC_HDBFM_ARGB8888
;
1503 else if (vmesa
->viaScreen
->bitsPerPixel
== 0x10) {
1504 format
= HC_HDBFM_RGB565
;
1511 offset
= vmesa
->back
.offset
;
1512 pitch
= vmesa
->back
.pitch
;
1514 *vb
++ = ((HC_SubA_HDBBasL
<< 24) | (offset
& 0xFFFFFF));
1515 *vb
++ = ((HC_SubA_HDBBasH
<< 24) | ((offset
& 0xFF000000)) >> 24);
1516 *vb
++ = ((HC_SubA_HDBFM
<< 24) | HC_HDBLoc_Local
| format
| pitch
);
1520 *pnEngBaseTranSpace
= (HC_SubA_HAGPBstL
<< 24) |
1521 ((GLuint
)(pnAGPCurrentPhysStart
) & 0xFFFFFF);
1522 *pnEngBaseTranSpace
= (HC_SubA_HAGPBendL
<< 24) |
1523 ((GLuint
)(pnAGPCurrentPhysEnd
) & 0xFFFFFF);
1524 *pnEngBaseTranSpace
= (HC_SubA_HAGPCMNT
<< 24) |
1525 ((GLuint
)(pnAGPCurrentPhysEnd
) & 0xFF000000) >> 16 |
1526 ((GLuint
)(pnAGPCurrentPhysStart
) & 0xFF000000) >> 24;
1527 *pnEngBaseTranSpace
= (HC_SubA_HAGPBpH
<< 24) |
1528 ((GLuint
)((GLbyte
*)pnAGPCurrentPhysStart
+ agpCmd
->size
- 4) & 0xFF000000) >> 24;
1529 *pnEngBaseTranSpace
= (HC_SubA_HAGPBpL
<< 24) |
1530 ((GLuint
)((GLbyte
*)pnAGPCurrentPhysStart
+ agpCmd
->size
- 4) & 0xFFFFFF) |
1532 *pnEngBaseTranSpace
= (HC_SubA_HAGPCMNT
<< 24) |
1533 ((GLuint
)(pnAGPCurrentPhysEnd
) & 0xFF000000) >> 16 |
1534 ((GLuint
)(pnAGPCurrentPhysStart
) & 0xFF000000) >> 24 |
1539 GLuint clipL
, clipR
, clipT
, clipB
;
1540 drm_clip_rect_t
*b
= vmesa
->sarea
->boxes
;
1542 *vb
++ = (HC_ParaType_NotTex
<< 16);
1545 *pnEngBaseTranSpace
= (HC_SubA_HAGPBstL
<< 24) |
1546 ((GLuint
)(pnAGPCurrentPhysStart
) & 0xFFFFFF);
1547 *pnEngBaseTranSpace
= (HC_SubA_HAGPBendL
<< 24) |
1548 ((GLuint
)(pnAGPCurrentPhysEnd
) & 0xFFFFFF);
1549 *pnEngBaseTranSpace
= (HC_SubA_HAGPCMNT
<< 24) |
1550 ((GLuint
)(pnAGPCurrentPhysEnd
) & 0xFF000000) >> 16 |
1551 ((GLuint
)(pnAGPCurrentPhysStart
) & 0xFF000000) >> 24;
1552 *pnEngBaseTranSpace
= (HC_SubA_HAGPBpH
<< 24) |
1553 ((GLuint
)((GLbyte
*)pnAGPCurrentPhysStart
+ agpCmd
->size
- 4) & 0xFF000000) >> 24;
1554 *pnEngBaseTranSpace
= (HC_SubA_HAGPBpL
<< 24) |
1555 ((GLuint
)((GLbyte
*)pnAGPCurrentPhysStart
+ agpCmd
->size
- 4) & 0xFFFFFF) |
1558 for (i
= 0; i
< vmesa
->sarea
->nbox
; i
++) {
1560 volatile GLuint
*pnEngBase
= vmesa
->regEngineStatus
;
1564 nStatus
= *pnEngBase
;
1565 if ((nStatus
& 0xFFFEFFFF) == 0x00020000)
1570 clipL
= b
->x1
+ vmesa
->drawXoff
;
1575 if (VIA_DEBUG
) fprintf(stderr
, "clip = %d\n", i
);
1577 if (vmesa
->driDrawable
->w
== 0 || vmesa
->driDrawable
->h
== 0) {
1579 *vb
= (HC_SubA_HClipTB
<< 24) | 0x0;
1582 *vb
= (HC_SubA_HClipLR
<< 24) | 0x0;
1586 *vb
= (HC_SubA_HClipTB
<< 24) | (clipT
<< 12) | clipB
;
1589 *vb
= (HC_SubA_HClipLR
<< 24) | (clipL
<< 12) | clipR
;
1594 GLuint pitch
, format
, offset
;
1595 GLuint bytePerPixel
= vmesa
->viaScreen
->bitsPerPixel
>> 3;
1597 if (vmesa
->viaScreen
->bitsPerPixel
== 0x20) {
1598 format
= HC_HDBFM_ARGB8888
;
1600 else if (vmesa
->viaScreen
->bitsPerPixel
== 0x10) {
1601 format
= HC_HDBFM_RGB565
;
1606 pitch
= vmesa
->front
.pitch
;
1607 offset
= vmesa
->viaScreen
->fbOffset
+ (vmesa
->drawY
* pitch
+ vmesa
->drawX
* bytePerPixel
);
1608 offset
= offset
& 0xffffffe0;
1610 *vb
++ = ((HC_SubA_HDBBasL
<< 24) | (offset
& 0xFFFFFF));
1611 *vb
++ = ((HC_SubA_HDBBasH
<< 24) | ((offset
& 0xFF000000)) >> 24);
1612 *vb
++ = ((HC_SubA_HDBFM
<< 24) | HC_HDBLoc_Local
| format
| pitch
);
1615 *pnEngBaseTranSpace
= (HC_SubA_HAGPCMNT
<< 24) |
1616 ((GLuint
)(pnAGPCurrentPhysEnd
) & 0xFF000000) >> 16 |
1617 ((GLuint
)(pnAGPCurrentPhysStart
) & 0xFF000000) >> 24 |
1622 GLuint
*data
= (GLuint
*)vmesa
->dmaAddr
;
1623 for (i
= 0; i
< vmesa
->dmaLow
; i
+= 16) {
1624 fprintf(stderr
, "%08x ", *data
++);
1625 fprintf(stderr
, "%08x ", *data
++);
1626 fprintf(stderr
, "%08x ", *data
++);
1627 fprintf(stderr
, "%08x\n", *data
++);
1629 fprintf(stderr
, "******************************************\n");
1639 volatile GLuint
*pnEngBase
= (volatile GLuint
*)((GLuint
)pnMMIOBase
+ 0x400);
1644 nStatus
= *pnEngBase
;
1645 if ((nStatus
& 0xFFFEFFFF) == 0x00020000) {
1651 /* dump current command buffer */
1652 data
= (GLuint
*)vmesa
->dmaAddr
;
1655 fprintf(stderr
, "current command buffer");
1656 fprintf(stderr
, "i = %d\n", i
);
1657 for (j
= 0; j
< vmesa
->dmaLow
; j
+= 16) {
1658 fprintf(stderr
, "%08x ", *data
++);
1659 fprintf(stderr
, "%08x ", *data
++);
1660 fprintf(stderr
, "%08x ", *data
++);
1661 fprintf(stderr
, "%08x\n", *data
++);
1664 /* dump previous command buffer */
1665 if (vmesa
->dmaIndex
) {
1666 data
= (GLuint
*)vmesa
->dma
[0].map
;
1669 data
= (GLuint
*)vmesa
->dma
[1].map
;
1672 fprintf(stderr
, "previous command buffer");
1673 fprintf(stderr
, "i = %d\n", i
);
1674 for (j
= 0; j
< dmaLow
; j
+= 16) {
1675 fprintf(stderr
, "%08x ", *data
++);
1676 fprintf(stderr
, "%08x ", *data
++);
1677 fprintf(stderr
, "%08x ", *data
++);
1678 fprintf(stderr
, "%08x\n", *data
++);
1686 dmaLow
= vmesa
->dmaLow
;
1690 int flush_agp_saam(viaContextPtr vmesa
, drm_via_flush_agp_t
* agpCmd
)
1692 GLuint
*pnAGPCurrentPhysStart
;
1693 GLuint
*pnAGPCurrentPhysEnd
;
1694 GLuint
*pnAGPCurrentStart
;
1695 GLuint
*pnAGPCurrentEnd
;
1696 volatile GLuint
*pnMMIOBase
;
1697 volatile GLuint
*pnEngBaseTranSet
;
1698 volatile GLuint
*pnEngBaseTranSpace
;
1700 GLuint ofs
= vmesa
->dma
[vmesa
->dmaIndex
].offset
;
1701 GLuint
*vb
= (GLuint
*)vmesa
->dmaAddr
;
1704 pnMMIOBase
= vmesa
->regMMIOBase
;
1705 pnEngBaseTranSet
= vmesa
->regTranSet
;
1706 pnEngBaseTranSpace
= vmesa
->regTranSpace
;
1707 *pnEngBaseTranSet
= (0x0010 << 16);
1708 agpBase
= vmesa
->agpBase
;
1710 if (!agpCmd
->size
) {
1715 volatile GLuint
*pnEngBase
= vmesa
->regEngineStatus
;
1719 nStatus
= *pnEngBase
;
1720 if ((nStatus
& 0xFFFEFFFF) == 0x00020000)
1726 pnAGPCurrentStart
= (GLuint
*)(ofs
+ agpCmd
->offset
);
1727 pnAGPCurrentEnd
= (GLuint
*)((GLuint
)pnAGPCurrentStart
+ vmesa
->dmaHigh
);
1728 pnAGPCurrentPhysStart
= (GLuint
*)( (GLuint
)pnAGPCurrentStart
+ (GLuint
)agpBase
);
1729 pnAGPCurrentPhysEnd
= (GLuint
*)( (GLuint
)pnAGPCurrentEnd
+ (GLuint
)agpBase
);
1731 /*=* [DBG] make draw to front buffer *=*/
1733 vmesa
->glCtx
->Color
._DrawDestMask
[0] = __GL_FRONT_BUFFER_MASK
;
1735 if (vmesa
->glCtx
->Color
._DrawDestMask
[0] == __GL_BACK_BUFFER_MASK
) {
1738 *vb
++ = (HC_ParaType_NotTex
<< 16);
1739 if (vmesa
->driDrawable
->w
== 0 || vmesa
->driDrawable
->h
== 0) {
1740 *vb
++ = (HC_SubA_HClipTB
<< 24) | 0x0;
1741 *vb
++ = (HC_SubA_HClipLR
<< 24) | 0x0;
1744 *vb
++ = ((HC_SubA_HClipTB
<< 24) | (0x0 << 12) | vmesa
->driDrawable
->h
);
1745 *vb
++ = ((HC_SubA_HClipLR
<< 24) | (vmesa
->drawXoff
<< 12) | (vmesa
->driDrawable
->w
+ vmesa
->drawXoff
));
1749 GLuint pitch
, format
, offset
;
1751 if (vmesa
->viaScreen
->bitsPerPixel
== 0x20) {
1752 format
= HC_HDBFM_ARGB8888
;
1754 else if (vmesa
->viaScreen
->bitsPerPixel
== 0x10) {
1755 format
= HC_HDBFM_RGB565
;
1760 offset
= vmesa
->back
.offset
;
1761 pitch
= vmesa
->back
.pitch
;
1763 *vb
++ = ((HC_SubA_HDBBasL
<< 24) | (offset
& 0xFFFFFF));
1764 *vb
++ = ((HC_SubA_HDBBasH
<< 24) | ((offset
& 0xFF000000)) >> 24);
1765 *vb
++ = ((HC_SubA_HDBFM
<< 24) | HC_HDBLoc_Local
| format
| pitch
);
1769 *pnEngBaseTranSpace
= (HC_SubA_HAGPBstL
<< 24) |
1770 ((GLuint
)(pnAGPCurrentPhysStart
) & 0xFFFFFF);
1771 *pnEngBaseTranSpace
= (HC_SubA_HAGPBendL
<< 24) |
1772 ((GLuint
)(pnAGPCurrentPhysEnd
) & 0xFFFFFF);
1773 *pnEngBaseTranSpace
= (HC_SubA_HAGPCMNT
<< 24) |
1774 ((GLuint
)(pnAGPCurrentPhysEnd
) & 0xFF000000) >> 16 |
1775 ((GLuint
)(pnAGPCurrentPhysStart
) & 0xFF000000) >> 24;
1776 *pnEngBaseTranSpace
= (HC_SubA_HAGPBpH
<< 24) |
1777 ((GLuint
)((GLbyte
*)pnAGPCurrentPhysStart
+ agpCmd
->size
- 4) & 0xFF000000) >> 24;
1778 *pnEngBaseTranSpace
= (HC_SubA_HAGPBpL
<< 24) |
1779 ((GLuint
)((GLbyte
*)pnAGPCurrentPhysStart
+ agpCmd
->size
- 4) & 0xFFFFFF) |
1781 *pnEngBaseTranSpace
= (HC_SubA_HAGPCMNT
<< 24) |
1782 ((GLuint
)(pnAGPCurrentPhysEnd
) & 0xFF000000) >> 16 |
1783 ((GLuint
)(pnAGPCurrentPhysStart
) & 0xFF000000) >> 24 |
1788 GLuint clipL
, clipR
, clipT
, clipB
;
1789 drm_clip_rect_t
*b
= vmesa
->sarea
->boxes
;
1791 *vb
++ = (HC_ParaType_NotTex
<< 16);
1794 *pnEngBaseTranSpace
= (HC_SubA_HAGPBstL
<< 24) |
1795 ((GLuint
)(pnAGPCurrentPhysStart
) & 0xFFFFFF);
1796 *pnEngBaseTranSpace
= (HC_SubA_HAGPBendL
<< 24) |
1797 ((GLuint
)(pnAGPCurrentPhysEnd
) & 0xFFFFFF);
1798 *pnEngBaseTranSpace
= (HC_SubA_HAGPCMNT
<< 24) |
1799 ((GLuint
)(pnAGPCurrentPhysEnd
) & 0xFF000000) >> 16 |
1800 ((GLuint
)(pnAGPCurrentPhysStart
) & 0xFF000000) >> 24;
1801 *pnEngBaseTranSpace
= (HC_SubA_HAGPBpH
<< 24) |
1802 ((GLuint
)((GLbyte
*)pnAGPCurrentPhysStart
+ agpCmd
->size
- 4) & 0xFF000000) >> 24;
1803 *pnEngBaseTranSpace
= (HC_SubA_HAGPBpL
<< 24) |
1804 ((GLuint
)((GLbyte
*)pnAGPCurrentPhysStart
+ agpCmd
->size
- 4) & 0xFFFFFF) |
1807 for (i
= 0; i
< vmesa
->sarea
->nbox
; i
++) {
1809 volatile GLuint
*pnEngBase
= vmesa
->regEngineStatus
;
1813 nStatus
= *pnEngBase
;
1814 if ((nStatus
& 0xFFFEFFFF) == 0x00020000)
1819 clipL
= b
->x1
+ vmesa
->drawXoff
;
1824 if (VIA_DEBUG
) fprintf(stderr
, "clip = %d\n", i
);
1826 if (vmesa
->driDrawable
->w
== 0 || vmesa
->driDrawable
->h
== 0) {
1828 *vb
= (HC_SubA_HClipTB
<< 24) | 0x0;
1831 *vb
= (HC_SubA_HClipLR
<< 24) | 0x0;
1835 *vb
= (HC_SubA_HClipTB
<< 24) | (clipT
<< 12) | clipB
;
1838 *vb
= (HC_SubA_HClipLR
<< 24) | (clipL
<< 12) | clipR
;
1843 GLuint pitch
, format
, offset
;
1844 GLuint bytePerPixel
= vmesa
->viaScreen
->bitsPerPixel
>> 3;
1846 if (vmesa
->viaScreen
->bitsPerPixel
== 0x20) {
1847 format
= HC_HDBFM_ARGB8888
;
1849 else if (vmesa
->viaScreen
->bitsPerPixel
== 0x10) {
1850 format
= HC_HDBFM_RGB565
;
1855 pitch
= vmesa
->front
.pitch
;
1856 offset
= vmesa
->viaScreen
->fbOffset
+ (vmesa
->drawY
* pitch
+ vmesa
->drawX
* bytePerPixel
);
1857 offset
= offset
& 0xffffffe0;
1859 *vb
++ = ((HC_SubA_HDBBasL
<< 24) | (offset
& 0xFFFFFF));
1860 *vb
++ = ((HC_SubA_HDBBasH
<< 24) | ((offset
& 0xFF000000)) >> 24);
1861 *vb
++ = ((HC_SubA_HDBFM
<< 24) | HC_HDBLoc_Local
| format
| pitch
);
1864 *pnEngBaseTranSpace
= (HC_SubA_HAGPCMNT
<< 24) |
1865 ((GLuint
)(pnAGPCurrentPhysEnd
) & 0xFF000000) >> 16 |
1866 ((GLuint
)(pnAGPCurrentPhysStart
) & 0xFF000000) >> 24 |
1871 GLuint
*data
= (GLuint
*)vmesa
->dmaAddr
;
1872 for (i
= 0; i
< vmesa
->dmaLow
; i
+= 16) {
1873 fprintf(stderr
, "%08x ", *data
++);
1874 fprintf(stderr
, "%08x ", *data
++);
1875 fprintf(stderr
, "%08x ", *data
++);
1876 fprintf(stderr
, "%08x\n", *data
++);
1878 fprintf(stderr
, "******************************************\n");
1888 volatile GLuint
*pnEngBase
= (GLuint
*)((GLuint
)pnMMIOBase
+ 0x400);
1893 nStatus
= *pnEngBase
;
1894 if ((nStatus
& 0xFFFEFFFF) == 0x00020000) {
1900 /* dump current command buffer */
1901 data
= (GLuint
*)vmesa
->dmaAddr
;
1904 fprintf(stderr
, "current command buffer");
1905 fprintf(stderr
, "i = %d\n", i
);
1906 for (j
= 0; j
< vmesa
->dmaLow
; j
+= 16) {
1907 fprintf(stderr
, "%08x ", *data
++);
1908 fprintf(stderr
, "%08x ", *data
++);
1909 fprintf(stderr
, "%08x ", *data
++);
1910 fprintf(stderr
, "%08x\n", *data
++);
1913 /* dump previous command buffer */
1914 if (vmesa
->dmaIndex
) {
1915 data
= (GLuint
*)vmesa
->dma
[0].map
;
1918 data
= (GLuint
*)vmesa
->dma
[1].map
;
1921 fprintf(stderr
, "previous command buffer");
1922 fprintf(stderr
, "i = %d\n", i
);
1923 for (j
= 0; j
< dmaLow
; j
+= 16) {
1924 fprintf(stderr
, "%08x ", *data
++);
1925 fprintf(stderr
, "%08x ", *data
++);
1926 fprintf(stderr
, "%08x ", *data
++);
1927 fprintf(stderr
, "%08x\n", *data
++);
1935 dmaLow
= vmesa
->dmaLow
;
1939 int flush_sys(viaContextPtr vmesa
, drm_via_flush_sys_t
* buf
)
1944 volatile GLuint
*pnMMIOBase
;
1945 volatile GLuint
*pnEngBaseTranSet
;
1946 volatile GLuint
*pnEngBaseTranSpace
;
1947 GLuint uCheck2DCmd
= GL_TRUE
;
1949 GLuint
*vb
= (GLuint
*)vmesa
->dmaAddr
;
1952 pnMMIOBase
= vmesa
->regMMIOBase
;
1953 pnEngBaseTranSet
= vmesa
->regTranSet
;
1954 pnEngBaseTranSpace
= vmesa
->regTranSpace
;
1956 pnBuf
= (GLuint
*)(buf
->index
+ buf
->offset
);
1957 pnEnd
= (GLuint
*)((GLuint
)pnBuf
+ buf
->size
);
1959 /*=* [DBG] make draw to front buffer *=*/
1961 vmesa
->glCtx
->Color
._DrawDestMask
[0] = __GL_FRONT_BUFFER_MASK
;
1964 /*=* John Sheng [2003.6.20] fix pci *=*/
1966 volatile GLuint
*pnEngBase
= vmesa
->regEngineStatus
;
1970 nStatus
= *pnEngBase
;
1971 if ((nStatus
& 0xFFFEFFFF) == 0x00020000)
1976 /*=* John Sheng [2003.12.9] Tuxracer & VQ *=*/
1977 /*=* Disable VQ *=*/
1978 if (vmesa
->VQEnable
)
1981 *vmesa
->regTranSet
= 0x00fe0000;
1982 *vmesa
->regTranSet
= 0x00fe0000;
1983 *vmesa
->regTranSpace
= 0x00000004;
1984 *vmesa
->regTranSpace
= 0x40008c0f;
1985 *vmesa
->regTranSpace
= 0x44000000;
1986 *vmesa
->regTranSpace
= 0x45080c04;
1987 *vmesa
->regTranSpace
= 0x46800408;
1988 vmesa
->VQEnable
= 0;
1990 if (vmesa
->glCtx
->Color
._DrawDestMask
[0] == __GL_BACK_BUFFER_MASK
) {
1992 *vb
++ = (HC_ParaType_NotTex
<< 16);
1994 if (vmesa
->driDrawable
->w
== 0 || vmesa
->driDrawable
->h
== 0) {
1995 *vb
++ = (HC_SubA_HClipTB
<< 24) | 0x0;
1996 *vb
++ = (HC_SubA_HClipLR
<< 24) | 0x0;
1999 *vb
++ = ((HC_SubA_HClipTB
<< 24) | (0x0 << 12) | vmesa
->driDrawable
->h
);
2000 *vb
++ = ((HC_SubA_HClipLR
<< 24) | (vmesa
->drawXoff
<< 12) | (vmesa
->driDrawable
->w
+ vmesa
->drawXoff
));
2003 /*=* John Sheng [2003.6.16] fix pci path *=*/
2005 GLuint pitch
, format
, offset
;
2007 if (vmesa
->viaScreen
->bitsPerPixel
== 0x20) {
2008 format
= HC_HDBFM_ARGB8888
;
2010 else if (vmesa
->viaScreen
->bitsPerPixel
== 0x10) {
2011 format
= HC_HDBFM_RGB565
;
2016 offset
= vmesa
->back
.offset
;
2017 pitch
= vmesa
->back
.pitch
;
2019 *vb
++ = ((HC_SubA_HDBBasL
<< 24) | (offset
& 0xFFFFFF));
2020 *vb
++ = ((HC_SubA_HDBBasH
<< 24) | ((offset
& 0xFF000000)) >> 24);
2021 *vb
++ = ((HC_SubA_HDBFM
<< 24) | HC_HDBLoc_Local
| format
| pitch
);
2025 while (pnBuf
!= pnEnd
) {
2026 if (*pnBuf
== HALCYON_HEADER2
) {
2028 if (*pnBuf
== HALCYON_SUB_ADDR0
) {
2029 *pnEngBaseTranSet
= *pnBuf
;
2031 uCheck2DCmd
= GL_FALSE
;
2034 *pnEngBaseTranSet
= *pnBuf
;
2036 uCheck2DCmd
= GL_TRUE
;
2039 else if (uCheck2DCmd
&& ((*pnBuf
&HALCYON_HEADER1MASK
)==HALCYON_HEADER1
)) {
2040 addr
= ((*pnBuf
)&0x0000001f) << 2;
2042 *((GLuint
*)((GLuint
)pnMMIOBase
+addr
)) = *pnBuf
;
2045 else if ((*pnBuf
&HALCYON_FIREMASK
) == HALCYON_FIRECMD
) {
2046 *pnEngBaseTranSpace
= *pnBuf
;
2048 if ((pnBuf
!=pnEnd
)&&((*pnBuf
&HALCYON_FIREMASK
)==HALCYON_FIRECMD
))
2050 if ((*pnBuf
&HALCYON_CMDBMASK
) != HC_ACMD_HCmdB
)
2051 uCheck2DCmd
= GL_TRUE
;
2054 *pnEngBaseTranSpace
= *pnBuf
;
2061 GLuint clipL
, clipR
, clipT
, clipB
;
2062 drm_clip_rect_t
*b
= vmesa
->sarea
->boxes
;
2066 *vb
++ = (HC_ParaType_NotTex
<< 16);
2071 for (i
= 0; i
< vmesa
->sarea
->nbox
; i
++) {
2072 clipL
= b
->x1
+ vmesa
->drawXoff
;
2073 clipR
= b
->x2
+ vmesa
->drawXoff
;
2077 if (vmesa
->driDrawable
->w
== 0 || vmesa
->driDrawable
->h
== 0) {
2078 *vb
= (HC_SubA_HClipTB
<< 24) | 0x0;
2080 *vb
= (HC_SubA_HClipLR
<< 24) | 0x0;
2084 *vb
= (HC_SubA_HClipTB
<< 24) | (clipT
<< 12) | clipB
;
2086 *vb
= (HC_SubA_HClipLR
<< 24) | (clipL
<< 12) | clipR
;
2090 /*=* John Sheng [2003.6.16] fix pci path *=*/
2092 GLuint pitch
, format
, offset
;
2093 GLuint bytePerPixel
= vmesa
->viaScreen
->bitsPerPixel
>> 3;
2095 if (vmesa
->viaScreen
->bitsPerPixel
== 0x20) {
2096 format
= HC_HDBFM_ARGB8888
;
2098 else if (vmesa
->viaScreen
->bitsPerPixel
== 0x10) {
2099 format
= HC_HDBFM_RGB565
;
2104 pitch
= vmesa
->front
.pitch
;
2105 offset
= vmesa
->viaScreen
->fbOffset
+ (vmesa
->drawY
* pitch
+ vmesa
->drawX
* bytePerPixel
);
2106 offset
= offset
& 0xffffffe0;
2108 *vb
++ = ((HC_SubA_HDBBasL
<< 24) | (offset
& 0xFFFFFF));
2109 *vb
++ = ((HC_SubA_HDBBasH
<< 24) | ((offset
& 0xFF000000)) >> 24);
2110 *vb
++ = ((HC_SubA_HDBFM
<< 24) | HC_HDBLoc_Local
| format
| pitch
);
2116 while (pnBuf
!= pnEnd
) {
2117 if (*pnBuf
== HALCYON_HEADER2
) {
2119 if (*pnBuf
== HALCYON_SUB_ADDR0
) {
2120 *pnEngBaseTranSet
= *pnBuf
;
2122 uCheck2DCmd
= GL_FALSE
;
2125 *pnEngBaseTranSet
= *pnBuf
;
2127 uCheck2DCmd
= GL_TRUE
;
2130 else if (uCheck2DCmd
&& ((*pnBuf
&HALCYON_HEADER1MASK
)==HALCYON_HEADER1
)) {
2131 addr
= ((*pnBuf
)&0x0000001f) << 2;
2133 *((GLuint
*)((GLuint
)pnMMIOBase
+addr
)) = *pnBuf
;
2136 else if ((*pnBuf
&HALCYON_FIREMASK
) == HALCYON_FIRECMD
) {
2137 *pnEngBaseTranSpace
= *pnBuf
;
2139 if ((pnBuf
!=pnEnd
)&&((*pnBuf
&HALCYON_FIREMASK
)==HALCYON_FIRECMD
))
2141 if ((*pnBuf
&HALCYON_CMDBMASK
) != HC_ACMD_HCmdB
)
2142 uCheck2DCmd
= GL_TRUE
;
2145 *pnEngBaseTranSpace
= *pnBuf
;
2153 /*=* John Sheng [2003.6.20] debug pci *=*/
2155 GLuint
*pnEngBase
= (GLuint
*)((GLuint
)pnMMIOBase
+ 0x400);
2160 nStatus
= *pnEngBase
;
2161 if ((nStatus
& 0xFFFEFFFF) == 0x00020000) {
2167 /*=* John Sheng [2003.12.9] Tuxracer & VQ *=*/
2171 data
= (GLuint
*)vmesa
->dmaAddr
;
2175 /*=* John Sheng [2003.12.9] Tuxracer & VQ *=*/
2176 for (k
=0 ; k
< 35; k
++) {
2177 fprintf(stderr
, "%02xh - %02xh\n", k
*4 + 3, k
*4);
2178 fprintf(stderr
, "%08x\n", *ES
);
2181 fprintf(stderr
, "current command buffer");
2182 fprintf(stderr
, "i = %d\n", i
);
2183 for (j
= 0; j
< vmesa
->dmaLow
; j
+= 16) {
2184 fprintf(stderr
, "%08x ", *data
++);
2185 fprintf(stderr
, "%08x ", *data
++);
2186 fprintf(stderr
, "%08x ", *data
++);
2187 fprintf(stderr
, "%08x\n", *data
++);
2190 if (vmesa
->dmaIndex
) {
2191 data
= (GLuint
*)vmesa
->dma
[0].map
;
2194 data
= (GLuint
*)vmesa
->dma
[1].map
;
2197 fprintf(stderr
, "previous command buffer");
2198 fprintf(stderr
, "i = %d\n", i
);
2199 for (j
= 0; j
< dmaLow
; j
+= 16) {
2200 fprintf(stderr
, "%08x ", *data
++);
2201 fprintf(stderr
, "%08x ", *data
++);
2202 fprintf(stderr
, "%08x ", *data
++);
2203 fprintf(stderr
, "%08x\n", *data
++);
2210 dmaLow
= vmesa
->dmaLow
;