2 Copyright 1995-2015, The AROS Development Team. All rights reserved.
9 #include <exec/libraries.h>
10 #include <exec/rawfmt.h>
11 #include <exec/types.h>
12 #include <exec/resident.h>
13 #include <exec/memory.h>
14 #include <graphics/displayinfo.h>
15 #include <intuition/intuitionbase.h>
16 #include <aros/libcall.h>
17 #include <proto/alib.h>
18 #include <proto/exec.h>
19 #include <proto/kernel.h>
20 #include <proto/oop.h>
21 #include <proto/utility.h>
24 #include <hidd/hidd.h>
25 #include <hidd/graphics.h>
27 #include <aros/symbolsets.h>
29 #include LC_LIBDEFS_FILE
32 #include "uaegfxbitmap.h"
38 #include <aros/debug.h>
40 #define SIZE_RESLIST 5
41 #define SIZE_PFLIST 19
42 #define SIZE_MODELIST (5 + RGBFB_MaxFormats)
44 HIDDT_ModeID
*UAEGFXCl__Hidd_Gfx__QueryModeIDs(OOP_Class
*cl
, OOP_Object
*o
, struct pHidd_Gfx_QueryModeIDs
*msg
)
46 struct uaegfx_staticdata
*csd
= CSD(cl
);
48 struct TagItem
*tag
, *tstate
;
49 ULONG minwidth
= 0, maxwidth
= 0xFFFFFFFF;
50 ULONG minheight
= 0, maxheight
= 0xFFFFFFFF;
51 OOP_Object
**pf
= NULL
;
52 HIDDT_ModeID
*modeids
;
55 if (csd
->superforward
)
56 return (HIDDT_ModeID
*)OOP_DoSuperMethod(cl
, o
, (OOP_Msg
)msg
);
58 for (tstate
= msg
->queryTags
; (tag
= NextTagItem(&tstate
)); )
62 case tHidd_GfxMode_MinWidth
:
63 minwidth
= (ULONG
)tag
->ti_Tag
;
66 case tHidd_GfxMode_MaxWidth
:
67 maxwidth
= (ULONG
)tag
->ti_Tag
;
70 case tHidd_GfxMode_MinHeight
:
71 minheight
= (ULONG
)tag
->ti_Tag
;
74 case tHidd_GfxMode_MaxHeight
:
75 maxheight
= (ULONG
)tag
->ti_Tag
;
78 case tHidd_GfxMode_PixFmts
:
79 pf
= (OOP_Object
**)tag
->ti_Tag
;
84 DB2(bug("QueryModeIDs (%dx%d)-(%dx%d) %p\n", minwidth
, minheight
, maxwidth
, maxheight
, pf
));
86 ForeachNode(&csd
->rtglist
, node
) {
87 if (node
->width
>= minwidth
&& node
->width
<= maxwidth
&& node
->height
>= minheight
&& node
->height
<= maxheight
) {
88 OOP_Object
**pfp
= NULL
;
92 if (*pfp
== node
->pf
) {
103 modeids
= AllocVec((cnt
+ 1) * sizeof(HIDDT_ModeID
), MEMF_PUBLIC
);
107 ForeachNode(&csd
->rtglist
, node
) {
108 if (node
->width
>= minwidth
&& node
->width
<= maxwidth
&& node
->height
>= minheight
&& node
->height
<= maxheight
) {
109 OOP_Object
**pfp
= NULL
;
113 if (*pfp
== node
->pf
) {
121 DB2(bug("%d: %08x\n", cnt
, node
->modeid
));
122 modeids
[cnt
++] = node
->modeid
;
126 modeids
[cnt
] = vHidd_ModeID_Invalid
;
130 VOID
UAEGFXCl__Hidd_Gfx__ReleaseModeIDs(OOP_Class
*cl
, OOP_Object
*o
, struct pHidd_Gfx_ReleaseModeIDs
*msg
)
132 struct uaegfx_staticdata
*csd
= CSD(cl
);
133 if (csd
->superforward
)
134 OOP_DoSuperMethod(cl
, o
, (OOP_Msg
)msg
);
136 FreeVec(msg
->modeIDs
);
139 HIDDT_ModeID
UAEGFXCl__Hidd_Gfx__NextModeID(OOP_Class
*cl
, OOP_Object
*o
, struct pHidd_Gfx_NextModeID
*msg
)
141 struct uaegfx_staticdata
*csd
= CSD(cl
);
142 struct RTGMode
*node
= NULL
;
143 HIDDT_ModeID mid
= vHidd_ModeID_Invalid
;
145 DB2(bug("NextModeID %08x\n", msg
->modeID
));
146 if (msg
->modeID
!= vHidd_ModeID_Invalid
) {
147 ForeachNode(&csd
->rtglist
, node
) {
148 if (node
->modeid
== msg
->modeID
) {
149 node
= (struct RTGMode
*)node
->node
.ln_Succ
;
155 node
= (struct RTGMode
*)csd
->rtglist
.lh_Head
;
156 if (node
->node
.ln_Succ
) {
158 *msg
->syncPtr
= node
->sync
;
159 *msg
->pixFmtPtr
= node
->pf
;
161 DB2(bug("=%08x %p %p\n", mid
, *msg
->syncPtr
, *msg
->pixFmtPtr
));
165 BOOL
UAEGFXCl__Hidd_Gfx__GetMode(OOP_Class
*cl
, OOP_Object
*o
, struct pHidd_Gfx_GetMode
*msg
)
167 struct uaegfx_staticdata
*csd
= CSD(cl
);
168 struct RTGMode
*node
;
170 if (csd
->superforward
)
171 return (BOOL
)OOP_DoSuperMethod(cl
, o
, (OOP_Msg
)msg
);
173 DB2(bug("GetMode %08x\n", msg
->modeID
));
174 ForeachNode(&csd
->rtglist
, node
) {
175 if (node
->modeid
== msg
->modeID
) {
176 *msg
->syncPtr
= node
->sync
;
177 *msg
->pixFmtPtr
= node
->pf
;
178 DB2(bug("= %p %p\n", node
->sync
, node
->pf
));
182 DB2(bug("= FAIL\n"));
189 ULONG rm
, gm
, bm
, am
;
190 UWORD rs
, gs
, bs
, as
;
194 static const struct RTGFormat formats
[] =
196 { RGBFB_CLUT
, 0x00ff0000, 0x0000ff00, 0x000000ff, 0x00000000, 8, 16, 24, 0, FALSE
},
198 { RGBFB_B8G8R8A8
, 0x0000ff00, 0x00ff0000, 0xff000000, 0x000000ff, 16, 8, 0, 24, FALSE
},
199 { RGBFB_R8G8B8A8
, 0xff000000, 0x00ff0000, 0x0000ff00, 0x000000ff, 0, 8, 16, 24, FALSE
},
200 { RGBFB_A8B8G8R8
, 0x000000ff, 0x0000ff00, 0x00ff0000, 0xff000000, 24, 16, 8, 0, FALSE
},
201 { RGBFB_A8R8G8B8
, 0x00ff0000, 0x0000ff00, 0x000000ff, 0xff000000, 8, 16, 24, 0, FALSE
},
203 { RGBFB_B8G8R8
, 0x000000ff, 0x0000ff00, 0x00ff0000, 0x00000000, 24, 16, 8, 0, FALSE
},
204 { RGBFB_R8G8B8
, 0x00ff0000, 0x0000ff00, 0x000000ff, 0x00000000, 8, 16, 24, 0, FALSE
},
206 { RGBFB_R5G5B5
, 0x00007c00, 0x000003e0, 0x0000001f, 0x00000000, 17, 22, 27, 0, FALSE
},
207 { RGBFB_R5G6B5
, 0x0000f800, 0x000007e0, 0x0000001f, 0x00000000, 16, 21, 27, 0, FALSE
},
209 { RGBFB_R5G5B5PC
, 0x00007c00, 0x000003e0, 0x0000001f, 0x00000000, 17, 22, 27, 0, TRUE
},
210 { RGBFB_R5G6B5PC
, 0x0000f800, 0x000007e0, 0x0000001f, 0x00000000, 16, 21, 27, 0, TRUE
},
212 { RGBFB_B5G5R5PC, 0x0000003e, 0x000007c0, 0x0000f800, 0x00000000, 26, 21, 16, 0, TRUE },
213 { RGBFB_B5G6R5PC, 0x0000001f, 0x000007e0, 0x0000f800, 0x00000000, 27, 21, 16, 0, TRUE },
218 static const UBYTE rgbtypelist
[] = {
238 OOP_Object
*UAEGFXCl__Root__New(OOP_Class
*cl
, OOP_Object
*o
, struct pRoot_New
*msg
)
240 struct uaegfx_staticdata
*csd
= CSD(cl
);
241 struct LibResolution
*r
;
242 WORD rescnt
, i
, j
, k
, l
;
243 struct TagItem
*reslist
, *restags
, *pflist
, *modetags
;
244 struct pRoot_New mymsg
;
245 struct TagItem mytags
[2];
246 UWORD supportedformats
, gotmodes
;
248 if (csd
->initialized
)
251 NEWLIST(&csd
->rtglist
);
252 NEWLIST(&csd
->bitmaplist
);
253 InitSemaphore(&csd
->HWLock
);
254 InitSemaphore(&csd
->MultiBMLock
);
256 supportedformats
= gw(csd
->boardinfo
+ PSSO_BoardInfo_RGBFormats
);
257 //kprintf("====== SUPPORTED FORMATS: 0x%x\n", supportedformats);
260 ForeachNode(csd
->boardinfo
+ PSSO_BoardInfo_ResolutionsList
, r
) {
263 D(bug("UAEGFX: resolutions: %d, supportmask: %x\n", rescnt
, supportedformats
));
265 reslist
= AllocVec(rescnt
* SIZE_RESLIST
* sizeof(struct TagItem
), MEMF_PUBLIC
| MEMF_CLEAR
);
266 restags
= AllocVec((rescnt
+ 1) * sizeof(struct TagItem
), MEMF_PUBLIC
| MEMF_CLEAR
);
267 pflist
= AllocVec(RGBFB_MaxFormats
* SIZE_PFLIST
* sizeof(struct TagItem
), MEMF_PUBLIC
| MEMF_CLEAR
);
268 modetags
= AllocVec(SIZE_MODELIST
* sizeof(struct TagItem
), MEMF_PUBLIC
| MEMF_CLEAR
);
271 ForeachNode(csd
->boardinfo
+ PSSO_BoardInfo_ResolutionsList
, r
) {
272 reslist
[i
* SIZE_RESLIST
+ 0].ti_Tag
= aHidd_Sync_HDisp
;
273 reslist
[i
* SIZE_RESLIST
+ 0].ti_Data
= r
->Width
;
274 reslist
[i
* SIZE_RESLIST
+ 1].ti_Tag
= aHidd_Sync_VDisp
;
275 reslist
[i
* SIZE_RESLIST
+ 1].ti_Data
= r
->Height
;
276 reslist
[i
* SIZE_RESLIST
+ 2].ti_Tag
= aHidd_Sync_Description
;
277 reslist
[i
* SIZE_RESLIST
+ 2].ti_Data
= (IPTR
)(csd
->CardBase
? "RTGFX:%hx%v" : "UAEGFX:%hx%v");
278 reslist
[i
* SIZE_RESLIST
+ 3].ti_Tag
= aHidd_Sync_PixelClock
;
279 reslist
[i
* SIZE_RESLIST
+ 3].ti_Data
= r
->Modes
[CHUNKY
]->PixelClock
;
280 reslist
[i
* SIZE_RESLIST
+ 4].ti_Tag
= TAG_DONE
;
281 reslist
[i
* SIZE_RESLIST
+ 4].ti_Data
= 0;
282 D(bug("%08x %d*%d\n", r
, r
->Width
, r
->Height
));
283 restags
[i
].ti_Tag
= aHidd_Gfx_SyncTags
;
284 restags
[i
].ti_Data
= (IPTR
)&reslist
[i
* SIZE_RESLIST
];
287 restags
[i
].ti_Tag
= TAG_DONE
;
288 restags
[i
].ti_Data
= 0;
293 for (i
= 0; rgbtypelist
[i
]; i
++) {
294 UBYTE rgbtype
= rgbtypelist
[i
];
295 WORD depth
= getrtgdepth(1 << rgbtype
);
296 if (!((1 << rgbtype
) & RGBFB_SUPPORTMASK
) || depth
== 0 || !((1 << rgbtype
) & supportedformats
)) {
297 pflist
[j
].ti_Tag
= TAG_DONE
;
298 pflist
[j
].ti_Data
= 0;
302 for (l
= 0; formats
[l
].rgbformat
; l
++) {
303 if (formats
[l
].rgbformat
== rgbtype
)
306 if (formats
[l
].rgbformat
== 0) {
307 pflist
[j
].ti_Tag
= TAG_DONE
;
308 pflist
[j
].ti_Data
= 0;
312 D(bug("RTGFORMAT=%d found. Depth=%d\n", rgbtype
, depth
));
314 if (gotmodes
& (1 << (depth
/ 8))) {
315 D(bug("-> skipped\n"));
316 pflist
[j
].ti_Tag
= TAG_DONE
;
317 pflist
[j
].ti_Data
= 0;
322 gotmodes
|= 1 << (depth
/ 8);
324 modetags
[k
].ti_Tag
= aHidd_Gfx_PixFmtTags
;
325 modetags
[k
].ti_Data
= (IPTR
)&pflist
[j
];
328 pflist
[j
].ti_Tag
= aHidd_PixFmt_RedShift
;
329 pflist
[j
].ti_Data
= formats
[l
].rs
;
331 pflist
[j
].ti_Tag
= aHidd_PixFmt_GreenShift
;
332 pflist
[j
].ti_Data
= formats
[l
].gs
;
334 pflist
[j
].ti_Tag
= aHidd_PixFmt_BlueShift
;
335 pflist
[j
].ti_Data
= formats
[l
].bs
;
337 pflist
[j
].ti_Tag
= aHidd_PixFmt_AlphaShift
;
338 pflist
[j
].ti_Data
= formats
[l
].as
;
340 pflist
[j
].ti_Tag
= aHidd_PixFmt_RedMask
;
341 pflist
[j
].ti_Data
= formats
[l
].rm
;
343 pflist
[j
].ti_Tag
= aHidd_PixFmt_GreenMask
;
344 pflist
[j
].ti_Data
= formats
[l
].gm
;
346 pflist
[j
].ti_Tag
= aHidd_PixFmt_BlueMask
;
347 pflist
[j
].ti_Data
= formats
[l
].bm
;
349 pflist
[j
].ti_Tag
= aHidd_PixFmt_AlphaMask
;
350 pflist
[j
].ti_Data
= formats
[l
].am
;
352 pflist
[j
].ti_Tag
= aHidd_PixFmt_CLUTMask
;
353 pflist
[j
].ti_Data
= 0x000000FF;
355 pflist
[j
].ti_Tag
= aHidd_PixFmt_CLUTShift
;
356 pflist
[j
].ti_Data
= 0;
358 pflist
[j
].ti_Tag
= aHidd_PixFmt_ColorModel
;
359 pflist
[j
].ti_Data
= depth
<= 8 ? vHidd_ColorModel_Palette
: vHidd_ColorModel_TrueColor
;
361 pflist
[j
].ti_Tag
= aHidd_PixFmt_Depth
;
362 pflist
[j
].ti_Data
= depth
;
364 pflist
[j
].ti_Tag
= aHidd_PixFmt_BytesPerPixel
;
365 pflist
[j
].ti_Data
= (depth
+ 7) / 8;
367 pflist
[j
].ti_Tag
= aHidd_PixFmt_BitsPerPixel
;
368 pflist
[j
].ti_Data
= depth
;
370 pflist
[j
].ti_Tag
= aHidd_PixFmt_StdPixFmt
;
371 pflist
[j
].ti_Data
= vHidd_StdPixFmt_Native
;
373 pflist
[j
].ti_Tag
= aHidd_PixFmt_BitMapType
;
374 pflist
[j
].ti_Data
= vHidd_BitMapType_Chunky
;
376 pflist
[j
].ti_Tag
= aHidd_PixFmt_SwapPixelBytes
;
377 pflist
[j
].ti_Data
= formats
[l
].endianswap
;
379 pflist
[j
].ti_Tag
= TAG_DONE
;
380 pflist
[j
].ti_Data
= 0;
384 modetags
[k
].ti_Tag
= aHidd_Sync_HMin
;
385 modetags
[k
].ti_Data
= 112;
387 modetags
[k
].ti_Tag
= aHidd_Sync_VMin
;
388 modetags
[k
].ti_Data
= 112;
390 modetags
[k
].ti_Tag
= aHidd_Sync_HMax
;
391 modetags
[k
].ti_Data
= 16384;
393 modetags
[k
].ti_Tag
= aHidd_Sync_VMax
;
394 modetags
[k
].ti_Data
= 16384;
396 modetags
[k
].ti_Tag
= TAG_MORE
;
397 modetags
[k
].ti_Data
= (IPTR
)restags
;
399 mytags
[0].ti_Tag
= aHidd_Gfx_ModeTags
;
400 mytags
[0].ti_Data
= (IPTR
)modetags
;
401 mytags
[1].ti_Tag
= TAG_MORE
;
402 mytags
[1].ti_Data
= (IPTR
)msg
->attrList
;
404 EnterFunc(bug("UAEGFX::New() tags=%x\n", mytags
));
406 mymsg
.mID
= msg
->mID
;
407 mymsg
.attrList
= mytags
;
410 /* Register gfxmodes */
411 o
= (OOP_Object
*)OOP_DoSuperMethod(cl
, o
, (OOP_Msg
)msg
);
414 struct gfx_data
*data
= OOP_INST_DATA(cl
, o
);
417 D(bug("UAEGFX::New(): Got object from super\n"));
418 NewList((struct List
*)&data
->bitmaps
);
419 csd
->initialized
= 1;
420 csd
->spritecolors
= 16;
422 csd
->superforward
= TRUE
;
423 midp
= HIDD_Gfx_QueryModeIDs(o
, NULL
);
424 for (i
= 0; midp
[i
] != vHidd_ModeID_Invalid
; i
++) {
425 OOP_Object
*sync
, *pf
;
426 HIDDT_ModeID mid
= midp
[i
];
427 IPTR dwidth
, dheight
;
428 struct RTGMode
*node1
, *node2
;
429 ULONG modeid
, rtgmodeid
, p96mode
;
431 if (!HIDD_Gfx_GetMode(o
, mid
, &sync
, &pf
))
433 OOP_GetAttr(sync
, aHidd_Sync_HDisp
, &dwidth
);
434 OOP_GetAttr(sync
, aHidd_Sync_VDisp
, &dheight
);
436 DB2(bug("w=%d h=%d mode=%08x sync=%x pf=%x\n", dwidth
, dheight
, mid
, sync
, pf
));
438 modeid
= vHidd_ModeID_Invalid
;
439 ForeachNode(csd
->boardinfo
+ PSSO_BoardInfo_ResolutionsList
, r
) {
440 if (r
->Width
== dwidth
&& r
->Height
== dheight
) {
441 modeid
= r
->DisplayID
;
445 if (modeid
== vHidd_ModeID_Invalid
) {
446 D(bug("w=%d h=%d not found!\n", dwidth
, dheight
));
450 p96mode
= getrtgformat(csd
, pf
);
451 rtgmodeid
= (modeid
& 0x00ff0000) | 0x1000 | (p96mode
<< 8);
453 ForeachNode(&csd
->rtglist
, node2
) {
454 if (node2
->width
== dwidth
&& node2
->height
== dheight
&& node2
->modeid
== rtgmodeid
)
457 if (node2
->node
.ln_Succ
!= NULL
) {
458 D(bug("w=%d h=%d mode=%08x already found!\n", dwidth
, dheight
, rtgmodeid
));
462 node1
= AllocMem(sizeof(struct RTGMode
), MEMF_CLEAR
);
463 node1
->width
= dwidth
;
464 node1
->height
= dheight
;
467 node1
->modeid
= rtgmodeid
;
468 AddTail(&csd
->rtglist
, &node1
->node
);
470 DB2(bug("Added %dx%d %08x %d\n", node1
->width
, node1
->height
, node1
->modeid
, p96mode
));
472 HIDD_Gfx_ReleaseModeIDs(o
, midp
);
473 csd
->superforward
= FALSE
;
482 ReturnPtr("UAEGFX::New", OOP_Object
*, o
);
485 /********** GfxHidd::Dispose() ******************************/
486 OOP_Object
*UAEGFXCl__Hidd_Gfx__CreateObject(OOP_Class
*cl
, OOP_Object
*o
, struct pHidd_Gfx_CreateObject
*msg
)
488 OOP_Object
*object
= NULL
;
490 EnterFunc(bug("UAEGFX::CreateObject()\n"));
492 if (msg
->cl
== CSD(cl
)->basebm
)
494 struct uaegfx_staticdata
*csd
= CSD(cl
);
496 struct pHidd_Gfx_CreateObject p
;
497 struct TagItem tags
[] =
499 { TAG_IGNORE
, TAG_IGNORE
}, /* Placeholder for aHidd_BitMap_ClassPtr */
500 { TAG_MORE
, (IPTR
)msg
->attrList
}
503 modeid
= (HIDDT_ModeID
)GetTagData(aHidd_BitMap_ModeID
, vHidd_ModeID_Invalid
, msg
->attrList
);
504 if (modeid
!= vHidd_ModeID_Invalid
) {
505 tags
[0].ti_Tag
= aHidd_BitMap_ClassPtr
;
506 tags
[0].ti_Data
= (IPTR
)CSD(cl
)->bmclass
;
512 object
= (OOP_Object
*)OOP_DoSuperMethod(cl
, o
, (OOP_Msg
)&p
);
515 object
= (OOP_Object
*)OOP_DoSuperMethod(cl
, o
, (OOP_Msg
)msg
);
517 ReturnPtr("UAEGFX::CreateObject", OOP_Object
*, object
);
520 VOID
UAEGFXCl__Root__Get(OOP_Class
*cl
, OOP_Object
*o
, struct pRoot_Get
*msg
)
522 struct uaegfx_staticdata
*csd
= CSD(cl
);
525 //bug("UAEGFXCl__Root__Get %x\n", msg->attrID);
527 if (IS_GFX_ATTR(msg
->attrID
, idx
))
532 case aoHidd_Gfx_HWSpriteTypes
:
533 *msg
->storage
= csd
->hardwaresprite
? vHidd_SpriteType_3Plus1
: 0;
535 case aoHidd_Gfx_SupportsHWCursor
:
536 *msg
->storage
= csd
->hardwaresprite
;
538 case aoHidd_Gfx_NoFrameBuffer
:
539 *msg
->storage
= TRUE
;
541 case aoHidd_Gfx_IsWindowed
:
542 *msg
->storage
= FALSE
;
544 case aoHidd_Gfx_DriverName
:
545 *msg
->storage
= (IPTR
)"UAEGFX";
549 OOP_DoSuperMethod(cl
, o
, (OOP_Msg
)msg
);
552 VOID
UAEGFXCl__Root__Set(OOP_Class
*cl
, OOP_Object
*obj
, struct pRoot_Set
*msg
)
554 struct uaegfx_staticdata
*csd
= CSD(cl
);
555 struct TagItem
*tag
, *tstate
;
557 tstate
= msg
->attrList
;
558 while((tag
= NextTagItem(&tstate
)))
561 D(bug("UAEGFXCl__Root__Set %x\n", tag
->ti_Tag
));
562 if (IS_GFX_ATTR(tag
->ti_Tag
, idx
)) {
563 D(bug("->%d\n", idx
));
566 case aoHidd_Gfx_ActiveCallBack
:
567 csd
->acb
= (void *)tag
->ti_Data
;
570 case aoHidd_Gfx_ActiveCallBackData
:
571 csd
->acbdata
= (APTR
)tag
->ti_Data
;
576 OOP_DoSuperMethod(cl
, obj
, (OOP_Msg
)msg
);
579 ULONG
UAEGFXCl__Hidd_Gfx__MakeViewPort(OOP_Class
*cl
, OOP_Object
*o
, struct pHidd_Gfx_MakeViewPort
*msg
)
581 struct uaegfx_staticdata
*csd
= CSD(cl
);
586 bug("makeviewport %p\n", msg
->Data
->vpe
);
587 csd
->vpe
= msg
->Data
->vpe
;
591 void UAEGFXCl__Hidd_Gfx__CleanViewPort(OOP_Class
*cl
, OOP_Object
*o
, struct pHidd_Gfx_CleanViewPort
*msg
)
593 struct uaegfx_staticdata
*csd
= CSD(cl
);
596 bug("cleanviewport\n");
600 static void doshow(struct uaegfx_staticdata
*csd
, OOP_Object
*bm
, struct ViewPort
*vp
, BOOL offonly
)
602 struct IntuitionBase
*ib
= (struct IntuitionBase
*)csd
->cs_IntuitionBase
;
603 struct ViewPort
*vpi
= NULL
;
606 vpi
= &ib
->FirstScreen
->ViewPort
;
608 D(bug("doshow b=%p vp=%p vpi=%p acb=%p acbd=%p\n", bm
, vp
, vpi
, csd
->acb
, csd
->acbdata
));
610 if (bm
&& vpi
== vp
) {
611 /* we are topmost screen -> show our display */
612 IPTR tags
[] = {aHidd_BitMap_Visible
, TRUE
, TAG_DONE
};
617 OOP_SetAttrs(bm
, (struct TagItem
*)tags
);
620 csd
->acb(csd
->acbdata
, NULL
);
623 /* we are not topmost -> turn off our display */
624 IPTR tags
[] = {aHidd_BitMap_Visible
, FALSE
, TAG_DONE
};
625 OOP_SetAttrs(bm
, (struct TagItem
*)tags
);
631 SetDisplay(csd
, FALSE
);
632 SetSwitch(csd
, FALSE
);
638 OOP_Object
*UAEGFXCl__Hidd_Gfx__Show(OOP_Class
*cl
, OOP_Object
*c
, struct pHidd_Gfx_Show
*msg
)
640 struct uaegfx_staticdata
*csd
= CSD(cl
);
642 doshow(csd
, msg
->bitMap
, csd
->viewport
, FALSE
);
646 ULONG
UAEGFXCl__Hidd_Gfx__PrepareViewPorts(OOP_Class
*cl
, OOP_Object
*o
, struct pHidd_Gfx_ShowViewPorts
*msg
)
648 struct uaegfx_staticdata
*csd
= CSD(cl
);
649 struct HIDD_ViewPortData
*vpd
= msg
->Data
;
650 OOP_Object
*bm
= NULL
;
651 struct ViewPort
*vp
= NULL
;
656 vp
= vpd
->vpe
->ViewPort
;
659 doshow(csd
, bm
, vp
, FALSE
);
661 bug("PrepareViewPorts viewport=%p\n", csd
->viewport
);
665 ULONG
UAEGFXCl__Hidd_Gfx__ShowViewPorts(OOP_Class
*cl
, OOP_Object
*o
, struct pHidd_Gfx_ShowViewPorts
*msg
)
667 struct uaegfx_staticdata
*csd
= CSD(cl
);
668 struct HIDD_ViewPortData
*vpd
= msg
->Data
;
669 OOP_Object
*bm
= NULL
;
670 struct ViewPort
*vp
= NULL
;
675 vp
= vpd
->vpe
->ViewPort
;
677 doshow(csd
, bm
, vp
, FALSE
);
681 VOID
UAEGFXCl__Hidd_Gfx__CopyBox(OOP_Class
*cl
, OOP_Object
*o
, struct pHidd_Gfx_CopyBox
*msg
)
683 struct uaegfx_staticdata
*csd
= CSD(cl
);
684 HIDDT_DrawMode mode
= GC_DRMD(msg
->gc
);
685 struct bm_data
*sdata
= NULL
;
686 struct bm_data
*ddata
= NULL
;
687 struct RenderInfo risrc
, ridst
;
689 if (OOP_OCLASS(msg
->src
) == csd
->bmclass
) sdata
= OOP_INST_DATA(OOP_OCLASS(msg
->src
), msg
->src
);
690 if (OOP_OCLASS(msg
->dest
) == csd
->bmclass
) ddata
= OOP_INST_DATA(OOP_OCLASS(msg
->dest
), msg
->dest
);
692 if (!sdata
|| !ddata
)
694 //kprintf("==== copybox: unknown bitmap %p %p drawmode %d\n", sdata, ddata, mode);
695 //if (!sdata) kprintf(" src: %s\n", OOP_OCLASS(msg->src)->ClassNode.ln_Name ? OOP_OCLASS(msg->src)->ClassNode.ln_Name : "unknown");
696 //if (!ddata) kprintf(" dst: %s\n", OOP_OCLASS(msg->dest)->ClassNode.ln_Name ? OOP_OCLASS(msg->dest)->ClassNode.ln_Name : "unknown");
698 OOP_DoSuperMethod(cl
, o
, (OOP_Msg
)msg
);
702 if (sdata
->rgbformat
!= ddata
->rgbformat
) {
703 //kprintf("==== ocpybox: format mismatch %d %d drawmode %d\n", sdata->rgbformat, ddata->rgbformat, mode);
704 OOP_DoSuperMethod(cl
, o
, (OOP_Msg
)msg
);
717 if (!sdata
->invram
|| !ddata
->invram
)
719 /* Blit from VRAM to RAM or from RAM to VRAM */
722 kprintf("== VRAM <-> RAM blit bpp %d\n", sdata
->bytesperpixel
);
723 kprintf("%p to %p %d,%d -> %d,%d %d x %d modulo %d %d\n",
724 sdata
->VideoData
, ddata
->VideoData
,
725 msg
->srcX
, msg
->srcY
, msg
->destX
, msg
->destY
, msg
->width
, msg
->height
,
727 ddata
->bytesperline
);
730 if (mode
== vHidd_GC_DrawMode_Copy
)
732 switch(sdata
->bytesperpixel
)
735 HIDD_BM_CopyMemBox8(msg
->dest
,
745 ddata
->bytesperline
);
749 HIDD_BM_CopyMemBox16(msg
->dest
,
759 ddata
->bytesperline
);
763 HIDD_BM_CopyMemBox24(msg
->dest
,
773 ddata
->bytesperline
);
777 HIDD_BM_CopyMemBox32(msg
->dest
,
787 ddata
->bytesperline
);
790 } /* switch(data->bytesperpix) */
792 } /* if (mode == vHidd_GC_DrawMode_Copy) */
795 //if (mode == vHidd_GC_DrawMode_Clear) kprintf(" clear blit %d x %d done by superclass\n", msg->width, msg->height);
796 OOP_DoSuperMethod(cl
, o
, (OOP_Msg
)msg
);
798 } /* if (!sdata->invram || !ddata->invram) */
801 //if (mode == vHidd_GC_DrawMode_Clear) kprintf(" clear blit %d x %d done by me\n", msg->width, msg->height);
803 makerenderinfo(csd
, &risrc
, sdata
);
804 makerenderinfo(csd
, &ridst
, ddata
);
808 if (!BlitRectNoMaskComplete(csd
, &risrc
, &ridst
,
809 msg
->srcX
, msg
->srcY
, msg
->destX
, msg
->destY
,
810 msg
->width
, msg
->height
, modetable
[mode
], sdata
->rgbformat
))
812 //kprintf("== unhandled blit %d x %d drawmode %d. super must help\n", msg->width, msg->height, mode);
813 OOP_DoSuperMethod(cl
, o
, (OOP_Msg
)msg
);
824 BOOL
UAEGFXCl__Hidd_Gfx__CopyBoxMasked(OOP_Class
*cl
, OOP_Object
*o
, struct pHidd_Gfx_CopyBoxMasked
*msg
)
826 struct uaegfx_staticdata
*csd
= CSD(cl
);
832 return OOP_DoSuperMethod(cl
, o
, (OOP_Msg
)msg
);
835 BOOL
UAEGFXCl__Hidd_Gfx__SetCursorShape(OOP_Class
*cl
, OOP_Object
*shape
, struct pHidd_Gfx_SetCursorShape
*msg
)
837 struct uaegfx_staticdata
*csd
= CSD(cl
);
838 OOP_Object
*cm
= NULL
;
840 WORD x
, y
, hiressprite
, i
;
844 OOP_GetAttr(msg
->shape
, aHidd_BitMap_Width
, &width
);
845 OOP_GetAttr(msg
->shape
, aHidd_BitMap_Height
, &height
);
846 OOP_GetAttr(msg
->shape
, aHidd_BitMap_ColorMap
, (IPTR
*)&cm
);
851 for (i
= 0; i
< 3; i
++) {
853 HIDD_CM_GetColor(cm
, i
+ 1, &c
);
854 SetSpriteColor(csd
, i
, c
.red
, c
.green
, c
.blue
);
858 pb(csd
->boardinfo
+ PSSO_BoardInfo_MouseXOffset
, msg
->xoffset
);
859 pb(csd
->boardinfo
+ PSSO_BoardInfo_MouseYOffset
, msg
->yoffset
);
860 p
= (UWORD
*)gp(csd
->boardinfo
+ PSSO_BoardInfo_MouseImage
);
861 if (p
== NULL
|| width
!= csd
->sprite_width
|| height
!= csd
->sprite_height
) {
863 p
= AllocVec(4 + 4 + ((width
+ 15) & ~15) / 8 * height
* 2, MEMF_CLEAR
| MEMF_PUBLIC
);
864 pp(csd
->boardinfo
+ PSSO_BoardInfo_MouseImage
, p
);
871 csd
->sprite_width
= width
;
872 csd
->sprite_height
= height
;
875 flags
= gl(csd
->boardinfo
+ PSSO_BoardInfo_Flags
);
876 flags
&= ~(1 << BIB_HIRESSPRITE
);
879 flags
|= 1 << BIB_HIRESSPRITE
;
882 pl(csd
->boardinfo
+ PSSO_BoardInfo_Flags
, flags
);
884 pb(csd
->boardinfo
+ PSSO_BoardInfo_MouseWidth
, width
/ hiressprite
);
885 pb(csd
->boardinfo
+ PSSO_BoardInfo_MouseHeight
, height
);
887 p
+= 2 * hiressprite
;
888 for(y
= 0; y
< height
; y
++) {
889 UWORD pix1
= 0, pix2
= 0, xcnt
= 0;
890 for(x
= 0; x
< width
; x
++) {
891 UBYTE c
= HIDD_BM_GetPixel(msg
->shape
, x
, y
);
894 pix1
|= (c
& 1) ? 1 : 0;
895 pix2
|= (c
& 2) ? 1 : 0;
900 p
[width
/ 16 + x
/ 16] = pix2
;
903 p
+= (width
/ 16) * 2;
913 BOOL
UAEGFXCl__Hidd_Gfx__SetCursorPos(OOP_Class
*cl
, OOP_Object
*o
, struct pHidd_Gfx_SetCursorPos
*msg
)
915 struct uaegfx_staticdata
*csd
= CSD(cl
);
918 pw(csd
->boardinfo
+ PSSO_BoardInfo_MouseX
, msg
->x
+ (BYTE
)csd
->boardinfo
[PSSO_BoardInfo_MouseXOffset
]);
919 pw(csd
->boardinfo
+ PSSO_BoardInfo_MouseY
, msg
->y
+ (BYTE
)csd
->boardinfo
[PSSO_BoardInfo_MouseYOffset
]);
920 SetSpritePosition(csd
);
925 VOID
UAEGFXCl__Hidd_Gfx__SetCursorVisible(OOP_Class
*cl
, OOP_Object
*o
, struct pHidd_Gfx_SetCursorVisible
*msg
)
927 struct uaegfx_staticdata
*csd
= CSD(cl
);
930 SetSprite(csd
, msg
->visible
);
934 BOOL
UAEGFXCl__Hidd_Gfx__CheckMode(OOP_Class
*cl
, OOP_Object
*o
, struct pHidd_Gfx_CheckMode
*msg
)
936 struct uaegfx_staticdata
*csd
= CSD(cl
);
937 IPTR width
, height
, bpp
;
939 OOP_GetAttr(msg
->sync
, aHidd_Sync_HDisp
, &width
);
940 OOP_GetAttr(msg
->sync
, aHidd_Sync_VDisp
, &height
);
941 OOP_GetAttr(msg
->pixFmt
, aHidd_PixFmt_BytesPerPixel
, &bpp
);
942 if (width
> csd
->maxwidth
[bpp
])
944 if (height
> csd
->maxheight
[bpp
])
946 return width
* height
* bpp
< csd
->vram_size
;
950 static void freeattrbases(LIBBASETYPEPTR LIBBASE
, struct uaegfx_staticdata
*csd
)
952 OOP_ReleaseAttrBase(IID_Hidd_BitMap
);
953 OOP_ReleaseAttrBase(IID_Hidd_UAEGFXBitMap
);
954 OOP_ReleaseAttrBase(IID_Hidd_GC
);
955 OOP_ReleaseAttrBase(IID_Hidd_Sync
);
956 OOP_ReleaseAttrBase(IID_Hidd_Gfx
);
957 OOP_ReleaseAttrBase(IID_Hidd_PixFmt
);
958 OOP_ReleaseAttrBase(IID_Hidd_ColorMap
);
961 AROS_INTP(rtg_vblank
);
967 UWORD htotal
, vtotal
;
968 UWORD hborder
, vborder
;
974 static const struct P96RTGmode rtgmodes
[] =
976 { 320, 240, 1, 13020000, 408, 262, 0, 0, 32, 5, 24, 1, GMF_HPOLARITY
| GMF_VPOLARITY
| GMF_DOUBLESCAN
},
977 { 640, 480, 3, 25060000, 800, 525, 0, 0, 40, 11, 88, 2, GMF_HPOLARITY
| GMF_VPOLARITY
},
978 { 800, 600, 4, 32010000, 1024, 625, 0, 0, 56, 1, 40, 2, 0 },
979 { 1024, 768, 5, 64430000, 1336, 800, 0, 0, 48, 4, 112, 5, GMF_HPOLARITY
| GMF_VPOLARITY
},
980 { 1152, 900, 6, 85010000, 1496, 973, 0, 0, 48, 5, 40, 4, GMF_HPOLARITY
| GMF_VPOLARITY
},
981 { 1440, 900, 7, 106360000, 1904, 932, 0, 0, 80, 0, 0, 10, GMF_HPOLARITY
| GMF_VPOLARITY
},
985 static BOOL
PopulateModeInfo(struct uaegfx_staticdata
*csd
, struct LibResolution
*res
, const struct P96RTGmode
*mode
)
990 for (rgbformat
= 0; rgbformat
< RGBFB_MaxFormats
; rgbformat
++) {
994 UWORD maxhval
, maxvval
, maxhres
, maxvres
;
996 if (!((1 << rgbformat
) & RGBFB_SUPPORTMASK
))
998 if (!((1 << rgbformat
) & gw(csd
->boardinfo
+ PSSO_BoardInfo_RGBFormats
)))
1000 depth
= getrtgdepth(1 << rgbformat
);
1001 index
= (depth
+ 7) / 8;
1002 if (res
->Modes
[index
])
1005 maxhval
= gw(csd
->boardinfo
+ PSSO_BoardInfo_MaxHorValue
+ index
* 2);
1006 maxvval
= gw(csd
->boardinfo
+ PSSO_BoardInfo_MaxVerValue
+ index
* 2);
1007 maxhres
= gw(csd
->boardinfo
+ PSSO_BoardInfo_MaxHorResolution
+ index
* 2);
1008 maxvres
= gw(csd
->boardinfo
+ PSSO_BoardInfo_MaxVerResolution
+ index
* 2);
1010 if (mode
->htotal
> maxhval
|| mode
->vtotal
> maxvval
||
1011 mode
->w
> maxhres
|| mode
->h
> maxvres
)
1014 mi
= AllocMem(sizeof(struct ModeInfo
), MEMF_CLEAR
| MEMF_PUBLIC
);
1019 mi
->Width
= mode
->w
;
1020 mi
->Height
= mode
->h
;
1022 mi
->HorTotal
= mode
->htotal
;
1023 mi
->VerTotal
= mode
->vtotal
;
1024 mi
->HorBlankSize
= mode
->hborder
;
1025 mi
->VerBlankSize
= mode
->vborder
;
1026 mi
->HorSyncStart
= mode
->hpos
;
1027 mi
->VerSyncStart
= mode
->vpos
;
1028 mi
->HorSyncSize
= mode
->hsync
;
1029 mi
->VerSyncSize
= mode
->vsync
;
1030 mi
->Flags
= mode
->flags
;
1031 clockindex
= ResolvePixelClock(csd
, mi
, mode
->clock
, rgbformat
);
1032 mi
->PixelClock
= GetPixelClock(csd
, mi
, clockindex
, rgbformat
);
1033 DRTG(bug("%d,%p: %dx%dx%d ci=%d clk=%d (%d/%d)\n",
1034 index
, mi
, mi
->Width
, mi
->Height
, mi
->Depth
,
1035 clockindex
, mi
->PixelClock
, mi
->Numerator
, mi
->Denominator
));
1036 res
->Modes
[index
] = mi
;
1041 static void PopulateResolutionList(struct uaegfx_staticdata
*csd
)
1043 struct LibResolution
*node
;
1046 NEWLIST((csd
->boardinfo
+ PSSO_BoardInfo_ResolutionsList
));
1047 for (cnt
= 0; rtgmodes
[cnt
].clock
; cnt
++) {
1048 const struct P96RTGmode
*mode
= &rtgmodes
[cnt
];
1049 node
= AllocMem(sizeof(struct LibResolution
), MEMF_CLEAR
| MEMF_PUBLIC
);
1052 node
->Width
= mode
->w
;
1053 node
->Height
= mode
->h
;
1054 node
->DisplayID
= 0x50001000 | (mode
->id
<< 16);
1055 node
->BoardInfo
= csd
->boardinfo
;
1056 if (PopulateModeInfo(csd
, node
, mode
))
1057 AddTail((struct List
*)(csd
->boardinfo
+ PSSO_BoardInfo_ResolutionsList
), (struct Node
*)node
);
1059 FreeMem(node
, sizeof(struct LibResolution
));
1063 static int openall(struct uaegfx_staticdata
*csd
)
1065 if ((csd
->cs_UtilityBase
= TaggedOpenLibrary(TAGGEDOPEN_UTILITY
))) {
1066 if ((csd
->cs_IntuitionBase
= TaggedOpenLibrary(TAGGEDOPEN_INTUITION
))) {
1072 static void freeall(struct uaegfx_staticdata
*csd
)
1074 CloseLibrary(csd
->cs_IntuitionBase
);
1075 CloseLibrary(csd
->cs_UtilityBase
);
1076 FreeMem(csd
->vmem
, sizeof(struct MemHeader
));
1078 FreeVec(csd
->boardinfo
);
1079 csd
->boardinfo
= NULL
;
1082 static void P96DebugInfo(struct uaegfx_staticdata
*csd
)
1085 DRTG(bug("Name:'%s'\n",
1086 gl(csd
->boardinfo
+ PSSO_BoardInfo_BoardName
)));
1087 DRTG(bug("Reg:%08x IO:%08x\n",
1088 gl(csd
->boardinfo
+ PSSO_BoardInfo_RegisterBase
),
1089 gl(csd
->boardinfo
+ PSSO_BoardInfo_MemoryIOBase
)));
1090 DRTG(bug("BoardType:%d GCType:%d PCType:%d BPC:%d Flags:%08x\n",
1091 gl(csd
->boardinfo
+ PSSO_BoardInfo_BoardType
),
1092 gl(csd
->boardinfo
+ PSSO_BoardInfo_GraphicsControllerType
),
1093 gl(csd
->boardinfo
+ PSSO_BoardInfo_PaletteChipType
),
1094 gw(csd
->boardinfo
+ PSSO_BoardInfo_BitsPerCannon
),
1095 gl(csd
->boardinfo
+ PSSO_BoardInfo_Flags
)));
1096 for (i
= 0; i
< MAXMODES
; i
++) {
1097 DRTG(bug("%d: HV:%4d VV: %4d HR:%4d VR:%4d C:%d\n", i
,
1098 gw(csd
->boardinfo
+ PSSO_BoardInfo_MaxHorValue
+ i
* 2),
1099 gw(csd
->boardinfo
+ PSSO_BoardInfo_MaxVerValue
+ i
* 2),
1100 gw(csd
->boardinfo
+ PSSO_BoardInfo_MaxHorResolution
+ i
* 2),
1101 gw(csd
->boardinfo
+ PSSO_BoardInfo_MaxVerResolution
+ i
* 2),
1102 gl(csd
->boardinfo
+ PSSO_BoardInfo_PixelClockCount
+ i
* 4)));
1106 static BOOL
P96Init(struct uaegfx_staticdata
*csd
, struct Library
*lib
)
1108 DRTG(bug("P96GFX: attempting to init '%s'\n", lib
->lib_Node
.ln_Name
));
1109 pl(csd
->boardinfo
+ PSSO_BoardInfo_CardBase
, (ULONG
)lib
);
1110 csd
->CardBase
= lib
;
1111 InitRTG(csd
->boardinfo
);
1112 if (FindCard(csd
)) {
1113 DRTG(bug("P96GFX: FindCard succeeded\n"));
1114 if (InitCard(csd
)) {
1115 DRTG(bug("P96GFX: InitCard succeeded\n"));
1116 SetInterrupt(csd
, FALSE
);
1117 /* Without this card may not be in linear memory map mode. */
1118 SetMemoryMode(csd
, RGBFB_CLUT
);
1123 pl(csd
->boardinfo
+ PSSO_BoardInfo_CardBase
, 0);
1124 csd
->CardBase
= NULL
;
1129 BOOL
Init_UAEGFXClass(LIBBASETYPEPTR LIBBASE
)
1131 struct uaegfx_staticdata
*csd
= &LIBBASE
->csd
;
1132 struct MemChunk
*mc
;
1134 struct Interrupt
*intr
;
1137 if (!(SysBase
->AttnFlags
& AFF_68020
))
1140 D(bug("Init_UAEGFXClass\n"));
1141 if (!openall(csd
)) {
1146 csd
->boardinfo
= AllocVec(PSSO_BoardInfo_SizeOf
+ PSSO_BitMapExtra_Last
+ sizeof(struct ModeInfo
), MEMF_CLEAR
| MEMF_PUBLIC
);
1147 if (!csd
->boardinfo
) {
1151 NEWLIST((struct List
*)(csd
->boardinfo
+ PSSO_BoardInfo_ResolutionsList
));
1152 NEWLIST((struct List
*)(csd
->boardinfo
+ PSSO_BoardInfo_BitMapList
));
1153 NEWLIST((struct List
*)(csd
->boardinfo
+ PSSO_BoardInfo_MemList
));
1154 NEWLIST((struct List
*)(csd
->boardinfo
+ PSSO_BoardInfo_WaitQ
));
1155 csd
->bitmapextra
= csd
->boardinfo
+ PSSO_BoardInfo_SizeOf
;
1156 csd
->fakemodeinfo
= (struct ModeInfo
*)(csd
->boardinfo
+ PSSO_BoardInfo_SizeOf
+ PSSO_BitMapExtra_Last
);
1157 pl(csd
->boardinfo
+ PSSO_BoardInfo_BitMapExtra
, (ULONG
)csd
->bitmapextra
);
1158 pl(csd
->boardinfo
+ PSSO_BoardInfo_ExecBase
, (ULONG
)SysBase
);
1159 pl(csd
->boardinfo
+ PSSO_BoardInfo_UtilBase
, (ULONG
)csd
->cs_UtilityBase
);
1160 InitSemaphore((struct SignalSemaphore
*)(csd
->boardinfo
+ PSSO_BoardInfo_BoardLock
));
1161 intr
= (struct Interrupt
*)(csd
->boardinfo
+ PSSO_BoardInfo_HardInterrupt
);
1162 intr
->is_Code
= (APTR
)rtg_vblank
;
1163 intr
->is_Data
= csd
->boardinfo
;
1164 intr
->is_Node
.ln_Name
= "RTG VBlank";
1165 intr
->is_Node
.ln_Pri
= 0;
1166 intr
->is_Node
.ln_Type
= NT_INTERRUPT
;
1167 intr
= (struct Interrupt
*)(csd
->boardinfo
+ PSSO_BoardInfo_SoftInterrupt
);
1168 intr
->is_Code
= (APTR
)rtg_vblank
;
1169 intr
->is_Data
= csd
->boardinfo
;
1170 intr
->is_Node
.ln_Name
= "RTG VBlank";
1171 intr
->is_Node
.ln_Pri
= 0;
1172 intr
->is_Node
.ln_Type
= NT_INTERRUPT
;
1175 ForeachNode(&SysBase
->LibList
.lh_Head
, node
) {
1176 struct Library
*lib
= (struct Library
*)node
;
1177 char *name
= node
->ln_Name
;
1178 int len
= strlen(name
);
1179 if (len
> 5 && !stricmp(name
+ len
- 5, ".card")) {
1182 ret
= P96Init(csd
, lib
);
1186 DRTG(bug("P96GFX: init failed\n"));
1191 if (!csd
->CardBase
) {
1192 csd
->uaeromvector
= (APTR
)(0xf00000 + 0xff60);
1193 if ((gl(csd
->uaeromvector
) & 0xff00ffff) != 0xa0004e75) {
1194 D(bug("UAE boot ROM entry point not found. UAEGFX not enabled.\n"));
1198 if (!FindCard(csd
)) {
1199 D(bug("UAEGFX: FindCard() returned false\n"));
1203 D(bug("UAEGFX: FindCard done\n"));
1205 csd
->hardwaresprite
= (gl(csd
->boardinfo
+ PSSO_BoardInfo_Flags
) & (1 << BIB_HARDWARESPRITE
)) && SetSprite(csd
, FALSE
);
1207 PopulateResolutionList(csd
);
1208 csd
->hardwaresprite
= gl(csd
->boardinfo
+ PSSO_BoardInfo_Flags
) & (1 << BIB_HARDWARESPRITE
);
1211 if (IsListEmpty((struct List
*)(csd
->boardinfo
+ PSSO_BoardInfo_ResolutionsList
))) {
1212 D(bug("Resolutionlist is empty, init failed.\n"));
1216 for (i
= 0; i
< MAXMODES
; i
++) {
1217 csd
->maxwidth
[i
] = gw(csd
->boardinfo
+ PSSO_BoardInfo_MaxHorResolution
+ i
* 2);
1218 csd
->maxheight
[i
] = gw(csd
->boardinfo
+ PSSO_BoardInfo_MaxVerResolution
+ i
* 2);
1221 D(bug("InitCard done\n"));
1223 DRTG(bug("hardware sprite: %d\n", csd
->hardwaresprite
));
1225 csd
->vram_start
= (UBYTE
*)gl(csd
->boardinfo
+ PSSO_BoardInfo_MemoryBase
);
1229 csd
->vram_size
= gl(csd
->boardinfo
+ PSSO_BoardInfo_MemorySize
);
1231 /* REMOVEME: 4MB hack (used for easier debug of vram <-> ram swapping) !!!!*/
1232 csd
->vram_size
= 4 * 1024 * 1024; /* gl(csd->boardinfo + PSSO_BoardInfo_MemorySize); */
1233 /* REMOVEME: 4MB Hack (used for easier debug of vram <-> ram swapping) !!!!*/
1236 DRTG(bug("P96RTG VRAM found at %08x size %08x\n", csd
->vram_start
, csd
->vram_size
));
1237 mc
= (struct MemChunk
*)csd
->vram_start
;
1238 csd
->vmem
= AllocVec(sizeof(struct MemHeader
), MEMF_CLEAR
| MEMF_PUBLIC
);
1239 csd
->vmem
->mh_Node
.ln_Type
= NT_MEMORY
;
1240 csd
->vmem
->mh_First
= mc
;
1241 csd
->vmem
->mh_Lower
= (APTR
)mc
;
1242 csd
->vmem
->mh_Upper
= (APTR
)((ULONG
)mc
+ csd
->vram_size
);
1243 csd
->vmem
->mh_Free
= csd
->vram_size
;
1245 mc
->mc_Bytes
= csd
->vmem
->mh_Free
;
1247 __IHidd_BitMap
= OOP_ObtainAttrBase(IID_Hidd_BitMap
);
1248 __IHidd_UAEGFXBitmap
= OOP_ObtainAttrBase(IID_Hidd_UAEGFXBitMap
);
1249 __IHidd_GC
= OOP_ObtainAttrBase(IID_Hidd_GC
);
1250 __IHidd_Sync
= OOP_ObtainAttrBase(IID_Hidd_Sync
);
1251 __IHidd_Gfx
= OOP_ObtainAttrBase(IID_Hidd_Gfx
);
1252 __IHidd_PixFmt
= OOP_ObtainAttrBase(IID_Hidd_PixFmt
);
1253 __IHidd_ColorMap
= OOP_ObtainAttrBase(IID_Hidd_ColorMap
);
1255 HiddBitMapBase
= OOP_GetMethodID(IID_Hidd_BitMap
, 0);
1256 HiddColorMapBase
= OOP_GetMethodID(IID_Hidd_ColorMap
, 0);
1257 HiddGfxBase
= OOP_GetMethodID(IID_Hidd_Gfx
, 0);
1259 if (!__IHidd_BitMap
|| !__IHidd_UAEGFXBitmap
|| !__IHidd_GC
||
1260 !__IHidd_Sync
|| !__IHidd_Gfx
|| !__IHidd_PixFmt
|| !__IHidd_ColorMap
)
1262 D(bug("Init_UAEGFXClass fail\n"));
1263 freeattrbases(LIBBASE
, csd
);
1268 DRTG(bug("P96RTG done\n"));
1272 static int Expunge_UAEGFXClass(LIBBASETYPEPTR LIBBASE
)
1274 struct uaegfx_staticdata
*csd
= &LIBBASE
->csd
;
1275 D(bug("Expunge_UAEGFXClass\n"));
1276 freeattrbases(LIBBASE
, csd
);
1281 ADD2EXPUNGELIB(Expunge_UAEGFXClass
, 1)
1285 AROS_INTH1(rtg_vblank
, APTR
, boardinfo
)