diff options
Diffstat (limited to 'src/mesa')
-rw-r--r-- | src/mesa/drivers/dri/intel/intel_mipmap_tree.c | 120 |
1 files changed, 71 insertions, 49 deletions
diff --git a/src/mesa/drivers/dri/intel/intel_mipmap_tree.c b/src/mesa/drivers/dri/intel/intel_mipmap_tree.c index f7228d8cfd0..8f2a433e75a 100644 --- a/src/mesa/drivers/dri/intel/intel_mipmap_tree.c +++ b/src/mesa/drivers/dri/intel/intel_mipmap_tree.c @@ -733,38 +733,17 @@ intel_miptree_all_slices_resolve_depth(struct intel_context *intel, intel->vtbl.resolve_depth_slice); } -void -intel_miptree_map(struct intel_context *intel, - struct intel_mipmap_tree *mt, - unsigned int level, - unsigned int slice, - unsigned int x, - unsigned int y, - unsigned int w, - unsigned int h, - GLbitfield mode, - void **out_ptr, - int *out_stride) +static void +intel_miptree_map_gtt(struct intel_context *intel, + struct intel_mipmap_tree *mt, + struct intel_miptree_map *map, + unsigned int level, unsigned int slice) { - struct intel_miptree_map *map; unsigned int bw, bh; void *base; unsigned int image_x, image_y; - - map = calloc(1, sizeof(struct intel_miptree_map)); - if (!map){ - *out_ptr = NULL; - *out_stride = 0; - return; - } - - assert(!mt->level[level].slice[slice].map); - mt->level[level].slice[slice].map = map; - map->mode = mode; - map->x = x; - map->y = y; - map->w = w; - map->h = h; + int x = map->x; + int y = map->y; if (mt->stencil_mt) { /* The miptree has depthstencil format, but uses separate stencil. The @@ -776,11 +755,6 @@ intel_miptree_map(struct intel_context *intel, intel_miptree_s8z24_gather(intel, mt, level, slice); } - intel_miptree_slice_resolve_depth(intel, mt, level, slice); - if (mode & GL_MAP_WRITE_BIT) { - intel_miptree_slice_set_needs_hiz_resolve(mt, level, slice); - } - /* For compressed formats, the stride is the number of bytes per * row of blocks. intel_miptree_get_image_offset() already does * the divide. @@ -789,7 +763,7 @@ intel_miptree_map(struct intel_context *intel, assert(y % bh == 0); y /= bh; - base = intel_region_map(intel, mt->region, mode); + base = intel_region_map(intel, mt->region, map->mode); /* Note that in the case of cube maps, the caller must have passed the slice * number referencing the face. */ @@ -800,15 +774,74 @@ intel_miptree_map(struct intel_context *intel, map->stride = mt->region->pitch * mt->cpp; map->ptr = base + y * map->stride + x * mt->cpp; - *out_ptr = map->ptr; - *out_stride = map->stride; - 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); } +static void +intel_miptree_unmap_gtt(struct intel_context *intel, + struct intel_mipmap_tree *mt, + struct intel_miptree_map *map, + unsigned int level, + unsigned int slice) +{ + intel_region_unmap(intel, mt->region); + + if (mt->stencil_mt) { + /* The miptree has depthstencil format, but uses separate stencil. The + * embedded stencil miptree must contain the real stencil data after + * unmapping, so copy it from the depthstencil miptree into the stencil + * miptree. + * + * FIXME: Avoid the scatter if the texture was mapped as read-only. + */ + intel_miptree_s8z24_scatter(intel, mt, level, slice); + } +} + +void +intel_miptree_map(struct intel_context *intel, + struct intel_mipmap_tree *mt, + unsigned int level, + unsigned int slice, + unsigned int x, + unsigned int y, + unsigned int w, + unsigned int h, + GLbitfield mode, + void **out_ptr, + int *out_stride) +{ + struct intel_miptree_map *map; + + map = calloc(1, sizeof(struct intel_miptree_map)); + if (!map){ + *out_ptr = NULL; + *out_stride = 0; + return; + } + + assert(!mt->level[level].slice[slice].map); + mt->level[level].slice[slice].map = map; + map->mode = mode; + map->x = x; + map->y = y; + map->w = w; + map->h = h; + + intel_miptree_slice_resolve_depth(intel, mt, level, slice); + if (map->mode & GL_MAP_WRITE_BIT) { + intel_miptree_slice_set_needs_hiz_resolve(mt, level, slice); + } + + intel_miptree_map_gtt(intel, mt, map, level, slice); + + *out_ptr = map->ptr; + *out_stride = map->stride; +} + void intel_miptree_unmap(struct intel_context *intel, struct intel_mipmap_tree *mt, @@ -823,18 +856,7 @@ intel_miptree_unmap(struct intel_context *intel, DBG("%s: mt %p (%s) level %d slice %d\n", __FUNCTION__, mt, _mesa_get_format_name(mt->format), level, slice); - intel_region_unmap(intel, mt->region); - - if (mt->stencil_mt) { - /* The miptree has depthstencil format, but uses separate stencil. The - * embedded stencil miptree must contain the real stencil data after - * unmapping, so copy it from the depthstencil miptree into the stencil - * miptree. - * - * FIXME: Avoid the scatter if the texture was mapped as read-only. - */ - intel_miptree_s8z24_scatter(intel, mt, level, slice); - } + intel_miptree_unmap_gtt(intel, mt, map, level, slice); mt->level[level].slice[slice].map = NULL; free(map); |