2 Copyright © 2011-2017, The AROS Development Team. All rights reserved.
8 #include <aros/debug.h>
9 #include <aros/libcall.h>
10 #include <aros/asmcall.h>
11 #include <aros/symbolsets.h>
12 #include <utility/tagitem.h>
14 #include <proto/oop.h>
15 #include <proto/exec.h>
16 #include <proto/utility.h>
18 #include <hidd/gallium.h>
19 #include <proto/graphics.h>
21 #include "intelgma_hidd.h"
22 #include "intelgma_winsys.h"
23 #include "intelgma_gallium.h"
24 #include "intelG45_regs.h"
26 #include "i915/i915_public.h"
27 #include "i915/i915_resource.h"
28 #include "util/u_memory.h"
29 #include "util/u_atomic.h"
30 #include "util/u_inlines.h"
31 #include "i915/i915_winsys.h"
32 #include "i915/i915_debug.h"
34 const struct OOP_InterfaceDescr Gallium_ifdescr
[];
35 extern OOP_AttrBase MetaAttrBase
;
36 OOP_AttrBase HiddGalliumAttrBase
;
39 extern ULONG allocated_mem
;
40 extern struct g45staticdata sd
;
41 #define sd ((struct g45staticdata*)&(sd))
45 struct HIDDT_WinSys base
;
46 struct pipe_screen
*pscreen
;
49 static INLINE
struct Hidd915WinSys
*
50 Hidd915WinSys(struct pipe_winsys
*ws
)
52 return (struct Hidd915WinSys
*)ws
;
56 HIDD915DestroyWinSys(struct pipe_winsys
*ws
)
58 struct Hidd915WinSys
*hiddws
= Hidd915WinSys(ws
);
63 HIDD915FlushFrontBuffer( struct pipe_screen
*screen
,
64 struct pipe_resource
*resource
,
65 unsigned level
, unsigned layer
,
66 void *winsys_drawable_handle
)
71 BOOL
InitGalliumClass()
74 || sd
->ProductID
== 0x2582 // GMA 900
75 || sd
->ProductID
== 0x2782
76 || sd
->ProductID
== 0x2592
77 || sd
->ProductID
== 0x2792
78 || sd
->ProductID
== 0x2772 // GMA 950
79 || sd
->ProductID
== 0x2776
80 || sd
->ProductID
== 0x27A2
81 || sd
->ProductID
== 0x27A6
82 || sd
->ProductID
== 0x27AE
83 || sd
->ProductID
== 0x2972 // GMA 3000
84 || sd
->ProductID
== 0x2973
85 || sd
->ProductID
== 0x2992
86 || sd
->ProductID
== 0x2993
88 CloseLibrary( OpenLibrary("gallium.library",0)); // ???
90 if((HiddGalliumAttrBase
= OOP_ObtainAttrBase(IID_Hidd_Gallium
)))
92 struct TagItem Gallium_tags
[] =
94 {aMeta_SuperID
, (IPTR
)CLID_Hidd_Gallium
},
95 {aMeta_InterfaceDescr
, (IPTR
)Gallium_ifdescr
},
96 {aMeta_InstSize
, sizeof(struct HIDDGalliumData
)},
97 {aMeta_ID
, (IPTR
)CLID_Hidd_Gallium_IntelGMA
},
101 sd
->basegallium
= OOP_FindClass(CLID_Hidd_Gallium
);
103 sd
->galliumclass
= OOP_NewObject(NULL
, CLID_HiddMeta
, Gallium_tags
);
104 if (sd
->galliumclass
)
106 sd
->galliumclass
->UserData
= sd
;
107 OOP_AddClass(sd
->galliumclass
);
108 i915MemPool
= CreatePool(MEMF_PUBLIC
| MEMF_CLEAR
| MEMF_SEM_PROTECTED
, 32 * 1024, 16 * 1024);
111 bug("i915 gallium init OK\n");
115 OOP_ReleaseAttrBase(IID_Hidd_Gallium
);
124 OOP_Object
*METHOD(i915Gallium
, Root
, New
)
128 D(bug("[i915gallium] New\n"));
130 interfaceVers
= GetTagData(aHidd_Gallium_InterfaceVersion
, -1, msg
->attrList
);
131 if (interfaceVers
!= GALLIUM_INTERFACE_VERSION
)
134 o
= (OOP_Object
*)OOP_DoSuperMethod(cl
, o
, (OOP_Msg
) msg
);
144 VOID
METHOD(i915Gallium
, Root
, Get
)
147 D(bug("[i915gallium] get\n"));
148 if (IS_GALLIUM_ATTR(msg
->attrID
, idx
))
152 /* Overload the property */
153 case aoHidd_Gallium_InterfaceVersion
:
154 *msg
->storage
= GALLIUM_INTERFACE_VERSION
;
159 /* Use parent class for all other properties */
160 OOP_DoSuperMethod(cl
, o
, (OOP_Msg
)msg
);
163 APTR
METHOD(i915Gallium
, Hidd_Gallium
, CreatePipeScreen
)
166 bug("[i915gallium] CreatePipeScreen currently allocated_mem %d\n",allocated_mem
);
168 struct Hidd915WinSys
*hiddws
;
169 struct aros_winsys
*aws
;
170 struct pipe_winsys
*ws
;
172 aws
= winsys_create();
178 hiddws
= CALLOC_STRUCT(Hidd915WinSys
);
183 ws
= &hiddws
->base
.base
;
184 ws
->destroy
= HIDD915DestroyWinSys
;
186 hiddws
->pscreen
= i915_screen_create( &aws
->base
);
187 if (!hiddws
->pscreen
) {
192 hiddws
->pscreen
->flush_frontbuffer
= HIDD915FlushFrontBuffer
;
193 hiddws
->pscreen
->winsys
= (struct pipe_winsys
*)hiddws
;
194 /* Preserve pointer to HIDD driver */
195 hiddws
->base
.driver
= o
;
197 return hiddws
->pscreen
;
201 VOID
METHOD(i915Gallium
, Hidd_Gallium
, DisplayResource
)
203 // bug("[i915gallium] DisplayResource\n");
205 #ifndef GALLIUM_SIMULATION
206 OOP_Object
*bm
= HIDD_BM_OBJ(msg
->bitmap
);
209 // if (!((IPTR)bm == (IPTR)sd.BMClass) ) return; // Check if bitmap is really intelGFX bitmap
211 bm_dst
= OOP_INST_DATA(OOP_OCLASS(bm
), bm
);
212 struct i915_texture
*tex
= i915_texture(msg
->resource
);
214 IF_BAD_MAGIC(tex
->buffer
) return;
216 LOCK_BITMAP_BM(bm_dst
)
218 uint32_t br00
, br13
, br22
, br23
, br09
, br11
, br26
, br12
;
221 br00
= (2 << 29) | (0x53 << 22) | (6);
222 if (bm_dst
->bpp
== 4)
225 br13
= bm_dst
->pitch
| ROP_table
[mode
].rop
;
226 if (bm_dst
->bpp
== 4)
228 else if (bm_dst
->bpp
== 2)
231 br22
= msg
->dstx
| (msg
->dsty
<< 16);
232 br23
= (msg
->dstx
+ msg
->width
) | (msg
->dsty
+ msg
->height
) << 16;
233 br09
= bm_dst
->framebuffer
;
236 br26
= msg
->srcx
| (msg
->srcy
<< 16);
237 br12
= (IPTR
)tex
->buffer
->map
- (IPTR
)sd
->Card
.Framebuffer
;
239 while(buffer_is_busy(0,tex
->buffer
)){};
254 UNLOCK_BITMAP_BM(bm_dst
)
256 destroy_unused_buffers();
260 static const struct OOP_MethodDescr Gallium_Root_descr
[] =
262 {(OOP_MethodFunc
)i915Gallium__Root__New
, moRoot_New
},
263 {(OOP_MethodFunc
)i915Gallium__Root__Get
, moRoot_Get
},
267 static const struct OOP_MethodDescr Gallium_Hidd_Gallium_descr
[] =
269 {(OOP_MethodFunc
)i915Gallium__Hidd_Gallium__CreatePipeScreen
, moHidd_Gallium_CreatePipeScreen
},
270 {(OOP_MethodFunc
)i915Gallium__Hidd_Gallium__DisplayResource
, moHidd_Gallium_DisplayResource
},
274 const struct OOP_InterfaceDescr Gallium_ifdescr
[] =
276 {(struct OOP_MethodDescr
*)Gallium_Root_descr
, IID_Root
, 2},
277 {(struct OOP_MethodDescr
*)Gallium_Hidd_Gallium_descr
, IID_Hidd_Gallium
, 2},