2 Copyright 2015-2019, The AROS Development Team. All rights reserved.
6 #include <aros/debug.h>
8 #include <proto/exec.h>
9 #include <proto/graphics.h>
10 #include <proto/utility.h>
11 #include <proto/oop.h>
13 #include <aros/libcall.h>
14 #include <aros/asmcall.h>
15 #include <aros/symbolsets.h>
16 #include <utility/tagitem.h>
18 #include <hidd/gallium.h>
19 #include <gallium/gallium.h>
21 #include "vmwaresvga_intern.h"
23 #include "util/u_memory.h"
24 #include "pipebuffer/pb_buffer.h"
26 struct VMWareSVGAPBBuf
28 struct pb_buffer pbbuf
;
32 #if (AROS_BIG_ENDIAN == 1)
33 #define AROS_PIXFMT RECTFMT_RAW /* Big Endian Archs. */
35 #define AROS_PIXFMT RECTFMT_BGRA32 /* Little Endian Archs. */
39 // ****************************************************************************
40 // winsys/support functions
41 // ****************************************************************************
43 static SVGA3dHardwareVersion
VMWareSVGA_GetHWVersion(struct svga_winsys_screen
*sws
)
45 D(bug("[VMWareSVGA:Gallium] %s()\n", __func__
));
48 if (sws
->have_gb_objects
)
51 D(bug("[VMWareSVGA:Gallium] %s: returning SVGA3D_HWVERSION_WS8_B1\n", __func__
));
52 return SVGA3D_HWVERSION_WS8_B1
;
55 return (SVGA3dHardwareVersion
) vws
->ioctl
.hwversion
;
61 static boolean
VMWareSVGA_GetCap(struct svga_winsys_screen
*sws
,
62 SVGA3dDevCapIndex index
,
63 SVGA3dDevCapResult
*result
)
65 D(bug("[VMWareSVGA:Gallium] %s()\n", __func__
));
68 if (index
> vws
->ioctl
.num_cap_3d
||
69 index
>= SVGA3D_DEVCAP_MAX
||
70 !vws
->ioctl
.cap_3d
[index
].has_cap
)
74 *result
= vws
->ioctl
.cap_3d
[index
].result
;
79 static struct svga_winsys_context
*VMWareSVGA_ContextCreate(struct svga_winsys_screen
*sws
)
81 struct svga_winsys_context
*wsctx
;
83 D(bug("[VMWareSVGA:Gallium] %s(0x%p)\n", __func__
, sws
));
85 wsctx
= CALLOC_STRUCT(svga_winsys_context
);
87 D(bug("[VMWareSVGA:Gallium] %s: svga_winsys_context @ 0x%p\n", __func__
, wsctx
));
92 static struct svga_winsys_surface
*VMWareSVGA_SurfaceCreate(
93 struct svga_winsys_screen
*sws
,
94 SVGA3dSurfaceAllFlags flags
,
95 SVGA3dSurfaceFormat format
,
100 unsigned sampleCount
)
102 struct svga_winsys_surface
*surf
= NULL
;
104 D(bug("[VMWareSVGA:Gallium] %s()\n", __func__
));
107 surf
= CALLOC_STRUCT(svga_winsys_surface
);
113 static struct svga_winsys_surface
*VMWareSVGA_SurfaceFromHandle(struct svga_winsys_screen
*sws
,
114 struct winsys_handle
*whandle
,
115 SVGA3dSurfaceFormat
*format
)
117 D(bug("[VMWareSVGA:Gallium] %s()\n", __func__
));
122 static boolean
VMWareSVGA_SurfaceGetHandle(struct svga_winsys_screen
*sws
,
123 struct svga_winsys_surface
*surface
,
125 struct winsys_handle
*whandle
)
127 D(bug("[VMWareSVGA:Gallium] %s()\n", __func__
));
132 static boolean
VMWareSVGA_SurfaceIsFlushed(struct svga_winsys_screen
*sws
,
133 struct svga_winsys_surface
*surface
)
135 D(bug("[VMWareSVGA:Gallium] %s()\n", __func__
));
140 static void VMWareSVGA_SurfaceReference(struct svga_winsys_screen
*sws
,
141 struct svga_winsys_surface
**pdst
,
142 struct svga_winsys_surface
*src
)
144 D(bug("[VMWareSVGA:Gallium] %s()\n", __func__
));
147 static boolean
VMWareSVGA_SurfaceCanCreate(struct svga_winsys_screen
*sws
,
148 SVGA3dSurfaceFormat format
,
154 D(bug("[VMWareSVGA:Gallium] %s()\n", __func__
));
159 static struct svga_winsys_buffer
*VMWareSVGA_BufferCreate( struct svga_winsys_screen
*sws
,
164 struct VMWareSVGAPBBuf
*buf
;
166 D(bug("[VMWareSVGA:Gallium] %s()\n", __func__
));
168 buf
= CALLOC_STRUCT(VMWareSVGAPBBuf
);
170 return (struct svga_winsys_buffer
*)buf
;
173 static void *VMWareSVGA_BufferMap( struct svga_winsys_screen
*sws
,
174 struct svga_winsys_buffer
*buf
,
177 D(bug("[VMWareSVGA:Gallium] %s()\n", __func__
));
178 return ((struct VMWareSVGAPBBuf
*)(buf
))->map
;
181 static void VMWareSVGA_BufferUnMap( struct svga_winsys_screen
*sws
,
182 struct svga_winsys_buffer
*buf
)
184 D(bug("[VMWareSVGA:Gallium] %s()\n", __func__
));
187 static void VMWareSVGA_BufferDestroy( struct svga_winsys_screen
*sws
,
188 struct svga_winsys_buffer
*buf
)
190 D(bug("[VMWareSVGA:Gallium] %s()\n", __func__
));
194 static void VMWareSVGA_FenceReference( struct svga_winsys_screen
*sws
,
195 struct pipe_fence_handle
**pdst
,
196 struct pipe_fence_handle
*src
)
198 D(bug("[VMWareSVGA:Gallium] %s()\n", __func__
));
201 static int VMWareSVGA_FenceSignalled( struct svga_winsys_screen
*sws
,
202 struct pipe_fence_handle
*fence
,
205 D(bug("[VMWareSVGA:Gallium] %s()\n", __func__
));
210 static int VMWareSVGA_FenceFinish( struct svga_winsys_screen
*sws
,
211 struct pipe_fence_handle
*fence
,
215 D(bug("[VMWareSVGA:Gallium] %s()\n", __func__
));
220 static struct svga_winsys_gb_shader
*VMWareSVGA_ShaderCreate(struct svga_winsys_screen
*sws
,
221 SVGA3dShaderType shaderType
,
222 const uint32
*bytecode
,
225 struct svga_winsys_gb_shader
*shader
= NULL
;
227 D(bug("[VMWareSVGA:Gallium] %s()\n", __func__
));
232 static void VMWareSVGA_ShaderDestroy(struct svga_winsys_screen
*sws
,
233 struct svga_winsys_gb_shader
*shader
)
235 D(bug("[VMWareSVGA:Gallium] %s()\n", __func__
));
238 static struct svga_winsys_gb_query
*VMWareSVGA_QueryCreate(struct svga_winsys_screen
*sws
, uint32 len
)
240 struct svga_winsys_gb_query
*query
= NULL
;
242 D(bug("[VMWareSVGA:Gallium] %s()\n", __func__
));
247 static void VMWareSVGA_QueryDestroy(struct svga_winsys_screen
*sws
,
248 struct svga_winsys_gb_query
*query
)
250 D(bug("[VMWareSVGA:Gallium] %s()\n", __func__
));
253 static int VMWareSVGA_QueryInit(struct svga_winsys_screen
*sws
,
254 struct svga_winsys_gb_query
*query
,
256 SVGA3dQueryState queryState
)
258 D(bug("[VMWareSVGA:Gallium] %s()\n", __func__
));
263 static void VMWareSVGA_QueryGetResult(struct svga_winsys_screen
*sws
,
264 struct svga_winsys_gb_query
*query
,
266 SVGA3dQueryState
*queryState
,
267 void *result
, uint32 resultLen
)
269 D(bug("[VMWareSVGA:Gallium] %s()\n", __func__
));
274 static void VMWareSVGA_StatsInc(enum svga_stats_count index
)
276 D(bug("[VMWareSVGA:Gallium] %s()\n", __func__
));
279 static void VMWareSVGA_StatsTimePush(enum svga_stats_time index
,
280 struct svga_winsys_stats_timeframe
*tf
)
282 D(bug("[VMWareSVGA:Gallium] %s()\n", __func__
));
285 static void VMWareSVGA_StatsTimePop()
287 D(bug("[VMWareSVGA:Gallium] %s()\n", __func__
));
291 // ****************************************************************************
292 // Gallium Hidd Methods
293 // ****************************************************************************
295 OOP_Object
*METHOD(GalliumVMWareSVGA
, Root
, New
)
299 D(bug("[VMWareSVGA:Gallium] %s()\n", __func__
));
301 interfaceVers
= GetTagData(aHidd_Gallium_InterfaceVersion
, -1, msg
->attrList
);
302 if (interfaceVers
!= GALLIUM_INTERFACE_VERSION
)
305 o
= (OOP_Object
*)OOP_DoSuperMethod(cl
, o
, (OOP_Msg
) msg
);
308 struct HIDDGalliumVMWareSVGAData
* data
= OOP_INST_DATA(cl
, o
);
310 data
->wsi
.destroy
= NULL
;
311 data
->wsi
.get_hw_version
= VMWareSVGA_GetHWVersion
;
312 data
->wsi
.get_cap
= VMWareSVGA_GetCap
;
314 data
->wsi
.context_create
= VMWareSVGA_ContextCreate
;
316 data
->wsi
.surface_create
= VMWareSVGA_SurfaceCreate
;
317 data
->wsi
.surface_is_flushed
= VMWareSVGA_SurfaceIsFlushed
;
318 data
->wsi
.surface_reference
= VMWareSVGA_SurfaceReference
;
319 data
->wsi
.surface_from_handle
= VMWareSVGA_SurfaceFromHandle
;
320 data
->wsi
.surface_get_handle
= VMWareSVGA_SurfaceGetHandle
;
321 data
->wsi
.surface_can_create
= VMWareSVGA_SurfaceCanCreate
;
323 data
->wsi
.buffer_create
= VMWareSVGA_BufferCreate
;
324 data
->wsi
.buffer_map
= VMWareSVGA_BufferMap
;
325 data
->wsi
.buffer_unmap
= VMWareSVGA_BufferUnMap
;
326 data
->wsi
.buffer_destroy
= VMWareSVGA_BufferDestroy
;
328 data
->wsi
.fence_reference
= VMWareSVGA_FenceReference
;
329 data
->wsi
.fence_signalled
= VMWareSVGA_FenceSignalled
;
330 data
->wsi
.fence_finish
= VMWareSVGA_FenceFinish
;
332 data
->wsi
.fence_get_fd
= vmw_svga_winsys_fence_get_fd
;
333 data
->wsi
.fence_create_fd
= vmw_svga_winsys_fence_create_fd
;
334 data
->wsi
.fence_server_sync
= vmw_svga_winsys_fence_server_sync
;
337 data
->wsi
.shader_create
= VMWareSVGA_ShaderCreate
;
338 data
->wsi
.shader_destroy
= VMWareSVGA_ShaderDestroy
;
340 data
->wsi
.query_create
= VMWareSVGA_QueryCreate
;
341 data
->wsi
.query_destroy
= VMWareSVGA_QueryDestroy
;
342 data
->wsi
.query_init
= VMWareSVGA_QueryInit
;
343 data
->wsi
.query_get_result
= VMWareSVGA_QueryGetResult
;
345 data
->wsi
.stats_inc
= VMWareSVGA_StatsInc
;
346 data
->wsi
.stats_time_push
= VMWareSVGA_StatsTimePush
;
347 data
->wsi
.stats_time_pop
= VMWareSVGA_StatsTimePop
;
353 VOID
METHOD(GalliumVMWareSVGA
, Root
, Dispose
)
355 D(bug("[VMWareSVGA:Gallium] %s()\n", __func__
));
357 OOP_DoSuperMethod(cl
, o
, (OOP_Msg
)msg
);
360 VOID
METHOD(GalliumVMWareSVGA
, Root
, Get
)
364 if (IS_GALLIUM_ATTR(msg
->attrID
, idx
))
368 /* Overload the property */
369 case aoHidd_Gallium_InterfaceVersion
:
370 *msg
->storage
= GALLIUM_INTERFACE_VERSION
;
375 /* Use parent class for all other properties */
376 OOP_DoSuperMethod(cl
, o
, (OOP_Msg
)msg
);
379 APTR
METHOD(GalliumVMWareSVGA
, Hidd_Gallium
, CreatePipeScreen
)
381 struct HIDDGalliumVMWareSVGAData
* data
= OOP_INST_DATA(cl
, o
);
382 struct pipe_screen
*screen
= NULL
;
384 D(bug("[VMWareSVGA:Gallium] %s()\n", __func__
));
386 screen
= svga_screen_create(&data
->wsi
);
388 D(bug("[VMWareSVGA:Gallium] %s: screen @ 0x%p\n", __func__
, screen
));
394 VOID
METHOD(GalliumVMWareSVGA
, Hidd_Gallium
, DisplayResource
)
396 D(bug("[VMWareSVGA:Gallium] %s()\n", __func__
));