gallium: remove st_context_iface, use st_context directly
authorMarek Olšák <marek.olsak@amd.com>
Sun, 27 Nov 2022 17:59:22 +0000 (12:59 -0500)
committerMarge Bot <emma+marge@anholt.net>
Fri, 9 Dec 2022 13:14:03 +0000 (13:14 +0000)
st_context_iface was the base class that st_context inherited.
Just use st_context.

Reviewed-by: Emma Anholt <emma@anholt.net>
Reviewed-by: Adam Jackson <ajax@redhat.com>
Reviewed-by: Yonggang Luo <luoyonggang@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/20027>

31 files changed:
src/egl/drivers/wgl/egl_wgl.c
src/egl/meson.build
src/gallium/auxiliary/postprocess/postprocess.h
src/gallium/frontends/dri/dri_context.c
src/gallium/frontends/dri/dri_context.h
src/gallium/frontends/dri/dri_drawable.c
src/gallium/frontends/dri/dri_helpers.c
src/gallium/frontends/dri/dri_screen.c
src/gallium/frontends/dri/kopper.c
src/gallium/frontends/glx/xlib/xm_api.c
src/gallium/frontends/glx/xlib/xm_api.h
src/gallium/frontends/glx/xlib/xm_st.c
src/gallium/frontends/hgl/hgl.c
src/gallium/frontends/hgl/hgl_context.h
src/gallium/frontends/osmesa/meson.build
src/gallium/frontends/osmesa/osmesa.c
src/gallium/frontends/wgl/stw_context.c
src/gallium/frontends/wgl/stw_context.h
src/gallium/frontends/wgl/stw_ext_rendertexture.c
src/gallium/frontends/wgl/stw_framebuffer.c
src/gallium/frontends/wgl/stw_framebuffer.h
src/gallium/frontends/wgl/stw_st.c
src/gallium/frontends/wgl/stw_st.h
src/gallium/include/frontend/api.h
src/gallium/targets/haiku-softpipe/GalliumContext.cpp
src/mesa/state_tracker/st_cb_eglimage.c
src/mesa/state_tracker/st_context.c
src/mesa/state_tracker/st_context.h
src/mesa/state_tracker/st_interop.c
src/mesa/state_tracker/st_interop.h
src/mesa/state_tracker/st_manager.c

index dffba013ed93b03630b91cd55b65a56062eed794..9a243a308d39b705df9ee18a409fe369c79cd89b 100644 (file)
@@ -21,6 +21,8 @@
  * IN THE SOFTWARE.
  */
 
+#include "state_tracker/st_context.h"
+
 #include <egldriver.h>
 #include <egllog.h>
 #include <eglcurrent.h>
@@ -978,7 +980,7 @@ wgl_create_sync_khr(_EGLDisplay *disp, EGLenum type, const EGLAttrib *attrib_lis
    struct wgl_egl_context *wgl_ctx = wgl_egl_context(ctx);
    struct wgl_egl_sync *wgl_sync;
 
-   struct st_context_iface *st_ctx = wgl_ctx ? wgl_ctx->ctx->st : NULL;
+   struct st_context *st = wgl_ctx ? wgl_ctx->ctx->st : NULL;
 
    wgl_sync = calloc(1, sizeof(struct wgl_egl_sync));
    if (!wgl_sync) {
@@ -993,7 +995,7 @@ wgl_create_sync_khr(_EGLDisplay *disp, EGLenum type, const EGLAttrib *attrib_lis
 
    switch (type) {
    case EGL_SYNC_FENCE_KHR:
-      st_ctx->flush(st_ctx, 0, &wgl_sync->fence, NULL, NULL);
+      st->flush(st, 0, &wgl_sync->fence, NULL, NULL);
       if (!wgl_sync->fence) {
          _eglError(EGL_BAD_ALLOC, "eglCreateSyncKHR");
          free(wgl_sync);
index 5b4644940a5e52af30714c410b65b703d1da51b8..6aeb42f48b97d318aefa023c22d250f91d8e52c3 100644 (file)
@@ -154,7 +154,7 @@ elif with_platform_windows
     '-DEGLAPI=', '-DPUBLIC='
   ]
   files_egl += files('drivers/wgl/egl_wgl.c')
-  incs_for_egl += [inc_wgl, inc_gallium, inc_gallium_aux]
+  incs_for_egl += [inc_wgl, inc_gallium, inc_gallium_aux, inc_mesa, inc_mapi]
   link_for_egl += libgallium_wgl
 endif
 
index d19bcd03093f2dfaa2ccb26ae5fb25356f30a0fd..e6f3c826e23502d1efc541a9bfd7610a860d013d 100644 (file)
@@ -35,7 +35,6 @@ extern "C" {
 #endif
 
 struct cso_context;
-struct st_context_iface;
 
 struct pp_queue_t;              /* Forward definition */
 struct pp_program;
index fdc66244c056ffd0f7926cc764e3b7069ae37847..c628d8748c9856f5d362c0ae17c7e247140e9e34 100644 (file)
@@ -50,7 +50,7 @@ dri_create_context(struct dri_screen *screen,
                    void *loaderPrivate)
 {
    struct dri_context *ctx = NULL;
-   struct st_context_iface *st_share = NULL;
+   struct st_context *st_share = NULL;
    struct st_context_attribs attribs;
    enum st_context_error ctx_err = 0;
    unsigned allowed_flags = __DRI_CTX_FLAG_DEBUG |
@@ -265,7 +265,7 @@ GLboolean
 dri_unbind_context(struct dri_context *ctx)
 {
    /* dri_util.c ensures cPriv is not null */
-   struct st_context_iface *st = ctx->st;
+   struct st_context *st = ctx->st;
 
    if (st == st_api_get_current()) {
       if (st->thread_finish)
@@ -344,7 +344,7 @@ dri_make_current(struct dri_context *ctx,
 struct dri_context *
 dri_get_current(void)
 {
-   struct st_context_iface *st = st_api_get_current();
+   struct st_context *st = st_api_get_current();
 
    return (struct dri_context *) st ? st->frontend_context : NULL;
 }
index 3063f4c7fa2bbb2b04ce19f1bb576430beffbb85..c52370877f747b91c1abb29c6c6b0a81b02ecd9b 100644 (file)
@@ -38,7 +38,7 @@
 
 struct pipe_context;
 struct pipe_fence;
-struct st_context_iface;
+struct st_context;
 struct dri_drawable;
 struct dri_screen;
 
@@ -74,7 +74,7 @@ struct dri_context
    } dri2;
 
    /* gallium */
-   struct st_context_iface *st;
+   struct st_context *st;
    struct pp_queue_t *pp;
    struct hud_context *hud;
 };
index 2de80ac2ca5405278ff73aeda11cd74436f65b65..d33e4c27db139aa746a8cc2a46d0249108a2f9a6 100644 (file)
 #include "util/u_memory.h"
 #include "util/u_inlines.h"
 
+#include "state_tracker/st_context.h"
+
 static uint32_t drifb_ID = 0;
 
 static bool
-dri_st_framebuffer_validate(struct st_context_iface *stctx,
+dri_st_framebuffer_validate(struct st_context *st,
                             struct st_framebuffer_iface *stfbi,
                             const enum st_attachment_type *statts,
                             unsigned count,
                             struct pipe_resource **out)
 {
-   struct dri_context *ctx = (struct dri_context *)stctx->frontend_context;
+   struct dri_context *ctx = (struct dri_context *)st->frontend_context;
    struct dri_drawable *drawable =
       (struct dri_drawable *) stfbi->st_manager_private;
    struct dri_screen *screen = drawable->screen;
@@ -110,11 +112,11 @@ dri_st_framebuffer_validate(struct st_context_iface *stctx,
 }
 
 static bool
-dri_st_framebuffer_flush_front(struct st_context_iface *stctx,
+dri_st_framebuffer_flush_front(struct st_context *st,
                                struct st_framebuffer_iface *stfbi,
                                enum st_attachment_type statt)
 {
-   struct dri_context *ctx = (struct dri_context *)stctx->frontend_context;
+   struct dri_context *ctx = (struct dri_context *)st->frontend_context;
    struct dri_drawable *drawable =
       (struct dri_drawable *) stfbi->st_manager_private;
 
@@ -126,10 +128,10 @@ dri_st_framebuffer_flush_front(struct st_context_iface *stctx,
  * The gallium frontend framebuffer interface flush_swapbuffers callback
  */
 static bool
-dri_st_framebuffer_flush_swapbuffers(struct st_context_iface *stctx,
+dri_st_framebuffer_flush_swapbuffers(struct st_context *st,
                                      struct st_framebuffer_iface *stfbi)
 {
-   struct dri_context *ctx = (struct dri_context *)stctx->frontend_context;
+   struct dri_context *ctx = (struct dri_context *)st->frontend_context;
    struct dri_drawable *drawable =
       (struct dri_drawable *) stfbi->st_manager_private;
 
@@ -252,7 +254,7 @@ dri_set_tex_buffer2(__DRIcontext *pDRICtx, GLint target,
                     GLint format, __DRIdrawable *dPriv)
 {
    struct dri_context *ctx = dri_context(pDRICtx);
-   struct st_context_iface *st = ctx->st;
+   struct st_context *st = ctx->st;
    struct dri_drawable *drawable = dri_drawable(dPriv);
    struct pipe_resource *pt;
 
@@ -418,7 +420,7 @@ static void
 notify_before_flush_cb(void* _args)
 {
    struct notify_before_flush_cb_args *args = (struct notify_before_flush_cb_args *) _args;
-   struct st_context_iface *st = args->ctx->st;
+   struct st_context *st = args->ctx->st;
    struct pipe_context *pipe = st->pipe;
 
    /* Wait for glthread to finish because we can't use pipe_context from
@@ -478,7 +480,7 @@ dri_flush(__DRIcontext *cPriv,
 {
    struct dri_context *ctx = dri_context(cPriv);
    struct dri_drawable *drawable = dri_drawable(dPriv);
-   struct st_context_iface *st;
+   struct st_context *st;
    unsigned flush_flags;
    struct notify_before_flush_cb_args args = { 0 };
 
index ec78607efdf4317a73bff6a090069b71992399f8..dcfee218417689051cad722a1943cb12047d06a7 100644 (file)
@@ -91,7 +91,7 @@ static void *
 dri2_create_fence(__DRIcontext *_ctx)
 {
    struct dri_context *ctx = dri_context(_ctx);
-   struct st_context_iface *stapi = ctx->st;
+   struct st_context *st = ctx->st;
    struct dri2_fence *fence = CALLOC_STRUCT(dri2_fence);
 
    if (!fence)
@@ -100,10 +100,10 @@ dri2_create_fence(__DRIcontext *_ctx)
    /* Wait for glthread to finish because we can't use pipe_context from
     * multiple threads.
     */
-   if (stapi->thread_finish)
-      stapi->thread_finish(stapi);
+   if (st->thread_finish)
+      st->thread_finish(st);
 
-   stapi->flush(stapi, 0, &fence->pipe_fence, NULL, NULL);
+   st->flush(st, 0, &fence->pipe_fence, NULL, NULL);
 
    if (!fence->pipe_fence) {
       FREE(fence);
@@ -118,19 +118,19 @@ static void *
 dri2_create_fence_fd(__DRIcontext *_ctx, int fd)
 {
    struct dri_context *dri_ctx = dri_context(_ctx);
-   struct st_context_iface *stapi = dri_ctx->st;
-   struct pipe_context *ctx = stapi->pipe;
+   struct st_context *st = dri_ctx->st;
+   struct pipe_context *ctx = st->pipe;
    struct dri2_fence *fence = CALLOC_STRUCT(dri2_fence);
 
    /* Wait for glthread to finish because we can't use pipe_context from
     * multiple threads.
     */
-   if (stapi->thread_finish)
-      stapi->thread_finish(stapi);
+   if (st->thread_finish)
+      st->thread_finish(st);
 
    if (fd == -1) {
       /* exporting driver created fence, flush: */
-      stapi->flush(stapi, ST_FLUSH_FENCE_FD, &fence->pipe_fence, NULL, NULL);
+      st->flush(st, ST_FLUSH_FENCE_FD, &fence->pipe_fence, NULL, NULL);
    } else {
       /* importing a foreign fence fd: */
       ctx->create_fence_fd(ctx, &fence->pipe_fence, fd, PIPE_FD_TYPE_NATIVE_SYNC);
@@ -225,7 +225,7 @@ dri2_client_wait_sync(__DRIcontext *_ctx, void *_fence, unsigned flags,
 static void
 dri2_server_wait_sync(__DRIcontext *_ctx, void *_fence, unsigned flags)
 {
-   struct st_context_iface *st = dri_context(_ctx)->st;
+   struct st_context *st = dri_context(_ctx)->st;
    struct pipe_context *ctx = st->pipe;
    struct dri2_fence *fence = (struct dri2_fence*)_fence;
 
@@ -295,10 +295,9 @@ dri2_create_image_from_renderbuffer2(__DRIcontext *context,
                                      unsigned *error)
 {
    struct dri_context *dri_ctx = dri_context(context);
-   struct st_context_iface *st = dri_ctx->st;
-   struct st_context *st_ctx = (struct st_context *)st;
-   struct gl_context *ctx = st_ctx->ctx;
-   struct pipe_context *p_ctx = st_ctx->pipe;
+   struct st_context *st = dri_ctx->st;
+   struct gl_context *ctx = st->ctx;
+   struct pipe_context *p_ctx = st->pipe;
    struct gl_renderbuffer *rb;
    struct pipe_resource *tex;
    __DRIimage *img;
@@ -397,10 +396,9 @@ dri2_create_from_texture(__DRIcontext *context, int target, unsigned texture,
 {
    __DRIimage *img;
    struct dri_context *dri_ctx = dri_context(context);
-   struct st_context_iface *st = dri_ctx->st;
-   struct st_context *st_ctx = (struct st_context *)st;
-   struct gl_context *ctx = st_ctx->ctx;
-   struct pipe_context *p_ctx = st_ctx->pipe;
+   struct st_context *st = dri_ctx->st;
+   struct gl_context *ctx = st->ctx;
+   struct pipe_context *p_ctx = st->pipe;
    struct gl_texture_object *obj;
    struct pipe_resource *tex;
    GLuint face = 0;
index 16c32806bfd62b889077ccd1420c41ec13d89326..8cf0e8b4027447c5bed3c30b751f0d830af47aaa 100644 (file)
@@ -43,6 +43,8 @@
 #include "util/u_driconf.h"
 #include "util/format/u_format_s3tc.h"
 
+#include "state_tracker/st_context.h"
+
 #define MSAA_VISUAL_MAX_SAMPLES 32
 
 #undef false
@@ -808,7 +810,7 @@ dri_postprocessing_init(struct dri_screen *screen)
 }
 
 static void
-dri_set_background_context(struct st_context_iface *st,
+dri_set_background_context(struct st_context *st,
                            struct util_queue_monitoring *queue_info)
 {
    struct dri_context *ctx = (struct dri_context *)st->frontend_context;
index 61c5dc22c21b815126f0ef2b42b19f49c836714a..1334a6e46bf30f5a93af830266c093419ded41eb 100644 (file)
@@ -705,8 +705,9 @@ kopper_flush_frontbuffer(struct dri_context *ctx,
    if (ptex) {
       ctx->st->pipe->flush_resource(ctx->st->pipe, drawable->textures[ST_ATTACHMENT_FRONT_LEFT]);
       struct pipe_screen *screen = drawable->screen->base.screen;
-      struct st_context_iface *st;
+      struct st_context *st;
       struct pipe_fence_handle *new_fence = NULL;
+
       st = ctx->st;
       if (st->thread_finish)
          st->thread_finish(st);
index 48b410528245af436210fd3557b214489f13572e..683b8afde1f015e12adb24dfb1213224b67bec32 100644 (file)
@@ -75,6 +75,8 @@
 
 #include <GL/glx.h>
 
+#include "state_tracker/st_context.h"
+
 extern struct pipe_screen *
 xlib_create_screen(Display *display);
 
@@ -1318,7 +1320,7 @@ GLboolean XMesaUnbindContext( XMesaContext c )
 
 XMesaContext XMesaGetCurrentContext( void )
 {
-   struct st_context_iface *st = st_api_get_current();
+   struct st_context *st = st_api_get_current();
    return (XMesaContext) (st) ? st->frontend_context : NULL;
 }
 
@@ -1464,7 +1466,7 @@ PUBLIC void
 XMesaBindTexImage(Display *dpy, XMesaBuffer drawable, int buffer,
                   const int *attrib_list)
 {
-   struct st_context_iface *st = st_api_get_current();
+   struct st_context *st = st_api_get_current();
    struct st_framebuffer_iface* stfbi = drawable->stfb;
    struct pipe_resource *res;
    int x, y, w, h;
index 2975e8d5da4b64110a7d0ec021fa9f11bacb2725..fa531c48843bdf81a6bf96fd9ff4908de091f6a2 100644 (file)
@@ -68,6 +68,7 @@ and create a window, you must do the following to use the X/Mesa interface:
 # include <X11/Xlibint.h>
 # include <X11/Xutil.h>
 
+struct st_context;
 struct hud_context;
 
 typedef struct xmesa_display *XMesaDisplay;
@@ -304,7 +305,7 @@ struct xmesa_visual {
  * Basically corresponds to a GLXContext.
  */
 struct xmesa_context {
-   struct st_context_iface *st;
+   struct st_context *st;
    XMesaVisual xm_visual;      /** pixel format info */
    XMesaBuffer xm_buffer;      /** current drawbuffer */
    XMesaBuffer xm_read_buffer;  /** current readbuffer */
index f3cf5b8ba8a7de688ed49fafb36ee56cfb70a5dc..cc637f03bdff80004d3aba43c21c048a739719ac 100644 (file)
@@ -32,6 +32,8 @@
 #include "util/u_atomic.h"
 #include "util/u_memory.h"
 
+#include "state_tracker/st_context.h"
+
 struct xmesa_st_framebuffer {
    XMesaDisplay display;
    XMesaBuffer buffer;
@@ -59,14 +61,14 @@ xmesa_st_framebuffer(struct st_framebuffer_iface *stfbi)
  */
 static bool
 xmesa_st_framebuffer_display(struct st_framebuffer_iface *stfbi,
-                             struct st_context_iface *stctx,
+                             struct st_context *st,
                              enum st_attachment_type statt,
                              struct pipe_box *box)
 {
    struct xmesa_st_framebuffer *xstfb = xmesa_st_framebuffer(stfbi);
    struct pipe_resource *ptex = xstfb->textures[statt];
    struct pipe_resource *pres;
-   struct pipe_context *pctx = stctx ? stctx->pipe : NULL;
+   struct pipe_context *pctx = st ? st->pipe : NULL;
 
    if (!ptex)
       return true;
@@ -200,7 +202,7 @@ xmesa_st_framebuffer_validate_textures(struct st_framebuffer_iface *stfbi,
  * \param out  returns resources for each of the attachments
  */
 static bool
-xmesa_st_framebuffer_validate(struct st_context_iface *stctx,
+xmesa_st_framebuffer_validate(struct st_context *st,
                               struct st_framebuffer_iface *stfbi,
                               const enum st_attachment_type *statts,
                               unsigned count,
@@ -261,7 +263,7 @@ xmesa_st_framebuffer_validate(struct st_context_iface *stctx,
  * Called via st_framebuffer_iface::flush_front()
  */
 static bool
-xmesa_st_framebuffer_flush_front(struct st_context_iface *stctx,
+xmesa_st_framebuffer_flush_front(struct st_context *st,
                                  struct st_framebuffer_iface *stfbi,
                                  enum st_attachment_type statt)
 {
@@ -271,7 +273,7 @@ xmesa_st_framebuffer_flush_front(struct st_context_iface *stctx,
    if (statt != ST_ATTACHMENT_FRONT_LEFT)
       return false;
 
-   ret = xmesa_st_framebuffer_display(stfbi, stctx, statt, NULL);
+   ret = xmesa_st_framebuffer_display(stfbi, st, statt, NULL);
 
    if (ret && xmesa_strict_invalidate())
       xmesa_check_buffer_size(xstfb->buffer);
index c3b1cbd9b0c31c78865aa614152b061d0911da77..eeb78179dda8f941a4a9aa156acbac4762e18194 100644 (file)
 
 // Perform a safe void to hgl_context cast
 static inline struct hgl_context*
-hgl_st_context(struct st_context_iface *stctxi)
+hgl_st_context(struct st_context *st)
 {
        struct hgl_context* context;
-       assert(stctxi);
-       context = (struct hgl_context*)stctxi->frontend_context;
+       assert(st);
+       context = (struct hgl_context*)st->frontend_context;
        assert(context);
        return context;
 }
@@ -56,7 +56,7 @@ hgl_st_framebuffer(struct st_framebuffer_iface *stfbi)
 
 
 static bool
-hgl_st_framebuffer_flush_front(struct st_context_iface* stctxi,
+hgl_st_framebuffer_flush_front(struct st_context *st,
        struct st_framebuffer_iface* stfbi, enum st_attachment_type statt)
 {
        CALLED();
@@ -153,7 +153,7 @@ hgl_st_framebuffer_validate_textures(struct st_framebuffer_iface *stfbi,
  * its resources).
  */
 static bool
-hgl_st_framebuffer_validate(struct st_context_iface *stctxi,
+hgl_st_framebuffer_validate(struct st_context *st,
        struct st_framebuffer_iface *stfbi, const enum st_attachment_type *statts,
        unsigned count, struct pipe_resource **out)
 {
@@ -165,7 +165,7 @@ hgl_st_framebuffer_validate(struct st_context_iface *stctxi,
 
        CALLED();
 
-       context = hgl_st_context(stctxi);
+       context = hgl_st_context(st);
        buffer = hgl_st_framebuffer(stfbi);
 
        // Build mask of current attachments
index d5871d4cd5c7cef9063da1689808cb4ad6765771..04baa748fd6ed07e587364b87c43db36f0eb445d 100644 (file)
@@ -59,7 +59,7 @@ struct hgl_display
 struct hgl_context
 {
        struct hgl_display* display;
-       struct st_context_iface* st;
+       struct st_context* st;
        struct st_visual* stVisual;
 
        // Post processing
index 8abf55c02e4e373d440760f3673a25175c8c172e..721ecd6f9c6c34b4eebb53af6e761369124cea6e 100644 (file)
@@ -32,4 +32,5 @@ libosmesa_st = static_library(
   include_directories : [
     inc_include, inc_src, inc_gallium, inc_gallium_aux, inc_mapi, inc_mesa,
   ],
+  dependencies : [idep_mesautil],
 )
index 4f12c944f630f90c36d76969d7badea6113046ba..554c194828a5c5543b0554fd2db010eefa417da5 100644 (file)
@@ -51,6 +51,9 @@
 
 #include <stdio.h>
 #include <c11/threads.h>
+
+#include "state_tracker/st_context.h"
+
 #include "GL/osmesa.h"
 
 #include "glapi/glapi.h"  /* for OSMesaGetProcAddress below */
@@ -94,7 +97,7 @@ struct osmesa_buffer
 
 struct osmesa_context
 {
-   struct st_context_iface *stctx;
+   struct st_context *st;
 
    boolean ever_used;     /*< Has this context ever been current? */
 
@@ -176,7 +179,7 @@ static void
 osmesa_read_buffer(OSMesaContext osmesa, struct pipe_resource *res, void *dst,
                    int dst_stride, bool y_up)
 {
-   struct pipe_context *pipe = osmesa->stctx->pipe;
+   struct pipe_context *pipe = osmesa->st->pipe;
 
    struct pipe_box box;
    u_box_2d(0, 0, res->width0, res->height0, &box);
@@ -338,7 +341,7 @@ stfbi_to_osbuffer(struct st_framebuffer_iface *stfbi)
  * of the driver's color buffer into the user-specified buffer.
  */
 static bool
-osmesa_st_framebuffer_flush_front(struct st_context_iface *stctx,
+osmesa_st_framebuffer_flush_front(struct st_context *st,
                                   struct st_framebuffer_iface *stfbi,
                                   enum st_attachment_type statt)
 {
@@ -397,7 +400,7 @@ osmesa_st_framebuffer_flush_front(struct st_context_iface *stctx,
  * its resources).
  */
 static bool
-osmesa_st_framebuffer_validate(struct st_context_iface *stctx,
+osmesa_st_framebuffer_validate(struct st_context *st,
                                struct st_framebuffer_iface *stfbi,
                                const enum st_attachment_type *statts,
                                unsigned count,
@@ -566,7 +569,7 @@ GLAPI OSMesaContext GLAPIENTRY
 OSMesaCreateContextAttribs(const int *attribList, OSMesaContext sharelist)
 {
    OSMesaContext osmesa;
-   struct st_context_iface *st_shared;
+   struct st_context *st_shared;
    enum st_context_error st_error = 0;
    struct st_context_attribs attribs;
    GLenum format = GL_RGBA;
@@ -575,7 +578,7 @@ OSMesaCreateContextAttribs(const int *attribList, OSMesaContext sharelist)
    int i;
 
    if (sharelist) {
-      st_shared = sharelist->stctx;
+      st_shared = sharelist->st;
    }
    else {
       st_shared = NULL;
@@ -679,14 +682,14 @@ OSMesaCreateContextAttribs(const int *attribList, OSMesaContext sharelist)
                          osmesa->depth_stencil_format,
                          osmesa->accum_format);
 
-   osmesa->stctx = st_api_create_context(get_st_manager(),
+   osmesa->st = st_api_create_context(get_st_manager(),
                                          &attribs, &st_error, st_shared);
-   if (!osmesa->stctx) {
+   if (!osmesa->st) {
       FREE(osmesa);
       return NULL;
    }
 
-   osmesa->stctx->frontend_context = osmesa;
+   osmesa->st->frontend_context = osmesa;
 
    osmesa->format = format;
    osmesa->user_row_length = 0;
@@ -707,7 +710,7 @@ OSMesaDestroyContext(OSMesaContext osmesa)
 {
    if (osmesa) {
       pp_free(osmesa->pp);
-      osmesa->stctx->destroy(osmesa->stctx);
+      osmesa->st->destroy(osmesa->st);
       free(osmesa->zs);
       FREE(osmesa);
    }
@@ -782,7 +785,7 @@ OSMesaMakeCurrent(OSMesaContext osmesa, void *buffer, GLenum type,
 
    osmesa->type = type;
 
-   st_api_make_current(osmesa->stctx, osbuffer->stfb, osbuffer->stfb);
+   st_api_make_current(osmesa->st, osbuffer->stfb, osbuffer->stfb);
 
    /* XXX: We should probably load the current color value into the buffer here
     * to match classic swrast behavior (context's fb starts with the contents of
@@ -802,11 +805,11 @@ OSMesaMakeCurrent(OSMesaContext osmesa, void *buffer, GLenum type,
       }
 
       if (any_pp_enabled) {
-         osmesa->pp = pp_init(osmesa->stctx->pipe,
+         osmesa->pp = pp_init(osmesa->st->pipe,
                               osmesa->pp_enabled,
-                              osmesa->stctx->cso_context,
-                              osmesa->stctx,
-                              (void*)osmesa->stctx->invalidate_state);
+                              osmesa->st->cso_context,
+                              osmesa->st,
+                              (void*)osmesa->st->invalidate_state);
 
          pp_init_fbos(osmesa->pp, width, height);
       }
@@ -822,7 +825,7 @@ OSMesaMakeCurrent(OSMesaContext osmesa, void *buffer, GLenum type,
 GLAPI OSMesaContext GLAPIENTRY
 OSMesaGetCurrentContext(void)
 {
-   struct st_context_iface *st = st_api_get_current();
+   struct st_context *st = st_api_get_current();
    return st ? (OSMesaContext) st->frontend_context : NULL;
 }
 
index 4d06c86e4e746bb2304800f3e9bed43fab34d875..30d1d63bfe6e052ec5ec2d3076038b3c08aa1157 100644 (file)
@@ -25,6 +25,8 @@
  *
  **************************************************************************/
 
+#include "state_tracker/st_context.h"
+
 #include <windows.h>
 
 #define WGL_WGLEXT_PROTOTYPES
 #include "stw_context.h"
 #include "stw_tls.h"
 
+#include "main/context.h"
 
 struct stw_context *
 stw_current_context(void)
 {
-   struct st_context_iface *st;
+   struct st_context *st;
 
    st = (stw_dev) ? st_api_get_current() : NULL;
 
index 8932805a96889c259612eb16a6611335e7fdcd45..f3203b37b071c60b83f9ef4a13acb88aaae95814 100644 (file)
 
 struct hud_context;
 struct stw_framebuffer;
-struct st_context_iface;
+struct st_context;
 struct pipe_frontend_screen;
 
 struct stw_context
 {
-   struct st_context_iface *st;
+   struct st_context *st;
    DHGLRC dhglrc;
    const struct stw_pixelformat_info *pfi;
    HDC hDrawDC;
index 746727ec40eb8eccadc4a1a184f5ef978be05749..b19c8f15e3fe64b28544cffea237db7bdbeba9dd 100644 (file)
@@ -112,7 +112,7 @@ wglBindTexImageARB(HPBUFFERARB hPbuffer, int iBuffer)
    /*
     * Implementation notes:
     * Ideally, we'd implement this function with the
-    * st_context_iface::teximage() function which replaces a specific
+    * st_context_teximage() function which replaces a specific
     * texture image with a different resource (the pbuffer).
     * The main problem however, is the pbuffer image is upside down relative
     * to the texture image.
index 4dbe70c6ad97fc64bcc08e6adc1f614d887ad689..ebd14f90a47cb8fc4546c4f25d0352974b2cba05 100644 (file)
@@ -25,6 +25,8 @@
  *
  **************************************************************************/
 
+#include "state_tracker/st_context.h"
+
 #include <windows.h>
 
 #include "pipe/p_screen.h"
@@ -83,7 +85,7 @@ stw_framebuffer_from_hwnd_locked(HWND hwnd)
  */
 void
 stw_framebuffer_release_locked(struct stw_framebuffer *fb,
-                               struct st_context_iface *stctx)
+                               struct st_context *st)
 {
    struct stw_framebuffer **link;
 
@@ -113,7 +115,7 @@ stw_framebuffer_release_locked(struct stw_framebuffer *fb,
                                                 fb->shared_surface);
 
    if (fb->winsys_framebuffer)
-      fb->winsys_framebuffer->destroy(fb->winsys_framebuffer, stctx ? stctx->pipe : NULL);
+      fb->winsys_framebuffer->destroy(fb->winsys_framebuffer, st ? st->pipe : NULL);
 
    stw_st_destroy_framebuffer_locked(fb->stfb);
 
@@ -251,9 +253,9 @@ stw_call_window_proc(int nCode, WPARAM wParam, LPARAM lParam)
          fb = stw_framebuffer_from_hwnd_locked( pParams->hwnd );
          if (fb) {
             struct stw_context *current_context = stw_current_context();
-            struct st_context_iface *ctx_iface = current_context &&
+            struct st_context *st = current_context &&
                current_context->current_framebuffer == fb ? current_context->st : NULL;
-            stw_framebuffer_release_locked(fb, ctx_iface);
+            stw_framebuffer_release_locked(fb, st);
          }
          stw_unlock_framebuffers(stw_dev);
       }
index 1fc407961a17e4df5c20be7dabd0fcefbf7c8b29..3536d77987400b10cc128971cac16792540af08d 100644 (file)
@@ -171,7 +171,7 @@ stw_framebuffer_reference_locked(struct stw_framebuffer *fb);
 
 void
 stw_framebuffer_release_locked(struct stw_framebuffer *fb,
-                               struct st_context_iface *stctx);
+                               struct st_context *st);
 
 /**
  * Search a framebuffer with a matching HWND.
index 39ae3ea45498e0981a2e10152d3b49d52106db8f..11bd103b4f9824ea7023edba6fec65c49a46e67d 100644 (file)
@@ -30,6 +30,8 @@
 #include "util/u_atomic.h"
 #include "pipe/p_state.h"
 
+#include "state_tracker/st_context.h"
+
 #include "stw_st.h"
 #include "stw_device.h"
 #include "stw_framebuffer.h"
@@ -145,7 +147,7 @@ stw_st_fill_private_loader_data(struct stw_st_framebuffer *stwfb, struct kopper_
  * Remove outdated textures and create the requested ones.
  */
 static void
-stw_st_framebuffer_validate_locked(struct st_context_iface *stctx,
+stw_st_framebuffer_validate_locked(struct st_context *st,
                                    struct st_framebuffer_iface *stfb,
                                    unsigned width, unsigned height,
                                    unsigned mask)
@@ -186,7 +188,7 @@ stw_st_framebuffer_validate_locked(struct st_context_iface *stctx,
       if (stwfb->fb->winsys_framebuffer) {
          templ.nr_samples = templ.nr_storage_samples = 1;
          templ.format = stwfb->stvis.color_format;
-         stwfb->fb->winsys_framebuffer->resize(stwfb->fb->winsys_framebuffer, stctx->pipe, &templ);
+         stwfb->fb->winsys_framebuffer->resize(stwfb->fb->winsys_framebuffer, st->pipe, &templ);
       }
    }
 
@@ -298,13 +300,13 @@ stw_st_framebuffer_validate_locked(struct st_context_iface *stctx,
             stw_dev->screen->resource_create(stw_dev->screen, &templ);
 
          /* TODO Only blit if there is something currently drawn on the back buffer */
-         stw_pipe_blit(stctx->pipe,
+         stw_pipe_blit(st->pipe,
                        stwfb->back_texture,
                        stwfb->textures[ST_ATTACHMENT_BACK_LEFT]);
       }
 
       /* Copying front texture content to fake front texture (back texture) */
-      stw_pipe_blit(stctx->pipe,
+      stw_pipe_blit(st->pipe,
                     stwfb->textures[ST_ATTACHMENT_BACK_LEFT],
                     stwfb->textures[ST_ATTACHMENT_FRONT_LEFT]);
    }
@@ -315,7 +317,7 @@ stw_st_framebuffer_validate_locked(struct st_context_iface *stctx,
 }
 
 static bool
-stw_st_framebuffer_validate(struct st_context_iface *stctx,
+stw_st_framebuffer_validate(struct st_context *st,
                             struct st_framebuffer_iface *stfb,
                             const enum st_attachment_type *statts,
                             unsigned count,
@@ -331,7 +333,7 @@ stw_st_framebuffer_validate(struct st_context_iface *stctx,
    stw_framebuffer_lock(stwfb->fb);
 
    if (stwfb->fb->must_resize || stwfb->needs_fake_front || (statt_mask & ~stwfb->texture_mask)) {
-      stw_st_framebuffer_validate_locked(stctx, &stwfb->base,
+      stw_st_framebuffer_validate_locked(st, &stwfb->base,
             stwfb->fb->width, stwfb->fb->height, statt_mask);
       stwfb->fb->must_resize = FALSE;
    }
@@ -360,7 +362,7 @@ stw_st_framebuffer_validate(struct st_context_iface *stctx,
 }
 
 struct notify_before_flush_cb_args {
-   struct st_context_iface *stctx;
+   struct st_context *st;
    struct stw_st_framebuffer *stwfb;
    unsigned flags;
 };
@@ -369,7 +371,7 @@ static void
 notify_before_flush_cb(void* _args)
 {
    struct notify_before_flush_cb_args *args = (struct notify_before_flush_cb_args *) _args;
-   struct st_context_iface *st = args->stctx;
+   struct st_context *st = args->st;
    struct pipe_context *pipe = st->pipe;
 
    if (args->stwfb->stvis.samples > 1) {
@@ -391,7 +393,7 @@ notify_before_flush_cb(void* _args)
 }
 
 void
-stw_st_flush(struct st_context_iface *stctx,
+stw_st_flush(struct st_context *st,
              struct st_framebuffer_iface *stfb,
              unsigned flags)
 {
@@ -400,7 +402,7 @@ stw_st_flush(struct st_context_iface *stctx,
    struct pipe_fence_handle **pfence = NULL;
    struct pipe_fence_handle *fence = NULL;
 
-   args.stctx = stctx;
+   args.st = st;
    args.stwfb = stwfb;
    args.flags = flags;
 
@@ -409,10 +411,10 @@ stw_st_flush(struct st_context_iface *stctx,
 
    if (flags & ST_FLUSH_WAIT)
       pfence = &fence;
-   stctx->flush(stctx, flags, pfence, notify_before_flush_cb, &args);
+   st->flush(st, flags, pfence, notify_before_flush_cb, &args);
 
    /* TODO: remove this if the framebuffer state doesn't change. */
-   stctx->invalidate_state(stctx, ST_INVALIDATE_FB_STATE);
+   st->invalidate_state(st, ST_INVALIDATE_FB_STATE);
 }
 
 /**
@@ -420,7 +422,7 @@ stw_st_flush(struct st_context_iface *stctx,
  */
 static bool
 stw_st_framebuffer_present_locked(HDC hdc,
-                                  struct st_context_iface *stctx,
+                                  struct st_context *st,
                                   struct st_framebuffer_iface *stfb,
                                   enum st_attachment_type statt)
 {
@@ -443,12 +445,12 @@ stw_st_framebuffer_present_locked(HDC hdc,
 }
 
 static bool
-stw_st_framebuffer_flush_front(struct st_context_iface *stctx,
+stw_st_framebuffer_flush_front(struct st_context *st,
                                struct st_framebuffer_iface *stfb,
                                enum st_attachment_type statt)
 {
    struct stw_st_framebuffer *stwfb = stw_st_framebuffer(stfb);
-   struct pipe_context *pipe = stctx->pipe;
+   struct pipe_context *pipe = st->pipe;
    bool ret;
    HDC hDC;
    bool need_swap_textures = false;
@@ -490,7 +492,7 @@ stw_st_framebuffer_flush_front(struct st_context_iface *stctx,
 
    hDC = GetDC(stwfb->fb->hWnd);
 
-   ret = stw_st_framebuffer_present_locked(hDC, stctx, &stwfb->base, statt);
+   ret = stw_st_framebuffer_present_locked(hDC, st, &stwfb->base, statt);
 
    ReleaseDC(stwfb->fb->hWnd, hDC);
 
@@ -549,7 +551,7 @@ stw_st_destroy_framebuffer_locked(struct st_framebuffer_iface *stfb)
  * Swap the buffers of the given framebuffer.
  */
 bool
-stw_st_swap_framebuffer_locked(HDC hdc, struct st_context_iface *stctx,
+stw_st_swap_framebuffer_locked(HDC hdc, struct st_context *st,
                                struct st_framebuffer_iface *stfb)
 {
    struct stw_st_framebuffer *stwfb = stw_st_framebuffer(stfb);
@@ -585,7 +587,7 @@ stw_st_swap_framebuffer_locked(HDC hdc, struct st_context_iface *stctx,
    stwfb->texture_mask = mask;
 
    front = ST_ATTACHMENT_FRONT_LEFT;
-   return stw_st_framebuffer_present_locked(hdc, stctx, &stwfb->base, front);
+   return stw_st_framebuffer_present_locked(hdc, st, &stwfb->base, front);
 }
 
 
index e383c3795ff87efbce9ab324a30c00c62b9ac02b..774c1844d3f1581cbe373fe3a0cc7b0854b0c77b 100644 (file)
@@ -32,6 +32,7 @@
 
 #include "frontend/api.h"
 
+struct st_context;
 struct stw_framebuffer;
 
 bool
@@ -44,11 +45,11 @@ void
 stw_st_destroy_framebuffer_locked(struct st_framebuffer_iface *stfb);
 
 void
-stw_st_flush(struct st_context_iface *st, struct st_framebuffer_iface *stfb,
+stw_st_flush(struct st_context *st, struct st_framebuffer_iface *stfb,
              unsigned flags);
 
 bool
-stw_st_swap_framebuffer_locked(HDC hdc, struct st_context_iface *stctx,
+stw_st_swap_framebuffer_locked(HDC hdc, struct st_context *st,
                                struct st_framebuffer_iface *stfb);
 
 struct pipe_resource *
index 693ea83a071f4118941b9a5dfb2229d15a34911c..91b2b73a3a53b009420f04482ce5d6c16709fba5 100644 (file)
@@ -29,6 +29,8 @@
 
 #include "util/format/u_formats.h"
 
+struct st_context;
+
 /**
  * \file API for communication between gallium frontends and supporting
  * frontends such as DRI.
@@ -88,7 +90,7 @@ enum st_context_error {
 };
 
 /**
- * Used in st_context_iface->teximage.
+ * Used in st_context_teximage.
  */
 enum st_texture_type {
    ST_TEXTURE_1D,
@@ -271,7 +273,6 @@ struct st_context_attribs
    struct st_config_options options;
 };
 
-struct st_context_iface;
 struct pipe_frontend_screen;
 
 /**
@@ -328,7 +329,7 @@ struct st_framebuffer_iface
     *
     * @att is one of the front buffer attachments.
     */
-   bool (*flush_front)(struct st_context_iface *stctx,
+   bool (*flush_front)(struct st_context *st,
                        struct st_framebuffer_iface *stfbi,
                        enum st_attachment_type statt);
 
@@ -349,96 +350,13 @@ struct st_framebuffer_iface
     * the last call might be destroyed.  This behavior might change in the
     * future.
     */
-   bool (*validate)(struct st_context_iface *stctx,
+   bool (*validate)(struct st_context *st,
                     struct st_framebuffer_iface *stfbi,
                     const enum st_attachment_type *statts,
                     unsigned count,
                     struct pipe_resource **out);
-   bool (*flush_swapbuffers) (struct st_context_iface *stctx,
-                              struct st_framebuffer_iface *stfbi);
-};
-
-/**
- * Represent a rendering context.
- *
- * This entity is created from st_api and used by the frontend manager.
- */
-struct st_context_iface
-{
-   /**
-    * The frontend context. (such as dri_context)
-    */
-   void *frontend_context;
-
-   /**
-    * The frontend screen. (such as dri_screen)
-    */
-   struct pipe_frontend_screen *frontend_screen;
-
-   /**
-    * The CSO context associated with this context in case we need to draw
-    * something before swap buffers.
-    */
-   struct cso_context *cso_context;
-
-   /**
-    * The gallium context.
-    */
-   struct pipe_context *pipe;
-
-   /**
-    * Destroy the context.
-    */
-   void (*destroy)(struct st_context_iface *stctxi);
-
-   /**
-    * Flush all drawing from context to the pipe also flushes the pipe.
-    */
-   void (*flush)(struct st_context_iface *stctxi, unsigned flags,
-                 struct pipe_fence_handle **fence,
-                 void (*notify_before_flush_cb) (void*),
-                 void* notify_before_flush_cb_args);
-
-   /**
-    * Replace the texture image of a texture object at the specified level.
-    *
-    * This function is optional.
-    */
-   bool (*teximage)(struct st_context_iface *stctxi,
-                    enum st_texture_type target,
-                    int level, enum pipe_format internal_format,
-                    struct pipe_resource *tex, bool mipmap);
-
-   /**
-    * Used to implement glXCopyContext.
-    */
-   void (*copy)(struct st_context_iface *stctxi,
-                struct st_context_iface *stsrci, unsigned mask);
-
-   /**
-    * Used to implement wglShareLists.
-    */
-   bool (*share)(struct st_context_iface *stctxi,
-                 struct st_context_iface *stsrci);
-
-   /**
-    * Start the thread if the API has a worker thread.
-    * Called after the context has been created and fully initialized on both
-    * sides (e.g. st/mesa and st/dri).
-    */
-   void (*start_thread)(struct st_context_iface *stctxi);
-
-   /**
-    * If the API is multithreaded, wait for all queued commands to complete.
-    * Called from the main thread.
-    */
-   void (*thread_finish)(struct st_context_iface *stctxi);
-
-   /**
-    * Invalidate states to notify the frontend that states have been changed
-    * behind its back.
-    */
-   void (*invalidate_state)(struct st_context_iface *stctxi, unsigned flags);
+   bool (*flush_swapbuffers)(struct st_context *st,
+                             struct st_framebuffer_iface *stfbi);
 };
 
 
@@ -484,7 +402,7 @@ struct pipe_frontend_screen
     * Call the loader function setBackgroundContext. Called from the worker
     * thread.
     */
-   void (*set_background_context)(struct st_context_iface *stctxi,
+   void (*set_background_context)(struct st_context *st,
                                   struct util_queue_monitoring *queue_info);
 
    /**
@@ -519,11 +437,11 @@ st_api_query_versions(struct pipe_frontend_screen *fscreen,
 /**
  * Create a rendering context.
  */
-struct st_context_iface *
+struct st_context *
 st_api_create_context(struct pipe_frontend_screen *fscreen,
                       const struct st_context_attribs *attribs,
                       enum st_context_error *error,
-                      struct st_context_iface *stsharei);
+                      struct st_context *shared_ctx);
 
 /**
  * Bind the context to the calling thread with draw and read as drawables.
@@ -532,14 +450,14 @@ st_api_create_context(struct pipe_frontend_screen *fscreen,
  * context does.
  */
 bool
-st_api_make_current(struct st_context_iface *stctxi,
+st_api_make_current(struct st_context *st,
                     struct st_framebuffer_iface *stdrawi,
                     struct st_framebuffer_iface *streadi);
 
 /**
  * Get the currently bound context in the calling thread.
  */
-struct st_context_iface *
+struct st_context *
 st_api_get_current(void);
 
 /**
index 39cee4705f19b202830ae5ddd14c69d291a66f82..1d5c2f1ff30a91e122e79e1446040635447c997f 100644 (file)
@@ -169,7 +169,7 @@ GalliumContext::CreateContext(HGLWinsysContext *wsContext)
        attribs.minor = 0;
        //attribs.flags |= ST_CONTEXT_FLAG_DEBUG;
 
-       struct st_context_iface* shared = NULL;
+       struct st_context *shared = NULL;
 
        if (fOptions & BGL_SHARE_CONTEXT) {
                shared = st_api_get_current();
@@ -221,8 +221,8 @@ GalliumContext::CreateContext(HGLWinsysContext *wsContext)
        // Init Gallium3D Post Processing
        // TODO: no pp filters are enabled yet through postProcessEnable
        context->postProcess = pp_init(stContext->pipe, context->postProcessEnable,
-               stContext->cso_context, &stContext->iface,
-                (void*)stContext->iface.invalidate_state);
+               stContext->cso_context, stContext,
+                (void*)stContext->invalidate_state);
 
        context_id contextNext = -1;
        Lock();
index 707121661483901fe50138379e59234b4d99b5d0..b23269979ff3c0ce62ca5c2f7a2d54dd20d78c00 100644 (file)
@@ -171,7 +171,7 @@ st_get_egl_image(struct gl_context *ctx, GLeglImageOES image_handle,
 {
    struct st_context *st = st_context(ctx);
    struct pipe_screen *screen = st->screen;
-   struct pipe_frontend_screen *fscreen = st->iface.frontend_screen;
+   struct pipe_frontend_screen *fscreen = st->frontend_screen;
 
    if (!fscreen || !fscreen->get_egl_image)
       return false;
@@ -421,7 +421,7 @@ static GLboolean
 st_validate_egl_image(struct gl_context *ctx, GLeglImageOES image_handle)
 {
    struct st_context *st = st_context(ctx);
-   struct pipe_frontend_screen *fscreen = st->iface.frontend_screen;
+   struct pipe_frontend_screen *fscreen = st->frontend_screen;
 
    return fscreen->validate_egl_image(fscreen, (void *)image_handle);
 }
index b4d7e5746a4d1575f74816457843383c0383be4d..93cdba2519dc3029e09c3794dba2d0e68dfd8472 100644 (file)
@@ -775,10 +775,10 @@ st_set_background_context(struct gl_context *ctx,
                           struct util_queue_monitoring *queue_info)
 {
    struct st_context *st = ctx->st;
-   struct pipe_frontend_screen *fscreen = st->iface.frontend_screen;
+   struct pipe_frontend_screen *fscreen = st->frontend_screen;
 
    assert(fscreen->set_background_context);
-   fscreen->set_background_context(&st->iface, queue_info);
+   fscreen->set_background_context(st, queue_info);
 }
 
 static void
index 2a70cd0182d5ac6ef6ff8438e5aa5fe606118dd3..647b4aafd7c64d2eab74bced1224035483dbc22f 100644 (file)
@@ -123,13 +123,14 @@ struct st_zombie_shader_node
 
 struct st_context
 {
-   struct st_context_iface iface;
-
    struct gl_context *ctx;
    struct pipe_screen *screen;
    struct pipe_context *pipe;
    struct cso_context *cso_context;
 
+   struct pipe_frontend_screen *frontend_screen; /* e.g. dri_screen */
+   void *frontend_context; /* e.g. dri_context */
+
    struct draw_context *draw;  /**< For selection/feedback/rastpos only */
    struct draw_stage *feedback_stage;  /**< For GL_FEEDBACK rendermode */
    struct draw_stage *selection_stage;  /**< For GL_SELECT rendermode */
@@ -392,6 +393,62 @@ struct st_context
    } zombie_shaders;
 
    struct hash_table *hw_select_shaders;
+
+   /* TODO: Burn these callbacks to the ground: */
+
+   /**
+    * Destroy the context.
+    */
+   void (*destroy)(struct st_context *st);
+
+   /**
+    * Flush all drawing from context to the pipe also flushes the pipe.
+    */
+   void (*flush)(struct st_context *st, unsigned flags,
+                 struct pipe_fence_handle **fence,
+                 void (*notify_before_flush_cb) (void*),
+                 void* notify_before_flush_cb_args);
+
+   /**
+    * Replace the texture image of a texture object at the specified level.
+    *
+    * This function is optional.
+    */
+   bool (*teximage)(struct st_context *st,
+                    enum st_texture_type target,
+                    int level, enum pipe_format internal_format,
+                    struct pipe_resource *tex, bool mipmap);
+
+   /**
+    * Used to implement glXCopyContext.
+    */
+   void (*copy)(struct st_context *st,
+                struct st_context *src, unsigned mask);
+
+   /**
+    * Used to implement wglShareLists.
+    */
+   bool (*share)(struct st_context *st,
+                 struct st_context *src);
+
+   /**
+    * Start the thread if the API has a worker thread.
+    * Called after the context has been created and fully initialized on both
+    * sides (e.g. st/mesa and st/dri).
+    */
+   void (*start_thread)(struct st_context *st);
+
+   /**
+    * If the API is multithreaded, wait for all queued commands to complete.
+    * Called from the main thread.
+    */
+   void (*thread_finish)(struct st_context *st);
+
+   /**
+    * Invalidate states to notify the frontend that states have been changed
+    * behind its back.
+    */
+   void (*invalidate_state)(struct st_context *st, unsigned flags);
 };
 
 
index a8f870952b483ff3f049f4ecc2ffe9756372c5e3..288b755cfcdf88015b67c2f19d1074797d0fc956 100644 (file)
@@ -32,7 +32,7 @@
 #include "syncobj.h"
 
 int
-st_interop_query_device_info(struct st_context_iface *st,
+st_interop_query_device_info(struct st_context *st,
                              struct mesa_glinterop_device_info *out)
 {
    struct pipe_screen *screen = st->pipe->screen;
@@ -237,12 +237,12 @@ lookup_object(struct gl_context *ctx,
 }
 
 int
-st_interop_export_object(struct st_context_iface *st,
+st_interop_export_object(struct st_context *st,
                          struct mesa_glinterop_export_in *in,
                          struct mesa_glinterop_export_out *out)
 {
    struct pipe_screen *screen = st->pipe->screen;
-   struct gl_context *ctx = ((struct st_context *)st)->ctx;
+   struct gl_context *ctx = st->ctx;
    struct pipe_resource *res = NULL;
    struct winsys_handle whandle;
    unsigned usage;
@@ -341,11 +341,11 @@ flush_object(struct gl_context *ctx,
 }
 
 int
-st_interop_flush_objects(struct st_context_iface *st,
+st_interop_flush_objects(struct st_context *st,
                          unsigned count, struct mesa_glinterop_export_in *objects,
                          GLsync *sync)
 {
-   struct gl_context *ctx = ((struct st_context *)st)->ctx;
+   struct gl_context *ctx = st->ctx;
 
    /* Wait for glthread to finish to get up-to-date GL object lookups. */
    if (st->thread_finish)
index 633fd433f364ccd8b61516691c491318c6a98321..70bae553ec356f79ed04b34bbca0cd5065fef421 100644 (file)
 #include "st_context.h"
 
 int
-st_interop_query_device_info(struct st_context_iface *st,
+st_interop_query_device_info(struct st_context *st,
                              struct mesa_glinterop_device_info *out);
 
 int
-st_interop_export_object(struct st_context_iface *st,
+st_interop_export_object(struct st_context *st,
                          struct mesa_glinterop_export_in *in,
                          struct mesa_glinterop_export_out *out);
 
 int
-st_interop_flush_objects(struct st_context_iface *st,
+st_interop_flush_objects(struct st_context *st,
                          unsigned count, struct mesa_glinterop_export_in *objects,
                          GLsync *sync);
 
index fda524646b4e5cfc98960e5bdc05f8f7588ebc36..aeef2495cdbefc575cfc2b85d5127e7ca8eceb83 100644 (file)
@@ -233,7 +233,7 @@ st_framebuffer_validate(struct gl_framebuffer *stfb,
 
    /* validate the fb */
    do {
-      if (!stfb->iface->validate(&st->iface, stfb->iface, stfb->statts,
+      if (!stfb->iface->validate(st, stfb->iface, stfb->statts,
                                  stfb->num_statts, textures))
          return;
 
@@ -762,8 +762,7 @@ st_api_destroy_drawable(struct st_framebuffer_iface *stfbi)
 static void
 st_framebuffers_purge(struct st_context *st)
 {
-   struct st_context_iface *st_iface = &st->iface;
-   struct pipe_frontend_screen *fscreen = st_iface->frontend_screen;
+   struct pipe_frontend_screen *fscreen = st->frontend_screen;
    struct gl_framebuffer *stfb, *next;
 
    assert(fscreen);
@@ -788,12 +787,11 @@ st_framebuffers_purge(struct st_context *st)
 
 
 static void
-st_context_flush(struct st_context_iface *stctxi, unsigned flags,
+st_context_flush(struct st_context *st, unsigned flags,
                  struct pipe_fence_handle **fence,
                  void (*before_flush_cb) (void*),
                  void* args)
 {
-   struct st_context *st = (struct st_context *) stctxi;
    unsigned pipe_flags = 0;
 
    if (flags & ST_FLUSH_END_OF_FRAME)
@@ -826,12 +824,11 @@ st_context_flush(struct st_context_iface *stctxi, unsigned flags,
  * in EGL and WGL.
  */
 static bool
-st_context_teximage(struct st_context_iface *stctxi,
+st_context_teximage(struct st_context *st,
                     enum st_texture_type tex_type,
                     int level, enum pipe_format pipe_format,
                     struct pipe_resource *tex, bool mipmap)
 {
-   struct st_context *st = (struct st_context *) stctxi;
    struct gl_context *ctx = st->ctx;
    struct gl_texture_object *texObj;
    struct gl_texture_image *texImage;
@@ -916,59 +913,46 @@ st_context_teximage(struct st_context_iface *stctxi,
 
 
 static void
-st_context_copy(struct st_context_iface *stctxi,
-                struct st_context_iface *stsrci, unsigned mask)
+st_context_copy(struct st_context *st,
+                struct st_context *src, unsigned mask)
 {
-   struct st_context *st = (struct st_context *) stctxi;
-   struct st_context *src = (struct st_context *) stsrci;
-
    _mesa_copy_context(src->ctx, st->ctx, mask);
 }
 
 
 static bool
-st_context_share(struct st_context_iface *stctxi,
-                 struct st_context_iface *stsrci)
+st_context_share(struct st_context *st,
+                 struct st_context *src)
 {
-   struct st_context *st = (struct st_context *) stctxi;
-   struct st_context *src = (struct st_context *) stsrci;
-
    return _mesa_share_state(st->ctx, src->ctx);
 }
 
 
 static void
-st_context_destroy(struct st_context_iface *stctxi)
+st_context_destroy(struct st_context *st)
 {
-   struct st_context *st = (struct st_context *) stctxi;
    st_destroy_context(st);
 }
 
 
 static void
-st_start_thread(struct st_context_iface *stctxi)
+st_start_thread(struct st_context *st)
 {
-   struct st_context *st = (struct st_context *) stctxi;
-
    _mesa_glthread_init(st->ctx);
 }
 
 
 static void
-st_thread_finish(struct st_context_iface *stctxi)
+st_thread_finish(struct st_context *st)
 {
-   struct st_context *st = (struct st_context *) stctxi;
-
    _mesa_glthread_finish(st->ctx);
 }
 
 
 static void
-st_context_invalidate_state(struct st_context_iface *stctxi,
+st_context_invalidate_state(struct st_context *st,
                             unsigned flags)
 {
-   struct st_context *st = (struct st_context *) stctxi;
-
    if (flags & ST_INVALIDATE_FS_SAMPLER_VIEWS)
       st->dirty |= ST_NEW_FS_SAMPLER_VIEWS;
    if (flags & ST_INVALIDATE_FS_CONSTBUF0)
@@ -998,13 +982,12 @@ st_manager_destroy(struct pipe_frontend_screen *fscreen)
 }
 
 
-struct st_context_iface *
+struct st_context *
 st_api_create_context(struct pipe_frontend_screen *fscreen,
                       const struct st_context_attribs *attribs,
                       enum st_context_error *error,
-                      struct st_context_iface *shared_stctxi)
+                      struct st_context *shared_ctx)
 {
-   struct st_context *shared_ctx = (struct st_context *) shared_stctxi;
    struct st_context *st;
    struct pipe_context *pipe;
    struct gl_config mode, *mode_ptr = &mode;
@@ -1128,34 +1111,33 @@ st_api_create_context(struct pipe_frontend_screen *fscreen,
    st->ctx->invalidate_on_gl_viewport =
       fscreen->get_param(fscreen, ST_MANAGER_BROKEN_INVALIDATE);
 
-   st->iface.destroy = st_context_destroy;
-   st->iface.flush = st_context_flush;
-   st->iface.teximage = st_context_teximage;
-   st->iface.copy = st_context_copy;
-   st->iface.share = st_context_share;
-   st->iface.start_thread = st_start_thread;
-   st->iface.thread_finish = st_thread_finish;
-   st->iface.invalidate_state = st_context_invalidate_state;
-   st->iface.cso_context = st->cso_context;
-   st->iface.pipe = st->pipe;
-   st->iface.frontend_screen = fscreen;
+   st->destroy = st_context_destroy;
+   st->flush = st_context_flush;
+   st->teximage = st_context_teximage;
+   st->copy = st_context_copy;
+   st->share = st_context_share;
+   st->start_thread = st_start_thread;
+   st->thread_finish = st_thread_finish;
+   st->invalidate_state = st_context_invalidate_state;
+   st->cso_context = st->cso_context;
+   st->pipe = st->pipe;
+   st->frontend_screen = fscreen;
 
    if (st->ctx->IntelBlackholeRender &&
        st->screen->get_param(st->screen, PIPE_CAP_FRONTEND_NOOP))
       st->pipe->set_frontend_noop(st->pipe, st->ctx->IntelBlackholeRender);
 
    *error = ST_CONTEXT_SUCCESS;
-   return &st->iface;
+   return st;
 }
 
 
-struct st_context_iface *
+struct st_context *
 st_api_get_current(void)
 {
    GET_CURRENT_CONTEXT(ctx);
-   struct st_context *st = ctx ? ctx->st : NULL;
 
-   return st ? &st->iface : NULL;
+   return ctx ? ctx->st : NULL;
 }
 
 
@@ -1204,11 +1186,10 @@ st_framebuffer_reuse_or_create(struct st_context *st,
 
 
 bool
-st_api_make_current(struct st_context_iface *stctxi,
+st_api_make_current(struct st_context *st,
                     struct st_framebuffer_iface *stdrawi,
                     struct st_framebuffer_iface *streadi)
 {
-   struct st_context *st = (struct st_context *) stctxi;
    struct gl_framebuffer *stdraw, *stread;
    bool ret;
 
@@ -1309,7 +1290,7 @@ st_manager_flush_frontbuffer(struct st_context *st)
     * frontbuffer flush?
     */
    if (rb && rb->defined &&
-       stfb->iface->flush_front(&st->iface, stfb->iface, statt)) {
+       stfb->iface->flush_front(st, stfb->iface, statt)) {
       rb->defined = GL_FALSE;
 
       /* Trigger an update of rb->defined on next draw */
@@ -1353,7 +1334,7 @@ st_manager_flush_swapbuffers(void)
    if (!stfb || !stfb->iface->flush_swapbuffers)
       return;
 
-   stfb->iface->flush_swapbuffers(&st->iface, stfb->iface);
+   stfb->iface->flush_swapbuffers(st, stfb->iface);
 }