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