xref: /aosp_15_r20/external/mesa3d/src/gallium/frontends/nine/basetexture9.h (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1 /*
2  * Copyright 2011 Joakim Sindholt <[email protected]>
3  * SPDX-License-Identifier: MIT
4  */
5 
6 #ifndef _NINE_BASETEXTURE9_H_
7 #define _NINE_BASETEXTURE9_H_
8 
9 #include "device9.h"
10 #include "resource9.h"
11 #include "util/u_inlines.h"
12 #include "util/list.h"
13 
14 struct NineBaseTexture9
15 {
16     struct NineResource9 base;
17     struct list_head list; /* for update_textures */
18     struct list_head list2; /* for managed_textures */
19 
20     /* g3d */
21     struct pipe_sampler_view *view[2]; /* linear and sRGB */
22 
23     D3DFORMAT format;
24 
25     int16_t bind_count; /* to Device9->state.texture */
26 
27     bool shadow;
28     bool fetch4_compatible;
29     uint8_t pstype; /* 0: 2D, 1: 1D, 2: CUBE, 3: 3D */
30 
31     bool dirty_mip;
32     D3DTEXTUREFILTERTYPE mipfilter;
33 
34     unsigned level_count;
35 
36     /* Specific to managed textures */
37     struct {
38         bool dirty;
39         DWORD lod;
40         DWORD lod_resident;
41     } managed;
42 };
43 static inline struct NineBaseTexture9 *
NineBaseTexture9(void * data)44 NineBaseTexture9( void *data )
45 {
46     return (struct NineBaseTexture9 *)data;
47 }
48 
49 HRESULT
50 NineBaseTexture9_ctor( struct NineBaseTexture9 *This,
51                        struct NineUnknownParams *pParams,
52                        struct pipe_resource *initResource,
53                        D3DRESOURCETYPE Type,
54                        D3DFORMAT format,
55                        D3DPOOL Pool,
56                        DWORD Usage);
57 
58 void
59 NineBaseTexture9_dtor( struct NineBaseTexture9 *This );
60 
61 DWORD NINE_WINAPI
62 NineBaseTexture9_SetLOD( struct NineBaseTexture9 *This,
63                          DWORD LODNew );
64 
65 DWORD NINE_WINAPI
66 NineBaseTexture9_GetLOD( struct NineBaseTexture9 *This );
67 
68 DWORD NINE_WINAPI
69 NineBaseTexture9_GetLevelCount( struct NineBaseTexture9 *This );
70 
71 HRESULT NINE_WINAPI
72 NineBaseTexture9_SetAutoGenFilterType( struct NineBaseTexture9 *This,
73                                        D3DTEXTUREFILTERTYPE FilterType );
74 
75 D3DTEXTUREFILTERTYPE NINE_WINAPI
76 NineBaseTexture9_GetAutoGenFilterType( struct NineBaseTexture9 *This );
77 
78 void NINE_WINAPI
79 NineBaseTexture9_GenerateMipSubLevels( struct NineBaseTexture9 *This );
80 
81 void NINE_WINAPI
82 NineBaseTexture9_PreLoad( struct NineBaseTexture9 *This );
83 
84 void
85 NineBaseTexture9_UnLoad( struct NineBaseTexture9 *This );
86 
87 /* For D3DPOOL_MANAGED only (after SetLOD change): */
88 HRESULT
89 NineBaseTexture9_CreatePipeResource( struct NineBaseTexture9 *This,
90                                      BOOL CopyData );
91 
92 /* For D3DPOOL_MANAGED only: */
93 HRESULT
94 NineBaseTexture9_UploadSelf( struct NineBaseTexture9 *This );
95 
96 HRESULT
97 NineBaseTexture9_UpdateSamplerView( struct NineBaseTexture9 *This,
98                                     const int sRGB );
99 
100 static inline void
NineBaseTexture9_Validate(struct NineBaseTexture9 * This)101 NineBaseTexture9_Validate( struct NineBaseTexture9 *This )
102 {
103     DBG_FLAG(DBG_BASETEXTURE, "This=%p dirty=%i dirty_mip=%i lod=%u/%u\n",
104              This, This->managed.dirty, This->dirty_mip, This->managed.lod, This->managed.lod_resident);
105     if ((This->base.pool == D3DPOOL_MANAGED) &&
106         (This->managed.dirty || This->managed.lod != This->managed.lod_resident))
107         NineBaseTexture9_UploadSelf(This);
108     if (This->dirty_mip)
109         NineBaseTexture9_GenerateMipSubLevels(This);
110 }
111 
112 static inline struct pipe_sampler_view *
NineBaseTexture9_GetSamplerView(struct NineBaseTexture9 * This,const int sRGB)113 NineBaseTexture9_GetSamplerView( struct NineBaseTexture9 *This, const int sRGB )
114 {
115     if (!This->view[sRGB])
116         NineBaseTexture9_UpdateSamplerView(This, sRGB);
117     return This->view[sRGB];
118 }
119 
120 static void inline
NineBindTextureToDevice(struct NineDevice9 * device,struct NineBaseTexture9 ** slot,struct NineBaseTexture9 * tex)121 NineBindTextureToDevice( struct NineDevice9 *device,
122                          struct NineBaseTexture9 **slot,
123                          struct NineBaseTexture9 *tex )
124 {
125     struct NineBaseTexture9 *old = *slot;
126 
127     if (tex) {
128         if ((tex->managed.dirty | tex->dirty_mip) && list_is_empty(&tex->list))
129             list_add(&tex->list, &device->update_textures);
130 
131         tex->bind_count++;
132     }
133     if (old) {
134         old->bind_count--;
135         if (!old->bind_count)
136             list_delinit(&old->list);
137     }
138 
139     nine_bind(slot, tex);
140 }
141 
142 #if MESA_DEBUG || !defined(NDEBUG)
143 void
144 NineBaseTexture9_Dump( struct NineBaseTexture9 *This );
145 #else
146 static inline void
NineBaseTexture9_Dump(struct NineBaseTexture9 * This)147 NineBaseTexture9_Dump( struct NineBaseTexture9 *This ) { }
148 #endif
149 
150 #define BASETEX_REGISTER_UPDATE(t) do { \
151     if (((t)->managed.dirty | ((t)->dirty_mip)) && (t)->bind_count) \
152         if (list_is_empty(&(t)->list)) \
153             list_add(&(t)->list, &(t)->base.base.device->update_textures); \
154     } while(0)
155 
156 #endif /* _NINE_BASETEXTURE9_H_ */
157