[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

mesa: Changes to 'debian-experimental'



 Makefile                                                |   14 
 configs/autoconf.in                                     |   10 
 configs/default                                         |   14 
 configure.ac                                            |  505 +++++++---------
 debian/changelog                                        |    9 
 docs/egl.html                                           |   45 -
 docs/opengles.html                                      |   19 
 docs/openvg.html                                        |   10 
 docs/relnotes-7.11.html                                 |    2 
 include/EGL/eglplatform.h                               |    6 
 include/GL/internal/dri_interface.h                     |    5 
 src/egl/drivers/dri2/Makefile                           |    9 
 src/egl/drivers/dri2/egl_dri2.c                         |   78 +-
 src/egl/drivers/dri2/egl_dri2.h                         |   16 
 src/egl/drivers/dri2/platform_drm.c                     |   99 ++-
 src/egl/drivers/dri2/platform_wayland.c                 |  143 +++-
 src/egl/drivers/dri2/platform_x11.c                     |    9 
 src/egl/main/Makefile                                   |    4 
 src/egl/wayland/wayland-drm/wayland-drm.c               |    4 
 src/gallium/auxiliary/gallivm/lp_bld_misc.cpp           |    4 
 src/gallium/auxiliary/indices/u_unfilled_gen.py         |    4 
 src/gallium/auxiliary/indices/u_unfilled_indices.c      |    7 
 src/gallium/auxiliary/util/u_vbuf_mgr.c                 |   58 -
 src/gallium/auxiliary/util/u_vbuf_mgr.h                 |   12 
 src/gallium/drivers/i915/Makefile                       |    1 
 src/gallium/drivers/i915/SConscript                     |    1 
 src/gallium/drivers/i915/i915_clear.c                   |    2 
 src/gallium/drivers/i915/i915_context.c                 |   23 
 src/gallium/drivers/i915/i915_context.h                 |    3 
 src/gallium/drivers/i915/i915_fpc_translate.c           |    2 
 src/gallium/drivers/i915/i915_query.c                   |   85 ++
 src/gallium/drivers/i915/i915_query.h                   |   36 +
 src/gallium/drivers/i915/i915_resource.c                |    4 
 src/gallium/drivers/i915/i915_resource.h                |   12 
 src/gallium/drivers/i915/i915_resource_texture.c        |  201 +++++-
 src/gallium/drivers/i915/i915_screen.c                  |   11 
 src/gallium/drivers/i915/i915_screen.h                  |    6 
 src/gallium/drivers/i915/i915_state.c                   |    3 
 src/gallium/drivers/i915/i915_state_emit.c              |   73 ++
 src/gallium/drivers/i915/i915_state_sampler.c           |    2 
 src/gallium/drivers/i915/i915_state_static.c            |    9 
 src/gallium/drivers/nouveau/nouveau_screen.c            |   14 
 src/gallium/drivers/nouveau/nouveau_screen.h            |    2 
 src/gallium/drivers/nv50/nv50_context.c                 |    8 
 src/gallium/drivers/nv50/nv50_context.h                 |    2 
 src/gallium/drivers/nv50/nv50_screen.h                  |    2 
 src/gallium/drivers/nv50/nv50_vbo.c                     |   15 
 src/gallium/drivers/nvc0/nvc0_context.c                 |    8 
 src/gallium/drivers/nvc0/nvc0_context.h                 |    2 
 src/gallium/drivers/nvc0/nvc0_screen.h                  |    2 
 src/gallium/drivers/nvc0/nvc0_vbo.c                     |   15 
 src/gallium/drivers/nvfx/nvfx_context.c                 |   16 
 src/gallium/drivers/nvfx/nvfx_screen.c                  |    7 
 src/gallium/drivers/nvfx/nvfx_screen.h                  |    1 
 src/gallium/drivers/r300/r300_render.c                  |  102 +--
 src/gallium/drivers/r300/r300_texture.c                 |   21 
 src/gallium/drivers/r600/eg_state_inlines.h             |    1 
 src/gallium/drivers/r600/evergreen_state.c              |    8 
 src/gallium/drivers/r600/r600_asm.c                     |    2 
 src/gallium/drivers/r600/r600_blit.c                    |    3 
 src/gallium/drivers/r600/r600_pipe.c                    |    8 
 src/gallium/drivers/r600/r600_pipe.h                    |   15 
 src/gallium/drivers/r600/r600_shader.c                  |  200 ++++--
 src/gallium/drivers/r600/r600_shader.h                  |    2 
 src/gallium/drivers/r600/r600_state.c                   |   59 +
 src/gallium/drivers/r600/r600_state_common.c            |  101 +--
 src/gallium/drivers/r600/r600_texture.c                 |   11 
 src/gallium/drivers/r600/r600d.h                        |    3 
 src/gallium/state_trackers/dri/drm/dri2.c               |   19 
 src/gallium/state_trackers/egl/Makefile                 |    3 
 src/gallium/state_trackers/egl/SConscript               |    4 
 src/gallium/state_trackers/egl/common/egl_g3d.c         |   18 
 src/gallium/state_trackers/egl/common/egl_g3d.h         |    8 
 src/gallium/state_trackers/egl/common/egl_g3d_api.c     |   14 
 src/gallium/state_trackers/egl/common/egl_g3d_image.c   |   70 --
 src/gallium/state_trackers/egl/common/egl_g3d_loader.h  |    1 
 src/gallium/state_trackers/egl/common/native.h          |    3 
 src/gallium/state_trackers/egl/common/native_buffer.h   |   31 
 src/gallium/state_trackers/egl/common/native_helper.c   |   72 ++
 src/gallium/state_trackers/egl/common/native_helper.h   |    9 
 src/gallium/state_trackers/egl/drm/modeset.c            |   36 +
 src/gallium/state_trackers/egl/drm/native_drm.c         |  100 +--
 src/gallium/state_trackers/egl/drm/native_drm.h         |    4 
 src/gallium/state_trackers/egl/wayland/native_drm.c     |   23 
 src/gallium/state_trackers/egl/wayland/native_wayland.c |    8 
 src/gallium/state_trackers/gbm/Makefile                 |   46 +
 src/gallium/state_trackers/gbm/gbm_drm.c                |  226 +++++++
 src/gallium/state_trackers/gbm/gbm_gallium_drmint.h     |   74 ++
 src/gallium/state_trackers/wgl/stw_ext_pbuffer.c        |    2 
 src/gallium/state_trackers/xorg/xorg_composite.c        |    6 
 src/gallium/state_trackers/xorg/xorg_crtc.c             |    1 
 src/gallium/targets/Makefile.xorg                       |    2 
 src/gallium/targets/egl-static/Makefile                 |  201 ++++++
 src/gallium/targets/egl-static/egl.c                    |   85 ++
 src/gallium/targets/egl-static/egl_st.c                 |  127 +++-
 src/gallium/targets/egl-static/egl_st.h                 |    3 
 src/gallium/targets/egl-static/st_GL.c                  |   35 +
 src/gallium/targets/egl/Makefile                        |  242 -------
 src/gallium/targets/egl/egl.c                           |  495 ---------------
 src/gallium/targets/egl/egl.h                           |   44 -
 src/gallium/targets/egl/pipe_i915.c                     |   27 
 src/gallium/targets/egl/pipe_i965.c                     |   30 
 src/gallium/targets/egl/pipe_nouveau.c                  |   21 
 src/gallium/targets/egl/pipe_r300.c                     |   27 
 src/gallium/targets/egl/pipe_r600.c                     |   27 
 src/gallium/targets/egl/pipe_swrast.c                   |   22 
 src/gallium/targets/egl/pipe_vmwgfx.c                   |   27 
 src/gallium/targets/egl/st_GL.c                         |    8 
 src/gallium/targets/egl/st_OpenVG.c                     |    8 
 src/gallium/targets/gbm/Makefile                        |  156 ++++
 src/gallium/targets/gbm/gbm.c                           |   61 +
 src/gallium/targets/gbm/pipe_i915.c                     |   27 
 src/gallium/targets/gbm/pipe_i965.c                     |   30 
 src/gallium/targets/gbm/pipe_loader.c                   |  192 ++++++
 src/gallium/targets/gbm/pipe_loader.h                   |   48 +
 src/gallium/targets/gbm/pipe_nouveau.c                  |   21 
 src/gallium/targets/gbm/pipe_r300.c                     |   27 
 src/gallium/targets/gbm/pipe_r600.c                     |   27 
 src/gallium/targets/gbm/pipe_swrast.c                   |   22 
 src/gallium/targets/gbm/pipe_vmwgfx.c                   |   27 
 src/gallium/targets/xorg-nouveau/Makefile               |    5 
 src/gallium/targets/xorg-nouveau/nouveau_xorg.c         |   75 +-
 src/gallium/tests/trivial/Makefile                      |   11 
 src/gallium/tests/trivial/quad-tex.c                    |    4 
 src/gallium/tests/trivial/tri.c                         |    4 
 src/gallium/winsys/r600/drm/r600_drm.c                  |   15 
 src/gallium/winsys/sw/wayland/wayland_sw_winsys.h       |    1 
 src/gbm/Makefile                                        |   14 
 src/gbm/backends/Makefile                               |   14 
 src/gbm/backends/Makefile.template                      |   65 ++
 src/gbm/backends/dri/Makefile                           |   22 
 src/gbm/backends/dri/driver_name.c                      |   89 ++
 src/gbm/backends/dri/gbm_dri.c                          |  378 +++++++++++
 src/gbm/backends/dri/gbm_driint.h                       |   78 ++
 src/gbm/main/Makefile                                   |   90 ++
 src/gbm/main/backend.c                                  |  128 ++++
 src/gbm/main/backend.h                                  |   36 +
 src/gbm/main/common.c                                   |   88 ++
 src/gbm/main/common.h                                   |   42 +
 src/gbm/main/common_drm.h                               |   48 +
 src/gbm/main/gbm.c                                      |  190 ++++++
 src/gbm/main/gbm.h                                      |  100 +++
 src/gbm/main/gbm.pc.in                                  |   12 
 src/gbm/main/gbmint.h                                   |   82 ++
 src/glsl/linker.cpp                                     |   41 +
 src/glsl/main.cpp                                       |    1 
 src/glw/GLwDrawA.h                                      |    8 
 src/glw/GLwDrawAP.h                                     |    4 
 src/glx/applegl_glx.c                                   |    9 
 src/glx/dri2_glx.c                                      |    1 
 src/glx/dri_glx.c                                       |    1 
 src/glx/drisw_glx.c                                     |    1 
 src/glx/glxclient.h                                     |    2 
 src/glx/glxcmds.c                                       |    6 
 src/glx/glxcurrent.c                                    |   41 -
 src/glx/indirect_glx.c                                  |    1 
 src/mapi/glapi/gen/ARB_geometry_shader4.xml             |    2 
 src/mesa/drivers/dri/i915/i830_vtbl.c                   |    8 
 src/mesa/drivers/dri/i915/i915_vtbl.c                   |   13 
 src/mesa/drivers/dri/i965/brw_clip.c                    |   24 
 src/mesa/drivers/dri/i965/brw_clip_state.c              |   19 
 src/mesa/drivers/dri/i965/brw_context.c                 |    2 
 src/mesa/drivers/dri/i965/brw_context.h                 |   56 +
 src/mesa/drivers/dri/i965/brw_draw.c                    |    3 
 src/mesa/drivers/dri/i965/brw_draw_upload.c             |    5 
 src/mesa/drivers/dri/i965/brw_fs.cpp                    |   11 
 src/mesa/drivers/dri/i965/brw_fs.h                      |    2 
 src/mesa/drivers/dri/i965/brw_fs_emit.cpp               |    7 
 src/mesa/drivers/dri/i965/brw_fs_reg_allocate.cpp       |    9 
 src/mesa/drivers/dri/i965/brw_fs_visitor.cpp            |  216 +++++-
 src/mesa/drivers/dri/i965/brw_gs.c                      |   24 
 src/mesa/drivers/dri/i965/brw_gs_state.c                |   19 
 src/mesa/drivers/dri/i965/brw_misc_state.c              |   39 +
 src/mesa/drivers/dri/i965/brw_sf.c                      |   22 
 src/mesa/drivers/dri/i965/brw_sf_state.c                |   15 
 src/mesa/drivers/dri/i965/brw_state.h                   |   30 
 src/mesa/drivers/dri/i965/brw_state_cache.c             |  227 ++++---
 src/mesa/drivers/dri/i965/brw_state_dump.c              |   26 
 src/mesa/drivers/dri/i965/brw_state_upload.c            |   17 
 src/mesa/drivers/dri/i965/brw_vs.c                      |   22 
 src/mesa/drivers/dri/i965/brw_vs_emit.c                 |    2 
 src/mesa/drivers/dri/i965/brw_vs_state.c                |   30 
 src/mesa/drivers/dri/i965/brw_vtbl.c                    |   21 
 src/mesa/drivers/dri/i965/brw_wm.c                      |   23 
 src/mesa/drivers/dri/i965/brw_wm.h                      |   12 
 src/mesa/drivers/dri/i965/brw_wm_state.c                |   40 -
 src/mesa/drivers/dri/i965/brw_wm_surface_state.c        |    2 
 src/mesa/drivers/dri/i965/gen6_gs_state.c               |    5 
 src/mesa/drivers/dri/i965/gen6_urb.c                    |    2 
 src/mesa/drivers/dri/i965/gen6_vs_state.c               |    7 
 src/mesa/drivers/dri/i965/gen6_wm_state.c               |   28 
 src/mesa/drivers/dri/i965/gen7_disable.c                |    2 
 src/mesa/drivers/dri/i965/gen7_urb.c                    |    2 
 src/mesa/drivers/dri/i965/gen7_vs_state.c               |    2 
 src/mesa/drivers/dri/i965/gen7_wm_state.c               |   20 
 src/mesa/drivers/dri/intel/intel_batchbuffer.c          |   72 ++
 src/mesa/drivers/dri/intel/intel_batchbuffer.h          |    2 
 src/mesa/drivers/dri/intel/intel_buffers.c              |   84 +-
 src/mesa/drivers/dri/intel/intel_context.c              |    7 
 src/mesa/drivers/dri/intel/intel_context.h              |    3 
 src/mesa/drivers/dri/intel/intel_extensions.c           |    1 
 src/mesa/drivers/dri/intel/intel_fbo.c                  |  182 ++++-
 src/mesa/drivers/dri/intel/intel_fbo.h                  |   70 ++
 src/mesa/drivers/dri/intel/intel_screen.c               |   27 
 src/mesa/drivers/dri/intel/intel_span.c                 |   20 
 src/mesa/drivers/dri/intel/intel_tex.c                  |    9 
 src/mesa/drivers/dri/intel/intel_tex_image.c            |  153 ++++
 src/mesa/drivers/dri/intel/intel_tex_obj.h              |   30 
 src/mesa/drivers/dri/r200/r200_cmdbuf.c                 |    6 
 src/mesa/drivers/dri/r600/r700_render.c                 |   68 --
 src/mesa/drivers/dri/radeon/radeon_screen.c             |    3 
 src/mesa/main/fbobject.c                                |    4 
 src/mesa/main/mtypes.h                                  |    3 
 src/mesa/main/pack.c                                    |   15 
 src/mesa/main/renderbuffer.c                            |   23 
 src/mesa/main/renderbuffer.h                            |    3 
 src/mesa/main/state.c                                   |   65 +-
 src/mesa/main/teximage.c                                |    2 
 src/mesa/main/texobj.c                                  |    2 
 src/mesa/main/texstore.c                                |    9 
 src/mesa/state_tracker/st_atom_pixeltransfer.c          |    2 
 src/mesa/state_tracker/st_cb_drawpixels.c               |   10 
 src/mesa/state_tracker/st_cb_texture.c                  |    3 
 src/mesa/state_tracker/st_draw.c                        |   18 
 src/mesa/state_tracker/st_format.c                      |  106 +++
 src/mesa/state_tracker/st_format.h                      |    1 
 src/mesa/state_tracker/st_manager.c                     |   69 +-
 src/mesa/vbo/vbo_rebase.c                               |    6 
 228 files changed, 6223 insertions(+), 2615 deletions(-)

New commits:
commit 9724e5a016bb088b380c1cae2e398a4dc54a06f7
Author: Cyril Brulebois <kibi@debian.org>
Date:   Tue Jun 28 12:09:45 2011 +0200

    Bump changelog, close #631516, thank Martin Steigerwald.

diff --git a/debian/changelog b/debian/changelog
index 9cca73d..3f3620b 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,12 @@
+mesa (7.11~1-1) UNRELEASED; urgency=low
+
+  * New upstream snapshot from the 7.11 branch (up to 1ad06c7a25):
+    - Fix regression from 7.10, missing characters in text display with
+      intel drivers (Closes: #631516). Thanks to Martin Steigerwald for
+      the report and the tests.
+
+ -- Cyril Brulebois <kibi@debian.org>  Tue, 28 Jun 2011 12:06:59 +0200
+
 mesa (7.11~0-2) experimental; urgency=low
 
   * Thank you sbuild for giving a green light when that's not actually the

commit ebc884d3dd1c67e7f2eaa8ea56815de446a1f8ec
Author: Marek Olšák <maraeo@gmail.com>
Date:   Sat Jun 25 07:20:20 2011 +0200

    r300g: drop support for ARGB, ABGR, XRGB, XBGR render targets
    
    Blending and maybe even alpha-test don't work with those formats.
    
    Only supporting RGBA, BGRA, RGBX, BGRX.
    
    NOTE: This is a candidate for the 7.10 and 7.11 branches.
    (cherry picked from commit bc517d64dad41bc66ab5cc1c82d8d8111145d8a1)

diff --git a/src/gallium/drivers/r300/r300_texture.c b/src/gallium/drivers/r300/r300_texture.c
index 38ca9a2..62c2f1f 100644
--- a/src/gallium/drivers/r300/r300_texture.c
+++ b/src/gallium/drivers/r300/r300_texture.c
@@ -447,16 +447,8 @@ static uint32_t r300_translate_colorformat(enum pipe_format format)
         /*case PIPE_FORMAT_B8G8R8A8_SNORM:*/
         case PIPE_FORMAT_B8G8R8X8_UNORM:
         /*case PIPE_FORMAT_B8G8R8X8_SNORM:*/
-        case PIPE_FORMAT_A8R8G8B8_UNORM:
-        /*case PIPE_FORMAT_A8R8G8B8_SNORM:*/
-        case PIPE_FORMAT_X8R8G8B8_UNORM:
-        /*case PIPE_FORMAT_X8R8G8B8_SNORM:*/
-        case PIPE_FORMAT_A8B8G8R8_UNORM:
-        /*case PIPE_FORMAT_A8B8G8R8_SNORM:*/
         case PIPE_FORMAT_R8G8B8A8_UNORM:
         case PIPE_FORMAT_R8G8B8A8_SNORM:
-        case PIPE_FORMAT_X8B8G8R8_UNORM:
-        /*case PIPE_FORMAT_X8B8G8R8_SNORM:*/
         case PIPE_FORMAT_R8G8B8X8_UNORM:
         /*case PIPE_FORMAT_R8G8B8X8_SNORM:*/
         /* These formats work fine with ARGB8888 if US_OUT_FMT is set
@@ -662,10 +654,6 @@ static uint32_t r300_translate_out_fmt(enum pipe_format format)
                 R300_C2_SEL_R | R300_C3_SEL_A;
 
         /* ARGB outputs. */
-        case PIPE_FORMAT_A8R8G8B8_UNORM:
-        /*case PIPE_FORMAT_A8R8G8B8_SNORM:*/
-        case PIPE_FORMAT_X8R8G8B8_UNORM:
-        /*case PIPE_FORMAT_X8R8G8B8_SNORM:*/
         case PIPE_FORMAT_A16_UNORM:
         case PIPE_FORMAT_A16_SNORM:
         case PIPE_FORMAT_A16_FLOAT:
@@ -674,15 +662,6 @@ static uint32_t r300_translate_out_fmt(enum pipe_format format)
                 R300_C0_SEL_A | R300_C1_SEL_R |
                 R300_C2_SEL_G | R300_C3_SEL_B;
 
-        /* ABGR outputs. */
-        case PIPE_FORMAT_A8B8G8R8_UNORM:
-        /*case PIPE_FORMAT_A8B8G8R8_SNORM:*/
-        case PIPE_FORMAT_X8B8G8R8_UNORM:
-        /*case PIPE_FORMAT_X8B8G8R8_SNORM:*/
-            return modifier |
-                R300_C0_SEL_A | R300_C1_SEL_B |
-                R300_C2_SEL_G | R300_C3_SEL_R;
-
         /* RGBA outputs. */
         case PIPE_FORMAT_R8G8B8X8_UNORM:
         /*case PIPE_FORMAT_R8G8B8X8_SNORM:*/

commit 9383cfb4ba7f221939f3ecd93b915b8133d62b58
Author: Brian Paul <brianp@vmware.com>
Date:   Sat Jun 25 06:20:32 2011 -0600

    Revert "Fix 24bpp software rendering"
    
    This reverts commit c0c0bb6cb140825f5bab3c40c0c9c0ec575fbc76.

diff --git a/src/mesa/drivers/dri/swrast/swrast.c b/src/mesa/drivers/dri/swrast/swrast.c
index 90b5ef0..719b406 100644
--- a/src/mesa/drivers/dri/swrast/swrast.c
+++ b/src/mesa/drivers/dri/swrast/swrast.c
@@ -233,17 +233,10 @@ choose_pixel_format(const struct gl_config *v)
 	&& v->blueMask  == 0x0000ff)
 	return PF_A8R8G8B8;
     else if (depth == 24
-             && v->depthBits == 32
-             && v->redMask   == 0xff0000
-             && v->greenMask == 0x00ff00
-             && v->blueMask  == 0x0000ff)
-        return PF_X8R8G8B8;
-    else if (depth == 24
-             && v->depthBits == 24
-             && v->redMask   == 0xff0000
-             && v->greenMask == 0x00ff00
-             && v->blueMask  == 0x0000ff)
-        return PF_R8G8B8;
+	     && v->redMask   == 0xff0000
+	     && v->greenMask == 0x00ff00
+	     && v->blueMask  == 0x0000ff)
+	return PF_X8R8G8B8;
     else if (depth == 16
 	     && v->redMask   == 0xf800
 	     && v->greenMask == 0x07e0
@@ -351,13 +344,6 @@ swrast_new_renderbuffer(const struct gl_config *visual, GLboolean front)
 	xrb->Base.DataType = GL_UNSIGNED_BYTE;
 	xrb->bpp = 32;
 	break;
-    case PF_R8G8B8:
-        xrb->Base.Format = MESA_FORMAT_RGB888;
-        xrb->Base.InternalFormat = GL_RGB;
-        xrb->Base._BaseFormat = GL_RGB;
-        xrb->Base.DataType = GL_UNSIGNED_BYTE;
-        xrb->bpp = 24;
-        break;
     case PF_R5G6B5:
 	xrb->Base.Format = MESA_FORMAT_RGB565;
 	xrb->Base.InternalFormat = GL_RGB;
diff --git a/src/mesa/drivers/dri/swrast/swrast_priv.h b/src/mesa/drivers/dri/swrast/swrast_priv.h
index 40f787f..bdb52ef 100644
--- a/src/mesa/drivers/dri/swrast/swrast_priv.h
+++ b/src/mesa/drivers/dri/swrast/swrast_priv.h
@@ -123,7 +123,6 @@ swrast_renderbuffer(struct gl_renderbuffer *rb)
 #define PF_R5G6B5     2		/**< 16bpp TrueColor:  5-R, 6-G, 5-B bits */
 #define PF_R3G3B2     3		/**<  8bpp TrueColor:  3-R, 3-G, 2-B bits */
 #define PF_X8R8G8B8   4		/**< 32bpp TrueColor:  8-R, 8-G, 8-B bits */
-#define PF_R8G8B8     5         /**< 24bpp TrueColor:  8-R, 8-G, 8-B bits */
 
 
 /* swrast_span.c */
diff --git a/src/mesa/drivers/dri/swrast/swrast_span.c b/src/mesa/drivers/dri/swrast/swrast_span.c
index 71aafbb..c7d0bfd 100644
--- a/src/mesa/drivers/dri/swrast/swrast_span.c
+++ b/src/mesa/drivers/dri/swrast/swrast_span.c
@@ -81,22 +81,6 @@ static const GLubyte kernel[16] = {
    DST[BCOMP] = *SRC & 0xff
 
 
-/* 24-bit BGR */
-#define STORE_PIXEL_R8G8B8(DST, X, Y, VALUE) \
-   DST[2] = VALUE[RCOMP]; \
-   DST[1] = VALUE[GCOMP]; \
-   DST[0] = VALUE[BCOMP]
-#define STORE_PIXEL_RGB_R8G8B8(DST, X, Y, VALUE) \
-   DST[2] = VALUE[RCOMP]; \
-   DST[1] = VALUE[GCOMP]; \
-   DST[0] = VALUE[BCOMP]
-#define FETCH_PIXEL_R8G8B8(DST, SRC) \
-   DST[ACOMP] = 0xff;                  \
-   DST[RCOMP] = (*SRC >> 16) & 0xff;   \
-   DST[GCOMP] = (*SRC >> 8) & 0xff;    \
-   DST[BCOMP] = *SRC & 0xff
-
-
 /* 16-bit BGR */
 #define STORE_PIXEL_R5G6B5(DST, X, Y, VALUE) \
    do { \
@@ -173,24 +157,6 @@ static const GLubyte kernel[16] = {
 #include "swrast/s_spantemp.h"
 
 
-/* 24-bit BGR */
-#define NAME(FUNC) FUNC##_R8G8B8
-#define RB_TYPE GLubyte
-#define SPAN_VARS \
-   struct swrast_renderbuffer *xrb = swrast_renderbuffer(rb);
-#define INIT_PIXEL_PTR(P, X, Y) \
-   GLubyte *P = (GLubyte *)xrb->Base.Data + YFLIP(xrb, Y) * xrb->pitch + (3*X);
-#define INC_PIXEL_PTR(P) P+=3
-#define STORE_PIXEL(DST, X, Y, VALUE) \
-   STORE_PIXEL_R8G8B8(DST, X, Y, VALUE)
-#define STORE_PIXEL_RGB(DST, X, Y, VALUE) \
-   STORE_PIXEL_RGB_R8G8B8(DST, X, Y, VALUE)
-#define FETCH_PIXEL(DST, SRC) \
-   FETCH_PIXEL_R8G8B8(DST, SRC)
-
-#include "swrast/s_spantemp.h"
-
-
 /* 16-bit BGR */
 #define NAME(FUNC) FUNC##_R5G6B5
 #define RB_TYPE GLubyte
@@ -263,24 +229,6 @@ static const GLubyte kernel[16] = {
 #include "swrast_spantemp.h"
 
 
-/* 24-bit BGR */
-#define NAME(FUNC) FUNC##_R8G8B8_front
-#define RB_TYPE GLubyte
-#define SPAN_VARS \
-   struct swrast_renderbuffer *xrb = swrast_renderbuffer(rb);
-#define INIT_PIXEL_PTR(P, X, Y) \
-   GLubyte *P = (GLubyte *)row;
-#define INC_PIXEL_PTR(P) P+=3
-#define STORE_PIXEL(DST, X, Y, VALUE) \
-   STORE_PIXEL_R8G8B8(DST, X, Y, VALUE)
-#define STORE_PIXEL_RGB(DST, X, Y, VALUE) \
-   STORE_PIXEL_RGB_R8G8B8(DST, X, Y, VALUE)
-#define FETCH_PIXEL(DST, SRC) \
-   FETCH_PIXEL_R8G8B8(DST, SRC)
-
-#include "swrast_spantemp.h"
-
-
 /* 16-bit BGR */
 #define NAME(FUNC) FUNC##_R5G6B5_front
 #define RB_TYPE GLubyte
@@ -342,15 +290,6 @@ swrast_set_span_funcs_back(struct swrast_renderbuffer *xrb,
 	xrb->Base.PutValues = put_values_X8R8G8B8;
 	xrb->Base.PutMonoValues = put_mono_values_X8R8G8B8;
 	break;
-   case PF_R8G8B8:
-        xrb->Base.GetRow = get_row_R8G8B8;
-        xrb->Base.GetValues = get_values_R8G8B8;
-        xrb->Base.PutRow = put_row_R8G8B8;
-        xrb->Base.PutRowRGB = put_row_rgb_R8G8B8;
-        xrb->Base.PutMonoRow = put_mono_row_R8G8B8;
-        xrb->Base.PutValues = put_values_R8G8B8;
-        xrb->Base.PutMonoValues = put_mono_values_R8G8B8;
-        break;
     case PF_R5G6B5:
 	xrb->Base.GetRow = get_row_R5G6B5;
 	xrb->Base.GetValues = get_values_R5G6B5;
@@ -407,15 +346,6 @@ swrast_set_span_funcs_front(struct swrast_renderbuffer *xrb,
 	xrb->Base.PutValues = put_values_X8R8G8B8_front;
 	xrb->Base.PutMonoValues = put_mono_values_X8R8G8B8_front;
 	break;
-    case PF_R8G8B8:
-        xrb->Base.GetRow = get_row_R8G8B8_front;
-        xrb->Base.GetValues = get_values_R8G8B8_front;
-        xrb->Base.PutRow = put_row_R8G8B8_front;
-        xrb->Base.PutRowRGB = put_row_rgb_R8G8B8_front;
-        xrb->Base.PutMonoRow = put_mono_row_R8G8B8_front;
-        xrb->Base.PutValues = put_values_R8G8B8_front;
-        xrb->Base.PutMonoValues = put_mono_values_R8G8B8_front;
-        break;
     case PF_R5G6B5:
 	xrb->Base.GetRow = get_row_R5G6B5_front;
 	xrb->Base.GetValues = get_values_R5G6B5_front;

commit ac8f59b23ed8256bcce40c47b5773669b00ba78a
Author: Stéphane Marchesin <marcheu@chromium.org>
Date:   Fri Jun 24 19:51:25 2011 -0700

    i915g: always upload the vs constants.
    
    This fixes a crash in llvm draw.

diff --git a/src/gallium/drivers/i915/i915_context.c b/src/gallium/drivers/i915/i915_context.c
index 6d2e104..0d18c7a 100644
--- a/src/gallium/drivers/i915/i915_context.c
+++ b/src/gallium/drivers/i915/i915_context.c
@@ -73,15 +73,13 @@ i915_draw_vbo(struct pipe_context *pipe, const struct pipe_draw_info *info)
       mapped_indices = i915_buffer(i915->index_buffer.buffer)->data;
    draw_set_mapped_index_buffer(draw, mapped_indices);
 
-   if (cbuf_dirty) {
-      if (i915->constants[PIPE_SHADER_VERTEX])
-         draw_set_mapped_constant_buffer(draw, PIPE_SHADER_VERTEX, 0,
-                                         i915_buffer(i915->constants[PIPE_SHADER_VERTEX])->data,
-                                         (i915->current.num_user_constants[PIPE_SHADER_VERTEX] * 
-                                         4 * sizeof(float)));
-      else
-         draw_set_mapped_constant_buffer(draw, PIPE_SHADER_VERTEX, 0, NULL, 0);
-   }
+   if (i915->constants[PIPE_SHADER_VERTEX])
+      draw_set_mapped_constant_buffer(draw, PIPE_SHADER_VERTEX, 0,
+                                      i915_buffer(i915->constants[PIPE_SHADER_VERTEX])->data,
+                                      (i915->current.num_user_constants[PIPE_SHADER_VERTEX] * 
+                                      4 * sizeof(float)));
+   else
+      draw_set_mapped_constant_buffer(draw, PIPE_SHADER_VERTEX, 0, NULL, 0);
 
    /*
     * Do the drawing

commit 773556e0f537eba82d9d68d618e229140f413620
Author: Eric Anholt <eric@anholt.net>
Date:   Fri Jun 24 15:40:51 2011 -0700

    i965/gen5: Fix grf_used calculation for 16-wide.
    
    If we happened to allocate a texture result (or other vector) to the
    highest hardware register slot, and we were in 16-wide, we would
    under-count the registers used and potentially wrap around to g0 if
    that allocation crossed a 16-register block boundary.  Bad rendering
    and hangs ensued.
    
    Tested-by: Ian Romanick <idr@freedesktop.org>

diff --git a/src/mesa/drivers/dri/i965/brw_fs_reg_allocate.cpp b/src/mesa/drivers/dri/i965/brw_fs_reg_allocate.cpp
index f88b131..b4689d2 100644
--- a/src/mesa/drivers/dri/i965/brw_fs_reg_allocate.cpp
+++ b/src/mesa/drivers/dri/i965/brw_fs_reg_allocate.cpp
@@ -101,7 +101,6 @@ fs_visitor::assign_regs()
     * for reg_width == 2.
     */
    int reg_width = c->dispatch_width / 8;
-   int last_grf = 0;
    int hw_reg_mapping[this->virtual_grf_next + 1];
    int first_assigned_grf = ALIGN(this->first_non_payload_grf, reg_width);
    int base_reg_count = (BRW_MAX_GRF - first_assigned_grf) / reg_width;
@@ -263,6 +262,7 @@ fs_visitor::assign_regs()
     * regs in the register classes back down to real hardware reg
     * numbers.
     */
+   this->grf_used = first_assigned_grf;
    hw_reg_mapping[0] = 0; /* unused */
    for (int i = 1; i < this->virtual_grf_next; i++) {
       int reg = ra_get_node_reg(g, i);
@@ -278,8 +278,9 @@ fs_visitor::assign_regs()
 
       assert(hw_reg >= 0);
       hw_reg_mapping[i] = first_assigned_grf + hw_reg * reg_width;
-      last_grf = MAX2(last_grf,
-		      hw_reg_mapping[i] + this->virtual_grf_sizes[i] - 1);
+      this->grf_used = MAX2(this->grf_used,
+			    hw_reg_mapping[i] + this->virtual_grf_sizes[i] *
+			    reg_width);
    }
 
    foreach_iter(exec_list_iterator, iter, this->instructions) {
@@ -290,8 +291,6 @@ fs_visitor::assign_regs()
       assign_reg(hw_reg_mapping, &inst->src[1], reg_width);
    }
 
-   this->grf_used = last_grf + reg_width;
-
    ralloc_free(g);
    ralloc_free(regs);
 

commit 7b44830ef40b6d4644c3f55189ed2457e6822428
Author: Stéphane Marchesin <marcheu@chromium.org>
Date:   Fri Jun 24 17:18:12 2011 -0700

    i915g: add fake occlusion queries.
    
    Those always return 0, but at least we don't crash when exposing GL 2.0.

diff --git a/src/gallium/drivers/i915/Makefile b/src/gallium/drivers/i915/Makefile
index b3f387f..7781247 100644
--- a/src/gallium/drivers/i915/Makefile
+++ b/src/gallium/drivers/i915/Makefile
@@ -21,6 +21,7 @@ C_SOURCES = \
 	i915_screen.c \
 	i915_prim_emit.c \
 	i915_prim_vbuf.c \
+	i915_query.c \
 	i915_resource.c \
 	i915_resource_texture.c \
 	i915_resource_buffer.c \
diff --git a/src/gallium/drivers/i915/SConscript b/src/gallium/drivers/i915/SConscript
index 8f5deed..9837060 100644
--- a/src/gallium/drivers/i915/SConscript
+++ b/src/gallium/drivers/i915/SConscript
@@ -16,6 +16,7 @@ i915 = env.ConvenienceLibrary(
 		'i915_fpc_translate.c',
 		'i915_prim_emit.c',
 		'i915_prim_vbuf.c',
+		'i915_query.c',
 		'i915_screen.c',
 		'i915_state.c',
 		'i915_state_derived.c',
diff --git a/src/gallium/drivers/i915/i915_context.c b/src/gallium/drivers/i915/i915_context.c
index ab4ea9a..6d2e104 100644
--- a/src/gallium/drivers/i915/i915_context.c
+++ b/src/gallium/drivers/i915/i915_context.c
@@ -29,6 +29,7 @@
 #include "i915_state.h"
 #include "i915_screen.h"
 #include "i915_surface.h"
+#include "i915_query.h"
 #include "i915_batch.h"
 #include "i915_resource.h"
 
@@ -172,6 +173,7 @@ i915_create_context(struct pipe_screen *screen, void *priv)
    i915_init_state_functions(i915);
    i915_init_flush_functions(i915);
    i915_init_resource_functions(i915);
+   i915_init_query_functions(i915);
 
    draw_install_aaline_stage(i915->draw, &i915->base);
    draw_install_aapoint_stage(i915->draw, &i915->base);
diff --git a/src/gallium/drivers/i915/i915_query.c b/src/gallium/drivers/i915/i915_query.c
new file mode 100644
index 0000000..77ed946
--- /dev/null
+++ b/src/gallium/drivers/i915/i915_query.c
@@ -0,0 +1,85 @@
+/**************************************************************************
+ * 
+ * Copyright 2011 The Chromium OS authors.
+ * All Rights Reserved.
+ * 
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the
+ * "Software"), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, sub license, and/or sell copies of the Software, and to
+ * permit persons to whom the Software is furnished to do so, subject to
+ * the following conditions:
+ * 
+ * The above copyright notice and this permission notice (including the
+ * next paragraph) shall be included in all copies or substantial portions
+ * of the Software.
+ * 
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
+ * IN NO EVENT SHALL GOOGLE AND/OR ITS SUPPLIERS BE LIABLE FOR
+ * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ * 
+ **************************************************************************/
+
+/* Fake occlusion queries which return 0, it's better than crashing */
+
+#include "pipe/p_compiler.h"
+
+#include "util/u_memory.h"
+
+#include "i915_context.h"
+#include "i915_query.h"
+
+struct i915_query
+{
+   unsigned query;
+};
+
+static struct pipe_query *i915_create_query(struct pipe_context *ctx,
+                                            unsigned query_type)
+{
+   struct i915_query *query = CALLOC_STRUCT( i915_query );
+
+   return (struct pipe_query *)query;
+}
+
+static void i915_destroy_query(struct pipe_context *ctx,
+                               struct pipe_query *query)
+{
+   FREE(query);
+}
+
+static void i915_begin_query(struct pipe_context *ctx,
+                             struct pipe_query *query)
+{
+}
+
+static void i915_end_query(struct pipe_context *ctx, struct pipe_query *query)
+{
+}
+
+static boolean i915_get_query_result(struct pipe_context *ctx,
+                                     struct pipe_query *query,
+                                     boolean wait,
+                                     void *vresult)
+{
+   uint64_t *result = (uint64_t*)vresult;
+
+   *result = 0;
+   return TRUE;
+}
+
+void
+i915_init_query_functions(struct i915_context *i915)
+{
+   i915->base.create_query = i915_create_query;
+   i915->base.destroy_query = i915_destroy_query;
+   i915->base.begin_query = i915_begin_query;
+   i915->base.end_query = i915_end_query;
+   i915->base.get_query_result = i915_get_query_result;
+}
+
diff --git a/src/gallium/drivers/i915/i915_query.h b/src/gallium/drivers/i915/i915_query.h
new file mode 100644
index 0000000..2c689ea
--- /dev/null
+++ b/src/gallium/drivers/i915/i915_query.h
@@ -0,0 +1,36 @@
+/**************************************************************************
+ * 
+ * Copyright 2011 The Chromium OS authors.
+ * All Rights Reserved.
+ * 
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the
+ * "Software"), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, sub license, and/or sell copies of the Software, and to
+ * permit persons to whom the Software is furnished to do so, subject to
+ * the following conditions:
+ * 
+ * The above copyright notice and this permission notice (including the
+ * next paragraph) shall be included in all copies or substantial portions
+ * of the Software.
+ * 
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
+ * IN NO EVENT SHALL GOOGLE AND/OR ITS SUPPLIERS BE LIABLE FOR
+ * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ * 
+ **************************************************************************/
+
+#ifndef I915_QUERY_H
+#define I915_QUERY_H
+
+struct i915_context;
+struct pipe_context;
+
+void i915_init_query_functions( struct i915_context *i915 );
+
+#endif /* I915_QUERY_H */

commit 3a7953910a7c3babebd6479bbefe9a1032bd8299
Author: Stéphane Marchesin <marcheu@chromium.org>
Date:   Fri Jun 24 16:41:09 2011 -0700

    i915g: Don't do shader fixup if no surface is bound.

diff --git a/src/gallium/drivers/i915/i915_state_emit.c b/src/gallium/drivers/i915/i915_state_emit.c
index b7ccba8..55399a9 100644
--- a/src/gallium/drivers/i915/i915_state_emit.c
+++ b/src/gallium/drivers/i915/i915_state_emit.c
@@ -355,8 +355,14 @@ static const struct
    { PIPE_FORMAT_NONE,           0x00000000},
 };
 
-static boolean need_fixup(enum pipe_format f)
+static boolean need_fixup(struct pipe_surface* p)
 {
+   enum pipe_format f;
+   /* if we don't have a surface bound yet, we don't need to fixup the shader */
+   if (!p)
+      return FALSE;
+
+   f = p->format;
    for(int i=0; fixup_formats[i].format != PIPE_FORMAT_NONE; i++)
       if (fixup_formats[i].format == f)
          return TRUE;
@@ -379,14 +385,14 @@ validate_program(struct i915_context *i915, unsigned *batch_space)
    struct pipe_surface *cbuf_surface = i915->framebuffer.cbufs[0];
 
    /* we need more batch space if we want to emulate rgba framebuffers */
-   *batch_space = i915->fs->program_len + (need_fixup(cbuf_surface->format) ? 3 : 0);
+   *batch_space = i915->fs->program_len + (need_fixup(cbuf_surface) ? 3 : 0);
 }
 
 static void
 emit_program(struct i915_context *i915)
 {
    struct pipe_surface *cbuf_surface = i915->framebuffer.cbufs[0];
-   boolean need_format_fixup = need_fixup(cbuf_surface->format);
+   boolean need_format_fixup = need_fixup(cbuf_surface);
    uint i;
 
    /* we should always have, at least, a pass-through program */

commit 1a69b50b3b441ce8f7a00af3a7f02c37df50f6c3
Author: Stéphane Marchesin <marcheu@chromium.org>
Date:   Fri Jun 24 16:18:58 2011 -0700

    i915g: Fix point sprites.

diff --git a/src/gallium/drivers/i915/i915_context.c b/src/gallium/drivers/i915/i915_context.c
index 0217db9..ab4ea9a 100644
--- a/src/gallium/drivers/i915/i915_context.c
+++ b/src/gallium/drivers/i915/i915_context.c
@@ -106,7 +106,7 @@ static void i915_destroy(struct pipe_context *pipe)
 
    if (i915->blitter)
       util_blitter_destroy(i915->blitter);
-   
+
    if(i915->batch)
       i915->iws->batchbuffer_destroy(i915->batch);
 
@@ -150,6 +150,8 @@ i915_create_context(struct pipe_screen *screen, void *priv)
    /* init this before draw */
    util_slab_create(&i915->transfer_pool, sizeof(struct pipe_transfer),
                     16, UTIL_SLAB_SINGLETHREADED);
+   util_slab_create(&i915->texture_transfer_pool, sizeof(struct i915_transfer),
+                    16, UTIL_SLAB_SINGLETHREADED);
 
    /* Batch stream debugging is a bit hacked up at the moment:
     */
diff --git a/src/gallium/drivers/i915/i915_context.h b/src/gallium/drivers/i915/i915_context.h
index 964948e..c964208 100644
--- a/src/gallium/drivers/i915/i915_context.h
+++ b/src/gallium/drivers/i915/i915_context.h
@@ -102,6 +102,8 @@ struct i915_fragment_shader
 
    struct tgsi_shader_info info;
 
+   struct draw_fragment_shader *draw_data;
+
    uint *program;
    uint program_len;
 
@@ -260,6 +262,7 @@ struct i915_context {
    int num_validation_buffers;
 
    struct util_slab_mempool transfer_pool;
+   struct util_slab_mempool texture_transfer_pool;
 
    /** blitter/hw-clear */
    struct blitter_context* blitter;
diff --git a/src/gallium/drivers/i915/i915_resource.c b/src/gallium/drivers/i915/i915_resource.c
index 7f52ba1..b4719af 100644
--- a/src/gallium/drivers/i915/i915_resource.c
+++ b/src/gallium/drivers/i915/i915_resource.c
@@ -7,12 +7,12 @@
 
 static struct pipe_resource *
 i915_resource_create(struct pipe_screen *screen,
-                    const struct pipe_resource *template)
+                     const struct pipe_resource *template)
 {
    if (template->target == PIPE_BUFFER)
       return i915_buffer_create(screen, template);
    else
-      return i915_texture_create(screen, template);
+      return i915_texture_create(screen, template, FALSE);
 
 }
 
diff --git a/src/gallium/drivers/i915/i915_resource.h b/src/gallium/drivers/i915/i915_resource.h
index c15ecdf..14eed2c 100644
--- a/src/gallium/drivers/i915/i915_resource.h
+++ b/src/gallium/drivers/i915/i915_resource.h
@@ -45,6 +45,15 @@ struct i915_buffer {
    boolean free_on_destroy;
 };
 
+
+/* Texture transfer. */
+struct i915_transfer {
+   /* Base class. */
+   struct pipe_transfer b;
+   struct pipe_resource *staging_texture;
+};
+
+
 #define I915_MAX_TEXTURE_2D_LEVELS 12  /* max 2048x2048 */
 #define I915_MAX_TEXTURE_3D_LEVELS  9  /* max 256x256x256 */
 
@@ -101,7 +110,8 @@ static INLINE struct i915_buffer *i915_buffer(struct pipe_resource *resource)
 
 struct pipe_resource *
 i915_texture_create(struct pipe_screen *screen,
-                    const struct pipe_resource *template);
+                    const struct pipe_resource *template,
+                    boolean force_untiled);
 
 struct pipe_resource *
 i915_texture_from_handle(struct pipe_screen * screen,
diff --git a/src/gallium/drivers/i915/i915_resource_texture.c b/src/gallium/drivers/i915/i915_resource_texture.c
index b74b19d..3a00d08 100644
--- a/src/gallium/drivers/i915/i915_resource_texture.c
+++ b/src/gallium/drivers/i915/i915_resource_texture.c
@@ -37,6 +37,7 @@
 #include "util/u_format.h"
 #include "util/u_math.h"
 #include "util/u_memory.h"
+#include "util/u_rect.h"
 
 #include "i915_context.h"
 #include "i915_resource.h"
@@ -710,7 +711,7 @@ i915_texture_destroy(struct pipe_screen *screen,
    FREE(tex);
 }
 
-static struct pipe_transfer * 
+static struct pipe_transfer *
 i915_texture_get_transfer(struct pipe_context *pipe,
                           struct pipe_resource *resource,
                           unsigned level,
@@ -719,19 +720,44 @@ i915_texture_get_transfer(struct pipe_context *pipe,
 {
    struct i915_context *i915 = i915_context(pipe);
    struct i915_texture *tex = i915_texture(resource);
-   struct pipe_transfer *transfer = util_slab_alloc(&i915->transfer_pool);
+   struct i915_transfer *transfer = util_slab_alloc(&i915->texture_transfer_pool);
+   boolean use_staging_texture = FALSE;
 
    if (transfer == NULL)
       return NULL;
 
-   transfer->resource = resource;
-   transfer->level = level;
-   transfer->usage = usage;
-   transfer->box = *box;
-   transfer->stride = tex->stride;
-   /* FIXME: layer_stride */
+   transfer->b.resource = resource;
+   transfer->b.level = level;
+   transfer->b.usage = usage;
+   transfer->b.box = *box;
+   transfer->b.stride = tex->stride;
+   transfer->staging_texture = NULL;
+   /* XXX: handle depth textures everyhwere*/
+   transfer->b.layer_stride = 0;
+   transfer->b.data = NULL;
+
+   /* only support textures we can render to, because we need that for u_blitter */
+   if (i915->blitter &&
+       i915_is_format_supported(NULL, /* screen */
+                                transfer->b.resource->format,
+                                0, /* target */
+                                1, /* sample count */
+                                PIPE_BIND_RENDER_TARGET) &&
+       (usage & PIPE_TRANSFER_WRITE) &&
+       !(usage & (PIPE_TRANSFER_READ | PIPE_TRANSFER_DONTBLOCK | PIPE_TRANSFER_UNSYNCHRONIZED)))
+      use_staging_texture = TRUE;
+
+   use_staging_texture = FALSE;
+
+   if (use_staging_texture) {
+      /* 
+       * Allocate the untiled staging texture.
+       * If the alloc fails, transfer->staging_texture is NULL and we fallback to a map() 
+       */
+      transfer->staging_texture = i915_texture_create(pipe->screen, resource, TRUE);
+   }
 
-   return transfer;
+   return (struct pipe_transfer*)transfer;
 }
 
 static void
@@ -739,17 +765,33 @@ i915_transfer_destroy(struct pipe_context *pipe,
                       struct pipe_transfer *transfer)
 {
    struct i915_context *i915 = i915_context(pipe);
-   util_slab_free(&i915->transfer_pool, transfer);
+   struct i915_transfer *itransfer = (struct i915_transfer*)transfer;
+
+   if ((itransfer->staging_texture) &&
+       (transfer->usage & PIPE_TRANSFER_WRITE)) {
+      struct pipe_box sbox;
+
+      u_box_origin_2d(itransfer->b.box.width, itransfer->b.box.height, &sbox);
+      pipe->resource_copy_region(pipe, itransfer->b.resource, itransfer->b.level,
+                                   itransfer->b.box.x, itransfer->b.box.y, itransfer->b.box.z,
+                                   itransfer->staging_texture,
+                                   0, &sbox);
+      pipe->flush(pipe, NULL);
+      pipe_resource_reference(&itransfer->staging_texture, NULL);
+   }


Reply to: