static void intel_copy_image_sub_data(struct gl_context *ctx, struct gl_texture_image *src_image, struct gl_renderbuffer *src_renderbuffer, int src_x, int src_y, int src_z, struct gl_texture_image *dst_image, struct gl_renderbuffer *dst_renderbuffer, int dst_x, int dst_y, int dst_z, int src_width, int src_height) { struct brw_context *brw = brw_context(ctx); struct intel_mipmap_tree *src_mt, *dst_mt; unsigned src_level, dst_level; if (brw->gen < 6 && _mesa_meta_CopyImageSubData_uncompressed(ctx, src_image, src_renderbuffer, src_x, src_y, src_z, dst_image, dst_renderbuffer, dst_x, dst_y, dst_z, src_width, src_height)) { return; } if (src_image) { src_mt = intel_texture_image(src_image)->mt; src_level = src_image->Level + src_image->TexObject->MinLevel; /* Cube maps actually have different images per face */ if (src_image->TexObject->Target == GL_TEXTURE_CUBE_MAP) src_z = src_image->Face; src_z += src_image->TexObject->MinLayer; } else { assert(src_renderbuffer); src_mt = intel_renderbuffer(src_renderbuffer)->mt; src_image = src_renderbuffer->TexImage; src_level = 0; } if (dst_image) { dst_mt = intel_texture_image(dst_image)->mt; dst_level = dst_image->Level + dst_image->TexObject->MinLevel; /* Cube maps actually have different images per face */ if (dst_image->TexObject->Target == GL_TEXTURE_CUBE_MAP) dst_z = dst_image->Face; dst_z += dst_image->TexObject->MinLayer; } else { assert(dst_renderbuffer); dst_mt = intel_renderbuffer(dst_renderbuffer)->mt; dst_image = dst_renderbuffer->TexImage; dst_level = 0; } copy_miptrees(brw, src_mt, src_x, src_y, src_z, src_level, dst_mt, dst_x, dst_y, dst_z, dst_level, src_width, src_height); /* CopyImage only works for equal formats, texture view equivalence * classes, and a couple special cases for compressed textures. * * Notably, GL_DEPTH_STENCIL does not appear in any equivalence * classes, so we know the formats must be the same, and thus both * will either have stencil, or not. They can't be mismatched. */ assert((src_mt->stencil_mt != NULL) == (dst_mt->stencil_mt != NULL)); if (dst_mt->stencil_mt) { copy_miptrees(brw, src_mt->stencil_mt, src_x, src_y, src_z, src_level, dst_mt->stencil_mt, dst_x, dst_y, dst_z, dst_level, src_width, src_height); } }
static void intel_copy_image_sub_data(struct gl_context *ctx, struct gl_texture_image *src_image, int src_x, int src_y, int src_z, struct gl_texture_image *dst_image, int dst_x, int dst_y, int dst_z, int src_width, int src_height) { struct brw_context *brw = brw_context(ctx); struct intel_texture_image *intel_src_image = intel_texture_image(src_image); struct intel_texture_image *intel_dst_image = intel_texture_image(dst_image); if (_mesa_meta_CopyImageSubData_uncompressed(ctx, src_image, src_x, src_y, src_z, dst_image, dst_x, dst_y, dst_z, src_width, src_height)) { return; } if (intel_src_image->mt->num_samples > 0 || intel_dst_image->mt->num_samples > 0) { _mesa_problem(ctx, "Failed to copy multisampled texture with meta path\n"); return; } /* Cube maps actually have different images per face */ if (src_image->TexObject->Target == GL_TEXTURE_CUBE_MAP) src_z = src_image->Face; if (dst_image->TexObject->Target == GL_TEXTURE_CUBE_MAP) dst_z = dst_image->Face; /* We are now going to try and copy the texture using the blitter. If * that fails, we will fall back mapping the texture and using memcpy. * In either case, we need to do a full resolve. */ intel_miptree_all_slices_resolve_hiz(brw, intel_src_image->mt); intel_miptree_all_slices_resolve_depth(brw, intel_src_image->mt); intel_miptree_resolve_color(brw, intel_src_image->mt); intel_miptree_all_slices_resolve_hiz(brw, intel_dst_image->mt); intel_miptree_all_slices_resolve_depth(brw, intel_dst_image->mt); intel_miptree_resolve_color(brw, intel_dst_image->mt); unsigned src_level = src_image->Level + src_image->TexObject->MinLevel; unsigned dst_level = dst_image->Level + dst_image->TexObject->MinLevel; if (copy_image_with_blitter(brw, intel_src_image->mt, src_level, src_x, src_y, src_z, intel_dst_image->mt, dst_level, dst_x, dst_y, dst_z, src_width, src_height)) return; /* This is a worst-case scenario software fallback that maps the two * textures and does a memcpy between them. */ copy_image_with_memcpy(brw, intel_src_image->mt, src_level, src_x, src_y, src_z, intel_dst_image->mt, dst_level, dst_x, dst_y, dst_z, src_width, src_height); }