Counter Strike : Global Offensive Source Code
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

170 lines
4.5 KiB

//===== Copyright © 1996-2008, Valve Corporation, All rights reserved. ======//
//
// Purpose: Manager for texture containing subd data
//
//===========================================================================//
#include "isubdinternal.h"
#include "tier0/dbg.h"
#include "materialsystem/imaterialsystem.h"
#include "materialsystem/MaterialSystemUtil.h"
#include "materialsystem/itexture.h"
#include "materialsystem/imesh.h"
#include "utlsortvector.h"
#include "materialsystem_global.h"
#include "IHardwareConfigInternal.h"
#include "pixelwriter.h"
#include "itextureinternal.h"
#include "tier1/keyvalues.h"
#include "texturemanager.h"
#include "imaterialsysteminternal.h"
#include "imatrendercontextinternal.h"
#include "studio.h"
#include "tier0/vprof.h"
#include "renderparm.h"
#include "tier2/renderutils.h"
#include "bitmap/imageformat.h"
#include "materialsystem/IShader.h"
#include "imaterialinternal.h"
#include "tier0/memdbgon.h"
#define SUBD_TEXTURE_FORMAT IMAGE_FORMAT_RGBA32323232F
#define SUBD_TEXTURE_WIDTH 30
#define SUBD_TEXTURE_HEIGHT 8192 // If we need more than 8192 patches, we may be in trouble
//-----------------------------------------------------------------------------
// Subdivision surface manager class
//-----------------------------------------------------------------------------
class CSubDMgr : public ISubDMgr
{
public:
CSubDMgr();
virtual bool ShouldAllocateTextures();
virtual void AllocateTextures();
virtual void FreeTextures();
virtual void ReacquireResources();
virtual void ReleaseResources();
virtual int GetWidth();
virtual int GetHeight();
virtual int GetOffsetGeometry();
virtual int GetOffsetTangents();
virtual float* Lock( int nNumRows );
virtual void Unlock();
virtual ShaderAPITextureHandle_t SubDTexture();
private:
ShaderAPITextureHandle_t m_hSysMem;
ShaderAPITextureHandle_t m_hDefaultPool;
int m_nRowsLocked;
int m_nOffsetGeometry;
int m_nOffsetTangents;
};
//-----------------------------------------------------------------------------
// Singleton
//-----------------------------------------------------------------------------
static CSubDMgr s_SubDMgr;
ISubDMgr *g_pSubDMgr = &s_SubDMgr;
//-----------------------------------------------------------------------------
// Constructor
//-----------------------------------------------------------------------------
CSubDMgr::CSubDMgr()
{
m_nRowsLocked = 0;
m_nOffsetGeometry = 0;
m_nOffsetTangents = 0;
m_hSysMem = INVALID_SHADERAPI_TEXTURE_HANDLE;
m_hDefaultPool = INVALID_SHADERAPI_TEXTURE_HANDLE;
}
bool CSubDMgr::ShouldAllocateTextures()
{
return true;
// return g_pMaterialSystemHardwareConfig->SupportsSubdivisionSurfaces();
}
int CSubDMgr::GetWidth()
{
return SUBD_TEXTURE_WIDTH;
}
int CSubDMgr::GetHeight()
{
return SUBD_TEXTURE_HEIGHT;
}
int CSubDMgr::GetOffsetGeometry()
{
return m_nOffsetGeometry;
}
int CSubDMgr::GetOffsetTangents()
{
return m_nOffsetTangents;
}
void CSubDMgr::AllocateTextures()
{
ReacquireResources();
}
void CSubDMgr::FreeTextures()
{
ReleaseResources();
}
void CSubDMgr::ReleaseResources()
{
if ( g_pShaderAPI->IsTexture( m_hSysMem ) )
{
g_pShaderAPI->DeleteTexture( m_hSysMem );
m_hSysMem = INVALID_SHADERAPI_TEXTURE_HANDLE;
}
if ( g_pShaderAPI->IsTexture( m_hDefaultPool ) )
{
g_pShaderAPI->DeleteTexture( m_hDefaultPool );
m_hDefaultPool = INVALID_SHADERAPI_TEXTURE_HANDLE;
}
}
void CSubDMgr::ReacquireResources()
{
Assert( m_hSysMem == INVALID_SHADERAPI_TEXTURE_HANDLE );
Assert( m_hDefaultPool == INVALID_SHADERAPI_TEXTURE_HANDLE );
// These scratch textures are ~4mb (30*8192*16 bytes) and can
// accommodate data for 8192 patches
g_pShaderAPI->CreateTextures( &m_hSysMem, 1, SUBD_TEXTURE_WIDTH, SUBD_TEXTURE_HEIGHT, 0, SUBD_TEXTURE_FORMAT, 1, 1, TEXTURE_CREATE_SYSMEM, "_SubDSysMemTexture", "SubD Textures" );
g_pShaderAPI->CreateTextures( &m_hDefaultPool, 1, SUBD_TEXTURE_WIDTH, SUBD_TEXTURE_HEIGHT, 0, SUBD_TEXTURE_FORMAT, 1, 1, TEXTURE_CREATE_DEFAULT_POOL | TEXTURE_CREATE_VERTEXTEXTURE, "_SubDVidMemTexture", "SubD Textures" );
g_pShaderAPI->ModifyTexture( m_hDefaultPool );
g_pShaderAPI->TexMinFilter( SHADER_TEXFILTERMODE_NEAREST );
g_pShaderAPI->TexMagFilter( SHADER_TEXFILTERMODE_NEAREST );
}
float *CSubDMgr::Lock( int nRows )
{
m_nRowsLocked = nRows;
return (float *) g_pShaderAPI->LockTex( m_hSysMem );
}
void CSubDMgr::Unlock()
{
g_pShaderAPI->UnlockTex( m_hSysMem );
g_pShaderAPI->UpdateTexture( 0, 0, SUBD_TEXTURE_WIDTH, m_nRowsLocked, m_hDefaultPool, m_hSysMem );
}
ShaderAPITextureHandle_t CSubDMgr::SubDTexture()
{
return m_hDefaultPool;
}