st/nine: Fix volumetexture dtor on ctor failure
[mesa.git] / src / gallium / state_trackers / nine / basetexture9.h
index c803280decd59f35fd9215b404f4e26f83bb350a..10a7cea46da5ef2623e841f59df2bd1663bda8cf 100644 (file)
@@ -23,6 +23,7 @@
 #ifndef _NINE_BASETEXTURE9_H_
 #define _NINE_BASETEXTURE9_H_
 
+#include "device9.h"
 #include "resource9.h"
 #include "util/u_inlines.h"
 #include "util/list.h"
 struct NineBaseTexture9
 {
     struct NineResource9 base;
-    struct list_head list;
+    struct list_head list; /* for update_textures */
+    struct list_head list2; /* for managed_textures */
 
     /* g3d */
-    struct pipe_context *pipe;
     struct pipe_sampler_view *view[2]; /* linear and sRGB */
 
     D3DFORMAT format;
@@ -53,7 +54,7 @@ struct NineBaseTexture9
         DWORD lod_resident;
     } managed;
 };
-static INLINE struct NineBaseTexture9 *
+static inline struct NineBaseTexture9 *
 NineBaseTexture9( void *data )
 {
     return (struct NineBaseTexture9 *)data;
@@ -71,29 +72,32 @@ NineBaseTexture9_ctor( struct NineBaseTexture9 *This,
 void
 NineBaseTexture9_dtor( struct NineBaseTexture9 *This );
 
-DWORD WINAPI
+DWORD NINE_WINAPI
 NineBaseTexture9_SetLOD( struct NineBaseTexture9 *This,
                          DWORD LODNew );
 
-DWORD WINAPI
+DWORD NINE_WINAPI
 NineBaseTexture9_GetLOD( struct NineBaseTexture9 *This );
 
-DWORD WINAPI
+DWORD NINE_WINAPI
 NineBaseTexture9_GetLevelCount( struct NineBaseTexture9 *This );
 
-HRESULT WINAPI
+HRESULT NINE_WINAPI
 NineBaseTexture9_SetAutoGenFilterType( struct NineBaseTexture9 *This,
                                        D3DTEXTUREFILTERTYPE FilterType );
 
-D3DTEXTUREFILTERTYPE WINAPI
+D3DTEXTUREFILTERTYPE NINE_WINAPI
 NineBaseTexture9_GetAutoGenFilterType( struct NineBaseTexture9 *This );
 
-void WINAPI
+void NINE_WINAPI
 NineBaseTexture9_GenerateMipSubLevels( struct NineBaseTexture9 *This );
 
-void WINAPI
+void NINE_WINAPI
 NineBaseTexture9_PreLoad( struct NineBaseTexture9 *This );
 
+void
+NineBaseTexture9_UnLoad( struct NineBaseTexture9 *This );
+
 /* For D3DPOOL_MANAGED only (after SetLOD change): */
 HRESULT
 NineBaseTexture9_CreatePipeResource( struct NineBaseTexture9 *This,
@@ -107,7 +111,7 @@ HRESULT
 NineBaseTexture9_UpdateSamplerView( struct NineBaseTexture9 *This,
                                     const int sRGB );
 
-static INLINE void
+static inline void
 NineBaseTexture9_Validate( struct NineBaseTexture9 *This )
 {
     DBG_FLAG(DBG_BASETEXTURE, "This=%p dirty=%i dirty_mip=%i lod=%u/%u\n",
@@ -119,7 +123,7 @@ NineBaseTexture9_Validate( struct NineBaseTexture9 *This )
         NineBaseTexture9_GenerateMipSubLevels(This);
 }
 
-static INLINE struct pipe_sampler_view *
+static inline struct pipe_sampler_view *
 NineBaseTexture9_GetSamplerView( struct NineBaseTexture9 *This, const int sRGB )
 {
     if (!This->view[sRGB])
@@ -127,16 +131,35 @@ NineBaseTexture9_GetSamplerView( struct NineBaseTexture9 *This, const int sRGB )
     return This->view[sRGB];
 }
 
+static void inline
+NineBindTextureToDevice( struct NineDevice9 *device,
+                         struct NineBaseTexture9 **slot,
+                         struct NineBaseTexture9 *tex )
+{
+    struct NineBaseTexture9 *old = *slot;
+
+    if (tex) {
+        if ((tex->managed.dirty | tex->dirty_mip) && LIST_IS_EMPTY(&tex->list))
+            list_add(&tex->list, &device->update_textures);
+
+        tex->bind_count++;
+    }
+    if (old)
+        old->bind_count--;
+
+    nine_bind(slot, tex);
+}
+
 #ifdef DEBUG
 void
 NineBaseTexture9_Dump( struct NineBaseTexture9 *This );
 #else
-static INLINE void
+static inline void
 NineBaseTexture9_Dump( struct NineBaseTexture9 *This ) { }
 #endif
 
 #define BASETEX_REGISTER_UPDATE(t) do { \
-    if (((t)->managed.dirty | ((t)->dirty_mip)) && (t)->base.base.bind) \
+    if (((t)->managed.dirty | ((t)->dirty_mip)) && (t)->bind_count) \
         if (LIST_IS_EMPTY(&(t)->list)) \
             list_add(&(t)->list, &(t)->base.base.device->update_textures); \
     } while(0)