-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 On 12/05/2011 11:42 AM, Eric Anholt wrote: > This mimics the MapRenderbuffer code, and should improve the > performance of glGetTexImage(). > --- > src/mesa/drivers/dri/intel/intel_mipmap_tree.c | 83 > ++++++++++++++++++++++++ > src/mesa/drivers/dri/intel/intel_mipmap_tree.h | 2 + > 2 files changed, 85 insertions(+), 0 deletions(-) > > diff --git a/src/mesa/drivers/dri/intel/intel_mipmap_tree.c > b/src/mesa/drivers/dri/intel/intel_mipmap_tree.c > index c1805fc..126ae06 100644 > --- a/src/mesa/drivers/dri/intel/intel_mipmap_tree.c > +++ b/src/mesa/drivers/dri/intel/intel_mipmap_tree.c > @@ -687,6 +687,82 @@ intel_miptree_unmap_gtt(struct intel_context *intel, > } > > static void > +intel_miptree_map_blit(struct intel_context *intel, > + struct intel_mipmap_tree *mt, > + struct intel_miptree_map *map, > + unsigned int level, unsigned int slice) > +{ > + unsigned int image_x, image_y; > + int x = map->x; > + int y = map->y; > + int ret; > + > + /* The blitter requires the pitch to be aligned to 4. */ > + map->stride = ALIGN(map->w * mt->region->cpp, 4); > + > + map->bo = drm_intel_bo_alloc(intel->bufmgr, "intel_miptree_map_blit() > temp", > + map->stride * map->h, 4096); > + if (!map->bo) { > + fprintf(stderr, "Failed to allocate blit temporary\n"); > + goto fail; > + } > + > + intel_miptree_get_image_offset(mt, level, 0, slice, &image_x, &image_y); > + x += image_x; > + y += image_y; > + > + if (!intelEmitCopyBlit(intel, > + mt->region->cpp, > + mt->region->pitch, mt->region->bo, > + 0, mt->region->tiling, > + map->stride / mt->region->cpp, map->bo, > + 0, I915_TILING_NONE, > + x, y, > + 0, 0, > + map->w, map->h, > + GL_COPY)) { > + fprintf(stderr, "Failed to blit\n"); > + goto fail_unmap; > + } > + > + intel_batchbuffer_flush(intel); > + ret = drm_intel_bo_map(map->bo, (map->mode & GL_MAP_WRITE_BIT) != 0); > + if (ret) { > + fprintf(stderr, "Failed to map blit temporary\n"); > + goto fail; > + } > + > + map->ptr = map->bo->virtual; > + > + DBG("%s: %d,%d %dx%d from mt %p (%s) %d,%d = %p/%d\n", __FUNCTION__, > + map->x, map->y, map->w, map->h, > + mt, _mesa_get_format_name(mt->format), > + x, y, map->ptr, map->stride); > + > + return; > + > +fail_unmap: > + drm_intel_bo_unmap(map->bo);
This is an unbalanced unmap. When fail_unmap is jumped to, the bo has not been mapped yet. I don't see any need at all for the fail_unmap label. If the blit fails, the code should just jump to 'fail'. > +fail: > + drm_intel_bo_unreference(map->bo); > + map->ptr = NULL; > + map->stride = 0; > +} > + - ---- Chad Versace chad.vers...@linux.intel.com -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.11 (GNU/Linux) Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org/ iQIcBAEBAgAGBQJO3mXFAAoJEAIvNt057x8ixDcQAKi6+9d/SUDPLvkN0+QPH7ye BkRPko1dHlgKn+ovYmLngA85ndlZ7zlQRB8pA0LTEvbubE5yEQZYhs1/pltpuOV+ 1SLDzdRxGVTXJLk07v9wlYf23/ihzolcqg0pqsE4GiFNcmG/qdpBN6M8czbnPja3 DxL+xPsHw9xI8AErO2hSFIA82AlDfq6OVY1jbgMs68TOCzQ5bUpMcd/XYlFGT7D4 rz8fXlZMJTuCrxLuyScs/PcLpE+vOU3jwleHWe6DH9jMBZP/CeNHwkv2+cnIh66F YbbkVHIMpbrlPYNSVBXiPosEozE5UiRIu6yRstv5rvgdRWkhyZ10y87d97su7Xj4 A5XKic8CHpJp3hzG0L3IimIm8j+OBgL4R5tHNYBytNXDJTHWW5ZSXUbtQ7a9m998 +R/hkcsqGCJPO4K2GHHi9pdo8USpxO4vHbsYeCtS5Hst0g6KW4HLz6EXu1UG9Z4r rar5m1wM6DVxRV+zON/BXxOKwtzMsx6C/j6XRGpMYXbxTTwjCDXzE8e5n+xE7X6C xCkCe/CDbUJbmYTeY3W8jV1bKIXkbz+ibeBtjVtWbxFW4kM/CLuATY9bUZTfrSdw fPrSOseZI0WeRsrmULIANEe4/jkdYc75H8SXSXDk/l7OKCZ/1aLHUN8AB0Itq4BX lI/3sYD9CndA/jw/JArO =s/us -----END PGP SIGNATURE----- _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev