On 26/03/16 17:21, Brian Paul wrote:
The whole st_generate_mipmap() function was overly complicated.  Now
we just call the new _mesa_prepare_mipmap_levels() function to prepare
the texture mipmap memory, then call the generate function which fills
in the texture images.

This fixes a failed assertion in llvmpipe/softpipe which is hit with the
new piglit generatemipmap-base-change test.  Also fixes some device errors
(format mismatches) with the VMware svga driver.
---
  src/mesa/state_tracker/st_gen_mipmap.c | 102 ++++++++-------------------------
  1 file changed, 24 insertions(+), 78 deletions(-)

diff --git a/src/mesa/state_tracker/st_gen_mipmap.c 
b/src/mesa/state_tracker/st_gen_mipmap.c
index c4b3492..d854e20 100644
--- a/src/mesa/state_tracker/st_gen_mipmap.c
+++ b/src/mesa/state_tracker/st_gen_mipmap.c
@@ -82,7 +82,6 @@ st_generate_mipmap(struct gl_context *ctx, GLenum target,
     const uint baseLevel = texObj->BaseLevel;
     enum pipe_format format;
     uint lastLevel, first_layer, last_layer;
-   uint dstLevel;

     if (!pt)
        return;
@@ -103,42 +102,33 @@ st_generate_mipmap(struct gl_context *ctx, GLenum target,
     stObj->lastLevel = lastLevel;

     if (!texObj->Immutable) {
-      if (pt->last_level < lastLevel) {
-         /* The current gallium texture doesn't have space for all the
-         * mipmap levels we need to generate.  So allocate a new texture.
-         */
-         struct pipe_resource *oldTex = stObj->pt;
-
-         /* create new texture with space for more levels */
-         stObj->pt = st_texture_create(st,
-                                       oldTex->target,
-                                       oldTex->format,
-                                       lastLevel,
-                                       oldTex->width0,
-                                       oldTex->height0,
-                                       oldTex->depth0,
-                                       oldTex->array_size,
-                                       0,
-                                       oldTex->bind);
-
-         /* This will copy the old texture's base image into the new texture
-         * which we just allocated.
-         */
-         st_finalize_texture(ctx, st->pipe, texObj);
-
-         /* release the old tex (will likely be freed too) */
-         pipe_resource_reference(&oldTex, NULL);
-         st_texture_release_all_sampler_views(st, stObj);
-      }
-      else {
-         /* Make sure that the base texture image data is present in the
-         * texture buffer.
-         */
-         st_finalize_texture(ctx, st->pipe, texObj);
-      }
+      const GLboolean genSave = texObj->GenerateMipmap;
+
+      /* Temporarily set GenerateMipmap to true so that allocate_full_mipmap()
+       * makes the right decision about full mipmap allocation.
+       */
+      texObj->GenerateMipmap = GL_TRUE;

I wonder if there's any assertion we could add somewhere to ensure it did indeed make the right decision.

Either way, series is:

Reviewed-by: Jose Fonseca <jfons...@vmware.com>
_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to