[Mesa-dev] [PATCH 14/17] intel: Rebuild PBO blit glTexImage() on top of miptrees.

2013-05-24 Thread Eric Anholt
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.
---
 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;
 }
-- 
1.8.3.rc0

___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev


Re: [Mesa-dev] [PATCH 14/17] intel: Rebuild PBO blit glTexImage() on top of miptrees.

2013-05-24 Thread Ian Romanick

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;
  }




Re: [Mesa-dev] [PATCH 14/17] intel: Rebuild PBO blit glTexImage() on top of miptrees.

2013-05-24 Thread Eric Anholt
Ian Romanick i...@freedesktop.org writes:

 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.

I thought about doing so, but the aperture check is painful enough I
decided not to duplicate it.


pgpIMP1X7ncvj.pgp
Description: PGP signature
___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev