#include "rendertarget_d3d9.h" RenderTargetD3D9::RenderTargetD3D9(LPDIRECT3DDEVICE9 dev,SamplerState samp,int po2lev,bool floatformat): dev(dev), po2lev(po2lev), RenderTarget((float)(1<GetDeviceCaps(&caps); maxaniso=caps.MaxAnisotropy; is_main_fb=false; is_floating_point=floatformat; if (dev->CreateDepthStencilSurface((UINT)width,(UINT)height, D3DFMT_D16,D3DMULTISAMPLE_NONE,0,TRUE,&depthpixels,NULL)!=D3D_OK) { is_valid=false; return; } if (dev->CreateTexture((UINT)width,(UINT)height,0,D3DUSAGE_RENDERTARGET| D3DUSAGE_AUTOGENMIPMAP,is_floating_point?D3DFMT_A16B16G16R16F:D3DFMT_X8R8G8B8, D3DPOOL_DEFAULT,&tex,NULL)!=D3D_OK) { depthpixels->Release(); is_valid=false; return; } if (tex->GetSurfaceLevel(0,&surface)!=D3D_OK) { depthpixels->Release(); tex->Release(); is_valid=false; return; } } RenderTargetD3D9::~RenderTargetD3D9() { if (is_valid) { depthpixels->Release(); tex->Release(); } } bool RenderTargetD3D9::BindTarget() { LPDIRECT3DSURFACE9 oldrt0; LPDIRECT3DSURFACE9 olddt; dev->GetRenderTarget(0,&oldrt0); dev->GetDepthStencilSurface(&olddt); if (dev->SetRenderTarget(0,surface)!=D3D_OK) { dev->SetRenderTarget(0,oldrt0); return false; } if (dev->SetDepthStencilSurface(depthpixels)!=D3D_OK) { dev->SetRenderTarget(0,oldrt0); dev->SetDepthStencilSurface(olddt); return false; } return true; } static DWORD d3d_texfilter[]= { D3DTEXF_LINEAR, D3DTEXF_POINT, D3DTEXF_LINEAR }; static DWORD d3d_texwrap[]= { D3DTADDRESS_WRAP, D3DTADDRESS_BORDER, D3DTADDRESS_CLAMP }; void RenderTargetD3D9::Bind(int stage) { if (bindmode!=RAVEN_TEXTURE_BIND_NONE) { dev->SetTexture(stage,tex); dev->SetTextureStageState(stage,D3DTSS_COLOROP,D3DTOP_MODULATE); dev->SetTextureStageState(stage,D3DTSS_COLORARG1,D3DTA_CURRENT); dev->SetTextureStageState(stage,D3DTSS_COLORARG2,D3DTA_TEXTURE); dev->SetTextureStageState(stage,D3DTSS_ALPHAOP,D3DTOP_MODULATE); dev->SetTextureStageState(stage,D3DTSS_ALPHAARG1,D3DTA_CURRENT); dev->SetTextureStageState(stage,D3DTSS_ALPHAARG2,D3DTA_TEXTURE); dev->SetSamplerState(stage,D3DSAMP_MAGFILTER,d3d_texfilter[samp.magmode]); dev->SetSamplerState(stage,D3DSAMP_MINFILTER,samp.aniso?(DWORD)D3DTEXF_ANISOTROPIC:d3d_texfilter[samp.minmode]); dev->SetSamplerState(stage,D3DSAMP_MIPFILTER,(samp.minmode==RAVEN_MIPMAP_SAMPLE)?D3DTEXF_LINEAR:D3DTEXF_NONE); dev->SetSamplerState(stage,D3DSAMP_ADDRESSU,d3d_texwrap[samp.wraps]); dev->SetSamplerState(stage,D3DSAMP_ADDRESSV,d3d_texwrap[samp.wrapt]); dev->SetSamplerState(stage,D3DSAMP_MAXANISOTROPY,min(maxaniso,samp.aniso)); } }