Merge branch '7.8'
authorBrian Paul <brianp@vmware.com>
Fri, 9 Apr 2010 16:09:24 +0000 (10:09 -0600)
committerBrian Paul <brianp@vmware.com>
Fri, 9 Apr 2010 16:09:24 +0000 (10:09 -0600)
1  2 
src/mesa/state_tracker/st_cb_drawpixels.c

index 85570541ef0084d2f739794157f5691106bfca61,5fcfa86904393cbc6b05882a4f21312dab6d2113..93b95a534c7c23dcc4056a99956511cbb3df05d3
@@@ -59,6 -59,7 +59,6 @@@
  #include "util/u_draw_quad.h"
  #include "util/u_format.h"
  #include "util/u_math.h"
 -#include "util/u_rect.h"
  #include "shader/prog_instruction.h"
  #include "cso_cache/cso_context.h"
  
@@@ -249,13 -250,13 +249,13 @@@ make_passthrough_vertex_shader(struct s
                 ureg_DECL_output( ureg, TGSI_SEMANTIC_POSITION, 0 ),
                 ureg_DECL_vs_input( ureg, 0 ));
        
-       /* MOV result.texcoord0, vertex.texcoord0; */
+       /* MOV result.texcoord0, vertex.attr[1]; */
        ureg_MOV(ureg, 
                 ureg_DECL_output( ureg, TGSI_SEMANTIC_GENERIC, 0 ),
                 ureg_DECL_vs_input( ureg, 1 ));
        
        if (passColor) {
-          /* MOV result.color0, vertex.color0; */
+          /* MOV result.color0, vertex.attr[2]; */
           ureg_MOV(ureg, 
                    ureg_DECL_output( ureg, TGSI_SEMANTIC_COLOR, 0 ),
                    ureg_DECL_vs_input( ureg, 2 ));
@@@ -291,51 -292,6 +291,51 @@@ base_format(GLenum format
  }
  
  
 +/**
 + * Create a temporary texture to hold an image of the given size.
 + * If width, height are not POT and the driver only handles POT textures,
 + * allocate the next larger size of texture that is POT.
 + */
 +static struct pipe_texture *
 +alloc_texture(struct st_context *st, GLsizei width, GLsizei height,
 +              enum pipe_format texFormat)
 +{
 +   struct pipe_context *pipe = st->pipe;
 +   struct pipe_screen *screen = pipe->screen;
 +   struct pipe_texture *pt;
 +   int ptw, pth;
 +
 +   ptw = width;
 +   pth = height;
 +
 +   /* Need to use POT texture? */
 +   if (!screen->get_param(screen, PIPE_CAP_NPOT_TEXTURES)) {
 +      int l2pt, maxSize;
 +
 +      l2pt = util_logbase2(width);
 +      if (1 << l2pt != width) {
 +         ptw = 1 << (l2pt + 1);
 +      }
 +
 +      l2pt = util_logbase2(height);
 +      if (1 << l2pt != height) {
 +         pth = 1 << (l2pt + 1);
 +      }
 +
 +      /* Check against maximum texture size */
 +      maxSize = 1 << (pipe->screen->get_param(pipe->screen,
 +                               PIPE_CAP_MAX_TEXTURE_2D_LEVELS) - 1);
 +      assert(ptw <= maxSize);
 +      assert(pth <= maxSize);
 +   }
 +
 +   pt = st_texture_create(st, PIPE_TEXTURE_2D, texFormat, 0,
 +                          ptw, pth, 1, PIPE_TEXTURE_USAGE_SAMPLER);
 +
 +   return pt;
 +}
 +
 +
  /**
   * Make texture containing an image for glDrawPixels image.
   * If 'pixels' is NULL, leave the texture image data undefined.
@@@ -348,11 -304,13 +348,11 @@@ make_texture(struct st_context *st
  {
     GLcontext *ctx = st->ctx;
     struct pipe_context *pipe = st->pipe;
 -   struct pipe_screen *screen = pipe->screen;
     gl_format mformat;
     struct pipe_texture *pt;
     enum pipe_format pipeFormat;
     GLuint cpp;
     GLenum baseFormat;
 -   int ptw, pth;
  
     baseFormat = base_format(format);
  
     if (!pixels)
        return NULL;
  
 -   /* Need to use POT texture? */
 -   ptw = width;
 -   pth = height;
 -   if (!screen->get_param(screen, PIPE_CAP_NPOT_TEXTURES)) {
 -      int l2pt, maxSize;
 -
 -      l2pt = util_logbase2(width);
 -      if (1<<l2pt != width) {
 -         ptw = 1<<(l2pt+1);
 -      }
 -      l2pt = util_logbase2(height);
 -      if (1<<l2pt != height) {
 -         pth = 1<<(l2pt+1);
 -      }
 -
 -      /* Check against maximum texture size */
 -      maxSize = 1 << (pipe->screen->get_param(pipe->screen, PIPE_CAP_MAX_TEXTURE_2D_LEVELS) - 1);
 -      assert(ptw <= maxSize);
 -      assert(pth <= maxSize);
 -   }
 -
 -   pt = st_texture_create(st, PIPE_TEXTURE_2D, pipeFormat, 0, ptw, pth, 1,
 -                          PIPE_TEXTURE_USAGE_SAMPLER);
 +   /* alloc temporary texture */
 +   pt = alloc_texture(st, width, height, pipeFormat);
     if (!pt) {
        _mesa_unmap_pbo_source(ctx, unpack);
        return NULL;
                                              width, height);
  
        /* map texture transfer */
 -      dest = screen->transfer_map(screen, transfer);
 +      dest = pipe->transfer_map(pipe, transfer);
  
  
        /* Put image into texture transfer.
                                 unpack);
  
        /* unmap */
 -      screen->transfer_unmap(screen, transfer);
 -      screen->tex_transfer_destroy(transfer);
 +      pipe->transfer_unmap(pipe, transfer);
 +      pipe->tex_transfer_destroy(pipe, transfer);
  
        assert(success);
  
@@@ -451,7 -430,7 +451,7 @@@ draw_quad(GLcontext *ctx, GLfloat x0, G
        const GLfloat sLeft = 0.0f, sRight = maxXcoord;
        const GLfloat tTop = invertTex ? maxYcoord : 0.0f;
        const GLfloat tBot = invertTex ? 0.0f : maxYcoord;
-       GLuint tex, i;
+       GLuint i;
  
        /* upper-left */
        verts[0][0][0] = clip_x0;    /* v[0].attr[0].x */
        verts[3][0][0] = clip_x0;
        verts[3][0][1] = clip_y1;
  
-       tex = color ? 2 : 1;
-       verts[0][tex][0] = sLeft; /* v[0].attr[tex].s */
-       verts[0][tex][1] = tTop;  /* v[0].attr[tex].t */
-       verts[1][tex][0] = sRight;
-       verts[1][tex][1] = tTop;
-       verts[2][tex][0] = sRight;
-       verts[2][tex][1] = tBot;
-       verts[3][tex][0] = sLeft;
-       verts[3][tex][1] = tBot;
+       verts[0][1][0] = sLeft; /* v[0].attr[1].S */
+       verts[0][1][1] = tTop;  /* v[0].attr[1].T */
+       verts[1][1][0] = sRight;
+       verts[1][1][1] = tTop;
+       verts[2][1][0] = sRight;
+       verts[2][1][1] = tBot;
+       verts[3][1][0] = sLeft;
+       verts[3][1][1] = tBot;
  
        /* same for all verts: */
        if (color) {
           for (i = 0; i < 4; i++) {
-             verts[i][0][2] = z;   /*Z*/
-             verts[i][0][3] = 1.0f; /*W*/
-             verts[i][1][0] = color[0];
-             verts[i][1][1] = color[1];
-             verts[i][1][2] = color[2];
-             verts[i][1][3] = color[3];
-             verts[i][2][2] = 0.0f; /*R*/
-             verts[i][2][3] = 1.0f; /*Q*/
+             verts[i][0][2] = z;         /* v[i].attr[0].z */
+             verts[i][0][3] = 1.0f;      /* v[i].attr[0].w */
+             verts[i][2][0] = color[0];  /* v[i].attr[2].r */
+             verts[i][2][1] = color[1];  /* v[i].attr[2].g */
+             verts[i][2][2] = color[2];  /* v[i].attr[2].b */
+             verts[i][2][3] = color[3];  /* v[i].attr[2].a */
+             verts[i][1][2] = 0.0f;      /* v[i].attr[1].R */
+             verts[i][1][3] = 1.0f;      /* v[i].attr[1].Q */
           }
        }
        else {
           for (i = 0; i < 4; i++) {
-             verts[i][0][2] = z;   /*Z*/
+             verts[i][0][2] = z;    /*Z*/
              verts[i][0][3] = 1.0f; /*W*/
              verts[i][1][2] = 0.0f; /*R*/
              verts[i][1][3] = 1.0f; /*Q*/
@@@ -524,7 -502,7 +523,7 @@@ static voi
  draw_textured_quad(GLcontext *ctx, GLint x, GLint y, GLfloat z,
                     GLsizei width, GLsizei height,
                     GLfloat zoomX, GLfloat zoomY,
 -                   struct pipe_texture *pt,
 +                   struct pipe_sampler_view *sv,
                     void *driver_vp,
                     void *driver_fp,
                     const GLfloat *color,
     cso_save_rasterizer(cso);
     cso_save_viewport(cso);
     cso_save_samplers(cso);
 -   cso_save_sampler_textures(cso);
 +   cso_save_fragment_sampler_views(cso);
     cso_save_fragment_shader(cso);
     cso_save_vertex_shader(cso);
 +   cso_save_vertex_elements(cso);
  
     /* rasterizer state: just scissor */
     {
        cso_set_viewport(cso, &vp);
     }
  
 +   cso_set_vertex_elements(cso, 3, st->velems_util_draw);
 +
     /* texture state: */
     if (st->pixel_xfer.pixelmap_enabled) {
 -      struct pipe_texture *textures[2];
 -      textures[0] = pt;
 -      textures[1] = st->pixel_xfer.pixelmap_texture;
 -      pipe->set_fragment_sampler_textures(pipe, 2, textures);
 +      struct pipe_sampler_view *sampler_views[2];
 +      sampler_views[0] = sv;
 +      sampler_views[1] = st->pixel_xfer.pixelmap_sampler_view;
 +      cso_set_fragment_sampler_views(cso, 2, sampler_views);
     }
     else {
 -      pipe->set_fragment_sampler_textures(pipe, 1, &pt);
 +      cso_set_fragment_sampler_views(cso, 1, &sv);
     }
  
     /* Compute Gallium window coords (y=0=top) with pixel zoom.
     z = z * 2.0 - 1.0;
  
     draw_quad(ctx, x0, y0, z, x1, y1, color, invertTex,
 -           (GLfloat) width / pt->width0,
 -           (GLfloat) height / pt->height0);
 +             (GLfloat) width / sv->texture->width0,
 +             (GLfloat) height / sv->texture->height0);
  
     /* restore state */
     cso_restore_rasterizer(cso);
     cso_restore_viewport(cso);
     cso_restore_samplers(cso);
 -   cso_restore_sampler_textures(cso);
 +   cso_restore_fragment_sampler_views(cso);
     cso_restore_fragment_shader(cso);
     cso_restore_vertex_shader(cso);
 +   cso_restore_vertex_elements(cso);
  }
  
  
@@@ -656,6 -630,7 +655,6 @@@ draw_stencil_pixels(GLcontext *ctx, GLi
  {
     struct st_context *st = st_context(ctx);
     struct pipe_context *pipe = st->pipe;
 -   struct pipe_screen *screen = pipe->screen;
     struct st_renderbuffer *strb;
     enum pipe_transfer_usage usage;
     struct pipe_transfer *pt;
                                       usage, x, y,
                                       width, height);
  
 -   stmap = screen->transfer_map(screen, pt);
 +   stmap = pipe->transfer_map(pipe, pt);
  
     pixels = _mesa_map_pbo_source(ctx, &clippedUnpack, pixels);
     assert(pixels);
  
              /* now pack the stencil (and Z) values in the dest format */
              switch (pt->texture->format) {
 -            case PIPE_FORMAT_S8_UNORM:
 +            case PIPE_FORMAT_S8_USCALED:
                 {
                    ubyte *dest = stmap + spanY * pt->stride + spanX;
                    assert(usage == PIPE_TRANSFER_WRITE);
                    memcpy(dest, sValues, spanWidth);
                 }
                 break;
 -            case PIPE_FORMAT_Z24S8_UNORM:
 +            case PIPE_FORMAT_Z24_UNORM_S8_USCALED:
                 if (format == GL_DEPTH_STENCIL) {
                    uint *dest = (uint *) (stmap + spanY * pt->stride + spanX*4);
                    GLint k;
                    }
                 }
                 break;
 -            case PIPE_FORMAT_S8Z24_UNORM:
 +            case PIPE_FORMAT_S8_USCALED_Z24_UNORM:
                 if (format == GL_DEPTH_STENCIL) {
                    uint *dest = (uint *) (stmap + spanY * pt->stride + spanX*4);
                    GLint k;
     _mesa_unmap_pbo_source(ctx, &clippedUnpack);
  
     /* unmap the stencil buffer */
 -   screen->transfer_unmap(screen, pt);
 -   screen->tex_transfer_destroy(pt);
 +   pipe->transfer_unmap(pipe, pt);
 +   pipe->tex_transfer_destroy(pipe, pt);
  }
  
  
@@@ -834,17 -809,12 +833,17 @@@ st_DrawPixels(GLcontext *ctx, GLint x, 
        struct pipe_texture *pt
           = make_texture(st, width, height, format, type, unpack, pixels);
        if (pt) {
 -         draw_textured_quad(ctx, x, y, ctx->Current.RasterPos[2],
 -                            width, height, ctx->Pixel.ZoomX, ctx->Pixel.ZoomY,
 -                            pt, 
 -                            driver_vp, 
 -                            driver_fp,
 -                            color, GL_FALSE);
 +         struct pipe_sampler_view *sv = st_sampler_view_from_texture(st->pipe, pt);
 +
 +         if (sv) {
 +            draw_textured_quad(ctx, x, y, ctx->Current.RasterPos[2],
 +                               width, height, ctx->Pixel.ZoomX, ctx->Pixel.ZoomY,
 +                               sv,
 +                               driver_vp, 
 +                               driver_fp,
 +                               color, GL_FALSE);
 +            pipe_sampler_view_reference(&sv, NULL);
 +         }
           pipe_texture_reference(&pt, NULL);
        }
     }
@@@ -858,7 -828,7 +857,7 @@@ copy_stencil_pixels(GLcontext *ctx, GLi
                      GLint dstx, GLint dsty)
  {
     struct st_renderbuffer *rbDraw = st_renderbuffer(ctx->DrawBuffer->_StencilBuffer);
 -   struct pipe_screen *screen = ctx->st->pipe->screen;
 +   struct pipe_context *pipe = ctx->st->pipe;
     enum pipe_transfer_usage usage;
     struct pipe_transfer *ptDraw;
     ubyte *drawMap;
     assert(util_format_get_blockheight(ptDraw->texture->format) == 1);
  
     /* map the stencil buffer */
 -   drawMap = screen->transfer_map(screen, ptDraw);
 +   drawMap = pipe->transfer_map(pipe, ptDraw);
  
     /* draw */
     /* XXX PixelZoom not handled yet */
        src = buffer + i * width;
  
        switch (ptDraw->texture->format) {
 -      case PIPE_FORMAT_Z24S8_UNORM:
 +      case PIPE_FORMAT_Z24_UNORM_S8_USCALED:
           {
              uint *dst4 = (uint *) dst;
              int j;
              }
           }
           break;
 -      case PIPE_FORMAT_S8Z24_UNORM:
 +      case PIPE_FORMAT_S8_USCALED_Z24_UNORM:
           {
              uint *dst4 = (uint *) dst;
              int j;
              }
           }
           break;
 -      case PIPE_FORMAT_S8_UNORM:
 +      case PIPE_FORMAT_S8_USCALED:
           assert(usage == PIPE_TRANSFER_WRITE);
           memcpy(dst, src, width);
           break;
     free(buffer);
  
     /* unmap the stencil buffer */
 -   screen->transfer_unmap(screen, ptDraw);
 -   screen->tex_transfer_destroy(ptDraw);
 +   pipe->transfer_unmap(pipe, ptDraw);
 +   pipe->tex_transfer_destroy(pipe, ptDraw);
  }
  
  
@@@ -963,9 -933,9 +962,9 @@@ st_CopyPixels(GLcontext *ctx, GLint src
     struct st_renderbuffer *rbRead;
     void *driver_vp, *driver_fp;
     struct pipe_texture *pt;
 +   struct pipe_sampler_view *sv;
     GLfloat *color;
     enum pipe_format srcFormat, texFormat;
 -   int ptw, pth;
     GLboolean invertTex = GL_FALSE;
     GLint readX, readY, readW, readH;
     struct gl_pixelstore_attrib pack = ctx->DefaultPacking;
     readW = MAX2(0, readW);
     readH = MAX2(0, readH);
  
 -   /* Need to use POT texture? */
 -   ptw = width;
 -   pth = height;
 -   if (!screen->get_param(screen, PIPE_CAP_NPOT_TEXTURES)) {
 -      int l2pt, maxSize;
 -
 -      l2pt = util_logbase2(width);
 -      if (1<<l2pt != width) {
 -         ptw = 1<<(l2pt+1);
 -      }
 -      l2pt = util_logbase2(height);
 -      if (1<<l2pt != height) {
 -         pth = 1<<(l2pt+1);
 -      }
 -
 -      /* Check against maximum texture size */
 -      maxSize = 1 << (pipe->screen->get_param(pipe->screen, PIPE_CAP_MAX_TEXTURE_2D_LEVELS) - 1);
 -      assert(ptw <= maxSize);
 -      assert(pth <= maxSize);
 -   }
 -
 -   pt = st_texture_create(st, PIPE_TEXTURE_2D, texFormat, 0,
 -                          ptw, pth, 1,
 -                          PIPE_TEXTURE_USAGE_SAMPLER);
 +   /* alloc temporary texture */
 +   pt = alloc_texture(st, width, height, texFormat);
     if (!pt)
        return;
  
 +   sv = st_sampler_view_from_texture(st->pipe, pt);
 +   if (!sv) {
 +      pipe_texture_reference(&pt, NULL);
 +      return;
 +   }
 +
     /* Make temporary texture which is a copy of the src region.
      */
     if (srcFormat == texFormat) {
                                         PIPE_BUFFER_USAGE_GPU_READ);
        struct pipe_surface *psTex = screen->get_tex_surface(screen, pt, 0, 0, 0, 
                                        PIPE_BUFFER_USAGE_GPU_WRITE );
 -      if (pipe->surface_copy) {
 -         pipe->surface_copy(pipe,
 -                            psTex,                               /* dest surf */
 -                            pack.SkipPixels, pack.SkipRows,      /* dest pos */
 -                            psRead,                              /* src surf */
 -                            readX, readY, readW, readH);         /* src region */
 -      } else {
 -         util_surface_copy(pipe, FALSE,
 -                           psTex,
 -                           pack.SkipPixels, pack.SkipRows,
 -                           psRead,
 -                           readX, readY, readW, readH);
 -      }
 +
 +      pipe->surface_copy(pipe,
 +                         psTex,                               /* dest surf */
 +                         pack.SkipPixels, pack.SkipRows,      /* dest pos */
 +                         psRead,                              /* src surf */
 +                         readX, readY, readW, readH);         /* src region */
  
        if (0) {
           /* debug */
 -         debug_dump_surface("copypixsrcsurf", psRead);
 -         debug_dump_surface("copypixtemptex", psTex);
 +         debug_dump_surface(pipe, "copypixsrcsurf", psRead);
 +         debug_dump_surface(pipe, "copypixtemptex", psTex);
        }
  
        pipe_surface_reference(&psRead, NULL); 
        if (type == GL_COLOR) {
           /* alternate path using get/put_tile() */
           GLfloat *buf = (GLfloat *) malloc(width * height * 4 * sizeof(GLfloat));
 -         pipe_get_tile_rgba(ptRead, readX, readY, readW, readH, buf);
 -         pipe_put_tile_rgba(ptTex, pack.SkipPixels, pack.SkipRows,
 +         pipe_get_tile_rgba(pipe, ptRead, readX, readY, readW, readH, buf);
 +         pipe_put_tile_rgba(pipe, ptTex, pack.SkipPixels, pack.SkipRows,
                              readW, readH, buf);
           free(buf);
        }
        else {
           /* GL_DEPTH */
           GLuint *buf = (GLuint *) malloc(width * height * sizeof(GLuint));
 -         pipe_get_tile_z(ptRead, readX, readY, readW, readH, buf);
 -         pipe_put_tile_z(ptTex, pack.SkipPixels, pack.SkipRows,
 -                            readW, readH, buf);
 +         pipe_get_tile_z(pipe, ptRead, readX, readY, readW, readH, buf);
 +         pipe_put_tile_z(pipe, ptTex, pack.SkipPixels, pack.SkipRows,
 +                         readW, readH, buf);
           free(buf);
        }
  
 -      screen->tex_transfer_destroy(ptRead);
 -      screen->tex_transfer_destroy(ptTex);
 +      pipe->tex_transfer_destroy(pipe, ptRead);
 +      pipe->tex_transfer_destroy(pipe, ptTex);
     }
  
     /* OK, the texture 'pt' contains the src image/pixels.  Now draw a
      */
     draw_textured_quad(ctx, dstx, dsty, ctx->Current.RasterPos[2],
                        width, height, ctx->Pixel.ZoomX, ctx->Pixel.ZoomY,
 -                      pt
 +                      sv
                        driver_vp, 
                        driver_fp,
                        color, invertTex);
  
     pipe_texture_reference(&pt, NULL);
 +   pipe_sampler_view_reference(&sv, NULL);
  }