/////////////////////////////////////////////////////////////////////////////// // // ## ###### // ###### ### // ## ############### Shark 3D Engine (www.shark3d.com) // ########## # # # // ######## Copyright (c) 1996-2006 Spinor GmbH. // ######### # # # All rights reserved. // ## ########## // ## // /////////////////////////////////////////////////////////////////////////////// //@cpp #ifndef S3D_DRV_D3D9_TEX_H #define S3D_DRV_D3D9_TEX_H #include "drv_d3d9_types.h" #include "drv_d3d9_ctx.h" #include "drv_d3d9_env.h" #include "drv/interf/drv_video.h" #include "util/base/util_ptr.h" #include "util/cont/util_list.h" /////////////////////////////////////////////////////////////////////////////// //@ struct s3d_CDrvD3d9TexFmt { D3DFORMAT m_FmtCol; D3DFORMAT m_FmtDepth; bool m_CanFilter; bool m_CanMultiSample; DWORD m_Usage; bool m_SRGBRead; bool m_SRGBWrite; D3DTEXTUREFILTERTYPE m_FilterMipGen; }; /////////////////////////////////////////////////////////////////////////////// //@ struct s3d_CDrvD3d9SampParam { D3DTEXTUREFILTERTYPE m_FilterMin; D3DTEXTUREFILTERTYPE m_FilterMag; D3DTEXTUREFILTERTYPE m_FilterMip; D3DTEXTUREADDRESS m_AddrX; D3DTEXTUREADDRESS m_AddrY; D3DTEXTUREADDRESS m_AddrZ; BOOL m_SRGBTex; }; /////////////////////////////////////////////////////////////////////////////// class s3d_CDrvD3d9TexMgr; class s3d_CDrvD3d9TexObjBase; //@ typedef s3d_CUtilList s3d_CDrvD3d9TexList; /////////////////////////////////////////////////////////////////////////////// class s3d_CDrvD3d9TexMgr; //@ typedef s3d_CUtilPtr s3d_CDrvD3d9TexMgrPtr; /////////////////////////////////////////////////////////////////////////////// //@ class s3d_CDrvD3d9TexObjBase : public s3d_CDrvGfxTex { public: s3d_CDrvD3d9TexObjBase(); virtual ~s3d_CDrvD3d9TexObjBase(); int m_Prop; int m_Width; int m_Height; int m_Depth; D3DPOOL m_Pool; s3d_CDrvD3d9TexFmt m_TexFmt; s3d_CDrvD3d9BaseTex m_BaseTex; s3d_CDrvD3d9TexList::CNode m_Node; s3d_CDrvD3d9CtxPtr m_D3dCtx; void LoadData( int Part, int Mipmap, int Width, int Height, int Depth, const s3d_CDrvGfxPixel *Data); void LoadUser( s3d_CCompObj *UserObj); void GetSize( int &Width, int &Height, int &Depth) const; int GetTexProp() const; virtual void AllocTex() = 0; virtual HRESULT D3dLoadData( int Part, int Mipmap, int Width, int Height, int Depth, const s3d_CDrvGfxPixel *SrcData) = 0; virtual HRESULT D3dLoadData( int Part, int Mipmap, int Width, int Height, int Depth, LPDIRECT3DSURFACE9 SrcSurf) = 0; virtual HRESULT GetRenderTarget( s3d_CDrvD3d9Surf &DestSurf, const s3d_CDrvGfxDest *GfxDest) = 0; virtual bool IsVideoTex(); virtual void UpdateToFrm(s3d_CSysInt32u FrmIdx); virtual void Park() = 0; virtual void Unpark() = 0; }; S3D_UTIL_RECOG_DECLAREINFO(s3d_CDrvD3d9TexObjBase); //@ typedef s3d_CUtilPtr s3d_CDrvD3d9TexObjBasePtr; //@ typedef s3d_CUtilPtrArray s3d_CDrvD3d9TexObjBaseArray; /////////////////////////////////////////////////////////////////////////////// //@ class s3d_CDrvD3d9TexObj : public s3d_CDrvD3d9TexObjBase { public: s3d_CDrvD3d9TexObj( s3d_CDrvD3d9Ctx *D3dCtx, int TexProp, int Width, int Height, const s3d_CDrvD3d9TexFmt &TexFmt, D3DPOOL Pool); s3d_CDrvD3d9TexObj( s3d_CDrvD3d9Ctx *D3dCtx, int TexProp, int Width, int Height, const s3d_CDrvD3d9TexFmt &TexFmt, D3DPOOL Pool, LPDIRECT3DTEXTURE9 D3dTex); private: s3d_CDrvD3d9Tex m_D3dTex; void AllocTex(); HRESULT D3dLoadData( int Part, int Mipmap, int Width, int Height, int Depth, const s3d_CDrvGfxPixel *Data); HRESULT D3dLoadData( int Part, int Mipmap, int Width, int Height, int Depth, LPDIRECT3DSURFACE9 SrcSurf); HRESULT GetRenderTarget( s3d_CDrvD3d9Surf &DestSurf, const s3d_CDrvGfxDest *GfxDest); void Park(); void Unpark(); }; //@ typedef s3d_CUtilPtr s3d_CDrvD3d9TexObjPtr; /////////////////////////////////////////////////////////////////////////////// //@ class s3d_CDrvD3d9TexCubeObj : public s3d_CDrvD3d9TexObjBase { public: s3d_CDrvD3d9TexCubeObj( s3d_CDrvD3d9Ctx *D3dCtx, int TexProp, int Width, int Height, const s3d_CDrvD3d9TexFmt &TexFmt, D3DPOOL Pool); s3d_CDrvD3d9TexCubeObj( s3d_CDrvD3d9Ctx *D3dCtx, int TexProp, int Width, int Height, const s3d_CDrvD3d9TexFmt &TexFmt, D3DPOOL Pool, LPDIRECT3DCUBETEXTURE9 D3dCubeTex); private: s3d_CDrvD3d9CubeTex m_D3dCubeTex; void AllocTex(); HRESULT D3dLoadData( int Part, int Mipmap, int Width, int Height, int Depth, const s3d_CDrvGfxPixel *Data); HRESULT D3dLoadData( int Part, int Mipmap, int Width, int Height, int Depth, LPDIRECT3DSURFACE9 SrcSurf); HRESULT GetRenderTarget( s3d_CDrvD3d9Surf &DestSurf, const s3d_CDrvGfxDest *Dest); void Park(); void Unpark(); }; //@ typedef s3d_CUtilPtr s3d_CDrvD3d9TexCubeObjPtr; /////////////////////////////////////////////////////////////////////////////// //@ class s3d_CDrvD3d9TexVolObj : public s3d_CDrvD3d9TexObjBase { public: s3d_CDrvD3d9TexVolObj( s3d_CDrvD3d9Ctx *D3dCtx, int TexProp, int Width, int Height, int Depth, const s3d_CDrvD3d9TexFmt &TexFmt, D3DPOOL Pool, LPDIRECT3DVOLUMETEXTURE9 D3dVolTex); void AllocTex(); HRESULT D3dLoadData( int Part, int Mipmap, int Width, int Height, int Depth, const s3d_CDrvGfxPixel *SrcData); HRESULT D3dLoadData( int Part, int Mipmap, int Width, int Height, int Depth, LPDIRECT3DSURFACE9 SrcSurf); HRESULT GetRenderTarget( s3d_CDrvD3d9Surf &DestSurf, const s3d_CDrvGfxDest *GfxDest); bool IsVideoTex(); void UpdateToFrm(s3d_CSysInt32u FrmIdx); void Park(); void Unpark(); private: s3d_CDrvD3d9VolTex m_D3dVolTex; }; //@ typedef s3d_CUtilPtr s3d_CDrvD3d9TexVolObjPtr; /////////////////////////////////////////////////////////////////////////////// //@ class s3d_CDrvD3d9TexObjVideo : public s3d_CDrvD3d9TexObjBase { public: s3d_CDrvD3d9TexObjVideo( s3d_CDrvD3d9Ctx *D3dCtx, s3d_CDrvVideoPlayer *VideoPlayer, int TexProp, bool NeedSnap, const s3d_CDrvD3d9TexFmt &TexFmt, D3DPOOL Pool); private: s3d_CDrvD3d9Tex m_D3dTex; s3d_CDrvVideoPlayerPtr m_VideoPlayer; bool m_NeedSnap; int m_VideoWidth; int m_VideoHeight; s3d_CSysInt32u m_LastFrmIdx; void AllocTex(); HRESULT D3dLoadData( int Part, int Mipmap, int Width, int Height, int Depth, const s3d_CDrvGfxPixel *Data); HRESULT D3dLoadData( int Part, int Mipmap, int Width, int Height, int Depth, LPDIRECT3DSURFACE9 SrcSurf); HRESULT GetRenderTarget( s3d_CDrvD3d9Surf &DestSurf, const s3d_CDrvGfxDest *GfxDest); bool IsVideoTex(); void UpdateToFrm( s3d_CSysInt32u FrmIdx); void Park(); void Unpark(); void SetVideoSize( int VideoWidth, int VideoHeight); void SnapVideoSize( int &Width, int &Height); static int CalcVideoFormat( s3d_CDrvVideoPlayer *VideoPlayer); }; //@ typedef s3d_CUtilPtr s3d_CDrvD3d9TexObjVideoPtr; /////////////////////////////////////////////////////////////////////////////// //@ class s3d_CDrvD3d9TexMgr : public s3d_CUtilPtrBase { public: s3d_CDrvD3d9TexMgr( s3d_CDrvD3d9Ctx *D3dCtx); ~s3d_CDrvD3d9TexMgr(); s3d_CDrvGfxTexPtr CreateTexDirect( s3d_CUtilStr_cr Info, int TexProp, int Width, int Height, int Depth); s3d_CDrvGfxTexPtr CreateTexStream( s3d_CUtilStr_cr Info, int TexProp, s3d_CUtilStream *Stream); s3d_CDrvGfxTexPtr CreateTexVideo( s3d_CUtilStr_cr Info, int TexProp, s3d_CDrvVideoPlayer *VideoPlayer); void Park(); void Unpark(); public: s3d_CDrvD3d9CtxPtr m_D3dCtx; D3DCAPS9 m_DevCaps; D3DDISPLAYMODE m_AdapterMode; s3d_CDrvD3d9TexList m_TexList; s3d_CDrvD3d9TexObjBasePtr CreateTexDirectFmt( s3d_CUtilStr_cr Info, int TexProp, const s3d_CDrvD3d9TexFmt &TexFmt, int Width, int Height, int Depth, s3d_CDrvVideoPlayer *VideoPlayer); void FindTexFmt( s3d_CDrvD3d9TexFmt &TexFmt, int TexProp); s3d_CUtilMap m_PropFmtMap; void FmtOfTexProp( int TexProp, s3d_CDrvD3d9TexFmt &TexFmt); public: static D3DCUBEMAP_FACES GetFaceOfPart(int Part); static int CompCntOfTexProp( int TexProp); static int BitsPerCompCntOfTexProp( int TexProp); static void s3d_CDrvD3d9TexMgr::CopyTexData2D( s3d_CSysIntm *&DestData, s3d_CSysIntps Stride, int Width, int Height, const s3d_CDrvGfxPixel *SrcData); }; /////////////////////////////////////////////////////////////////////////////// // Definitions S3D_SYS_INLINE void s3d_CDrvD3d9TexObjBase::LoadUser( s3d_CCompObj *UserObj) { } S3D_SYS_INLINE void s3d_CDrvD3d9TexObjBase::GetSize( int &Width, int &Height, int &Depth) const { Width = m_Width; Height = m_Height; Depth = m_Depth; } S3D_SYS_INLINE int s3d_CDrvD3d9TexObjBase::GetTexProp() const { return m_Prop; } /////////////////////////////////////////////////////////////////////////////// #endif