gallium: squash-merge of gallium screen context
authorKeith Whitwell <keithw@vmware.com>
Mon, 8 Feb 2010 12:55:59 +0000 (12:55 +0000)
committerKeith Whitwell <keithw@vmware.com>
Mon, 8 Feb 2010 13:05:36 +0000 (13:05 +0000)
Squashed commit of the following:

commit 009598122adf5cad42bf9af067eccaf8e89e1233
Author: Christoph Bumiller <e0425955@student.tuwien.ac.at>
Date:   Mon Feb 8 11:03:26 2010 +0000

    nouveau: fix gallium-screen-context branch fallout

commit 7b2ffc2019d72e833afea7eebf3e80121187375d
Merge: 51e190e c036d13
Author: Keith Whitwell <keithw@vmware.com>
Date:   Fri Feb 5 09:55:02 2010 +0000

    Merge commit 'origin/master' into gallium-screen-context

    Conflicts:
     src/gallium/winsys/drm/nouveau/drm/nouveau_drm_api.c

    This branch has got a pretty tortured history now, I expect
    a squash merge will be appropriate when it is done.

commit 51e190e95acf120f72768fafb29e9721e358df1b
Author: Keith Whitwell <keithw@vmware.com>
Date:   Thu Feb 4 17:58:02 2010 +0000

    gallium: fix some build issues

commit f524bdaa723fb181637ad30c6ad708aeedabe25b
Merge: f906212 3aba0a2
Author: Keith Whitwell <keithw@vmware.com>
Date:   Thu Feb 4 17:51:32 2010 +0000

    Merge commit 'origin/master' into gallium-screen-context

commit f9062126883199eabf045714c717cd35f4b7b313
Author: Keith Whitwell <keithw@vmware.com>
Date:   Thu Feb 4 17:17:12 2010 +0000

    gallium/docs: small description of screen::create_context

commit efcb37bd3d5ed37f06c6105bd2d750b374ec0927
Author: Keith Whitwell <keithw@vmware.com>
Date:   Thu Feb 4 16:42:42 2010 +0000

    drm/radeon: more dead create_context wrapper removal

commit 6badc0dd9e06cf2ec936940bcf12b9ef5324b301
Author: Keith Whitwell <keithw@vmware.com>
Date:   Thu Feb 4 16:42:30 2010 +0000

    drm/i965: more dead create_context wrapper removal

commit cf04ebd5a54b18b2d894cfdab2b0f2fd55626ffc
Author: Keith Whitwell <keithw@vmware.com>
Date:   Thu Feb 4 16:42:05 2010 +0000

    st/python: more dead create_context wrapper removal

commit 444f114c3516abf71c430e6e9d0d2ae3b80679d3
Author: Keith Whitwell <keithw@vmware.com>
Date:   Thu Feb 4 16:37:58 2010 +0000

    idenity: wrapped context creation

commit 5a6d09cb9e468d1ee6c8d54b887618819d8d94f2
Author: Keith Whitwell <keithw@vmware.com>
Date:   Thu Feb 4 16:28:47 2010 +0000

    ws/gdi: remove dead context_create wrapper

commit 132b55f4bec39386ac625f09aaa11f609664024c
Author: Keith Whitwell <keithw@vmware.com>
Date:   Thu Feb 4 16:27:52 2010 +0000

    ws/gdi: remove dead context_create wrapper

commit 56d2d21a0cdcb197a364049d354c2f15a4fc026a
Author: Keith Whitwell <keithw@vmware.com>
Date:   Thu Feb 4 16:25:38 2010 +0000

    st/xorg: use screen::context_create

commit 838c5cfe56b2af6c644909bed3c5e7cdd64c336a
Author: Keith Whitwell <keithw@vmware.com>
Date:   Thu Feb 4 16:23:20 2010 +0000

    glx/xlib: simplify creation of trace-wrapped contexts

    Trace screen knows how to properly wrap context creation in the
    wrapped screen, so nothing special to do here.

commit c99404c03ebaec4175f08a2f363e43c9085f2635
Author: Keith Whitwell <keithw@vmware.com>
Date:   Thu Feb 4 16:18:24 2010 +0000

    st/python: no need to special case context creation for trace

commit 193a527a682b6877bb1faecd8092df4dfd055a18
Author: Keith Whitwell <keithw@vmware.com>
Date:   Thu Feb 4 16:15:30 2010 +0000

    drm/radeon: remove dead create_context declaration

commit bb984eecc25cf23bc77e1c818b81165ba1a07c9a
Author: Keith Whitwell <keithw@vmware.com>
Date:   Thu Feb 4 16:14:58 2010 +0000

    nv/drm: remove dead create_context ref

commit e809313a44287dc4e16c28e9e74ef3b2b5271aa1
Author: Keith Whitwell <keithw@vmware.com>
Date:   Thu Feb 4 16:12:51 2010 +0000

    st/egl: remove a layer of wrappers around screen::create_context

commit 39caa6672a04122f185c22e17aab86d1c40938bf
Author: Keith Whitwell <keithw@vmware.com>
Date:   Thu Feb 4 16:05:28 2010 +0000

    r300g: fill in screen::context_create

commit 407f12556d16ba0656774d8a1d9ebda22f82f473
Author: Keith Whitwell <keithw@vmware.com>
Date:   Thu Feb 4 16:04:04 2010 +0000

    cell: adapt for screen::create_context, untested

commit d02b0c6ce321a04c76fdabb09e0e4380ce1c1376
Author: Keith Whitwell <keithw@vmware.com>
Date:   Thu Feb 4 15:50:24 2010 +0000

    drm/nv: adapt for screen::create_context

    All contexts now created directly through the screen, so remove
    equivalent code here.

    Remove apparently un-needed array of contexts in the winsys.

commit 53eec5b1349aa1b6892a75a7bff7e7530957aeae
Author: Keith Whitwell <keithw@vmware.com>
Date:   Thu Feb 4 15:50:08 2010 +0000

    stw: adapt for screen::create_context, untested

commit c6a64de3eb381bc9a88e9fbdecbf87d77925aaf5
Author: Keith Whitwell <keithw@vmware.com>
Date:   Thu Feb 4 15:49:20 2010 +0000

    trace: expose the wrapped context's priv data

    If we are going to keep this priv idea, really want an accessor
    function for it so that trace and other drivers can wrap that.

commit 75d6104e11d86ec2b0749627ed58e35f856ee6eb
Author: Keith Whitwell <keithw@vmware.com>
Date:   Thu Feb 4 15:47:55 2010 +0000

    nv30: adapt to screen::context_create

commit 12f5deb6ed9723e9b5d34577052b8365813ca14e
Author: Keith Whitwell <keithw@vmware.com>
Date:   Thu Feb 4 15:44:47 2010 +0000

    nv40: adapt to screen::context_create

commit 14baccaa3b6bbb3b91056126f6521828e786dc62
Author: Keith Whitwell <keithw@vmware.com>
Date:   Thu Feb 4 15:35:27 2010 +0000

    nv50: adapt to screen::create_context

    Not build tested.  Need to figure out how to build nouveau.

commit a0e94505ccd2d7f3e604465a2ac302f1286b73b6
Author: Keith Whitwell <keithw@vmware.com>
Date:   Thu Feb 4 15:22:27 2010 +0000

    llvmpipe: update for screen::create_context, untested

commit 0eae17107c950346030e4f7e0ec232f868d3893d
Author: Keith Whitwell <keithw@vmware.com>
Date:   Thu Feb 4 15:16:57 2010 +0000

    xlib/llvmpipe: remove dead winsys context creation path

commit 2f69f9ffaa7e2a01d2483277246ed13051ae4ca3
Author: Keith Whitwell <keithw@vmware.com>
Date:   Thu Feb 4 14:58:27 2010 +0000

    gallium: convert most code to use screen::create_context

    I wish I could build all of gallium at once to find breakages.

commit d7b57f4061b82322cbcae176125913d9f0dea6c1
Author: Keith Whitwell <keithw@vmware.com>
Date:   Thu Feb 4 12:46:21 2010 +0000

    glx: permit building with older protocol headers

    I'd like to be able to build mesa on current distro releases without
    having to upgrade from the standard dri2proto and glproto headers.  With
    this change I'm able to build on ancient releases such as Ubuntu 9-10...

    In general, it would be nice to be able to build-test mesa to check for
    unintended breakages without having to follow the external dependencies
    of every group working on the codebase.

commit 57adedd6fb06c98572ed8d4aef19203df4c4eea2
Merge: da71847 e1906ae
Author: Keith Whitwell <keithw@vmware.com>
Date:   Thu Feb 4 11:38:15 2010 +0000

    Merge commit 'origin/master' into gallium-screen-context

    Conflicts:
     src/gallium/drivers/softpipe/sp_video_context.h
     src/gallium/drivers/trace/tr_context.c
     src/gallium/state_trackers/wgl/shared/stw_context.c
     src/gallium/winsys/gdi/gdi_softpipe_winsys.c

commit da71847ea6414d7e352c6094f8963bb4eda344dc
Author: José Fonseca <jfonseca@vmware.com>
Date:   Sat May 2 08:57:39 2009 +0100

    wgl: Use pipe_screen::context_create.

commit 2595a188f93fd903600ef5d8517737ee0592035d
Author: José Fonseca <jfonseca@vmware.com>
Date:   Sat May 2 08:56:47 2009 +0100

    trace: Implement pipe_screen::context_create.

commit f3640e4ae37a5260cbfba999d079f827de0a313a
Author: José Fonseca <jfonseca@vmware.com>
Date:   Sat May 2 08:56:17 2009 +0100

    softpipe: Implement pipe_screen::context_create.

commit 347266bddc8bd39c711bacb2193793759d0f3696
Author: José Fonseca <jfonseca@vmware.com>
Date:   Sat May 2 08:55:31 2009 +0100

    gallium: New pipe_screen::context_create callback.

92 files changed:
src/gallium/docs/source/screen.rst
src/gallium/drivers/cell/ppu/cell_context.c
src/gallium/drivers/cell/ppu/cell_context.h
src/gallium/drivers/cell/ppu/cell_screen.c
src/gallium/drivers/cell/ppu/cell_winsys.h
src/gallium/drivers/i915/i915_context.c
src/gallium/drivers/i915/i915_context.h
src/gallium/drivers/i915/i915_screen.c
src/gallium/drivers/i915/intel_winsys.h
src/gallium/drivers/i965/brw_context.c
src/gallium/drivers/i965/brw_context.h
src/gallium/drivers/i965/brw_screen.c
src/gallium/drivers/i965/brw_winsys.h
src/gallium/drivers/identity/id_context.c
src/gallium/drivers/identity/id_context.h
src/gallium/drivers/identity/id_drm.c
src/gallium/drivers/identity/id_public.h
src/gallium/drivers/identity/id_screen.c
src/gallium/drivers/llvmpipe/lp_context.c
src/gallium/drivers/llvmpipe/lp_context.h
src/gallium/drivers/llvmpipe/lp_screen.c
src/gallium/drivers/llvmpipe/lp_winsys.h
src/gallium/drivers/nouveau/nouveau_winsys.h
src/gallium/drivers/nv30/nv30_context.c
src/gallium/drivers/nv30/nv30_context.h
src/gallium/drivers/nv30/nv30_screen.c
src/gallium/drivers/nv30/nv30_screen.h
src/gallium/drivers/nv30/nv30_state_emit.c
src/gallium/drivers/nv40/nv40_context.c
src/gallium/drivers/nv40/nv40_context.h
src/gallium/drivers/nv40/nv40_screen.c
src/gallium/drivers/nv40/nv40_screen.h
src/gallium/drivers/nv40/nv40_state_emit.c
src/gallium/drivers/nv50/nv50_context.c
src/gallium/drivers/nv50/nv50_context.h
src/gallium/drivers/nv50/nv50_screen.c
src/gallium/drivers/nv50/nv50_screen.h
src/gallium/drivers/nv50/nv50_state_validate.c
src/gallium/drivers/r300/r300_context.c
src/gallium/drivers/r300/r300_context.h
src/gallium/drivers/r300/r300_screen.c
src/gallium/drivers/r300/r300_screen.h
src/gallium/drivers/r300/r300_winsys.h
src/gallium/drivers/softpipe/sp_context.c
src/gallium/drivers/softpipe/sp_context.h
src/gallium/drivers/softpipe/sp_screen.c
src/gallium/drivers/softpipe/sp_video_context.c
src/gallium/drivers/softpipe/sp_winsys.h
src/gallium/drivers/svga/svga_context.c
src/gallium/drivers/svga/svga_context.h
src/gallium/drivers/svga/svga_screen.c
src/gallium/drivers/svga/svga_winsys.h
src/gallium/drivers/trace/tr_context.c
src/gallium/drivers/trace/tr_context.h
src/gallium/drivers/trace/tr_drm.c
src/gallium/drivers/trace/tr_screen.c
src/gallium/include/pipe/p_screen.h
src/gallium/include/state_tracker/drm_api.h
src/gallium/state_trackers/dri/dri_context.c
src/gallium/state_trackers/egl/common/egl_g3d.c
src/gallium/state_trackers/egl/common/native.h
src/gallium/state_trackers/egl/kms/native_kms.c
src/gallium/state_trackers/egl/x11/native_dri2.c
src/gallium/state_trackers/egl/x11/native_ximage.c
src/gallium/state_trackers/glx/xlib/xm_api.c
src/gallium/state_trackers/glx/xlib/xm_winsys.h
src/gallium/state_trackers/python/st_device.c
src/gallium/state_trackers/python/st_device.h
src/gallium/state_trackers/python/st_hardpipe_winsys.c
src/gallium/state_trackers/python/st_llvmpipe_winsys.c
src/gallium/state_trackers/python/st_softpipe_winsys.c
src/gallium/state_trackers/python/st_winsys.h
src/gallium/state_trackers/wgl/stw_context.c
src/gallium/state_trackers/wgl/stw_ext_gallium.c
src/gallium/state_trackers/wgl/stw_winsys.h
src/gallium/state_trackers/xorg/xorg_exa.c
src/gallium/winsys/drm/i965/gem/i965_drm_api.c
src/gallium/winsys/drm/i965/xlib/xlib_i965.c
src/gallium/winsys/drm/intel/gem/intel_drm_api.c
src/gallium/winsys/drm/nouveau/drm/nouveau_drm_api.c
src/gallium/winsys/drm/nouveau/drm/nouveau_drm_api.h
src/gallium/winsys/drm/radeon/core/radeon_drm.c
src/gallium/winsys/drm/radeon/core/radeon_drm.h
src/gallium/winsys/drm/radeon/python/radeon_hardpipe_winsys.c
src/gallium/winsys/drm/vmware/core/vmw_context.c
src/gallium/winsys/drm/vmware/core/vmw_context.h
src/gallium/winsys/drm/vmware/core/vmw_screen_dri.c
src/gallium/winsys/gdi/gdi_llvmpipe_winsys.c
src/gallium/winsys/gdi/gdi_softpipe_winsys.c
src/gallium/winsys/xlib/xlib_cell.c
src/gallium/winsys/xlib/xlib_llvmpipe.c
src/gallium/winsys/xlib/xlib_softpipe.c

index 55a4c6990de0ffa9f24686cdc38fbe30fc0bf04c..27f65522b6991c0f2bdd1e676ab9b73a09dd0f0a 100644 (file)
@@ -190,6 +190,15 @@ Get a floating-point screen parameter.
 
 **param** is one of the :ref:`PIPE_CAP` names.
 
+context_create
+^^^^^^^^^^^^^^
+
+Create a pipe_context.
+
+**priv** is private data of the caller, which may be put to various
+unspecified uses, typically to do with implementing swapbuffers
+and/or front-buffer rendering.
+
 is_format_supported
 ^^^^^^^^^^^^^^^^^^^
 
index 30aa04482e3fb35d97d3e0c4d9ea7f4448384279..5bff9869fd0e8fb3129e7066e29ac8475c067eb6 100644 (file)
@@ -124,7 +124,7 @@ cell_is_buffer_referenced( struct pipe_context *pipe,
 
 struct pipe_context *
 cell_create_context(struct pipe_screen *screen,
-                    struct cell_winsys *cws)
+                    void *priv )
 {
    struct cell_context *cell;
    uint i;
@@ -136,9 +136,10 @@ cell_create_context(struct pipe_screen *screen,
 
    memset(cell, 0, sizeof(*cell));
 
-   cell->winsys = cws;
+   cell->winsys = NULL;                /* XXX: fixme - get this from screen? */
    cell->pipe.winsys = screen->winsys;
    cell->pipe.screen = screen;
+   cell->pipe.priv = priv;
    cell->pipe.destroy = cell_destroy_context;
 
    cell->pipe.clear = cell_clear;
index e402ed29220cfcf98c700cd90020f9cf21757393..905cd5db390033fb754af4b41326632875f18b92 100644 (file)
@@ -188,8 +188,9 @@ cell_context(struct pipe_context *pipe)
 }
 
 
-extern struct pipe_context *
-cell_create_context(struct pipe_screen *screen, struct cell_winsys *cws);
+struct pipe_context *
+cell_create_context(struct pipe_screen *screen,
+                    void *priv );
 
 extern void
 cell_vertex_shader_queue_flush(struct draw_context *draw);
index c329c6682dde95a9a8e3b98a19647c06d4b3a7b4..7681e3411e8f77683692747083df6d9db043dd0f 100644 (file)
@@ -174,6 +174,7 @@ cell_create_screen(struct pipe_winsys *winsys)
    screen->get_param = cell_get_param;
    screen->get_paramf = cell_get_paramf;
    screen->is_format_supported = cell_is_format_supported;
+   screen->context_create = cell_create_context;
 
    cell_init_screen_texture_funcs(screen);
    u_simple_screen_init(screen);
index ae2af5696b541fa1f680ad5194b8bd708b2e2fb2..e227e065ff3afb35dde38d5996869b0f8ed7163e 100644 (file)
  */
 struct cell_winsys
 {
-   uint preferredFormat;
+   uint dummy;
 };
 
 
-extern struct cell_winsys *
-cell_get_winsys(uint format);
-
 
 
 #endif
index f8219c9f299a39f90c1399129dcd49171977f60d..3d45a22b7e7fa68ed28d40719b667b17218306bb 100644 (file)
@@ -183,7 +183,7 @@ static void i915_destroy(struct pipe_context *pipe)
 }
 
 struct pipe_context *
-i915_create_context(struct pipe_screen *screen)
+i915_create_context(struct pipe_screen *screen, void *priv)
 {
    struct i915_context *i915;
 
@@ -194,6 +194,7 @@ i915_create_context(struct pipe_screen *screen)
    i915->iws = i915_screen(screen)->iws;
    i915->base.winsys = NULL;
    i915->base.screen = screen;
+   i915->base.priv = priv;
 
    i915->base.destroy = i915_destroy;
 
index 6ec5566d5df1bc6cd115652b5770f534d3ad8a67..1479d2201a91935ce799c7a2aa3816925fe465d8 100644 (file)
@@ -334,6 +334,11 @@ void i915_init_flush_functions( struct i915_context *i915 );
 void i915_init_string_functions( struct i915_context *i915 );
 
 
+/************************************************************************
+ * i915_context.c
+ */
+struct pipe_context *i915_create_context(struct pipe_screen *screen,
+                                        void *priv);
 
 
 /***********************************************************************
index e6b560bc212d9b21aa19ce9854221ad545a4595b..c450854c9828d1516c611c7f627a22e529be3ba8 100644 (file)
@@ -294,6 +294,8 @@ i915_create_screen(struct intel_winsys *iws, uint pci_id)
    is->base.get_paramf = i915_get_paramf;
    is->base.is_format_supported = i915_is_format_supported;
 
+   is->base.context_create = i915_create_context;
+
    is->base.fence_reference = i915_fence_reference;
    is->base.fence_signalled = i915_fence_signalled;
    is->base.fence_finish = i915_fence_finish;
index c6bf6e6f7f1a90834010d15b14aaf14b3dd3e6e9..b3a802b0e293ec2eb1a2d4e8ad3b52b79102fc2c 100644 (file)
@@ -203,10 +203,6 @@ struct intel_winsys {
  */
 struct pipe_screen *i915_create_screen(struct intel_winsys *iws, unsigned pci_id);
 
-/**
- * Create a i915 pipe_context.
- */
-struct pipe_context *i915_create_context(struct pipe_screen *screen);
 
 /**
  * Get the intel_winsys buffer backing the texture.
index 7cbda05ac583401f90a967bdf9c14a5097238a63..3dbe2b91308a9198f8c25ddbd9c7a2bfa78794bb 100644 (file)
@@ -102,7 +102,8 @@ static void brw_destroy_context( struct pipe_context *pipe )
 }
 
 
-struct pipe_context *brw_create_context(struct pipe_screen *screen)
+struct pipe_context *brw_create_context(struct pipe_screen *screen,
+                                       void *priv)
 {
    struct brw_context *brw = (struct brw_context *) CALLOC_STRUCT(brw_context);
 
@@ -112,6 +113,7 @@ struct pipe_context *brw_create_context(struct pipe_screen *screen)
    }
 
    brw->base.screen = screen;
+   brw->base.priv = priv;
    brw->base.destroy = brw_destroy_context;
    brw->sws = brw_screen(screen)->sws;
    brw->chipset = brw_screen(screen)->chipset;
index 8c006bb95b2e7de5ef1e02021a557b1a30c1e253..19fda423de0fdbb577bc48f98e4e62ea2f63d823 100644 (file)
@@ -837,6 +837,10 @@ int brw_upload_urb_fence(struct brw_context *brw);
  */
 int brw_upload_cs_urb_state(struct brw_context *brw);
 
+/* brw_context.c
+ */
+struct pipe_context *brw_create_context(struct pipe_screen *screen,
+                                       void *priv);
 
 /*======================================================================
  * Inline conversion functions.  These are better-typed than the
index 1d79d84dc65ef02d3cf2670050fc8109453df105..184cd490e55f0a6ce8f5d3bc4c36ffbf884be586 100644 (file)
@@ -397,6 +397,7 @@ brw_create_screen(struct brw_winsys_screen *sws, uint pci_id)
    bscreen->base.get_param = brw_get_param;
    bscreen->base.get_paramf = brw_get_paramf;
    bscreen->base.is_format_supported = brw_is_format_supported;
+   bscreen->base.context_create = brw_create_context;
    bscreen->base.fence_reference = brw_fence_reference;
    bscreen->base.fence_signalled = brw_fence_signalled;
    bscreen->base.fence_finish = brw_fence_finish;
index 8841de2611e92079d6809bba91bcda1c3d58f1ec..c82d00f4a479680c050d179745d8d995e4847564 100644 (file)
@@ -256,10 +256,6 @@ bo_reference(struct brw_winsys_buffer **ptr, struct brw_winsys_buffer *buf)
  */
 struct pipe_screen *brw_create_screen(struct brw_winsys_screen *iws, unsigned pci_id);
 
-/**
- * Create a brw pipe_context.
- */
-struct pipe_context *brw_create_context(struct pipe_screen *screen);
 
 /**
  * Get the brw_winsys buffer backing the texture.
index f9063d90fb145331753d2224bd760fd9e1861ac9..40962a3ccf67b3c8da789c84e1f97566464e944e 100644 (file)
@@ -692,7 +692,7 @@ identity_context_create(struct pipe_screen *_screen, struct pipe_context *pipe)
 
    id_pipe->base.winsys = NULL;
    id_pipe->base.screen = _screen;
-   id_pipe->base.priv = pipe->priv;
+   id_pipe->base.priv = pipe->priv; /* expose wrapped data */
    id_pipe->base.draw = NULL;
 
    id_pipe->base.destroy = identity_destroy;
index 75b73fc7df6a28f6def843f3f30d3c104c95722f..6d3c1899d596547cd3a3986dfc240bf89df16275 100644 (file)
@@ -39,6 +39,10 @@ struct identity_context {
 };
 
 
+struct pipe_context *
+identity_context_create(struct pipe_screen *screen, struct pipe_context *pipe);
+
+
 static INLINE struct identity_context *
 identity_context(struct pipe_context *pipe)
 {
index 14f68ac0d008a7ee8c5c05c404bd986db5c65b22..12b516b445f1c440ab1725f7786f42673cd51f34 100644 (file)
@@ -63,22 +63,6 @@ identity_drm_create_screen(struct drm_api *_api, int fd,
    return identity_screen_create(screen);
 }
 
-static struct pipe_context *
-identity_drm_create_context(struct drm_api *_api,
-                            struct pipe_screen *_screen)
-{
-   struct identity_screen *id_screen = identity_screen(_screen);
-   struct identity_drm_api *id_api = identity_drm_api(_api);
-   struct pipe_screen *screen = id_screen->screen;
-   struct drm_api *api = id_api->api;
-   struct pipe_context *pipe;
-
-   pipe = api->create_context(api, screen);
-
-   pipe = identity_context_create(_screen, pipe);
-
-   return pipe;
-}
 
 static struct pipe_texture *
 identity_drm_texture_from_shared_handle(struct drm_api *_api,
@@ -159,7 +143,6 @@ identity_drm_create(struct drm_api *api)
       goto error;
 
    id_api->base.create_screen = identity_drm_create_screen;
-   id_api->base.create_context = identity_drm_create_context;
    id_api->base.texture_from_shared_handle = identity_drm_texture_from_shared_handle;
    id_api->base.shared_handle_from_texture = identity_drm_shared_handle_from_texture;
    id_api->base.local_handle_from_texture = identity_drm_local_handle_from_texture;
index 3d2862eaa01e506ce5fe292bcb49feb93b767dc1..d0d5847c61cb25db15d44dd3445299c5861bcd1c 100644 (file)
@@ -34,7 +34,4 @@ struct pipe_context;
 struct pipe_screen *
 identity_screen_create(struct pipe_screen *screen);
 
-struct pipe_context *
-identity_context_create(struct pipe_screen *screen, struct pipe_context *pipe);
-
 #endif /* ID_PUBLIC_H */
index 53eae3ef5440c821bb78e1d9471befadaaa75b1d..b85492114a3714a68266fd3c4c7a435fef11f19d 100644 (file)
@@ -32,6 +32,7 @@
 
 #include "id_public.h"
 #include "id_screen.h"
+#include "id_context.h"
 #include "id_objects.h"
 
 
@@ -103,6 +104,20 @@ identity_screen_is_format_supported(struct pipe_screen *_screen,
                                       geom_flags);
 }
 
+static struct pipe_context *
+identity_screen_context_create(struct pipe_screen *_screen,
+                               void *priv)
+{
+   struct identity_screen *id_screen = identity_screen(_screen);
+   struct pipe_screen *screen = id_screen->screen;
+   struct pipe_context *result;
+
+   result = screen->context_create(screen, priv);
+   if (result)
+      return identity_context_create(_screen, result);
+   return NULL;
+}
+
 static struct pipe_texture *
 identity_screen_texture_create(struct pipe_screen *_screen,
                                const struct pipe_texture *templat)
@@ -478,6 +493,7 @@ identity_screen_create(struct pipe_screen *screen)
    id_screen->base.get_param = identity_screen_get_param;
    id_screen->base.get_paramf = identity_screen_get_paramf;
    id_screen->base.is_format_supported = identity_screen_is_format_supported;
+   id_screen->base.context_create = identity_screen_context_create;
    id_screen->base.texture_create = identity_screen_texture_create;
    id_screen->base.texture_blanket = identity_screen_texture_blanket;
    id_screen->base.texture_destroy = identity_screen_texture_destroy;
index a76bde390545b268c43a57312c3340b3b9d566cf..43d610631dafcce8831b57cfb159d71562e9a195 100644 (file)
@@ -104,7 +104,7 @@ llvmpipe_is_buffer_referenced( struct pipe_context *pipe,
 }
 
 struct pipe_context *
-llvmpipe_create( struct pipe_screen *screen )
+llvmpipe_create_context( struct pipe_screen *screen, void *priv )
 {
    struct llvmpipe_context *llvmpipe;
 
@@ -118,6 +118,7 @@ llvmpipe_create( struct pipe_screen *screen )
 
    llvmpipe->pipe.winsys = screen->winsys;
    llvmpipe->pipe.screen = screen;
+   llvmpipe->pipe.priv = priv;
    llvmpipe->pipe.destroy = llvmpipe_destroy;
 
    /* state setters */
index 3af7b62a53bd0453e588c337303780cf2aba3b19..3bde485ac0c865975164e3ae7995fcc866f5ed79 100644 (file)
@@ -108,6 +108,10 @@ struct llvmpipe_context {
 };
 
 
+struct pipe_context *
+llvmpipe_create_context( struct pipe_screen *screen, void *priv );
+
+
 static INLINE struct llvmpipe_context *
 llvmpipe_context( struct pipe_context *pipe )
 {
index ca64c41827614f1448c2fa8c1d165e231a1b3206..1cd3ea9a84076e7867583d71852a604f4df50bde 100644 (file)
@@ -37,6 +37,7 @@
 #include "lp_winsys.h"
 #include "lp_jit.h"
 #include "lp_screen.h"
+#include "lp_context.h"
 #include "lp_debug.h"
 
 #ifdef DEBUG
@@ -310,6 +311,7 @@ llvmpipe_create_screen(struct llvmpipe_winsys *winsys)
    screen->base.is_format_supported = llvmpipe_is_format_supported;
 
    screen->base.surface_buffer_create = llvmpipe_surface_buffer_create;
+   screen->base.context_create = llvmpipe_create_context;
    screen->base.flush_frontbuffer = llvmpipe_flush_frontbuffer;
 
    llvmpipe_init_screen_texture_funcs(&screen->base);
index 74b472b653137793315c63eea710e3644cc10d7e..ce11fa93041c705c8ca548d5ef1c1ea3dadeb470 100644 (file)
@@ -113,9 +113,6 @@ struct llvmpipe_winsys
 };
 
 
-struct pipe_context *
-llvmpipe_create( struct pipe_screen * );
-
 
 struct pipe_screen *
 llvmpipe_create_screen( struct llvmpipe_winsys * );
index 4c5d2f8b1c1627d330bc2eec57d33af01d8e785c..af9ddd558c87323644c84710bd8e26a5f85c4e8a 100644 (file)
 extern struct pipe_screen *
 nv30_screen_create(struct pipe_winsys *ws, struct nouveau_device *);
 
-extern struct pipe_context *
-nv30_create(struct pipe_screen *, unsigned pctx_id);
-
 extern struct pipe_screen *
 nv40_screen_create(struct pipe_winsys *ws, struct nouveau_device *);
 
-extern struct pipe_context *
-nv40_create(struct pipe_screen *, unsigned pctx_id);
-
 extern struct pipe_screen *
 nv50_screen_create(struct pipe_winsys *ws, struct nouveau_device *);
 
-extern struct pipe_context *
-nv50_create(struct pipe_screen *, unsigned pctx_id);
-
 #endif
index 8a40cea2e5042d6ac57a16b3ec5e4c90a2c0057a..8bfd7b2c9095bf9c8dfcee533c164007da9ecdb3 100644 (file)
@@ -43,7 +43,7 @@ nv30_destroy(struct pipe_context *pipe)
 }
 
 struct pipe_context *
-nv30_create(struct pipe_screen *pscreen, unsigned pctx_id)
+nv30_create(struct pipe_screen *pscreen, void *priv)
 {
        struct nv30_screen *screen = nv30_screen(pscreen);
        struct pipe_winsys *ws = pscreen->winsys;
@@ -54,12 +54,12 @@ nv30_create(struct pipe_screen *pscreen, unsigned pctx_id)
        if (!nv30)
                return NULL;
        nv30->screen = screen;
-       nv30->pctx_id = pctx_id;
 
        nv30->nvws = nvws;
 
        nv30->pipe.winsys = ws;
        nv30->pipe.screen = pscreen;
+       nv30->pipe.priv = priv;
        nv30->pipe.destroy = nv30_destroy;
        nv30->pipe.draw_arrays = nv30_draw_arrays;
        nv30->pipe.draw_elements = nv30_draw_elements;
index 7d0533832782201943bd4bccfa45aec1cf5f59e1..b3b26f7f94a12d25986e43b9a6095914519c7928 100644 (file)
@@ -111,7 +111,6 @@ struct nv30_context {
 
        struct nouveau_winsys *nvws;
        struct nv30_screen *screen;
-       unsigned pctx_id;
 
        struct draw_context *draw;
 
@@ -209,4 +208,8 @@ extern void nv30_draw_elements(struct pipe_context *pipe,
 extern void nv30_clear(struct pipe_context *pipe, unsigned buffers,
                       const float *rgba, double depth, unsigned stencil);
 
+/* nv30_context.c */
+struct pipe_context *
+nv30_create(struct pipe_screen *pscreen, void *priv);
+
 #endif
index 62ee2e7697aa0374dfde7ea04c4b4586c77da15a..8f9b26ea56fef4ebca5338a345e593a249d1efc6 100644 (file)
@@ -20,9 +20,6 @@ struct nouveau_winsys {
 
        struct pipe_screen *pscreen;
 
-       unsigned nr_pctx;
-       struct pipe_context **pctx;
-
        struct pipe_surface *front;
 };
 
@@ -212,6 +209,7 @@ nv30_screen_create(struct pipe_winsys *ws, struct nouveau_device *dev)
        pscreen->get_param = nv30_screen_get_param;
        pscreen->get_paramf = nv30_screen_get_paramf;
        pscreen->is_format_supported = nv30_screen_surface_format_supported;
+       pscreen->context_create = nv30_create;
 
        nv30_screen_init_miptree_functions(pscreen);
        nv30_screen_init_transfer_functions(pscreen);
index 744a72de91a0cedf40fae9f251ba35ec480859fd..8591cd31cab9d8899ddfde7828140d12c44a59e8 100644 (file)
@@ -10,7 +10,7 @@ struct nv30_screen {
 
        struct nouveau_winsys *nvws;
 
-       unsigned cur_pctx;
+       struct nv30_context *cur_ctx;
 
        /* HW graphics objects */
        struct nv04_surface_2d *eng2d;
index ac52d946f021232356e8912b47041080fe19d049..d9650f63eb21a3986731734ba1f4cd919149483a 100644 (file)
@@ -44,13 +44,15 @@ nv30_state_emit(struct nv30_context *nv30)
        unsigned i;
        uint64_t states;
 
-       if (nv30->pctx_id != screen->cur_pctx) {
+       /* XXX: racy!
+        */
+       if (nv30 != screen->cur_ctx) {
                for (i = 0; i < NV30_STATE_MAX; i++) {
                        if (state->hw[i] && screen->state[i] != state->hw[i])
                                state->dirty |= (1ULL << i);
                }
 
-               screen->cur_pctx = nv30->pctx_id;
+               screen->cur_ctx = nv30;
        }
 
        for (i = 0, states = state->dirty; states; i++) {
index ffe25ffebd50aa85148efc815e79cf15ed0d8dbe..b0b90032de1be0be3428b20b5ca7613ab5c71fef 100644 (file)
@@ -43,7 +43,7 @@ nv40_destroy(struct pipe_context *pipe)
 }
 
 struct pipe_context *
-nv40_create(struct pipe_screen *pscreen, unsigned pctx_id)
+nv40_create(struct pipe_screen *pscreen, void *priv)
 {
        struct nv40_screen *screen = nv40_screen(pscreen);
        struct pipe_winsys *ws = pscreen->winsys;
@@ -54,11 +54,11 @@ nv40_create(struct pipe_screen *pscreen, unsigned pctx_id)
        if (!nv40)
                return NULL;
        nv40->screen = screen;
-       nv40->pctx_id = pctx_id;
 
        nv40->nvws = nvws;
 
        nv40->pipe.winsys = ws;
+       nv40->pipe.priv = priv;
        nv40->pipe.screen = pscreen;
        nv40->pipe.destroy = nv40_destroy;
        nv40->pipe.draw_arrays = nv40_draw_arrays;
index 3998cf2dd3528b1c8644ea578e505693d3abfaf1..958a48f2a4a57b587a882a3651966e00d748d5aa 100644 (file)
@@ -111,7 +111,6 @@ struct nv40_context {
 
        struct nouveau_winsys *nvws;
        struct nv40_screen *screen;
-       unsigned pctx_id;
 
        struct draw_context *draw;
 
@@ -230,4 +229,8 @@ extern void nv40_draw_elements(struct pipe_context *pipe,
 extern void nv40_clear(struct pipe_context *pipe, unsigned buffers,
                       const float *rgba, double depth, unsigned stencil);
 
+/* nv40_context.c */
+struct pipe_context *
+nv40_create(struct pipe_screen *pscreen, void *priv);
+
 #endif
index 56fb80975cc989a924a2be50ba7486dca28e40ff..001147e752f111fe375786929d5e9fe61697bb87 100644 (file)
@@ -196,6 +196,7 @@ nv40_screen_create(struct pipe_winsys *ws, struct nouveau_device *dev)
        pscreen->get_param = nv40_screen_get_param;
        pscreen->get_paramf = nv40_screen_get_paramf;
        pscreen->is_format_supported = nv40_screen_surface_format_supported;
+       pscreen->context_create = nv40_create;
 
        nv40_screen_init_miptree_functions(pscreen);
        nv40_screen_init_transfer_functions(pscreen);
index 98fde8755b99de17c99a5bed128df9e5c76b0576..9437aa050d40db7a62a9bf0a8c98819c65289f6e 100644 (file)
@@ -9,7 +9,7 @@ struct nv40_screen {
 
        struct nouveau_winsys *nvws;
 
-       unsigned cur_pctx;
+       struct nv40_context *cur_ctx;
 
        /* HW graphics objects */
        struct nv04_surface_2d *eng2d;
index 13fe854915b3722c092e355e342c8bee6a3631db..1c4007a129eaac45144e286ae10c673a61f8a3ed 100644 (file)
@@ -61,13 +61,15 @@ nv40_state_emit(struct nv40_context *nv40)
        unsigned i;
        uint64_t states;
 
-       if (nv40->pctx_id != screen->cur_pctx) {
+       /* XXX: race conditions
+        */
+       if (nv40 != screen->cur_ctx) {
                for (i = 0; i < NV40_STATE_MAX; i++) {
                        if (state->hw[i] && screen->state[i] != state->hw[i])
                                state->dirty |= (1ULL << i);
                }
 
-               screen->cur_pctx = nv40->pctx_id;
+               screen->cur_ctx = nv40;
        }
 
        for (i = 0, states = state->dirty; states; i++) {
index ac1abc1d5cc31d5c4729b8cbe66d85f7836124da..867bd03e69d134ee24c41eb77e09dd810643e23d 100644 (file)
@@ -95,7 +95,7 @@ nv50_destroy(struct pipe_context *pipe)
 
 
 struct pipe_context *
-nv50_create(struct pipe_screen *pscreen, unsigned pctx_id)
+nv50_create(struct pipe_screen *pscreen, void *priv)
 {
        struct pipe_winsys *pipe_winsys = pscreen->winsys;
        struct nv50_screen *screen = nv50_screen(pscreen);
@@ -105,10 +105,10 @@ nv50_create(struct pipe_screen *pscreen, unsigned pctx_id)
        if (!nv50)
                return NULL;
        nv50->screen = screen;
-       nv50->pctx_id = pctx_id;
 
        nv50->pipe.winsys = pipe_winsys;
        nv50->pipe.screen = pscreen;
+       nv50->pipe.priv = priv;
 
        nv50->pipe.destroy = nv50_destroy;
 
index 44d8f61342706111cdd2e454352ceb875f2e76b8..14cef4c0bf81791f4cfce7332c286d3adb216629 100644 (file)
@@ -145,7 +145,6 @@ struct nv50_context {
        struct pipe_context pipe;
 
        struct nv50_screen *screen;
-       unsigned pctx_id;
 
        struct draw_context *draw;
 
@@ -250,4 +249,8 @@ nv50_upload_sifc(struct nv50_context *nv50,
                 void *src, unsigned src_format, int src_pitch,
                 int x, int y, int w, int h, int cpp);
 
+/* nv50_context.c */
+struct pipe_context *
+nv50_create(struct pipe_screen *pscreen, void *priv);
+
 #endif
index 48c7b19584ff12a29365b4a5109952bdc6882d4b..8c4478e483b6fa1a60e7b97a723e5c7857eb3d86 100644 (file)
@@ -251,6 +251,7 @@ nv50_screen_create(struct pipe_winsys *ws, struct nouveau_device *dev)
        pscreen->get_param = nv50_screen_get_param;
        pscreen->get_paramf = nv50_screen_get_paramf;
        pscreen->is_format_supported = nv50_screen_is_format_supported;
+       pscreen->context_create = nv50_create;
        screen->base.pre_pipebuffer_map_callback = nv50_pre_pipebuffer_map;
 
        nv50_screen_init_miptree_functions(pscreen);
index 0d786b0f2e36602f9c10d8bc914ce03fabced1f3..2687b72127797a208edfa8db5996a59f8b37b6f1 100644 (file)
@@ -9,7 +9,6 @@ struct nv50_screen {
 
        struct nouveau_winsys *nvws;
 
-       unsigned cur_pctx;
        struct nv50_context *cur_ctx;
 
        struct nouveau_grobj *tesla;
index 956da9b304c3d7949563b86fa7655ef661dcb222..ee28fa63c1466f6b808884a49337ff3d8c675449 100644 (file)
@@ -185,10 +185,10 @@ nv50_state_emit(struct nv50_context *nv50)
        struct nv50_screen *screen = nv50->screen;
        struct nouveau_channel *chan = screen->base.channel;
 
-       /* I don't want to copy headers from the winsys. */
-       screen->cur_ctx = nv50;
-
-       if (nv50->pctx_id != screen->cur_pctx) {
+       /* XXX: this is racy for multiple contexts active on separate
+        * threads.
+        */
+       if (screen->cur_ctx != nv50) {
                if (nv50->state.fb)
                        nv50->state.dirty |= NV50_NEW_FRAMEBUFFER;
                if (nv50->state.blend)
@@ -217,7 +217,7 @@ nv50_state_emit(struct nv50_context *nv50)
                        nv50->state.dirty |= NV50_NEW_TEXTURE;
                if (nv50->state.vtxfmt && nv50->state.vtxbuf)
                        nv50->state.dirty |= NV50_NEW_ARRAYS;
-               screen->cur_pctx = nv50->pctx_id;
+               screen->cur_ctx = nv50;
        }
 
        if (nv50->state.dirty & NV50_NEW_FRAMEBUFFER)
index 2df2dcfcad9cfe18b86869c5f03af06a6fa1f582..14820ca85471b513ba9be2d9cf73afc3de977c95 100644 (file)
@@ -131,10 +131,11 @@ static void r300_setup_atoms(struct r300_context* r300)
 }
 
 struct pipe_context* r300_create_context(struct pipe_screen* screen,
-                                         struct radeon_winsys* radeon_winsys)
+                                         void *priv)
 {
     struct r300_context* r300 = CALLOC_STRUCT(r300_context);
     struct r300_screen* r300screen = r300_screen(screen);
+    struct radeon_winsys* radeon_winsys = r300screen->radeon_winsys;
 
     if (!r300)
         return NULL;
@@ -143,6 +144,7 @@ struct pipe_context* r300_create_context(struct pipe_screen* screen,
 
     r300->context.winsys = (struct pipe_winsys*)radeon_winsys;
     r300->context.screen = screen;
+    r300->context.priv = priv;
 
     r300->context.destroy = r300_destroy_context;
 
index ea9b4abfdebcee11cec43980dfef4276067f55db..84617578128ddd1e03c5aa4e23cf7cccb9c5aa60 100644 (file)
@@ -336,6 +336,10 @@ static INLINE struct r300_context* r300_context(struct pipe_context* context)
     return (struct r300_context*)context;
 }
 
+
+struct pipe_context* r300_create_context(struct pipe_screen* screen,
+                                         void *priv);
+
 /* Context initialization. */
 struct draw_stage* r300_draw_stage(struct r300_context* r300);
 void r300_init_state_functions(struct r300_context* r300);
index 2e04e31376752b27dd98ffe9c52dce7628de9aed..da4ec542ade23a9f3ea3112f8cfaf24811918099 100644 (file)
@@ -30,6 +30,7 @@
 #include "r300_texture.h"
 
 #include "radeon_winsys.h"
+#include "r300_winsys.h"
 
 /* Return the identifier behind whom the brave coders responsible for this
  * amalgamation of code, sweat, and duct tape, routinely obscure their names.
@@ -391,6 +392,7 @@ struct pipe_screen* r300_create_screen(struct radeon_winsys* radeon_winsys)
     r300_parse_chipset(caps);
 
     r300screen->caps = caps;
+    r300screen->radeon_winsys = radeon_winsys;
     r300screen->screen.winsys = (struct pipe_winsys*)radeon_winsys;
     r300screen->screen.destroy = r300_destroy_screen;
     r300screen->screen.get_name = r300_get_name;
@@ -398,6 +400,7 @@ struct pipe_screen* r300_create_screen(struct radeon_winsys* radeon_winsys)
     r300screen->screen.get_param = r300_get_param;
     r300screen->screen.get_paramf = r300_get_paramf;
     r300screen->screen.is_format_supported = r300_is_format_supported;
+    r300screen->screen.context_create = r300_create_context;
     r300screen->screen.get_tex_transfer = r300_get_tex_transfer;
     r300screen->screen.tex_transfer_destroy = r300_tex_transfer_destroy;
     r300screen->screen.transfer_map = r300_transfer_map;
index 580fda3984e48188496651f54fcb16a167a87fb4..502fbfa5a24a1ce4ed6ba74cbb2954cfac5007b6 100644 (file)
@@ -33,6 +33,8 @@ struct r300_screen {
     /* Parent class */
     struct pipe_screen screen;
 
+    struct radeon_winsys* radeon_winsys;
+
     /* Chipset capabilities */
     struct r300_capabilities* caps;
 
@@ -60,9 +62,6 @@ r300_transfer(struct pipe_transfer* transfer)
     return (struct r300_transfer*)transfer;
 }
 
-/* Creates a new r300 screen. */
-struct pipe_screen* r300_create_screen(struct radeon_winsys* radeon_winsys);
-
 /* Debug functionality. */
 
 /**
index d4842e94ae90db2bbb5f9f9221006c76d63a744a..f4a8ae120c89df90663d0ac572b7056764174b16 100644 (file)
@@ -29,7 +29,7 @@ extern "C" {
 
 /* The public interface header for the r300 pipe driver.
  * Any winsys hosting this pipe needs to implement r300_winsys and then
- * call r300_create_context to start things. */
+ * call r300_create_screen to start things. */
 
 #include "pipe/p_defines.h"
 #include "pipe/p_state.h"
@@ -37,8 +37,9 @@ extern "C" {
 
 #include "radeon_winsys.h"
 
-struct pipe_context* r300_create_context(struct pipe_screen* screen,
-                                         struct radeon_winsys* radeon_winsys);
+/* Creates a new r300 screen. */
+struct pipe_screen* r300_create_screen(struct radeon_winsys* radeon_winsys);
+
 
 boolean r300_get_texture_buffer(struct pipe_screen* screen,
                                 struct pipe_texture* texture,
index b1cfe59bc1847e1b9a3b7e0e846a5d635c4a1579..480b269e7f53d86d5ee11269b6c5ab4ef99afedc 100644 (file)
@@ -194,7 +194,8 @@ softpipe_render_condition( struct pipe_context *pipe,
 
 
 struct pipe_context *
-softpipe_create( struct pipe_screen *screen )
+softpipe_create_context( struct pipe_screen *screen,
+                        void *priv )
 {
    struct softpipe_context *softpipe = CALLOC_STRUCT(softpipe_context);
    uint i;
@@ -213,6 +214,7 @@ softpipe_create( struct pipe_screen *screen )
    softpipe->pipe.winsys = screen->winsys;
    softpipe->pipe.screen = screen;
    softpipe->pipe.destroy = softpipe_destroy;
+   softpipe->pipe.priv = priv;
 
    /* state setters */
    softpipe->pipe.create_blend_state = softpipe_create_blend_state;
index be4613b6228100d2a46e6c1153b8c2cbc303b161..62f9e7aad3d7dc6b5aa74b995be7a792b41f7b68 100644 (file)
@@ -166,5 +166,8 @@ softpipe_context( struct pipe_context *pipe )
 void
 softpipe_reset_sampler_varients(struct softpipe_context *softpipe);
 
+struct pipe_context *
+softpipe_create_context( struct pipe_screen *, void *priv );
+
 
 #endif /* SP_CONTEXT_H */
index ee6969e60fb2b04782bc60a46447e91c0a63783f..87415f434048e97e673a555b7268b5ec1fbf4f2b 100644 (file)
@@ -35,6 +35,7 @@
 #include "sp_texture.h"
 #include "sp_winsys.h"
 #include "sp_screen.h"
+#include "sp_context.h"
 
 
 static const char *
@@ -204,6 +205,7 @@ softpipe_create_screen(struct pipe_winsys *winsys)
    screen->base.get_param = softpipe_get_param;
    screen->base.get_paramf = softpipe_get_paramf;
    screen->base.is_format_supported = softpipe_is_format_supported;
+   screen->base.context_create = softpipe_create_context;
 
    softpipe_init_screen_texture_funcs(&screen->base);
    u_simple_screen_init(&screen->base);
index 7a8b132ddcdf775c2180a848fce7cf79ef3cadfc..f3dab83fa611c6847f788e28a8441f45e7b482c4 100644 (file)
@@ -250,7 +250,7 @@ sp_mpeg12_create(struct pipe_screen *screen, enum pipe_video_profile profile,
    ctx->base.set_decode_target = sp_mpeg12_set_decode_target;
    ctx->base.set_csc_matrix = sp_mpeg12_set_csc_matrix;
 
-   ctx->pipe = softpipe_create(screen);
+   ctx->pipe = screen->context_create(screen, NULL);
    if (!ctx->pipe) {
       FREE(ctx);
       return NULL;
index 3042e01a05c9df1d245e8bdb44a657d649f6ee9a..6e3920c49b2647536d463a2be29135bf2c120841 100644 (file)
@@ -47,7 +47,6 @@ struct pipe_texture;
 struct pipe_buffer;
 
 
-struct pipe_context *softpipe_create( struct pipe_screen * );
 
 /**
  * Create a softpipe screen that uses the
index c4181c3f5b77e26acd05c3a974c7be1f42702d1d..d499ae6acc9fe0b6651e3e41ee54eab1dfb08f5d 100644 (file)
@@ -126,7 +126,8 @@ svga_is_buffer_referenced( struct pipe_context *pipe,
 }
 
 
-struct pipe_context *svga_context_create( struct pipe_screen *screen )
+struct pipe_context *svga_context_create( struct pipe_screen *screen,
+                                         void *priv )
 {
    struct svga_screen *svgascreen = svga_screen(screen);
    struct svga_context *svga = NULL;
@@ -138,6 +139,7 @@ struct pipe_context *svga_context_create( struct pipe_screen *screen )
 
    svga->pipe.winsys = screen->winsys;
    svga->pipe.screen = screen;
+   svga->pipe.priv = priv;
    svga->pipe.destroy = svga_destroy;
    svga->pipe.clear = svga_clear;
 
index ba86256eb268d507fbadc07b4735e152a7b0d015..e93acc5f9f75988b97e90cdc0d129a3053795942 100644 (file)
@@ -426,6 +426,10 @@ void svga_context_flush( struct svga_context *svga,
 
 void svga_hwtnl_flush_retry( struct svga_context *svga );
 
+struct pipe_context *
+svga_context_create(struct pipe_screen *screen,
+                   void *priv);
+
 
 /***********************************************************************
  * Inline conversion functions.  These are better-typed than the
index 6933d5156293dc5a39eba6232709899cb7bfd0c5..5e11163d180f3f8e23b7597ab7096ee8df71ef5f 100644 (file)
@@ -366,6 +366,7 @@ svga_screen_create(struct svga_winsys_screen *sws)
    screen->get_param = svga_get_param;
    screen->get_paramf = svga_get_paramf;
    screen->is_format_supported = svga_is_format_supported;
+   screen->context_create = svga_context_create;
    screen->fence_reference = svga_fence_reference;
    screen->fence_signalled = svga_fence_signalled;
    screen->fence_finish = svga_fence_finish;
index 27b99fe4c102f715e0f88e8bf03dbcd9d7d2b229..b4e3af0eafce0a3de88b5074da34b5e2f39df5f2 100644 (file)
@@ -272,9 +272,6 @@ struct svga_winsys_screen
 };
 
 
-struct pipe_context *
-svga_context_create(struct pipe_screen *screen);
-
 struct pipe_screen *
 svga_screen_create(struct svga_winsys_screen *sws);
 
index 5a9f0fc69016beeabc17b4e8473af3e6ef7551c1..34ceaa41c15b247c5fff6de9ca4f570bc8cda035 100644 (file)
@@ -1236,12 +1236,10 @@ static const struct debug_named_value rbug_blocker_flags[] = {
 };
 
 struct pipe_context *
-trace_context_create(struct pipe_screen *_screen,
+trace_context_create(struct trace_screen *tr_scr,
                      struct pipe_context *pipe)
 {
-   struct trace_screen *tr_scr;
    struct trace_context *tr_ctx;
-   struct pipe_screen *screen;
 
    if(!pipe)
       goto error1;
@@ -1249,13 +1247,13 @@ trace_context_create(struct pipe_screen *_screen,
    if(!trace_enabled())
       goto error1;
 
-   tr_scr = trace_screen(_screen);
-   screen = tr_scr->screen;
-
    tr_ctx = CALLOC_STRUCT(trace_context);
    if(!tr_ctx)
       goto error1;
 
+   tr_ctx->base.winsys = NULL;
+   tr_ctx->base.priv = pipe->priv; /* expose wrapped priv data */
+   tr_ctx->base.screen = &tr_scr->base;
    tr_ctx->draw_blocker = debug_get_flags_option("RBUG_BLOCK",
                                                  rbug_blocker_flags,
                                                  0);
@@ -1264,8 +1262,6 @@ trace_context_create(struct pipe_screen *_screen,
    pipe_mutex_init(tr_ctx->list_mutex);
    make_empty_list(&tr_ctx->shaders);
 
-   tr_ctx->base.winsys = _screen->winsys;
-   tr_ctx->base.screen = _screen;
    tr_ctx->base.destroy = trace_context_destroy;
    tr_ctx->base.draw_arrays = trace_context_draw_arrays;
    tr_ctx->base.draw_elements = trace_context_draw_elements;
@@ -1316,11 +1312,6 @@ trace_context_create(struct pipe_screen *_screen,
 
    tr_ctx->pipe = pipe;
 
-   trace_dump_call_begin("", "pipe_context_create");
-   trace_dump_arg(ptr, screen);
-   trace_dump_ret(ptr, pipe);
-   trace_dump_call_end();
-
    trace_screen_add_to_list(tr_scr, contexts, tr_ctx);
 
    return &tr_ctx->base;
index 852b480765a03deb12402d543af51ff18ab6943c..142842324857db3b6d1b174eed8085fbcc6445c1 100644 (file)
@@ -40,6 +40,8 @@ extern "C" {
 #endif
 
 
+struct trace_screen;
+   
 struct trace_context
 {
    struct pipe_context base;
@@ -95,9 +97,8 @@ trace_context(struct pipe_context *pipe)
 }
 
 
-
 struct pipe_context *
-trace_context_create(struct pipe_screen *screen,
+trace_context_create(struct trace_screen *tr_scr,
                      struct pipe_context *pipe);
 
 void
index e7ca3a86eadf081f3538769aeab753fa8f0d85b6..919dc1b309fdac7c7537476e70c15190f14cf86e 100644 (file)
@@ -65,24 +65,6 @@ trace_drm_create_screen(struct drm_api *_api, int fd,
    return trace_screen_create(screen);
 }
 
-static struct pipe_context *
-trace_drm_create_context(struct drm_api *_api,
-                         struct pipe_screen *_screen)
-{
-   struct trace_screen *tr_screen = trace_screen(_screen);
-   struct trace_drm_api *tr_api = trace_drm_api(_api);
-   struct pipe_screen *screen = tr_screen->screen;
-   struct drm_api *api = tr_api->api;
-   struct pipe_context *pipe;
-
-   /* TODO trace call */
-
-   pipe = api->create_context(api, screen);
-
-   pipe = trace_context_create(_screen, pipe);
-
-   return pipe;
-}
 
 static struct pipe_texture *
 trace_drm_texture_from_shared_handle(struct drm_api *_api,
@@ -175,7 +157,6 @@ trace_drm_create(struct drm_api *api)
 
    tr_api->base.driver_name = api->driver_name;
    tr_api->base.create_screen = trace_drm_create_screen;
-   tr_api->base.create_context = trace_drm_create_context;
    tr_api->base.texture_from_shared_handle = trace_drm_texture_from_shared_handle;
    tr_api->base.shared_handle_from_texture = trace_drm_shared_handle_from_texture;
    tr_api->base.local_handle_from_texture = trace_drm_local_handle_from_texture;
index 6cdb4c04a81e86c14116cac9d6ea8a6a0f4cfb7b..388d83eb5c217bf0c0fee36aaa38f6b05d3f28a1 100644 (file)
@@ -33,6 +33,7 @@
 #include "tr_dump.h"
 #include "tr_dump_state.h"
 #include "tr_texture.h"
+#include "tr_context.h"
 #include "tr_screen.h"
 
 #include "util/u_inlines.h"
@@ -159,6 +160,29 @@ trace_screen_is_format_supported(struct pipe_screen *_screen,
 }
 
 
+static struct pipe_context *
+trace_screen_context_create(struct pipe_screen *_screen, void *priv)
+{
+   struct trace_screen *tr_scr = trace_screen(_screen);
+   struct pipe_screen *screen = tr_scr->screen;
+   struct pipe_context *result;
+
+   trace_dump_call_begin("pipe_screen", "context_create");
+
+   trace_dump_arg(ptr, screen);
+
+   result = screen->context_create(screen, priv);
+
+   trace_dump_ret(ptr, result);
+
+   trace_dump_call_end();
+
+   result = trace_context_create(tr_scr, result);
+
+   return result;
+}
+
+
 static void
 trace_screen_flush_frontbuffer(struct pipe_screen *_screen,
                                struct pipe_surface *_surface,
@@ -904,6 +928,8 @@ trace_screen_create(struct pipe_screen *screen)
    tr_scr->base.get_param = trace_screen_get_param;
    tr_scr->base.get_paramf = trace_screen_get_paramf;
    tr_scr->base.is_format_supported = trace_screen_is_format_supported;
+   assert(screen->context_create);
+   tr_scr->base.context_create = trace_screen_context_create;
    tr_scr->base.texture_create = trace_screen_texture_create;
    tr_scr->base.texture_blanket = trace_screen_texture_blanket;
    tr_scr->base.texture_destroy = trace_screen_texture_destroy;
index b8e001a6b01aafa95cbd27cc434eb0419b19afed..48625bf31278dc33c488e701c6cba34dc8d97e50 100644 (file)
@@ -86,6 +86,9 @@ struct pipe_screen {
     */
    float (*get_paramf)( struct pipe_screen *, int param );
 
+   struct pipe_context * (*context_create)( struct pipe_screen *,
+                                           void *priv );
+   
    /**
     * Check if the given pipe_format is supported as a texture or
     * drawing surface.
index b248a81880866e4e25e6e31713383c06ab5d8a89..e9fa9b4d2a3ba66a989be7320183fba71406d5dd 100644 (file)
@@ -41,8 +41,6 @@ struct drm_api
        /*@{*/
        struct pipe_screen*  (*create_screen)(struct drm_api *api, int drm_fd,
                                              struct drm_create_screen_arg *arg);
-       struct pipe_context* (*create_context)(struct drm_api *api,
-                                              struct pipe_screen *screen);
        /*@}*/
 
        /**
index 07f0554cc0d84966fa8595ce83f8221bbef9a363..6edbd9d9b157badd141ad2b13425c4fa597d1c48 100644 (file)
@@ -69,14 +69,12 @@ dri_create_context(const __GLcontextModes * visual,
    driParseConfigFiles(&ctx->optionCache,
                       &screen->optionCache, sPriv->myNum, "dri");
 
-   ctx->pipe = screen->api->create_context(screen->api, screen->pipe_screen);
+   ctx->pipe = screen->pipe_screen->create_context( screen->pipe_screen,
+                                                   ctx );
 
    if (ctx->pipe == NULL)
       goto fail;
 
-   /* used in dri_flush_frontbuffer */
-   ctx->pipe->priv = ctx;
-
    ctx->st = st_create_context(ctx->pipe, visual, st_share);
    if (ctx->st == NULL)
       goto fail;
index 70216177bdb25876c6549ed67c07372ef7a53d9d..424be4931177068bf70a9bee00cef07bf979356b 100644 (file)
@@ -645,8 +645,11 @@ egl_g3d_create_context(_EGLDriver *drv, _EGLDisplay *dpy, _EGLConfig *conf,
    }
 
    mode = &gconf->native->mode;
-   gctx->pipe =
-      gdpy->native->create_context(gdpy->native, (void *) &gctx->base);
+
+   gctx->pipe = gdpy->native->screen->create_context(
+      gdpy->native->screen,
+      (void *) &gctx->base);
+
    if (!gctx->pipe) {
       free(gctx);
       return NULL;
index 72a9cec7ef1ab830b8661de4108adbe23275607a..4f9758545abab6e0e876377ab5d4702e14f54dd9 100644 (file)
@@ -167,11 +167,6 @@ struct native_display {
                                   EGLNativePixmapType pix,
                                   const struct native_config *nconf);
 
-   /**
-    * Create a pipe context.
-    */
-   struct pipe_context *(*create_context)(struct native_display *ndpy,
-                                          void *context_private);
 
    /**
     * Create a window surface.  Required unless no config has GLX_WINDOW_BIT
index 445c28c383c581d72d0e7081bc564f2b29e4e9e0..91cefc538d14a76696a9a699cc9f16a1886f9593 100644 (file)
@@ -575,17 +575,6 @@ kms_display_create_pbuffer_surface(struct native_display *ndpy,
    return &ksurf->base;
 }
 
-static struct pipe_context *
-kms_display_create_context(struct native_display *ndpy, void *context_private)
-{
-   struct kms_display *kdpy = kms_display(ndpy);
-   struct pipe_context *pctx;
-
-   pctx = kdpy->api->create_context(kdpy->api, kdpy->base.screen);
-   if (pctx)
-      pctx->priv = context_private;
-   return pctx;
-}
 
 static boolean
 kms_display_is_format_supported(struct native_display *ndpy,
@@ -814,7 +803,6 @@ kms_create_display(EGLNativeDisplayType dpy, struct drm_api *api)
 
    kdpy->base.destroy = kms_display_destroy;
    kdpy->base.get_configs = kms_display_get_configs;
-   kdpy->base.create_context = kms_display_create_context;
    kdpy->base.create_pbuffer_surface = kms_display_create_pbuffer_surface;
 
    kdpy->base.modeset = &kms_display_modeset;
index b2eba7219f44d7a8ffcb9d4f1b5e3be6cc3e3c91..5f2fd41260434a319144449ee091ec7b4316f5d3 100644 (file)
@@ -402,18 +402,6 @@ dri2_display_create_pbuffer_surface(struct native_display *ndpy,
    return (dri2surf) ? &dri2surf->base : NULL;
 }
 
-static struct pipe_context *
-dri2_display_create_context(struct native_display *ndpy, void *context_private)
-{
-   struct dri2_display *dri2dpy = dri2_display(ndpy);
-   struct pipe_context *pctx;
-
-   pctx = dri2dpy->api->create_context(dri2dpy->api, dri2dpy->base.screen);
-   if (pctx)
-      pctx->priv = context_private;
-   return pctx;
-}
-
 static int
 choose_color_format(const __GLcontextModes *mode, enum pipe_format formats[32])
 {
@@ -697,7 +685,6 @@ x11_create_dri2_display(EGLNativeDisplayType dpy, struct drm_api *api)
    dri2dpy->base.destroy = dri2_display_destroy;
    dri2dpy->base.get_configs = dri2_display_get_configs;
    dri2dpy->base.is_pixmap_supported = dri2_display_is_pixmap_supported;
-   dri2dpy->base.create_context = dri2_display_create_context;
    dri2dpy->base.create_window_surface = dri2_display_create_window_surface;
    dri2dpy->base.create_pixmap_surface = dri2_display_create_pixmap_surface;
    dri2dpy->base.create_pbuffer_surface = dri2_display_create_pbuffer_surface;
index 7946415ce77fbdd102fa3eb19d8661d7efad3c4b..92a62f230e00aa02449b35c81d4689d643c6f326 100644 (file)
@@ -492,16 +492,6 @@ ximage_display_create_pbuffer_surface(struct native_display *ndpy,
    return (xsurf) ? &xsurf->base : NULL;
 }
 
-static struct pipe_context *
-ximage_display_create_context(struct native_display *ndpy,
-                              void *context_private)
-{
-   struct pipe_context *pctx = softpipe_create(ndpy->screen);
-   if (pctx)
-      pctx->priv = context_private;
-   return pctx;
-}
-
 static enum pipe_format
 choose_format(const XVisualInfo *vinfo)
 {
@@ -686,7 +676,6 @@ x11_create_ximage_display(EGLNativeDisplayType dpy, boolean use_xshm)
 
    xdpy->base.get_configs = ximage_display_get_configs;
    xdpy->base.is_pixmap_supported = ximage_display_is_pixmap_supported;
-   xdpy->base.create_context = ximage_display_create_context;
    xdpy->base.create_window_surface = ximage_display_create_window_surface;
    xdpy->base.create_pixmap_surface = ximage_display_create_pixmap_surface;
    xdpy->base.create_pbuffer_surface = ximage_display_create_pbuffer_surface;
index 1783bc504d91bec3b87668b0c1bedd39276efbe9..fb314f3b528f1cc2776cc0476b7123c51b6fcd70 100644 (file)
@@ -760,7 +760,6 @@ PUBLIC
 XMesaContext XMesaCreateContext( XMesaVisual v, XMesaContext share_list )
 {
    static GLboolean firstTime = GL_TRUE;
-   struct pipe_context *_pipe = NULL;
    struct pipe_context *pipe = NULL;
    XMesaContext c;
    GLcontext *mesaCtx;
@@ -788,11 +787,12 @@ XMesaContext XMesaCreateContext( XMesaVisual v, XMesaContext share_list )
    if (screen == NULL)
       goto fail;
 
-   _pipe = driver.create_pipe_context(_screen, (void *) c);
-   if (_pipe == NULL)
+   /* Trace screen knows how to properly wrap context creation in the
+    * wrapped screen, so nothing special to do here:
+    */
+   pipe = screen->context_create(screen, (void *) c);
+   if (pipe == NULL)
       goto fail;
-   pipe = trace_context_create(screen, _pipe);
-   pipe->priv = c;
 
    c->st = st_create_context(pipe, 
                              &v->mesa_visual,
index 0e57605c34b33ea4d9edd8ab45ffab2a758decfe..4bd5b5c8d3b5dc24f84baaa665c121d98bae82c1 100644 (file)
@@ -39,13 +39,6 @@ struct xm_driver {
 
    struct pipe_screen *(*create_pipe_screen)( void );
 
-   /* The context_private argument needs to go away.  Is currently used
-    * in a round-about way to associate a display-target surface with its
-    * Xlib window.
-    */
-   struct pipe_context *(*create_pipe_context)( struct pipe_screen *,
-                                                void *context_private );
-
    void (*display_surface)( struct xmesa_buffer *, 
                             struct pipe_surface * );
 
index 467e20207a399c6f174dfb123c2a524c92ac8d15..1146a8b0c380b109dd4a0a27e0df7b8a398c5b9d 100644 (file)
@@ -80,8 +80,7 @@ st_device_create_from_st_winsys(const struct st_winsys *st_ws)
 {
    struct st_device *st_dev;
    
-   if(!st_ws->screen_create ||
-      !st_ws->context_create)
+   if(!st_ws->screen_create)
       return NULL;
    
    st_dev = CALLOC_STRUCT(st_device);
@@ -158,13 +157,7 @@ st_context_create(struct st_device *st_dev)
    
    st_device_reference(&st_ctx->st_dev, st_dev);
    
-   st_ctx->real_pipe = st_dev->st_ws->context_create(st_dev->real_screen);
-   if(!st_ctx->real_pipe) {
-      st_context_destroy(st_ctx);
-      return NULL;
-   }
-   
-   st_ctx->pipe = trace_context_create(st_dev->screen, st_ctx->real_pipe);
+   st_ctx->pipe = st_dev->screen->create_context(st_dev->screen, NULL);
    if(!st_ctx->pipe) {
       st_context_destroy(st_ctx);
       return NULL;
index f786e1341189ac1b32c15eb26658b0fe6eb6879d..de9e0215d8e881ae66b24400818333d239db5b36 100644 (file)
@@ -50,7 +50,6 @@ struct st_surface
 struct st_context {
    struct st_device *st_dev;
    
-   struct pipe_context *real_pipe;
    struct pipe_context *pipe;
    
    struct cso_context *cso;
index 43aaaabf2a194f838baf8ae7eb7743860a1e31b0..a3110a19d5d996fa2b9ca6ded44ae72fa17819a7 100644 (file)
@@ -217,21 +217,6 @@ st_hardpipe_screen_create(void)
 }
 
 
-static struct pipe_context *
-st_hardpipe_context_create(struct pipe_screen *screen)
-{
-   if(st_hardpipe_load()) {
-      if(screen == pfnGetGalliumScreenMESA())
-         return pfnCreateGalliumContextMESA();
-      else
-         return NULL;
-   }
-   else
-      return st_softpipe_winsys.context_create(screen);
-}
-
-
 const struct st_winsys st_hardpipe_winsys = {
-   &st_hardpipe_screen_create,
-   &st_hardpipe_context_create
+   &st_hardpipe_screen_create
 };
index c5ee1679f04275ba546671c04d4fed5cc6404630..5d83b5a9e151c7b5039e76c22c25a4fab85d1a75 100644 (file)
@@ -135,14 +135,7 @@ no_winsys:
 }
 
 
-static struct pipe_context *
-st_llvmpipe_context_create(struct pipe_screen *screen)
-{
-   return llvmpipe_create(screen);
-}
-
 
 const struct st_winsys st_softpipe_winsys = {
-   &st_llvmpipe_screen_create,
-   &st_llvmpipe_context_create,
+   &st_llvmpipe_screen_create
 };
index dfe3e465f7785ae001e7e97784b53d13c91bf101..81676bc3a4fdde1cf12cc3966a81edbd0d42936f 100644 (file)
@@ -39,6 +39,5 @@
 #include "st_winsys.h"
 
 const struct st_winsys st_softpipe_winsys = {
-   &softpipe_create_screen_malloc,
-   &softpipe_create,
+   &softpipe_create_screen_malloc
 };
index b8cb612d863fedbce2d853d2499ea1962d0a2d96..0c7b6a200e118264b89b37537e2a59f86bb5fdf7 100644 (file)
@@ -38,9 +38,6 @@ struct st_winsys
 {
    struct pipe_screen *
    (*screen_create)(void);
-
-   struct pipe_context *
-   (*context_create)(struct pipe_screen *screen);
 };
 
 
index f2f0264844a73c26707904c487022ff298fdb9a5..0785d2c6b859f2436e52bb726ed9c8bac5d06b2b 100644 (file)
 #include "state_tracker/st_context.h"
 #include "state_tracker/st_public.h"
 
-#ifdef DEBUG
-#include "trace/tr_screen.h"
-#include "trace/tr_context.h"
-#endif
-
 #include "stw_icd.h"
 #include "stw_device.h"
 #include "stw_winsys.h"
@@ -152,7 +147,6 @@ DrvCreateLayerContext(
    const struct stw_pixelformat_info *pfi;
    GLvisual visual;
    struct stw_context *ctx = NULL;
-   struct pipe_screen *screen = NULL;
    struct pipe_context *pipe = NULL;
    
    if(!stw_dev)
@@ -175,28 +169,12 @@ DrvCreateLayerContext(
    ctx->hdc = hdc;
    ctx->iPixelFormat = iPixelFormat;
 
-   screen = stw_dev->screen;
-
-#ifdef DEBUG
-   /* Unwrap screen */
-   if(stw_dev->trace_running)
-      screen = trace_screen(screen)->screen;
-#endif
-
-   pipe = stw_dev->stw_winsys->create_context( screen );
+   /* priv == hdc, pass to stw_flush_frontbuffer as context_private
+    */
+   pipe = stw_dev->screen->context_create( stw_dev->screen, hdc );
    if (pipe == NULL) 
       goto no_pipe;
 
-#ifdef DEBUG
-   /* Wrap context */
-   if(stw_dev->trace_running)
-      pipe = trace_context_create(stw_dev->screen, pipe);
-#endif
-
-   /* pass to stw_flush_frontbuffer as context_private */
-   assert(!pipe->priv);
-   pipe->priv = hdc;
-
    ctx->st = st_create_context( pipe, &visual, NULL );
    if (ctx->st == NULL) 
       goto no_st_ctx;
index fb30ec5dba9102c0d0918a29fe7df652576be55f..8dd63f124ad60e670b529f394e3349aa0ebe040e 100644 (file)
@@ -48,32 +48,8 @@ wglGetGalliumScreenMESA(void)
 struct pipe_context * APIENTRY
 wglCreateGalliumContextMESA(void)
 {
-   struct pipe_screen *screen = NULL;
-   struct pipe_context *pipe = NULL;
-
    if(!stw_dev)
       return NULL;
 
-   screen = stw_dev->screen;
-
-#ifdef DEBUG
-   /* Unwrap screen */
-   if(stw_dev->trace_running)
-      screen = trace_screen(screen)->screen;
-#endif
-
-   pipe = stw_dev->stw_winsys->create_context( screen );
-   if (pipe == NULL)
-      goto no_pipe;
-
-#ifdef DEBUG
-   /* Wrap context */
-   if(stw_dev->trace_running)
-      pipe = trace_context_create(stw_dev->screen, pipe);
-#endif
-
-   return pipe;
-
-no_pipe:
-   return NULL;
+   return stw_dev->screen->context_create( stw_dev->screen, NULL );
 }
index 1de6e906d0df1e7277b1282b36ebd711a822eb90..270fad56a19dd28fd5f87853815a630b60f35f5a 100644 (file)
@@ -43,9 +43,6 @@ struct stw_winsys
    struct pipe_screen *
    (*create_screen)( void );
 
-   struct pipe_context *
-   (*create_context)( struct pipe_screen *screen );
-
    /**
     * Present the color buffer to the window associated with the device context.
     */
index 70af0c5fed3502377e1458283e97f777b21badbd..ae66c4baa91c5f1cffb28f4cfad05f6cd6f93297 100644 (file)
@@ -1061,7 +1061,10 @@ xorg_exa_init(ScrnInfoPtr pScrn, Bool accel)
    }
 
    exa->scrn = ms->screen;
-   exa->pipe = ms->api->create_context(ms->api, exa->scrn);
+   exa->pipe = exa->scrn->context_create(exa->scrn, NULL);
+   if (exa->pipe == NULL)
+      goto out_err;
+
    /* Share context with DRI */
    ms->ctx = exa->pipe;
 
index 9a2203fc6d732dd9ffe799f823afec7988d2fc70..a061eef0beb2a1ad8691d86ec47752cbced839bb 100644 (file)
@@ -212,11 +212,6 @@ i965_libdrm_create_screen(struct drm_api *api, int drmFD,
    return brw_create_screen(&idws->base, deviceID);
 }
 
-static struct pipe_context *
-i965_libdrm_create_context(struct drm_api *api, struct pipe_screen *screen)
-{
-   return brw_create_context(screen);
-}
 
 static void
 destroy(struct drm_api *api)
@@ -229,7 +224,6 @@ destroy(struct drm_api *api)
 struct drm_api i965_libdrm_api =
 {
    .name = "i965",
-   .create_context = i965_libdrm_create_context,
    .create_screen = i965_libdrm_create_screen,
    .texture_from_shared_handle = i965_libdrm_texture_from_shared_handle,
    .shared_handle_from_texture = i965_libdrm_shared_handle_from_texture,
index d2b9a1ab31179ebcd26eb0d85af2dde7766cdbe7..74501eeb16f7e87af4de21e50fd535f65c835e27 100644 (file)
@@ -469,31 +469,12 @@ fail:
 }
 
 
-static struct pipe_context *
-xlib_create_i965_context( struct pipe_screen *screen,
-                          void *context_private )
-{
-   struct pipe_context *pipe;
-   
-   pipe = brw_create_context(screen);
-   if (pipe == NULL)
-      goto fail;
-
-   pipe->priv = context_private;
-   return pipe;
-
-fail:
-   /* Free stuff here */
-   return NULL;
-}
-
 
 
 
 struct xm_driver xlib_i965_driver = 
 {
    .create_pipe_screen = xlib_create_i965_screen,
-   .create_pipe_context = xlib_create_i965_context,
    .display_surface = xlib_i965_display_surface
 };
 
index 118afc33950b713ae1c85c45da91779e1770477b..4f4d4bb86b20d1dbcbc826bf888ed9c7019539ed 100644 (file)
@@ -182,12 +182,6 @@ intel_drm_create_screen(struct drm_api *api, int drmFD,
    return i915_create_screen(&idws->base, deviceID);
 }
 
-static struct pipe_context *
-intel_drm_create_context(struct drm_api *api, struct pipe_screen *screen)
-{
-   return i915_create_context(screen);
-}
-
 static void
 destroy(struct drm_api *api)
 {
@@ -198,7 +192,6 @@ struct drm_api intel_drm_api =
 {
    .name = "i915",
    .driver_name = "i915",
-   .create_context = intel_drm_create_context,
    .create_screen = intel_drm_create_screen,
    .texture_from_shared_handle = intel_drm_texture_from_shared_handle,
    .shared_handle_from_texture = intel_drm_shared_handle_from_texture,
index 8e5f821c8a36aadea7aab0a2341a07150c080fe4..c814d986b1daa61451f202289b664ef76c81b425 100644 (file)
@@ -61,7 +61,6 @@ nouveau_drm_destroy_winsys(struct pipe_winsys *s)
        struct nouveau_winsys *nv_winsys = nouveau_winsys(s);
        struct nouveau_screen *nv_screen= nouveau_screen(nv_winsys->pscreen);
        nouveau_device_close(&nv_screen->device);
-       FREE(nv_winsys->pctx);
        FREE(nv_winsys);
 }
 
@@ -143,49 +142,6 @@ nouveau_drm_create_screen(struct drm_api *api, int fd,
        return nvws->pscreen;
 }
 
-static struct pipe_context *
-nouveau_drm_create_context(struct drm_api *api, struct pipe_screen *pscreen)
-{
-       struct nouveau_winsys *nvws = nouveau_winsys_screen(pscreen);
-       struct pipe_context *(*init)(struct pipe_screen *, unsigned);
-       unsigned chipset = nouveau_screen(pscreen)->device->chipset;
-       int i;
-
-       switch (chipset & 0xf0) {
-       case 0x30:
-               init = nv30_create;
-               break;
-       case 0x40:
-       case 0x60:
-               init = nv40_create;
-               break;
-       case 0x50:
-       case 0x80:
-       case 0x90:
-       case 0xa0:
-               init = nv50_create;
-               break;
-       default:
-               debug_printf("%s: unknown chipset nv%02x\n", __func__, chipset);
-               return NULL;
-       }
-
-       /* Find a free slot for a pipe context, allocate a new one if needed */
-       for (i = 0; i < nvws->nr_pctx; i++) {
-               if (nvws->pctx[i] == NULL)
-                       break;
-       }
-
-       if (i == nvws->nr_pctx) {
-               nvws->nr_pctx++;
-               nvws->pctx = realloc(nvws->pctx,
-                                     sizeof(*nvws->pctx) * nvws->nr_pctx);
-       }
-
-       nvws->pctx[i] = init(pscreen, i);
-       return nvws->pctx[i];
-}
-
 static struct pipe_texture *
 nouveau_drm_pt_from_name(struct drm_api *api, struct pipe_screen *pscreen,
                         struct pipe_texture *templ, const char *name,
@@ -251,7 +207,6 @@ struct drm_api drm_api_hooks = {
        .name = "nouveau",
        .driver_name = "nouveau",
        .create_screen = nouveau_drm_create_screen,
-       .create_context = nouveau_drm_create_context,
        .texture_from_shared_handle = nouveau_drm_pt_from_name,
        .shared_handle_from_texture = nouveau_drm_name_from_pt,
        .local_handle_from_texture = nouveau_drm_handle_from_pt,
index a32f2907b37ef082670dd18894450ca3b78f133b..a91aad7df8e8bdb4a8ae115f7d9e4930665b0399 100644 (file)
@@ -13,9 +13,6 @@ struct nouveau_winsys {
 
        struct pipe_screen *pscreen;
 
-       unsigned nr_pctx;
-       struct pipe_context **pctx;
-
        struct pipe_surface *front;
 };
 
index bff6fdc1ad060e00cd53df3f2fafd158a48c7574..d1cb6493668deab153e810be315a76b69093ac15 100644 (file)
@@ -137,19 +137,6 @@ struct pipe_screen* radeon_create_screen(struct drm_api* api,
     }
 }
 
-/* Create a pipe_context. */
-struct pipe_context* radeon_create_context(struct drm_api* api,
-                                           struct pipe_screen* screen)
-{
-    struct radeon_winsys* rwinsys = (struct radeon_winsys*)screen->winsys;
-
-    if (!is_r3xx(rwinsys->pci_id) ||
-        debug_get_bool_option("RADEON_SOFTPIPE", FALSE)) {
-        return softpipe_create(screen);
-    } else {
-        return r300_create_context(screen, rwinsys);
-    }
-}
 
 boolean radeon_buffer_from_texture(struct drm_api* api,
                                    struct pipe_screen* screen,
@@ -272,7 +259,6 @@ struct drm_api drm_api_hooks = {
     .name = "radeon",
     .driver_name = "radeon",
     .create_screen = radeon_create_screen,
-    .create_context = radeon_create_context,
     .texture_from_shared_handle = radeon_texture_from_shared_handle,
     .shared_handle_from_texture = radeon_shared_handle_from_texture,
     .local_handle_from_texture = radeon_local_handle_from_texture,
index 077388ee028a2d497e25bb96f27c91596963b4a0..8d74cbafc2fe4f3673855675389aa78e1a3f18b8 100644 (file)
@@ -52,8 +52,6 @@ struct pipe_screen* radeon_create_screen(struct drm_api* api,
                                          int drmFB,
                                         struct drm_create_screen_arg *arg);
 
-struct pipe_context* radeon_create_context(struct drm_api* api,
-                                           struct pipe_screen* screen);
 
 boolean radeon_buffer_from_texture(struct drm_api* api,
                                    struct pipe_screen* screen,
index c3ec24aaf78e5668b5f15c984036773a925eee77..fc63081a4cc585beea7d6173e936fd727b4b80ad 100644 (file)
@@ -124,17 +124,9 @@ error:
 }
 
 
-static struct pipe_context *
-radeon_hardpipe_context_create(struct pipe_screen *screen)
-{
-   /* FIXME: create a radon pipe_context from screen */
-
-   return NULL;
-}
 
 
 const struct st_winsys st_hardpipe_winsys = {
    &radeon_hardpipe_screen_create,
-   &radeon_hardpipe_context_create,
 };
 
index b5fd4f5a6a17aa251e304b231fa8774eb128bb33..90ffc4868f7b429caa8cca34c3b2c25f3aba5987 100644 (file)
@@ -380,8 +380,3 @@ vmw_svga_winsys_context_create(struct svga_winsys_screen *sws)
 }
 
 
-struct pipe_context *
-vmw_svga_context_create(struct pipe_screen *screen)
-{
-   return svga_context_create(screen);
-}
index 305ce9b5bec9cd43d819485b9e6ef818ddbe1aa1..d4884d24e996064b0b42aa1315ce749b77ae505b 100644 (file)
@@ -52,8 +52,5 @@ struct pipe_screen;
 struct svga_winsys_context *
 vmw_svga_winsys_context_create(struct svga_winsys_screen *sws);
 
-struct pipe_context *
-vmw_svga_context_create(struct pipe_screen *screen);
-
 
 #endif /* VMW_CONTEXT_H_ */
index 2939c10918c1cbc75af2b57f0b9bbc0066ef6054..917b49f1c125db0f0e3eeec059fbba5b72d00f19 100644 (file)
@@ -333,12 +333,6 @@ vmw_drm_handle_from_texture(struct drm_api *drm_api,
     return TRUE;
 }
 
-static struct pipe_context*
-vmw_drm_create_context(struct drm_api *drm_api,
-                       struct pipe_screen *screen)
-{
-   return vmw_svga_context_create(screen);
-}
 
 static struct dri1_api dri1_api_hooks = {
    .front_srf_locked = NULL,
@@ -349,7 +343,6 @@ static struct drm_api vmw_drm_api_hooks = {
    .name = "vmwgfx",
    .driver_name = "vmwgfx",
    .create_screen = vmw_drm_create_screen,
-   .create_context = vmw_drm_create_context,
    .texture_from_shared_handle = vmw_drm_texture_from_handle,
    .shared_handle_from_texture = vmw_drm_handle_from_texture,
    .local_handle_from_texture = vmw_drm_handle_from_texture,
index 33c83210eb3bf281914d491241c9fdaa070564c2..03dbd76c37554093ee58be8657e95f9e600803f2 100644 (file)
@@ -216,11 +216,6 @@ no_winsys:
 }
 
 
-static struct pipe_context *
-gdi_llvmpipe_context_create(struct pipe_screen *screen)
-{
-   return llvmpipe_create(screen);
-}
 
 
 static void
@@ -243,7 +238,6 @@ gdi_llvmpipe_present(struct pipe_screen *screen,
 
 static const struct stw_winsys stw_winsys = {
    &gdi_llvmpipe_screen_create,
-   &gdi_llvmpipe_context_create,
    &gdi_llvmpipe_present,
    NULL, /* get_adapter_luid */
    NULL, /* shared_surface_open */
index 36bf867f19372d6cf8264a3496e060ebf2cc58c4..2078020f8f7d1ef3cdc19ba31a70ce536b847c6c 100644 (file)
@@ -249,13 +249,6 @@ gdi_softpipe_screen_create(void)
 }
 
 
-static struct pipe_context *
-gdi_softpipe_context_create(struct pipe_screen *screen)
-{
-   return softpipe_create(screen);
-}
-
-
 static void
 gdi_softpipe_present(struct pipe_screen *screen,
                      struct pipe_surface *surface,
@@ -291,7 +284,6 @@ gdi_softpipe_present(struct pipe_screen *screen,
 
 static const struct stw_winsys stw_winsys = {
    &gdi_softpipe_screen_create,
-   &gdi_softpipe_context_create,
    &gdi_softpipe_present,
    NULL, /* get_adapter_luid */
    NULL, /* shared_surface_open */
index 9520bac69dbd7fab7629a6aa69614c4d5c2b459c..1dc9e8fa11f3e2da86844c61469d69874c9cbab0 100644 (file)
@@ -383,35 +383,10 @@ fail:
 }
 
 
-static struct pipe_context *
-xlib_create_cell_context( struct pipe_screen *screen,
-                          void *priv )
-{
-   struct pipe_context *pipe;
-
-   
-   /* This takes a cell_winsys pointer, but probably that should be
-    * created and stored at screen creation, not context creation.
-    *
-    * The actual cell_winsys value isn't used for anything, so just
-    * passing NULL for now.
-    */
-   pipe = cell_create_context( screen, NULL);
-   if (pipe == NULL)
-      goto fail;
-
-   pipe->priv = priv;
-
-   return pipe;
-
-fail:
-   return NULL;
-}
 
 struct xm_driver xlib_cell_driver = 
 {
    .create_pipe_screen = xlib_create_cell_screen,
-   .create_pipe_context = xlib_create_cell_context,
    .display_surface = xlib_cell_display_surface,
 };
 
@@ -420,7 +395,6 @@ struct xm_driver xlib_cell_driver =
 struct xm_driver xlib_cell_driver = 
 {
    .create_pipe_screen = NULL,
-   .create_pipe_context = NULL,
    .display_surface = NULL,
 };
 
index 503addb55c6b75beb049b0e4a3d741fd786bbb5e..6cebd4c2012762c0a2572caf0fbf7b6734d6e20f 100644 (file)
@@ -419,25 +419,6 @@ fail:
 }
 
 
-static struct pipe_context *
-xlib_create_llvmpipe_context( struct pipe_screen *screen,
-                              void *context_private )
-{
-   struct pipe_context *pipe;
-   
-   pipe = llvmpipe_create(screen);
-   if (pipe == NULL)
-      goto fail;
-
-   pipe->priv = context_private;
-   return pipe;
-
-fail:
-   /* Free stuff here */
-   return NULL;
-}
-
-
 static void
 xlib_llvmpipe_display_surface(struct xmesa_buffer *xm_buffer,
                               struct pipe_surface *surf)
@@ -453,7 +434,6 @@ xlib_llvmpipe_display_surface(struct xmesa_buffer *xm_buffer,
 struct xm_driver xlib_llvmpipe_driver = 
 {
    .create_pipe_screen = xlib_create_llvmpipe_screen,
-   .create_pipe_context = xlib_create_llvmpipe_context,
    .display_surface = xlib_llvmpipe_display_surface
 };
 
index 8ce1ea793663d65c9b235be08164231b61893239..716338aef47f76b943a946b603cd6649f6fa26ad 100644 (file)
@@ -498,28 +498,9 @@ fail:
 }
 
 
-static struct pipe_context *
-xlib_create_softpipe_context( struct pipe_screen *screen,
-                              void *context_private )
-{
-   struct pipe_context *pipe;
-   
-   pipe = softpipe_create(screen);
-   if (pipe == NULL)
-      goto fail;
-
-   pipe->priv = context_private;
-   return pipe;
-
-fail:
-   /* Free stuff here */
-   return NULL;
-}
-
 struct xm_driver xlib_softpipe_driver = 
 {
    .create_pipe_screen = xlib_create_softpipe_screen,
-   .create_pipe_context = xlib_create_softpipe_context,
    .display_surface = xlib_softpipe_display_surface
 };