[Mesa-dev] [PATCH 10/11] st/nine: Enforce LOD 0 for D3DUSAGE_AUTOGENMIPMAP

Axel Davy axel.davy at ens.fr
Fri Apr 24 13:11:25 PDT 2015


For D3DUSAGE_AUTOGENMIPMAP textures, applications can only
lock/copy from/get surface descriptor for/etc the first level.
Thus it makes sense to restrict the LOD to 0, and use only the first
level to generate the sublevels.

Signed-off-by: Axel Davy <axel.davy at ens.fr>
---
 src/gallium/state_trackers/nine/basetexture9.c | 8 +++++---
 src/gallium/state_trackers/nine/texture9.c     | 5 +++++
 2 files changed, 10 insertions(+), 3 deletions(-)

diff --git a/src/gallium/state_trackers/nine/basetexture9.c b/src/gallium/state_trackers/nine/basetexture9.c
index 7315e78..b868019 100644
--- a/src/gallium/state_trackers/nine/basetexture9.c
+++ b/src/gallium/state_trackers/nine/basetexture9.c
@@ -104,12 +104,15 @@ NineBaseTexture9_SetLOD( struct NineBaseTexture9 *This,
                          DWORD LODNew )
 {
     DWORD old = This->managed.lod;
+    DWORD max_level;
 
     DBG("This=%p LODNew=%d\n", This, LODNew);
 
     user_assert(This->base.pool == D3DPOOL_MANAGED, 0);
 
-    This->managed.lod = MIN2(LODNew, This->base.info.last_level);
+    max_level = (This->base.usage & D3DUSAGE_AUTOGENMIPMAP) ?
+                0 : This->base.info.last_level;
+    This->managed.lod = MIN2(LODNew, max_level);
 
     if (This->managed.lod != old && This->bind_count && LIST_IS_EMPTY(&This->list))
        list_add(&This->list, &This->base.base.device->update_textures);
@@ -172,7 +175,7 @@ NineBaseTexture9_UploadSelf( struct NineBaseTexture9 *This )
     assert(This->base.pool == D3DPOOL_MANAGED);
 
     if (This->base.usage & D3DUSAGE_AUTOGENMIPMAP)
-        last_level = 0; /* TODO: What if level 0 is not resident ? */
+        last_level = 0;
 
     update_lod = This->managed.lod_resident != This->managed.lod;
     if (!update_lod && !This->managed.dirty)
@@ -366,7 +369,6 @@ NineBaseTexture9_UploadSelf( struct NineBaseTexture9 *This )
 
     if (This->base.usage & D3DUSAGE_AUTOGENMIPMAP)
         This->dirty_mip = TRUE;
-    /* TODO: if dirty only because of lod change, only generate added levels */
 
     DBG("DONE, generate mip maps = %i\n", This->dirty_mip);
     return D3D_OK;
diff --git a/src/gallium/state_trackers/nine/texture9.c b/src/gallium/state_trackers/nine/texture9.c
index e0aec3c..4ce8248 100644
--- a/src/gallium/state_trackers/nine/texture9.c
+++ b/src/gallium/state_trackers/nine/texture9.c
@@ -139,6 +139,11 @@ NineTexture9_ctor( struct NineTexture9 *This,
     if (pSharedHandle && *pSharedHandle) { /* Pool == D3DPOOL_SYSTEMMEM */
         user_buffer = (void *)*pSharedHandle;
     } else if (Pool != D3DPOOL_DEFAULT) {
+        /* TODO: For D3DUSAGE_AUTOGENMIPMAP, it is likely we only have to
+         * allocate only for the first level, since it is the only lockable
+         * level. Check apps don't crash if we allocate smaller buffer (some
+         * apps access sublevels of texture even if they locked only first
+         * level) */
         user_buffer = MALLOC(nine_format_get_alloc_size(pf, Width, Height,
                                                         info->last_level));
         This->managed_buffer = user_buffer;
-- 
2.1.0



More information about the mesa-dev mailing list