bool TextureClass::Load(ENGINE *ge, WCHAR* filename)
{
HRESULT result;
// Load the texture in.
result = D3DX11CreateShaderResourceViewFromFileW(ge->Graphics.dev, filename, NULL, NULL, &m_texture, NULL);
if(FAILED(result))
{
return false;
}
ID3D11Resource *ppResource;
m_texture->GetResource(&ppResource);
D3D11_RESOURCE_DIMENSION pResourceDimension;
ppResource->GetType(&pResourceDimension);
auto txt=reinterpret_cast<ID3D11Texture2D*>( ppResource );
pTexture=txt;
txt->GetDesc(&odesc);
desc=odesc;
Width=(float)desc.Width;
Height=(float)desc.Height;
OnGPU=true;
return true;
}
void TextureClass::Shutdown()
{
// Release the texture resource.
if(m_texture!=NULL)
{
pTexture->Release();
pTexture=NULL;
m_texture->Release();
m_texture = NULL;
}
}
bool TextureClass::TextureCreate(ENGINE *ge,int sx,int sy){
// GE=ge;
ZeroMemory(&desc,sizeof(desc));
desc.Width = sx;
desc.Height = sy;
desc.MipLevels = 1;
desc.ArraySize = 1;
desc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
desc.SampleDesc.Count = 1;
desc.Usage = D3D11_USAGE_DYNAMIC;//D3D11_USAGE_DYNAMIC
desc.BindFlags = D3D11_BIND_SHADER_RESOURCE;//D3D11_BIND_SHADER_RESOURCE
desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;//D3D11_CPU_ACCESS_WRITE
desc.MiscFlags = 0;//D3D11_RESOURCE_MISC_GENERATE_MIPS
odesc=desc;
pTexture = NULL;
HRESULT result=ge->Graphics.dev->CreateTexture2D( &desc, NULL, &pTexture );//this works. doesn't fail
if(FAILED(result)) {
return false;
}
result=ge->Graphics.dev->CreateShaderResourceView(pTexture,NULL,&m_texture);
if(FAILED(result)){
return false;
}
Width=(float)desc.Width;
Height=(float)desc.Height;
OnGPU=true;
return true;
}
void TextureClass::ConvertToCPUMem(ENGINE *ge,bool CPUAccess){
HRESULT hr;
desc=odesc;
desc.Usage = D3D11_USAGE_STAGING;
desc.BindFlags = 0;
if (CPUAccess) desc.CPUAccessFlags = D3D11_CPU_ACCESS_READ|D3D11_CPU_ACCESS_WRITE;
else desc.CPUAccessFlags=0;
ID3D11Texture2D *pTexture2 = NULL;
hr=ge->Graphics.dev->CreateTexture2D( &desc, NULL, &pTexture2 );
ge->Graphics.devcon->CopyResource(pTexture2,pTexture);
Shutdown();
ge->Graphics.dev->CreateShaderResourceView(pTexture2,NULL,&m_texture);
pTexture=pTexture2;
OnGPU=false;
}
void TextureClass::ConvertToGraphicsMem(ENGINE *ge){
HRESULT hr;
desc=odesc;
ID3D11Texture2D *pTexture2 = NULL;
hr=ge->Graphics.dev->CreateTexture2D( &desc, NULL, &pTexture2 );
ge->Graphics.devcon->CopyResource(pTexture2,pTexture);
Shutdown();
ge->Graphics.dev->CreateShaderResourceView(pTexture2,NULL,&m_texture);
pTexture=pTexture2;
OnGPU=true;
}
I am trying to minimize my GPU memory use by putting unused resources in CPU memory. This is what I came up with but it has problems.
I tested it by converting the CPU mem and then back followed by a render. It works fine for a few frames, then it disappears.
pTexture is a ID3D11Texture2D*
desc and odesc are D3D11_TEXTURE2D_DESC
Before you ask, I will eventually need this so that I can keep textures in CPU mem when not in use. I will have LOTS of textures and I don't want to load from disk every time I need to swap out.