i965/tex: Unify the TexImage and TexSubImage code
authorJason Ekstrand <jason.ekstrand@intel.com>
Wed, 31 May 2017 20:48:10 +0000 (13:48 -0700)
committerKenneth Graunke <kenneth@whitecape.org>
Fri, 15 Sep 2017 17:59:05 +0000 (10:59 -0700)
It's nearly the same so there's no good reason why it can't be in a
common function.  The one difference is that _mesa_store_teximage
calls AllocTextureImageBuffer for us, while _mesa_store_texsubimage
doesn't, but we don't need that anyway - intelTexImage already does it.

Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
Reviewed-by: Iago Toral Quiroga <itoral@igalia.com>
src/mesa/drivers/dri/i965/intel_tex_image.c

index 29a4984..ceb0b3f 100644 (file)
@@ -284,17 +284,51 @@ intel_texsubimage_tiled_memcpy(struct gl_context * ctx,
 
 
 static void
+intel_upload_tex(struct gl_context * ctx,
+                 GLuint dims,
+                 struct gl_texture_image *texImage,
+                 GLint xoffset, GLint yoffset, GLint zoffset,
+                 GLsizei width, GLsizei height, GLsizei depth,
+                 GLenum format, GLenum type,
+                 const GLvoid * pixels,
+                 const struct gl_pixelstore_attrib *packing)
+{
+   struct intel_mipmap_tree *mt = intel_texture_image(texImage)->mt;
+   bool ok;
+
+   bool tex_busy = mt && brw_bo_busy(mt->bo);
+
+   if (mt && mt->format == MESA_FORMAT_S_UINT8)
+      mt->r8stencil_needs_update = true;
+
+   ok = _mesa_meta_pbo_TexSubImage(ctx, dims, texImage,
+                                   xoffset, yoffset, zoffset,
+                                   width, height, depth, format, type,
+                                   pixels, tex_busy, packing);
+   if (ok)
+      return;
+
+   ok = intel_texsubimage_tiled_memcpy(ctx, dims, texImage,
+                                       xoffset, yoffset, zoffset,
+                                       width, height, depth,
+                                       format, type, pixels, packing);
+   if (ok)
+     return;
+
+   _mesa_store_texsubimage(ctx, dims, texImage,
+                           xoffset, yoffset, zoffset,
+                           width, height, depth,
+                           format, type, pixels, packing);
+}
+
+
+static void
 intelTexImage(struct gl_context * ctx,
               GLuint dims,
               struct gl_texture_image *texImage,
               GLenum format, GLenum type, const void *pixels,
               const struct gl_pixelstore_attrib *unpack)
 {
-   struct intel_texture_image *intelImage = intel_texture_image(texImage);
-   bool ok;
-
-   bool tex_busy = intelImage->mt && brw_bo_busy(intelImage->mt->bo);
-
    DBG("%s mesa_format %s target %s format %s type %s level %d %dx%dx%d\n",
        __func__, _mesa_get_format_name(texImage->TexFormat),
        _mesa_enum_to_string(texImage->TexObject->Target),
@@ -307,34 +341,11 @@ intelTexImage(struct gl_context * ctx,
       return;
    }
 
-   assert(intelImage->mt);
-
-   if (intelImage->mt->format == MESA_FORMAT_S_UINT8)
-      intelImage->mt->r8stencil_needs_update = true;
-
-   ok = _mesa_meta_pbo_TexSubImage(ctx, dims, texImage, 0, 0, 0,
-                                   texImage->Width, texImage->Height,
-                                   texImage->Depth,
-                                   format, type, pixels,
-                                   tex_busy, unpack);
-   if (ok)
-      return;
+   assert(intel_texture_image(texImage)->mt);
 
-   ok = intel_texsubimage_tiled_memcpy(ctx, dims, texImage,
-                                       0, 0, 0, /*x,y,z offsets*/
-                                       texImage->Width,
-                                       texImage->Height,
-                                       texImage->Depth,
-                                       format, type, pixels, unpack);
-   if (ok)
-      return;
-
-   DBG("%s: upload image %dx%dx%d pixels %p\n",
-       __func__, texImage->Width, texImage->Height, texImage->Depth,
-       pixels);
-
-   _mesa_store_teximage(ctx, dims, texImage,
-                        format, type, pixels, unpack);
+   intel_upload_tex(ctx, dims, texImage, 0, 0, 0,
+                    texImage->Width, texImage->Height, texImage->Depth,
+                    format, type, pixels, unpack);
 }
 
 
@@ -348,38 +359,14 @@ intelTexSubImage(struct gl_context * ctx,
                  const GLvoid * pixels,
                  const struct gl_pixelstore_attrib *packing)
 {
-   struct intel_mipmap_tree *mt = intel_texture_image(texImage)->mt;
-   bool ok;
-
-   bool tex_busy = mt && brw_bo_busy(mt->bo);
-
-   if (mt && mt->format == MESA_FORMAT_S_UINT8)
-      mt->r8stencil_needs_update = true;
-
    DBG("%s mesa_format %s target %s format %s type %s level %d %dx%dx%d\n",
        __func__, _mesa_get_format_name(texImage->TexFormat),
        _mesa_enum_to_string(texImage->TexObject->Target),
        _mesa_enum_to_string(format), _mesa_enum_to_string(type),
        texImage->Level, texImage->Width, texImage->Height, texImage->Depth);
 
-   ok = _mesa_meta_pbo_TexSubImage(ctx, dims, texImage,
-                                   xoffset, yoffset, zoffset,
-                                   width, height, depth, format, type,
-                                   pixels, tex_busy, packing);
-   if (ok)
-      return;
-
-   ok = intel_texsubimage_tiled_memcpy(ctx, dims, texImage,
-                                       xoffset, yoffset, zoffset,
-                                       width, height, depth,
-                                       format, type, pixels, packing);
-   if (ok)
-     return;
-
-   _mesa_store_texsubimage(ctx, dims, texImage,
-                           xoffset, yoffset, zoffset,
-                           width, height, depth,
-                           format, type, pixels, packing);
+   intel_upload_tex(ctx, dims, texImage, xoffset, yoffset, zoffset,
+                    width, height, depth, format, type, pixels, packing);
 }