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.
1033 lines
34 KiB
1033 lines
34 KiB
/****************************************************************************
|
|
*
|
|
* File: testagp.cpp
|
|
* Project: DxDiag (DirectX Diagnostic Tool)
|
|
* Author: Jason Sandlin ([email protected])
|
|
* Purpose: Test AGP Texturing functionality on this machine
|
|
*
|
|
* (C) Copyright 2000 Microsoft Corp. All rights reserved.
|
|
*
|
|
****************************************************************************/
|
|
|
|
#include <Windows.h>
|
|
#define DIRECTDRAW_VERSION 0x0700 // run on DX7 and later versions
|
|
#include <ddraw.h>
|
|
#define DIRECT3D_VERSION 0x0700 // run on DX7 and later versions
|
|
#define D3D_OVERLOADS
|
|
#include <d3d.h>
|
|
#include "reginfo.h"
|
|
#include "sysinfo.h"
|
|
#include "dispinfo.h"
|
|
#include "testagp.h"
|
|
#include "resource.h"
|
|
|
|
#ifndef ReleasePpo
|
|
#define ReleasePpo(ppo) \
|
|
if (*(ppo) != NULL) \
|
|
{ \
|
|
(*(ppo))->Release(); \
|
|
*(ppo) = NULL; \
|
|
} \
|
|
else (VOID)0
|
|
#endif
|
|
|
|
enum TESTID
|
|
{
|
|
TESTID_LOAD_D3D8_DLL=1,
|
|
TESTID_GET_D3DCREATE8,
|
|
TESTID_D3DCREATE8,
|
|
TESTID_ENUMADAPTERMODES,
|
|
TESTID_GETDEVICECAPS,
|
|
TESTID_NOMODEFOUND,
|
|
TESTID_CREATE_TEST_WINDOW,
|
|
TESTID_CREATE_DEVICE,
|
|
TESTID_GETBACKBUFFER,
|
|
TESTID_GETDESC,
|
|
TESTID_CREATE_VERTEX_BUFFER,
|
|
TESTID_CREATE_INDEX_BUFFER,
|
|
TESTID_LOCK,
|
|
TESTID_UNLOCK,
|
|
TESTID_SETLIGHT,
|
|
TESTID_LIGHTENABLE,
|
|
TESTID_SETTRANSFORM,
|
|
TESTID_SETRENDERSTATE,
|
|
TESTID_CREATETEXTURE,
|
|
TESTID_SETTEXTURESTAGESTATE,
|
|
TESTID_SETTEXTURE,
|
|
TESTID_SETVERTEXSHADER,
|
|
TESTID_USER_CANCELLED,
|
|
TESTID_VIEWPORT_CLEAR,
|
|
TESTID_BEGINSCENE,
|
|
TESTID_SETMATERIAL,
|
|
TESTID_SETSTREAMSOURCE,
|
|
TESTID_SETINDICES,
|
|
TESTID_DRAW_INDEXED_PRIMITIVE,
|
|
TESTID_ENDSCENE,
|
|
TESTID_PRESENT,
|
|
TESTID_USER_VERIFY_D3D7_RENDERING,
|
|
TESTID_USER_VERIFY_D3D8_RENDERING,
|
|
TESTID_LOAD_DDRAW_DLL,
|
|
TESTID_GET_DIRECTDRAWCREATE,
|
|
TESTID_DIRECTDRAWCREATE,
|
|
TESTID_SETCOOPERATIVELEVEL_FULLSCREEN,
|
|
TESTID_SETCOOPERATIVELEVEL_NORMAL,
|
|
TESTID_SETDISPLAYMODE,
|
|
TESTID_CREATEPRIMARYSURFACE_FLIP_ONEBACK,
|
|
TESTID_GETATTACHEDSURFACE,
|
|
TESTID_QUERY_D3D,
|
|
TESTID_SETVIEWPORT,
|
|
TESTID_ENUMTEXTUREFORMATS,
|
|
TESTID_CREATESURFACE,
|
|
TESTID_GETDC,
|
|
TESTID_RELEASEDC,
|
|
};
|
|
|
|
BOOL BTranslateError(HRESULT hr, TCHAR* psz, BOOL bEnglish = FALSE); // from main.cpp (yuck)
|
|
|
|
typedef HRESULT (WINAPI* LPDIRECTDRAWCREATEEX)(GUID FAR * lpGuid, LPVOID *lplpDD, REFIID iid,IUnknown FAR *pUnkOuter );
|
|
|
|
static HRESULT Test3D(BOOL bUseTexture, HWND hwndMain, LPDIRECTDRAW7 pdd, GUID guid3DDevice, LONG* piStepThatFailed);
|
|
static HRESULT CreateTestWindow(HWND hwndMain, HWND* phwnd);
|
|
static HRESULT D3DUtil_SetProjectionMatrix( D3DMATRIX& mat, FLOAT fFOV, FLOAT fAspect, FLOAT fNearPlane, FLOAT fFarPlane );
|
|
|
|
static HRESULT CreateTexture( LPDIRECTDRAWSURFACE7* ppdds, LPDIRECTDRAW7 pdd, LPDIRECT3DDEVICE7 pd3dDevice, TCHAR* strName, LONG* piStepThatFailed);
|
|
static HRESULT CALLBACK TextureSearchCallback( DDPIXELFORMAT* pddpf, VOID* param );
|
|
|
|
/****************************************************************************
|
|
*
|
|
* TestAGP
|
|
*
|
|
****************************************************************************/
|
|
VOID TestD3Dv7(BOOL bUseTexture, HWND hwndMain, DisplayInfo* pDisplayInfo)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
TCHAR szPath[MAX_PATH];
|
|
HINSTANCE hInstDDraw = NULL;
|
|
LPDIRECTDRAWCREATEEX pDDCreateEx = NULL;
|
|
LPDIRECTDRAW7 pdd = NULL;
|
|
BOOL bTestHardwareRendering = FALSE;
|
|
TCHAR sz[300];
|
|
TCHAR szTitle[300];
|
|
|
|
if( pDisplayInfo == NULL )
|
|
return;
|
|
|
|
LoadString(NULL, IDS_APPFULLNAME, szTitle, MAX_PATH);
|
|
|
|
// Load ddraw.dll
|
|
GetSystemDirectory(szPath, MAX_PATH);
|
|
lstrcat(szPath, TEXT("\\ddraw.dll"));
|
|
hInstDDraw = LoadLibrary(szPath);
|
|
if (hInstDDraw == NULL)
|
|
{
|
|
pDisplayInfo->m_testResultD3D7.m_iStepThatFailed = TESTID_LOAD_DDRAW_DLL;
|
|
pDisplayInfo->m_testResultD3D7.m_hr = DDERR_NOTFOUND;
|
|
goto LEnd;
|
|
}
|
|
|
|
// Get DirectDrawCreate entry point
|
|
pDDCreateEx = (LPDIRECTDRAWCREATEEX)GetProcAddress(hInstDDraw, "DirectDrawCreateEx");
|
|
if (pDDCreateEx == NULL)
|
|
{
|
|
pDisplayInfo->m_testResultD3D7.m_iStepThatFailed = TESTID_GET_DIRECTDRAWCREATE;
|
|
pDisplayInfo->m_testResultD3D7.m_hr = DDERR_NOTFOUND;
|
|
goto LEnd;
|
|
}
|
|
|
|
// Call DirectDrawCreateEx
|
|
if (FAILED(hr = pDDCreateEx(&pDisplayInfo->m_guid, (void**)&pdd, IID_IDirectDraw7, NULL)))
|
|
{
|
|
pDisplayInfo->m_testResultD3D7.m_iStepThatFailed = TESTID_DIRECTDRAWCREATE;
|
|
pDisplayInfo->m_testResultD3D7.m_hr = hr;
|
|
goto LEnd;
|
|
}
|
|
|
|
// Get DirectDraw caps
|
|
DDCAPS ddcapsHAL;
|
|
DDCAPS ddcapsHEL;
|
|
ddcapsHAL.dwSize = sizeof(ddcapsHAL);
|
|
ddcapsHEL.dwSize = sizeof(ddcapsHEL);
|
|
if (FAILED(hr = pdd->GetCaps(&ddcapsHAL, &ddcapsHEL)))
|
|
{
|
|
pDisplayInfo->m_testResultD3D7.m_iStepThatFailed = TESTID_GETDEVICECAPS;
|
|
pDisplayInfo->m_testResultD3D7.m_hr = hr;
|
|
goto LEnd;
|
|
}
|
|
|
|
POINT ptMouse;
|
|
GetCursorPos(&ptMouse);
|
|
if (FAILED(hr = Test3D(bUseTexture, hwndMain, pdd, IID_IDirect3DHALDevice, &pDisplayInfo->m_testResultD3D7.m_iStepThatFailed)))
|
|
{
|
|
pDisplayInfo->m_testResultD3D7.m_hr = hr;
|
|
goto LEnd;
|
|
}
|
|
SetCursorPos( ptMouse.x, ptMouse.y );
|
|
ReleasePpo(&pdd);
|
|
|
|
if (pDisplayInfo->m_testResultD3D7.m_iStepThatFailed == TESTID_USER_CANCELLED)
|
|
{
|
|
LoadString(NULL, IDS_YOUCANCELLED, sz, 300);
|
|
MessageBox(hwndMain, sz, szTitle, MB_OK);
|
|
pDisplayInfo->m_testResultD3D7.m_bCancelled = TRUE;
|
|
goto LEnd;
|
|
}
|
|
|
|
LoadString(NULL, IDS_CONFIRMD3DTEST, sz, 300);
|
|
if (IDNO == MessageBox(hwndMain, sz, szTitle, MB_YESNO))
|
|
{
|
|
pDisplayInfo->m_testResultD3D7.m_iStepThatFailed = TESTID_USER_VERIFY_D3D7_RENDERING;
|
|
pDisplayInfo->m_testResultD3D7.m_hr = S_OK;
|
|
goto LEnd;
|
|
}
|
|
|
|
LEnd:
|
|
ReleasePpo(&pdd);
|
|
if (hInstDDraw != NULL)
|
|
FreeLibrary(hInstDDraw);
|
|
}
|
|
|
|
|
|
|
|
/****************************************************************************
|
|
*
|
|
* Test3D - Generate a spinning 3D cube
|
|
*
|
|
****************************************************************************/
|
|
HRESULT Test3D(BOOL bUseTexture, HWND hwndMain, LPDIRECTDRAW7 pdd, GUID guid3DDevice, LONG* piStepThatFailed)
|
|
{
|
|
HRESULT hr;
|
|
HWND hwnd = NULL;
|
|
LPDIRECTDRAWSURFACE7 pddsFront = NULL;
|
|
LPDIRECTDRAWSURFACE7 pddsBack = NULL;
|
|
LPDIRECT3D7 pd3d = NULL;
|
|
LPDIRECT3DDEVICE7 pd3ddev = NULL;
|
|
LPDIRECT3DLIGHT pLight = NULL;
|
|
LPDIRECTDRAWSURFACE7 pddsTexture = NULL;
|
|
BOOL bCooperativeLevelSet = FALSE;
|
|
BOOL bDisplayModeSet = FALSE;
|
|
DDSURFACEDESC2 ddsd;
|
|
D3DDEVICEDESC7 ddDesc;
|
|
DDSCAPS2 ddscaps;
|
|
D3DVIEWPORT7 vp;
|
|
D3DLIGHT7 lightdata;
|
|
D3DMATRIX mat;
|
|
D3DMATRIX matRotY;
|
|
D3DMATRIX matRotX;
|
|
RECT rcBack;
|
|
DWORD dwWidth;
|
|
DWORD dwHeight;
|
|
FLOAT fRotY;
|
|
FLOAT fRotX;
|
|
INT i;
|
|
|
|
static const D3DVERTEX vertexArrayFront[] =
|
|
{
|
|
D3DVERTEX(D3DVECTOR(-1.0, -1.0, -1.0), D3DVECTOR(0.0, 0.0, -1.0), 1.0f, 0.0f),
|
|
D3DVERTEX(D3DVECTOR( 1.0, -1.0, -1.0), D3DVECTOR(0.0, 0.0, -1.0), 0.0f, 0.0f),
|
|
D3DVERTEX(D3DVECTOR(-1.0, 1.0, -1.0), D3DVECTOR(0.0, 0.0, -1.0), 1.0f, 1.0f),
|
|
D3DVERTEX(D3DVECTOR( 1.0, 1.0, -1.0), D3DVECTOR(0.0, 0.0, -1.0), 0.0f, 1.0f),
|
|
};
|
|
static const WORD indexArrayFront[] =
|
|
{
|
|
0, 2, 1,
|
|
2, 3, 1,
|
|
};
|
|
|
|
static const D3DVERTEX vertexArrayBack[] =
|
|
{
|
|
D3DVERTEX(D3DVECTOR(-1.0, -1.0, 1.0), D3DVECTOR(0.0, 0.0, 1.0), 0.0f, 0.0f),
|
|
D3DVERTEX(D3DVECTOR( 1.0, -1.0, 1.0), D3DVECTOR(0.0, 0.0, 1.0), 1.0f, 0.0f),
|
|
D3DVERTEX(D3DVECTOR(-1.0, 1.0, 1.0), D3DVECTOR(0.0, 0.0, 1.0), 0.0f, 1.0f),
|
|
D3DVERTEX(D3DVECTOR( 1.0, 1.0, 1.0), D3DVECTOR(0.0, 0.0, 1.0), 1.0f, 1.0f),
|
|
};
|
|
static const WORD indexArrayBack[] =
|
|
{
|
|
0, 1, 2,
|
|
2, 1, 3,
|
|
};
|
|
|
|
static const D3DVERTEX vertexArrayLeft[] =
|
|
{
|
|
D3DVERTEX(D3DVECTOR(-1.0, -1.0, -1.0), D3DVECTOR(-1.0, 0.0, 0.0), 0.0f, 0.0f),
|
|
D3DVERTEX(D3DVECTOR(-1.0, -1.0, 1.0), D3DVECTOR(-1.0, 0.0, 0.0), 1.0f, 0.0f),
|
|
D3DVERTEX(D3DVECTOR(-1.0, 1.0, -1.0), D3DVECTOR(-1.0, 0.0, 0.0), 0.0f, 1.0f),
|
|
D3DVERTEX(D3DVECTOR(-1.0, 1.0, 1.0), D3DVECTOR(-1.0, 0.0, 0.0), 1.0f, 1.0f),
|
|
};
|
|
static const WORD indexArrayLeft[] =
|
|
{
|
|
0, 1, 2,
|
|
2, 1, 3,
|
|
};
|
|
|
|
static const D3DVERTEX vertexArrayRight[] =
|
|
{
|
|
D3DVERTEX(D3DVECTOR(1.0, -1.0, -1.0), D3DVECTOR(1.0, 0.0, 0.0), 1.0f, 0.0f),
|
|
D3DVERTEX(D3DVECTOR(1.0, -1.0, 1.0), D3DVECTOR(1.0, 0.0, 0.0), 0.0f, 0.0f),
|
|
D3DVERTEX(D3DVECTOR(1.0, 1.0, -1.0), D3DVECTOR(1.0, 0.0, 0.0), 1.0f, 1.0f),
|
|
D3DVERTEX(D3DVECTOR(1.0, 1.0, 1.0), D3DVECTOR(1.0, 0.0, 0.0), 0.0f, 1.0f),
|
|
};
|
|
static const WORD indexArrayRight[] =
|
|
{
|
|
0, 2, 1,
|
|
2, 3, 1,
|
|
};
|
|
|
|
static const D3DVERTEX vertexArrayTop[] =
|
|
{
|
|
D3DVERTEX(D3DVECTOR(-1.0, 1.0, -1.0), D3DVECTOR(0.0, 1.0, 0.0), 0.0f, 1.0f),
|
|
D3DVERTEX(D3DVECTOR( 1.0, 1.0, -1.0), D3DVECTOR(0.0, 1.0, 0.0), 1.0f, 1.0f),
|
|
D3DVERTEX(D3DVECTOR(-1.0, 1.0, 1.0), D3DVECTOR(0.0, 1.0, 0.0), 0.0f, 0.0f),
|
|
D3DVERTEX(D3DVECTOR( 1.0, 1.0, 1.0), D3DVECTOR(0.0, 1.0, 0.0), 1.0f, 0.0f),
|
|
};
|
|
static const WORD indexArrayTop[] =
|
|
{
|
|
0, 2, 1,
|
|
2, 3, 1,
|
|
};
|
|
|
|
static const D3DVERTEX vertexArrayBottom[] =
|
|
{
|
|
D3DVERTEX(D3DVECTOR(-1.0, -1.0, -1.0), D3DVECTOR(0.0, -1.0, 0.0), 1.0f, 1.0f),
|
|
D3DVERTEX(D3DVECTOR( 1.0, -1.0, -1.0), D3DVECTOR(0.0, -1.0, 0.0), 0.0f, 1.0f),
|
|
D3DVERTEX(D3DVECTOR(-1.0, -1.0, 1.0), D3DVECTOR(0.0, -1.0, 0.0), 1.0f, 0.0f),
|
|
D3DVERTEX(D3DVECTOR( 1.0, -1.0, 1.0), D3DVECTOR(0.0, -1.0, 0.0), 0.0f, 0.0f),
|
|
};
|
|
static const WORD indexArrayBottom[] =
|
|
{
|
|
0, 1, 2,
|
|
2, 1, 3,
|
|
};
|
|
|
|
D3DMATERIAL7 mtrlRed;
|
|
ZeroMemory( &mtrlRed, sizeof(D3DMATERIAL7) );
|
|
mtrlRed.dcvDiffuse.r = mtrlRed.dcvAmbient.r = 1.0f;
|
|
mtrlRed.dcvDiffuse.g = mtrlRed.dcvAmbient.g = 0.0f;
|
|
mtrlRed.dcvDiffuse.b = mtrlRed.dcvAmbient.b = 0.0f;
|
|
mtrlRed.dcvDiffuse.a = mtrlRed.dcvAmbient.a = 1.0f;
|
|
|
|
D3DMATERIAL7 mtrlGreen;
|
|
ZeroMemory( &mtrlGreen, sizeof(D3DMATERIAL7) );
|
|
mtrlGreen.dcvDiffuse.r = mtrlGreen.dcvAmbient.r = 0.0f;
|
|
mtrlGreen.dcvDiffuse.g = mtrlGreen.dcvAmbient.g = 1.0f;
|
|
mtrlGreen.dcvDiffuse.b = mtrlGreen.dcvAmbient.b = 0.0f;
|
|
mtrlGreen.dcvDiffuse.a = mtrlGreen.dcvAmbient.a = 1.0f;
|
|
|
|
D3DMATERIAL7 mtrlBlue;
|
|
ZeroMemory( &mtrlBlue, sizeof(D3DMATERIAL7) );
|
|
mtrlBlue.dcvDiffuse.r = mtrlBlue.dcvAmbient.r = 0.0f;
|
|
mtrlBlue.dcvDiffuse.g = mtrlBlue.dcvAmbient.g = 0.0f;
|
|
mtrlBlue.dcvDiffuse.b = mtrlBlue.dcvAmbient.b = 1.0f;
|
|
mtrlBlue.dcvDiffuse.a = mtrlBlue.dcvAmbient.a = 1.0f;
|
|
|
|
ShowCursor(FALSE);
|
|
|
|
// Create test window
|
|
if (FAILED(hr = CreateTestWindow(hwndMain, &hwnd)))
|
|
{
|
|
*piStepThatFailed = TESTID_CREATE_TEST_WINDOW;
|
|
goto LEnd;
|
|
}
|
|
|
|
// Set cooperative level
|
|
if (FAILED(hr = pdd->SetCooperativeLevel(hwnd,
|
|
DDSCL_ALLOWREBOOT | DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN)))
|
|
{
|
|
*piStepThatFailed = TESTID_SETCOOPERATIVELEVEL_FULLSCREEN;
|
|
goto LEnd;
|
|
}
|
|
bCooperativeLevelSet = TRUE;
|
|
|
|
// Set display mode
|
|
if (FAILED(hr = pdd->SetDisplayMode(640, 480, 16, 0, 0)))
|
|
{
|
|
TCHAR szMessage[300];
|
|
TCHAR szTitle[100];
|
|
pdd->SetCooperativeLevel(hwnd, DDSCL_NORMAL);
|
|
bCooperativeLevelSet = FALSE;
|
|
SendMessage(hwnd, WM_CLOSE, 0, 0);
|
|
hwnd = NULL;
|
|
LoadString(NULL, IDS_SETDISPLAYMODEFAILED, szMessage, 300);
|
|
LoadString(NULL, IDS_APPFULLNAME, szTitle, 100);
|
|
MessageBox(hwndMain, szMessage, szTitle, MB_OK);
|
|
*piStepThatFailed = TESTID_SETDISPLAYMODE;
|
|
goto LEnd;
|
|
}
|
|
bDisplayModeSet = TRUE;
|
|
|
|
// Create front/back buffers
|
|
ZeroMemory(&ddsd, sizeof(ddsd));
|
|
ddsd.dwSize = sizeof(ddsd);
|
|
ddsd.dwFlags = DDSD_CAPS | DDSD_BACKBUFFERCOUNT;
|
|
ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE | DDSCAPS_FLIP |
|
|
DDSCAPS_COMPLEX | DDSCAPS_3DDEVICE;
|
|
ddsd.dwBackBufferCount = 1;
|
|
if (FAILED(hr = pdd->CreateSurface(&ddsd, &pddsFront, NULL)))
|
|
{
|
|
*piStepThatFailed = TESTID_CREATEPRIMARYSURFACE_FLIP_ONEBACK;
|
|
goto LEnd;
|
|
}
|
|
if( NULL == pddsFront )
|
|
{
|
|
*piStepThatFailed = TESTID_CREATEPRIMARYSURFACE_FLIP_ONEBACK;
|
|
goto LEnd;
|
|
}
|
|
|
|
ddsd.dwFlags = DDSD_WIDTH | DDSD_HEIGHT;
|
|
if (FAILED(hr = pddsFront->GetSurfaceDesc(&ddsd)))
|
|
{
|
|
*piStepThatFailed = TESTID_GETDESC;
|
|
goto LEnd;
|
|
}
|
|
dwWidth = ddsd.dwWidth;
|
|
dwHeight = ddsd.dwHeight;
|
|
SetRect(&rcBack, 0, 0, dwWidth, dwHeight);
|
|
|
|
// Get ptr to back buffer
|
|
ZeroMemory( &ddscaps, sizeof(ddscaps) );
|
|
ddscaps.dwCaps = DDSCAPS_BACKBUFFER;
|
|
if (FAILED(hr = pddsFront->GetAttachedSurface(&ddscaps, &pddsBack)))
|
|
{
|
|
*piStepThatFailed = TESTID_GETATTACHEDSURFACE;
|
|
goto LEnd;
|
|
}
|
|
if( NULL == pddsBack )
|
|
{
|
|
*piStepThatFailed = TESTID_GETATTACHEDSURFACE;
|
|
goto LEnd;
|
|
}
|
|
|
|
// Note: no Z-buffer is created...backface culling works for this test
|
|
|
|
// Get D3D ptr
|
|
if (FAILED(hr = pdd->QueryInterface(IID_IDirect3D7, (VOID**)&pd3d)))
|
|
{
|
|
*piStepThatFailed = TESTID_QUERY_D3D;
|
|
goto LEnd;
|
|
}
|
|
if( NULL == pd3d )
|
|
{
|
|
*piStepThatFailed = TESTID_QUERY_D3D;
|
|
goto LEnd;
|
|
}
|
|
|
|
// Create device
|
|
if (FAILED(hr = pd3d->CreateDevice(guid3DDevice, pddsBack, &pd3ddev)))
|
|
{
|
|
*piStepThatFailed = TESTID_CREATE_DEVICE;
|
|
goto LEnd;
|
|
}
|
|
if( NULL == pd3ddev )
|
|
{
|
|
*piStepThatFailed = TESTID_CREATE_DEVICE;
|
|
goto LEnd;
|
|
}
|
|
|
|
// Set the viewport
|
|
vp.dwX = 0;
|
|
vp.dwY = 0;
|
|
vp.dwWidth = dwWidth;
|
|
vp.dwHeight = dwHeight;
|
|
vp.dvMinZ = 0.0f;
|
|
vp.dvMaxZ = 1.0f;
|
|
if (FAILED(hr = pd3ddev->SetViewport(&vp)))
|
|
{
|
|
*piStepThatFailed = TESTID_SETVIEWPORT;
|
|
goto LEnd;
|
|
}
|
|
|
|
// Add a light
|
|
ZeroMemory(&lightdata, sizeof(lightdata));
|
|
lightdata.dltType = D3DLIGHT_DIRECTIONAL;
|
|
lightdata.dcvDiffuse.r = 1.0f;
|
|
lightdata.dcvDiffuse.g = 1.0f;
|
|
lightdata.dcvDiffuse.b = 1.0f;
|
|
lightdata.dvDirection.x = 0.0f;
|
|
lightdata.dvDirection.y = 0.0f;
|
|
lightdata.dvDirection.z = 1.0f;
|
|
if (FAILED(hr = pd3ddev->SetLight( 0, &lightdata)))
|
|
{
|
|
*piStepThatFailed = TESTID_SETLIGHT;
|
|
goto LEnd;
|
|
}
|
|
if (FAILED(hr = pd3ddev->LightEnable(0, TRUE)))
|
|
{
|
|
*piStepThatFailed = TESTID_LIGHTENABLE;
|
|
goto LEnd;
|
|
}
|
|
|
|
// Set up matrices
|
|
mat = D3DMATRIX(1.0f, 0.0f, 0.0f, 0.0f,
|
|
0.0f, 1.0f, 0.0f, 0.0f,
|
|
0.0f, 0.0f, 1.0f, 0.0f,
|
|
0.0f, 0.0f, 0.0f, 1.0f);
|
|
if (FAILED(hr = pd3ddev->SetTransform(D3DTRANSFORMSTATE_WORLD, &mat)))
|
|
{
|
|
*piStepThatFailed = TESTID_SETTRANSFORM;
|
|
goto LEnd;
|
|
}
|
|
|
|
mat = D3DMATRIX(1.0f, 0.0f, 0.0f, 0.0f,
|
|
0.0f, 1.0f, 0.0f, 0.0f,
|
|
0.0f, 0.0f, 1.0f, 0.0f,
|
|
0.0f, 0.0f, 5.0f, 1.0f);
|
|
if (FAILED(hr = pd3ddev->SetTransform(D3DTRANSFORMSTATE_VIEW, &mat)))
|
|
{
|
|
*piStepThatFailed = TESTID_SETTRANSFORM;
|
|
goto LEnd;
|
|
}
|
|
|
|
D3DUtil_SetProjectionMatrix( mat, 60.0f * 3.14159f / 180.0f, (float) dwHeight / (float) dwWidth, 1.0f, 1000.0f );
|
|
if (FAILED(hr = pd3ddev->SetTransform(D3DTRANSFORMSTATE_PROJECTION, &mat)))
|
|
{
|
|
*piStepThatFailed = TESTID_SETTRANSFORM;
|
|
goto LEnd;
|
|
}
|
|
|
|
fRotY = 3.14f;
|
|
fRotX = 0.0f;
|
|
|
|
if (FAILED(hr = pd3ddev->SetRenderState(D3DRENDERSTATE_DITHERENABLE, TRUE)))
|
|
{
|
|
*piStepThatFailed = TESTID_SETRENDERSTATE;
|
|
goto LEnd;
|
|
}
|
|
if (FAILED(hr = pd3ddev->SetRenderState( D3DRENDERSTATE_AMBIENT, 0x40404040 )))
|
|
{
|
|
*piStepThatFailed = TESTID_SETRENDERSTATE;
|
|
goto LEnd;
|
|
}
|
|
|
|
if( bUseTexture )
|
|
{
|
|
D3DMATERIAL7 mtrl;
|
|
ZeroMemory( &mtrl, sizeof(D3DMATERIAL7) );
|
|
mtrl.dcvDiffuse.r = mtrl.dcvAmbient.r = 1.0f;
|
|
mtrl.dcvDiffuse.g = mtrl.dcvAmbient.g = 1.0f;
|
|
mtrl.dcvDiffuse.b = mtrl.dcvAmbient.b = 1.0f;
|
|
mtrl.dcvDiffuse.a = mtrl.dcvAmbient.a = 1.0f;
|
|
if (FAILED(hr = pd3ddev->SetMaterial( &mtrl )))
|
|
{
|
|
*piStepThatFailed = TESTID_SETRENDERSTATE;
|
|
goto LEnd;
|
|
}
|
|
|
|
if (FAILED(hr = CreateTexture( &pddsTexture, pdd, pd3ddev, TEXT("DIRECTX"), piStepThatFailed)))
|
|
goto LEnd;
|
|
|
|
if( FAILED( hr = pd3ddev->GetCaps( &ddDesc ) ) )
|
|
{
|
|
*piStepThatFailed = TESTID_GETDEVICECAPS;
|
|
goto LEnd;
|
|
}
|
|
|
|
if( ddDesc.dpcTriCaps.dwTextureFilterCaps & D3DPTFILTERCAPS_MINFLINEAR )
|
|
{
|
|
if (FAILED(hr = pd3ddev->SetTextureStageState( 0, D3DTSS_MINFILTER, D3DTFN_LINEAR )))
|
|
{
|
|
*piStepThatFailed = TESTID_SETTEXTURESTAGESTATE;
|
|
goto LEnd;
|
|
}
|
|
}
|
|
if( ddDesc.dpcTriCaps.dwTextureFilterCaps & D3DPTFILTERCAPS_MAGFPOINT )
|
|
{
|
|
if (FAILED(hr = pd3ddev->SetTextureStageState( 0, D3DTSS_MAGFILTER, D3DTFN_LINEAR )))
|
|
{
|
|
*piStepThatFailed = TESTID_SETTEXTURESTAGESTATE;
|
|
goto LEnd;
|
|
}
|
|
}
|
|
|
|
if (FAILED(hr = pd3ddev->SetTexture( 0, pddsTexture )))
|
|
{
|
|
*piStepThatFailed = TESTID_SETTEXTURE;
|
|
goto LEnd;
|
|
}
|
|
}
|
|
|
|
// Here's the draw loop:
|
|
MSG msg;
|
|
for (i = 0; i < 600; i++)
|
|
{
|
|
if (PeekMessage(&msg, hwnd, WM_KEYDOWN, WM_KEYDOWN, PM_REMOVE))
|
|
{
|
|
*piStepThatFailed = TESTID_USER_CANCELLED;
|
|
goto LEnd;
|
|
}
|
|
matRotY = D3DMATRIX((FLOAT)cos(fRotY), 0.0f, (FLOAT)sin(fRotY), 0.0f,
|
|
0.0f, 1.0f, 0.0f, 0.0f,
|
|
(FLOAT)-sin(fRotY), 0.0f, (FLOAT)cos(fRotY), 0.0f,
|
|
0.0f, 0.0f, 0.0f, 1.0f);
|
|
|
|
matRotX = D3DMATRIX(1.0f, 0.0f, 0.0f, 0.0f,
|
|
0.0f, (FLOAT)cos(fRotX), (FLOAT)sin(fRotX), 0.0f,
|
|
0.0f, (FLOAT)-sin(fRotX), (FLOAT)cos(fRotX), 0.0f,
|
|
0.0f, 0.0f, 0.0f, 1.0f);
|
|
mat = matRotY * matRotX;
|
|
if (FAILED(hr = pd3ddev->SetTransform(D3DTRANSFORMSTATE_WORLD, &mat)))
|
|
{
|
|
*piStepThatFailed = TESTID_SETTRANSFORM;
|
|
goto LEnd;
|
|
}
|
|
if (FAILED(hr = pd3ddev->Clear( 0, NULL, D3DCLEAR_TARGET,
|
|
0x00000000, 1.0f, 0L )))
|
|
{
|
|
*piStepThatFailed = TESTID_VIEWPORT_CLEAR;
|
|
goto LEnd;
|
|
}
|
|
if (FAILED(hr = pd3ddev->BeginScene()))
|
|
{
|
|
if( hr == DDERR_SURFACELOST )
|
|
{
|
|
*piStepThatFailed = TESTID_USER_CANCELLED;
|
|
hr = S_OK;
|
|
}
|
|
else
|
|
*piStepThatFailed = TESTID_BEGINSCENE;
|
|
goto LEnd;
|
|
}
|
|
|
|
if( !bUseTexture )
|
|
{
|
|
if (FAILED(hr = pd3ddev->SetMaterial( &mtrlGreen )))
|
|
{
|
|
*piStepThatFailed = TESTID_SETRENDERSTATE;
|
|
goto LEnd;
|
|
}
|
|
}
|
|
|
|
if (FAILED(hr = pd3ddev->DrawIndexedPrimitive(D3DPT_TRIANGLELIST,
|
|
D3DFVF_VERTEX, (VOID*)vertexArrayFront, 4, (WORD*)indexArrayFront, 6, 0)))
|
|
{
|
|
*piStepThatFailed = TESTID_DRAW_INDEXED_PRIMITIVE;
|
|
goto LEnd;
|
|
}
|
|
if (FAILED(hr = pd3ddev->DrawIndexedPrimitive(D3DPT_TRIANGLELIST,
|
|
D3DFVF_VERTEX, (VOID*)vertexArrayBack, 4, (WORD*)indexArrayBack, 6, 0)))
|
|
{
|
|
*piStepThatFailed = TESTID_DRAW_INDEXED_PRIMITIVE;
|
|
goto LEnd;
|
|
}
|
|
|
|
if( !bUseTexture )
|
|
{
|
|
if (FAILED(hr = pd3ddev->SetMaterial( &mtrlRed )))
|
|
{
|
|
*piStepThatFailed = TESTID_SETRENDERSTATE;
|
|
goto LEnd;
|
|
}
|
|
}
|
|
|
|
if (FAILED(hr = pd3ddev->DrawIndexedPrimitive(D3DPT_TRIANGLELIST,
|
|
D3DFVF_VERTEX, (VOID*)vertexArrayLeft, 4, (WORD*)indexArrayLeft, 6, 0)))
|
|
{
|
|
*piStepThatFailed = TESTID_DRAW_INDEXED_PRIMITIVE;
|
|
goto LEnd;
|
|
}
|
|
if (FAILED(hr = pd3ddev->DrawIndexedPrimitive(D3DPT_TRIANGLELIST,
|
|
D3DFVF_VERTEX, (VOID*)vertexArrayRight, 4, (WORD*)indexArrayRight, 6, 0)))
|
|
{
|
|
*piStepThatFailed = TESTID_DRAW_INDEXED_PRIMITIVE;
|
|
goto LEnd;
|
|
}
|
|
|
|
if( !bUseTexture )
|
|
{
|
|
if (FAILED(hr = pd3ddev->SetMaterial( &mtrlBlue )))
|
|
{
|
|
*piStepThatFailed = TESTID_SETRENDERSTATE;
|
|
goto LEnd;
|
|
}
|
|
}
|
|
|
|
if (FAILED(hr = pd3ddev->DrawIndexedPrimitive(D3DPT_TRIANGLELIST,
|
|
D3DFVF_VERTEX, (VOID*)vertexArrayTop, 4, (WORD*)indexArrayTop, 6, 0)))
|
|
{
|
|
*piStepThatFailed = TESTID_DRAW_INDEXED_PRIMITIVE;
|
|
goto LEnd;
|
|
}
|
|
if (FAILED(hr = pd3ddev->DrawIndexedPrimitive(D3DPT_TRIANGLELIST,
|
|
D3DFVF_VERTEX, (VOID*)vertexArrayBottom, 4, (WORD*)indexArrayBottom, 6, 0)))
|
|
{
|
|
*piStepThatFailed = TESTID_DRAW_INDEXED_PRIMITIVE;
|
|
goto LEnd;
|
|
}
|
|
|
|
if (FAILED(hr = pd3ddev->EndScene()))
|
|
{
|
|
*piStepThatFailed = TESTID_ENDSCENE;
|
|
goto LEnd;
|
|
}
|
|
if (FAILED(hr = pddsFront->Flip(NULL, DDFLIP_WAIT)))
|
|
{
|
|
*piStepThatFailed = TESTID_PRESENT;
|
|
goto LEnd;
|
|
}
|
|
fRotY += 0.05f;
|
|
fRotX += 0.02f;
|
|
Sleep(10);
|
|
}
|
|
|
|
LEnd:
|
|
ShowCursor(TRUE);
|
|
ReleasePpo(&pddsTexture);
|
|
ReleasePpo(&pd3ddev);
|
|
ReleasePpo(&pd3d);
|
|
ReleasePpo(&pddsBack);
|
|
ReleasePpo(&pddsFront);
|
|
if (bCooperativeLevelSet)
|
|
{
|
|
if (FAILED(hr))
|
|
{
|
|
// Something has already failed, so report that failure
|
|
// rather than any failure of SetCooperativeLevel
|
|
pdd->SetCooperativeLevel(hwnd, DDSCL_NORMAL);
|
|
}
|
|
else
|
|
{
|
|
if (FAILED(hr = pdd->SetCooperativeLevel(hwnd, DDSCL_NORMAL)))
|
|
{
|
|
*piStepThatFailed = TESTID_SETCOOPERATIVELEVEL_NORMAL;
|
|
}
|
|
}
|
|
}
|
|
if (hwnd != NULL)
|
|
SendMessage(hwnd, WM_CLOSE, 0, 0);
|
|
if (bDisplayModeSet)
|
|
{
|
|
if (FAILED(hr))
|
|
{
|
|
// Something has already failed, so report that failure
|
|
// rather than any failure of RestoreDisplayMode
|
|
pdd->RestoreDisplayMode();
|
|
}
|
|
else
|
|
{
|
|
// Nothing has failed yet, so report any failure of RestoreDisplayMode
|
|
if (FAILED(hr = pdd->RestoreDisplayMode()))
|
|
return hr;
|
|
}
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
|
|
/****************************************************************************
|
|
*
|
|
* CreateTestWindow
|
|
*
|
|
****************************************************************************/
|
|
HRESULT CreateTestWindow(HWND hwndMain, HWND* phwnd)
|
|
{
|
|
static BOOL bClassRegistered = FALSE;
|
|
WNDCLASS wndClass;
|
|
TCHAR* pszClass = TEXT("DxDiag AGP7 Test Window"); // Don't need to localize
|
|
HINSTANCE hInst = (HINSTANCE)GetWindowLongPtr(hwndMain, GWLP_HINSTANCE);
|
|
TCHAR szTitle[200];
|
|
|
|
if (!bClassRegistered)
|
|
{
|
|
ZeroMemory(&wndClass, sizeof(wndClass));
|
|
wndClass.style = CS_HREDRAW | CS_VREDRAW;
|
|
wndClass.lpfnWndProc = DefWindowProc;
|
|
wndClass.cbClsExtra = 0;
|
|
wndClass.cbWndExtra = 0;
|
|
wndClass.hInstance = hInst;
|
|
wndClass.hIcon = NULL;
|
|
wndClass.hCursor = NULL;
|
|
wndClass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
|
|
wndClass.lpszMenuName = NULL;
|
|
wndClass.lpszClassName = pszClass;
|
|
if (NULL == RegisterClass(&wndClass))
|
|
return E_FAIL;
|
|
bClassRegistered = TRUE;
|
|
}
|
|
|
|
LoadString(NULL, IDS_APPFULLNAME, szTitle, 200);
|
|
*phwnd = CreateWindow(pszClass, szTitle, WS_OVERLAPPED,
|
|
0, 0, 0, 0, hwndMain, NULL, hInst, NULL);
|
|
if (*phwnd == NULL)
|
|
return E_FAIL;
|
|
|
|
ShowWindow(*phwnd, SW_SHOW);
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Name: D3DUtil_SetProjectionMatrix()
|
|
// Desc: Sets the passed in 4x4 matrix to a perpsective projection matrix built
|
|
// from the field-of-view (fov, in y), aspect ratio, near plane (D),
|
|
// and far plane (F). Note that the projection matrix is normalized for
|
|
// element [3][4] to be 1.0. This is performed so that W-based range fog
|
|
// will work correctly.
|
|
//-----------------------------------------------------------------------------
|
|
HRESULT D3DUtil_SetProjectionMatrix( D3DMATRIX& mat, FLOAT fFOV, FLOAT fAspect,
|
|
FLOAT fNearPlane, FLOAT fFarPlane )
|
|
{
|
|
if( fabs(fFarPlane-fNearPlane) < 0.01f )
|
|
return E_INVALIDARG;
|
|
if( fabs(sin(fFOV/2)) < 0.01f )
|
|
return E_INVALIDARG;
|
|
|
|
FLOAT w = fAspect * ( cosf(fFOV/2)/sinf(fFOV/2) );
|
|
FLOAT h = 1.0f * ( cosf(fFOV/2)/sinf(fFOV/2) );
|
|
FLOAT Q = fFarPlane / ( fFarPlane - fNearPlane );
|
|
|
|
ZeroMemory( &mat, sizeof(D3DMATRIX) );
|
|
mat._11 = w;
|
|
mat._22 = h;
|
|
mat._33 = Q;
|
|
mat._34 = 1.0f;
|
|
mat._43 = -Q*fNearPlane;
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Name: TextureSearchCallback()
|
|
// Desc: Enumeration callback routine to find a 16-bit texture format. This
|
|
// function is invoked by the ID3DDevice::EnumTextureFormats() function
|
|
// to sort through all the available texture formats for a given device.
|
|
// The pixel format of each enumerated texture format is passed into the
|
|
// "pddpf" parameter. The 2nd parameter is to be used however the app
|
|
// sees fit. In this case, we are using it as an output parameter to
|
|
// return a normal 16-bit texture format.
|
|
//-----------------------------------------------------------------------------
|
|
static HRESULT CALLBACK TextureSearchCallback( DDPIXELFORMAT* pddpf, VOID* param )
|
|
{
|
|
// Note: Return with DDENUMRET_OK to continue enumerating more formats.
|
|
|
|
// Skip any funky modes
|
|
if( pddpf->dwFlags & (DDPF_LUMINANCE|DDPF_BUMPLUMINANCE|DDPF_BUMPDUDV) )
|
|
return DDENUMRET_OK;
|
|
|
|
// Skip any FourCC formats
|
|
if( pddpf->dwFourCC != 0 )
|
|
return DDENUMRET_OK;
|
|
|
|
// Skip alpha modes
|
|
if( pddpf->dwFlags&DDPF_ALPHAPIXELS )
|
|
return DDENUMRET_OK;
|
|
|
|
// We only want certain format, so skip all others
|
|
if( pddpf->dwRGBBitCount == 32 && ((DDPIXELFORMAT*)param)->dwRGBBitCount == 0 ||
|
|
pddpf->dwRGBBitCount == 16 )
|
|
{
|
|
// We found a good match. Copy the current pixel format to our output
|
|
// parameter
|
|
memcpy( (DDPIXELFORMAT*)param, pddpf, sizeof(DDPIXELFORMAT) );
|
|
}
|
|
|
|
// Have we found the best match?
|
|
if( pddpf->dwRGBBitCount == 16 )
|
|
return DDENUMRET_CANCEL;
|
|
|
|
// Keep looking.
|
|
return DDENUMRET_OK;
|
|
}
|
|
|
|
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Name: CreateTexture()
|
|
// Desc: Is passed a filename and creates a local Bitmap from that file. Some
|
|
// logic and file parsing code could go here to support other image
|
|
// file formats.
|
|
//-----------------------------------------------------------------------------
|
|
HRESULT CreateTexture( LPDIRECTDRAWSURFACE7* ppdds,
|
|
LPDIRECTDRAW7 pdd, LPDIRECT3DDEVICE7 pd3dDevice,
|
|
TCHAR* strName, LONG* piStepThatFailed)
|
|
{
|
|
HRESULT hr;
|
|
LPDIRECTDRAWSURFACE7 pddsTexture = NULL;
|
|
HBITMAP hbm = NULL;
|
|
D3DDEVICEDESC7 ddDesc;
|
|
BITMAP bm;
|
|
DWORD dwWidth;
|
|
DWORD dwHeight;
|
|
DDSURFACEDESC2 ddsd;
|
|
LPDIRECTDRAWSURFACE7 pddsRender = NULL;
|
|
HDC hdcTexture = NULL;
|
|
HDC hdcBitmap = NULL;
|
|
|
|
//////////////////////////////////////////////
|
|
// Verify args
|
|
//////////////////////////////////////////////
|
|
if( NULL == ppdds ||
|
|
NULL == pdd ||
|
|
NULL == pd3dDevice ||
|
|
NULL == strName ||
|
|
NULL == piStepThatFailed )
|
|
{
|
|
// Unknown error - shouldn't happen, but this prevent crashs
|
|
*piStepThatFailed = 0xFFFF;
|
|
return E_FAIL;
|
|
}
|
|
|
|
//////////////////////////////////////////////
|
|
// Load image
|
|
//////////////////////////////////////////////
|
|
hbm = (HBITMAP)LoadImage( GetModuleHandle(NULL), strName,
|
|
IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION );
|
|
if( NULL == hbm )
|
|
{
|
|
*piStepThatFailed = TESTID_CREATETEXTURE;
|
|
hr = E_FAIL;
|
|
goto LEnd;
|
|
}
|
|
|
|
//////////////////////////////////////////////
|
|
// Get caps on device and hbm
|
|
//////////////////////////////////////////////
|
|
if( FAILED( hr = pd3dDevice->GetCaps( &ddDesc ) ) )
|
|
{
|
|
*piStepThatFailed = TESTID_GETDEVICECAPS;
|
|
goto LEnd;
|
|
}
|
|
|
|
if( 0 == GetObject( hbm, sizeof(BITMAP), &bm ) )
|
|
{
|
|
*piStepThatFailed = TESTID_CREATETEXTURE;
|
|
hr = E_FAIL;
|
|
goto LEnd;
|
|
}
|
|
|
|
dwWidth = (DWORD)bm.bmWidth;
|
|
dwHeight = (DWORD)bm.bmHeight;
|
|
|
|
//////////////////////////////////////////////
|
|
// Setup the new surface desc for the texture.
|
|
//////////////////////////////////////////////
|
|
ZeroMemory( &ddsd, sizeof(DDSURFACEDESC2) );
|
|
ddsd.dwSize = sizeof(DDSURFACEDESC2);
|
|
ddsd.dwFlags = DDSD_CAPS|DDSD_HEIGHT|DDSD_WIDTH|
|
|
DDSD_PIXELFORMAT|DDSD_TEXTURESTAGE;
|
|
ddsd.ddsCaps.dwCaps = DDSCAPS_TEXTURE|DDSCAPS_VIDEOMEMORY|DDSCAPS_NONLOCALVIDMEM;
|
|
ddsd.dwWidth = dwWidth;
|
|
ddsd.dwHeight = dwHeight;
|
|
|
|
// Adjust width and height, if the driver requires it
|
|
if( ddDesc.dpcTriCaps.dwTextureCaps & D3DPTEXTURECAPS_POW2 )
|
|
{
|
|
for( ddsd.dwWidth=1; dwWidth>ddsd.dwWidth; ddsd.dwWidth<<=1 );
|
|
for( ddsd.dwHeight=1; dwHeight>ddsd.dwHeight; ddsd.dwHeight<<=1 );
|
|
}
|
|
if( ddDesc.dpcTriCaps.dwTextureCaps & D3DPTEXTURECAPS_SQUAREONLY )
|
|
{
|
|
if( ddsd.dwWidth > ddsd.dwHeight )
|
|
ddsd.dwHeight = ddsd.dwWidth;
|
|
else
|
|
ddsd.dwWidth = ddsd.dwHeight;
|
|
}
|
|
|
|
// Look for a 16-bit texture format
|
|
if( FAILED( hr = pd3dDevice->EnumTextureFormats( TextureSearchCallback,
|
|
&ddsd.ddpfPixelFormat ) ) )
|
|
{
|
|
*piStepThatFailed = TESTID_ENUMTEXTUREFORMATS;
|
|
goto LEnd;
|
|
}
|
|
if( 0L == ddsd.ddpfPixelFormat.dwRGBBitCount )
|
|
{
|
|
*piStepThatFailed = TESTID_ENUMTEXTUREFORMATS;
|
|
goto LEnd;
|
|
}
|
|
|
|
//////////////////////////////////////////////
|
|
// Create a new surface for the texture
|
|
//////////////////////////////////////////////
|
|
if( FAILED( hr = pdd->CreateSurface( &ddsd, &pddsTexture, NULL ) ) )
|
|
{
|
|
ddsd.ddsCaps.dwCaps = DDSCAPS_TEXTURE;
|
|
if( FAILED( hr = pdd->CreateSurface( &ddsd, &pddsTexture, NULL ) ) )
|
|
{
|
|
*piStepThatFailed = TESTID_CREATESURFACE;
|
|
goto LEnd;
|
|
}
|
|
}
|
|
if( NULL == pddsTexture )
|
|
{
|
|
*piStepThatFailed = TESTID_CREATESURFACE;
|
|
hr = E_FAIL;
|
|
goto LEnd;
|
|
}
|
|
|
|
//////////////////////////////////////////////
|
|
// Get DCs from bitmap and surface
|
|
//////////////////////////////////////////////
|
|
hdcBitmap = CreateCompatibleDC( NULL );
|
|
if( NULL == hdcBitmap )
|
|
{
|
|
*piStepThatFailed = TESTID_CREATETEXTURE;
|
|
hr = E_FAIL;
|
|
goto LEnd;
|
|
}
|
|
|
|
if( NULL == SelectObject( hdcBitmap, hbm ) )
|
|
{
|
|
*piStepThatFailed = TESTID_CREATETEXTURE;
|
|
hr = E_FAIL;
|
|
goto LEnd;
|
|
}
|
|
|
|
// Get a DC for the surface
|
|
if( FAILED( hr = pddsTexture->GetDC( &hdcTexture ) ) )
|
|
{
|
|
*piStepThatFailed = TESTID_GETDC;
|
|
goto LEnd;
|
|
}
|
|
if( NULL == hdcTexture )
|
|
{
|
|
*piStepThatFailed = TESTID_GETDC;
|
|
goto LEnd;
|
|
}
|
|
|
|
//////////////////////////////////////////////
|
|
// Copy the bitmap image to the surface.
|
|
//////////////////////////////////////////////
|
|
if( 0 == BitBlt( hdcTexture, 0, 0, bm.bmWidth, bm.bmHeight, hdcBitmap,
|
|
0, 0, SRCCOPY ) )
|
|
{
|
|
if( pddsTexture )
|
|
{
|
|
// Try to release the DC first
|
|
pddsTexture->ReleaseDC( hdcTexture );
|
|
}
|
|
|
|
*piStepThatFailed = TESTID_CREATETEXTURE;
|
|
hr = E_FAIL;
|
|
goto LEnd;
|
|
}
|
|
|
|
//////////////////////////////////////////////
|
|
// Cleanup
|
|
//////////////////////////////////////////////
|
|
if( FAILED( hr = pddsTexture->ReleaseDC( hdcTexture ) ) )
|
|
{
|
|
*piStepThatFailed = TESTID_RELEASEDC;
|
|
goto LEnd;
|
|
}
|
|
|
|
|
|
LEnd:
|
|
if( hdcBitmap )
|
|
DeleteDC( hdcBitmap );
|
|
if( hbm )
|
|
DeleteObject( hbm );
|
|
|
|
// Return the newly created texture
|
|
// pddsTexture will be cleaned up in parent fn.
|
|
*ppdds = pddsTexture;
|
|
|
|
return hr;
|
|
}
|
|
|
|
|
|
|
|
|