mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2025-07-21 13:20:27 -06:00
Initial megacommit.
git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@4 8ced0084-cf51-0410-be5f-012b33b47a6e
This commit is contained in:
98
Source/Plugins/Plugin_VideoDX9/Src/D3DTexture.cpp
Normal file
98
Source/Plugins/Plugin_VideoDX9/Src/D3DTexture.cpp
Normal file
@ -0,0 +1,98 @@
|
||||
#include "D3DBase.h"
|
||||
#include "D3DTexture.h"
|
||||
|
||||
namespace D3D
|
||||
{
|
||||
LPDIRECT3DTEXTURE9 CreateTexture2D(const BYTE* buffer, const int width, const int height,const int pitch, D3DFORMAT fmt)
|
||||
{
|
||||
DWORD *pBuffer = (DWORD *)buffer;
|
||||
LPDIRECT3DTEXTURE9 pTexture;
|
||||
|
||||
// crazy bitmagic
|
||||
bool isPow2 = !((width&(width-1)) || (height&(height-1)));
|
||||
|
||||
HRESULT hr;
|
||||
// TODO(ector): allow mipmaps for non-pow textures on newer cards?
|
||||
if (!isPow2)
|
||||
hr = dev->CreateTexture(width, height, 1, 0, fmt, D3DPOOL_MANAGED, &pTexture, NULL);
|
||||
else
|
||||
hr = dev->CreateTexture(width, height, 0, D3DUSAGE_AUTOGENMIPMAP, fmt, D3DPOOL_MANAGED, &pTexture, NULL);
|
||||
|
||||
if(FAILED(hr))
|
||||
return 0;
|
||||
|
||||
int level = 0;
|
||||
|
||||
D3DLOCKED_RECT Lock;
|
||||
pTexture->LockRect(level, &Lock, NULL, 0 );
|
||||
|
||||
DWORD* pIn = pBuffer;
|
||||
switch(fmt)
|
||||
{
|
||||
case D3DFMT_A8R8G8B8:
|
||||
{
|
||||
for (int y = 0; y < height; y++)
|
||||
{
|
||||
DWORD* pBits = (DWORD*)((BYTE*)Lock.pBits + (y * Lock.Pitch));
|
||||
memcpy(pBits,pIn, width * 4);
|
||||
pIn += pitch;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case D3DFMT_DXT1:
|
||||
memcpy(Lock.pBits,buffer,(width/4)*(height/4)*8);
|
||||
break;
|
||||
}
|
||||
pTexture->UnlockRect(level);
|
||||
return pTexture;
|
||||
}
|
||||
|
||||
void ReplaceTexture2D(LPDIRECT3DTEXTURE9 pTexture, const BYTE* buffer, const int width, const int height,const int pitch, D3DFORMAT fmt)
|
||||
{
|
||||
DWORD *pBuffer = (DWORD *)buffer;
|
||||
int level=0;
|
||||
D3DLOCKED_RECT Lock;
|
||||
pTexture->LockRect(level, &Lock, NULL, 0 );
|
||||
DWORD* pIn = pBuffer;
|
||||
switch(fmt)
|
||||
{
|
||||
case D3DFMT_A8R8G8B8:
|
||||
{
|
||||
for (int y = 0; y < height; y++)
|
||||
{
|
||||
DWORD* pBits = (DWORD*)((BYTE*)Lock.pBits + (y * Lock.Pitch));
|
||||
memcpy(pBits,pIn, width*4);
|
||||
pIn += pitch;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case D3DFMT_DXT1:
|
||||
memcpy(Lock.pBits,buffer,(width/4)*(height/4)*8);
|
||||
break;
|
||||
}
|
||||
pTexture->UnlockRect(level);
|
||||
}
|
||||
|
||||
LPDIRECT3DTEXTURE9 CreateRenderTarget(const int width, const int height)
|
||||
{
|
||||
LPDIRECT3DTEXTURE9 tex;
|
||||
HRESULT hr = dev->CreateTexture(width,height,0,D3DUSAGE_RENDERTARGET | D3DUSAGE_AUTOGENMIPMAP,D3DFMT_A8R8G8B8,D3DPOOL_DEFAULT,&tex,NULL);
|
||||
|
||||
if (FAILED(hr))
|
||||
return 0;
|
||||
else
|
||||
return tex;
|
||||
}
|
||||
|
||||
LPDIRECT3DSURFACE9 CreateDepthStencilSurface(const int width, const int height)
|
||||
{
|
||||
LPDIRECT3DSURFACE9 surf;
|
||||
HRESULT hr = dev->CreateDepthStencilSurface(width,height,D3DFMT_D24S8,D3DMULTISAMPLE_NONE,0,0,&surf,0);
|
||||
|
||||
if (FAILED(hr))
|
||||
return 0;
|
||||
else
|
||||
return surf;
|
||||
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user