1 /**************************************************************************
3 * Copyright 2007 Tungsten Graphics, Inc., Bismarck, ND., USA
6 * Permission is hereby granted, free of charge, to any person obtaining a
7 * copy of this software and associated documentation files (the
8 * "Software"), to deal in the Software without restriction, including
9 * without limitation the rights to use, copy, modify, merge, publish,
10 * distribute, sub license, and/or sell copies of the Software, and to
11 * permit persons to whom the Software is furnished to do so, subject to
12 * the following conditions:
14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
17 * THE COPYRIGHT HOLDERS, AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM,
18 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
19 * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
20 * USE OR OTHER DEALINGS IN THE SOFTWARE.
22 * The above copyright notice and this permission notice (including the
23 * next paragraph) shall be included in all copies or substantial portions
27 **************************************************************************/
36 #include "util/u_memory.h"
37 #include "util/u_math.h"
38 #include "pipe/p_error.h"
39 #include "pipe/p_context.h"
41 #include "xm_winsys.h"
43 #include "i965/brw_winsys.h"
44 #include "i965/brw_screen.h"
45 #include "i965/brw_reg.h"
47 #define MAX_VRAM (128*1024*1024)
49 struct xlib_brw_buffer
51 struct brw_winsys_buffer base
;
55 unsigned cheesy_refcount
;
61 * Subclass of brw_winsys_screen for Xlib winsys
63 struct xlib_brw_winsys
65 struct brw_winsys_screen base
;
69 static struct xlib_brw_winsys
*
70 xlib_brw_winsys( struct brw_winsys_screen
*screen
)
72 return (struct xlib_brw_winsys
*)screen
;
76 static struct xlib_brw_buffer
*
77 xlib_brw_buffer( struct brw_winsys_buffer
*buffer
)
79 return (struct xlib_brw_buffer
*)buffer
;
84 const char *names
[BRW_BUFFER_TYPE_MAX
] = {
98 const char *usages
[BRW_USAGE_MAX
] = {
110 static struct brw_winsys_buffer
*
111 xlib_brw_bo_alloc( struct brw_winsys_screen
*sws
,
112 enum brw_buffer_type type
,
116 struct xlib_brw_winsys
*xbw
= xlib_brw_winsys(sws
);
117 struct xlib_brw_buffer
*buf
;
119 debug_printf("%s type %d sz %d align %d\n",
120 __FUNCTION__
, type
, size
, alignment
);
122 buf
= CALLOC_STRUCT(xlib_brw_buffer
);
126 buf
->offset
= align(xbw
->offset
, alignment
);
128 buf
->virtual = MALLOC(size
);
129 buf
->cheesy_refcount
= 1;
130 buf
->base
.offset
= &buf
->offset
; /* hmm, cheesy */
131 buf
->base
.size
= size
;
133 xbw
->offset
= align(xbw
->offset
, alignment
) + size
;
134 if (xbw
->offset
> MAX_VRAM
)
146 xlib_brw_bo_reference( struct brw_winsys_buffer
*buffer
)
148 struct xlib_brw_buffer
*buf
= xlib_brw_buffer(buffer
);
150 buf
->cheesy_refcount
++;
154 xlib_brw_bo_unreference( struct brw_winsys_buffer
*buffer
)
156 struct xlib_brw_buffer
*buf
= xlib_brw_buffer(buffer
);
158 /* As a special favor in this call only, buffer is allowed to be
164 if (--buf
->cheesy_refcount
== 0) {
170 xlib_brw_bo_emit_reloc( struct brw_winsys_buffer
*buffer
,
171 enum brw_buffer_usage usage
,
174 struct brw_winsys_buffer
*buffer2
)
176 struct xlib_brw_buffer
*buf
= xlib_brw_buffer(buffer
);
177 struct xlib_brw_buffer
*buf2
= xlib_brw_buffer(buffer2
);
179 debug_printf("%s buf %p offset %x val %x + %x buf2 %p/%s/%s\n",
180 __FUNCTION__
, (void *)buffer
, offset
,
182 (void *)buffer2
, names
[buf2
->type
], usages
[usage
]);
184 *(uint32_t *)(buf
->virtual + offset
) = buf2
->offset
+ delta
;
190 xlib_brw_bo_exec( struct brw_winsys_buffer
*buffer
,
191 unsigned bytes_used
)
193 debug_printf("execute buffer %p, bytes %d\n", (void *)buffer
, bytes_used
);
199 xlib_brw_bo_subdata(struct brw_winsys_buffer
*buffer
,
204 struct xlib_brw_buffer
*buf
= xlib_brw_buffer(buffer
);
206 debug_printf("%s buf %p off %d sz %d data %p\n",
208 (void *)buffer
, offset
, size
, data
);
210 memcpy(buf
->virtual + offset
, data
, size
);
216 xlib_brw_bo_is_busy(struct brw_winsys_buffer
*buffer
)
218 debug_printf("%s %p\n", __FUNCTION__
, (void *)buffer
);
223 xlib_brw_bo_references(struct brw_winsys_buffer
*a
,
224 struct brw_winsys_buffer
*b
)
226 debug_printf("%s %p %p\n", __FUNCTION__
, (void *)a
, (void *)b
);
230 static enum pipe_error
231 xlib_brw_check_aperture_space( struct brw_winsys_screen
*iws
,
232 struct brw_winsys_buffer
**buffers
,
235 unsigned tot_size
= 0;
238 for (i
= 0; i
< count
; i
++)
239 tot_size
+= buffers
[i
]->size
;
241 debug_printf("%s %d bufs, tot_size: %d kb\n",
243 (tot_size
+ 1023) / 1024);
249 xlib_brw_bo_map(struct brw_winsys_buffer
*buffer
,
252 struct xlib_brw_buffer
*buf
= xlib_brw_buffer(buffer
);
254 debug_printf("%s %p %s\n", __FUNCTION__
, (void *)buffer
,
255 write
? "read/write" : "read");
262 xlib_brw_bo_unmap(struct brw_winsys_buffer
*buffer
)
264 struct xlib_brw_buffer
*buf
= xlib_brw_buffer(buffer
);
266 debug_printf("%s %p\n", __FUNCTION__
, (void *)buffer
);
269 assert(buf
->map_count
>= 0);
274 xlib_brw_winsys_destroy( struct brw_winsys_screen
*screen
)
276 /* XXX: free all buffers */
280 static struct brw_winsys_screen
*
281 xlib_create_brw_winsys_screen( void )
283 struct xlib_brw_winsys
*ws
;
285 ws
= CALLOC_STRUCT(xlib_brw_winsys
);
289 ws
->base
.destroy
= xlib_brw_winsys_destroy
;
290 ws
->base
.bo_alloc
= xlib_brw_bo_alloc
;
291 ws
->base
.bo_reference
= xlib_brw_bo_reference
;
292 ws
->base
.bo_unreference
= xlib_brw_bo_unreference
;
293 ws
->base
.bo_emit_reloc
= xlib_brw_bo_emit_reloc
;
294 ws
->base
.bo_exec
= xlib_brw_bo_exec
;
295 ws
->base
.bo_subdata
= xlib_brw_bo_subdata
;
296 ws
->base
.bo_is_busy
= xlib_brw_bo_is_busy
;
297 ws
->base
.bo_references
= xlib_brw_bo_references
;
298 ws
->base
.check_aperture_space
= xlib_brw_check_aperture_space
;
299 ws
->base
.bo_map
= xlib_brw_bo_map
;
300 ws
->base
.bo_unmap
= xlib_brw_bo_unmap
;
306 /***********************************************************************
307 * Implementation of Xlib co-state-tracker's winsys interface
311 xlib_i965_display_surface(struct xmesa_buffer
*xm_buffer
,
312 struct pipe_surface
*surf
)
314 /* struct brw_texture *texture = brw_texture(surf->texture); */
316 debug_printf("%s tex %p, sz %dx%d\n", __FUNCTION__
,
317 (void *)surf
->texture
,
318 surf
->texture
->width
[0],
319 surf
->texture
->height
[0]);
323 xlib_i965_flush_frontbuffer(struct pipe_screen
*screen
,
324 struct pipe_surface
*surf
,
325 void *context_private
)
327 xlib_i965_display_surface(NULL
, surf
);
331 static struct pipe_screen
*
332 xlib_create_i965_screen( void )
334 struct brw_winsys_screen
*winsys
;
335 struct pipe_screen
*screen
;
337 winsys
= xlib_create_brw_winsys_screen();
341 screen
= brw_create_screen(winsys
, PCI_CHIP_GM45_GM
);
345 screen
->flush_frontbuffer
= xlib_i965_flush_frontbuffer
;
350 winsys
->destroy( winsys
);
356 static struct pipe_context
*
357 xlib_create_i965_context( struct pipe_screen
*screen
,
358 void *context_private
)
360 struct pipe_context
*pipe
;
362 pipe
= brw_create_context(screen
);
366 pipe
->priv
= context_private
;
370 /* Free stuff here */
377 struct xm_driver xlib_i965_driver
=
379 .create_pipe_screen
= xlib_create_i965_screen
,
380 .create_pipe_context
= xlib_create_i965_context
,
381 .display_surface
= xlib_i965_display_surface
385 /* Register this driver at library load:
387 static void _init( void ) __attribute__((constructor
));
388 static void _init( void )
390 xmesa_set_driver( &xlib_i965_driver
);
395 /***********************************************************************
397 * Butt-ugly hack to convince the linker not to throw away public GL
398 * symbols (they are all referenced from getprocaddress, I guess).
400 extern void (*linker_foo(const unsigned char *procName
))();
401 extern void (*glXGetProcAddress(const unsigned char *procName
))();
403 extern void (*linker_foo(const unsigned char *procName
))()
405 return glXGetProcAddress(procName
);