OpenBarnyard
 
Loading...
Searching...
No Matches
TTextureResourceHAL_DX8.cpp
Go to the documentation of this file.
1#include "ToshiPCH.h"
3
4#include "T2Texture_DX8.h"
6
7#include <d3dtypes.h>
8
9//-----------------------------------------------------------------------------
10// Enables memory debugging.
11// Note: Should be the last include!
12//-----------------------------------------------------------------------------
13#include "Core/TMemoryDebugOn.h"
14
16
19
20TTextureResourceHAL::TTextureResourceHAL()
21{
22 m_iNumLocks = 0;
23 m_bLoadFromMemory = TFALSE;
24 m_bIsToshi2 = TFALSE;
25 m_pData = TNULL;
26 m_uiDataSize = 0;
27 m_pD3DTexture = TNULL;
28 m_eAddressUState = ADDRESSINGMODE_WRAP;
29 m_eAddressVState = ADDRESSINGMODE_WRAP;
30}
31
32// $Barnyard: FUNCTION 006c0d50
34{
35 Validate();
36 return m_ImageInfo.Width;
37}
38
39// $Barnyard: FUNCTION 006c0d60
41{
42 Validate();
43 return m_ImageInfo.Height;
44}
45
46// $Barnyard: FUNCTION 006c0d70
48{
49 if ( m_pD3DTexture )
50 {
51 D3DLOCKED_RECT rect;
52
53 HRESULT hRes = m_pD3DTexture->LockRect( 0, &rect, NULL, 0 );
54 TASSERT( SUCCEEDED( hRes ) );
55
56 if ( FAILED( hRes ) )
57 {
58 TRenderD3DInterface::PrintError( hRes, "Unable to lock texture!" );
59 }
60
61 if ( SUCCEEDED( hRes ) )
62 {
63 a_rLockState.Pitch = rect.Pitch;
64 a_rLockState.pBits = rect.pBits;
65 m_iNumLocks += 1;
66
67 return TTRUE;
68 }
69 }
70
71 return TFALSE;
72}
73
74// $Barnyard: FUNCTION 006c0dd0
76{
77 TASSERT( m_iNumLocks != 0 );
78
79 if ( m_iNumLocks != 0 && m_pD3DTexture )
80 {
81 m_pD3DTexture->UnlockRect( 0 );
82 m_iNumLocks -= 1;
83 }
84}
85
86// $Barnyard: FUNCTION 006c0cc0
88{
89 m_bIsToshi2 = TTRUE;
90 m_uiWidth = a_pTexture->GetWidth();
91 m_uiHeight = a_pTexture->GetHeight();
92 m_uiMipLevels = a_pTexture->GetMipLevels();
93 m_uiMipFlags = 0;
94 m_eResourceFormat = TTEXTURERESOURCEFORMAT::Unknown;
95 m_eAddressUState = ADDRESSINGMODE_WRAP;
96 m_eAddressVState = ADDRESSINGMODE_WRAP;
97 m_ImageInfo = a_pTexture->GetImageInfo();
98 m_pD3DTexture = a_pTexture->GetD3DTexture();
99
102}
103
104// $Barnyard: FUNCTION 006c0bb0
105TBOOL TTextureResourceHAL::Create( void* a_pData, TUINT a_uiDataSize, TUINT a_eTextureFlags, TUINT a_uiWidth, TUINT a_uiHeight )
106{
107 TWARN( "Deprecated! Please use: TTextureResourceHAL::CreateEx()\n" );
108
109 if ( !CreateResource( a_pData, a_uiDataSize, a_eTextureFlags, a_uiWidth, a_uiHeight ) )
110 {
111 return TFALSE;
112 }
113
114 m_eTextureFlags = a_eTextureFlags;
115 m_uiWidth = a_uiWidth;
116 m_uiHeight = a_uiHeight;
117 m_uiMipLevels = 0;
118 m_eResourceFormat = TTEXTURERESOURCEFORMAT::Unknown;
119 m_uiMipFlags = 1;
120 m_bLoadFromMemory = TTRUE;
121 m_pData = a_pData;
122 m_uiDataSize = a_uiDataSize;
123 m_eAddressUState = ADDRESSINGMODE_WRAP;
124 m_eAddressVState = ADDRESSINGMODE_WRAP;
125
126 Validate();
127 return TTRUE;
128}
129
130// $Barnyard: FUNCTION 006c0b70
131TBOOL TTextureResourceHAL::Create( const TCHAR* a_szFileName, TUINT a_eTextureFlags )
132{
133 if ( !CreateResource( a_szFileName, a_eTextureFlags ) )
134 {
135 return TFALSE;
136 }
137
138 m_eTextureFlags = a_eTextureFlags;
139 m_eAddressUState = ADDRESSINGMODE_WRAP;
140 m_eAddressVState = ADDRESSINGMODE_WRAP;
141 m_uiMipFlags = 1;
142
143 return TTRUE;
144}
145
146// $Barnyard: FUNCTION 006c0c30
147TBOOL TTextureResourceHAL::CreateEx( void* a_pData, TUINT a_uiDataSize, TUINT a_uiWidth, TUINT a_uiHeight, TUINT a_uiMipLevels, TTEXTURERESOURCEFORMAT a_eFormat, TUINT a_uiMipMapFlags )
148{
149 if ( !CreateResource( a_pData, a_uiDataSize, a_uiWidth, a_uiHeight, a_uiMipLevels, a_eFormat, a_uiMipMapFlags ) )
150 {
151 return TFALSE;
152 }
153
154 m_uiWidth = a_uiWidth;
155 m_pData = a_pData;
156 m_uiHeight = a_uiHeight;
157 m_uiDataSize = a_uiDataSize;
158 m_eTextureFlags = 0x40;
159 m_uiMipLevels = a_uiMipLevels;
160 m_eResourceFormat = a_eFormat;
161 m_uiMipFlags = a_uiMipMapFlags;
162 m_bLoadFromMemory = TTRUE;
163 m_eAddressUState = ADDRESSINGMODE_WRAP;
164 m_eAddressVState = ADDRESSINGMODE_WRAP;
165
166 Validate();
167 return TTRUE;
168}
169
170// $Barnyard: FUNCTION 006c1280
172{
173 TUINT uiMipLevels = ( m_uiMipFlags & 1 ) ? m_uiMipLevels : 0;
174
175 switch ( m_eResourceFormat )
176 {
177 case TTEXTURERESOURCEFORMAT::R8G8B8A8:
178 return CreateFromMemory8888( m_uiWidth, m_uiHeight, uiMipLevels, m_pData );
179 case TTEXTURERESOURCEFORMAT::R8G8B8:
180 return CreateFromMemory888( m_uiWidth, m_uiHeight, uiMipLevels, m_pData );
181 case TTEXTURERESOURCEFORMAT::R5G5B5A1:
182 return CreateFromMemory5551( m_uiWidth, m_uiHeight, uiMipLevels, m_pData );
183 case TTEXTURERESOURCEFORMAT::DDS:
184 return CreateFromMemoryDDS( m_uiWidth, m_uiHeight, uiMipLevels, m_pData );
185 case TTEXTURERESOURCEFORMAT::R4G4B4A4:
186 return CreateFromMemory4444( m_uiWidth, m_uiHeight, uiMipLevels, m_pData );
187 default:
188 TASSERT( TFALSE, "Unknown format!" );
189 return TFALSE;
190 }
191}
192
193// $Barnyard: FUNCTION 006c0ff0
194TBOOL TTextureResourceHAL::CreateFromMemory8888( TUINT a_uiWidth, TUINT a_uiHeight, TUINT a_uiLevels, void* a_pData )
195{
196 TIMPLEMENT();
197 return TFALSE;
198}
199
200// $Barnyard: FUNCTION 006c10f0
201TBOOL TTextureResourceHAL::CreateFromMemory888( TUINT a_uiWidth, TUINT a_uiHeight, TUINT a_uiLevels, void* a_pData )
202{
203 auto pRenderer = TSTATICCAST( TRenderD3DInterface, GetRenderer() );
204
205 HRESULT hCreateRes = pRenderer->GetDirect3DDevice()->CreateTexture(
206 a_uiWidth,
207 a_uiHeight,
208 a_uiLevels,
209 0,
210 D3DFMT_X8R8G8B8,
211 D3DPOOL_MANAGED,
212 &m_pD3DTexture
213 );
214
215 if ( SUCCEEDED( hCreateRes ) )
216 {
217 D3DLOCKED_RECT rect;
218 m_pD3DTexture->LockRect( 0, &rect, NULL, D3DLOCK_NO_DIRTY_UPDATE | D3DLOCK_NOSYSLOCK );
219
220 if ( a_uiHeight != 0 )
221 {
222 TUINT8* pTexPixel = TSTATICCAST( TUINT8, rect.pBits );
223 TUINT8* pDataPixel = TSTATICCAST( TUINT8, a_pData );
224
225 for ( TUINT i = a_uiHeight; i != 0; i-- )
226 {
227 TUINT8 uiDataPixel = *pDataPixel;
228 pTexPixel[ 0 ] = pDataPixel[ 2 ];
229 pTexPixel[ 1 ] = pDataPixel[ 1 ];
230 pTexPixel[ 2 ] = pDataPixel[ 0 ];
231 pTexPixel[ 3 ] = 255;
232
233 pTexPixel += 4;
234 pDataPixel += 3;
235 }
236 }
237
238 m_pD3DTexture->UnlockRect( 0 );
239
240 if ( a_uiLevels == 0 )
241 {
242 TFIXME( "Call some D3DX? function with 4 parameters with the first one being IDirect3DTexture (most likely not related to the engine)" );
243 TUtil::MemClear( &m_ImageInfo, sizeof( m_ImageInfo ) );
244 m_ImageInfo.Width = a_uiWidth;
245 m_ImageInfo.Height = a_uiHeight;
246 }
247
248 return TTRUE;
249 }
250 else
251 {
253 }
254
255 return TTRUE;
256}
257
258// $Barnyard: FUNCTION 006c0df0
259TBOOL TTextureResourceHAL::CreateFromMemory5551( TUINT a_uiWidth, TUINT a_uiHeight, TUINT a_uiLevels, void* a_pData )
260{
261 TIMPLEMENT();
262 return TFALSE;
263}
264
265// $Barnyard: FUNCTION 006c0ef0
266TBOOL TTextureResourceHAL::CreateFromMemory4444( TUINT a_uiWidth, TUINT a_uiHeight, TUINT a_uiLevels, void* a_pData )
267{
268 auto pRenderer = TSTATICCAST( TRenderD3DInterface, GetRenderer() );
269
270 HRESULT hCreateRes = pRenderer->GetDirect3DDevice()->CreateTexture(
271 a_uiWidth,
272 a_uiHeight,
273 a_uiLevels,
274 0,
275 D3DFMT_A4R4G4B4,
276 D3DPOOL_MANAGED,
277 &m_pD3DTexture
278 );
279
280 if ( SUCCEEDED( hCreateRes ) )
281 {
282 D3DLOCKED_RECT rect;
283 m_pD3DTexture->LockRect( 0, &rect, NULL, D3DLOCK_NO_DIRTY_UPDATE | D3DLOCK_NOSYSLOCK );
284
285 if ( a_uiHeight != 0 )
286 {
287 TUINT16* pTexPixel = TSTATICCAST( TUINT16, rect.pBits );
288 TUINT16* pDataPixel = TSTATICCAST( TUINT16, a_pData );
289
290 for ( TUINT i = a_uiHeight; i != 0; i-- )
291 {
292 TUINT16 uiDataPixel = *pDataPixel;
293 *pTexPixel = ( ( ( ( uiDataPixel >> 12 ) << 4 | uiDataPixel & 15 ) << 4 | uiDataPixel >> 4 & 15 ) << 4 ) | uiDataPixel >> 8 & 15;
294 pTexPixel++;
295 pDataPixel++;
296 }
297 }
298
299 m_pD3DTexture->UnlockRect( 0 );
300
301 if ( a_uiLevels == 0 )
302 {
303 TFIXME( "Call some D3DX? function with 4 parameters with the first one being IDirect3DTexture (most likely not related to the engine)" );
304 TUtil::MemClear( &m_ImageInfo, sizeof( m_ImageInfo ) );
305 m_ImageInfo.Width = a_uiWidth;
306 m_ImageInfo.Height = a_uiHeight;
307 }
308
309 return TTRUE;
310 }
311 else
312 {
314 }
315
316 return TTRUE;
317}
318
319// $Barnyard: FUNCTION 006c11e0
320TBOOL TTextureResourceHAL::CreateFromMemoryDDS( TUINT a_uiWidth, TUINT a_uiHeight, TUINT a_uiLevels, void* a_pData )
321{
322 auto pRenderer = TSTATICCAST( TRenderD3DInterface, GetRenderer() );
323
324 HRESULT hRes = D3DXCreateTextureFromFileInMemoryEx(
325 pRenderer->GetDirect3DDevice(),
326 a_pData,
327 m_uiDataSize,
328 -1,
329 -1,
330 a_uiLevels,
331 0,
332 D3DFMT_UNKNOWN,
333 D3DPOOL_MANAGED,
334 D3DFILTER_LINEARMIPNEAREST,
335 D3DFILTER_LINEARMIPNEAREST,
336 0,
337 &m_ImageInfo,
338 NULL,
339 &m_pD3DTexture
340 );
341
342 if ( FAILED( hRes ) )
343 {
345 }
346
347 return hRes == S_OK;
348}
349
350TBOOL TTextureResourceHAL::CreateFromFileDDS( TUINT a_uiWidth, TUINT a_uiHeight, TUINT a_uiLevels, const TCHAR* a_szFile )
351{
352 auto pRenderer = TSTATICCAST( TRenderD3DInterface, GetRenderer() );
353
354 HRESULT hRes = D3DXCreateTextureFromFileExA(
355 pRenderer->GetDirect3DDevice(),
356 a_szFile,
357 -1,
358 -1,
359 a_uiLevels,
360 0,
361 D3DFMT_UNKNOWN,
362 D3DPOOL_MANAGED,
363 D3DFILTER_LINEARMIPNEAREST,
364 D3DFILTER_LINEARMIPNEAREST,
365 0,
366 &m_ImageInfo,
367 NULL,
368 &m_pD3DTexture
369 );
370
371 if ( FAILED( hRes ) )
372 {
374 }
375
376 return hRes == S_OK;
377}
378
379// $Barnyard: FUNCTION 006c1240
381{
382 auto iLen = TStringManager::String8Length( a_szName );
383
384 if ( iLen >= 4 )
385 {
386 return TStringManager::String8Compare( a_szName + iLen - 4, ".ppm" ) == 0;
387 }
388
389 return TFALSE;
390}
391
392// $Barnyard: FUNCTION 006c13f0
394{
395 if ( IsCreated() && IsValid() )
396 {
397 return TTRUE;
398 }
399
400 auto pRenderer = TSTATICCAST( TRenderD3DInterface, GetRenderer() );
401
402 if ( m_bLoadFromMemory )
403 {
404 // Load from memory
405 if ( m_pData && m_uiDataSize != 0 )
406 {
407 if ( HASANYFLAG( m_eTextureFlags, 0x40 ) )
408 {
409 if ( !CreateFromFormat() )
410 {
411 return TFALSE;
412 }
413 }
414 else
415 {
416 TUINT uiLayout = m_eTextureFlags & 0x38;
417
418 if ( uiLayout == 8 )
419 {
420 CreateFromMemory5551( m_uiWidth, m_uiHeight, 0, m_pData );
421 }
422 else if ( uiLayout == 16 )
423 {
424 CreateFromMemory4444( m_uiWidth, m_uiHeight, 0, m_pData );
425 }
426 else if ( uiLayout == 32 )
427 {
428 CreateFromMemory8888( m_uiWidth, m_uiHeight, 0, m_pData );
429 }
430 else
431 {
432 CreateFromMemoryDDS( m_uiWidth, m_uiHeight, -1, m_pData );
433 }
434 }
435 }
436 }
437 else
438 {
439 // Load from file
440 if ( m_pNameEntry && !IsPPM( m_pNameEntry->GetName() ) )
441 {
442 CreateFromFileDDS( m_uiWidth, m_uiHeight, -1, m_pNameEntry->GetName() );
443 }
444 }
445
446 TFIXME( "Doesn't affect anything but here should be some manipulations with s_iHALMemoryUsage" );
447 return TResource::Validate();
448}
449
450// $Barnyard: FUNCTION 006c1580
452{
453 if ( IsCreated() && IsValid() )
454 {
455 if ( m_bIsToshi2 == TTRUE )
456 {
457 m_pD3DTexture = TNULL;
458 }
459 else if ( m_pD3DTexture )
460 {
461 TFIXME( "Doesn't affect anything but here should be some manipulations with s_iHALMemoryUsage" );
462 m_pD3DTexture->Release();
463 }
464
466 }
467}
468
@ ADDRESSINGMODE_WRAP
Definition TRender.h:40
#define TIMPLEMENT()
Definition Defines.h:136
#define TASSERT(X,...)
Definition Defines.h:138
#define TWARN(...)
Definition Defines.h:152
#define TSTATICCAST(POINTERTYPE, VALUE)
Definition Defines.h:69
#define HASANYFLAG(STATE, FLAG)
Definition Defines.h:5
#define TFIXME(DESC)
Definition Defines.h:135
#define TOSHI_NAMESPACE_START
Definition Defines.h:47
#define TOSHI_NAMESPACE_END
Definition Defines.h:50
#define TDEFINE_FREELIST_ALLOCATOR(CLASS_NAME)
Definition TFreeList.h:19
#define TDEFINE_CLASS(...)
Definition TObject.h:120
uint16_t TUINT16
Definition Typedefs.h:15
unsigned int TUINT
Definition Typedefs.h:8
char TCHAR
Definition Typedefs.h:20
uint8_t TUINT8
Definition Typedefs.h:17
#define TNULL
Definition Typedefs.h:23
#define TFALSE
Definition Typedefs.h:24
#define TTRUE
Definition Typedefs.h:25
bool TBOOL
Definition Typedefs.h:6
const D3DXIMAGE_INFO & GetImageInfo() const
TUINT GetMipLevels() const
TUINT GetWidth() const
TUINT GetHeight() const
IDirect3DTexture8 * GetD3DTexture()
DirectX 8 implementation of the render interface Handles DirectX 8 specific rendering functionality a...
static void PrintError(TINT32 a_eError, const TCHAR *a_szInfo)
Prints error text caused by some directx call.
TBOOL CreateFromMemory888(TUINT a_uiWidth, TUINT a_uiHeight, TUINT a_uiLevels, void *a_pData)
virtual TUINT GetWidth() override
virtual TUINT GetHeight() override
static TBOOL IsPPM(const TCHAR *a_szName)
virtual void Unlock() override
virtual TBOOL Validate() override
TBOOL CreateFromMemory5551(TUINT a_uiWidth, TUINT a_uiHeight, TUINT a_uiLevels, void *a_pData)
TBOOL CreateFromMemory8888(TUINT a_uiWidth, TUINT a_uiHeight, TUINT a_uiLevels, void *a_pData)
virtual void CreateFromT2Texture(T2Texture *a_pTexture) override
TBOOL CreateFromFileDDS(TUINT a_uiWidth, TUINT a_uiHeight, TUINT a_uiLevels, const TCHAR *a_szFile)
virtual TBOOL CreateEx(void *a_pData, TUINT a_uiDataSize, TUINT a_uiWidth, TUINT a_uiHeight, TUINT a_uiMipLevels, TTEXTURERESOURCEFORMAT a_eFormat, TUINT a_uiMipMapFlags) override
TBOOL CreateFromMemory4444(TUINT a_uiWidth, TUINT a_uiHeight, TUINT a_uiLevels, void *a_pData)
virtual TBOOL Lock(TTexture::LOCKSTATE &a_rLockState) override
virtual void Invalidate() override
TBOOL CreateFromMemoryDDS(TUINT a_uiWidth, TUINT a_uiHeight, TUINT a_uiLevels, void *a_pData)
TTextureFactory::NameEntry * m_pNameEntry
Definition TTexture.h:78
TUINT m_eTextureFlags
Definition TTexture.h:77
TBOOL IsCreated() const
Definition TResource.h:46
virtual void Invalidate()
Definition TResource.cpp:47
virtual TBOOL Validate()
Definition TResource.cpp:36
TBOOL IsValid() const
Definition TResource.h:44
virtual TBOOL Create()
Definition TResource.cpp:28
TRenderInterface * GetRenderer() const
static TINT String8Compare(const TCHAR *str1, const TCHAR *str2, TSIZE size=-1)
static TSIZE String8Length(const TCHAR *str)
static void MemClear(void *ptr, TSIZE size)
Definition TUtil.h:91