[Mesa-dev] [PATCH 14/17] intel: Rebuild PBO blit glTexImage() on top of miptrees.
Ian Romanick
idr at freedesktop.org
Fri May 24 15:35:45 PDT 2013
On 05/24/2013 01:56 PM, Eric Anholt wrote:
> This will ensure that we have resolves if we ever extend this to
> glTexSubImage(), and fixes missing image start offset handling.
>
> The texture buffer alloc ended up getting moved up, because we want to
> look at the format of the image's actual mt to see if we'll end up
> blitting the right thing, in the case of packed depth/stencil uploads.
>
> This is the last caller of intelEmitCopyBlit() on a miptree-wrapped BO.
It looks like after this the two remaining callers are all in
intel_blit.c. Should intelEmitCopyBlit be static?
Looking at what's left, it looks like there should be some more
refactoring of intelEmitCopyBlit after this commit. A bunch of the
checks, etc. in intelEmitCopyBlit are only relevant for one of the
callers. That can happen later, if there's value.
> ---
> src/mesa/drivers/dri/intel/intel_tex_image.c | 62 ++++++++++++++--------------
> 1 file changed, 32 insertions(+), 30 deletions(-)
>
> diff --git a/src/mesa/drivers/dri/intel/intel_tex_image.c b/src/mesa/drivers/dri/intel/intel_tex_image.c
> index a3928bb..4ad5ccc 100644
> --- a/src/mesa/drivers/dri/intel/intel_tex_image.c
> +++ b/src/mesa/drivers/dri/intel/intel_tex_image.c
> @@ -6,6 +6,7 @@
> #include "main/bufferobj.h"
> #include "main/context.h"
> #include "main/formats.h"
> +#include "main/image.h"
> #include "main/pbo.h"
> #include "main/renderbuffer.h"
> #include "main/texcompress.h"
> @@ -117,9 +118,8 @@ try_pbo_upload(struct gl_context *ctx,
> struct intel_texture_image *intelImage = intel_texture_image(image);
> struct intel_context *intel = intel_context(ctx);
> struct intel_buffer_object *pbo = intel_buffer_object(unpack->BufferObj);
> - GLuint src_offset, src_stride;
> - GLuint dst_x, dst_y;
> - drm_intel_bo *dst_buffer, *src_buffer;
> + GLuint src_offset;
> + drm_intel_bo *src_buffer;
>
> if (!_mesa_is_bufferobj(unpack->BufferObj))
> return false;
> @@ -132,14 +132,6 @@ try_pbo_upload(struct gl_context *ctx,
> return false;
> }
>
> - if (!_mesa_format_matches_format_and_type(image->TexFormat,
> - format, type, false)) {
> - DBG("%s: format mismatch (upload to %s with format 0x%x, type 0x%x)\n",
> - __FUNCTION__, _mesa_get_format_name(image->TexFormat),
> - format, type);
> - return false;
> - }
> -
> ctx->Driver.AllocTextureImageBuffer(ctx, image);
>
> if (!intelImage->mt) {
> @@ -147,39 +139,49 @@ try_pbo_upload(struct gl_context *ctx,
> return false;
> }
>
> + if (!_mesa_format_matches_format_and_type(intelImage->mt->format,
> + format, type, false)) {
> + DBG("%s: format mismatch (upload to %s with format 0x%x, type 0x%x)\n",
> + __FUNCTION__, _mesa_get_format_name(intelImage->mt->format),
> + format, type);
> + return false;
> + }
> +
> if (image->TexObject->Target == GL_TEXTURE_1D_ARRAY ||
> image->TexObject->Target == GL_TEXTURE_2D_ARRAY) {
> DBG("%s: no support for array textures\n", __FUNCTION__);
> return false;
> }
>
> - dst_buffer = intelImage->mt->region->bo;
> src_buffer = intel_bufferobj_source(intel, pbo, 64, &src_offset);
> /* note: potential 64-bit ptr to 32-bit int cast */
> src_offset += (GLuint) (unsigned long) pixels;
>
> - if (unpack->RowLength > 0)
> - src_stride = unpack->RowLength;
> - else
> - src_stride = image->Width;
> - src_stride *= intelImage->mt->region->cpp;
> -
> - intel_miptree_get_image_offset(intelImage->mt, intelImage->base.Base.Level,
> - intelImage->base.Base.Face,
> - &dst_x, &dst_y);
> -
> - if (!intelEmitCopyBlit(intel,
> - intelImage->mt->cpp,
> - src_stride, src_buffer,
> - src_offset, false,
> - intelImage->mt->region->pitch, dst_buffer, 0,
> - intelImage->mt->region->tiling,
> - 0, 0, dst_x, dst_y, image->Width, image->Height,
> - GL_COPY)) {
> + int src_stride =
> + _mesa_image_row_stride(unpack, image->Width, format, type);
> +
> + struct intel_mipmap_tree *pbo_mt =
> + intel_miptree_create_for_bo(intel,
> + src_buffer,
> + intelImage->mt->format,
> + src_offset,
> + image->Width, image->Height,
> + src_stride, I915_TILING_NONE);
> + if (!pbo_mt)
> + return false;
> +
> + if (!intel_miptree_blit(intel,
> + pbo_mt, 0, 0,
> + 0, 0, false,
> + intelImage->mt, image->Level, image->Face,
> + 0, 0, false,
> + image->Width, image->Height, GL_COPY)) {
> DBG("%s: blit failed\n", __FUNCTION__);
> return false;
> }
>
> + intel_miptree_release(&pbo_mt);
> +
> DBG("%s: success\n", __FUNCTION__);
> return true;
> }
>
More information about the mesa-dev
mailing list