gallium: keep track of num_vertex_attribs/buffers for shorter loops
[mesa.git] / src / gallium / drivers / softpipe / sp_texture.c
index 295704c05f86198f5cf82b4153b9e8723dc345c5..256586ec886e8026301cd3d6bff068ce4705ccc2 100644 (file)
@@ -80,32 +80,38 @@ softpipe_texture_layout(struct softpipe_texture * spt)
 }
 
 
-struct pipe_texture *
-softpipe_texture_create(struct pipe_context *pipe,
+static struct pipe_texture *
+softpipe_texture_create(struct pipe_screen *screen,
                         const struct pipe_texture *templat)
 {
+   struct pipe_winsys *ws = screen->winsys;
    struct softpipe_texture *spt = CALLOC_STRUCT(softpipe_texture);
    if (!spt)
       return NULL;
 
    spt->base = *templat;
+   spt->base.refcount = 1;
+   spt->base.screen = screen;
 
    softpipe_texture_layout(spt);
 
-   spt->buffer = pipe->winsys->buffer_create(pipe->winsys, 32,
-                                             PIPE_BUFFER_USAGE_PIXEL,
-                                             spt->buffer_size);
+   spt->buffer = ws->buffer_create(ws, 32,
+                                   PIPE_BUFFER_USAGE_PIXEL,
+                                   spt->buffer_size);
    if (!spt->buffer) {
       FREE(spt);
       return NULL;
    }
 
+   assert(spt->base.refcount == 1);
+
    return &spt->base;
 }
 
 
-void
-softpipe_texture_release(struct pipe_context *pipe, struct pipe_texture **pt)
+static void
+softpipe_texture_release(struct pipe_screen *screen,
+                         struct pipe_texture **pt)
 {
    if (!*pt)
       return;
@@ -121,7 +127,7 @@ softpipe_texture_release(struct pipe_context *pipe, struct pipe_texture **pt)
       DBG("%s deleting %p\n", __FUNCTION__, (void *) spt);
       */
 
-      pipe_buffer_reference(pipe->winsys, &spt->buffer, NULL);
+      pipe_buffer_reference(screen->winsys, &spt->buffer, NULL);
 
       FREE(spt);
    }
@@ -129,38 +135,22 @@ softpipe_texture_release(struct pipe_context *pipe, struct pipe_texture **pt)
 }
 
 
-void
-softpipe_texture_update(struct pipe_context *pipe,
-                        struct pipe_texture *texture)
-{
-   struct softpipe_context *softpipe = softpipe_context(pipe);
-   uint unit;
-   for (unit = 0; unit < PIPE_MAX_SAMPLERS; unit++) {
-      if (softpipe->texture[unit] == softpipe_texture(texture)) {
-         sp_flush_tile_cache(softpipe, softpipe->tex_cache[unit]);
-      }
-   }
-}
-
-
-/**
- * Called via pipe->get_tex_surface()
- */
-struct pipe_surface *
-softpipe_get_tex_surface(struct pipe_context *pipe,
+static struct pipe_surface *
+softpipe_get_tex_surface(struct pipe_screen *screen,
                          struct pipe_texture *pt,
                          unsigned face, unsigned level, unsigned zslice)
 {
+   struct pipe_winsys *ws = screen->winsys;
    struct softpipe_texture *spt = softpipe_texture(pt);
    struct pipe_surface *ps;
 
    assert(level <= pt->last_level);
 
-   ps = pipe->winsys->surface_alloc(pipe->winsys);
+   ps = ws->surface_alloc(ws);
    if (ps) {
       assert(ps->refcount);
       assert(ps->winsys);
-      pipe_buffer_reference(pipe->winsys, &ps->buffer, spt->buffer);
+      pipe_buffer_reference(ws, &ps->buffer, spt->buffer);
       ps->format = pt->format;
       ps->cpp = pt->cpp;
       ps->width = pt->width[level];
@@ -172,10 +162,42 @@ softpipe_get_tex_surface(struct pipe_context *pipe,
         ps->offset += ((pt->target == PIPE_TEXTURE_CUBE) ? face : zslice) *
                       (pt->compressed ? ps->height/4 : ps->height) *
                       ps->width * ps->cpp;
-      } else {
+      }
+      else {
         assert(face == 0);
         assert(zslice == 0);
       }
    }
    return ps;
 }
+
+
+static void
+softpipe_texture_update(struct pipe_context *pipe,
+                        struct pipe_texture *texture,
+                        uint face, uint levelsMask)
+{
+   struct softpipe_context *softpipe = softpipe_context(pipe);
+   uint unit;
+   for (unit = 0; unit < softpipe->num_textures; unit++) {
+      if (softpipe->texture[unit] == texture) {
+         sp_flush_tile_cache(softpipe, softpipe->tex_cache[unit]);
+      }
+   }
+}
+
+
+void
+softpipe_init_texture_funcs( struct softpipe_context *softpipe )
+{
+   softpipe->pipe.texture_update = softpipe_texture_update;
+}
+
+
+void
+softpipe_init_screen_texture_funcs(struct pipe_screen *screen)
+{
+   screen->texture_create = softpipe_texture_create;
+   screen->texture_release = softpipe_texture_release;
+   screen->get_tex_surface = softpipe_get_tex_surface;
+}