OSDN Git Service

gallium: added fb_width/height fields to softpipe context
authorBrian Paul <brian.paul@tungstengraphics.com>
Thu, 20 Mar 2008 00:10:09 +0000 (18:10 -0600)
committerBrian Paul <brian.paul@tungstengraphics.com>
Thu, 20 Mar 2008 00:10:09 +0000 (18:10 -0600)
These are convenience fields.  Otherwise, we have to check cbuf[0] or zsbuf
in various places.

src/gallium/drivers/softpipe/sp_context.h
src/gallium/drivers/softpipe/sp_prim_setup.c
src/gallium/drivers/softpipe/sp_quad_stipple.c
src/gallium/drivers/softpipe/sp_state_derived.c
src/gallium/drivers/softpipe/sp_state_surface.c

index 19e6cfa..31d7062 100644 (file)
@@ -84,6 +84,8 @@ struct softpipe_context {
    unsigned num_samplers;
    unsigned num_textures;
 
+   uint fb_width, fb_height;
+
    /* Counter for occlusion queries.  Note this supports overlapping
     * queries.
     */
index 7aa9cf8..f2d6043 100644 (file)
@@ -485,7 +485,7 @@ setup_fragcoord_coeff(struct setup_stage *setup, uint slot)
    /*Y*/
    if (setup->softpipe->rasterizer->origin_lower_left) {
       /* y=0=bottom */
-      const int winHeight = setup->softpipe->framebuffer.cbufs[0]->height;
+      const int winHeight = setup->softpipe->fb_height;
       setup->coef[slot].a0[1] = (float) (winHeight - 1);
       setup->coef[slot].dady[1] = -1.0;
    }
index 8660432..9a39249 100644 (file)
@@ -25,7 +25,7 @@ stipple_quad(struct quad_stage *qs, struct quad_header *quad)
       int y0, y1;
       uint stipple0, stipple1;
       if (softpipe->rasterizer->origin_lower_left) {
-         y0 = softpipe->framebuffer.cbufs[0]->height - 1 - quad->y0;
+         y0 = softpipe->fb_height - 1 - quad->y0;
          y1 = y0 - 1;
       }
       else {
index 82cb31e..53b2056 100644 (file)
@@ -171,17 +171,8 @@ softpipe_get_vbuf_vertex_info(struct softpipe_context *softpipe)
 static void
 compute_cliprect(struct softpipe_context *sp)
 {
-   unsigned surfWidth, surfHeight;
-
-   if (sp->framebuffer.num_cbufs > 0) {
-      surfWidth = sp->framebuffer.cbufs[0]->width;
-      surfHeight = sp->framebuffer.cbufs[0]->height;
-   }
-   else {
-      /* no surface? */
-      surfWidth = sp->scissor.maxx;
-      surfHeight = sp->scissor.maxy;
-   }
+   uint surfWidth = sp->fb_width;
+   uint surfHeight = sp->fb_height;
 
    if (sp->rasterizer->scissor) {
       /* clip to scissor rect */
index 124b18b..2f55684 100644 (file)
@@ -48,6 +48,9 @@ softpipe_set_framebuffer_state(struct pipe_context *pipe,
    struct softpipe_context *sp = softpipe_context(pipe);
    uint i;
 
+   /* updated below */
+   sp->fb_width = sp->fb_height = 0;
+
    for (i = 0; i < PIPE_MAX_COLOR_BUFS; i++) {
       /* check if changing cbuf */
       if (sp->framebuffer.cbufs[i] != fb->cbufs[i]) {
@@ -60,6 +63,10 @@ softpipe_set_framebuffer_state(struct pipe_context *pipe,
          /* update cache */
          sp_tile_cache_set_surface(sp->cbuf_cache[i], fb->cbufs[i]);
       }
+      if (fb->cbufs[i]) {
+         sp->fb_width = fb->cbufs[i]->width;
+         sp->fb_height = fb->cbufs[i]->height;
+      }
    }
 
    sp->framebuffer.num_cbufs = fb->num_cbufs;
@@ -74,6 +81,11 @@ softpipe_set_framebuffer_state(struct pipe_context *pipe,
 
       /* update cache */
       sp_tile_cache_set_surface(sp->zsbuf_cache, fb->zsbuf);
+
+      if (!sp->fb_width && fb->zsbuf) {
+         sp->fb_width = fb->zsbuf->width;
+         sp->fb_height = fb->zsbuf->height;
+      }
    }
 
 #if 0