diff options
| -rw-r--r-- | src/mesa/drivers/dri/intel/intel_tex_copy.c | 103 | 
1 files changed, 58 insertions, 45 deletions
| diff --git a/src/mesa/drivers/dri/intel/intel_tex_copy.c b/src/mesa/drivers/dri/intel/intel_tex_copy.c index b893990d27..08437aa0e2 100644 --- a/src/mesa/drivers/dri/intel/intel_tex_copy.c +++ b/src/mesa/drivers/dri/intel/intel_tex_copy.c @@ -112,56 +112,47 @@ do_copy_texsubimage(struct intel_context *intel,                                                         intelImage->level);        const GLint orig_x = x;        const GLint orig_y = y; -      const struct gl_framebuffer *fb = ctx->DrawBuffer; +      GLshort src_pitch; -      if (_mesa_clip_to_region(fb->_Xmin, fb->_Ymin, fb->_Xmax, fb->_Ymax, -                               &x, &y, &width, &height)) { -	 GLshort src_pitch; +      /* Update dst for clipped src.  Need to also clip the source rect. */ +      dstx += x - orig_x; +      dsty += y - orig_y; -         /* Update dst for clipped src.  Need to also clip the source rect. -          */ -         dstx += x - orig_x; -         dsty += y - orig_y; +      /* image_offset may be non-page-aligned, but that's illegal for tiling. */ +      assert(intelImage->mt->region->tiling == I915_TILING_NONE); -	 /* image_offset may be non-page-aligned, but that's illegal for tiling. -	  */ -	 assert(intelImage->mt->region->tiling == I915_TILING_NONE); - -         if (ctx->ReadBuffer->Name == 0) { -            /* reading from a window, adjust x, y */ -            __DRIdrawablePrivate *dPriv = intel->driDrawable; -	    y = dPriv->y + (dPriv->h - (y + height)); -            x += dPriv->x; +      if (ctx->ReadBuffer->Name == 0) { +	 /* reading from a window, adjust x, y */ +	 __DRIdrawablePrivate *dPriv = intel->driDrawable; +	 y = dPriv->y + (dPriv->h - (y + height)); +	 x += dPriv->x; -	    /* Invert the data coming from the source rectangle due to GL -	     * and hardware disagreeing on where y=0 is. -	     * -	     * It appears that our offsets and pitches get mangled -	     * appropriately by the hardware, and we don't need to adjust them -	     * on our own. -	     */ -	    src_pitch = -src->pitch; -         } -         else { -            /* reading from a FBO, y is already oriented the way we like */ -	    src_pitch = src->pitch; -         } - -         intelEmitCopyBlit(intel, -                           intelImage->mt->cpp, -                           src_pitch, -                           src->buffer, -                           0, -			   src->tiling, -                           intelImage->mt->pitch, -                           intelImage->mt->region->buffer, -                           image_offset, -			   intelImage->mt->region->tiling, -                           x, y, dstx, dsty, width, height, -			   GL_COPY); +	 /* Invert the data coming from the source rectangle due to GL +	  * and hardware disagreeing on where y=0 is. +	  * +	  * It appears that our offsets and pitches get mangled +	  * appropriately by the hardware, and we don't need to adjust them +	  * on our own. +	  */ +	 src_pitch = -src->pitch; +      } else { +	 /* reading from a FBO, y is already oriented the way we like */ +	 src_pitch = src->pitch;        } -   } +      intelEmitCopyBlit(intel, +			intelImage->mt->cpp, +			src_pitch, +			src->buffer, +			0, +			src->tiling, +			intelImage->mt->pitch, +			intelImage->mt->region->buffer, +			image_offset, +			intelImage->mt->region->tiling, +			x, y, dstx, dsty, width, height, +			GL_COPY); +   }     UNLOCK_HARDWARE(intel); @@ -188,6 +179,7 @@ intelCopyTexImage1D(GLcontext * ctx, GLenum target, GLint level,        _mesa_select_tex_object(ctx, texUnit, target);     struct gl_texture_image *texImage =        _mesa_select_tex_image(ctx, texObj, target, level); +   int srcx, srcy, dstx, dsty, height;     if (border)        goto fail; @@ -199,10 +191,20 @@ intelCopyTexImage1D(GLcontext * ctx, GLenum target, GLint level,                            width, border,                            GL_RGBA, CHAN_TYPE, NULL,                            &ctx->DefaultPacking, texObj, texImage); +   srcx = x; +   srcy = y; +   dstx = 0; +   dsty = 0; +   height = 1; +   if (!_mesa_clip_copytexsubimage(ctx, +				   &dstx, &dsty, +				   &srcx, &srcy, +				   &width, &height)) +      return;     if (!do_copy_texsubimage(intel_context(ctx), target,                              intel_texture_image(texImage), -                            internalFormat, 0, 0, x, y, width, 1)) +                            internalFormat, 0, 0, x, y, width, height))        goto fail;     return; @@ -224,10 +226,21 @@ intelCopyTexImage2D(GLcontext * ctx, GLenum target, GLint level,        _mesa_select_tex_object(ctx, texUnit, target);     struct gl_texture_image *texImage =        _mesa_select_tex_image(ctx, texObj, target, level); +   int srcx, srcy, dstx, dsty;     if (border)        goto fail; +   srcx = x; +   srcy = y; +   dstx = 0; +   dsty = 0; +   if (!_mesa_clip_copytexsubimage(ctx, +				   &dstx, &dsty, +				   &srcx, &srcy, +				   &width, &height)) +      return; +     /* Setup or redefine the texture object, mipmap tree and texture      * image.  Don't populate yet.        */ | 
