X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fmesa%2Fdrivers%2Fdri%2Fi965%2Fintel_tex_image.c;h=b1fe8dd584e4c13c6fe7a617d04068f01ad4c3d5;hb=de158c1e435eb9160b8a29624a4a4807e1627811;hp=649b3907d13d87fcf4c0627d3f3ca0118e5ce1c6;hpb=7a4964ec5c1a0dd065436ff7d25aecb45d306979;p=mesa.git diff --git a/src/mesa/drivers/dri/i965/intel_tex_image.c b/src/mesa/drivers/dri/i965/intel_tex_image.c index 649b3907d13..b1fe8dd584e 100644 --- a/src/mesa/drivers/dri/i965/intel_tex_image.c +++ b/src/mesa/drivers/dri/i965/intel_tex_image.c @@ -56,11 +56,24 @@ intel_miptree_create_for_teximage(struct brw_context *brw, { GLuint lastLevel; int width, height, depth; + unsigned old_width = 0, old_height = 0, old_depth = 0; const struct intel_mipmap_tree *old_mt = intelObj->mt; const unsigned level = intelImage->base.Base.Level; intel_get_image_dims(&intelImage->base.Base, &width, &height, &depth); + if (old_mt && old_mt->surf.size > 0) { + old_width = old_mt->surf.logical_level0_px.width; + old_height = old_mt->surf.logical_level0_px.height; + old_depth = old_mt->surf.dim == ISL_SURF_DIM_3D ? + old_mt->surf.logical_level0_px.depth : + old_mt->surf.logical_level0_px.array_len; + } else if (old_mt) { + old_width = old_mt->logical_width0; + old_height = old_mt->logical_height0; + old_depth = old_mt->logical_depth0; + } + DBG("%s\n", __func__); /* Figure out image dimensions at start level. */ @@ -72,19 +85,19 @@ intel_miptree_create_for_teximage(struct brw_context *brw, assert(level == 0); break; case GL_TEXTURE_3D: - depth = old_mt ? get_base_dim(old_mt->logical_depth0, depth, level) : + depth = old_mt ? get_base_dim(old_depth, depth, level) : depth << level; /* Fall through */ case GL_TEXTURE_2D: case GL_TEXTURE_2D_ARRAY: case GL_TEXTURE_CUBE_MAP: case GL_TEXTURE_CUBE_MAP_ARRAY: - height = old_mt ? get_base_dim(old_mt->logical_height0, height, level) : + height = old_mt ? get_base_dim(old_height, height, level) : height << level; /* Fall through */ case GL_TEXTURE_1D: case GL_TEXTURE_1D_ARRAY: - width = old_mt ? get_base_dim(old_mt->logical_width0, width, level) : + width = old_mt ? get_base_dim(old_width, width, level) : width << level; break; default: @@ -473,8 +486,6 @@ intel_gettexsubimage_tiled_memcpy(struct gl_context *ctx, /* The miptree's buffer. */ struct brw_bo *bo; - int error = 0; - uint32_t cpp; mem_copy_fn mem_copy = NULL; @@ -524,10 +535,24 @@ intel_gettexsubimage_tiled_memcpy(struct gl_context *ctx, return false; } + /* tiled_to_linear() assumes that if the object is swizzled, it is using + * I915_BIT6_SWIZZLE_9_10 for X and I915_BIT6_SWIZZLE_9 for Y. This is only + * true on gen5 and above. + * + * The killer on top is that some gen4 have an L-shaped swizzle mode, where + * parts of the memory aren't swizzled at all. Userspace just can't handle + * that. + */ + if (brw->gen < 5 && brw->has_swizzling) + return false; + + int level = texImage->Level + texImage->TexObject->MinLevel; + /* Since we are going to write raw data to the miptree, we need to resolve * any pending fast color clears before we start. */ - intel_miptree_all_slices_resolve_color(brw, image->mt, 0); + assert(image->mt->logical_depth0 == 1); + intel_miptree_access_raw(brw, image->mt, level, 0, true); bo = image->mt->bo; @@ -536,8 +561,8 @@ intel_gettexsubimage_tiled_memcpy(struct gl_context *ctx, intel_batchbuffer_flush(brw); } - error = brw_bo_map(brw, bo, false /* write enable */); - if (error) { + void *map = brw_bo_map(brw, bo, MAP_READ | MAP_RAW); + if (map == NULL) { DBG("%s: failed to map bo\n", __func__); return false; } @@ -552,8 +577,6 @@ intel_gettexsubimage_tiled_memcpy(struct gl_context *ctx, packing->Alignment, packing->RowLength, packing->SkipPixels, packing->SkipRows); - int level = texImage->Level + texImage->TexObject->MinLevel; - /* Adjust x and y offset based on miplevel */ xoffset += image->mt->level[level].level_x; yoffset += image->mt->level[level].level_y; @@ -562,7 +585,7 @@ intel_gettexsubimage_tiled_memcpy(struct gl_context *ctx, xoffset * cpp, (xoffset + width) * cpp, yoffset, yoffset + height, pixels - (ptrdiff_t) yoffset * dst_pitch - (ptrdiff_t) xoffset * cpp, - bo->virtual, + map, dst_pitch, image->mt->pitch, brw->has_swizzling, image->mt->tiling,