st/dri: Switch from st_public.h to st_api.h.
authorChia-I Wu <olv@lunarg.com>
Mon, 8 Mar 2010 14:19:48 +0000 (22:19 +0800)
committerChia-I Wu <olv@lunarg.com>
Thu, 18 Mar 2010 01:43:22 +0000 (09:43 +0800)
This is tested with demos found in progs/demos.  However, only the DRI2
path is tested.

src/gallium/state_trackers/dri/dri1.c
src/gallium/state_trackers/dri/dri1.h
src/gallium/state_trackers/dri/dri_context.c
src/gallium/state_trackers/dri/dri_context.h
src/gallium/state_trackers/dri/dri_drawable.c
src/gallium/state_trackers/dri/dri_drawable.h
src/gallium/state_trackers/dri/dri_extensions.c
src/gallium/state_trackers/dri/dri_screen.c
src/gallium/state_trackers/dri/dri_screen.h
src/gallium/state_trackers/dri/dri_st_api.c

index 543891f813b966e63f4baed642571afc20ab0bd8..41dba82d5286303fd92e0eddbcafe326eda08fea 100644 (file)
  * Author: Jakob Bornecrantz <wallbraker@gmail.com>
  */
 
+/* XXX DRI1 is untested after the switch to st_api.h */
+
 #include "util/u_memory.h"
 #include "util/u_rect.h"
+#include "util/u_inlines.h"
 #include "pipe/p_context.h"
-#include "state_tracker/st_context.h"
-#include "state_tracker/st_public.h"
 #include "state_tracker/dri1_api.h"
 
 #include "dri_screen.h"
 #include "dri_context.h"
 #include "dri_drawable.h"
+#include "dri_st_api.h"
 #include "dri1.h"
 
 static INLINE void
@@ -125,52 +127,29 @@ dri1_update_drawables_locked(struct dri_context *ctx,
 /**
  * This ensures all contexts which bind to a drawable pick up the
  * drawable change and signal new buffer state.
- * Calling st_resize_framebuffer for each context may seem like overkill,
- * but no new buffers will actually be allocated if the dimensions don't
- * change.
  */
-
 static void
 dri1_propagate_drawable_change(struct dri_context *ctx)
 {
    __DRIdrawable *dPriv = ctx->dPriv;
    __DRIdrawable *rPriv = ctx->rPriv;
+   struct dri_drawable *draw = dri_drawable(dPriv);
+   struct dri_drawable *read = dri_drawable(rPriv);
    boolean flushed = FALSE;
 
-   if (dPriv && ctx->d_stamp != dPriv->lastStamp) {
-
-      st_flush(ctx->st, PIPE_FLUSH_RENDER_CACHE, NULL);
+   if (dPriv && draw->texture_stamp != dPriv->lastStamp) {
+      ctx->st->flush(ctx->st, PIPE_FLUSH_RENDER_CACHE, NULL);
       flushed = TRUE;
-      ctx->d_stamp = dPriv->lastStamp;
-      st_resize_framebuffer(dri_drawable(dPriv)->stfb, dPriv->w, dPriv->h);
-
+      ctx->st->notify_invalid_framebuffer(ctx->st, draw->stfb);
    }
 
-   if (rPriv && dPriv != rPriv && ctx->r_stamp != rPriv->lastStamp) {
-
+   if (rPriv && dPriv != rPriv && read->texture_stamp != rPriv->lastStamp) {
       if (!flushed)
-        st_flush(ctx->st, PIPE_FLUSH_RENDER_CACHE, NULL);
-      ctx->r_stamp = rPriv->lastStamp;
-      st_resize_framebuffer(dri_drawable(rPriv)->stfb, rPriv->w, rPriv->h);
-
-   } else if (rPriv && dPriv == rPriv) {
-
-      ctx->r_stamp = ctx->d_stamp;
-
+        ctx->st->flush(ctx->st, PIPE_FLUSH_RENDER_CACHE, NULL);
+      ctx->st->notify_invalid_framebuffer(ctx->st, read->stfb);
    }
 }
 
-void
-dri1_update_drawables(struct dri_context *ctx,
-                     struct dri_drawable *draw, struct dri_drawable *read)
-{
-   dri1_lock(ctx);
-   dri1_update_drawables_locked(ctx, draw->dPriv, read->dPriv);
-   dri1_unlock(ctx);
-
-   dri1_propagate_drawable_change(ctx);
-}
-
 static INLINE boolean
 dri1_intersect_src_bbox(struct drm_clip_rect *dst,
                        int dst_x,
@@ -204,12 +183,11 @@ dri1_intersect_src_bbox(struct drm_clip_rect *dst,
 }
 
 static void
-dri1_swap_copy(struct dri_context *ctx,
+dri1_swap_copy(struct pipe_context *pipe,
               struct pipe_surface *dst,
               struct pipe_surface *src,
               __DRIdrawable * dPriv, const struct drm_clip_rect *bbox)
 {
-   struct pipe_context *pipe = ctx->pipe;
    struct drm_clip_rect clip;
    struct drm_clip_rect *cur;
    int i;
@@ -235,52 +213,96 @@ dri1_swap_copy(struct dri_context *ctx,
    }
 }
 
+static struct pipe_surface *
+dri1_get_pipe_surface(struct dri_drawable *drawable, struct pipe_texture *ptex)
+{
+   struct pipe_screen *pipe_screen = dri_screen(drawable->sPriv)->pipe_screen;
+   struct pipe_surface *psurf = drawable->dri1_surface;
+
+   if (!psurf || psurf->texture != ptex) {
+      pipe_surface_reference(&drawable->dri1_surface, NULL);
+
+      drawable->dri1_surface = pipe_screen->get_tex_surface(pipe_screen,
+            ptex, 0, 0, 0, PIPE_BUFFER_USAGE_GPU_READ);
+
+      psurf = drawable->dri1_surface;
+   }
+
+   return psurf;
+}
+
+static struct pipe_context *
+dri1_get_pipe_context(struct dri_drawable *drawable)
+{
+   struct dri_screen *screen = dri_screen(drawable->sPriv);
+   struct pipe_context *pipe = screen->dri1_pipe;
+
+   if (!pipe) {
+      screen->dri1_pipe =
+         screen->pipe_screen->context_create(screen->pipe_screen, NULL);
+      pipe = screen->dri1_pipe;
+   }
+
+   return pipe;
+}
+
 static void
-dri1_copy_to_front(struct dri_context *ctx,
-                  struct pipe_surface *surf,
-                  __DRIdrawable * dPriv,
-                  const struct drm_clip_rect *sub_box,
-                  struct pipe_fence_handle **fence)
+dri1_present_texture_locked(__DRIdrawable * dPriv,
+                            struct pipe_texture *ptex,
+                            const struct drm_clip_rect *sub_box,
+                            struct pipe_fence_handle **fence)
 {
-   struct pipe_context *pipe = ctx->pipe;
-   boolean save_lost_lock;
-   uint cur_w;
-   uint cur_h;
+   struct dri_drawable *drawable = dri_drawable(dPriv);
+   struct pipe_context *pipe;
+   struct pipe_surface *psurf;
    struct drm_clip_rect bbox;
    boolean visible = TRUE;
 
    *fence = NULL;
 
-   dri1_lock(ctx);
-   save_lost_lock = ctx->stLostLock;
-   dri1_update_drawables_locked(ctx, dPriv, dPriv);
-   st_get_framebuffer_dimensions(dri_drawable(dPriv)->stfb, &cur_w, &cur_h);
-
    bbox.x1 = 0;
-   bbox.x2 = cur_w;
+   bbox.x2 = ptex->width0;
    bbox.y1 = 0;
-   bbox.y2 = cur_h;
+   bbox.y2 = ptex->height0;
 
    if (sub_box)
       visible = dri1_intersect_src_bbox(&bbox, 0, 0, &bbox, sub_box);
+   if (!visible)
+      return;
 
-   if (visible && __dri1_api_hooks->present_locked) {
-
-      __dri1_api_hooks->present_locked(pipe,
-                                      surf,
-                                      dPriv->pClipRects,
-                                      dPriv->numClipRects,
-                                      dPriv->x, dPriv->y, &bbox, fence);
-
-   } else if (visible && __dri1_api_hooks->front_srf_locked) {
+   pipe = dri1_get_pipe_context(drawable);
+   psurf = dri1_get_pipe_surface(drawable, ptex);
+   if (!pipe || !psurf)
+      return;
 
+   if (__dri1_api_hooks->present_locked) {
+      __dri1_api_hooks->present_locked(pipe, psurf,
+                                       dPriv->pClipRects, dPriv->numClipRects,
+                                       dPriv->x, dPriv->y, &bbox, fence);
+   } else if (__dri1_api_hooks->front_srf_locked) {
       struct pipe_surface *front = __dri1_api_hooks->front_srf_locked(pipe);
 
       if (front)
-        dri1_swap_copy(ctx, front, surf, dPriv, &bbox);
+         dri1_swap_copy(pipe, front, psurf, dPriv, &bbox);
 
-      st_flush(ctx->st, PIPE_FLUSH_RENDER_CACHE, fence);
+      pipe->flush(pipe, PIPE_FLUSH_RENDER_CACHE, fence);
    }
+}
+
+static void
+dri1_copy_to_front(struct dri_context *ctx,
+                  struct pipe_texture *ptex,
+                  __DRIdrawable * dPriv,
+                  const struct drm_clip_rect *sub_box,
+                  struct pipe_fence_handle **fence)
+{
+   boolean save_lost_lock;
+
+   dri1_lock(ctx);
+   save_lost_lock = ctx->stLostLock;
+   dri1_update_drawables_locked(ctx, dPriv, dPriv);
+
+   dri1_present_texture_locked(dPriv, ptex, sub_box, fence);
 
    ctx->stLostLock = save_lost_lock;
 
@@ -296,14 +318,23 @@ dri1_copy_to_front(struct dri_context *ctx,
 }
 
 void
-dri1_flush_frontbuffer(struct pipe_screen *screen,
-                      struct pipe_surface *surf, void *context_private)
+dri1_flush_frontbuffer(struct dri_drawable *drawable,
+                       struct pipe_texture *ptex)
 {
-   struct dri_context *ctx = (struct dri_context *)context_private;
+   struct st_api *stapi = dri_get_st_api();
+   struct dri_screen *screen = dri_screen(drawable->sPriv);
+   struct pipe_screen *pipe_screen = screen->pipe_screen;
+   struct dri_context *ctx;
    struct pipe_fence_handle *dummy_fence;
+   struct st_context_iface *st = stapi->get_current(stapi);
 
-   dri1_copy_to_front(ctx, surf, ctx->dPriv, NULL, &dummy_fence);
-   screen->fence_reference(screen, &dummy_fence, NULL);
+   if (!st)
+      return;
+
+   ctx = (struct dri_context *) st->st_manager_private;
+
+   dri1_copy_to_front(ctx, ptex, ctx->dPriv, NULL, &dummy_fence);
+   pipe_screen->fence_reference(pipe_screen, &dummy_fence, NULL);
 
    /**
     * FIXME: Do we need swap throttling here?
@@ -313,66 +344,127 @@ dri1_flush_frontbuffer(struct pipe_screen *screen,
 void
 dri1_swap_buffers(__DRIdrawable * dPriv)
 {
-   struct dri_context *ctx;
-   struct pipe_surface *back_surf;
+   struct dri_context *ctx = dri_get_current();
    struct dri_drawable *draw = dri_drawable(dPriv);
-   struct pipe_screen *screen = dri_screen(draw->sPriv)->pipe_screen;
+   struct dri_screen *screen = dri_screen(draw->sPriv);
+   struct pipe_screen *pipe_screen = screen->pipe_screen;
    struct pipe_fence_handle *fence;
-   struct st_context *st = st_get_current();
+   struct pipe_texture *ptex;
 
    assert(__dri1_api_hooks != NULL);
 
-   if (!st)
+   if (!ctx)
       return;                         /* For now */
 
-   ctx = (struct dri_context *)st->pipe->priv;
-
-   st_get_framebuffer_surface(draw->stfb, ST_SURFACE_BACK_LEFT, &back_surf);
-   if (back_surf) {
-      st_notify_swapbuffers(draw->stfb);
-      st_flush(ctx->st, PIPE_FLUSH_RENDER_CACHE, NULL);
+   ptex = draw->textures[ST_ATTACHMENT_BACK_LEFT];
+   if (ptex) {
+      ctx->st->flush(ctx->st, PIPE_FLUSH_RENDER_CACHE, NULL);
       fence = dri_swap_fences_pop_front(draw);
       if (fence) {
-        (void)screen->fence_finish(screen, fence, 0);
-        screen->fence_reference(screen, &fence, NULL);
+        (void)pipe_screen->fence_finish(pipe_screen, fence, 0);
+        pipe_screen->fence_reference(pipe_screen, &fence, NULL);
       }
-      dri1_copy_to_front(ctx, back_surf, dPriv, NULL, &fence);
+      dri1_copy_to_front(ctx, ptex, dPriv, NULL, &fence);
       dri_swap_fences_push_back(draw, fence);
-      screen->fence_reference(screen, &fence, NULL);
+      pipe_screen->fence_reference(pipe_screen, &fence, NULL);
    }
 }
 
 void
 dri1_copy_sub_buffer(__DRIdrawable * dPriv, int x, int y, int w, int h)
 {
-   struct pipe_screen *screen = dri_screen(dPriv->driScreenPriv)->pipe_screen;
+   struct dri_context *ctx = dri_get_current();
+   struct dri_screen *screen = dri_screen(dPriv->driScreenPriv);
+   struct pipe_screen *pipe_screen = screen->pipe_screen;
    struct drm_clip_rect sub_bbox;
-   struct dri_context *ctx;
-   struct pipe_surface *back_surf;
    struct dri_drawable *draw = dri_drawable(dPriv);
    struct pipe_fence_handle *dummy_fence;
-   struct st_context *st = st_get_current();
+   struct pipe_texture *ptex;
 
    assert(__dri1_api_hooks != NULL);
 
-   if (!st)
+   if (!ctx)
       return;
 
-   ctx = (struct dri_context *)st->pipe->priv;
-
    sub_bbox.x1 = x;
    sub_bbox.x2 = x + w;
    sub_bbox.y1 = y;
    sub_bbox.y2 = y + h;
 
-   st_get_framebuffer_surface(draw->stfb, ST_SURFACE_BACK_LEFT, &back_surf);
-   if (back_surf) {
-      st_flush(ctx->st, PIPE_FLUSH_RENDER_CACHE, NULL);
-      dri1_copy_to_front(ctx, back_surf, dPriv, &sub_bbox, &dummy_fence);
-      screen->fence_reference(screen, &dummy_fence, NULL);
+   ptex = draw->textures[ST_ATTACHMENT_BACK_LEFT];
+   if (ptex) {
+      ctx->st->flush(ctx->st, PIPE_FLUSH_RENDER_CACHE, NULL);
+      dri1_copy_to_front(ctx, ptex, dPriv, &sub_bbox, &dummy_fence);
+      pipe_screen->fence_reference(pipe_screen, &dummy_fence, NULL);
    }
 }
 
+void
+dri1_allocate_textures(struct dri_drawable *drawable,
+                       unsigned width, unsigned height,
+                       unsigned mask)
+{
+   struct dri_screen *screen = dri_screen(drawable->sPriv);
+   struct pipe_texture templ;
+   int i;
+
+   /* remove outdated textures */
+   if (drawable->old_w != width || drawable->old_h != height) {
+      for (i = 0; i < ST_ATTACHMENT_COUNT; i++)
+         pipe_texture_reference(&drawable->textures[i], NULL);
+   }
+
+   memset(&templ, 0, sizeof(templ));
+   templ.target = PIPE_TEXTURE_2D;
+   templ.width0 = width;
+   templ.height0 = height;
+   templ.depth0 = 1;
+   templ.last_level = 0;
+
+   for (i = 0; i < ST_ATTACHMENT_COUNT; i++) {
+      enum pipe_format format;
+      unsigned tex_usage;
+
+      /* the texture already exists or not requested */
+      if (drawable->textures[i] || !(mask & (1 << i))) {
+         /* remember the texture */
+         if (drawable->textures[i])
+            mask |= (1 << i);
+         continue;
+      }
+
+      switch (i) {
+      case ST_ATTACHMENT_FRONT_LEFT:
+      case ST_ATTACHMENT_BACK_LEFT:
+      case ST_ATTACHMENT_FRONT_RIGHT:
+      case ST_ATTACHMENT_BACK_RIGHT:
+         format = drawable->stvis.color_format;
+         tex_usage = PIPE_TEXTURE_USAGE_DISPLAY_TARGET |
+                     PIPE_TEXTURE_USAGE_RENDER_TARGET;
+         break;
+      case ST_ATTACHMENT_DEPTH_STENCIL:
+         format = drawable->stvis.depth_stencil_format;
+         tex_usage = PIPE_TEXTURE_USAGE_DEPTH_STENCIL;
+         break;
+      default:
+         format = PIPE_FORMAT_NONE;
+         break;
+      }
+
+      if (templ.format != PIPE_FORMAT_NONE) {
+         templ.format = format;
+         templ.tex_usage = tex_usage;
+
+         drawable->textures[i] =
+            screen->pipe_screen->texture_create(screen->pipe_screen, &templ);
+      }
+   }
+
+   drawable->old_w = width;
+   drawable->old_h = height;
+   drawable->texture_mask = mask;
+}
+
 static void
 st_dri_lock(struct pipe_context *pipe)
 {
@@ -469,7 +561,6 @@ dri1_init_screen(__DRIscreen * sPriv)
 
    __dri1_api_hooks = arg.api;
 
-   screen->pipe_screen->flush_frontbuffer = dri1_flush_frontbuffer;
    driParseOptionInfo(&screen->optionCache,
                      __driConfigOptions, __driNConfigOptions);
 
index e525ce64c3f0b09f17764f80b5eb4061151b32bd..e83571e57bec9d3e6cc285a1c1e70411ac6e8f0f 100644 (file)
@@ -34,6 +34,8 @@
 
 #include "dri_context.h"
 #include "dri_drawable.h"
+
+#include "state_tracker/st_api.h"
 #include "dri_util.h"
 
 extern struct dri1_api *__dri1_api_hooks;
@@ -42,12 +44,13 @@ const __DRIconfig **
 dri1_init_screen(__DRIscreen * sPriv);
 
 void
-dri1_update_drawables(struct dri_context *ctx,
-                     struct dri_drawable *draw, struct dri_drawable *read);
+dri1_flush_frontbuffer(struct dri_drawable *drawable,
+                       struct pipe_texture *ptex);
 
 void
-dri1_flush_frontbuffer(struct pipe_screen *screen,
-                      struct pipe_surface *surf, void *context_private);
+dri1_allocate_textures(struct dri_drawable *drawable,
+                       unsigned width, unsigned height,
+                       unsigned mask);
 
 void dri1_swap_buffers(__DRIdrawable * dPriv);
 
index 8e74d3b9bf1cddf4e5c222905b3a36787505007e..c1848b026cdbbb9d007d9f420091d2818ffc07c3 100644 (file)
@@ -32,9 +32,9 @@
 #include "dri_screen.h"
 #include "dri_drawable.h"
 #include "dri_context.h"
+#include "dri_st_api.h"
 #include "dri1.h"
 
-#include "state_tracker/st_public.h"
 #include "pipe/p_context.h"
 #include "util/u_memory.h"
 
@@ -42,10 +42,12 @@ GLboolean
 dri_create_context(const __GLcontextModes * visual,
                   __DRIcontext * cPriv, void *sharedContextPrivate)
 {
+   struct st_api *stapi = dri_get_st_api();
    __DRIscreen *sPriv = cPriv->driScreenPriv;
    struct dri_screen *screen = dri_screen(sPriv);
    struct dri_context *ctx = NULL;
-   struct st_context *st_share = NULL;
+   struct st_context_iface *st_share = NULL;
+   struct st_visual stvis;
 
    if (sharedContextPrivate) {
       st_share = ((struct dri_context *)sharedContextPrivate)->st;
@@ -59,21 +61,15 @@ dri_create_context(const __GLcontextModes * visual,
    ctx->cPriv = cPriv;
    ctx->sPriv = sPriv;
    ctx->lock = screen->drmLock;
-   ctx->d_stamp = -1;
-   ctx->r_stamp = -1;
 
    driParseConfigFiles(&ctx->optionCache,
                       &screen->optionCache, sPriv->myNum, "dri");
 
-   ctx->pipe = screen->pipe_screen->context_create( screen->pipe_screen,
-                                                   ctx );
-
-   if (ctx->pipe == NULL)
-      goto fail;
-
-   ctx->st = st_create_context(ctx->pipe, visual, st_share);
+   dri_fill_st_visual(&stvis, screen, visual);
+   ctx->st = stapi->create_context(stapi, screen->smapi, &stvis, st_share);
    if (ctx->st == NULL)
       goto fail;
+   ctx->st->st_manager_private = (void *) ctx;
 
    dri_init_extensions(ctx);
 
@@ -81,10 +77,7 @@ dri_create_context(const __GLcontextModes * visual,
 
  fail:
    if (ctx && ctx->st)
-      st_destroy_context(ctx->st);
-
-   if (ctx && ctx->pipe)
-      ctx->pipe->destroy(ctx->pipe);
+      ctx->st->destroy(ctx->st);
 
    FREE(ctx);
    return FALSE;
@@ -106,11 +99,8 @@ dri_destroy_context(__DRIcontext * cPriv)
     * to avoid having to add code elsewhere to cope with flushing a
     * partially destroyed context.
     */
-   st_flush(ctx->st, 0, NULL);
-
-   /* Also frees ctx->pipe?
-    */
-   st_destroy_context(ctx->st);
+   ctx->st->flush(ctx->st, 0, NULL);
+   ctx->st->destroy(ctx->st);
 
    FREE(ctx);
 }
@@ -118,14 +108,16 @@ dri_destroy_context(__DRIcontext * cPriv)
 GLboolean
 dri_unbind_context(__DRIcontext * cPriv)
 {
+   struct st_api *stapi = dri_get_st_api();
+
    if (cPriv) {
       struct dri_context *ctx = dri_context(cPriv);
 
       if (--ctx->bind_count == 0) {
-        if (ctx->st && ctx->st == st_get_current()) {
-           st_flush(ctx->st, PIPE_FLUSH_RENDER_CACHE, NULL);
-           st_make_current(NULL, NULL, NULL, NULL);
-        }
+         if (ctx->st == stapi->get_current(stapi)) {
+            ctx->st->flush(ctx->st, PIPE_FLUSH_RENDER_CACHE, NULL);
+            stapi->make_current(stapi, NULL, NULL, NULL);
+         }
       }
    }
 
@@ -137,45 +129,47 @@ dri_make_current(__DRIcontext * cPriv,
                 __DRIdrawable * driDrawPriv,
                 __DRIdrawable * driReadPriv)
 {
+   struct st_api *stapi = dri_get_st_api();
+
    if (cPriv) {
       struct dri_context *ctx = dri_context(cPriv);
       struct dri_drawable *draw = dri_drawable(driDrawPriv);
       struct dri_drawable *read = dri_drawable(driReadPriv);
-      struct st_context *old_st = st_get_current();
+      struct st_context_iface *old_st;
 
+      old_st = stapi->get_current(stapi);
       if (old_st && old_st != ctx->st)
-        st_flush(old_st, PIPE_FLUSH_RENDER_CACHE, NULL);
+        ctx->st->flush(old_st, PIPE_FLUSH_RENDER_CACHE, NULL);
 
       ++ctx->bind_count;
 
       if (ctx->dPriv != driDrawPriv) {
         ctx->dPriv = driDrawPriv;
-        ctx->d_stamp = driDrawPriv->lastStamp - 1;
+         draw->texture_stamp = driDrawPriv->lastStamp - 1;
       }
       if (ctx->rPriv != driReadPriv) {
         ctx->rPriv = driReadPriv;
-        ctx->r_stamp = driReadPriv->lastStamp - 1;
+         draw->texture_stamp = driReadPriv->lastStamp - 1;
       }
 
-      /* DRI co-state tracker currently overrides flush_frontbuffer.
-       * When this is fixed, will need to pass the drawable in the
-       * fourth parameter here so that when Mesa calls
-       * flush_frontbuffer directly (in front-buffer rendering), it
-       * will have access to the drawable argument:
-       */
-      st_make_current(ctx->st, draw->stfb, read->stfb, ctx);
-
-      if (__dri1_api_hooks) {
-        dri1_update_drawables(ctx, draw, read);
-      } else {
-        dri_update_buffer(ctx->pipe->screen,
-                          ctx->pipe->priv);
-      }
-   } else {
-      st_make_current(NULL, NULL, NULL, NULL);
+      stapi->make_current(stapi, ctx->st, draw->stfb, read->stfb);
+   }
+   else {
+      stapi->make_current(stapi, NULL, NULL, NULL);
    }
 
    return GL_TRUE;
 }
 
+struct dri_context *
+dri_get_current(void)
+{
+   struct st_api *stapi = dri_get_st_api();
+   struct st_context_iface *st;
+
+   st = stapi->get_current(stapi);
+
+   return (struct dri_context *) (st) ? st->st_manager_private : NULL;
+}
+
 /* vim: set sw=3 ts=8 sts=3 expandtab: */
index f0700b9aaff963f4e9f0cce1e896264dbbc3e0a6..845b420cf8993c8445dfdf3b53d580ca63cc64dd 100644 (file)
@@ -51,9 +51,6 @@ struct dri_context
 
    driOptionCache optionCache;
 
-   unsigned int d_stamp;
-   unsigned int r_stamp;
-
    drmLock *lock;
    boolean isLocked;
    boolean stLostLock;
@@ -62,8 +59,7 @@ struct dri_context
    unsigned int bind_count;
 
    /* gallium */
-   struct st_context *st;
-   struct pipe_context *pipe;
+   struct st_context_iface *st;
 };
 
 static INLINE struct dri_context *
@@ -84,6 +80,9 @@ dri_make_current(__DRIcontext * driContextPriv,
                 __DRIdrawable * driDrawPriv,
                 __DRIdrawable * driReadPriv);
 
+struct dri_context *
+dri_get_current(void);
+
 boolean
 dri_create_context(const __GLcontextModes * visual,
                   __DRIcontext * driContextPriv,
index 9238f94299958856d0b2b3e151e217a35e0b25f2..930387f8a67330d5703f7a89ae8bcd00336b39fb 100644 (file)
 #include "dri_screen.h"
 #include "dri_context.h"
 #include "dri_drawable.h"
+#include "dri_st_api.h"
 #include "dri1.h"
 
-#include "main/mtypes.h"
-#include "main/renderbuffer.h"
-#include "state_tracker/st_context.h"
-#include "state_tracker/st_public.h"
-#include "state_tracker/st_cb_fbo.h"
-#include "state_tracker/drm_api.h"
-
 #include "pipe/p_screen.h"
 #include "util/u_format.h"
 #include "util/u_memory.h"
 #include "util/u_inlines.h"
  
-static struct pipe_surface *
-dri_surface_from_handle(struct drm_api *api,
-                       struct pipe_screen *screen,
-                       unsigned handle,
-                       enum pipe_format format,
-                       unsigned width, unsigned height, unsigned pitch)
-{
-   struct pipe_surface *surface = NULL;
-   struct pipe_texture *texture = NULL;
-   struct pipe_texture templat;
-   struct winsys_handle whandle;
-
-   memset(&templat, 0, sizeof(templat));
-   templat.tex_usage |= PIPE_TEXTURE_USAGE_RENDER_TARGET;
-   templat.target = PIPE_TEXTURE_2D;
-   templat.last_level = 0;
-   templat.depth0 = 1;
-   templat.format = format;
-   templat.width0 = width;
-   templat.height0 = height;
-
-   memset(&whandle, 0, sizeof(whandle));
-   whandle.handle = handle;
-   whandle.stride = pitch;
-
-   texture = screen->texture_from_handle(screen, &templat, &whandle);
-
-   if (!texture) {
-      debug_printf("%s: Failed to blanket the buffer with a texture\n", __func__);
-      return NULL;
-   }
-
-   surface = screen->get_tex_surface(screen, texture, 0, 0, 0,
-                                    PIPE_BUFFER_USAGE_GPU_READ |
-                                    PIPE_BUFFER_USAGE_GPU_WRITE);
-
-   /* we don't need the texture from this point on */
-   pipe_texture_reference(&texture, NULL);
-   return surface;
-}
-
-/**
- * Pixmaps have will have the same name of fake front and front.
- */
-static boolean
-dri2_check_if_pixmap(__DRIbuffer *buffers, int count)
-{
-   boolean found = FALSE;
-   boolean is_pixmap = FALSE;
-   unsigned name;
-   int i;
-
-   for (i = 0; i < count; i++) {
-      switch (buffers[i].attachment) {
-      case __DRI_BUFFER_FRONT_LEFT:
-      case __DRI_BUFFER_FAKE_FRONT_LEFT:
-         if (found) {
-            is_pixmap = buffers[i].name == name;
-         } else {
-            name = buffers[i].name;
-            found = TRUE;
-         }
-      default:
-        continue;
-      }
-   }
-
-   return is_pixmap;
-}
-
-/**
- * This will be called a drawable is known to have been resized.
- */
-void
-dri_get_buffers(__DRIdrawable * dPriv)
-{
-
-   struct dri_drawable *drawable = dri_drawable(dPriv);
-   struct pipe_surface *surface = NULL;
-   struct dri_screen *st_screen = dri_screen(drawable->sPriv);
-   struct pipe_screen *screen = st_screen->pipe_screen;
-   __DRIbuffer *buffers = NULL;
-   __DRIscreen *dri_screen = drawable->sPriv;
-   __DRIdrawable *dri_drawable = drawable->dPriv;
-   struct drm_api *api = st_screen->api;
-   boolean have_depth = FALSE;
-   int i, count;
-
-   if ((dri_screen->dri2.loader
-        && (dri_screen->dri2.loader->base.version > 2)
-        && (dri_screen->dri2.loader->getBuffersWithFormat != NULL))) {
-      buffers = (*dri_screen->dri2.loader->getBuffersWithFormat)
-                (dri_drawable, &dri_drawable->w, &dri_drawable->h,
-                 drawable->attachments, drawable->num_attachments,
-                 &count, dri_drawable->loaderPrivate);
-   } else {
-      assert(dri_screen->dri2.loader);
-      buffers = (*dri_screen->dri2.loader->getBuffers) (dri_drawable,
-                                                        &dri_drawable->w,
-                                                        &dri_drawable->h,
-                                                        drawable->attachments,
-                                                        drawable->
-                                                        num_attachments, &count,
-                                                        dri_drawable->
-                                                        loaderPrivate);
-   }
-
-   if (buffers == NULL) {
-      return;
-   }
-
-   /* set one cliprect to cover the whole dri_drawable */
-   dri_drawable->x = 0;
-   dri_drawable->y = 0;
-   dri_drawable->backX = 0;
-   dri_drawable->backY = 0;
-   dri_drawable->numClipRects = 1;
-   dri_drawable->pClipRects[0].x1 = 0;
-   dri_drawable->pClipRects[0].y1 = 0;
-   dri_drawable->pClipRects[0].x2 = dri_drawable->w;
-   dri_drawable->pClipRects[0].y2 = dri_drawable->h;
-   dri_drawable->numBackClipRects = 1;
-   dri_drawable->pBackClipRects[0].x1 = 0;
-   dri_drawable->pBackClipRects[0].y1 = 0;
-   dri_drawable->pBackClipRects[0].x2 = dri_drawable->w;
-   dri_drawable->pBackClipRects[0].y2 = dri_drawable->h;
-
-   if (drawable->old_num == count &&
-       drawable->old_w == dri_drawable->w &&
-       drawable->old_h == dri_drawable->h &&
-       memcmp(drawable->old, buffers, sizeof(__DRIbuffer) * count) == 0) {
-       return;
-   } else {
-      drawable->old_num = count;
-      drawable->old_w = dri_drawable->w;
-      drawable->old_h = dri_drawable->h;
-      memcpy(drawable->old, buffers, sizeof(__DRIbuffer) * count);
-   }
-
-   drawable->is_pixmap = dri2_check_if_pixmap(buffers, count);
-
-   for (i = 0; i < count; i++) {
-      enum pipe_format format = 0;
-      int index = 0;
-
-      switch (buffers[i].attachment) {
-      case __DRI_BUFFER_FRONT_LEFT:
-        if (!st_screen->auto_fake_front)
-           continue;
-        /* fallthrough */
-      case __DRI_BUFFER_FAKE_FRONT_LEFT:
-        index = ST_SURFACE_FRONT_LEFT;
-        format = drawable->color_format;
-        break;
-      case __DRI_BUFFER_BACK_LEFT:
-        index = ST_SURFACE_BACK_LEFT;
-        format = drawable->color_format;
-        break;
-      case __DRI_BUFFER_DEPTH:
-      case __DRI_BUFFER_DEPTH_STENCIL:
-      case __DRI_BUFFER_STENCIL:
-        index = ST_SURFACE_DEPTH;
-        format = drawable->depth_stencil_format;
-        break;
-      case __DRI_BUFFER_ACCUM:
-      default:
-        assert(0);
-      }
-
-      if (index == ST_SURFACE_DEPTH) {
-        if (have_depth)
-           continue;
-        else
-           have_depth = TRUE;
-      }
-
-      surface = dri_surface_from_handle(api,
-                                       screen,
-                                       buffers[i].name,
-                                       format,
-                                       dri_drawable->w,
-                                       dri_drawable->h, buffers[i].pitch);
-
-      switch (buffers[i].attachment) {
-      case __DRI_BUFFER_FRONT_LEFT:
-      case __DRI_BUFFER_FAKE_FRONT_LEFT:
-      case __DRI_BUFFER_BACK_LEFT:
-        drawable->color_format = surface->format;
-        break;
-      case __DRI_BUFFER_DEPTH:
-      case __DRI_BUFFER_DEPTH_STENCIL:
-      case __DRI_BUFFER_STENCIL:
-        drawable->depth_stencil_format = surface->format;
-        break;
-      case __DRI_BUFFER_ACCUM:
-      default:
-        assert(0);
-      }
-
-      st_set_framebuffer_surface(drawable->stfb, index, surface);
-      pipe_surface_reference(&surface, NULL);
-   }
-   /* this needed, or else the state tracker fails to pick the new buffers */
-   st_resize_framebuffer(drawable->stfb, dri_drawable->w, dri_drawable->h);
-}
-
 /**
  * These are used for GLX_EXT_texture_from_pixmap
  */
 void dri2_set_tex_buffer2(__DRIcontext *pDRICtx, GLint target,
                           GLint format, __DRIdrawable *dPriv)
 {
+   struct dri_context *ctx = dri_context(pDRICtx);
    struct dri_drawable *drawable = dri_drawable(dPriv);
-   struct pipe_surface *ps;
+   struct pipe_texture *pt =
+      dri_get_st_framebuffer_texture(drawable->stfb, ST_ATTACHMENT_FRONT_LEFT);
 
-   if (!drawable->stfb->Base.Attachment[BUFFER_FRONT_LEFT].Renderbuffer) {
-      struct gl_renderbuffer *rb =
-         st_new_renderbuffer_fb(drawable->color_format, 0 /*XXX*/, FALSE);
-      _mesa_add_renderbuffer(&drawable->stfb->Base, BUFFER_FRONT_LEFT, rb);
+   if (pt) {
+      ctx->st->teximage(ctx->st,
+            (target == GL_TEXTURE_2D) ? ST_TEXTURE_2D : ST_TEXTURE_RECT,
+            0, drawable->stvis.color_format, pt, FALSE);
    }
-
-   dri_get_buffers(drawable->dPriv);
-   st_get_framebuffer_surface(drawable->stfb, ST_SURFACE_FRONT_LEFT, &ps);
-
-   if (!ps)
-      return;
-
-   st_bind_texture_surface(ps, target == GL_TEXTURE_2D ? ST_TEXTURE_2D :
-                           ST_TEXTURE_RECT, 0, drawable->color_format);
 }
 
 void dri2_set_tex_buffer(__DRIcontext *pDRICtx, GLint target,
@@ -283,53 +64,6 @@ void dri2_set_tex_buffer(__DRIcontext *pDRICtx, GLint target,
    dri2_set_tex_buffer2(pDRICtx, target, __DRI_TEXTURE_FORMAT_RGBA, dPriv);
 }
 
-void
-dri_update_buffer(struct pipe_screen *screen, void *context_private)
-{
-   struct dri_context *ctx = (struct dri_context *)context_private;
-
-   if (ctx->d_stamp == *ctx->dPriv->pStamp &&
-       ctx->r_stamp == *ctx->rPriv->pStamp)
-      return;
-
-   ctx->d_stamp = *ctx->dPriv->pStamp;
-   ctx->r_stamp = *ctx->rPriv->pStamp;
-
-   /* Ask the X server for new renderbuffers. */
-   dri_get_buffers(ctx->dPriv);
-   if (ctx->dPriv != ctx->rPriv)
-      dri_get_buffers(ctx->rPriv);
-
-}
-
-void
-dri_flush_frontbuffer(struct pipe_screen *screen,
-                     struct pipe_surface *surf, void *context_private)
-{
-   struct dri_context *ctx = (struct dri_context *)context_private;
-   struct dri_drawable *drawable = dri_drawable(ctx->dPriv);
-   __DRIdrawable *dri_drawable = ctx->dPriv;
-   __DRIscreen *dri_screen = ctx->sPriv;
-
-   /* XXX Does this function get called with DRI1? */
-
-   if (ctx->dPriv == NULL) {
-      debug_printf("%s: no drawable bound to context\n", __func__);
-      return;
-   }
-
-#if 0
-   /* TODO if rendering to pixmaps is slow enable this code. */
-   if (drawable->is_pixmap)
-      return;
-#else
-   (void)drawable;
-#endif
-
-   (*dri_screen->dri2.loader->flushFrontBuffer)(dri_drawable,
-                                               dri_drawable->loaderPrivate);
-}
-
 /**
  * This is called when we need to set up GL rendering to a new X window.
  */
@@ -340,7 +74,6 @@ dri_create_buffer(__DRIscreen * sPriv,
 {
    struct dri_screen *screen = sPriv->private;
    struct dri_drawable *drawable = NULL;
-   int i;
 
    if (isPixmap)
       goto fail;                      /* not implemented */
@@ -349,45 +82,8 @@ dri_create_buffer(__DRIscreen * sPriv,
    if (drawable == NULL)
       goto fail;
 
-   if (visual->redBits == 8) {
-      if (visual->alphaBits == 8)
-         drawable->color_format = PIPE_FORMAT_B8G8R8A8_UNORM;
-      else
-         drawable->color_format = PIPE_FORMAT_B8G8R8X8_UNORM;
-   } else {
-      drawable->color_format = PIPE_FORMAT_B5G6R5_UNORM;
-   }
-
-   switch(visual->depthBits) {
-   default:
-   case 0:
-      drawable->depth_stencil_format = PIPE_FORMAT_NONE;
-      break;
-   case 16:
-      drawable->depth_stencil_format = PIPE_FORMAT_Z16_UNORM;
-      break;
-   case 24:
-      if (visual->stencilBits == 0) {
-        drawable->depth_stencil_format = (screen->d_depth_bits_last) ?
-                                          PIPE_FORMAT_Z24X8_UNORM:
-                                          PIPE_FORMAT_X8Z24_UNORM;
-      } else {
-        drawable->depth_stencil_format = (screen->sd_depth_bits_last) ?
-                                          PIPE_FORMAT_Z24S8_UNORM:
-                                          PIPE_FORMAT_S8Z24_UNORM;
-      }
-      break;
-   case 32:
-      drawable->depth_stencil_format = PIPE_FORMAT_Z32_UNORM;
-      break;
-   }
-
-   drawable->stfb = st_create_framebuffer(visual,
-                                         drawable->color_format,
-                                         drawable->depth_stencil_format,
-                                         drawable->depth_stencil_format,
-                                         dPriv->w,
-                                         dPriv->h, (void *)drawable);
+   dri_fill_st_visual(&drawable->stvis, screen, visual);
+   drawable->stfb = dri_create_st_framebuffer(drawable);
    if (drawable->stfb == NULL)
       goto fail;
 
@@ -395,48 +91,6 @@ dri_create_buffer(__DRIscreen * sPriv,
    drawable->dPriv = dPriv;
    dPriv->driverPrivate = (void *)drawable;
 
-   /* setup dri2 buffers information */
-   /* TODO incase of double buffer visual, delay fake creation */
-   i = 0;
-   if (sPriv->dri2.loader
-       && (sPriv->dri2.loader->base.version > 2)
-       && (sPriv->dri2.loader->getBuffersWithFormat != NULL)) {
-      drawable->attachments[i++] = __DRI_BUFFER_FRONT_LEFT;
-      drawable->attachments[i++] = visual->rgbBits;
-      if (!screen->auto_fake_front)  {
-         drawable->attachments[i++] = __DRI_BUFFER_FAKE_FRONT_LEFT;
-         drawable->attachments[i++] = visual->rgbBits;
-      }
-      if (visual->doubleBufferMode) {
-         drawable->attachments[i++] = __DRI_BUFFER_BACK_LEFT;
-         drawable->attachments[i++] = visual->rgbBits;
-      }
-      if (visual->depthBits && visual->stencilBits) {
-         drawable->attachments[i++] = __DRI_BUFFER_DEPTH_STENCIL;
-         drawable->attachments[i++] = visual->depthBits + visual->stencilBits;
-      } else if (visual->depthBits) {
-         drawable->attachments[i++] = __DRI_BUFFER_DEPTH;
-         drawable->attachments[i++] = visual->depthBits;
-      } else if (visual->stencilBits) {
-         drawable->attachments[i++] = __DRI_BUFFER_STENCIL;
-         drawable->attachments[i++] = visual->stencilBits;
-      }
-      drawable->num_attachments = i / 2;
-   } else {
-      drawable->attachments[i++] = __DRI_BUFFER_FRONT_LEFT;
-      if (!screen->auto_fake_front)
-         drawable->attachments[i++] = __DRI_BUFFER_FAKE_FRONT_LEFT;
-      if (visual->doubleBufferMode)
-         drawable->attachments[i++] = __DRI_BUFFER_BACK_LEFT;
-      if (visual->depthBits && visual->stencilBits)
-         drawable->attachments[i++] = __DRI_BUFFER_DEPTH_STENCIL;
-      else if (visual->depthBits)
-         drawable->attachments[i++] = __DRI_BUFFER_DEPTH;
-      else if (visual->stencilBits)
-         drawable->attachments[i++] = __DRI_BUFFER_STENCIL;
-      drawable->num_attachments = i;
-   }
-
    drawable->desired_fences = 2;
 
    return GL_TRUE;
@@ -449,12 +103,18 @@ void
 dri_destroy_buffer(__DRIdrawable * dPriv)
 {
    struct dri_drawable *drawable = dri_drawable(dPriv);
-
-   st_unreference_framebuffer(drawable->stfb);
-   drawable->desired_fences = 0;
+   int i;
 
    dri1_swap_fences_clear(drawable);
 
+   pipe_surface_reference(&drawable->dri1_surface, NULL);
+   for (i = 0; i < ST_ATTACHMENT_COUNT; i++)
+      pipe_texture_reference(&drawable->textures[i], NULL);
+
+   dri_destroy_st_framebuffer(drawable->stfb);
+
+   drawable->desired_fences = 0;
+
    FREE(drawable);
 }
 
index ea66c483a1eabba445b939608242734b7e03870c..7f687b65f23459ba64cf610a853feb162d528b8e 100644 (file)
@@ -46,20 +46,15 @@ struct dri_drawable
    __DRIdrawable *dPriv;
    __DRIscreen *sPriv;
 
-   unsigned attachments[8];
-   unsigned num_attachments;
-
-   boolean is_pixmap;
+   /* gallium */
+   struct st_framebuffer_iface *stfb;
+   struct st_visual stvis;
 
    __DRIbuffer old[8];
    unsigned old_num;
    unsigned old_w;
    unsigned old_h;
 
-   /* gallium */
-   struct st_framebuffer *stfb;
-   struct st_visual stvis;
-
    struct pipe_texture *textures[ST_ATTACHMENT_COUNT];
    unsigned int texture_mask, texture_stamp;
 
@@ -69,8 +64,8 @@ struct dri_drawable
    unsigned int desired_fences;
    unsigned int cur_fences;
 
-   enum pipe_format color_format;
-   enum pipe_format depth_stencil_format;
+   /* used only by DRI1 */
+   struct pipe_surface *dri1_surface;
 };
 
 static INLINE struct dri_drawable *
@@ -87,15 +82,6 @@ dri_create_buffer(__DRIscreen * sPriv,
                  __DRIdrawable * dPriv,
                  const __GLcontextModes * visual, boolean isPixmap);
 
-void
-dri_update_buffer(struct pipe_screen *screen, void *context_private);
-
-void
-dri_flush_frontbuffer(struct pipe_screen *screen,
-                     struct pipe_surface *surf, void *context_private);
-
-void dri_get_buffers(__DRIdrawable * dPriv);
-
 void dri_destroy_buffer(__DRIdrawable * dPriv);
 
 void dri2_set_tex_buffer2(__DRIcontext *pDRICtx, GLint target,
index 800677a2d1ec3dde1c538331b6c1309d4456e1fe..df458e1eb0f60d7da23b4c8fb953745e39abf553 100644 (file)
 void
 dri_init_extensions(struct dri_context *ctx)
 {
+   struct st_context *st = (struct st_context *) ctx->st;
+
    /* New extensions should be added in mesa/state_tracker/st_extensions.c
     * and not in this file. */
-   driInitExtensions(ctx->st->ctx, NULL, GL_FALSE);
+   driInitExtensions(st->ctx, NULL, GL_FALSE);
 }
 
 /* vim: set sw=3 ts=8 sts=3 expandtab: */
index cffe3b33b2f6e59f35b596547aadc83184961b43..17b9f1c5faf610d22c4fd04b577c056eea92787f 100644 (file)
 #include "dri_screen.h"
 #include "dri_context.h"
 #include "dri_drawable.h"
+#include "dri_st_api.h"
 #include "dri1.h"
 
+#include "util/u_inlines.h"
 #include "pipe/p_screen.h"
 #include "pipe/p_format.h"
 #include "state_tracker/drm_api.h"
@@ -66,10 +68,23 @@ dri2_flush_drawable(__DRIdrawable *draw)
 {
 }
 
+static void
+dri2_invalidate_drawable(__DRIdrawable *dPriv)
+{
+   struct dri_drawable *drawable = dri_drawable(dPriv);
+   struct dri_context *ctx = dri_context(dPriv->driContextPriv);
+
+   dri2InvalidateDrawable(dPriv);
+   drawable->dPriv->lastStamp = *drawable->dPriv->pStamp;
+
+   if (ctx)
+      ctx->st->notify_invalid_framebuffer(ctx->st, drawable->stfb);
+}
+
 static const __DRI2flushExtension dri2FlushExtension = {
     { __DRI2_FLUSH, __DRI2_FLUSH_VERSION },
     dri2_flush_drawable,
-    dri2InvalidateDrawable,
+    dri2_invalidate_drawable,
 };
 
    static const __DRIextension *dri_screen_extensions[] = {
@@ -226,6 +241,68 @@ dri_fill_in_modes(struct dri_screen *screen,
    return (const __DRIconfig **)configs;
 }
 
+/**
+ * Roughly the converse of dri_fill_in_modes.
+ */
+void
+dri_fill_st_visual(struct st_visual *stvis, struct dri_screen *screen,
+                   const __GLcontextModes *mode)
+{
+   memset(stvis, 0, sizeof(*stvis));
+
+   stvis->samples = mode->samples;
+   stvis->render_buffer = ST_ATTACHMENT_INVALID;
+
+   if (mode->redBits == 8) {
+      if (mode->alphaBits == 8)
+         stvis->color_format = PIPE_FORMAT_B8G8R8A8_UNORM;
+      else
+         stvis->color_format = PIPE_FORMAT_B8G8R8X8_UNORM;
+   } else {
+      stvis->color_format = PIPE_FORMAT_B5G6R5_UNORM;
+   }
+
+   switch (mode->depthBits) {
+   default:
+   case 0:
+      stvis->depth_stencil_format = PIPE_FORMAT_NONE;
+      break;
+   case 16:
+      stvis->depth_stencil_format = PIPE_FORMAT_Z16_UNORM;
+      break;
+   case 24:
+      if (mode->stencilBits == 0) {
+        stvis->depth_stencil_format = (screen->d_depth_bits_last) ?
+                                          PIPE_FORMAT_Z24X8_UNORM:
+                                          PIPE_FORMAT_X8Z24_UNORM;
+      } else {
+        stvis->depth_stencil_format = (screen->sd_depth_bits_last) ?
+                                          PIPE_FORMAT_Z24S8_UNORM:
+                                          PIPE_FORMAT_S8Z24_UNORM;
+      }
+      break;
+   case 32:
+      stvis->depth_stencil_format = PIPE_FORMAT_Z32_UNORM;
+      break;
+   }
+
+   stvis->accum_format = (mode->haveAccumBuffer) ?
+      PIPE_FORMAT_R16G16B16A16_SNORM : PIPE_FORMAT_NONE;
+
+   stvis->buffer_mask |= ST_ATTACHMENT_FRONT_LEFT_MASK;
+   if (mode->doubleBufferMode)
+      stvis->buffer_mask |= ST_ATTACHMENT_BACK_LEFT_MASK;
+   if (mode->stereoMode) {
+      stvis->buffer_mask |= ST_ATTACHMENT_FRONT_RIGHT_MASK;
+      if (mode->doubleBufferMode)
+         stvis->buffer_mask |= ST_ATTACHMENT_BACK_RIGHT_MASK;
+   }
+
+   if (mode->haveDepthBuffer || mode->haveStencilBuffer)
+      stvis->buffer_mask |= ST_ATTACHMENT_DEPTH_STENCIL_MASK;
+   /* let the state tracker allocate the accum buffer */
+}
+
 /**
  * Get information about previous buffer swaps.
  */
@@ -238,6 +315,33 @@ dri_get_swap_info(__DRIdrawable * dPriv, __DRIswapInfo * sInfo)
       return 0;
 }
 
+static void
+dri_destroy_screen(__DRIscreen * sPriv)
+{
+   struct dri_screen *screen = dri_screen(sPriv);
+   int i;
+
+   if (screen->dri1_pipe)
+      screen->dri1_pipe->destroy(screen->dri1_pipe);
+
+   if (screen->smapi)
+      dri_destroy_st_manager(screen->smapi);
+   if (screen->pipe_screen)
+      screen->pipe_screen->destroy(screen->pipe_screen);
+
+   for (i = 0; i < (1 << screen->optionCache.tableSize); ++i) {
+      FREE(screen->optionCache.info[i].name);
+      FREE(screen->optionCache.info[i].ranges);
+   }
+
+   FREE(screen->optionCache.info);
+   FREE(screen->optionCache.values);
+
+   FREE(screen);
+   sPriv->private = NULL;
+   sPriv->extensions = NULL;
+}
+
 /**
  * This is the driver specific part of the createNewScreen entry point.
  *
@@ -253,7 +357,7 @@ dri_init_screen2(__DRIscreen * sPriv)
 
    screen = CALLOC_STRUCT(dri_screen);
    if (!screen)
-      goto fail;
+      return NULL;
 
    screen->api = drm_api_create();
    screen->sPriv = sPriv;
@@ -268,9 +372,9 @@ dri_init_screen2(__DRIscreen * sPriv)
       goto fail;
    }
 
-   /* We need to hook in here */
-   screen->pipe_screen->update_buffer = dri_update_buffer;
-   screen->pipe_screen->flush_frontbuffer = dri_flush_frontbuffer;
+   screen->smapi = dri_create_st_manager(screen);
+   if (!screen->smapi)
+      goto fail;
 
    driParseOptionInfo(&screen->optionCache,
                      __driConfigOptions, __driNConfigOptions);
@@ -279,30 +383,11 @@ dri_init_screen2(__DRIscreen * sPriv)
       dri2_ext->getBuffersWithFormat != NULL;
 
    return dri_fill_in_modes(screen, 32);
- fail:
+fail:
+   dri_destroy_screen(sPriv);
    return NULL;
 }
 
-static void
-dri_destroy_screen(__DRIscreen * sPriv)
-{
-   struct dri_screen *screen = dri_screen(sPriv);
-   int i;
-
-   screen->pipe_screen->destroy(screen->pipe_screen);
-   
-   for (i = 0; i < (1 << screen->optionCache.tableSize); ++i) {
-      FREE(screen->optionCache.info[i].name);
-      FREE(screen->optionCache.info[i].ranges);
-   }
-
-   FREE(screen->optionCache.info);
-   FREE(screen->optionCache.values);
-
-   FREE(screen);
-   sPriv->private = NULL;
-}
-
 const struct __DriverAPIRec driDriverAPI = {
    .DestroyScreen = dri_destroy_screen,
    .CreateContext = dri_create_context,
index 3130135692396265cdcb053eb76817752a1fff76..e9944e0f63e20e35934ce18f06bbc53910363a85 100644 (file)
@@ -36,6 +36,9 @@
 #include "xmlconfig.h"
 
 #include "pipe/p_compiler.h"
+#include "pipe/p_context.h"
+#include "pipe/p_state.h"
+#include "state_tracker/st_api.h"
 
 struct dri_screen
 {
@@ -58,6 +61,11 @@ struct dri_screen
    boolean d_depth_bits_last;
    boolean sd_depth_bits_last;
    boolean auto_fake_front;
+
+   struct st_manager *smapi;
+
+   /* used only by DRI1 */
+   struct pipe_context *dri1_pipe;
 };
 
 /** cast wrapper */
@@ -72,6 +80,10 @@ extern const uint __driNConfigOptions;
 const __DRIconfig **
 dri_fill_in_modes(struct dri_screen *screen, unsigned pixel_bits);
 
+void
+dri_fill_st_visual(struct st_visual *stvis, struct dri_screen *screen,
+                   const __GLcontextModes *mode);
+
 #endif
 
 /* vim: set sw=3 ts=8 sts=3 expandtab: */
index 379515152e85cac6a84908aa220e14d08c43d3dc..2cde01967d80c894a1a447bb6f2a9a9c7dc583b7 100644 (file)
@@ -274,8 +274,8 @@ dri_st_framebuffer_validate(struct st_framebuffer_iface *stfbi,
    if (drawable->texture_stamp != drawable->dPriv->lastStamp ||
        (statt_mask & ~drawable->texture_mask)) {
       if (__dri1_api_hooks) {
-         /* TODO */
-         return FALSE;
+         dri1_allocate_textures(drawable,
+               drawable->dPriv->w, drawable->dPriv->h, statt_mask);
       }
       else {
          __DRIbuffer *buffers;
@@ -309,9 +309,12 @@ dri_st_framebuffer_flush_front(struct st_framebuffer_iface *stfbi,
    struct __DRIdri2LoaderExtensionRec *loader =
       drawable->sPriv->dri2.loader;
 
-   /* TODO */
-   if (__dri1_api_hooks)
-      return FALSE;
+   if (__dri1_api_hooks) {
+      struct pipe_texture *ptex = drawable->textures[statt];
+      if (ptex)
+         dri1_flush_frontbuffer(drawable, ptex);
+      return TRUE;
+   }
 
    if (statt == ST_ATTACHMENT_FRONT_LEFT && loader->flushFrontBuffer) {
       loader->flushFrontBuffer(drawable->dPriv,