static void
xm_buffer_data(struct pipe_winsys *pws, struct pipe_buffer_handle *buf,
- unsigned size, const void *data )
+ unsigned size, const void *data, unsigned usage )
{
struct xm_buffer *xm_buf = xm_bo(buf);
assert(!xm_buf->userBuffer);
}
static void
-xm_flush_frontbuffer(struct pipe_winsys *pws)
+xm_flush_frontbuffer(struct pipe_winsys *pws,
+ struct pipe_surface *surf,
+ void *context_private)
{
- /*
- struct intel_context *intel = intel_pipe_winsys(sws)->intel;
- __DRIdrawablePrivate *dPriv = intel->driDrawable;
-
- intelCopyBuffer(dPriv, NULL);
- */
+ /* The Xlib driver's front color surfaces are actually X Windows so
+ * this flush is a no-op.
+ * If we instead did front buffer rendering to a temporary XImage,
+ * this would be the place to copy the Ximage to the on-screen Window.
+ */
}
-static void
-xm_wait_idle(struct pipe_winsys *pws)
-{
- /* no-op */
-}
static void
xm_printf(struct pipe_winsys *pws, const char *fmtString, ...)
static struct pipe_buffer_handle *
-xm_buffer_create(struct pipe_winsys *pws, unsigned alignment)
+xm_buffer_create(struct pipe_winsys *pws, unsigned flags)
{
struct xm_buffer *buffer = CALLOC_STRUCT(xm_buffer);
buffer->refcount = 1;
}
-static struct pipe_region *
-xm_region_alloc(struct pipe_winsys *winsys,
- unsigned cpp, unsigned width, unsigned height, unsigned flags)
-{
- struct pipe_region *region = CALLOC_STRUCT(pipe_region);
- const unsigned alignment = 64;
-
- region->cpp = cpp;
- region->pitch = round_up(width, alignment / cpp);
- region->height = height;
- region->refcount = 1;
-
- assert(region->pitch > 0);
-
- region->buffer = winsys->buffer_create( winsys, alignment )
-;
-
- /* NULL data --> just allocate the space */
- winsys->buffer_data( winsys,
- region->buffer,
- region->pitch * cpp * height,
- NULL );
- return region;
-}
-
-
-static void
-xm_region_release(struct pipe_winsys *winsys, struct pipe_region **region)
+static unsigned
+xm_surface_pitch(struct pipe_winsys *winsys, unsigned cpp, unsigned width,
+ unsigned flags)
{
- if (!*region)
- return;
-
- assert((*region)->refcount > 0);
- (*region)->refcount--;
-
- if ((*region)->refcount == 0) {
- assert((*region)->map_refcount == 0);
-
- winsys->buffer_reference( winsys, &((*region)->buffer), NULL );
- free(*region);
- }
- *region = NULL;
+ return round_up(width, 64 / cpp);
}
xms->surface.format = pipeFormat;
xms->surface.refcount = 1;
+ xms->surface.winsys = ws;
#if 0
/*
* This is really just a softpipe surface, not an XImage/Pixmap surface.
+static void
+xm_surface_release(struct pipe_winsys *winsys, struct pipe_surface **s)
+{
+ struct pipe_surface *surf = *s;
+ surf->refcount--;
+ if (surf->refcount == 0) {
+ if (surf->buffer)
+ winsys->buffer_reference(winsys, &surf->buffer, NULL);
+ free(surf);
+ }
+ *s = NULL;
+}
+
+
/**
- * Create a winsys layer.
+ * Return pointer to a pipe_winsys object.
+ * For Xlib, this is a singleton object.
* Nothing special for the Xlib driver so no subclassing or anything.
*/
-static struct pipe_winsys *
-xmesa_create_pipe_winsys(void)
+struct pipe_winsys *
+xmesa_get_pipe_winsys(void)
{
- struct pipe_winsys *ws = CALLOC_STRUCT(pipe_winsys);
-
- /* Fill in this struct with callbacks that pipe will need to
- * communicate with the window system, buffer manager, etc.
- */
- ws->buffer_create = xm_buffer_create;
- ws->user_buffer_create = xm_user_buffer_create;
- ws->buffer_map = xm_buffer_map;
- ws->buffer_unmap = xm_buffer_unmap;
- ws->buffer_reference = xm_buffer_reference;
- ws->buffer_data = xm_buffer_data;
- ws->buffer_subdata = xm_buffer_subdata;
- ws->buffer_get_subdata = xm_buffer_get_subdata;
-
- ws->region_alloc = xm_region_alloc;
- ws->region_release = xm_region_release;
+ static struct pipe_winsys *ws = NULL;
- ws->surface_alloc = xm_surface_alloc;
-
- ws->flush_frontbuffer = xm_flush_frontbuffer;
- ws->wait_idle = xm_wait_idle;
- ws->printf = xm_printf;
- ws->get_name = xm_get_name;
+ if (!ws) {
+ ws = CALLOC_STRUCT(pipe_winsys);
+
+ /* Fill in this struct with callbacks that pipe will need to
+ * communicate with the window system, buffer manager, etc.
+ */
+ ws->buffer_create = xm_buffer_create;
+ ws->user_buffer_create = xm_user_buffer_create;
+ ws->buffer_map = xm_buffer_map;
+ ws->buffer_unmap = xm_buffer_unmap;
+ ws->buffer_reference = xm_buffer_reference;
+ ws->buffer_data = xm_buffer_data;
+ ws->buffer_subdata = xm_buffer_subdata;
+ ws->buffer_get_subdata = xm_buffer_get_subdata;
+
+ ws->surface_pitch = xm_surface_pitch;
+ ws->surface_alloc = xm_surface_alloc;
+ ws->surface_release = xm_surface_release;
+
+ ws->flush_frontbuffer = xm_flush_frontbuffer;
+ ws->printf = xm_printf;
+ ws->get_name = xm_get_name;
+ }
return ws;
}
+/**
+ * XXX this depends on the depths supported by the screen (8/16/32/etc).
+ * Maybe when we're about to create a context/drawable we create a new
+ * softpipe_winsys object that corresponds to the specified screen...
+ *
+ * Also, this query only really matters for on-screen drawables.
+ * For textures and FBOs we (softpipe) can support any format.o
+ */
static boolean
xmesa_is_format_supported(struct softpipe_winsys *sws, uint format)
{
+ /* Any format supported by softpipe can be listed here.
+ * This query is not used for allocating window-system color buffers
+ * (which would depend on the screen depth/bpp).
+ */
switch (format) {
case PIPE_FORMAT_U_A8_R8_G8_B8:
case PIPE_FORMAT_S_R16_G16_B16_A16:
case PIPE_FORMAT_S8_Z24:
+ case PIPE_FORMAT_U_S8:
+ case PIPE_FORMAT_U_Z16:
+ case PIPE_FORMAT_U_Z32:
return TRUE;
default:
return FALSE;
}
+/**
+ * Return pointer to a softpipe_winsys object.
+ * For Xlib, this is a singleton object.
+ */
static struct softpipe_winsys *
-xmesa_create_softpipe_winsys(void)
+xmesa_get_softpipe_winsys(void)
{
- struct softpipe_winsys *spws = CALLOC_STRUCT(softpipe_winsys);
- if (spws) {
- spws->is_format_supported = xmesa_is_format_supported;
+ static struct softpipe_winsys *spws = NULL;
+
+ if (!spws) {
+ spws = CALLOC_STRUCT(softpipe_winsys);
+ if (spws) {
+ spws->is_format_supported = xmesa_is_format_supported;
+ }
}
+
return spws;
}
struct pipe_context *
-xmesa_create_softpipe(XMesaContext xmesa)
+xmesa_create_context(XMesaContext xmesa)
{
- struct pipe_winsys *pws = xmesa_create_pipe_winsys();
- struct softpipe_winsys *spws = xmesa_create_softpipe_winsys();
+ struct pipe_winsys *pws = xmesa_get_pipe_winsys();
+ struct softpipe_winsys *spws = xmesa_get_softpipe_winsys();
return softpipe_create( pws, spws );
}