2007-02-16 18:08:28 +00:00
/*
2008-07-23 20:49:14 +00:00
* Copyright 2005 , 2007 - 2008 Henri Verbeet
2008-10-18 17:19:23 +00:00
* Copyright ( C ) 2007 - 2008 Stefan Dösinger ( for CodeWeavers )
2008-03-21 16:10:44 +00:00
* Copyright ( C ) 2008 Jason Green ( for TransGaming )
2007-02-16 18:08:28 +00:00
*
* This library is free software ; you can redistribute it and / or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation ; either
* version 2.1 of the License , or ( at your option ) any later version .
*
* This library is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the GNU
* Lesser General Public License for more details .
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library ; if not , write to the Free Software
* Foundation , Inc . , 51 Franklin St , Fifth Floor , Boston , MA 02110 - 1301 , USA
*/
/* This test framework allows limited testing of rendering results. Things are rendered, shown on
* the framebuffer , read back from there and compared to expected colors .
*
2007-02-20 14:57:10 +00:00
* However , neither d3d nor opengl is guaranteed to be pixel exact , and thus the capability of this test
* is rather limited . As a general guideline for adding tests , do not rely on corner pixels . Draw a big enough
2007-12-07 00:03:54 +00:00
* area which shows specific behavior ( like a quad on the whole screen ) , and try to get resulting colors with
2007-02-16 18:08:28 +00:00
* all bits set or unset in all channels ( like pure red , green , blue , white , black ) . Hopefully everything that
* causes visible results in games can be tested in a way that does not depend on pixel exactness
*/
# define COBJMACROS
# include <d3d9.h>
# include "wine/test.h"
static HMODULE d3d9_handle = 0 ;
static HWND create_window ( void )
{
WNDCLASS wc = { 0 } ;
HWND ret ;
2008-06-04 03:04:20 +00:00
wc . lpfnWndProc = DefWindowProc ;
2007-02-16 18:08:28 +00:00
wc . lpszClassName = " d3d9_test_wc " ;
RegisterClass ( & wc ) ;
ret = CreateWindow ( " d3d9_test_wc " , " d3d9_test " ,
WS_MAXIMIZE | WS_VISIBLE | WS_CAPTION , 0 , 0 , 640 , 480 , 0 , 0 , 0 , 0 ) ;
return ret ;
}
2008-05-24 08:33:42 +00:00
static BOOL color_match ( D3DCOLOR c1 , D3DCOLOR c2 , BYTE max_diff )
{
if ( abs ( ( c1 & 0xff ) - ( c2 & 0xff ) ) > max_diff ) return FALSE ;
c1 > > = 8 ; c2 > > = 8 ;
if ( abs ( ( c1 & 0xff ) - ( c2 & 0xff ) ) > max_diff ) return FALSE ;
c1 > > = 8 ; c2 > > = 8 ;
if ( abs ( ( c1 & 0xff ) - ( c2 & 0xff ) ) > max_diff ) return FALSE ;
c1 > > = 8 ; c2 > > = 8 ;
if ( abs ( ( c1 & 0xff ) - ( c2 & 0xff ) ) > max_diff ) return FALSE ;
return TRUE ;
}
2008-04-01 05:20:44 +00:00
/* Locks a given surface and returns the color at (x,y). It's the caller's
* responsibility to only pass in lockable surfaces and valid x , y coordinates */
static DWORD getPixelColorFromSurface ( IDirect3DSurface9 * surface , UINT x , UINT y )
{
DWORD color ;
HRESULT hr ;
D3DSURFACE_DESC desc ;
RECT rectToLock = { x , y , x + 1 , y + 1 } ;
D3DLOCKED_RECT lockedRect ;
hr = IDirect3DSurface9_GetDesc ( surface , & desc ) ;
if ( FAILED ( hr ) ) /* This is not a test */
{
2008-07-08 15:48:50 +00:00
trace ( " Can't get the surface description, hr=%08x \n " , hr ) ;
2008-04-01 05:20:44 +00:00
return 0xdeadbeef ;
}
hr = IDirect3DSurface9_LockRect ( surface , & lockedRect , & rectToLock , D3DLOCK_READONLY ) ;
if ( FAILED ( hr ) ) /* This is not a test */
{
2008-07-08 15:48:50 +00:00
trace ( " Can't lock the surface, hr=%08x \n " , hr ) ;
2008-04-01 05:20:44 +00:00
return 0xdeadbeef ;
}
switch ( desc . Format ) {
case D3DFMT_A8R8G8B8 :
{
color = ( ( DWORD * ) lockedRect . pBits ) [ 0 ] & 0xffffffff ;
break ;
}
default :
trace ( " Error: unknown surface format: %d \n " , desc . Format ) ;
color = 0xdeadbeef ;
break ;
}
hr = IDirect3DSurface9_UnlockRect ( surface ) ;
if ( FAILED ( hr ) )
{
2008-07-08 15:48:50 +00:00
trace ( " Can't unlock the surface, hr=%08x \n " , hr ) ;
2008-04-01 05:20:44 +00:00
}
return color ;
}
2007-02-16 18:08:28 +00:00
static DWORD getPixelColor ( IDirect3DDevice9 * device , UINT x , UINT y )
{
DWORD ret ;
IDirect3DSurface9 * surf ;
HRESULT hr ;
D3DLOCKED_RECT lockedRect ;
RECT rectToLock = { x , y , x + 1 , y + 1 } ;
hr = IDirect3DDevice9_CreateOffscreenPlainSurface ( device , 640 , 480 , D3DFMT_A8R8G8B8 , D3DPOOL_SYSTEMMEM , & surf , NULL ) ;
if ( FAILED ( hr ) | | ! surf ) /* This is not a test */
{
2008-07-08 15:48:50 +00:00
trace ( " Can't create an offscreen plain surface to read the render target data, hr=%08x \n " , hr ) ;
2007-02-16 18:08:28 +00:00
return 0xdeadbeef ;
}
hr = IDirect3DDevice9_GetFrontBufferData ( device , 0 , surf ) ;
if ( FAILED ( hr ) )
{
2008-07-08 15:48:50 +00:00
trace ( " Can't read the front buffer data, hr=%08x \n " , hr ) ;
2007-02-16 18:08:28 +00:00
ret = 0xdeadbeed ;
goto out ;
}
hr = IDirect3DSurface9_LockRect ( surf , & lockedRect , & rectToLock , D3DLOCK_READONLY ) ;
if ( FAILED ( hr ) )
{
2008-07-08 15:48:50 +00:00
trace ( " Can't lock the offscreen surface, hr=%08x \n " , hr ) ;
2007-02-16 18:08:28 +00:00
ret = 0xdeadbeec ;
goto out ;
}
/* Remove the X channel for now. DirectX and OpenGL have different ideas how to treat it apparently, and it isn't
* really important for these tests
*/
ret = ( ( DWORD * ) lockedRect . pBits ) [ 0 ] & 0x00ffffff ;
hr = IDirect3DSurface9_UnlockRect ( surf ) ;
if ( FAILED ( hr ) )
{
2008-07-08 15:48:50 +00:00
trace ( " Can't unlock the offscreen surface, hr=%08x \n " , hr ) ;
2007-02-16 18:08:28 +00:00
}
out :
if ( surf ) IDirect3DSurface9_Release ( surf ) ;
return ret ;
}
static IDirect3DDevice9 * init_d3d9 ( void )
{
IDirect3D9 * ( __stdcall * d3d9_create ) ( UINT SDKVersion ) = 0 ;
IDirect3D9 * d3d9_ptr = 0 ;
IDirect3DDevice9 * device_ptr = 0 ;
D3DPRESENT_PARAMETERS present_parameters ;
HRESULT hr ;
2008-04-23 23:09:49 +00:00
D3DADAPTER_IDENTIFIER9 identifier ;
2007-02-16 18:08:28 +00:00
d3d9_create = ( void * ) GetProcAddress ( d3d9_handle , " Direct3DCreate9 " ) ;
ok ( d3d9_create ! = NULL , " Failed to get address of Direct3DCreate9 \n " ) ;
if ( ! d3d9_create ) return NULL ;
d3d9_ptr = d3d9_create ( D3D_SDK_VERSION ) ;
2008-12-03 17:00:40 +00:00
if ( ! d3d9_ptr )
{
skip ( " could not create D3D9 \n " ) ;
return NULL ;
}
2007-02-16 18:08:28 +00:00
ZeroMemory ( & present_parameters , sizeof ( present_parameters ) ) ;
present_parameters . Windowed = FALSE ;
present_parameters . hDeviceWindow = create_window ( ) ;
present_parameters . SwapEffect = D3DSWAPEFFECT_DISCARD ;
present_parameters . BackBufferWidth = 640 ;
present_parameters . BackBufferHeight = 480 ;
2008-05-24 08:33:20 +00:00
present_parameters . BackBufferFormat = D3DFMT_A8R8G8B8 ;
2007-06-14 09:18:03 +00:00
present_parameters . EnableAutoDepthStencil = TRUE ;
2008-02-17 22:31:55 +00:00
present_parameters . AutoDepthStencilFormat = D3DFMT_D24S8 ;
2007-02-16 18:08:28 +00:00
2008-04-23 23:09:49 +00:00
memset ( & identifier , 0 , sizeof ( identifier ) ) ;
hr = IDirect3D9_GetAdapterIdentifier ( d3d9_ptr , 0 , 0 , & identifier ) ;
ok ( hr = = D3D_OK , " Failed to get adapter identifier description \n " ) ;
trace ( " Driver string: \" %s \" \n " , identifier . Driver ) ;
trace ( " Description string: \" %s \" \n " , identifier . Description ) ;
trace ( " Device name string: \" %s \" \n " , identifier . DeviceName ) ;
trace ( " Driver version %d.%d.%d.%d \n " ,
2008-05-06 13:57:30 +00:00
HIWORD ( U ( identifier . DriverVersion ) . HighPart ) , LOWORD ( U ( identifier . DriverVersion ) . HighPart ) ,
HIWORD ( U ( identifier . DriverVersion ) . LowPart ) , LOWORD ( U ( identifier . DriverVersion ) . LowPart ) ) ;
2008-04-23 23:09:49 +00:00
2008-04-05 21:21:22 +00:00
hr = IDirect3D9_CreateDevice ( d3d9_ptr , D3DADAPTER_DEFAULT , D3DDEVTYPE_HAL , present_parameters . hDeviceWindow , D3DCREATE_HARDWARE_VERTEXPROCESSING , & present_parameters , & device_ptr ) ;
2008-02-17 22:31:55 +00:00
if ( FAILED ( hr ) ) {
present_parameters . AutoDepthStencilFormat = D3DFMT_D16 ;
2008-04-05 21:21:22 +00:00
hr = IDirect3D9_CreateDevice ( d3d9_ptr , D3DADAPTER_DEFAULT , D3DDEVTYPE_HAL , present_parameters . hDeviceWindow , D3DCREATE_HARDWARE_VERTEXPROCESSING , & present_parameters , & device_ptr ) ;
if ( FAILED ( hr ) ) {
hr = IDirect3D9_CreateDevice ( d3d9_ptr , D3DADAPTER_DEFAULT , D3DDEVTYPE_HAL , present_parameters . hDeviceWindow , D3DCREATE_SOFTWARE_VERTEXPROCESSING , & present_parameters , & device_ptr ) ;
}
2008-02-17 22:31:55 +00:00
}
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK | | hr = = D3DERR_NOTAVAILABLE , " IDirect3D_CreateDevice returned: %08x \n " , hr ) ;
2007-02-16 18:08:28 +00:00
return device_ptr ;
}
2007-02-16 18:08:34 +00:00
struct vertex
{
float x , y , z ;
DWORD diffuse ;
} ;
2007-08-31 18:32:52 +00:00
struct tvertex
{
float x , y , z , rhw ;
DWORD diffuse ;
} ;
2007-02-16 18:08:34 +00:00
struct nvertex
{
float x , y , z ;
float nx , ny , nz ;
DWORD diffuse ;
} ;
static void lighting_test ( IDirect3DDevice9 * device )
{
HRESULT hr ;
DWORD fvf = D3DFVF_XYZ | D3DFVF_DIFFUSE ;
DWORD nfvf = D3DFVF_XYZ | D3DFVF_DIFFUSE | D3DFVF_NORMAL ;
DWORD color ;
2008-10-31 21:21:18 +00:00
D3DMATERIAL9 material , old_material ;
DWORD cop , carg ;
2007-02-16 18:08:34 +00:00
2007-05-27 23:19:58 +00:00
float mat [ 16 ] = { 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 } ;
2007-02-16 18:08:34 +00:00
struct vertex unlitquad [ ] =
{
2007-05-27 23:19:58 +00:00
{ - 1.0f , - 1.0f , 0.1f , 0xffff0000 } ,
{ - 1.0f , 0.0f , 0.1f , 0xffff0000 } ,
{ 0.0f , 0.0f , 0.1f , 0xffff0000 } ,
{ 0.0f , - 1.0f , 0.1f , 0xffff0000 } ,
2007-02-16 18:08:34 +00:00
} ;
struct vertex litquad [ ] =
{
2007-05-27 23:19:58 +00:00
{ - 1.0f , 0.0f , 0.1f , 0xff00ff00 } ,
{ - 1.0f , 1.0f , 0.1f , 0xff00ff00 } ,
{ 0.0f , 1.0f , 0.1f , 0xff00ff00 } ,
{ 0.0f , 0.0f , 0.1f , 0xff00ff00 } ,
2007-02-16 18:08:34 +00:00
} ;
struct nvertex unlitnquad [ ] =
{
2007-05-27 23:19:58 +00:00
{ 0.0f , - 1.0f , 0.1f , 1.0f , 1.0f , 1.0f , 0xff0000ff } ,
{ 0.0f , 0.0f , 0.1f , 1.0f , 1.0f , 1.0f , 0xff0000ff } ,
{ 1.0f , 0.0f , 0.1f , 1.0f , 1.0f , 1.0f , 0xff0000ff } ,
{ 1.0f , - 1.0f , 0.1f , 1.0f , 1.0f , 1.0f , 0xff0000ff } ,
2007-02-16 18:08:34 +00:00
} ;
struct nvertex litnquad [ ] =
{
2007-05-27 23:19:58 +00:00
{ 0.0f , 0.0f , 0.1f , 1.0f , 1.0f , 1.0f , 0xffffff00 } ,
{ 0.0f , 1.0f , 0.1f , 1.0f , 1.0f , 1.0f , 0xffffff00 } ,
{ 1.0f , 1.0f , 0.1f , 1.0f , 1.0f , 1.0f , 0xffffff00 } ,
{ 1.0f , 0.0f , 0.1f , 1.0f , 1.0f , 1.0f , 0xffffff00 } ,
2007-02-16 18:08:34 +00:00
} ;
WORD Indices [ ] = { 0 , 1 , 2 , 2 , 3 , 0 } ;
hr = IDirect3DDevice9_Clear ( device , 0 , NULL , D3DCLEAR_TARGET , 0xffffffff , 0.0 , 0 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_Clear failed with %08x \n " , hr ) ;
2007-02-16 18:08:34 +00:00
/* Setup some states that may cause issues */
hr = IDirect3DDevice9_SetTransform ( device , D3DTS_WORLDMATRIX ( 0 ) , ( D3DMATRIX * ) mat ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetTransform returned %08x \n " , hr ) ;
2007-02-16 18:08:34 +00:00
hr = IDirect3DDevice9_SetTransform ( device , D3DTS_VIEW , ( D3DMATRIX * ) mat ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetTransform returned %08x \n " , hr ) ;
2007-02-16 18:08:34 +00:00
hr = IDirect3DDevice9_SetTransform ( device , D3DTS_PROJECTION , ( D3DMATRIX * ) mat ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetTransform returned %08x \n " , hr ) ;
2007-02-16 18:08:34 +00:00
hr = IDirect3DDevice9_SetRenderState ( device , D3DRS_CLIPPING , FALSE ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetRenderState returned %08x \n " , hr ) ;
2007-02-16 18:08:34 +00:00
hr = IDirect3DDevice9_SetRenderState ( device , D3DRS_ZENABLE , FALSE ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetRenderState returned %08x \n " , hr ) ;
2007-02-16 18:08:34 +00:00
hr = IDirect3DDevice9_SetRenderState ( device , D3DRS_FOGENABLE , FALSE ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetRenderState returned %08x \n " , hr ) ;
2007-02-16 18:08:34 +00:00
hr = IDirect3DDevice9_SetRenderState ( device , D3DRS_STENCILENABLE , FALSE ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetRenderState returned %08x \n " , hr ) ;
2007-02-16 18:08:34 +00:00
hr = IDirect3DDevice9_SetRenderState ( device , D3DRS_ALPHATESTENABLE , FALSE ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetRenderState returned %08x \n " , hr ) ;
2007-02-16 18:08:34 +00:00
hr = IDirect3DDevice9_SetRenderState ( device , D3DRS_ALPHABLENDENABLE , FALSE ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetRenderState returned %08x \n " , hr ) ;
2007-02-16 18:08:34 +00:00
hr = IDirect3DDevice9_SetRenderState ( device , D3DRS_SCISSORTESTENABLE , FALSE ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetRenderState returned %08x \n " , hr ) ;
2007-02-16 18:08:34 +00:00
hr = IDirect3DDevice9_SetRenderState ( device , D3DRS_CULLMODE , D3DCULL_NONE ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetRenderState failed with %08x \n " , hr ) ;
2007-05-20 10:08:40 +00:00
hr = IDirect3DDevice9_SetRenderState ( device , D3DRS_COLORWRITEENABLE , D3DCOLORWRITEENABLE_RED | D3DCOLORWRITEENABLE_GREEN | D3DCOLORWRITEENABLE_BLUE ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetRenderState failed with %08x \n " , hr ) ;
2007-02-16 18:08:34 +00:00
2009-01-26 21:16:21 +00:00
hr = IDirect3DDevice9_SetFVF ( device , 0 ) ;
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetFVF returned %08x \n " , hr ) ;
2007-02-16 18:08:34 +00:00
hr = IDirect3DDevice9_SetFVF ( device , fvf ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetFVF returned %08x \n " , hr ) ;
2007-02-16 18:08:34 +00:00
hr = IDirect3DDevice9_BeginScene ( device ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_BeginScene failed with %08x \n " , hr ) ;
2007-02-16 18:08:34 +00:00
if ( hr = = D3D_OK )
{
/* No lights are defined... That means, lit vertices should be entirely black */
hr = IDirect3DDevice9_SetRenderState ( device , D3DRS_LIGHTING , FALSE ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetRenderState returned %08x \n " , hr ) ;
2007-02-16 18:08:34 +00:00
hr = IDirect3DDevice9_DrawIndexedPrimitiveUP ( device , D3DPT_TRIANGLELIST , 0 /* MinIndex */ , 4 /* NumVerts */ ,
2 /*PrimCount */ , Indices , D3DFMT_INDEX16 , unlitquad , sizeof ( unlitquad [ 0 ] ) ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_DrawIndexedPrimitiveUP failed with %08x \n " , hr ) ;
2007-02-16 18:08:34 +00:00
hr = IDirect3DDevice9_SetRenderState ( device , D3DRS_LIGHTING , TRUE ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetRenderState returned %08x \n " , hr ) ;
2007-02-16 18:08:34 +00:00
hr = IDirect3DDevice9_DrawIndexedPrimitiveUP ( device , D3DPT_TRIANGLELIST , 0 /* MinIndex */ , 4 /* NumVerts */ ,
2 /*PrimCount */ , Indices , D3DFMT_INDEX16 , litquad , sizeof ( litquad [ 0 ] ) ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_DrawIndexedPrimitiveUP failed with %08x \n " , hr ) ;
2007-02-16 18:08:34 +00:00
hr = IDirect3DDevice9_SetFVF ( device , nfvf ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetFVF failed with %08x \n " , hr ) ;
2007-02-16 18:08:34 +00:00
hr = IDirect3DDevice9_SetRenderState ( device , D3DRS_LIGHTING , FALSE ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetRenderState returned %08x \n " , hr ) ;
2007-02-16 18:08:34 +00:00
hr = IDirect3DDevice9_DrawIndexedPrimitiveUP ( device , D3DPT_TRIANGLELIST , 0 /* MinIndex */ , 4 /* NumVerts */ ,
2 /*PrimCount */ , Indices , D3DFMT_INDEX16 , unlitnquad , sizeof ( unlitnquad [ 0 ] ) ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_DrawIndexedPrimitiveUP failed with %08x \n " , hr ) ;
2007-02-16 18:08:34 +00:00
hr = IDirect3DDevice9_SetRenderState ( device , D3DRS_LIGHTING , TRUE ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetRenderState returned %08x \n " , hr ) ;
2007-02-16 18:08:34 +00:00
hr = IDirect3DDevice9_DrawIndexedPrimitiveUP ( device , D3DPT_TRIANGLELIST , 0 /* MinIndex */ , 4 /* NumVerts */ ,
2 /*PrimCount */ , Indices , D3DFMT_INDEX16 , litnquad , sizeof ( litnquad [ 0 ] ) ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_DrawIndexedPrimitiveUP failed with %08x \n " , hr ) ;
2007-02-16 18:08:34 +00:00
IDirect3DDevice9_EndScene ( device ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_EndScene failed with %08x \n " , hr ) ;
2007-02-16 18:08:34 +00:00
}
IDirect3DDevice9_Present ( device , NULL , NULL , NULL , NULL ) ;
color = getPixelColor ( device , 160 , 360 ) ; /* lower left quad - unlit without normals */
ok ( color = = 0x00ff0000 , " Unlit quad without normals has color %08x \n " , color ) ;
color = getPixelColor ( device , 160 , 120 ) ; /* upper left quad - lit without normals */
ok ( color = = 0x00000000 , " Lit quad without normals has color %08x \n " , color ) ;
2008-01-21 15:49:39 +00:00
color = getPixelColor ( device , 480 , 360 ) ; /* lower left quad - unlit with normals */
ok ( color = = 0x000000ff , " Unlit quad with normals has color %08x \n " , color ) ;
color = getPixelColor ( device , 480 , 120 ) ; /* upper left quad - lit with normals */
ok ( color = = 0x00000000 , " Lit quad with normals has color %08x \n " , color ) ;
2007-02-16 18:08:34 +00:00
2008-10-31 21:21:18 +00:00
hr = IDirect3DDevice9_GetMaterial ( device , & old_material ) ;
ok ( hr = = D3D_OK , " IDirect3DDevice9_GetMaterial returned %08x \n " , hr ) ;
memset ( & material , 0 , sizeof ( material ) ) ;
material . Diffuse . r = 0.0 ;
material . Diffuse . g = 0.0 ;
material . Diffuse . b = 0.0 ;
material . Diffuse . a = 1.0 ;
material . Ambient . r = 0.0 ;
material . Ambient . g = 0.0 ;
material . Ambient . b = 0.0 ;
material . Ambient . a = 0.0 ;
material . Specular . r = 0.0 ;
material . Specular . g = 0.0 ;
material . Specular . b = 0.0 ;
material . Specular . a = 0.0 ;
material . Emissive . r = 0.0 ;
material . Emissive . g = 0.0 ;
material . Emissive . b = 0.0 ;
material . Emissive . a = 0.0 ;
material . Power = 0.0 ;
IDirect3DDevice9_SetMaterial ( device , & material ) ;
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetMaterial returned %08x \n " , hr ) ;
hr = IDirect3DDevice9_SetRenderState ( device , D3DRS_DIFFUSEMATERIALSOURCE , D3DMCS_MATERIAL ) ;
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetRenderState returned %08x \n " , hr ) ;
hr = IDirect3DDevice9_SetRenderState ( device , D3DRS_SPECULARMATERIALSOURCE , D3DMCS_MATERIAL ) ;
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetRenderState returned %08x \n " , hr ) ;
hr = IDirect3DDevice9_GetTextureStageState ( device , 0 , D3DTSS_COLOROP , & cop ) ;
ok ( hr = = D3D_OK , " IDirect3DDevice9_GetTextureStageState returned %08x \n " , hr ) ;
hr = IDirect3DDevice9_GetTextureStageState ( device , 0 , D3DTSS_COLORARG1 , & carg ) ;
ok ( hr = = D3D_OK , " IDirect3DDevice9_GetTextureStageState returned %08x \n " , hr ) ;
hr = IDirect3DDevice9_SetTextureStageState ( device , 0 , D3DTSS_COLOROP , D3DTOP_SELECTARG1 ) ;
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetTextureStageState returned %08x \n " , hr ) ;
hr = IDirect3DDevice9_SetTextureStageState ( device , 0 , D3DTSS_COLORARG1 , D3DTA_DIFFUSE | D3DTA_ALPHAREPLICATE ) ;
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetTextureStageState returned %08x \n " , hr ) ;
hr = IDirect3DDevice9_BeginScene ( device ) ;
ok ( hr = = D3D_OK , " IDirect3DDevice9_BeginScene returned %08x \n " , hr ) ;
if ( SUCCEEDED ( hr ) ) {
struct vertex lighting_test [ ] = {
{ - 1.0 , - 1.0 , 0.1 , 0x8000ff00 } ,
{ 1.0 , - 1.0 , 0.1 , 0x80000000 } ,
{ - 1.0 , 1.0 , 0.1 , 0x8000ff00 } ,
{ 1.0 , 1.0 , 0.1 , 0x80000000 }
} ;
hr = IDirect3DDevice9_SetFVF ( device , D3DFVF_XYZ | D3DFVF_DIFFUSE ) ;
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetFVF failed, hr=%08x \n " , hr ) ;
hr = IDirect3DDevice9_DrawPrimitiveUP ( device , D3DPT_TRIANGLESTRIP , 2 , lighting_test , sizeof ( lighting_test [ 0 ] ) ) ;
ok ( hr = = D3D_OK , " IDirect3DDevice9_DrawPrimitiveUP failed, hr=%08x \n " , hr ) ;
hr = IDirect3DDevice9_EndScene ( device ) ;
ok ( hr = = D3D_OK , " IDirect3DDevice9_EndScene returned %08x \n " , hr ) ;
}
IDirect3DDevice9_Present ( device , NULL , NULL , NULL , NULL ) ;
color = getPixelColor ( device , 320 , 240 ) ;
ok ( color = = 0x00ffffff , " Lit vertex alpha test returned color %08x, expected 0x00ffffff \n " , color ) ;
hr = IDirect3DDevice9_SetTextureStageState ( device , 0 , D3DTSS_COLOROP , cop ) ;
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetTextureStageState returned %08x \n " , hr ) ;
hr = IDirect3DDevice9_SetRenderState ( device , D3DRS_DIFFUSEMATERIALSOURCE , D3DMCS_COLOR1 ) ;
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetRenderState returned %08x \n " , hr ) ;
hr = IDirect3DDevice9_SetRenderState ( device , D3DRS_SPECULARMATERIALSOURCE , D3DMCS_COLOR2 ) ;
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetRenderState returned %08x \n " , hr ) ;
2007-02-16 18:08:34 +00:00
hr = IDirect3DDevice9_SetRenderState ( device , D3DRS_LIGHTING , FALSE ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetRenderState returned %08x \n " , hr ) ;
2008-10-31 21:21:18 +00:00
hr = IDirect3DDevice9_SetTextureStageState ( device , 0 , D3DTSS_COLORARG1 , carg ) ;
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetTextureStageState returned %08x \n " , hr ) ;
hr = IDirect3DDevice9_SetMaterial ( device , & old_material ) ;
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetMaterial returned %08x \n " , hr ) ;
2007-02-16 18:08:34 +00:00
}
2007-02-26 12:42:25 +00:00
static void clear_test ( IDirect3DDevice9 * device )
{
/* Tests the correctness of clearing parameters */
HRESULT hr ;
D3DRECT rect [ 2 ] ;
D3DRECT rect_negneg ;
DWORD color ;
2007-12-01 14:49:42 +00:00
D3DVIEWPORT9 old_vp , vp ;
2007-12-05 20:35:32 +00:00
RECT scissor ;
DWORD oldColorWrite ;
2007-12-08 15:13:54 +00:00
BOOL invalid_clear_failed = FALSE ;
2007-02-26 12:42:25 +00:00
hr = IDirect3DDevice9_Clear ( device , 0 , NULL , D3DCLEAR_TARGET , 0xffffffff , 0.0 , 0 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_Clear failed with %08x \n " , hr ) ;
2007-02-26 12:42:25 +00:00
/* Positive x, negative y */
rect [ 0 ] . x1 = 0 ;
rect [ 0 ] . y1 = 480 ;
rect [ 0 ] . x2 = 320 ;
rect [ 0 ] . y2 = 240 ;
/* Positive x, positive y */
rect [ 1 ] . x1 = 0 ;
rect [ 1 ] . y1 = 0 ;
rect [ 1 ] . x2 = 320 ;
rect [ 1 ] . y2 = 240 ;
2007-12-08 15:13:54 +00:00
/* Clear 2 rectangles with one call. The refrast returns an error in this case, every real driver tested so far
* returns D3D_OK , but ignores the rectangle silently
2007-02-26 12:42:25 +00:00
*/
hr = IDirect3DDevice9_Clear ( device , 2 , rect , D3DCLEAR_TARGET , 0xffff0000 , 0.0 , 0 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK | | hr = = D3DERR_INVALIDCALL , " IDirect3DDevice9_Clear failed with %08x \n " , hr ) ;
2007-12-08 15:13:54 +00:00
if ( hr = = D3DERR_INVALIDCALL ) invalid_clear_failed = TRUE ;
2007-02-26 12:42:25 +00:00
/* negative x, negative y */
rect_negneg . x1 = 640 ;
2007-11-06 18:45:17 +00:00
rect_negneg . y1 = 240 ;
2007-02-26 12:42:25 +00:00
rect_negneg . x2 = 320 ;
rect_negneg . y2 = 0 ;
hr = IDirect3DDevice9_Clear ( device , 1 , & rect_negneg , D3DCLEAR_TARGET , 0xff00ff00 , 0.0 , 0 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK | | hr = = D3DERR_INVALIDCALL , " IDirect3DDevice9_Clear failed with %08x \n " , hr ) ;
2007-12-08 15:13:54 +00:00
if ( hr = = D3DERR_INVALIDCALL ) invalid_clear_failed = TRUE ;
2007-02-26 12:42:25 +00:00
IDirect3DDevice9_Present ( device , NULL , NULL , NULL , NULL ) ;
color = getPixelColor ( device , 160 , 360 ) ; /* lower left quad */
ok ( color = = 0x00ffffff , " Clear rectangle 3(pos, neg) has color %08x \n " , color ) ;
color = getPixelColor ( device , 160 , 120 ) ; /* upper left quad */
2007-12-08 15:13:54 +00:00
if ( invalid_clear_failed ) {
/* If the negative rectangle was refused, the other rectangles in the list shouldn't be cleared either */
ok ( color = = 0x00ffffff , " Clear rectangle 1(pos, pos) has color %08x \n " , color ) ;
} else {
/* If the negative rectangle was dropped silently, the correct ones are cleared */
ok ( color = = 0x00ff0000 , " Clear rectangle 1(pos, pos) has color %08x \n " , color ) ;
}
2007-02-26 12:42:25 +00:00
color = getPixelColor ( device , 480 , 360 ) ; /* lower right quad */
ok ( color = = 0x00ffffff , " Clear rectangle 4(NULL) has color %08x \n " , color ) ;
color = getPixelColor ( device , 480 , 120 ) ; /* upper right quad */
ok ( color = = 0x00ffffff , " Clear rectangle 4(neg, neg) has color %08x \n " , color ) ;
2007-12-01 14:49:42 +00:00
/* Test how the viewport affects clears */
hr = IDirect3DDevice9_Clear ( device , 0 , NULL , D3DCLEAR_TARGET , 0xffffffff , 0.0 , 0 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_Clear failed with %08x \n " , hr ) ;
2007-12-01 14:49:42 +00:00
hr = IDirect3DDevice9_GetViewport ( device , & old_vp ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_GetViewport failed with %08x \n " , hr ) ;
2007-12-01 14:49:42 +00:00
vp . X = 160 ;
vp . Y = 120 ;
vp . Width = 160 ;
vp . Height = 120 ;
vp . MinZ = 0.0 ;
vp . MaxZ = 1.0 ;
hr = IDirect3DDevice9_SetViewport ( device , & vp ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetViewport failed with %08x \n " , hr ) ;
2007-12-01 14:49:42 +00:00
hr = IDirect3DDevice9_Clear ( device , 0 , NULL , D3DCLEAR_TARGET , 0xff0000ff , 0.0 , 0 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_Clear failed with %08x \n " , hr ) ;
2007-12-01 14:49:42 +00:00
vp . X = 320 ;
vp . Y = 240 ;
vp . Width = 320 ;
vp . Height = 240 ;
vp . MinZ = 0.0 ;
vp . MaxZ = 1.0 ;
hr = IDirect3DDevice9_SetViewport ( device , & vp ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetViewport failed with %08x \n " , hr ) ;
2007-12-01 14:49:42 +00:00
rect [ 0 ] . x1 = 160 ;
rect [ 0 ] . y1 = 120 ;
rect [ 0 ] . x2 = 480 ;
rect [ 0 ] . y2 = 360 ;
hr = IDirect3DDevice9_Clear ( device , 1 , & rect [ 0 ] , D3DCLEAR_TARGET , 0xff00ff00 , 0.0 , 0 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_Clear failed with %08x \n " , hr ) ;
2007-12-01 14:49:42 +00:00
hr = IDirect3DDevice9_SetViewport ( device , & old_vp ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetViewport failed with %08x \n " , hr ) ;
2007-12-01 14:49:42 +00:00
IDirect3DDevice9_Present ( device , NULL , NULL , NULL , NULL ) ;
color = getPixelColor ( device , 158 , 118 ) ;
ok ( color = = 0x00ffffff , " (158,118) has color %08x \n " , color ) ;
color = getPixelColor ( device , 162 , 118 ) ;
ok ( color = = 0x00ffffff , " (162,118) has color %08x \n " , color ) ;
color = getPixelColor ( device , 158 , 122 ) ;
ok ( color = = 0x00ffffff , " (158,122) has color %08x \n " , color ) ;
color = getPixelColor ( device , 162 , 122 ) ;
ok ( color = = 0x000000ff , " (162,122) has color %08x \n " , color ) ;
color = getPixelColor ( device , 318 , 238 ) ;
ok ( color = = 0x000000ff , " (318,238) has color %08x \n " , color ) ;
color = getPixelColor ( device , 322 , 238 ) ;
ok ( color = = 0x00ffffff , " (322,328) has color %08x \n " , color ) ;
color = getPixelColor ( device , 318 , 242 ) ;
ok ( color = = 0x00ffffff , " (318,242) has color %08x \n " , color ) ;
color = getPixelColor ( device , 322 , 242 ) ;
ok ( color = = 0x0000ff00 , " (322,242) has color %08x \n " , color ) ;
color = getPixelColor ( device , 478 , 358 ) ;
ok ( color = = 0x0000ff00 , " (478,358 has color %08x \n " , color ) ;
color = getPixelColor ( device , 482 , 358 ) ;
ok ( color = = 0x00ffffff , " (482,358) has color %08x \n " , color ) ;
color = getPixelColor ( device , 478 , 362 ) ;
ok ( color = = 0x00ffffff , " (478,362) has color %08x \n " , color ) ;
color = getPixelColor ( device , 482 , 362 ) ;
ok ( color = = 0x00ffffff , " (482,362) has color %08x \n " , color ) ;
2007-12-05 20:35:32 +00:00
hr = IDirect3DDevice9_Clear ( device , 0 , NULL , D3DCLEAR_TARGET , 0xffffffff , 0.0 , 0 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_Clear failed with %08x \n " , hr ) ;
2007-12-05 20:35:32 +00:00
scissor . left = 160 ;
scissor . right = 480 ;
scissor . top = 120 ;
scissor . bottom = 360 ;
hr = IDirect3DDevice9_SetScissorRect ( device , & scissor ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice_SetScissorRect failed with %08x \n " , hr ) ;
2007-12-05 20:35:32 +00:00
hr = IDirect3DDevice9_SetRenderState ( device , D3DRS_SCISSORTESTENABLE , TRUE ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice_SetScissorRect failed with %08x \n " , hr ) ;
2007-12-05 20:35:32 +00:00
hr = IDirect3DDevice9_Clear ( device , 0 , NULL , D3DCLEAR_TARGET , 0xff00ff00 , 0.0 , 0 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_Clear failed with %08x \n " , hr ) ;
2007-12-05 20:35:32 +00:00
hr = IDirect3DDevice9_Clear ( device , 1 , & rect [ 1 ] , D3DCLEAR_TARGET , 0xffff0000 , 0.0 , 0 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_Clear failed with %08x \n " , hr ) ;
2007-12-05 20:35:32 +00:00
hr = IDirect3DDevice9_SetRenderState ( device , D3DRS_SCISSORTESTENABLE , FALSE ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice_SetScissorRect failed with %08x \n " , hr ) ;
2007-12-05 20:35:32 +00:00
IDirect3DDevice9_Present ( device , NULL , NULL , NULL , NULL ) ;
color = getPixelColor ( device , 158 , 118 ) ;
ok ( color = = 0x00ffffff , " Pixel 158/118 has color %08x \n " , color ) ;
color = getPixelColor ( device , 162 , 118 ) ;
ok ( color = = 0x00ffffff , " Pixel 162/118 has color %08x \n " , color ) ;
color = getPixelColor ( device , 158 , 122 ) ;
ok ( color = = 0x00ffffff , " Pixel 158/122 has color %08x \n " , color ) ;
color = getPixelColor ( device , 162 , 122 ) ;
ok ( color = = 0x00ff0000 , " Pixel 162/122 has color %08x \n " , color ) ;
color = getPixelColor ( device , 158 , 358 ) ;
ok ( color = = 0x00ffffff , " Pixel 158/358 has color %08x \n " , color ) ;
color = getPixelColor ( device , 162 , 358 ) ;
ok ( color = = 0x0000ff00 , " Pixel 162/358 has color %08x \n " , color ) ;
color = getPixelColor ( device , 158 , 358 ) ;
ok ( color = = 0x00ffffff , " Pixel 158/358 has color %08x \n " , color ) ;
color = getPixelColor ( device , 162 , 362 ) ;
ok ( color = = 0x00ffffff , " Pixel 162/362 has color %08x \n " , color ) ;
color = getPixelColor ( device , 478 , 118 ) ;
ok ( color = = 0x00ffffff , " Pixel 158/118 has color %08x \n " , color ) ;
color = getPixelColor ( device , 478 , 122 ) ;
ok ( color = = 0x0000ff00 , " Pixel 162/118 has color %08x \n " , color ) ;
color = getPixelColor ( device , 482 , 122 ) ;
ok ( color = = 0x00ffffff , " Pixel 158/122 has color %08x \n " , color ) ;
color = getPixelColor ( device , 482 , 358 ) ;
ok ( color = = 0x00ffffff , " Pixel 162/122 has color %08x \n " , color ) ;
color = getPixelColor ( device , 478 , 358 ) ;
ok ( color = = 0x0000ff00 , " Pixel 478/358 has color %08x \n " , color ) ;
color = getPixelColor ( device , 478 , 362 ) ;
ok ( color = = 0x00ffffff , " Pixel 478/118 has color %08x \n " , color ) ;
color = getPixelColor ( device , 482 , 358 ) ;
ok ( color = = 0x00ffffff , " Pixel 482/122 has color %08x \n " , color ) ;
color = getPixelColor ( device , 482 , 362 ) ;
ok ( color = = 0x00ffffff , " Pixel 482/122 has color %08x \n " , color ) ;
color = getPixelColor ( device , 318 , 238 ) ;
ok ( color = = 0x00ff0000 , " Pixel 318/238 has color %08x \n " , color ) ;
color = getPixelColor ( device , 318 , 242 ) ;
ok ( color = = 0x0000ff00 , " Pixel 318/242 has color %08x \n " , color ) ;
color = getPixelColor ( device , 322 , 238 ) ;
ok ( color = = 0x0000ff00 , " Pixel 322/238 has color %08x \n " , color ) ;
color = getPixelColor ( device , 322 , 242 ) ;
ok ( color = = 0x0000ff00 , " Pixel 322/242 has color %08x \n " , color ) ;
hr = IDirect3DDevice9_GetRenderState ( device , D3DRS_COLORWRITEENABLE , & oldColorWrite ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_GetRenderState failed with %08x \n " , hr ) ;
2007-12-05 20:35:32 +00:00
hr = IDirect3DDevice9_SetRenderState ( device , D3DRS_COLORWRITEENABLE , D3DCOLORWRITEENABLE_RED ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetRenderState failed with %08x \n " , hr ) ;
2007-12-05 20:35:32 +00:00
hr = IDirect3DDevice9_Clear ( device , 0 , NULL , D3DCLEAR_TARGET , 0xffffffff , 0.0 , 0 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_Clear failed with %08x \n " , hr ) ;
2007-12-05 20:35:32 +00:00
hr = IDirect3DDevice9_SetRenderState ( device , D3DRS_COLORWRITEENABLE , oldColorWrite ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetRenderState failed with %08x \n " , hr ) ;
2007-12-05 20:35:32 +00:00
IDirect3DDevice9_Present ( device , NULL , NULL , NULL , NULL ) ;
/* Colorwriteenable does not affect the clear */
color = getPixelColor ( device , 320 , 240 ) ;
ok ( color = = 0x00ffffff , " Color write protected clear returned color %08x \n " , color ) ;
2007-02-26 12:42:25 +00:00
}
2007-03-06 21:35:45 +00:00
typedef struct {
float in [ 4 ] ;
DWORD out ;
} test_data_t ;
/*
2007-11-30 15:20:22 +00:00
* c7 mova ARGB mov ARGB
* - 2.4 - 2 0x00ffff00 - 3 0x00ff0000
* - 1.6 - 2 0x00ffff00 - 2 0x00ffff00
* - 0.4 0 0x0000ffff - 1 0x0000ff00
* 0.4 0 0x0000ffff 0 0x0000ffff
* 1.6 2 0x00ff00ff 1 0x000000ff
* 2.4 2 0x00ff00ff 2 0x00ff00ff
2007-03-06 21:35:45 +00:00
*/
static void test_mova ( IDirect3DDevice9 * device )
{
static const DWORD mova_test [ ] = {
0xfffe0200 , /* vs_2_0 */
0x0200001f , 0x80000000 , 0x900f0000 , /* dcl_position v0 */
0x05000051 , 0xa00f0000 , 0x3f800000 , 0x00000000 , 0x00000000 , 0x3f800000 , /* def c0, 1.0, 0.0, 0.0, 1.0 */
0x05000051 , 0xa00f0001 , 0x3f800000 , 0x3f800000 , 0x00000000 , 0x3f800000 , /* def c1, 1.0, 1.0, 0.0, 1.0 */
0x05000051 , 0xa00f0002 , 0x00000000 , 0x3f800000 , 0x00000000 , 0x3f800000 , /* def c2, 0.0, 1.0, 0.0, 1.0 */
0x05000051 , 0xa00f0003 , 0x00000000 , 0x3f800000 , 0x3f800000 , 0x3f800000 , /* def c3, 0.0, 1.0, 1.0, 1.0 */
0x05000051 , 0xa00f0004 , 0x00000000 , 0x00000000 , 0x3f800000 , 0x3f800000 , /* def c4, 0.0, 0.0, 1.0, 1.0 */
0x05000051 , 0xa00f0005 , 0x3f800000 , 0x00000000 , 0x3f800000 , 0x3f800000 , /* def c5, 1.0, 0.0, 1.0, 1.0 */
0x05000051 , 0xa00f0006 , 0x3f800000 , 0x3f800000 , 0x3f800000 , 0x3f800000 , /* def c6, 1.0, 1.0, 1.0, 1.0 */
0x0200002e , 0xb0010000 , 0xa0000007 , /* mova a0.x, c7.x */
0x03000001 , 0xd00f0000 , 0xa0e42003 , 0xb0000000 , /* mov oD0, c[a0.x + 3] */
0x02000001 , 0xc00f0000 , 0x90e40000 , /* mov oPos, v0 */
0x0000ffff /* END */
} ;
2007-11-30 15:20:22 +00:00
static const DWORD mov_test [ ] = {
0xfffe0101 , /* vs_1_1 */
0x0000001f , 0x80000000 , 0x900f0000 , /* dcl_position v0 */
0x00000051 , 0xa00f0000 , 0x3f800000 , 0x00000000 , 0x00000000 , 0x3f800000 , /* def c0, 1.0, 0.0, 0.0, 1.0 */
0x00000051 , 0xa00f0001 , 0x3f800000 , 0x3f800000 , 0x00000000 , 0x3f800000 , /* def c1, 1.0, 1.0, 0.0, 1.0 */
0x00000051 , 0xa00f0002 , 0x00000000 , 0x3f800000 , 0x00000000 , 0x3f800000 , /* def c2, 0.0, 1.0, 0.0, 1.0 */
0x00000051 , 0xa00f0003 , 0x00000000 , 0x3f800000 , 0x3f800000 , 0x3f800000 , /* def c3, 0.0, 1.0, 1.0, 1.0 */
0x00000051 , 0xa00f0004 , 0x00000000 , 0x00000000 , 0x3f800000 , 0x3f800000 , /* def c4, 0.0, 0.0, 1.0, 1.0 */
0x00000051 , 0xa00f0005 , 0x3f800000 , 0x00000000 , 0x3f800000 , 0x3f800000 , /* def c5, 1.0, 0.0, 1.0, 1.0 */
0x00000051 , 0xa00f0006 , 0x3f800000 , 0x3f800000 , 0x3f800000 , 0x3f800000 , /* def c6, 1.0, 1.0, 1.0, 1.0 */
0x00000001 , 0xb0010000 , 0xa0000007 , /* mov a0.x, c7.x */
0x00000001 , 0xd00f0000 , 0xa0e42003 , /* mov oD0, c[a0.x + 3] */
0x00000001 , 0xc00f0000 , 0x90e40000 , /* mov oPos, v0 */
0x0000ffff /* END */
} ;
2007-03-06 21:35:45 +00:00
2007-11-30 15:20:22 +00:00
static const test_data_t test_data [ 2 ] [ 6 ] = {
{
{ { - 2.4f , 0.0f , 0.0f , 0.0f } , 0x00ff0000 } ,
{ { - 1.6f , 0.0f , 0.0f , 0.0f } , 0x00ffff00 } ,
{ { - 0.4f , 0.0f , 0.0f , 0.0f } , 0x0000ff00 } ,
{ { 0.4f , 0.0f , 0.0f , 0.0f } , 0x0000ffff } ,
{ { 1.6f , 0.0f , 0.0f , 0.0f } , 0x000000ff } ,
{ { 2.4f , 0.0f , 0.0f , 0.0f } , 0x00ff00ff }
} ,
{
{ { - 2.4f , 0.0f , 0.0f , 0.0f } , 0x00ffff00 } ,
{ { - 1.6f , 0.0f , 0.0f , 0.0f } , 0x00ffff00 } ,
{ { - 0.4f , 0.0f , 0.0f , 0.0f } , 0x0000ffff } ,
{ { 0.4f , 0.0f , 0.0f , 0.0f } , 0x0000ffff } ,
{ { 1.6f , 0.0f , 0.0f , 0.0f } , 0x00ff00ff } ,
{ { 2.4f , 0.0f , 0.0f , 0.0f } , 0x00ff00ff }
}
2007-03-06 21:35:45 +00:00
} ;
static const float quad [ ] [ 3 ] = {
{ - 1.0f , - 1.0f , 0.0f } ,
{ - 1.0f , 1.0f , 0.0f } ,
{ 1.0f , - 1.0f , 0.0f } ,
{ 1.0f , 1.0f , 0.0f } ,
} ;
static const D3DVERTEXELEMENT9 decl_elements [ ] = {
{ 0 , 0 , D3DDECLTYPE_FLOAT3 , D3DDECLMETHOD_DEFAULT , D3DDECLUSAGE_POSITION , 0 } ,
D3DDECL_END ( )
} ;
IDirect3DVertexDeclaration9 * vertex_declaration = NULL ;
IDirect3DVertexShader9 * mova_shader = NULL ;
2007-11-30 15:20:22 +00:00
IDirect3DVertexShader9 * mov_shader = NULL ;
2007-03-06 21:35:45 +00:00
HRESULT hr ;
2008-01-25 12:26:40 +00:00
UINT i , j ;
2007-03-06 21:35:45 +00:00
hr = IDirect3DDevice9_CreateVertexShader ( device , mova_test , & mova_shader ) ;
ok ( SUCCEEDED ( hr ) , " CreateVertexShader failed (%08x) \n " , hr ) ;
2007-11-30 15:20:22 +00:00
hr = IDirect3DDevice9_CreateVertexShader ( device , mov_test , & mov_shader ) ;
ok ( SUCCEEDED ( hr ) , " CreateVertexShader failed (%08x) \n " , hr ) ;
2007-03-06 21:35:45 +00:00
hr = IDirect3DDevice9_CreateVertexDeclaration ( device , decl_elements , & vertex_declaration ) ;
ok ( SUCCEEDED ( hr ) , " CreateVertexDeclaration failed (%08x) \n " , hr ) ;
hr = IDirect3DDevice9_SetVertexDeclaration ( device , vertex_declaration ) ;
ok ( SUCCEEDED ( hr ) , " SetVertexDeclaration failed (%08x) \n " , hr ) ;
2007-11-30 15:20:22 +00:00
hr = IDirect3DDevice9_SetVertexShader ( device , mov_shader ) ;
ok ( SUCCEEDED ( hr ) , " SetVertexShader failed (%08x) \n " , hr ) ;
for ( j = 0 ; j < 2 ; + + j )
2007-03-06 21:35:45 +00:00
{
2007-11-30 15:20:22 +00:00
for ( i = 0 ; i < ( sizeof ( test_data [ 0 ] ) / sizeof ( test_data_t ) ) ; + + i )
{
DWORD color ;
2007-03-06 21:35:45 +00:00
2007-11-30 15:20:22 +00:00
hr = IDirect3DDevice9_SetVertexShaderConstantF ( device , 7 , test_data [ j ] [ i ] . in , 1 ) ;
ok ( SUCCEEDED ( hr ) , " SetVertexShaderConstantF failed (%08x) \n " , hr ) ;
2007-03-06 21:35:45 +00:00
2007-11-30 15:20:22 +00:00
hr = IDirect3DDevice9_BeginScene ( device ) ;
ok ( SUCCEEDED ( hr ) , " BeginScene failed (%08x) \n " , hr ) ;
2007-03-06 21:35:45 +00:00
2007-11-30 15:20:22 +00:00
hr = IDirect3DDevice9_DrawPrimitiveUP ( device , D3DPT_TRIANGLESTRIP , 2 , & quad [ 0 ] , 3 * sizeof ( float ) ) ;
ok ( SUCCEEDED ( hr ) , " DrawPrimitiveUP failed (%08x) \n " , hr ) ;
2007-03-06 21:35:45 +00:00
2007-11-30 15:20:22 +00:00
hr = IDirect3DDevice9_EndScene ( device ) ;
ok ( SUCCEEDED ( hr ) , " EndScene failed (%08x) \n " , hr ) ;
2007-03-06 21:35:45 +00:00
2007-11-30 15:20:22 +00:00
hr = IDirect3DDevice9_Present ( device , NULL , NULL , NULL , NULL ) ;
ok ( SUCCEEDED ( hr ) , " Present failed (%08x) \n " , hr ) ;
2007-03-06 21:35:45 +00:00
2007-11-30 15:20:22 +00:00
color = getPixelColor ( device , 320 , 240 ) ;
ok ( color = = test_data [ j ] [ i ] . out , " Expected color %08x, got %08x (for input %f, instruction %s) \n " ,
test_data [ j ] [ i ] . out , color , test_data [ j ] [ i ] . in [ 0 ] , j = = 0 ? " mov " : " mova " ) ;
2007-03-06 21:35:45 +00:00
2007-11-30 15:20:22 +00:00
hr = IDirect3DDevice9_Clear ( device , 0 , NULL , D3DCLEAR_TARGET , 0 , 0.0f , 0 ) ;
ok ( SUCCEEDED ( hr ) , " Clear failed (%08x) \n " , hr ) ;
}
hr = IDirect3DDevice9_SetVertexShader ( device , mova_shader ) ;
ok ( SUCCEEDED ( hr ) , " SetVertexShader failed (%08x) \n " , hr ) ;
2007-03-06 21:35:45 +00:00
}
2007-03-22 16:41:22 +00:00
hr = IDirect3DDevice9_SetVertexShader ( device , NULL ) ;
ok ( SUCCEEDED ( hr ) , " SetVertexShader failed (%08x) \n " , hr ) ;
2007-03-06 21:35:45 +00:00
IDirect3DVertexDeclaration9_Release ( vertex_declaration ) ;
IDirect3DVertexShader9_Release ( mova_shader ) ;
2007-11-30 15:20:22 +00:00
IDirect3DVertexShader9_Release ( mov_shader ) ;
2007-03-06 21:35:45 +00:00
}
2007-03-14 17:04:56 +00:00
struct sVertex {
float x , y , z ;
DWORD diffuse ;
DWORD specular ;
} ;
struct sVertexT {
float x , y , z , rhw ;
DWORD diffuse ;
DWORD specular ;
} ;
static void fog_test ( IDirect3DDevice9 * device )
{
HRESULT hr ;
DWORD color ;
2008-02-12 17:20:10 +00:00
BYTE r , g , b ;
2007-05-27 23:19:58 +00:00
float start = 0.0f , end = 1.0f ;
2007-07-24 19:07:59 +00:00
D3DCAPS9 caps ;
2008-02-12 17:20:10 +00:00
int i ;
2007-03-14 17:04:56 +00:00
/* Gets full z based fog with linear fog, no fog with specular color */
struct sVertex unstransformed_1 [ ] = {
2007-05-27 23:19:58 +00:00
{ - 1 , - 1 , 0.1f , 0xFFFF0000 , 0xFF000000 } ,
{ - 1 , 0 , 0.1f , 0xFFFF0000 , 0xFF000000 } ,
{ 0 , 0 , 0.1f , 0xFFFF0000 , 0xFF000000 } ,
{ 0 , - 1 , 0.1f , 0xFFFF0000 , 0xFF000000 } ,
2007-03-14 17:04:56 +00:00
} ;
/* Ok, I am too lazy to deal with transform matrices */
struct sVertex unstransformed_2 [ ] = {
2007-05-27 23:19:58 +00:00
{ - 1 , 0 , 1.0f , 0xFFFF0000 , 0xFF000000 } ,
{ - 1 , 1 , 1.0f , 0xFFFF0000 , 0xFF000000 } ,
{ 0 , 1 , 1.0f , 0xFFFF0000 , 0xFF000000 } ,
{ 0 , 0 , 1.0f , 0xFFFF0000 , 0xFF000000 } ,
2007-03-14 17:04:56 +00:00
} ;
/* Untransformed ones. Give them a different diffuse color to make the test look
* nicer . It also makes making sure that they are drawn correctly easier .
*/
struct sVertexT transformed_1 [ ] = {
2007-05-27 23:19:58 +00:00
{ 320 , 0 , 1.0f , 1.0f , 0xFFFFFF00 , 0xFF000000 } ,
{ 640 , 0 , 1.0f , 1.0f , 0xFFFFFF00 , 0xFF000000 } ,
{ 640 , 240 , 1.0f , 1.0f , 0xFFFFFF00 , 0xFF000000 } ,
{ 320 , 240 , 1.0f , 1.0f , 0xFFFFFF00 , 0xFF000000 } ,
2007-03-14 17:04:56 +00:00
} ;
struct sVertexT transformed_2 [ ] = {
2007-05-27 23:19:58 +00:00
{ 320 , 240 , 1.0f , 1.0f , 0xFFFFFF00 , 0xFF000000 } ,
{ 640 , 240 , 1.0f , 1.0f , 0xFFFFFF00 , 0xFF000000 } ,
{ 640 , 480 , 1.0f , 1.0f , 0xFFFFFF00 , 0xFF000000 } ,
{ 320 , 480 , 1.0f , 1.0f , 0xFFFFFF00 , 0xFF000000 } ,
2007-03-14 17:04:56 +00:00
} ;
2008-02-12 17:20:10 +00:00
struct vertex rev_fog_quads [ ] = {
{ - 1.0 , - 1.0 , 0.1 , 0x000000ff } ,
{ - 1.0 , 0.0 , 0.1 , 0x000000ff } ,
{ 0.0 , 0.0 , 0.1 , 0x000000ff } ,
{ 0.0 , - 1.0 , 0.1 , 0x000000ff } ,
{ 0.0 , - 1.0 , 0.9 , 0x000000ff } ,
{ 0.0 , 0.0 , 0.9 , 0x000000ff } ,
{ 1.0 , 0.0 , 0.9 , 0x000000ff } ,
{ 1.0 , - 1.0 , 0.9 , 0x000000ff } ,
{ 0.0 , 0.0 , 0.4 , 0x000000ff } ,
{ 0.0 , 1.0 , 0.4 , 0x000000ff } ,
{ 1.0 , 1.0 , 0.4 , 0x000000ff } ,
{ 1.0 , 0.0 , 0.4 , 0x000000ff } ,
{ - 1.0 , 0.0 , 0.7 , 0x000000ff } ,
{ - 1.0 , 1.0 , 0.7 , 0x000000ff } ,
{ 0.0 , 1.0 , 0.7 , 0x000000ff } ,
{ 0.0 , 0.0 , 0.7 , 0x000000ff } ,
} ;
2007-03-14 17:04:56 +00:00
WORD Indices [ ] = { 0 , 1 , 2 , 2 , 3 , 0 } ;
2007-07-24 19:07:59 +00:00
memset ( & caps , 0 , sizeof ( caps ) ) ;
hr = IDirect3DDevice9_GetDeviceCaps ( device , & caps ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_GetDeviceCaps returned %08x \n " , hr ) ;
2007-03-14 17:04:56 +00:00
hr = IDirect3DDevice9_Clear ( device , 0 , NULL , D3DCLEAR_TARGET , 0xffff00ff , 0.0 , 0 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_Clear returned %08x \n " , hr ) ;
2007-03-14 17:04:56 +00:00
/* Setup initial states: No lighting, fog on, fog color */
hr = IDirect3DDevice9_SetRenderState ( device , D3DRS_LIGHTING , FALSE ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " Turning off lighting returned %08x \n " , hr ) ;
2007-03-14 17:04:56 +00:00
hr = IDirect3DDevice9_SetRenderState ( device , D3DRS_FOGENABLE , TRUE ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " Turning on fog calculations returned %08x \n " , hr ) ;
2007-03-14 17:04:56 +00:00
hr = IDirect3DDevice9_SetRenderState ( device , D3DRS_FOGCOLOR , 0xFF00FF00 /* A nice green */ ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " Turning on fog calculations returned %08x \n " , hr ) ;
2007-03-14 17:04:56 +00:00
/* First test: Both table fog and vertex fog off */
hr = IDirect3DDevice9_SetRenderState ( device , D3DRS_FOGTABLEMODE , D3DFOG_NONE ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " Turning off table fog returned %08x \n " , hr ) ;
2007-03-14 17:04:56 +00:00
hr = IDirect3DDevice9_SetRenderState ( device , D3DRS_FOGVERTEXMODE , D3DFOG_NONE ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " Turning off table fog returned %08x \n " , hr ) ;
2007-03-14 17:04:56 +00:00
/* Start = 0, end = 1. Should be default, but set them */
hr = IDirect3DDevice9_SetRenderState ( device , D3DRS_FOGSTART , * ( ( DWORD * ) & start ) ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " Setting fog start returned %08x \n " , hr ) ;
2007-03-14 17:04:56 +00:00
hr = IDirect3DDevice9_SetRenderState ( device , D3DRS_FOGEND , * ( ( DWORD * ) & end ) ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " Setting fog start returned %08x \n " , hr ) ;
2007-03-14 17:04:56 +00:00
if ( IDirect3DDevice9_BeginScene ( device ) = = D3D_OK )
{
hr = IDirect3DDevice9_SetFVF ( device , D3DFVF_XYZ | D3DFVF_DIFFUSE | D3DFVF_SPECULAR ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " SetFVF returned %08x \n " , hr ) ;
2007-03-14 17:04:56 +00:00
/* Untransformed, vertex fog = NONE, table fog = NONE: Read the fog weighting from the specular color */
hr = IDirect3DDevice9_DrawIndexedPrimitiveUP ( device , D3DPT_TRIANGLELIST , 0 /* MinIndex */ , 4 /* NumVerts */ ,
2 /*PrimCount */ , Indices , D3DFMT_INDEX16 , unstransformed_1 ,
sizeof ( unstransformed_1 [ 0 ] ) ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " DrawIndexedPrimitiveUP returned %08x \n " , hr ) ;
2007-03-14 17:04:56 +00:00
/* That makes it use the Z value */
hr = IDirect3DDevice9_SetRenderState ( device , D3DRS_FOGVERTEXMODE , D3DFOG_LINEAR ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " Turning off table fog returned %08x \n " , hr ) ;
2007-03-14 17:04:56 +00:00
/* Untransformed, vertex fog != none (or table fog != none):
* Use the Z value as input into the equation
*/
hr = IDirect3DDevice9_DrawIndexedPrimitiveUP ( device , D3DPT_TRIANGLELIST , 0 /* MinIndex */ , 4 /* NumVerts */ ,
2 /*PrimCount */ , Indices , D3DFMT_INDEX16 , unstransformed_2 ,
sizeof ( unstransformed_1 [ 0 ] ) ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " DrawIndexedPrimitiveUP returned %08x \n " , hr ) ;
2007-03-14 17:04:56 +00:00
/* transformed verts */
hr = IDirect3DDevice9_SetFVF ( device , D3DFVF_XYZRHW | D3DFVF_DIFFUSE | D3DFVF_SPECULAR ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " SetFVF returned %08x \n " , hr ) ;
2007-03-14 17:04:56 +00:00
/* Transformed, vertex fog != NONE, pixel fog == NONE: Use specular color alpha component */
hr = IDirect3DDevice9_DrawIndexedPrimitiveUP ( device , D3DPT_TRIANGLELIST , 0 /* MinIndex */ , 4 /* NumVerts */ ,
2 /*PrimCount */ , Indices , D3DFMT_INDEX16 , transformed_1 ,
sizeof ( transformed_1 [ 0 ] ) ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " DrawIndexedPrimitiveUP returned %08x \n " , hr ) ;
2007-03-14 17:04:56 +00:00
hr = IDirect3DDevice9_SetRenderState ( device , D3DRS_FOGTABLEMODE , D3DFOG_LINEAR ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " Setting fog table mode to D3DFOG_LINEAR returned %08x \n " , hr ) ;
2007-03-14 17:04:56 +00:00
/* Transformed, table fog != none, vertex anything: Use Z value as input to the fog
* equation
*/
hr = IDirect3DDevice9_DrawIndexedPrimitiveUP ( device , D3DPT_TRIANGLELIST , 0 /* MinIndex */ , 4 /* NumVerts */ ,
2 /*PrimCount */ , Indices , D3DFMT_INDEX16 , transformed_2 ,
sizeof ( transformed_2 [ 0 ] ) ) ;
hr = IDirect3DDevice9_EndScene ( device ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " EndScene returned %08x \n " , hr ) ;
2007-03-14 17:04:56 +00:00
}
else
{
ok ( FALSE , " BeginScene failed \n " ) ;
}
IDirect3DDevice9_Present ( device , NULL , NULL , NULL , NULL ) ;
color = getPixelColor ( device , 160 , 360 ) ;
ok ( color = = 0x00FF0000 , " Untransformed vertex with no table or vertex fog has color %08x \n " , color ) ;
color = getPixelColor ( device , 160 , 120 ) ;
2008-03-21 16:20:49 +00:00
ok ( color = = 0x0000FF00 | | color = = 0x0000FE00 , " Untransformed vertex with linear vertex fog has color %08x \n " , color ) ;
2007-03-14 17:04:56 +00:00
color = getPixelColor ( device , 480 , 120 ) ;
ok ( color = = 0x00FFFF00 , " Transformed vertex with linear vertex fog has color %08x \n " , color ) ;
2007-07-24 19:07:59 +00:00
if ( caps . RasterCaps & D3DPRASTERCAPS_FOGTABLE )
{
color = getPixelColor ( device , 480 , 360 ) ;
2008-03-21 16:20:49 +00:00
ok ( color = = 0x0000FF00 | | color = = 0x0000FE00 , " Transformed vertex with linear table fog has color %08x \n " , color ) ;
2007-07-24 19:07:59 +00:00
}
else
{
/* Without fog table support the vertex fog is still applied, even though table fog is turned on.
* The settings above result in no fogging with vertex fog
*/
color = getPixelColor ( device , 480 , 120 ) ;
ok ( color = = 0x00FFFF00 , " Transformed vertex with linear vertex fog has color %08x \n " , color ) ;
trace ( " Info: Table fog not supported by this device \n " ) ;
}
2007-03-14 17:04:56 +00:00
2007-08-13 21:19:37 +00:00
/* Now test the special case fogstart == fogend */
hr = IDirect3DDevice9_Clear ( device , 0 , NULL , D3DCLEAR_TARGET , 0xff0000ff , 0.0 , 0 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_Clear returned %08x \n " , hr ) ;
2007-08-13 21:19:37 +00:00
if ( IDirect3DDevice9_BeginScene ( device ) = = D3D_OK )
{
start = 512 ;
end = 512 ;
hr = IDirect3DDevice9_SetRenderState ( device , D3DRS_FOGSTART , * ( ( DWORD * ) & start ) ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " Setting fog start returned %08x \n " , hr ) ;
2007-08-13 21:19:37 +00:00
hr = IDirect3DDevice9_SetRenderState ( device , D3DRS_FOGEND , * ( ( DWORD * ) & end ) ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " Setting fog start returned %08x \n " , hr ) ;
2007-08-13 21:19:37 +00:00
hr = IDirect3DDevice9_SetFVF ( device , D3DFVF_XYZ | D3DFVF_DIFFUSE | D3DFVF_SPECULAR ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " SetFVF returned %08x \n " , hr ) ;
2007-08-13 21:19:37 +00:00
hr = IDirect3DDevice9_SetRenderState ( device , D3DRS_FOGVERTEXMODE , D3DFOG_LINEAR ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetRenderState %08x \n " , hr ) ;
2007-08-13 21:19:37 +00:00
hr = IDirect3DDevice9_SetRenderState ( device , D3DRS_FOGTABLEMODE , D3DFOG_NONE ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " Setting fog table mode to D3DFOG_LINEAR returned %08x \n " , hr ) ;
2007-08-13 21:19:37 +00:00
/* Untransformed vertex, z coord = 0.1, fogstart = 512, fogend = 512. Would result in
* a completely fog - free primitive because start > zcoord , but because start = = end , the primitive
* is fully covered by fog . The same happens to the 2 nd untransformed quad with z = 1.0 .
* The third transformed quad remains unfogged because the fogcoords are read from the specular
* color and has fixed fogstart and fogend .
*/
hr = IDirect3DDevice9_DrawIndexedPrimitiveUP ( device , D3DPT_TRIANGLELIST , 0 /* MinIndex */ , 4 /* NumVerts */ ,
2 /*PrimCount */ , Indices , D3DFMT_INDEX16 , unstransformed_1 ,
sizeof ( unstransformed_1 [ 0 ] ) ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " DrawIndexedPrimitiveUP returned %08x \n " , hr ) ;
2007-08-13 21:19:37 +00:00
hr = IDirect3DDevice9_DrawIndexedPrimitiveUP ( device , D3DPT_TRIANGLELIST , 0 /* MinIndex */ , 4 /* NumVerts */ ,
2 /*PrimCount */ , Indices , D3DFMT_INDEX16 , unstransformed_2 ,
sizeof ( unstransformed_1 [ 0 ] ) ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " DrawIndexedPrimitiveUP returned %08x \n " , hr ) ;
2007-08-13 21:19:37 +00:00
hr = IDirect3DDevice9_SetFVF ( device , D3DFVF_XYZRHW | D3DFVF_DIFFUSE | D3DFVF_SPECULAR ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " SetFVF returned %08x \n " , hr ) ;
2007-08-13 21:19:37 +00:00
/* Transformed, vertex fog != NONE, pixel fog == NONE: Use specular color alpha component */
hr = IDirect3DDevice9_DrawIndexedPrimitiveUP ( device , D3DPT_TRIANGLELIST , 0 /* MinIndex */ , 4 /* NumVerts */ ,
2 /*PrimCount */ , Indices , D3DFMT_INDEX16 , transformed_1 ,
sizeof ( transformed_1 [ 0 ] ) ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " DrawIndexedPrimitiveUP returned %08x \n " , hr ) ;
2007-08-13 21:19:37 +00:00
hr = IDirect3DDevice9_EndScene ( device ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " EndScene returned %08x \n " , hr ) ;
2007-08-13 21:19:37 +00:00
}
else
{
ok ( FALSE , " BeginScene failed \n " ) ;
}
IDirect3DDevice9_Present ( device , NULL , NULL , NULL , NULL ) ;
color = getPixelColor ( device , 160 , 360 ) ;
2008-03-21 16:20:49 +00:00
ok ( color = = 0x0000FF00 | | color = = 0x0000FE00 , " Untransformed vertex with vertex fog and z = 0.1 has color %08x \n " , color ) ;
2007-08-13 21:19:37 +00:00
color = getPixelColor ( device , 160 , 120 ) ;
2008-03-21 16:20:49 +00:00
ok ( color = = 0x0000FF00 | | color = = 0x0000FE00 , " Untransformed vertex with vertex fog and z = 1.0 has color %08x \n " , color ) ;
2007-08-13 21:19:37 +00:00
color = getPixelColor ( device , 480 , 120 ) ;
ok ( color = = 0x00FFFF00 , " Transformed vertex with linear vertex fog has color %08x \n " , color ) ;
2008-02-12 17:20:10 +00:00
/* Test "reversed" fog without shaders. With shaders this fails on a few Windows D3D implementations,
* but without shaders it seems to work everywhere
*/
end = 0.2 ;
start = 0.8 ;
hr = IDirect3DDevice9_SetRenderState ( device , D3DRS_FOGSTART , * ( ( DWORD * ) & start ) ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " Setting fog start returned %08x \n " , hr ) ;
2008-02-12 17:20:10 +00:00
hr = IDirect3DDevice9_SetRenderState ( device , D3DRS_FOGEND , * ( ( DWORD * ) & end ) ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " Setting fog end returned %08x \n " , hr ) ;
2008-02-12 17:20:10 +00:00
hr = IDirect3DDevice9_SetFVF ( device , D3DFVF_XYZ | D3DFVF_DIFFUSE ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetFVF returned %08x \n " , hr ) ;
2008-02-12 17:20:10 +00:00
/* Test reversed fog without shaders. ATI cards have problems with reversed fog and shaders, so
* it doesn ' t seem very important for games . ATI cards also have problems with reversed table fog ,
* so skip this for now
*/
for ( i = 0 ; i < 1 /*2 - Table fog test disabled, fails on ATI */ ; i + + ) {
const char * mode = ( i ? " table " : " vertex " ) ;
hr = IDirect3DDevice9_Clear ( device , 0 , NULL , D3DCLEAR_TARGET , 0xffff0000 , 0.0 , 0 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_Clear returned %08x \n " , hr ) ;
2008-02-12 17:20:10 +00:00
hr = IDirect3DDevice9_SetRenderState ( device , D3DRS_FOGVERTEXMODE , i = = 0 ? D3DFOG_LINEAR : D3DFOG_NONE ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetRenderState returned %08x \n " , hr ) ;
2008-02-12 17:20:10 +00:00
hr = IDirect3DDevice9_SetRenderState ( device , D3DRS_FOGTABLEMODE , i = = 0 ? D3DFOG_NONE : D3DFOG_LINEAR ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetRenderState returned %08x \n " , hr ) ;
2008-02-12 17:20:10 +00:00
hr = IDirect3DDevice9_BeginScene ( device ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDDevice9_BeginScene returned %08x \n " , hr ) ;
2008-02-12 17:20:10 +00:00
if ( SUCCEEDED ( hr ) ) {
WORD Indices2 [ ] = { 0 , 1 , 2 , 2 , 3 , 0 ,
4 , 5 , 6 , 6 , 7 , 4 ,
8 , 9 , 10 , 10 , 11 , 8 ,
12 , 13 , 14 , 14 , 15 , 12 } ;
hr = IDirect3DDevice9_DrawIndexedPrimitiveUP ( device , D3DPT_TRIANGLELIST , 0 /* MinIndex */ ,
16 /* NumVerts */ , 8 /*PrimCount */ , Indices2 , D3DFMT_INDEX16 , rev_fog_quads ,
sizeof ( rev_fog_quads [ 0 ] ) ) ;
hr = IDirect3DDevice9_EndScene ( device ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDDevice9_EndScene returned %08x \n " , hr ) ;
2008-02-12 17:20:10 +00:00
}
IDirect3DDevice9_Present ( device , NULL , NULL , NULL , NULL ) ;
color = getPixelColor ( device , 160 , 360 ) ;
2008-03-21 16:20:49 +00:00
ok ( color = = 0x0000FF00 | | color = = 0x0000FE00 , " Reversed %s fog: z=0.1 has color 0x%08x, expected 0x0000ff00 \n " , mode , color ) ;
2008-02-12 17:20:10 +00:00
color = getPixelColor ( device , 160 , 120 ) ;
r = ( color & 0x00ff0000 ) > > 16 ;
g = ( color & 0x0000ff00 ) > > 8 ;
b = ( color & 0x000000ff ) ;
ok ( r = = 0x00 & & g > = 0x29 & & g < = 0x2d & & b > = 0xd2 & & b < = 0xd6 ,
" Reversed %s fog: z=0.7 has color 0x%08x, expected \n " , mode , color ) ;
color = getPixelColor ( device , 480 , 120 ) ;
r = ( color & 0x00ff0000 ) > > 16 ;
g = ( color & 0x0000ff00 ) > > 8 ;
b = ( color & 0x000000ff ) ;
ok ( r = = 0x00 & & g > = 0xa8 & & g < = 0xac & & b > = 0x53 & & b < = 0x57 ,
" Reversed %s fog: z=0.4 has color 0x%08x, expected \n " , mode , color ) ;
color = getPixelColor ( device , 480 , 360 ) ;
ok ( color = = 0x000000ff , " Reversed %s fog: z=0.9 has color 0x%08x, expected 0x000000ff \n " , mode , color ) ;
if ( ! ( caps . RasterCaps & D3DPRASTERCAPS_FOGTABLE ) ) {
skip ( " D3DPRASTERCAPS_FOGTABLE not supported, skipping reversed table fog test \n " ) ;
break ;
}
}
2007-03-14 17:04:56 +00:00
/* Turn off the fog master switch to avoid confusing other tests */
hr = IDirect3DDevice9_SetRenderState ( device , D3DRS_FOGENABLE , FALSE ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " Turning off fog calculations returned %08x \n " , hr ) ;
2007-08-13 21:19:37 +00:00
start = 0.0 ;
end = 1.0 ;
hr = IDirect3DDevice9_SetRenderState ( device , D3DRS_FOGSTART , * ( ( DWORD * ) & start ) ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " Setting fog start returned %08x \n " , hr ) ;
2007-08-13 21:19:37 +00:00
hr = IDirect3DDevice9_SetRenderState ( device , D3DRS_FOGEND , * ( ( DWORD * ) & end ) ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " Setting fog end returned %08x \n " , hr ) ;
2007-08-13 21:19:37 +00:00
hr = IDirect3DDevice9_SetRenderState ( device , D3DRS_FOGVERTEXMODE , D3DFOG_LINEAR ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetRenderState %08x \n " , hr ) ;
2007-08-13 21:19:37 +00:00
hr = IDirect3DDevice9_SetRenderState ( device , D3DRS_FOGTABLEMODE , D3DFOG_LINEAR ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " Setting fog table mode to D3DFOG_LINEAR returned %08x \n " , hr ) ;
2007-03-14 17:04:56 +00:00
}
2007-03-15 22:27:41 +00:00
/* This test verifies the behaviour of cube maps wrt. texture wrapping.
* D3D cube map wrapping always behaves like GL_CLAMP_TO_EDGE ,
* regardless of the actual addressing mode set . */
static void test_cube_wrap ( IDirect3DDevice9 * device )
{
static const float quad [ ] [ 6 ] = {
{ - 1.0f , - 1.0f , 0.0f , 1.0f , 1.0f , 1.0f } ,
{ - 1.0f , 1.0f , 0.0f , 1.0f , 1.0f , 1.0f } ,
{ 1.0f , - 1.0f , 0.0f , 1.0f , 1.0f , 1.0f } ,
{ 1.0f , 1.0f , 0.0f , 1.0f , 1.0f , 1.0f } ,
} ;
static const D3DVERTEXELEMENT9 decl_elements [ ] = {
{ 0 , 0 , D3DDECLTYPE_FLOAT3 , D3DDECLMETHOD_DEFAULT , D3DDECLUSAGE_POSITION , 0 } ,
{ 0 , 12 , D3DDECLTYPE_FLOAT3 , D3DDECLMETHOD_DEFAULT , D3DDECLUSAGE_TEXCOORD , 0 } ,
D3DDECL_END ( )
} ;
static const struct {
D3DTEXTUREADDRESS mode ;
const char * name ;
} address_modes [ ] = {
{ D3DTADDRESS_WRAP , " D3DTADDRESS_WRAP " } ,
{ D3DTADDRESS_MIRROR , " D3DTADDRESS_MIRROR " } ,
{ D3DTADDRESS_CLAMP , " D3DTADDRESS_CLAMP " } ,
{ D3DTADDRESS_BORDER , " D3DTADDRESS_BORDER " } ,
{ D3DTADDRESS_MIRRORONCE , " D3DTADDRESS_MIRRORONCE " } ,
} ;
IDirect3DVertexDeclaration9 * vertex_declaration = NULL ;
IDirect3DCubeTexture9 * texture = NULL ;
IDirect3DSurface9 * surface = NULL ;
D3DLOCKED_RECT locked_rect ;
HRESULT hr ;
2008-01-25 12:26:40 +00:00
UINT x ;
INT y , face ;
2007-03-15 22:27:41 +00:00
hr = IDirect3DDevice9_CreateVertexDeclaration ( device , decl_elements , & vertex_declaration ) ;
ok ( SUCCEEDED ( hr ) , " CreateVertexDeclaration failed (0x%08x) \n " , hr ) ;
hr = IDirect3DDevice9_SetVertexDeclaration ( device , vertex_declaration ) ;
ok ( SUCCEEDED ( hr ) , " SetVertexDeclaration failed (0x%08x) \n " , hr ) ;
hr = IDirect3DDevice9_CreateOffscreenPlainSurface ( device , 128 , 128 ,
D3DFMT_A8R8G8B8 , D3DPOOL_SYSTEMMEM , & surface , NULL ) ;
ok ( SUCCEEDED ( hr ) , " CreateOffscreenPlainSurface failed (0x%08x) \n " , hr ) ;
2007-12-08 21:31:50 +00:00
hr = IDirect3DSurface9_LockRect ( surface , & locked_rect , NULL , 0 ) ;
2007-03-15 22:27:41 +00:00
ok ( SUCCEEDED ( hr ) , " LockRect failed (0x%08x) \n " , hr ) ;
for ( y = 0 ; y < 128 ; + + y )
{
DWORD * ptr = ( DWORD * ) ( ( ( BYTE * ) locked_rect . pBits ) + ( y * locked_rect . Pitch ) ) ;
for ( x = 0 ; x < 64 ; + + x )
{
* ptr + + = 0xffff0000 ;
}
for ( x = 64 ; x < 128 ; + + x )
{
* ptr + + = 0xff0000ff ;
}
}
hr = IDirect3DSurface9_UnlockRect ( surface ) ;
ok ( SUCCEEDED ( hr ) , " UnlockRect failed (0x%08x) \n " , hr ) ;
hr = IDirect3DDevice9_CreateCubeTexture ( device , 128 , 1 , 0 , D3DFMT_A8R8G8B8 ,
D3DPOOL_DEFAULT , & texture , NULL ) ;
ok ( SUCCEEDED ( hr ) , " CreateCubeTexture failed (0x%08x) \n " , hr ) ;
/* Create cube faces */
for ( face = 0 ; face < 6 ; + + face )
{
IDirect3DSurface9 * face_surface = NULL ;
hr = IDirect3DCubeTexture9_GetCubeMapSurface ( texture , face , 0 , & face_surface ) ;
ok ( SUCCEEDED ( hr ) , " GetCubeMapSurface failed (0x%08x) \n " , hr ) ;
hr = IDirect3DDevice9_UpdateSurface ( device , surface , NULL , face_surface , NULL ) ;
ok ( SUCCEEDED ( hr ) , " UpdateSurface failed (0x%08x) \n " , hr ) ;
IDirect3DSurface9_Release ( face_surface ) ;
}
hr = IDirect3DDevice9_SetTexture ( device , 0 , ( IDirect3DBaseTexture9 * ) texture ) ;
ok ( SUCCEEDED ( hr ) , " SetTexture failed (0x%08x) \n " , hr ) ;
hr = IDirect3DDevice9_SetSamplerState ( device , 0 , D3DSAMP_MINFILTER , D3DTEXF_LINEAR ) ;
ok ( SUCCEEDED ( hr ) , " SetSamplerState D3DSAMP_MINFILTER failed (0x%08x) \n " , hr ) ;
hr = IDirect3DDevice9_SetSamplerState ( device , 0 , D3DSAMP_MAGFILTER , D3DTEXF_LINEAR ) ;
ok ( SUCCEEDED ( hr ) , " SetSamplerState D3DSAMP_MAGFILTER failed (0x%08x) \n " , hr ) ;
hr = IDirect3DDevice9_SetSamplerState ( device , 0 , D3DSAMP_BORDERCOLOR , 0xff00ff00 ) ;
ok ( SUCCEEDED ( hr ) , " SetSamplerState D3DSAMP_BORDERCOLOR failed (0x%08x) \n " , hr ) ;
hr = IDirect3DDevice9_SetRenderState ( device , D3DRS_LIGHTING , FALSE ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetRenderState returned %08x \n " , hr ) ;
2007-03-15 22:27:41 +00:00
for ( x = 0 ; x < ( sizeof ( address_modes ) / sizeof ( * address_modes ) ) ; + + x )
{
DWORD color ;
hr = IDirect3DDevice9_SetSamplerState ( device , 0 , D3DSAMP_ADDRESSU , address_modes [ x ] . mode ) ;
ok ( SUCCEEDED ( hr ) , " SetSamplerState D3DSAMP_ADDRESSU (%s) failed (0x%08x) \n " , address_modes [ x ] . name , hr ) ;
hr = IDirect3DDevice9_SetSamplerState ( device , 0 , D3DSAMP_ADDRESSV , address_modes [ x ] . mode ) ;
ok ( SUCCEEDED ( hr ) , " SetSamplerState D3DSAMP_ADDRESSV (%s) failed (0x%08x) \n " , address_modes [ x ] . name , hr ) ;
hr = IDirect3DDevice9_BeginScene ( device ) ;
ok ( SUCCEEDED ( hr ) , " BeginScene failed (0x%08x) \n " , hr ) ;
hr = IDirect3DDevice9_DrawPrimitiveUP ( device , D3DPT_TRIANGLESTRIP , 2 , & quad [ 0 ] , sizeof ( quad [ 0 ] ) ) ;
ok ( SUCCEEDED ( hr ) , " DrawPrimitiveUP failed (0x%08x) \n " , hr ) ;
hr = IDirect3DDevice9_EndScene ( device ) ;
ok ( SUCCEEDED ( hr ) , " EndScene failed (0x%08x) \n " , hr ) ;
hr = IDirect3DDevice9_Present ( device , NULL , NULL , NULL , NULL ) ;
ok ( SUCCEEDED ( hr ) , " Present failed (0x%08x) \n " , hr ) ;
/* Due to the nature of this test, we sample essentially at the edge
* between two faces . Because of this it ' s undefined from which face
2008-03-26 21:23:36 +00:00
* the driver will sample . Fortunately that ' s not important for this
2007-03-15 22:27:41 +00:00
* test , since all we care about is that it doesn ' t sample from the
* other side of the surface or from the border . */
color = getPixelColor ( device , 320 , 240 ) ;
ok ( color = = 0x00ff0000 | | color = = 0x000000ff ,
" Got color 0x%08x for addressing mode %s, expected 0x00ff0000 or 0x000000ff. \n " ,
color , address_modes [ x ] . name ) ;
hr = IDirect3DDevice9_Clear ( device , 0 , NULL , D3DCLEAR_TARGET , 0 , 0.0f , 0 ) ;
ok ( SUCCEEDED ( hr ) , " Clear failed (0x%08x) \n " , hr ) ;
}
hr = IDirect3DDevice9_SetTexture ( device , 0 , NULL ) ;
ok ( SUCCEEDED ( hr ) , " SetTexture failed (0x%08x) \n " , hr ) ;
IDirect3DVertexDeclaration9_Release ( vertex_declaration ) ;
IDirect3DCubeTexture9_Release ( texture ) ;
IDirect3DSurface9_Release ( surface ) ;
}
2007-07-27 14:47:08 +00:00
static void offscreen_test ( IDirect3DDevice9 * device )
{
HRESULT hr ;
IDirect3DTexture9 * offscreenTexture = NULL ;
IDirect3DSurface9 * backbuffer = NULL , * offscreen = NULL ;
DWORD color ;
static const float quad [ ] [ 5 ] = {
{ - 0.5f , - 0.5f , 0.1f , 0.0f , 0.0f } ,
{ - 0.5f , 0.5f , 0.1f , 0.0f , 1.0f } ,
{ 0.5f , - 0.5f , 0.1f , 1.0f , 0.0f } ,
{ 0.5f , 0.5f , 0.1f , 1.0f , 1.0f } ,
} ;
hr = IDirect3DDevice9_Clear ( device , 0 , NULL , D3DCLEAR_TARGET , 0xffff0000 , 0.0 , 0 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " Clear failed, hr = %08x \n " , hr ) ;
2007-07-27 14:47:08 +00:00
hr = IDirect3DDevice9_CreateTexture ( device , 128 , 128 , 1 , D3DUSAGE_RENDERTARGET , D3DFMT_X8R8G8B8 , D3DPOOL_DEFAULT , & offscreenTexture , NULL ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK | | hr = = D3DERR_INVALIDCALL , " Creating the offscreen render target failed, hr = %08x \n " , hr ) ;
2007-07-27 14:47:08 +00:00
if ( ! offscreenTexture ) {
trace ( " Failed to create an X8R8G8B8 offscreen texture, trying R5G6B5 \n " ) ;
hr = IDirect3DDevice9_CreateTexture ( device , 128 , 128 , 1 , D3DUSAGE_RENDERTARGET , D3DFMT_R5G6B5 , D3DPOOL_DEFAULT , & offscreenTexture , NULL ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK | | hr = = D3DERR_INVALIDCALL , " Creating the offscreen render target failed, hr = %08x \n " , hr ) ;
2007-07-27 14:47:08 +00:00
if ( ! offscreenTexture ) {
skip ( " Cannot create an offscreen render target \n " ) ;
goto out ;
}
}
hr = IDirect3DDevice9_GetBackBuffer ( device , 0 , 0 , D3DBACKBUFFER_TYPE_MONO , & backbuffer ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " Can't get back buffer, hr = %08x \n " , hr ) ;
2007-07-27 14:47:08 +00:00
if ( ! backbuffer ) {
goto out ;
}
hr = IDirect3DTexture9_GetSurfaceLevel ( offscreenTexture , 0 , & offscreen ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " Can't get offscreen surface, hr = %08x \n " , hr ) ;
2007-07-27 14:47:08 +00:00
if ( ! offscreen ) {
goto out ;
}
hr = IDirect3DDevice9_SetFVF ( device , D3DFVF_XYZ | D3DFVF_TEX1 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " SetFVF failed, hr = %08x \n " , hr ) ;
2007-07-27 14:47:08 +00:00
hr = IDirect3DDevice9_SetTextureStageState ( device , 0 , D3DTSS_COLOROP , D3DTOP_SELECTARG1 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " SetTextureStageState failed, hr = %08x \n " , hr ) ;
2007-07-27 14:47:08 +00:00
hr = IDirect3DDevice9_SetTextureStageState ( device , 0 , D3DTSS_COLORARG1 , D3DTA_TEXTURE ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " SetTextureStageState failed, hr = %08x \n " , hr ) ;
2007-12-08 15:46:05 +00:00
hr = IDirect3DDevice9_SetSamplerState ( device , 0 , D3DSAMP_MINFILTER , D3DTEXF_POINT ) ;
2007-07-27 14:47:08 +00:00
ok ( SUCCEEDED ( hr ) , " SetSamplerState D3DSAMP_MINFILTER failed (0x%08x) \n " , hr ) ;
2007-12-08 15:46:05 +00:00
hr = IDirect3DDevice9_SetSamplerState ( device , 0 , D3DSAMP_MAGFILTER , D3DTEXF_POINT ) ;
2007-07-27 14:47:08 +00:00
ok ( SUCCEEDED ( hr ) , " SetSamplerState D3DSAMP_MAGFILTER failed (0x%08x) \n " , hr ) ;
hr = IDirect3DDevice9_SetRenderState ( device , D3DRS_LIGHTING , FALSE ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetRenderState returned %08x \n " , hr ) ;
2007-07-27 14:47:08 +00:00
if ( IDirect3DDevice9_BeginScene ( device ) = = D3D_OK ) {
hr = IDirect3DDevice9_SetRenderTarget ( device , 0 , offscreen ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " SetRenderTarget failed, hr = %08x \n " , hr ) ;
2007-07-27 14:47:08 +00:00
hr = IDirect3DDevice9_Clear ( device , 0 , NULL , D3DCLEAR_TARGET , 0xffff00ff , 0.0 , 0 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " Clear failed, hr = %08x \n " , hr ) ;
2007-07-27 14:47:08 +00:00
2008-03-26 21:23:36 +00:00
/* Draw without textures - Should result in a white quad */
2007-07-27 14:47:08 +00:00
hr = IDirect3DDevice9_DrawPrimitiveUP ( device , D3DPT_TRIANGLESTRIP , 2 , quad , sizeof ( quad [ 0 ] ) ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " DrawPrimitiveUP failed, hr = %08x \n " , hr ) ;
2007-07-27 14:47:08 +00:00
hr = IDirect3DDevice9_SetRenderTarget ( device , 0 , backbuffer ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " SetRenderTarget failed, hr = %08x \n " , hr ) ;
2007-07-27 14:47:08 +00:00
hr = IDirect3DDevice9_SetTexture ( device , 0 , ( IDirect3DBaseTexture9 * ) offscreenTexture ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " SetTexture failed, %08x \n " , hr ) ;
2007-07-27 14:47:08 +00:00
/* This time with the texture */
hr = IDirect3DDevice9_DrawPrimitiveUP ( device , D3DPT_TRIANGLESTRIP , 2 , quad , sizeof ( quad [ 0 ] ) ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " DrawPrimitiveUP failed, hr = %08x \n " , hr ) ;
2007-07-27 14:47:08 +00:00
IDirect3DDevice9_EndScene ( device ) ;
}
IDirect3DDevice9_Present ( device , NULL , NULL , NULL , NULL ) ;
/* Center quad - should be white */
color = getPixelColor ( device , 320 , 240 ) ;
ok ( color = = 0x00ffffff , " Offscreen failed: Got color 0x%08x, expected 0x00ffffff. \n " , color ) ;
/* Some quad in the cleared part of the texture */
color = getPixelColor ( device , 170 , 240 ) ;
ok ( color = = 0x00ff00ff , " Offscreen failed: Got color 0x%08x, expected 0x00ff00ff. \n " , color ) ;
/* Part of the originally cleared back buffer */
color = getPixelColor ( device , 10 , 10 ) ;
ok ( color = = 0x00ff0000 , " Offscreen failed: Got color 0x%08x, expected 0x00ff0000. \n " , color ) ;
if ( 0 ) {
/* Lower left corner of the screen, where back buffer offscreen rendering draws the offscreen texture.
* It should be red , but the offscreen texture may leave some junk there . Not tested yet . Depending on
* the offscreen rendering mode this test would succeed or fail
*/
color = getPixelColor ( device , 10 , 470 ) ;
ok ( color = = 0x00ff0000 , " Offscreen failed: Got color 0x%08x, expected 0x00ff0000. \n " , color ) ;
}
out :
hr = IDirect3DDevice9_SetTexture ( device , 0 , NULL ) ;
/* restore things */
if ( backbuffer ) {
IDirect3DDevice9_SetRenderTarget ( device , 0 , backbuffer ) ;
IDirect3DSurface9_Release ( backbuffer ) ;
}
if ( offscreenTexture ) {
IDirect3DTexture9_Release ( offscreenTexture ) ;
}
if ( offscreen ) {
IDirect3DSurface9_Release ( offscreen ) ;
}
}
2007-03-22 16:41:22 +00:00
/* This test tests fog in combination with shaders.
* What ' s tested : linear fog ( vertex and table ) with pixel shader
* linear table fog with non foggy vertex shader
2009-01-19 17:56:25 +00:00
* vertex fog with foggy vertex shader , non - linear
* fog with shader , non - linear fog with foggy shader ,
* linear table fog with foggy shader
2007-03-22 16:41:22 +00:00
*/
static void fog_with_shader_test ( IDirect3DDevice9 * device )
{
HRESULT hr ;
DWORD color ;
2007-05-27 11:25:46 +00:00
union {
float f ;
DWORD i ;
} start , end ;
2007-03-22 16:41:22 +00:00
unsigned int i , j ;
/* basic vertex shader without fog computation ("non foggy") */
static const DWORD vertex_shader_code1 [ ] = {
0xfffe0101 , /* vs_1_1 */
0x0000001f , 0x80000000 , 0x900f0000 , /* dcl_position v0 */
0x0000001f , 0x8000000a , 0x900f0001 , /* dcl_color0 v1 */
0x00000001 , 0xc00f0000 , 0x90e40000 , /* mov oPos, v0 */
0x00000001 , 0xd00f0000 , 0x90e40001 , /* mov oD0, v1 */
0x0000ffff
} ;
/* basic vertex shader with reversed fog computation ("foggy") */
static const DWORD vertex_shader_code2 [ ] = {
0xfffe0101 , /* vs_1_1 */
0x0000001f , 0x80000000 , 0x900f0000 , /* dcl_position v0 */
0x0000001f , 0x8000000a , 0x900f0001 , /* dcl_color0 v1 */
0x00000051 , 0xa00f0000 , 0xbfa00000 , 0x00000000 , 0xbf666666 , 0x00000000 , /* def c0, -1.25, 0.0, -0.9, 0.0 */
0x00000001 , 0xc00f0000 , 0x90e40000 , /* mov oPos, v0 */
0x00000001 , 0xd00f0000 , 0x90e40001 , /* mov oD0, v1 */
0x00000002 , 0x800f0000 , 0x90aa0000 , 0xa0aa0000 , /* add r0, v0.z, c0.z */
0x00000005 , 0xc00f0001 , 0x80000000 , 0xa0000000 , /* mul oFog, r0.x, c0.x */
0x0000ffff
} ;
/* basic pixel shader */
static const DWORD pixel_shader_code [ ] = {
0xffff0101 , /* ps_1_1 */
0x00000001 , 0x800f0000 , 0x90e40000 , /* mov r0, vo */
0x0000ffff
} ;
static struct vertex quad [ ] = {
{ - 1.0f , - 1.0f , 0.0f , 0xFFFF0000 } ,
{ - 1.0f , 1.0f , 0.0f , 0xFFFF0000 } ,
{ 1.0f , - 1.0f , 0.0f , 0xFFFF0000 } ,
{ 1.0f , 1.0f , 0.0f , 0xFFFF0000 } ,
} ;
static const D3DVERTEXELEMENT9 decl_elements [ ] = {
{ 0 , 0 , D3DDECLTYPE_FLOAT3 , D3DDECLMETHOD_DEFAULT , D3DDECLUSAGE_POSITION , 0 } ,
{ 0 , 12 , D3DDECLTYPE_D3DCOLOR , D3DDECLMETHOD_DEFAULT , D3DDECLUSAGE_COLOR , 0 } ,
D3DDECL_END ( )
} ;
IDirect3DVertexDeclaration9 * vertex_declaration = NULL ;
IDirect3DVertexShader9 * vertex_shader [ 3 ] = { NULL , NULL , NULL } ;
IDirect3DPixelShader9 * pixel_shader [ 2 ] = { NULL , NULL } ;
/* This reference data was collected on a nVidia GeForce 7600GS driver version 84.19 DirectX version 9.0c on Windows XP */
static const struct test_data_t {
int vshader ;
int pshader ;
D3DFOGMODE vfog ;
D3DFOGMODE tfog ;
unsigned int color [ 11 ] ;
} test_data [ ] = {
/* only pixel shader: */
2009-01-01 19:02:35 +00:00
{ 0 , 1 , D3DFOG_NONE , D3DFOG_LINEAR ,
2008-02-12 16:05:40 +00:00
{ 0x00ff0000 , 0x00ff0000 , 0x00df2000 , 0x00bf4000 , 0x009f6000 , 0x007f8000 ,
0x005fa000 , 0x0040bf00 , 0x0020df00 , 0x0000ff00 , 0x0000ff00 } } ,
2009-01-01 19:02:35 +00:00
{ 0 , 1 , D3DFOG_EXP , D3DFOG_LINEAR ,
2008-02-12 16:05:40 +00:00
{ 0x00ff0000 , 0x00ff0000 , 0x00df2000 , 0x00bf4000 , 0x009f6000 , 0x007f8000 ,
0x005fa000 , 0x0040bf00 , 0x0020df00 , 0x0000ff00 , 0x0000ff00 } } ,
2009-01-01 19:02:35 +00:00
{ 0 , 1 , D3DFOG_EXP2 , D3DFOG_LINEAR ,
2008-02-12 16:05:40 +00:00
{ 0x00ff0000 , 0x00ff0000 , 0x00df2000 , 0x00bf4000 , 0x009f6000 , 0x007f8000 ,
0x005fa000 , 0x0040bf00 , 0x0020df00 , 0x0000ff00 , 0x0000ff00 } } ,
2009-01-01 19:02:35 +00:00
{ 0 , 1 , D3DFOG_LINEAR , D3DFOG_NONE ,
2008-02-12 16:05:40 +00:00
{ 0x00ff0000 , 0x00ff0000 , 0x00df2000 , 0x00bf4000 , 0x009f6000 , 0x007f8000 ,
0x005fa000 , 0x0040bf00 , 0x0020df00 , 0x0000ff00 , 0x0000ff00 } } ,
2009-01-01 19:02:35 +00:00
{ 0 , 1 , D3DFOG_LINEAR , D3DFOG_LINEAR ,
2008-02-12 16:05:40 +00:00
{ 0x00ff0000 , 0x00ff0000 , 0x00df2000 , 0x00bf4000 , 0x009f6000 , 0x007f8000 ,
0x005fa000 , 0x0040bf00 , 0x0020df00 , 0x0000ff00 , 0x0000ff00 } } ,
2007-03-22 16:41:22 +00:00
/* vertex shader */
2009-01-01 19:02:35 +00:00
{ 1 , 0 , D3DFOG_NONE , D3DFOG_NONE ,
2007-03-22 16:41:22 +00:00
{ 0x0000ff00 , 0x0000ff00 , 0x0000ff00 , 0x0000ff00 , 0x0000ff00 , 0x0000ff00 ,
0x0000ff00 , 0x0000ff00 , 0x0000ff00 , 0x0000ff00 , 0x0000ff00 } } ,
2009-01-01 19:02:35 +00:00
{ 1 , 0 , D3DFOG_NONE , D3DFOG_LINEAR ,
2008-02-12 16:05:40 +00:00
{ 0x00ff0000 , 0x00ff0000 , 0x00df2000 , 0x00bf4000 , 0x009f6000 , 0x007f8000 ,
0x005fa000 , 0x0040bf00 , 0x0020df00 , 0x0000ff00 , 0x0000ff00 } } ,
2009-01-01 19:02:35 +00:00
{ 1 , 0 , D3DFOG_EXP , D3DFOG_LINEAR ,
2008-02-12 16:05:40 +00:00
{ 0x00ff0000 , 0x00ff0000 , 0x00df2000 , 0x00bf4000 , 0x009f6000 , 0x007f8000 ,
0x005fa000 , 0x0040bf00 , 0x0020df00 , 0x0000ff00 , 0x0000ff00 } } ,
2009-01-01 19:02:35 +00:00
{ 1 , 0 , D3DFOG_EXP2 , D3DFOG_LINEAR ,
2008-02-12 16:05:40 +00:00
{ 0x00ff0000 , 0x00ff0000 , 0x00df2000 , 0x00bf4000 , 0x009f6000 , 0x007f8000 ,
0x005fa000 , 0x0040bf00 , 0x0020df00 , 0x0000ff00 , 0x0000ff00 } } ,
2009-01-01 19:02:35 +00:00
{ 1 , 0 , D3DFOG_LINEAR , D3DFOG_LINEAR ,
2008-02-12 16:05:40 +00:00
{ 0x00ff0000 , 0x00ff0000 , 0x00df2000 , 0x00bf4000 , 0x009f6000 , 0x007f8000 ,
0x005fa000 , 0x0040bf00 , 0x0020df00 , 0x0000ff00 , 0x0000ff00 } } ,
2007-03-22 16:41:22 +00:00
/* vertex shader and pixel shader */
2009-01-19 17:56:25 +00:00
/* The next 4 tests would read the fog coord output, but it isn't available.
* The result is a fully fogged quad , no matter what the Z coord is . This is on
* a geforce 7400 , 97.52 driver , Windows Vista , but probably hardware dependent .
* These tests should be disabled if some other hardware behaves differently
*/
{ 1 , 1 , D3DFOG_NONE , D3DFOG_NONE ,
{ 0x0000ff00 , 0x0000ff00 , 0x0000ff00 , 0x0000ff00 , 0x0000ff00 , 0x0000ff00 ,
0x0000ff00 , 0x0000ff00 , 0x0000ff00 , 0x0000ff00 , 0x0000ff00 } } ,
{ 1 , 1 , D3DFOG_LINEAR , D3DFOG_NONE ,
{ 0x0000ff00 , 0x0000ff00 , 0x0000ff00 , 0x0000ff00 , 0x0000ff00 , 0x0000ff00 ,
0x0000ff00 , 0x0000ff00 , 0x0000ff00 , 0x0000ff00 , 0x0000ff00 } } ,
{ 1 , 1 , D3DFOG_EXP , D3DFOG_NONE ,
{ 0x0000ff00 , 0x0000ff00 , 0x0000ff00 , 0x0000ff00 , 0x0000ff00 , 0x0000ff00 ,
0x0000ff00 , 0x0000ff00 , 0x0000ff00 , 0x0000ff00 , 0x0000ff00 } } ,
{ 1 , 1 , D3DFOG_EXP2 , D3DFOG_NONE ,
{ 0x0000ff00 , 0x0000ff00 , 0x0000ff00 , 0x0000ff00 , 0x0000ff00 , 0x0000ff00 ,
0x0000ff00 , 0x0000ff00 , 0x0000ff00 , 0x0000ff00 , 0x0000ff00 } } ,
/* These use the Z coordinate with linear table fog */
2009-01-01 19:02:35 +00:00
{ 1 , 1 , D3DFOG_NONE , D3DFOG_LINEAR ,
2008-02-12 16:05:40 +00:00
{ 0x00ff0000 , 0x00ff0000 , 0x00df2000 , 0x00bf4000 , 0x009f6000 , 0x007f8000 ,
0x005fa000 , 0x0040bf00 , 0x0020df00 , 0x0000ff00 , 0x0000ff00 } } ,
2009-01-01 19:02:35 +00:00
{ 1 , 1 , D3DFOG_EXP , D3DFOG_LINEAR ,
2008-02-12 16:05:40 +00:00
{ 0x00ff0000 , 0x00ff0000 , 0x00df2000 , 0x00bf4000 , 0x009f6000 , 0x007f8000 ,
0x005fa000 , 0x0040bf00 , 0x0020df00 , 0x0000ff00 , 0x0000ff00 } } ,
2009-01-01 19:02:35 +00:00
{ 1 , 1 , D3DFOG_EXP2 , D3DFOG_LINEAR ,
2008-02-12 16:05:40 +00:00
{ 0x00ff0000 , 0x00ff0000 , 0x00df2000 , 0x00bf4000 , 0x009f6000 , 0x007f8000 ,
0x005fa000 , 0x0040bf00 , 0x0020df00 , 0x0000ff00 , 0x0000ff00 } } ,
2009-01-01 19:02:35 +00:00
{ 1 , 1 , D3DFOG_LINEAR , D3DFOG_LINEAR ,
2008-02-12 16:05:40 +00:00
{ 0x00ff0000 , 0x00ff0000 , 0x00df2000 , 0x00bf4000 , 0x009f6000 , 0x007f8000 ,
0x005fa000 , 0x0040bf00 , 0x0020df00 , 0x0000ff00 , 0x0000ff00 } } ,
2009-01-19 17:56:25 +00:00
/* Non-linear table fog without fog coord */
{ 1 , 1 , D3DFOG_NONE , D3DFOG_EXP ,
{ 0x00ff0000 , 0x00e71800 , 0x00d12e00 , 0x00bd4200 , 0x00ab5400 , 0x009b6400 ,
0x008d7200 , 0x007f8000 , 0x00738c00 , 0x00689700 , 0x005ea100 } } ,
{ 1 , 1 , D3DFOG_NONE , D3DFOG_EXP2 ,
{ 0x00fd0200 , 0x00f50200 , 0x00f50a00 , 0x00e91600 , 0x00d92600 , 0x00c73800 ,
0x00b24d00 , 0x009c6300 , 0x00867900 , 0x00728d00 , 0x005ea100 } } ,
2007-03-22 16:41:22 +00:00
2007-08-08 11:15:12 +00:00
#if 0 /* FIXME: these fail on GeForce 8500 */
2007-03-22 16:41:22 +00:00
/* foggy vertex shader */
2009-01-01 19:02:35 +00:00
{ 2 , 0 , D3DFOG_NONE , D3DFOG_NONE ,
2007-03-22 16:41:22 +00:00
{ 0x00ff0000 , 0x00fe0100 , 0x00de2100 , 0x00bf4000 , 0x009f6000 , 0x007f8000 ,
2007-04-20 13:25:35 +00:00
0x005fa000 , 0x003fc000 , 0x001fe000 , 0x0000ff00 , 0x0000ff00 } } ,
2009-01-01 19:02:35 +00:00
{ 2 , 0 , D3DFOG_EXP , D3DFOG_NONE ,
2007-03-22 16:41:22 +00:00
{ 0x00ff0000 , 0x00fe0100 , 0x00de2100 , 0x00bf4000 , 0x009f6000 , 0x007f8000 ,
2007-04-20 13:25:35 +00:00
0x005fa000 , 0x003fc000 , 0x001fe000 , 0x0000ff00 , 0x0000ff00 } } ,
2009-01-01 19:02:35 +00:00
{ 2 , 0 , D3DFOG_EXP2 , D3DFOG_NONE ,
2007-03-22 16:41:22 +00:00
{ 0x00ff0000 , 0x00fe0100 , 0x00de2100 , 0x00bf4000 , 0x009f6000 , 0x007f8000 ,
2007-04-20 13:25:35 +00:00
0x005fa000 , 0x003fc000 , 0x001fe000 , 0x0000ff00 , 0x0000ff00 } } ,
2009-01-01 19:02:35 +00:00
{ 2 , 0 , D3DFOG_LINEAR , D3DFOG_NONE ,
2007-03-22 16:41:22 +00:00
{ 0x00ff0000 , 0x00fe0100 , 0x00de2100 , 0x00bf4000 , 0x009f6000 , 0x007f8000 ,
2007-04-20 13:25:35 +00:00
0x005fa000 , 0x003fc000 , 0x001fe000 , 0x0000ff00 , 0x0000ff00 } } ,
2007-08-08 11:15:12 +00:00
# endif
2007-03-22 16:41:22 +00:00
2009-01-19 17:56:25 +00:00
/* foggy vertex shader and pixel shader. First 4 tests with vertex fog,
* all using the fixed fog - coord linear fog
*/
2009-01-01 19:02:35 +00:00
{ 2 , 1 , D3DFOG_NONE , D3DFOG_NONE ,
2007-03-22 16:41:22 +00:00
{ 0x00ff0000 , 0x00fe0100 , 0x00de2100 , 0x00bf4000 , 0x009f6000 , 0x007f8000 ,
2007-04-20 13:25:35 +00:00
0x005fa000 , 0x003fc000 , 0x001fe000 , 0x0000ff00 , 0x0000ff00 } } ,
2009-01-01 19:02:35 +00:00
{ 2 , 1 , D3DFOG_EXP , D3DFOG_NONE ,
2007-03-22 16:41:22 +00:00
{ 0x00ff0000 , 0x00fe0100 , 0x00de2100 , 0x00bf4000 , 0x009f6000 , 0x007f8000 ,
2007-04-20 13:25:35 +00:00
0x005fa000 , 0x003fc000 , 0x001fe000 , 0x0000ff00 , 0x0000ff00 } } ,
2009-01-01 19:02:35 +00:00
{ 2 , 1 , D3DFOG_EXP2 , D3DFOG_NONE ,
2007-03-22 16:41:22 +00:00
{ 0x00ff0000 , 0x00fe0100 , 0x00de2100 , 0x00bf4000 , 0x009f6000 , 0x007f8000 ,
2007-04-20 13:25:35 +00:00
0x005fa000 , 0x003fc000 , 0x001fe000 , 0x0000ff00 , 0x0000ff00 } } ,
2009-01-01 19:02:35 +00:00
{ 2 , 1 , D3DFOG_LINEAR , D3DFOG_NONE ,
2007-03-22 16:41:22 +00:00
{ 0x00ff0000 , 0x00fe0100 , 0x00de2100 , 0x00bf4000 , 0x009f6000 , 0x007f8000 ,
2007-04-20 13:25:35 +00:00
0x005fa000 , 0x003fc000 , 0x001fe000 , 0x0000ff00 , 0x0000ff00 } } ,
2007-03-22 16:41:22 +00:00
2009-01-19 17:56:25 +00:00
/* These use table fog. Here the shader-provided fog coordinate is
* ignored and the z coordinate used instead
*/
{ 2 , 1 , D3DFOG_NONE , D3DFOG_EXP ,
{ 0x00ff0000 , 0x00e71800 , 0x00d12e00 , 0x00bd4200 , 0x00ab5400 , 0x009b6400 ,
0x008d7200 , 0x007f8000 , 0x00738c00 , 0x00689700 , 0x005ea100 } } ,
{ 2 , 1 , D3DFOG_NONE , D3DFOG_EXP2 ,
{ 0x00fd0200 , 0x00f50200 , 0x00f50a00 , 0x00e91600 , 0x00d92600 , 0x00c73800 ,
0x00b24d00 , 0x009c6300 , 0x00867900 , 0x00728d00 , 0x005ea100 } } ,
{ 2 , 1 , D3DFOG_NONE , D3DFOG_LINEAR ,
{ 0x00ff0000 , 0x00ff0000 , 0x00df2000 , 0x00bf4000 , 0x009f6000 , 0x007f8000 ,
0x005fa000 , 0x0040bf00 , 0x0020df00 , 0x0000ff00 , 0x0000ff00 } } ,
2007-03-22 16:41:22 +00:00
} ;
2007-05-27 11:25:46 +00:00
/* NOTE: changing these values will not affect the tests with foggy vertex shader, as the values are hardcoded in the shader*/
2008-02-12 16:05:40 +00:00
start . f = 0.1f ;
end . f = 0.9f ;
2007-05-27 11:25:46 +00:00
2007-03-22 16:41:22 +00:00
hr = IDirect3DDevice9_CreateVertexShader ( device , vertex_shader_code1 , & vertex_shader [ 1 ] ) ;
ok ( SUCCEEDED ( hr ) , " CreateVertexShader failed (%08x) \n " , hr ) ;
hr = IDirect3DDevice9_CreateVertexShader ( device , vertex_shader_code2 , & vertex_shader [ 2 ] ) ;
ok ( SUCCEEDED ( hr ) , " CreateVertexShader failed (%08x) \n " , hr ) ;
hr = IDirect3DDevice9_CreatePixelShader ( device , pixel_shader_code , & pixel_shader [ 1 ] ) ;
ok ( SUCCEEDED ( hr ) , " CreatePixelShader failed (%08x) \n " , hr ) ;
hr = IDirect3DDevice9_CreateVertexDeclaration ( device , decl_elements , & vertex_declaration ) ;
ok ( SUCCEEDED ( hr ) , " CreateVertexDeclaration failed (%08x) \n " , hr ) ;
/* Setup initial states: No lighting, fog on, fog color */
hr = IDirect3DDevice9_SetRenderState ( device , D3DRS_LIGHTING , FALSE ) ;
ok ( hr = = D3D_OK , " Turning off lighting failed (%08x) \n " , hr ) ;
hr = IDirect3DDevice9_SetRenderState ( device , D3DRS_FOGENABLE , TRUE ) ;
ok ( hr = = D3D_OK , " Turning on fog calculations failed (%08x) \n " , hr ) ;
hr = IDirect3DDevice9_SetRenderState ( device , D3DRS_FOGCOLOR , 0xFF00FF00 /* A nice green */ ) ;
ok ( hr = = D3D_OK , " Setting fog color failed (%08x) \n " , hr ) ;
hr = IDirect3DDevice9_SetVertexDeclaration ( device , vertex_declaration ) ;
ok ( SUCCEEDED ( hr ) , " SetVertexDeclaration failed (%08x) \n " , hr ) ;
hr = IDirect3DDevice9_SetRenderState ( device , D3DRS_FOGTABLEMODE , D3DFOG_NONE ) ;
ok ( hr = = D3D_OK , " Turning off table fog failed (%08x) \n " , hr ) ;
hr = IDirect3DDevice9_SetRenderState ( device , D3DRS_FOGVERTEXMODE , D3DFOG_NONE ) ;
ok ( hr = = D3D_OK , " Turning off vertex fog failed (%08x) \n " , hr ) ;
/* Use fogtart = 0.1 and end = 0.9 to test behavior outside the fog transition phase, too*/
hr = IDirect3DDevice9_SetRenderState ( device , D3DRS_FOGSTART , start . i ) ;
ok ( hr = = D3D_OK , " Setting fog start failed (%08x) \n " , hr ) ;
hr = IDirect3DDevice9_SetRenderState ( device , D3DRS_FOGEND , end . i ) ;
ok ( hr = = D3D_OK , " Setting fog end failed (%08x) \n " , hr ) ;
2007-08-08 11:15:12 +00:00
for ( i = 0 ; i < sizeof ( test_data ) / sizeof ( test_data [ 0 ] ) ; i + + )
2007-03-22 16:41:22 +00:00
{
hr = IDirect3DDevice9_SetVertexShader ( device , vertex_shader [ test_data [ i ] . vshader ] ) ;
ok ( SUCCEEDED ( hr ) , " SetVertexShader failed (%08x) \n " , hr ) ;
hr = IDirect3DDevice9_SetPixelShader ( device , pixel_shader [ test_data [ i ] . pshader ] ) ;
ok ( SUCCEEDED ( hr ) , " SetPixelShader failed (%08x) \n " , hr ) ;
hr = IDirect3DDevice9_SetRenderState ( device , D3DRS_FOGVERTEXMODE , test_data [ i ] . vfog ) ;
ok ( hr = = D3D_OK , " Setting fog vertex mode to D3DFOG_LINEAR failed (%08x) \n " , hr ) ;
hr = IDirect3DDevice9_SetRenderState ( device , D3DRS_FOGTABLEMODE , test_data [ i ] . tfog ) ;
ok ( hr = = D3D_OK , " Setting fog table mode to D3DFOG_LINEAR failed (%08x) \n " , hr ) ;
for ( j = 0 ; j < 11 ; j + + )
{
/* Don't use the whole zrange to prevent rounding errors */
2007-04-20 13:25:35 +00:00
quad [ 0 ] . z = 0.001f + ( float ) j / 10.02f ;
quad [ 1 ] . z = 0.001f + ( float ) j / 10.02f ;
quad [ 2 ] . z = 0.001f + ( float ) j / 10.02f ;
quad [ 3 ] . z = 0.001f + ( float ) j / 10.02f ;
hr = IDirect3DDevice9_Clear ( device , 0 , NULL , D3DCLEAR_TARGET , 0xffff00ff , 0.0 , 0 ) ;
ok ( hr = = D3D_OK , " IDirect3DDevice9_Clear failed (%08x) \n " , hr ) ;
2007-03-22 16:41:22 +00:00
hr = IDirect3DDevice9_BeginScene ( device ) ;
ok ( hr = = D3D_OK , " BeginScene returned failed (%08x) \n " , hr ) ;
hr = IDirect3DDevice9_DrawPrimitiveUP ( device , D3DPT_TRIANGLESTRIP , 2 , & quad [ 0 ] , sizeof ( quad [ 0 ] ) ) ;
ok ( SUCCEEDED ( hr ) , " DrawPrimitiveUP failed (%08x) \n " , hr ) ;
hr = IDirect3DDevice9_EndScene ( device ) ;
ok ( hr = = D3D_OK , " EndScene failed (%08x) \n " , hr ) ;
IDirect3DDevice9_Present ( device , NULL , NULL , NULL , NULL ) ;
/* As the red and green component are the result of blending use 5% tolerance on the expected value */
color = getPixelColor ( device , 128 , 240 ) ;
2009-01-10 01:29:39 +00:00
ok ( color_match ( color , test_data [ i ] . color [ j ] , 13 ) ,
" fog vs%i ps%i fvm%i ftm%i %d: got color %08x, expected %08x +-5%% \n " ,
test_data [ i ] . vshader , test_data [ i ] . pshader , test_data [ i ] . vfog , test_data [ i ] . tfog , j , color , test_data [ i ] . color [ j ] ) ;
2007-03-22 16:41:22 +00:00
}
}
/* reset states */
hr = IDirect3DDevice9_SetVertexShader ( device , NULL ) ;
ok ( SUCCEEDED ( hr ) , " SetVertexShader failed (%08x) \n " , hr ) ;
hr = IDirect3DDevice9_SetPixelShader ( device , NULL ) ;
ok ( SUCCEEDED ( hr ) , " SetPixelShader failed (%08x) \n " , hr ) ;
hr = IDirect3DDevice9_SetVertexDeclaration ( device , NULL ) ;
ok ( SUCCEEDED ( hr ) , " SetVertexDeclaration failed (%08x) \n " , hr ) ;
hr = IDirect3DDevice9_SetRenderState ( device , D3DRS_FOGENABLE , FALSE ) ;
ok ( hr = = D3D_OK , " Turning off fog calculations failed (%08x) \n " , hr ) ;
IDirect3DVertexShader9_Release ( vertex_shader [ 1 ] ) ;
IDirect3DVertexShader9_Release ( vertex_shader [ 2 ] ) ;
IDirect3DPixelShader9_Release ( pixel_shader [ 1 ] ) ;
IDirect3DVertexDeclaration9_Release ( vertex_declaration ) ;
}
2008-02-17 22:30:24 +00:00
static void generate_bumpmap_textures ( IDirect3DDevice9 * device ) {
2007-03-22 16:44:17 +00:00
unsigned int i , x , y ;
2008-02-17 22:30:24 +00:00
HRESULT hr ;
IDirect3DTexture9 * texture [ 2 ] = { NULL , NULL } ;
2007-03-22 16:44:17 +00:00
D3DLOCKED_RECT locked_rect ;
/* Generate the textures */
for ( i = 0 ; i < 2 ; i + + )
{
hr = IDirect3DDevice9_CreateTexture ( device , 128 , 128 , 1 , 0 , i ? D3DFMT_A8R8G8B8 : D3DFMT_V8U8 ,
2008-02-17 22:30:24 +00:00
D3DPOOL_MANAGED , & texture [ i ] , NULL ) ;
2007-03-22 16:44:17 +00:00
ok ( SUCCEEDED ( hr ) , " CreateTexture failed (0x%08x) \n " , hr ) ;
2007-12-08 21:31:50 +00:00
hr = IDirect3DTexture9_LockRect ( texture [ i ] , 0 , & locked_rect , NULL , 0 ) ;
2007-03-22 16:44:17 +00:00
ok ( SUCCEEDED ( hr ) , " LockRect failed (0x%08x) \n " , hr ) ;
for ( y = 0 ; y < 128 ; + + y )
{
if ( i )
{ /* Set up black texture with 2x2 texel white spot in the middle */
DWORD * ptr = ( DWORD * ) ( ( ( BYTE * ) locked_rect . pBits ) + ( y * locked_rect . Pitch ) ) ;
for ( x = 0 ; x < 128 ; + + x )
{
if ( y > 62 & & y < 66 & & x > 62 & & x < 66 )
* ptr + + = 0xffffffff ;
else
* ptr + + = 0xff000000 ;
}
}
else
{ /* Set up a displacement map which points away from the center parallel to the closest axis.
2008-02-17 22:30:24 +00:00
* ( if multiplied with bumpenvmat )
2007-03-22 16:44:17 +00:00
*/
WORD * ptr = ( WORD * ) ( ( ( BYTE * ) locked_rect . pBits ) + ( y * locked_rect . Pitch ) ) ;
for ( x = 0 ; x < 128 ; + + x )
{
if ( abs ( x - 64 ) > abs ( y - 64 ) )
{
if ( x < 64 )
* ptr + + = 0xc000 ;
else
* ptr + + = 0x4000 ;
}
else
{
if ( y < 64 )
* ptr + + = 0x0040 ;
else
* ptr + + = 0x00c0 ;
}
}
}
}
hr = IDirect3DTexture9_UnlockRect ( texture [ i ] , 0 ) ;
ok ( SUCCEEDED ( hr ) , " UnlockRect failed (0x%08x) \n " , hr ) ;
hr = IDirect3DDevice9_SetTexture ( device , i , ( IDirect3DBaseTexture9 * ) texture [ i ] ) ;
ok ( SUCCEEDED ( hr ) , " SetTexture failed (0x%08x) \n " , hr ) ;
/* Disable texture filtering */
hr = IDirect3DDevice9_SetSamplerState ( device , i , D3DSAMP_MINFILTER , D3DTEXF_POINT ) ;
ok ( SUCCEEDED ( hr ) , " SetSamplerState D3DSAMP_MINFILTER failed (0x%08x) \n " , hr ) ;
hr = IDirect3DDevice9_SetSamplerState ( device , i , D3DSAMP_MAGFILTER , D3DTEXF_POINT ) ;
ok ( SUCCEEDED ( hr ) , " SetSamplerState D3DSAMP_MAGFILTER failed (0x%08x) \n " , hr ) ;
hr = IDirect3DDevice9_SetSamplerState ( device , i , D3DSAMP_ADDRESSU , D3DTADDRESS_CLAMP ) ;
ok ( SUCCEEDED ( hr ) , " SetSamplerState D3DSAMP_ADDRESSU failed (0x%08x) \n " , hr ) ;
hr = IDirect3DDevice9_SetSamplerState ( device , i , D3DSAMP_ADDRESSV , D3DTADDRESS_CLAMP ) ;
ok ( SUCCEEDED ( hr ) , " SetSamplerState D3DSAMP_ADDRESSV failed (0x%08x) \n " , hr ) ;
}
2008-02-17 22:30:24 +00:00
}
/* test the behavior of the texbem instruction
* with normal 2 D and projective 2 D textures
*/
static void texbem_test ( IDirect3DDevice9 * device )
{
HRESULT hr ;
DWORD color ;
int i ;
static const DWORD pixel_shader_code [ ] = {
0xffff0101 , /* ps_1_1*/
0x00000042 , 0xb00f0000 , /* tex t0*/
0x00000043 , 0xb00f0001 , 0xb0e40000 , /* texbem t1, t0*/
0x00000001 , 0x800f0000 , 0xb0e40001 , /* mov r0, t1*/
0x0000ffff
} ;
2008-03-01 21:06:38 +00:00
static const DWORD double_texbem_code [ ] = {
0xffff0103 , /* ps_1_3 */
0x00000042 , 0xb00f0000 , /* tex t0 */
0x00000043 , 0xb00f0001 , 0xb0e40000 , /* texbem t1, t0 */
0x00000042 , 0xb00f0002 , /* tex t2 */
0x00000043 , 0xb00f0003 , 0xb0e40002 , /* texbem t3, t2 */
0x00000002 , 0x800f0000 , 0xb0e40001 , 0xb0e40003 , /* add r0, t1, t3 */
0x0000ffff /* end */
} ;
2008-02-17 22:30:24 +00:00
static const float quad [ ] [ 7 ] = {
{ - 128.0f / 640.0f , - 128.0f / 480.0f , 0.1f , 0.0f , 0.0f , 0.0f , 0.0f } ,
{ - 128.0f / 640.0f , 128.0f / 480.0f , 0.1f , 0.0f , 1.0f , 0.0f , 1.0f } ,
{ 128.0f / 640.0f , - 128.0f / 480.0f , 0.1f , 1.0f , 0.0f , 1.0f , 0.0f } ,
{ 128.0f / 640.0f , 128.0f / 480.0f , 0.1f , 1.0f , 1.0f , 1.0f , 1.0f } ,
} ;
static const float quad_proj [ ] [ 9 ] = {
{ - 128.0f / 640.0f , - 128.0f / 480.0f , 0.1f , 0.0f , 0.0f , 0.0f , 0.0f , 0.0f , 128.0f } ,
{ - 128.0f / 640.0f , 128.0f / 480.0f , 0.1f , 0.0f , 1.0f , 0.0f , 128.0f , 0.0f , 128.0f } ,
{ 128.0f / 640.0f , - 128.0f / 480.0f , 0.1f , 1.0f , 0.0f , 128.0f , 0.0f , 0.0f , 128.0f } ,
{ 128.0f / 640.0f , 128.0f / 480.0f , 0.1f , 1.0f , 1.0f , 128.0f , 128.0f , 0.0f , 128.0f } ,
} ;
static const D3DVERTEXELEMENT9 decl_elements [ ] [ 4 ] = { {
{ 0 , 0 , D3DDECLTYPE_FLOAT3 , D3DDECLMETHOD_DEFAULT , D3DDECLUSAGE_POSITION , 0 } ,
{ 0 , 12 , D3DDECLTYPE_FLOAT2 , D3DDECLMETHOD_DEFAULT , D3DDECLUSAGE_TEXCOORD , 0 } ,
{ 0 , 20 , D3DDECLTYPE_FLOAT2 , D3DDECLMETHOD_DEFAULT , D3DDECLUSAGE_TEXCOORD , 1 } ,
D3DDECL_END ( )
} , {
{ 0 , 0 , D3DDECLTYPE_FLOAT3 , D3DDECLMETHOD_DEFAULT , D3DDECLUSAGE_POSITION , 0 } ,
{ 0 , 12 , D3DDECLTYPE_FLOAT2 , D3DDECLMETHOD_DEFAULT , D3DDECLUSAGE_TEXCOORD , 0 } ,
{ 0 , 20 , D3DDECLTYPE_FLOAT4 , D3DDECLMETHOD_DEFAULT , D3DDECLUSAGE_TEXCOORD , 1 } ,
D3DDECL_END ( )
} } ;
2008-03-26 21:23:36 +00:00
/* use asymmetric matrix to test loading */
2008-02-17 22:30:24 +00:00
float bumpenvmat [ 4 ] = { 0.0 , 0.5 , - 0.5 , 0.0 } ;
IDirect3DVertexDeclaration9 * vertex_declaration = NULL ;
IDirect3DPixelShader9 * pixel_shader = NULL ;
2008-03-01 21:06:38 +00:00
IDirect3DTexture9 * texture = NULL , * texture1 , * texture2 ;
D3DLOCKED_RECT locked_rect ;
2008-02-17 22:30:24 +00:00
generate_bumpmap_textures ( device ) ;
2007-03-22 16:44:17 +00:00
IDirect3DDevice9_SetTextureStageState ( device , 1 , D3DTSS_BUMPENVMAT00 , * ( LPDWORD ) & bumpenvmat [ 0 ] ) ;
IDirect3DDevice9_SetTextureStageState ( device , 1 , D3DTSS_BUMPENVMAT01 , * ( LPDWORD ) & bumpenvmat [ 1 ] ) ;
IDirect3DDevice9_SetTextureStageState ( device , 1 , D3DTSS_BUMPENVMAT10 , * ( LPDWORD ) & bumpenvmat [ 2 ] ) ;
hr = IDirect3DDevice9_SetTextureStageState ( device , 1 , D3DTSS_BUMPENVMAT11 , * ( LPDWORD ) & bumpenvmat [ 3 ] ) ;
ok ( SUCCEEDED ( hr ) , " SetTextureStageState failed (%08x) \n " , hr ) ;
hr = IDirect3DDevice9_SetVertexShader ( device , NULL ) ;
ok ( SUCCEEDED ( hr ) , " SetVertexShader failed (%08x) \n " , hr ) ;
hr = IDirect3DDevice9_Clear ( device , 0 , NULL , D3DCLEAR_TARGET , 0xffff00ff , 0.0 , 0 ) ;
ok ( hr = = D3D_OK , " IDirect3DDevice9_Clear failed (%08x) \n " , hr ) ;
for ( i = 0 ; i < 2 ; i + + )
{
if ( i )
{
hr = IDirect3DDevice9_SetTextureStageState ( device , 1 , D3DTSS_TEXTURETRANSFORMFLAGS , D3DTTFF_COUNT4 | D3DTTFF_PROJECTED ) ;
ok ( SUCCEEDED ( hr ) , " SetTextureStageState D3DTSS_TEXTURETRANSFORMFLAGS failed (0x%08x) \n " , hr ) ;
}
hr = IDirect3DDevice9_CreateVertexDeclaration ( device , decl_elements [ i ] , & vertex_declaration ) ;
ok ( SUCCEEDED ( hr ) , " CreateVertexDeclaration failed (0x%08x) \n " , hr ) ;
hr = IDirect3DDevice9_SetVertexDeclaration ( device , vertex_declaration ) ;
ok ( SUCCEEDED ( hr ) , " SetVertexDeclaration failed (0x%08x) \n " , hr ) ;
hr = IDirect3DDevice9_CreatePixelShader ( device , pixel_shader_code , & pixel_shader ) ;
ok ( SUCCEEDED ( hr ) , " CreatePixelShader failed (%08x) \n " , hr ) ;
hr = IDirect3DDevice9_SetPixelShader ( device , pixel_shader ) ;
ok ( SUCCEEDED ( hr ) , " SetPixelShader failed (%08x) \n " , hr ) ;
hr = IDirect3DDevice9_BeginScene ( device ) ;
ok ( SUCCEEDED ( hr ) , " BeginScene failed (0x%08x) \n " , hr ) ;
if ( ! i )
hr = IDirect3DDevice9_DrawPrimitiveUP ( device , D3DPT_TRIANGLESTRIP , 2 , & quad [ 0 ] , sizeof ( quad [ 0 ] ) ) ;
else
hr = IDirect3DDevice9_DrawPrimitiveUP ( device , D3DPT_TRIANGLESTRIP , 2 , & quad_proj [ 0 ] , sizeof ( quad_proj [ 0 ] ) ) ;
ok ( SUCCEEDED ( hr ) , " DrawPrimitiveUP failed (0x%08x) \n " , hr ) ;
hr = IDirect3DDevice9_EndScene ( device ) ;
ok ( SUCCEEDED ( hr ) , " EndScene failed (0x%08x) \n " , hr ) ;
hr = IDirect3DDevice9_Present ( device , NULL , NULL , NULL , NULL ) ;
ok ( SUCCEEDED ( hr ) , " Present failed (0x%08x) \n " , hr ) ;
color = getPixelColor ( device , 320 - 32 , 240 ) ;
2008-08-12 22:46:34 +00:00
ok ( color_match ( color , 0x00ffffff , 4 ) , " texbem failed: Got color 0x%08x, expected 0x00ffffff. \n " , color ) ;
2007-03-22 16:44:17 +00:00
color = getPixelColor ( device , 320 + 32 , 240 ) ;
2008-08-12 22:46:34 +00:00
ok ( color_match ( color , 0x00ffffff , 4 ) , " texbem failed: Got color 0x%08x, expected 0x00ffffff. \n " , color ) ;
2007-03-22 16:44:17 +00:00
color = getPixelColor ( device , 320 , 240 - 32 ) ;
2008-08-12 22:46:34 +00:00
ok ( color_match ( color , 0x00ffffff , 4 ) , " texbem failed: Got color 0x%08x, expected 0x00ffffff. \n " , color ) ;
2007-03-22 16:44:17 +00:00
color = getPixelColor ( device , 320 , 240 + 32 ) ;
2008-08-12 22:46:34 +00:00
ok ( color_match ( color , 0x00ffffff , 4 ) , " texbem failed: Got color 0x%08x, expected 0x00ffffff. \n " , color ) ;
2007-03-22 16:44:17 +00:00
hr = IDirect3DDevice9_SetPixelShader ( device , NULL ) ;
ok ( SUCCEEDED ( hr ) , " SetPixelShader failed (%08x) \n " , hr ) ;
IDirect3DPixelShader9_Release ( pixel_shader ) ;
hr = IDirect3DDevice9_SetVertexDeclaration ( device , NULL ) ;
ok ( SUCCEEDED ( hr ) , " SetVertexDeclaration failed (%08x) \n " , hr ) ;
IDirect3DVertexDeclaration9_Release ( vertex_declaration ) ;
}
/* clean up */
hr = IDirect3DDevice9_Clear ( device , 0 , NULL , D3DCLEAR_TARGET , 0 , 0.0f , 0 ) ;
ok ( SUCCEEDED ( hr ) , " Clear failed (0x%08x) \n " , hr ) ;
hr = IDirect3DDevice9_SetTextureStageState ( device , 1 , D3DTSS_TEXTURETRANSFORMFLAGS , D3DTTFF_COUNT2 ) ;
ok ( SUCCEEDED ( hr ) , " SetTextureStageState D3DTSS_TEXTURETRANSFORMFLAGS failed (0x%08x) \n " , hr ) ;
for ( i = 0 ; i < 2 ; i + + )
{
2008-02-17 22:30:24 +00:00
hr = IDirect3DDevice9_GetTexture ( device , i , ( IDirect3DBaseTexture9 * * ) & texture ) ;
ok ( SUCCEEDED ( hr ) , " IDirect3DDevice9_GetTexture failed (0x%08x) \n " , hr ) ;
IDirect3DTexture9_Release ( texture ) ; /* For the GetTexture */
2007-03-22 16:44:17 +00:00
hr = IDirect3DDevice9_SetTexture ( device , i , NULL ) ;
ok ( SUCCEEDED ( hr ) , " SetTexture failed (0x%08x) \n " , hr ) ;
2008-02-17 22:30:24 +00:00
IDirect3DTexture9_Release ( texture ) ;
2007-03-22 16:44:17 +00:00
}
2008-03-01 21:06:38 +00:00
/* Test double texbem */
hr = IDirect3DDevice9_CreateTexture ( device , 1 , 1 , 1 , 0 , D3DFMT_V8U8 , D3DPOOL_MANAGED , & texture , NULL ) ;
ok ( SUCCEEDED ( hr ) , " IDirect3DDevice9_CreateTexture failed (0x%08x) \n " , hr ) ;
hr = IDirect3DDevice9_CreateTexture ( device , 1 , 1 , 1 , 0 , D3DFMT_V8U8 , D3DPOOL_MANAGED , & texture1 , NULL ) ;
ok ( SUCCEEDED ( hr ) , " IDirect3DDevice9_CreateTexture failed (0x%08x) \n " , hr ) ;
hr = IDirect3DDevice9_CreateTexture ( device , 8 , 8 , 1 , 0 , D3DFMT_A8R8G8B8 , D3DPOOL_MANAGED , & texture2 , NULL ) ;
ok ( SUCCEEDED ( hr ) , " IDirect3DDevice9_CreateTexture failed (0x%08x) \n " , hr ) ;
hr = IDirect3DDevice9_CreatePixelShader ( device , double_texbem_code , & pixel_shader ) ;
ok ( SUCCEEDED ( hr ) , " CreatePixelShader failed (%08x) \n " , hr ) ;
hr = IDirect3DTexture9_LockRect ( texture , 0 , & locked_rect , NULL , 0 ) ;
ok ( SUCCEEDED ( hr ) , " LockRect failed (0x%08x) \n " , hr ) ;
( ( signed char * ) locked_rect . pBits ) [ 0 ] = ( - 1.0 / 8.0 ) * 127 ;
( ( signed char * ) locked_rect . pBits ) [ 1 ] = ( 1.0 / 8.0 ) * 127 ;
hr = IDirect3DTexture9_UnlockRect ( texture , 0 ) ;
ok ( SUCCEEDED ( hr ) , " LockRect failed (0x%08x) \n " , hr ) ;
hr = IDirect3DTexture9_LockRect ( texture1 , 0 , & locked_rect , NULL , 0 ) ;
ok ( SUCCEEDED ( hr ) , " LockRect failed (0x%08x) \n " , hr ) ;
( ( signed char * ) locked_rect . pBits ) [ 0 ] = ( - 2.0 / 8.0 ) * 127 ;
( ( signed char * ) locked_rect . pBits ) [ 1 ] = ( - 4.0 / 8.0 ) * 127 ;
hr = IDirect3DTexture9_UnlockRect ( texture1 , 0 ) ;
ok ( SUCCEEDED ( hr ) , " LockRect failed (0x%08x) \n " , hr ) ;
{
/* Some data without any meaning, just to have an 8x8 array to see which element is picked */
# define tex 0x00ff0000
# define tex1 0x0000ff00
# define origin 0x000000ff
static const DWORD pixel_data [ ] = {
0x000000ff , 0x000000ff , 0x000000ff , 0x000000ff , 0x000000ff , 0x000000ff , 0x000000ff , 0x000000ff ,
0x000000ff , 0x000000ff , 0x000000ff , 0x000000ff , 0x000000ff , 0x000000ff , 0x000000ff , 0x000000ff ,
0x000000ff , tex1 , 0x000000ff , 0x000000ff , 0x000000ff , 0x000000ff , 0x000000ff , 0x000000ff ,
0x000000ff , 0x000000ff , 0x000000ff , 0x000000ff , 0x000000ff , 0x000000ff , 0x000000ff , 0x000000ff ,
0x000000ff , 0x000000ff , 0x000000ff , 0x000000ff , origin , 0x000000ff , tex , 0x000000ff ,
0x000000ff , 0x000000ff , 0x000000ff , 0x000000ff , 0x000000ff , 0x000000ff , 0x000000ff , 0x000000ff ,
0x000000ff , 0x000000ff , 0x000000ff , 0x000000ff , 0x000000ff , 0x000000ff , 0x000000ff , 0x000000ff ,
0x000000ff , 0x000000ff , 0x000000ff , 0x000000ff , 0x000000ff , 0x000000ff , 0x000000ff , 0x000000ff ,
} ;
# undef tex1
# undef tex2
# undef origin
hr = IDirect3DTexture9_LockRect ( texture2 , 0 , & locked_rect , NULL , 0 ) ;
ok ( SUCCEEDED ( hr ) , " LockRect failed (0x%08x) \n " , hr ) ;
for ( i = 0 ; i < 8 ; i + + ) {
memcpy ( ( ( char * ) locked_rect . pBits ) + i * locked_rect . Pitch , pixel_data + 8 * i , 8 * sizeof ( DWORD ) ) ;
}
hr = IDirect3DTexture9_UnlockRect ( texture2 , 0 ) ;
ok ( SUCCEEDED ( hr ) , " LockRect failed (0x%08x) \n " , hr ) ;
}
hr = IDirect3DDevice9_SetTexture ( device , 0 , ( IDirect3DBaseTexture9 * ) texture ) ;
ok ( SUCCEEDED ( hr ) , " IDirect3DDevice9_SetTexture failed (0x%08x) \n " , hr ) ;
hr = IDirect3DDevice9_SetTexture ( device , 1 , ( IDirect3DBaseTexture9 * ) texture2 ) ;
ok ( SUCCEEDED ( hr ) , " IDirect3DDevice9_SetTexture failed (0x%08x) \n " , hr ) ;
hr = IDirect3DDevice9_SetTexture ( device , 2 , ( IDirect3DBaseTexture9 * ) texture1 ) ;
ok ( SUCCEEDED ( hr ) , " IDirect3DDevice9_SetTexture failed (0x%08x) \n " , hr ) ;
hr = IDirect3DDevice9_SetTexture ( device , 3 , ( IDirect3DBaseTexture9 * ) texture2 ) ;
ok ( SUCCEEDED ( hr ) , " IDirect3DDevice9_SetTexture failed (0x%08x) \n " , hr ) ;
hr = IDirect3DDevice9_SetPixelShader ( device , pixel_shader ) ;
ok ( SUCCEEDED ( hr ) , " Direct3DDevice9_SetPixelShader failed (0x%08x) \n " , hr ) ;
hr = IDirect3DDevice9_SetFVF ( device , D3DFVF_XYZ | D3DFVF_TEX4 ) ;
ok ( SUCCEEDED ( hr ) , " Direct3DDevice9_SetPixelShader failed (0x%08x) \n " , hr ) ;
bumpenvmat [ 0 ] = - 1.0 ; bumpenvmat [ 2 ] = 2.0 ;
bumpenvmat [ 1 ] = 0.0 ; bumpenvmat [ 3 ] = 0.0 ;
IDirect3DDevice9_SetTextureStageState ( device , 1 , D3DTSS_BUMPENVMAT00 , * ( LPDWORD ) & bumpenvmat [ 0 ] ) ;
IDirect3DDevice9_SetTextureStageState ( device , 1 , D3DTSS_BUMPENVMAT01 , * ( LPDWORD ) & bumpenvmat [ 1 ] ) ;
IDirect3DDevice9_SetTextureStageState ( device , 1 , D3DTSS_BUMPENVMAT10 , * ( LPDWORD ) & bumpenvmat [ 2 ] ) ;
IDirect3DDevice9_SetTextureStageState ( device , 1 , D3DTSS_BUMPENVMAT11 , * ( LPDWORD ) & bumpenvmat [ 3 ] ) ;
bumpenvmat [ 0 ] = 1.5 ; bumpenvmat [ 2 ] = 0.0 ;
bumpenvmat [ 1 ] = 0.0 ; bumpenvmat [ 3 ] = 0.5 ;
IDirect3DDevice9_SetTextureStageState ( device , 3 , D3DTSS_BUMPENVMAT00 , * ( LPDWORD ) & bumpenvmat [ 0 ] ) ;
IDirect3DDevice9_SetTextureStageState ( device , 3 , D3DTSS_BUMPENVMAT01 , * ( LPDWORD ) & bumpenvmat [ 1 ] ) ;
IDirect3DDevice9_SetTextureStageState ( device , 3 , D3DTSS_BUMPENVMAT10 , * ( LPDWORD ) & bumpenvmat [ 2 ] ) ;
IDirect3DDevice9_SetTextureStageState ( device , 3 , D3DTSS_BUMPENVMAT11 , * ( LPDWORD ) & bumpenvmat [ 3 ] ) ;
hr = IDirect3DDevice9_SetSamplerState ( device , 0 , D3DSAMP_ADDRESSU , D3DTADDRESS_CLAMP ) ;
hr = IDirect3DDevice9_SetSamplerState ( device , 0 , D3DSAMP_ADDRESSV , D3DTADDRESS_CLAMP ) ;
hr = IDirect3DDevice9_SetSamplerState ( device , 1 , D3DSAMP_ADDRESSU , D3DTADDRESS_CLAMP ) ;
hr = IDirect3DDevice9_SetSamplerState ( device , 1 , D3DSAMP_ADDRESSV , D3DTADDRESS_CLAMP ) ;
hr = IDirect3DDevice9_SetSamplerState ( device , 2 , D3DSAMP_ADDRESSU , D3DTADDRESS_CLAMP ) ;
hr = IDirect3DDevice9_SetSamplerState ( device , 2 , D3DSAMP_ADDRESSV , D3DTADDRESS_CLAMP ) ;
hr = IDirect3DDevice9_SetSamplerState ( device , 3 , D3DSAMP_ADDRESSU , D3DTADDRESS_CLAMP ) ;
hr = IDirect3DDevice9_SetSamplerState ( device , 3 , D3DSAMP_ADDRESSV , D3DTADDRESS_CLAMP ) ;
hr = IDirect3DDevice9_BeginScene ( device ) ;
ok ( SUCCEEDED ( hr ) , " BeginScene failed (0x%08x) \n " , hr ) ;
if ( SUCCEEDED ( hr ) ) {
static const float double_quad [ ] = {
- 1.0 , - 1.0 , 0.0 , 0.0 , 0.0 , 0.5 , 0.5 , 0.0 , 0.0 , 0.5 , 0.5 ,
1.0 , - 1.0 , 0.0 , 0.0 , 0.0 , 0.5 , 0.5 , 0.0 , 0.0 , 0.5 , 0.5 ,
- 1.0 , 1.0 , 0.0 , 0.0 , 0.0 , 0.5 , 0.5 , 0.0 , 0.0 , 0.5 , 0.5 ,
1.0 , 1.0 , 0.0 , 0.0 , 0.0 , 0.5 , 0.5 , 0.0 , 0.0 , 0.5 , 0.5 ,
} ;
hr = IDirect3DDevice9_DrawPrimitiveUP ( device , D3DPT_TRIANGLESTRIP , 2 , double_quad , sizeof ( float ) * 11 ) ;
ok ( SUCCEEDED ( hr ) , " DrawPrimitiveUP failed (0x%08x) \n " , hr ) ;
hr = IDirect3DDevice9_EndScene ( device ) ;
ok ( SUCCEEDED ( hr ) , " EndScene failed (0x%08x) \n " , hr ) ;
}
hr = IDirect3DDevice9_Present ( device , NULL , NULL , NULL , NULL ) ;
ok ( SUCCEEDED ( hr ) , " Present failed (0x%08x) \n " , hr ) ;
color = getPixelColor ( device , 320 , 240 ) ;
ok ( color = = 0x00ffff00 , " double texbem failed: Got color 0x%08x, expected 0x00ffff00. \n " , color ) ;
hr = IDirect3DDevice9_SetTexture ( device , 0 , NULL ) ;
ok ( SUCCEEDED ( hr ) , " IDirect3DDevice9_SetTexture failed (0x%08x) \n " , hr ) ;
hr = IDirect3DDevice9_SetTexture ( device , 1 , NULL ) ;
ok ( SUCCEEDED ( hr ) , " IDirect3DDevice9_SetTexture failed (0x%08x) \n " , hr ) ;
hr = IDirect3DDevice9_SetTexture ( device , 2 , NULL ) ;
ok ( SUCCEEDED ( hr ) , " IDirect3DDevice9_SetTexture failed (0x%08x) \n " , hr ) ;
hr = IDirect3DDevice9_SetTexture ( device , 3 , NULL ) ;
ok ( SUCCEEDED ( hr ) , " IDirect3DDevice9_SetTexture failed (0x%08x) \n " , hr ) ;
hr = IDirect3DDevice9_SetPixelShader ( device , NULL ) ;
ok ( SUCCEEDED ( hr ) , " Direct3DDevice9_SetPixelShader failed (0x%08x) \n " , hr ) ;
IDirect3DPixelShader9_Release ( pixel_shader ) ;
IDirect3DTexture9_Release ( texture ) ;
IDirect3DTexture9_Release ( texture1 ) ;
IDirect3DTexture9_Release ( texture2 ) ;
2007-03-22 16:44:17 +00:00
}
2007-08-31 18:32:52 +00:00
static void z_range_test ( IDirect3DDevice9 * device )
2007-06-14 09:18:03 +00:00
{
2007-08-31 18:32:52 +00:00
const struct vertex quad [ ] =
{
{ - 1.0f , 0.0f , 1.1f , 0xffff0000 } ,
{ - 1.0f , 1.0f , 1.1f , 0xffff0000 } ,
{ 1.0f , 0.0f , - 1.1f , 0xffff0000 } ,
{ 1.0f , 1.0f , - 1.1f , 0xffff0000 } ,
} ;
const struct vertex quad2 [ ] =
{
{ - 1.0f , 0.0f , 1.1f , 0xff0000ff } ,
{ - 1.0f , 1.0f , 1.1f , 0xff0000ff } ,
{ 1.0f , 0.0f , - 1.1f , 0xff0000ff } ,
{ 1.0f , 1.0f , - 1.1f , 0xff0000ff } ,
} ;
const struct tvertex quad3 [ ] =
{
{ 0 , 240 , 1.1f , 1.0 , 0xffffff00 } ,
{ 0 , 480 , 1.1f , 1.0 , 0xffffff00 } ,
{ 640 , 240 , - 1.1f , 1.0 , 0xffffff00 } ,
{ 640 , 480 , - 1.1f , 1.0 , 0xffffff00 } ,
} ;
const struct tvertex quad4 [ ] =
2007-06-14 09:18:03 +00:00
{
2007-08-31 18:32:52 +00:00
{ 0 , 240 , 1.1f , 1.0 , 0xff00ff00 } ,
{ 0 , 480 , 1.1f , 1.0 , 0xff00ff00 } ,
{ 640 , 240 , - 1.1f , 1.0 , 0xff00ff00 } ,
{ 640 , 480 , - 1.1f , 1.0 , 0xff00ff00 } ,
2007-06-14 09:18:03 +00:00
} ;
HRESULT hr ;
DWORD color ;
2007-08-31 18:32:52 +00:00
IDirect3DVertexShader9 * shader ;
IDirect3DVertexDeclaration9 * decl ;
2007-10-06 14:57:20 +00:00
D3DCAPS9 caps ;
2007-08-31 18:32:52 +00:00
const DWORD shader_code [ ] = {
0xfffe0101 , /* vs_1_1 */
0x0000001f , 0x80000000 , 0x900f0000 , /* dcl_position v0 */
0x00000001 , 0xc00f0000 , 0x90e40000 , /* mov oPos, v0 */
0x00000001 , 0xd00f0000 , 0xa0e40000 , /* mov oD0, c0 */
0x0000ffff /* end */
} ;
static const D3DVERTEXELEMENT9 decl_elements [ ] = {
{ 0 , 0 , D3DDECLTYPE_FLOAT3 , D3DDECLMETHOD_DEFAULT , D3DDECLUSAGE_POSITION , 0 } ,
D3DDECL_END ( )
} ;
2007-06-14 09:18:03 +00:00
/* Does the Present clear the depth stencil? Clear the depth buffer with some value != 0,
* then call Present . Then clear the color buffer to make sure it has some defined content
* after the Present with D3DSWAPEFFECT_DISCARD . After that draw a plane that is somewhere cut
* by the depth value .
*/
hr = IDirect3DDevice9_Clear ( device , 0 , NULL , D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER , 0xffffffff , 0.75 , 0 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_Clear returned %08x \n " , hr ) ;
2007-06-14 09:18:03 +00:00
hr = IDirect3DDevice9_Present ( device , NULL , NULL , NULL , NULL ) ;
hr = IDirect3DDevice9_Clear ( device , 0 , NULL , D3DCLEAR_TARGET , 0xffffffff , 0.4 , 0 ) ;
2007-08-31 18:32:52 +00:00
hr = IDirect3DDevice9_SetRenderState ( device , D3DRS_CLIPPING , TRUE ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetRenderState returned %08x \n " , hr ) ;
2007-06-14 09:18:03 +00:00
hr = IDirect3DDevice9_SetRenderState ( device , D3DRS_ZENABLE , D3DZB_TRUE ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetRenderState returned %08x \n " , hr ) ;
2007-08-31 18:32:52 +00:00
hr = IDirect3DDevice9_SetRenderState ( device , D3DRS_ZWRITEENABLE , FALSE ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetRenderState returned %08x \n " , hr ) ;
2007-06-14 09:18:03 +00:00
hr = IDirect3DDevice9_SetRenderState ( device , D3DRS_ZFUNC , D3DCMP_GREATER ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetRenderState returned %08x \n " , hr ) ;
2007-06-14 09:18:03 +00:00
hr = IDirect3DDevice9_SetFVF ( device , D3DFVF_XYZ | D3DFVF_DIFFUSE ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetFVF returned %08x \n " , hr ) ;
2007-06-14 09:18:03 +00:00
hr = IDirect3DDevice9_BeginScene ( device ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_BeginScene failed with %08x \n " , hr ) ;
2007-06-14 09:18:03 +00:00
if ( hr = = D3D_OK )
{
2007-08-31 18:32:52 +00:00
/* Test the untransformed vertex path */
2007-06-14 09:18:03 +00:00
hr = IDirect3DDevice9_DrawPrimitiveUP ( device , D3DPT_TRIANGLESTRIP , 2 /*PrimCount */ , quad , sizeof ( quad [ 0 ] ) ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_DrawIndexedPrimitiveUP failed with %08x \n " , hr ) ;
2007-08-31 18:32:52 +00:00
hr = IDirect3DDevice9_SetRenderState ( device , D3DRS_ZFUNC , D3DCMP_LESS ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetRenderState returned %08x \n " , hr ) ;
2007-08-31 18:32:52 +00:00
hr = IDirect3DDevice9_DrawPrimitiveUP ( device , D3DPT_TRIANGLESTRIP , 2 /*PrimCount */ , quad2 , sizeof ( quad2 [ 0 ] ) ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_DrawIndexedPrimitiveUP failed with %08x \n " , hr ) ;
2007-08-31 18:32:52 +00:00
/* Test the transformed vertex path */
hr = IDirect3DDevice9_SetFVF ( device , D3DFVF_XYZRHW | D3DFVF_DIFFUSE ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetFVF returned %08x \n " , hr ) ;
2007-08-31 18:32:52 +00:00
hr = IDirect3DDevice9_DrawPrimitiveUP ( device , D3DPT_TRIANGLESTRIP , 2 /*PrimCount */ , quad4 , sizeof ( quad4 [ 0 ] ) ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_DrawIndexedPrimitiveUP failed with %08x \n " , hr ) ;
2007-08-31 18:32:52 +00:00
hr = IDirect3DDevice9_SetRenderState ( device , D3DRS_ZFUNC , D3DCMP_GREATER ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetRenderState returned %08x \n " , hr ) ;
2007-08-31 18:32:52 +00:00
hr = IDirect3DDevice9_DrawPrimitiveUP ( device , D3DPT_TRIANGLESTRIP , 2 /*PrimCount */ , quad3 , sizeof ( quad3 [ 0 ] ) ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_DrawIndexedPrimitiveUP failed with %08x \n " , hr ) ;
2007-06-14 09:18:03 +00:00
hr = IDirect3DDevice9_EndScene ( device ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_EndScene failed with %08x \n " , hr ) ;
2007-06-14 09:18:03 +00:00
}
2007-08-31 18:32:52 +00:00
hr = IDirect3DDevice9_Present ( device , NULL , NULL , NULL , NULL ) ;
ok ( SUCCEEDED ( hr ) , " Present failed (0x%08x) \n " , hr ) ;
/* Do not test the exact corner pixels, but go pretty close to them */
/* Clipped because z > 1.0 */
color = getPixelColor ( device , 28 , 238 ) ;
ok ( color = = 0x00ffffff , " Z range failed: Got color 0x%08x, expected 0x00ffffff. \n " , color ) ;
color = getPixelColor ( device , 28 , 241 ) ;
ok ( color = = 0x00ffffff , " Z range failed: Got color 0x%08x, expected 0x00ffffff. \n " , color ) ;
/* Not clipped, > z buffer clear value(0.75) */
color = getPixelColor ( device , 31 , 238 ) ;
ok ( color = = 0x00ff0000 , " Z range failed: Got color 0x%08x, expected 0x00ff0000. \n " , color ) ;
color = getPixelColor ( device , 31 , 241 ) ;
ok ( color = = 0x00ffff00 , " Z range failed: Got color 0x%08x, expected 0x00ffff00. \n " , color ) ;
color = getPixelColor ( device , 100 , 238 ) ;
ok ( color = = 0x00ff0000 , " Z range failed: Got color 0x%08x, expected 0x00ff0000. \n " , color ) ;
color = getPixelColor ( device , 100 , 241 ) ;
ok ( color = = 0x00ffff00 , " Z range failed: Got color 0x%08x, expected 0x00ffff00. \n " , color ) ;
/* Not clipped, < z buffer clear value */
color = getPixelColor ( device , 104 , 238 ) ;
ok ( color = = 0x000000ff , " Z range failed: Got color 0x%08x, expected 0x000000ff. \n " , color ) ;
color = getPixelColor ( device , 104 , 241 ) ;
ok ( color = = 0x0000ff00 , " Z range failed: Got color 0x%08x, expected 0x0000ff00. \n " , color ) ;
color = getPixelColor ( device , 318 , 238 ) ;
ok ( color = = 0x000000ff , " Z range failed: Got color 0x%08x, expected 0x000000ff. \n " , color ) ;
color = getPixelColor ( device , 318 , 241 ) ;
ok ( color = = 0x0000ff00 , " Z range failed: Got color 0x%08x, expected 0x0000ff00. \n " , color ) ;
/* Clipped because z < 0.0 */
color = getPixelColor ( device , 321 , 238 ) ;
ok ( color = = 0x00ffffff , " Z range failed: Got color 0x%08x, expected 0x00ffffff. \n " , color ) ;
color = getPixelColor ( device , 321 , 241 ) ;
ok ( color = = 0x00ffffff , " Z range failed: Got color 0x%08x, expected 0x00ffffff. \n " , color ) ;
/* Test the shader path */
2007-10-06 14:57:20 +00:00
IDirect3DDevice9_GetDeviceCaps ( device , & caps ) ;
if ( caps . VertexShaderVersion < D3DVS_VERSION ( 1 , 1 ) ) {
skip ( " Vertex shaders not supported \n " ) ;
2007-08-31 18:32:52 +00:00
goto out ;
}
2007-10-06 14:57:20 +00:00
hr = IDirect3DDevice9_CreateVertexShader ( device , shader_code , & shader ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_CreateVertexShader returned %08x \n " , hr ) ;
2007-08-31 18:32:52 +00:00
hr = IDirect3DDevice9_CreateVertexDeclaration ( device , decl_elements , & decl ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_CreateVertexDeclaration returned %08x \n " , hr ) ;
2007-08-31 18:32:52 +00:00
hr = IDirect3DDevice9_Clear ( device , 0 , NULL , D3DCLEAR_TARGET , 0xffffffff , 0.4 , 0 ) ;
IDirect3DDevice9_SetVertexDeclaration ( device , decl ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetVertexDeclaration returned %08x \n " , hr ) ;
2007-08-31 18:32:52 +00:00
IDirect3DDevice9_SetVertexShader ( device , shader ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetVertexShader returned %08x \n " , hr ) ;
2007-08-31 18:32:52 +00:00
hr = IDirect3DDevice9_BeginScene ( device ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_BeginScene failed with %08x \n " , hr ) ;
2007-08-31 18:32:52 +00:00
if ( hr = = D3D_OK )
{
float colorf [ ] = { 1.0 , 0.0 , 0.0 , 1.0 } ;
float colorf2 [ ] = { 0.0 , 0.0 , 1.0 , 1.0 } ;
IDirect3DDevice9_SetVertexShaderConstantF ( device , 0 , colorf , 1 ) ;
hr = IDirect3DDevice9_DrawPrimitiveUP ( device , D3DPT_TRIANGLESTRIP , 2 /*PrimCount */ , quad , sizeof ( quad [ 0 ] ) ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_DrawIndexedPrimitiveUP failed with %08x \n " , hr ) ;
2007-08-31 18:32:52 +00:00
hr = IDirect3DDevice9_SetRenderState ( device , D3DRS_ZFUNC , D3DCMP_LESS ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetRenderState returned %08x \n " , hr ) ;
2007-08-31 18:32:52 +00:00
IDirect3DDevice9_SetVertexShaderConstantF ( device , 0 , colorf2 , 1 ) ;
hr = IDirect3DDevice9_DrawPrimitiveUP ( device , D3DPT_TRIANGLESTRIP , 2 /*PrimCount */ , quad2 , sizeof ( quad2 [ 0 ] ) ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_DrawIndexedPrimitiveUP failed with %08x \n " , hr ) ;
2007-08-31 18:32:52 +00:00
hr = IDirect3DDevice9_EndScene ( device ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_EndScene failed with %08x \n " , hr ) ;
2007-08-31 18:32:52 +00:00
}
IDirect3DDevice9_SetVertexDeclaration ( device , NULL ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetVertexDeclaration returned %08x \n " , hr ) ;
2007-08-31 18:32:52 +00:00
IDirect3DDevice9_SetVertexShader ( device , NULL ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetVertexShader returned %08x \n " , hr ) ;
2007-08-31 18:32:52 +00:00
IDirect3DVertexDeclaration9_Release ( decl ) ;
IDirect3DVertexShader9_Release ( shader ) ;
2007-06-14 09:18:03 +00:00
hr = IDirect3DDevice9_Present ( device , NULL , NULL , NULL , NULL ) ;
ok ( SUCCEEDED ( hr ) , " Present failed (0x%08x) \n " , hr ) ;
2007-08-31 18:32:52 +00:00
/* Z < 1.0 */
color = getPixelColor ( device , 28 , 238 ) ;
ok ( color = = 0x00ffffff , " Z range failed: Got color 0x%08x, expected 0x00ffffff. \n " , color ) ;
/* 1.0 < z < 0.75 */
color = getPixelColor ( device , 31 , 238 ) ;
ok ( color = = 0x00ff0000 , " Z range failed: Got color 0x%08x, expected 0x00ff0000. \n " , color ) ;
color = getPixelColor ( device , 100 , 238 ) ;
ok ( color = = 0x00ff0000 , " Z range failed: Got color 0x%08x, expected 0x00ff0000. \n " , color ) ;
/* 0.75 < z < 0.0 */
color = getPixelColor ( device , 104 , 238 ) ;
ok ( color = = 0x000000ff , " Z range failed: Got color 0x%08x, expected 0x000000ff. \n " , color ) ;
color = getPixelColor ( device , 318 , 238 ) ;
ok ( color = = 0x000000ff , " Z range failed: Got color 0x%08x, expected 0x000000ff. \n " , color ) ;
/* 0.0 < z */
color = getPixelColor ( device , 321 , 238 ) ;
ok ( color = = 0x00ffffff , " Z range failed: Got color 0x%08x, expected 0x00ffffff. \n " , color ) ;
out :
hr = IDirect3DDevice9_SetRenderState ( device , D3DRS_ZENABLE , D3DZB_FALSE ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetRenderState returned %08x \n " , hr ) ;
2007-08-31 18:32:52 +00:00
hr = IDirect3DDevice9_SetRenderState ( device , D3DRS_CLIPPING , FALSE ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetRenderState returned %08x \n " , hr ) ;
2007-08-31 18:32:52 +00:00
hr = IDirect3DDevice9_SetRenderState ( device , D3DRS_ZWRITEENABLE , TRUE ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetRenderState returned %08x \n " , hr ) ;
2007-06-14 09:18:03 +00:00
}
2007-07-25 16:49:03 +00:00
static void fill_surface ( IDirect3DSurface9 * surface , DWORD color )
{
D3DSURFACE_DESC desc ;
D3DLOCKED_RECT l ;
HRESULT hr ;
unsigned int x , y ;
DWORD * mem ;
memset ( & desc , 0 , sizeof ( desc ) ) ;
memset ( & l , 0 , sizeof ( l ) ) ;
hr = IDirect3DSurface9_GetDesc ( surface , & desc ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DSurface9_GetDesc failed with %08x \n " , hr ) ;
2007-12-08 15:32:07 +00:00
hr = IDirect3DSurface9_LockRect ( surface , & l , NULL , 0 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DSurface9_LockRect failed with %08x \n " , hr ) ;
2007-07-25 16:49:03 +00:00
if ( FAILED ( hr ) ) return ;
for ( y = 0 ; y < desc . Height ; y + + )
{
mem = ( DWORD * ) ( ( BYTE * ) l . pBits + y * l . Pitch ) ;
for ( x = 0 ; x < l . Pitch / sizeof ( DWORD ) ; x + + )
{
mem [ x ] = color ;
}
}
hr = IDirect3DSurface9_UnlockRect ( surface ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DSurface9_UnlockRect failed with %08x \n " , hr ) ;
2007-07-25 16:49:03 +00:00
}
2008-04-01 05:20:44 +00:00
/* This tests a variety of possible StretchRect() situations */
static void stretchrect_test ( IDirect3DDevice9 * device )
{
HRESULT hr ;
2008-04-15 07:30:30 +00:00
IDirect3DTexture9 * tex_rt32 = NULL , * tex_rt64 = NULL , * tex_rt_dest64 = NULL ;
IDirect3DSurface9 * surf_tex_rt32 = NULL , * surf_tex_rt64 = NULL , * surf_tex_rt_dest64 = NULL ;
2008-04-01 05:20:44 +00:00
IDirect3DTexture9 * tex32 = NULL , * tex64 = NULL , * tex_dest64 = NULL ;
IDirect3DSurface9 * surf_tex32 = NULL , * surf_tex64 = NULL , * surf_tex_dest64 = NULL ;
IDirect3DSurface9 * surf_rt32 = NULL , * surf_rt64 = NULL , * surf_rt_dest64 = NULL ;
IDirect3DSurface9 * surf_offscreen32 = NULL , * surf_offscreen64 = NULL , * surf_offscreen_dest64 = NULL ;
IDirect3DSurface9 * surf_temp32 = NULL , * surf_temp64 = NULL ;
IDirect3DSurface9 * orig_rt = NULL ;
DWORD color ;
hr = IDirect3DDevice9_GetRenderTarget ( device , 0 , & orig_rt ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " Can't get render target, hr = %08x \n " , hr ) ;
2008-04-01 05:20:44 +00:00
if ( ! orig_rt ) {
goto out ;
}
/* Create our temporary surfaces in system memory */
hr = IDirect3DDevice9_CreateOffscreenPlainSurface ( device , 32 , 32 , D3DFMT_A8R8G8B8 , D3DPOOL_SYSTEMMEM , & surf_temp32 , NULL ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_CreateOffscreenPlainSurface failed with %08x \n " , hr ) ;
2008-04-01 05:20:44 +00:00
hr = IDirect3DDevice9_CreateOffscreenPlainSurface ( device , 64 , 64 , D3DFMT_A8R8G8B8 , D3DPOOL_SYSTEMMEM , & surf_temp64 , NULL ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_CreateOffscreenPlainSurface failed with %08x \n " , hr ) ;
2008-04-01 05:20:44 +00:00
/* Create offscreen plain surfaces in D3DPOOL_DEFAULT */
hr = IDirect3DDevice9_CreateOffscreenPlainSurface ( device , 32 , 32 , D3DFMT_A8R8G8B8 , D3DPOOL_DEFAULT , & surf_offscreen32 , NULL ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_CreateOffscreenPlainSurface failed with %08x \n " , hr ) ;
2008-04-01 05:20:44 +00:00
hr = IDirect3DDevice9_CreateOffscreenPlainSurface ( device , 64 , 64 , D3DFMT_A8R8G8B8 , D3DPOOL_DEFAULT , & surf_offscreen64 , NULL ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_CreateOffscreenPlainSurface failed with %08x \n " , hr ) ;
2008-04-01 05:20:44 +00:00
hr = IDirect3DDevice9_CreateOffscreenPlainSurface ( device , 64 , 64 , D3DFMT_A8R8G8B8 , D3DPOOL_DEFAULT , & surf_offscreen_dest64 , NULL ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_CreateOffscreenPlainSurface failed with %08x \n " , hr ) ;
2008-04-01 05:20:44 +00:00
/* Create render target surfaces */
hr = IDirect3DDevice9_CreateRenderTarget ( device , 32 , 32 , D3DFMT_A8R8G8B8 , D3DMULTISAMPLE_NONE , 0 , TRUE , & surf_rt32 , NULL ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " Creating the render target surface failed with %08x \n " , hr ) ;
2008-04-01 05:20:44 +00:00
hr = IDirect3DDevice9_CreateRenderTarget ( device , 64 , 64 , D3DFMT_A8R8G8B8 , D3DMULTISAMPLE_NONE , 0 , TRUE , & surf_rt64 , NULL ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " Creating the render target surface failed with %08x \n " , hr ) ;
2008-04-01 05:20:44 +00:00
hr = IDirect3DDevice9_CreateRenderTarget ( device , 64 , 64 , D3DFMT_A8R8G8B8 , D3DMULTISAMPLE_NONE , 0 , TRUE , & surf_rt_dest64 , NULL ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " Creating the render target surface failed with %08x \n " , hr ) ;
2008-04-01 05:20:44 +00:00
/* Create render target textures */
hr = IDirect3DDevice9_CreateTexture ( device , 32 , 32 , 1 , D3DUSAGE_RENDERTARGET , D3DFMT_A8R8G8B8 , D3DPOOL_DEFAULT , & tex_rt32 , NULL ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " Creating the render target texture failed with %08x \n " , hr ) ;
2008-04-01 05:20:44 +00:00
hr = IDirect3DDevice9_CreateTexture ( device , 64 , 64 , 1 , D3DUSAGE_RENDERTARGET , D3DFMT_A8R8G8B8 , D3DPOOL_DEFAULT , & tex_rt64 , NULL ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " Creating the render target texture failed with %08x \n " , hr ) ;
2008-04-01 05:20:44 +00:00
hr = IDirect3DDevice9_CreateTexture ( device , 64 , 64 , 1 , D3DUSAGE_RENDERTARGET , D3DFMT_A8R8G8B8 , D3DPOOL_DEFAULT , & tex_rt_dest64 , NULL ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " Creating the render target texture failed with %08x \n " , hr ) ;
2008-04-01 05:20:44 +00:00
if ( tex_rt32 ) {
hr = IDirect3DTexture9_GetSurfaceLevel ( tex_rt32 , 0 , & surf_tex_rt32 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DTexture9_GetSurfaceLevel failed with %08x \n " , hr ) ;
2008-04-01 05:20:44 +00:00
}
if ( tex_rt64 ) {
hr = IDirect3DTexture9_GetSurfaceLevel ( tex_rt64 , 0 , & surf_tex_rt64 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DTexture9_GetSurfaceLevel failed with %08x \n " , hr ) ;
2008-04-01 05:20:44 +00:00
}
if ( tex_rt_dest64 ) {
hr = IDirect3DTexture9_GetSurfaceLevel ( tex_rt_dest64 , 0 , & surf_tex_rt_dest64 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DTexture9_GetSurfaceLevel failed with %08x \n " , hr ) ;
2008-04-01 05:20:44 +00:00
}
/* Create regular textures in D3DPOOL_DEFAULT */
hr = IDirect3DDevice9_CreateTexture ( device , 32 , 32 , 1 , 0 , D3DFMT_A8R8G8B8 , D3DPOOL_DEFAULT , & tex32 , NULL ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " Creating the regular texture failed with %08x \n " , hr ) ;
2008-04-01 05:20:44 +00:00
hr = IDirect3DDevice9_CreateTexture ( device , 64 , 64 , 1 , 0 , D3DFMT_A8R8G8B8 , D3DPOOL_DEFAULT , & tex64 , NULL ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " Creating the regular texture failed with %08x \n " , hr ) ;
2008-04-01 05:20:44 +00:00
hr = IDirect3DDevice9_CreateTexture ( device , 64 , 64 , 1 , 0 , D3DFMT_A8R8G8B8 , D3DPOOL_DEFAULT , & tex_dest64 , NULL ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " Creating the regular texture failed with %08x \n " , hr ) ;
2008-04-01 05:20:44 +00:00
if ( tex32 ) {
hr = IDirect3DTexture9_GetSurfaceLevel ( tex32 , 0 , & surf_tex32 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DTexture9_GetSurfaceLevel failed with %08x \n " , hr ) ;
2008-04-01 05:20:44 +00:00
}
if ( tex64 ) {
hr = IDirect3DTexture9_GetSurfaceLevel ( tex64 , 0 , & surf_tex64 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DTexture9_GetSurfaceLevel failed with %08x \n " , hr ) ;
2008-04-01 05:20:44 +00:00
}
if ( tex_dest64 ) {
hr = IDirect3DTexture9_GetSurfaceLevel ( tex_dest64 , 0 , & surf_tex_dest64 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DTexture9_GetSurfaceLevel failed with %08x \n " , hr ) ;
2008-04-01 05:20:44 +00:00
}
/*********************************************************************
* Tests for when the source parameter is an offscreen plain surface *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/* Fill the offscreen 64x64 surface with green */
if ( surf_offscreen64 )
fill_surface ( surf_offscreen64 , 0xff00ff00 ) ;
/* offscreenplain ==> offscreenplain, same size */
if ( surf_offscreen64 & & surf_offscreen_dest64 ) {
hr = IDirect3DDevice9_StretchRect ( device , surf_offscreen64 , NULL , surf_offscreen_dest64 , NULL , 0 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_StretchRect failed with %08x \n " , hr ) ;
2008-04-01 05:20:44 +00:00
if ( hr = = D3D_OK ) {
color = getPixelColorFromSurface ( surf_offscreen_dest64 , 32 , 32 ) ;
ok ( color = = 0xff00ff00 , " StretchRect offscreen ==> offscreen same size failed: Got color 0x%08x, expected 0xff00ff00. \n " , color ) ;
}
}
/* offscreenplain ==> rendertarget texture, same size */
if ( surf_offscreen64 & & surf_tex_rt_dest64 & & surf_temp64 ) {
hr = IDirect3DDevice9_StretchRect ( device , surf_offscreen64 , NULL , surf_tex_rt_dest64 , NULL , 0 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_StretchRect failed with %08x \n " , hr ) ;
2008-04-01 05:20:44 +00:00
/* We can't lock rendertarget textures, so copy to our temp surface first */
if ( hr = = D3D_OK ) {
hr = IDirect3DDevice9_GetRenderTargetData ( device , surf_tex_rt_dest64 , surf_temp64 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_GetRenderTargetData failed with %08x \n " , hr ) ;
2008-04-01 05:20:44 +00:00
}
if ( hr = = D3D_OK ) {
color = getPixelColorFromSurface ( surf_temp64 , 32 , 32 ) ;
ok ( color = = 0xff00ff00 , " StretchRect offscreen ==> rendertarget texture same size failed: Got color 0x%08x, expected 0xff00ff00. \n " , color ) ;
}
}
/* offscreenplain ==> rendertarget surface, same size */
if ( surf_offscreen64 & & surf_rt_dest64 ) {
hr = IDirect3DDevice9_StretchRect ( device , surf_offscreen64 , NULL , surf_rt_dest64 , NULL , 0 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_StretchRect failed with %08x \n " , hr ) ;
2008-04-01 05:20:44 +00:00
if ( hr = = D3D_OK ) {
color = getPixelColorFromSurface ( surf_rt_dest64 , 32 , 32 ) ;
ok ( color = = 0xff00ff00 , " StretchRect offscreen ==> rendertarget surface same size failed: Got color 0x%08x, expected 0xff00ff00. \n " , color ) ;
}
}
/* offscreenplain ==> texture, same size (should fail) */
if ( surf_offscreen64 & & surf_tex_dest64 ) {
hr = IDirect3DDevice9_StretchRect ( device , surf_offscreen64 , NULL , surf_tex_dest64 , NULL , 0 ) ;
todo_wine ok ( hr = = D3DERR_INVALIDCALL , " IDirect3DDevice9_StretchRect succeeded, shouldn't happen (todo) \ n " ) ;
}
/* Fill the smaller offscreen surface with red */
fill_surface ( surf_offscreen32 , 0xffff0000 ) ;
/* offscreenplain ==> offscreenplain, scaling (should fail) */
if ( surf_offscreen32 & & surf_offscreen64 ) {
hr = IDirect3DDevice9_StretchRect ( device , surf_offscreen32 , NULL , surf_offscreen64 , NULL , 0 ) ;
todo_wine ok ( hr = = D3DERR_INVALIDCALL , " IDirect3DDevice9_StretchRect succeeded, shouldn't happen (todo) \ n " ) ;
}
/* offscreenplain ==> rendertarget texture, scaling */
if ( surf_offscreen32 & & surf_tex_rt_dest64 & & surf_temp64 ) {
hr = IDirect3DDevice9_StretchRect ( device , surf_offscreen32 , NULL , surf_tex_rt_dest64 , NULL , 0 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_StretchRect failed with %08x \n " , hr ) ;
2008-04-01 05:20:44 +00:00
/* We can't lock rendertarget textures, so copy to our temp surface first */
if ( hr = = D3D_OK ) {
hr = IDirect3DDevice9_GetRenderTargetData ( device , surf_tex_rt_dest64 , surf_temp64 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_GetRenderTargetData failed with %08x \n " , hr ) ;
2008-04-01 05:20:44 +00:00
}
if ( hr = = D3D_OK ) {
color = getPixelColorFromSurface ( surf_temp64 , 48 , 48 ) ;
ok ( color = = 0xffff0000 , " StretchRect offscreen ==> rendertarget texture same size failed: Got color 0x%08x, expected 0xffff0000. \n " , color ) ;
}
}
/* offscreenplain ==> rendertarget surface, scaling */
if ( surf_offscreen32 & & surf_rt_dest64 ) {
hr = IDirect3DDevice9_StretchRect ( device , surf_offscreen32 , NULL , surf_rt_dest64 , NULL , 0 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_StretchRect failed with %08x \n " , hr ) ;
2008-04-01 05:20:44 +00:00
color = getPixelColorFromSurface ( surf_rt_dest64 , 48 , 48 ) ;
ok ( color = = 0xffff0000 , " StretchRect offscreen ==> rendertarget surface scaling failed: Got color 0x%08x, expected 0xffff0000. \n " , color ) ;
}
/* offscreenplain ==> texture, scaling (should fail) */
if ( surf_offscreen32 & & surf_tex_dest64 ) {
hr = IDirect3DDevice9_StretchRect ( device , surf_offscreen32 , NULL , surf_tex_dest64 , NULL , 0 ) ;
todo_wine ok ( hr = = D3DERR_INVALIDCALL , " IDirect3DDevice9_StretchRect succeeded, shouldn't happen (todo) \ n " ) ;
}
/************************************************************
* Tests for when the source parameter is a regular texture *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/* Fill the surface of the regular texture with blue */
if ( surf_tex64 & & surf_temp64 ) {
/* Can't fill the surf_tex directly because it's created in D3DPOOL_DEFAULT */
fill_surface ( surf_temp64 , 0xff0000ff ) ;
hr = IDirect3DDevice9_UpdateSurface ( device , surf_temp64 , NULL , surf_tex64 , NULL ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_UpdateSurface failed with %08x \n " , hr ) ;
2008-04-01 05:20:44 +00:00
}
/* texture ==> offscreenplain, same size */
if ( surf_tex64 & & surf_offscreen64 ) {
hr = IDirect3DDevice9_StretchRect ( device , surf_tex64 , NULL , surf_offscreen64 , NULL , 0 ) ;
todo_wine ok ( hr = = D3DERR_INVALIDCALL , " IDirect3DDevice9_StretchRect succeeded, shouldn't happen (todo) \ n " ) ;
}
/* texture ==> rendertarget texture, same size */
if ( surf_tex64 & & surf_tex_rt_dest64 & & surf_temp64 ) {
hr = IDirect3DDevice9_StretchRect ( device , surf_tex64 , NULL , surf_tex_rt_dest64 , NULL , 0 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_StretchRect failed with %08x \n " , hr ) ;
2008-04-01 05:20:44 +00:00
/* We can't lock rendertarget textures, so copy to our temp surface first */
if ( hr = = D3D_OK ) {
hr = IDirect3DDevice9_GetRenderTargetData ( device , surf_tex_rt_dest64 , surf_temp64 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_GetRenderTargetData failed with %08x \n " , hr ) ;
2008-04-01 05:20:44 +00:00
}
if ( hr = = D3D_OK ) {
color = getPixelColorFromSurface ( surf_temp64 , 32 , 32 ) ;
ok ( color = = 0xff0000ff , " StretchRect texture ==> rendertarget texture same size failed: Got color 0x%08x, expected 0xff0000ff. \n " , color ) ;
}
}
/* texture ==> rendertarget surface, same size */
if ( surf_tex64 & & surf_rt_dest64 ) {
hr = IDirect3DDevice9_StretchRect ( device , surf_tex64 , NULL , surf_rt_dest64 , NULL , 0 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_StretchRect failed with %08x \n " , hr ) ;
2008-04-01 05:20:44 +00:00
if ( hr = = D3D_OK ) {
color = getPixelColorFromSurface ( surf_rt_dest64 , 32 , 32 ) ;
ok ( color = = 0xff0000ff , " StretchRect texture ==> rendertarget surface same size failed: Got color 0x%08x, expected 0xff0000ff. \n " , color ) ;
}
}
/* texture ==> texture, same size (should fail) */
if ( surf_tex64 & & surf_tex_dest64 ) {
hr = IDirect3DDevice9_StretchRect ( device , surf_tex64 , NULL , surf_tex_dest64 , NULL , 0 ) ;
todo_wine ok ( hr = = D3DERR_INVALIDCALL , " IDirect3DDevice9_StretchRect succeeded, shouldn't happen (todo) \ n " ) ;
}
/* Fill the surface of the smaller regular texture with red */
if ( surf_tex32 & & surf_temp32 ) {
/* Can't fill the surf_tex directly because it's created in D3DPOOL_DEFAULT */
fill_surface ( surf_temp32 , 0xffff0000 ) ;
hr = IDirect3DDevice9_UpdateSurface ( device , surf_temp32 , NULL , surf_tex32 , NULL ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_UpdateSurface failed with %08x \n " , hr ) ;
2008-04-01 05:20:44 +00:00
}
/* texture ==> offscreenplain, scaling (should fail) */
if ( surf_tex32 & & surf_offscreen64 ) {
hr = IDirect3DDevice9_StretchRect ( device , surf_tex32 , NULL , surf_offscreen64 , NULL , 0 ) ;
todo_wine ok ( hr = = D3DERR_INVALIDCALL , " IDirect3DDevice9_StretchRect succeeded, shouldn't happen (todo) \ n " ) ;
}
/* texture ==> rendertarget texture, scaling */
if ( surf_tex32 & & surf_tex_rt_dest64 & & surf_temp64 ) {
hr = IDirect3DDevice9_StretchRect ( device , surf_tex32 , NULL , surf_tex_rt_dest64 , NULL , 0 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_StretchRect failed with %08x \n " , hr ) ;
2008-04-01 05:20:44 +00:00
/* We can't lock rendertarget textures, so copy to our temp surface first */
if ( hr = = D3D_OK ) {
hr = IDirect3DDevice9_GetRenderTargetData ( device , surf_tex_rt_dest64 , surf_temp64 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_GetRenderTargetData failed with %08x \n " , hr ) ;
2008-04-01 05:20:44 +00:00
}
if ( hr = = D3D_OK ) {
color = getPixelColorFromSurface ( surf_temp64 , 48 , 48 ) ;
ok ( color = = 0xffff0000 , " StretchRect texture ==> rendertarget texture scaling failed: Got color 0x%08x, expected 0xffff0000. \n " , color ) ;
}
}
/* texture ==> rendertarget surface, scaling */
if ( surf_tex32 & & surf_rt_dest64 ) {
hr = IDirect3DDevice9_StretchRect ( device , surf_tex32 , NULL , surf_rt_dest64 , NULL , 0 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_StretchRect failed with %08x \n " , hr ) ;
2008-04-01 05:20:44 +00:00
color = getPixelColorFromSurface ( surf_rt_dest64 , 48 , 48 ) ;
ok ( color = = 0xffff0000 , " StretchRect texture ==> rendertarget surface scaling failed: Got color 0x%08x, expected 0xffff0000. \n " , color ) ;
}
/* texture ==> texture, scaling (should fail) */
if ( surf_tex32 & & surf_tex_dest64 ) {
hr = IDirect3DDevice9_StretchRect ( device , surf_tex32 , NULL , surf_tex_dest64 , NULL , 0 ) ;
todo_wine ok ( hr = = D3DERR_INVALIDCALL , " IDirect3DDevice9_StretchRect succeeded, shouldn't happen (todo) \ n " ) ;
}
/*****************************************************************
* Tests for when the source parameter is a rendertarget texture *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/* Fill the surface of the rendertarget texture with white */
if ( surf_tex_rt64 & & surf_temp64 ) {
/* Can't fill the surf_tex_rt directly because it's created in D3DPOOL_DEFAULT */
fill_surface ( surf_temp64 , 0xffffffff ) ;
hr = IDirect3DDevice9_UpdateSurface ( device , surf_temp64 , NULL , surf_tex_rt64 , NULL ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_UpdateSurface failed with %08x \n " , hr ) ;
2008-04-01 05:20:44 +00:00
}
/* rendertarget texture ==> offscreenplain, same size */
if ( surf_tex_rt64 & & surf_offscreen64 ) {
hr = IDirect3DDevice9_StretchRect ( device , surf_tex_rt64 , NULL , surf_offscreen64 , NULL , 0 ) ;
todo_wine ok ( hr = = D3DERR_INVALIDCALL , " IDirect3DDevice9_StretchRect succeeded, shouldn't happen (todo) \ n " ) ;
}
/* rendertarget texture ==> rendertarget texture, same size */
if ( surf_tex_rt64 & & surf_tex_rt_dest64 & & surf_temp64 ) {
hr = IDirect3DDevice9_StretchRect ( device , surf_tex_rt64 , NULL , surf_tex_rt_dest64 , NULL , 0 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_StretchRect failed with %08x \n " , hr ) ;
2008-04-01 05:20:44 +00:00
/* We can't lock rendertarget textures, so copy to our temp surface first */
if ( hr = = D3D_OK ) {
hr = IDirect3DDevice9_GetRenderTargetData ( device , surf_tex_rt_dest64 , surf_temp64 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_GetRenderTargetData failed with %08x \n " , hr ) ;
2008-04-01 05:20:44 +00:00
}
if ( hr = = D3D_OK ) {
color = getPixelColorFromSurface ( surf_temp64 , 32 , 32 ) ;
ok ( color = = 0xffffffff , " StretchRect rendertarget texture ==> rendertarget texture same size failed: Got color 0x%08x, expected 0xffffffff. \n " , color ) ;
}
}
/* rendertarget texture ==> rendertarget surface, same size */
if ( surf_tex_rt64 & & surf_rt_dest64 ) {
hr = IDirect3DDevice9_StretchRect ( device , surf_tex_rt64 , NULL , surf_rt_dest64 , NULL , 0 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_StretchRect failed with %08x \n " , hr ) ;
2008-04-01 05:20:44 +00:00
if ( hr = = D3D_OK ) {
color = getPixelColorFromSurface ( surf_rt_dest64 , 32 , 32 ) ;
ok ( color = = 0xffffffff , " StretchRect rendertarget texture ==> rendertarget surface same size failed: Got color 0x%08x, expected 0xffffffff. \n " , color ) ;
}
}
/* rendertarget texture ==> texture, same size (should fail) */
if ( surf_tex_rt64 & & surf_tex_dest64 ) {
hr = IDirect3DDevice9_StretchRect ( device , surf_tex_rt64 , NULL , surf_tex_dest64 , NULL , 0 ) ;
todo_wine ok ( hr = = D3DERR_INVALIDCALL , " IDirect3DDevice9_StretchRect succeeded, shouldn't happen (todo) \ n " ) ;
}
/* Fill the surface of the smaller rendertarget texture with red */
if ( surf_tex_rt32 & & surf_temp32 ) {
/* Can't fill the surf_tex_rt directly because it's created in D3DPOOL_DEFAULT */
fill_surface ( surf_temp32 , 0xffff0000 ) ;
hr = IDirect3DDevice9_UpdateSurface ( device , surf_temp32 , NULL , surf_tex_rt32 , NULL ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_UpdateSurface failed with %08x \n " , hr ) ;
2008-04-01 05:20:44 +00:00
}
/* rendertarget texture ==> offscreenplain, scaling (should fail) */
if ( surf_tex_rt32 & & surf_offscreen64 ) {
hr = IDirect3DDevice9_StretchRect ( device , surf_tex_rt32 , NULL , surf_offscreen64 , NULL , 0 ) ;
todo_wine ok ( hr = = D3DERR_INVALIDCALL , " IDirect3DDevice9_StretchRect succeeded, shouldn't happen (todo) \ n " ) ;
}
/* rendertarget texture ==> rendertarget texture, scaling */
if ( surf_tex_rt32 & & surf_tex_rt_dest64 & & surf_temp64 ) {
hr = IDirect3DDevice9_StretchRect ( device , surf_tex_rt32 , NULL , surf_tex_rt_dest64 , NULL , 0 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_StretchRect failed with %08x \n " , hr ) ;
2008-04-01 05:20:44 +00:00
/* We can't lock rendertarget textures, so copy to our temp surface first */
if ( hr = = D3D_OK ) {
hr = IDirect3DDevice9_GetRenderTargetData ( device , surf_tex_rt_dest64 , surf_temp64 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_GetRenderTargetData failed with %08x \n " , hr ) ;
2008-04-01 05:20:44 +00:00
}
if ( hr = = D3D_OK ) {
color = getPixelColorFromSurface ( surf_temp64 , 48 , 48 ) ;
ok ( color = = 0xffff0000 , " StretchRect rendertarget texture ==> rendertarget texture scaling failed: Got color 0x%08x, expected 0xffff0000. \n " , color ) ;
}
}
/* rendertarget texture ==> rendertarget surface, scaling */
if ( surf_tex_rt32 & & surf_rt_dest64 ) {
hr = IDirect3DDevice9_StretchRect ( device , surf_tex_rt32 , NULL , surf_rt_dest64 , NULL , 0 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_StretchRect failed with %08x \n " , hr ) ;
2008-04-01 05:20:44 +00:00
color = getPixelColorFromSurface ( surf_rt_dest64 , 48 , 48 ) ;
ok ( color = = 0xffff0000 , " StretchRect rendertarget texture ==> rendertarget surface scaling failed: Got color 0x%08x, expected 0xffff0000. \n " , color ) ;
}
/* rendertarget texture ==> texture, scaling (should fail) */
if ( surf_tex_rt32 & & surf_tex_dest64 ) {
hr = IDirect3DDevice9_StretchRect ( device , surf_tex_rt32 , NULL , surf_tex_dest64 , NULL , 0 ) ;
todo_wine ok ( hr = = D3DERR_INVALIDCALL , " IDirect3DDevice9_StretchRect succeeded, shouldn't happen (todo) \ n " ) ;
}
/*****************************************************************
* Tests for when the source parameter is a rendertarget surface *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/* Fill the surface of the rendertarget surface with black */
if ( surf_rt64 )
fill_surface ( surf_rt64 , 0xff000000 ) ;
/* rendertarget texture ==> offscreenplain, same size */
if ( surf_rt64 & & surf_offscreen64 ) {
hr = IDirect3DDevice9_StretchRect ( device , surf_rt64 , NULL , surf_offscreen64 , NULL , 0 ) ;
todo_wine ok ( hr = = D3DERR_INVALIDCALL , " IDirect3DDevice9_StretchRect succeeded, shouldn't happen (todo) \ n " ) ;
}
/* rendertarget surface ==> rendertarget texture, same size */
if ( surf_rt64 & & surf_tex_rt_dest64 & & surf_temp64 ) {
hr = IDirect3DDevice9_StretchRect ( device , surf_rt64 , NULL , surf_tex_rt_dest64 , NULL , 0 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_StretchRect failed with %08x \n " , hr ) ;
2008-04-01 05:20:44 +00:00
/* We can't lock rendertarget textures, so copy to our temp surface first */
if ( hr = = D3D_OK ) {
hr = IDirect3DDevice9_GetRenderTargetData ( device , surf_tex_rt_dest64 , surf_temp64 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_GetRenderTargetData failed with %08x \n " , hr ) ;
2008-04-01 05:20:44 +00:00
}
if ( hr = = D3D_OK ) {
color = getPixelColorFromSurface ( surf_temp64 , 32 , 32 ) ;
ok ( color = = 0xff000000 , " StretchRect rendertarget surface ==> rendertarget texture same size failed: Got color 0x%08x, expected 0xff000000. \n " , color ) ;
}
}
/* rendertarget surface ==> rendertarget surface, same size */
if ( surf_rt64 & & surf_rt_dest64 ) {
hr = IDirect3DDevice9_StretchRect ( device , surf_rt64 , NULL , surf_rt_dest64 , NULL , 0 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_StretchRect failed with %08x \n " , hr ) ;
2008-04-01 05:20:44 +00:00
if ( hr = = D3D_OK ) {
color = getPixelColorFromSurface ( surf_rt_dest64 , 32 , 32 ) ;
ok ( color = = 0xff000000 , " StretchRect rendertarget surface ==> rendertarget surface same size failed: Got color 0x%08x, expected 0xff000000. \n " , color ) ;
}
}
/* rendertarget surface ==> texture, same size (should fail) */
if ( surf_rt64 & & surf_tex_dest64 ) {
hr = IDirect3DDevice9_StretchRect ( device , surf_rt64 , NULL , surf_tex_dest64 , NULL , 0 ) ;
todo_wine ok ( hr = = D3DERR_INVALIDCALL , " IDirect3DDevice9_StretchRect succeeded, shouldn't happen (todo) \ n " ) ;
}
/* Fill the surface of the smaller rendertarget texture with red */
if ( surf_rt32 )
fill_surface ( surf_rt32 , 0xffff0000 ) ;
/* rendertarget surface ==> offscreenplain, scaling (should fail) */
if ( surf_rt32 & & surf_offscreen64 ) {
hr = IDirect3DDevice9_StretchRect ( device , surf_rt32 , NULL , surf_offscreen64 , NULL , 0 ) ;
todo_wine ok ( hr = = D3DERR_INVALIDCALL , " IDirect3DDevice9_StretchRect succeeded, shouldn't happen (todo) \ n " ) ;
}
/* rendertarget surface ==> rendertarget texture, scaling */
if ( surf_rt32 & & surf_tex_rt_dest64 & & surf_temp64 ) {
hr = IDirect3DDevice9_StretchRect ( device , surf_rt32 , NULL , surf_tex_rt_dest64 , NULL , 0 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_StretchRect failed with %08x \n " , hr ) ;
2008-04-01 05:20:44 +00:00
/* We can't lock rendertarget textures, so copy to our temp surface first */
if ( hr = = D3D_OK ) {
hr = IDirect3DDevice9_GetRenderTargetData ( device , surf_tex_rt_dest64 , surf_temp64 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_GetRenderTargetData failed with %08x \n " , hr ) ;
2008-04-01 05:20:44 +00:00
}
if ( hr = = D3D_OK ) {
color = getPixelColorFromSurface ( surf_temp64 , 48 , 48 ) ;
ok ( color = = 0xffff0000 , " StretchRect rendertarget surface ==> rendertarget texture scaling failed: Got color 0x%08x, expected 0xffff0000. \n " , color ) ;
}
}
/* rendertarget surface ==> rendertarget surface, scaling */
if ( surf_rt32 & & surf_rt_dest64 ) {
hr = IDirect3DDevice9_StretchRect ( device , surf_rt32 , NULL , surf_rt_dest64 , NULL , 0 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_StretchRect failed with %08x \n " , hr ) ;
2008-04-01 05:20:44 +00:00
color = getPixelColorFromSurface ( surf_rt_dest64 , 48 , 48 ) ;
ok ( color = = 0xffff0000 , " StretchRect rendertarget surface ==> rendertarget surface scaling failed: Got color 0x%08x, expected 0xffff0000. \n " , color ) ;
}
/* rendertarget surface ==> texture, scaling (should fail) */
if ( surf_rt32 & & surf_tex_dest64 ) {
hr = IDirect3DDevice9_StretchRect ( device , surf_rt32 , NULL , surf_tex_dest64 , NULL , 0 ) ;
todo_wine ok ( hr = = D3DERR_INVALIDCALL , " IDirect3DDevice9_StretchRect succeeded, shouldn't happen (todo) \ n " ) ;
}
/* TODO: Test when source and destination RECT parameters are given... */
/* TODO: Test format conversions */
out :
/* Clean up */
if ( surf_rt32 )
IDirect3DSurface9_Release ( surf_rt32 ) ;
if ( surf_rt64 )
IDirect3DSurface9_Release ( surf_rt64 ) ;
if ( surf_rt_dest64 )
IDirect3DSurface9_Release ( surf_rt_dest64 ) ;
if ( surf_temp32 )
IDirect3DSurface9_Release ( surf_temp32 ) ;
if ( surf_temp64 )
IDirect3DSurface9_Release ( surf_temp64 ) ;
if ( surf_offscreen32 )
IDirect3DSurface9_Release ( surf_offscreen32 ) ;
if ( surf_offscreen64 )
IDirect3DSurface9_Release ( surf_offscreen64 ) ;
if ( surf_offscreen_dest64 )
IDirect3DSurface9_Release ( surf_offscreen_dest64 ) ;
if ( tex_rt32 ) {
if ( surf_tex_rt32 )
IDirect3DSurface9_Release ( surf_tex_rt32 ) ;
IDirect3DTexture9_Release ( tex_rt32 ) ;
}
if ( tex_rt64 ) {
if ( surf_tex_rt64 )
IDirect3DSurface9_Release ( surf_tex_rt64 ) ;
IDirect3DTexture9_Release ( tex_rt64 ) ;
}
if ( tex_rt_dest64 ) {
if ( surf_tex_rt_dest64 )
IDirect3DSurface9_Release ( surf_tex_rt_dest64 ) ;
IDirect3DTexture9_Release ( tex_rt_dest64 ) ;
}
if ( tex32 ) {
if ( surf_tex32 )
IDirect3DSurface9_Release ( surf_tex32 ) ;
IDirect3DTexture9_Release ( tex32 ) ;
}
if ( tex64 ) {
if ( surf_tex64 )
IDirect3DSurface9_Release ( surf_tex64 ) ;
IDirect3DTexture9_Release ( tex64 ) ;
}
if ( tex_dest64 ) {
if ( surf_tex_dest64 )
IDirect3DSurface9_Release ( surf_tex_dest64 ) ;
IDirect3DTexture9_Release ( tex_dest64 ) ;
}
if ( orig_rt ) {
hr = IDirect3DDevice9_SetRenderTarget ( device , 0 , orig_rt ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DSetRenderTarget failed with %08x \n " , hr ) ;
2008-04-01 05:20:44 +00:00
IDirect3DSurface9_Release ( orig_rt ) ;
}
}
2007-07-25 16:49:03 +00:00
static void maxmip_test ( IDirect3DDevice9 * device )
{
IDirect3DTexture9 * texture = NULL ;
IDirect3DSurface9 * surface = NULL ;
HRESULT hr ;
DWORD color ;
const float quads [ ] = {
- 1.0 , - 1.0 , 0.0 , 0.0 , 0.0 ,
- 1.0 , 0.0 , 0.0 , 0.0 , 1.0 ,
0.0 , - 1.0 , 0.0 , 1.0 , 0.0 ,
0.0 , 0.0 , 0.0 , 1.0 , 1.0 ,
0.0 , - 1.0 , 0.0 , 0.0 , 0.0 ,
0.0 , 0.0 , 0.0 , 0.0 , 1.0 ,
1.0 , - 1.0 , 0.0 , 1.0 , 0.0 ,
1.0 , 0.0 , 0.0 , 1.0 , 1.0 ,
0.0 , 0.0 , 0.0 , 0.0 , 0.0 ,
0.0 , 1.0 , 0.0 , 0.0 , 1.0 ,
1.0 , 0.0 , 0.0 , 1.0 , 0.0 ,
1.0 , 1.0 , 0.0 , 1.0 , 1.0 ,
- 1.0 , 0.0 , 0.0 , 0.0 , 0.0 ,
- 1.0 , 1.0 , 0.0 , 0.0 , 1.0 ,
0.0 , 0.0 , 0.0 , 1.0 , 0.0 ,
0.0 , 1.0 , 0.0 , 1.0 , 1.0 ,
} ;
hr = IDirect3DDevice9_Clear ( device , 0 , NULL , D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER , 0xffffffff , 0.0 , 0 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_Clear returned %08x \n " , hr ) ;
2007-07-25 16:49:03 +00:00
hr = IDirect3DDevice9_CreateTexture ( device , 128 , 128 , 3 , 0 , D3DFMT_A8R8G8B8 , D3DPOOL_MANAGED ,
& texture , NULL ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_CreateTexture failed with %08x \n " , hr ) ;
2007-07-25 16:49:03 +00:00
if ( ! texture )
{
skip ( " Failed to create test texture \n " ) ;
return ;
}
hr = IDirect3DTexture9_GetSurfaceLevel ( texture , 0 , & surface ) ;
fill_surface ( surface , 0xffff0000 ) ;
IDirect3DSurface9_Release ( surface ) ;
hr = IDirect3DTexture9_GetSurfaceLevel ( texture , 1 , & surface ) ;
fill_surface ( surface , 0xff00ff00 ) ;
IDirect3DSurface9_Release ( surface ) ;
hr = IDirect3DTexture9_GetSurfaceLevel ( texture , 2 , & surface ) ;
fill_surface ( surface , 0xff0000ff ) ;
IDirect3DSurface9_Release ( surface ) ;
hr = IDirect3DDevice9_SetTexture ( device , 0 , ( IDirect3DBaseTexture9 * ) texture ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetTexture failed with %08x \n " , hr ) ;
2007-07-25 16:49:03 +00:00
hr = IDirect3DDevice9_SetFVF ( device , D3DFVF_XYZ | D3DFVF_TEX1 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetFVF failed with %08x \n " , hr ) ;
2007-07-25 16:49:03 +00:00
hr = IDirect3DDevice9_SetSamplerState ( device , 0 , D3DSAMP_MIPFILTER , D3DTEXF_NONE ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetSamplerState failed with %08x \n " , hr ) ;
2007-07-25 16:49:03 +00:00
hr = IDirect3DDevice9_BeginScene ( device ) ;
if ( SUCCEEDED ( hr ) )
{
hr = IDirect3DDevice9_SetSamplerState ( device , 0 , D3DSAMP_MAXMIPLEVEL , 0 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetSamplerState failed with %08x \n " , hr ) ;
2007-07-25 16:49:03 +00:00
hr = IDirect3DDevice9_DrawPrimitiveUP ( device , D3DPT_TRIANGLESTRIP , 2 , & quads [ 0 ] , 5 * sizeof ( float ) ) ;
ok ( SUCCEEDED ( hr ) , " DrawPrimitiveUP failed (%08x) \n " , hr ) ;
hr = IDirect3DDevice9_SetSamplerState ( device , 0 , D3DSAMP_MAXMIPLEVEL , 1 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetSamplerState failed with %08x \n " , hr ) ;
2007-07-25 16:49:03 +00:00
hr = IDirect3DDevice9_DrawPrimitiveUP ( device , D3DPT_TRIANGLESTRIP , 2 , & quads [ 20 ] , 5 * sizeof ( float ) ) ;
ok ( SUCCEEDED ( hr ) , " DrawPrimitiveUP failed (%08x) \n " , hr ) ;
hr = IDirect3DDevice9_SetSamplerState ( device , 0 , D3DSAMP_MAXMIPLEVEL , 2 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetSamplerState failed with %08x \n " , hr ) ;
2007-07-25 16:49:03 +00:00
hr = IDirect3DDevice9_DrawPrimitiveUP ( device , D3DPT_TRIANGLESTRIP , 2 , & quads [ 40 ] , 5 * sizeof ( float ) ) ;
ok ( SUCCEEDED ( hr ) , " DrawPrimitiveUP failed (%08x) \n " , hr ) ;
hr = IDirect3DDevice9_SetSamplerState ( device , 0 , D3DSAMP_MAXMIPLEVEL , 3 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetSamplerState failed with %08x \n " , hr ) ;
2007-07-25 16:49:03 +00:00
hr = IDirect3DDevice9_DrawPrimitiveUP ( device , D3DPT_TRIANGLESTRIP , 2 , & quads [ 60 ] , 5 * sizeof ( float ) ) ;
ok ( SUCCEEDED ( hr ) , " DrawPrimitiveUP failed (%08x) \n " , hr ) ;
hr = IDirect3DDevice9_EndScene ( device ) ;
}
hr = IDirect3DDevice9_Present ( device , NULL , NULL , NULL , NULL ) ;
ok ( SUCCEEDED ( hr ) , " Present failed (0x%08x) \n " , hr ) ;
/* With mipmapping disabled, the max mip level is ignored, only level 0 is used */
color = getPixelColor ( device , 160 , 360 ) ;
ok ( color = = 0x00FF0000 , " MapMip 0, no mipfilter has color %08x \n " , color ) ;
color = getPixelColor ( device , 160 , 120 ) ;
ok ( color = = 0x00FF0000 , " MapMip 3, no mipfilter has color %08x \n " , color ) ;
color = getPixelColor ( device , 480 , 120 ) ;
ok ( color = = 0x00FF0000 , " MapMip 2, no mipfilter has color %08x \n " , color ) ;
color = getPixelColor ( device , 480 , 360 ) ;
ok ( color = = 0x00FF0000 , " MapMip 1, no mipfilter has color %08x \n " , color ) ;
hr = IDirect3DDevice9_Clear ( device , 0 , NULL , D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER , 0xffffffff , 0.0 , 0 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_Clear returned %08x \n " , hr ) ;
2007-07-25 16:49:03 +00:00
hr = IDirect3DDevice9_SetSamplerState ( device , 0 , D3DSAMP_MIPFILTER , D3DTEXF_POINT ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetSamplerState failed with %08x \n " , hr ) ;
2007-07-25 16:49:03 +00:00
hr = IDirect3DDevice9_BeginScene ( device ) ;
if ( SUCCEEDED ( hr ) )
{
hr = IDirect3DDevice9_SetSamplerState ( device , 0 , D3DSAMP_MAXMIPLEVEL , 0 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetSamplerState failed with %08x \n " , hr ) ;
2007-07-25 16:49:03 +00:00
hr = IDirect3DDevice9_DrawPrimitiveUP ( device , D3DPT_TRIANGLESTRIP , 2 , & quads [ 0 ] , 5 * sizeof ( float ) ) ;
ok ( SUCCEEDED ( hr ) , " DrawPrimitiveUP failed (%08x) \n " , hr ) ;
hr = IDirect3DDevice9_SetSamplerState ( device , 0 , D3DSAMP_MAXMIPLEVEL , 1 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetSamplerState failed with %08x \n " , hr ) ;
2007-07-25 16:49:03 +00:00
hr = IDirect3DDevice9_DrawPrimitiveUP ( device , D3DPT_TRIANGLESTRIP , 2 , & quads [ 20 ] , 5 * sizeof ( float ) ) ;
ok ( SUCCEEDED ( hr ) , " DrawPrimitiveUP failed (%08x) \n " , hr ) ;
hr = IDirect3DDevice9_SetSamplerState ( device , 0 , D3DSAMP_MAXMIPLEVEL , 2 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetSamplerState failed with %08x \n " , hr ) ;
2007-07-25 16:49:03 +00:00
hr = IDirect3DDevice9_DrawPrimitiveUP ( device , D3DPT_TRIANGLESTRIP , 2 , & quads [ 40 ] , 5 * sizeof ( float ) ) ;
ok ( SUCCEEDED ( hr ) , " DrawPrimitiveUP failed (%08x) \n " , hr ) ;
hr = IDirect3DDevice9_SetSamplerState ( device , 0 , D3DSAMP_MAXMIPLEVEL , 3 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetSamplerState failed with %08x \n " , hr ) ;
2007-07-25 16:49:03 +00:00
hr = IDirect3DDevice9_DrawPrimitiveUP ( device , D3DPT_TRIANGLESTRIP , 2 , & quads [ 60 ] , 5 * sizeof ( float ) ) ;
ok ( SUCCEEDED ( hr ) , " DrawPrimitiveUP failed (%08x) \n " , hr ) ;
hr = IDirect3DDevice9_EndScene ( device ) ;
}
hr = IDirect3DDevice9_SetSamplerState ( device , 0 , D3DSAMP_MAXMIPLEVEL , 0 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetSamplerState failed with %08x \n " , hr ) ;
2007-07-25 16:49:03 +00:00
hr = IDirect3DDevice9_SetSamplerState ( device , 0 , D3DSAMP_MIPFILTER , D3DTEXF_NONE ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetSamplerState failed with %08x \n " , hr ) ;
2007-07-25 16:49:03 +00:00
hr = IDirect3DDevice9_Present ( device , NULL , NULL , NULL , NULL ) ;
ok ( SUCCEEDED ( hr ) , " Present failed (0x%08x) \n " , hr ) ;
/* Max Mip level 0-2 sample from the specified texture level, Max Mip level 3(> levels in texture)
* samples from the highest level in the texture ( level 2 )
*/
color = getPixelColor ( device , 160 , 360 ) ;
ok ( color = = 0x00FF0000 , " MapMip 0, point mipfilter has color %08x \n " , color ) ;
color = getPixelColor ( device , 160 , 120 ) ;
ok ( color = = 0x000000FF , " MapMip 3, point mipfilter has color %08x \n " , color ) ;
color = getPixelColor ( device , 480 , 120 ) ;
ok ( color = = 0x000000FF , " MapMip 2, point mipfilter has color %08x \n " , color ) ;
color = getPixelColor ( device , 480 , 360 ) ;
ok ( color = = 0x0000FF00 , " MapMip 1, point mipfilter has color %08x \n " , color ) ;
hr = IDirect3DDevice9_SetTexture ( device , 0 , NULL ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetTexture failed with %08x \n " , hr ) ;
2007-07-25 16:49:03 +00:00
hr = IDirect3DDevice9_SetSamplerState ( device , 0 , D3DSAMP_MAXMIPLEVEL , 0 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetSamplerState failed with %08x \n " , hr ) ;
2007-07-25 16:49:03 +00:00
IDirect3DTexture9_Release ( texture ) ;
}
2007-08-14 12:46:38 +00:00
static void release_buffer_test ( IDirect3DDevice9 * device )
{
IDirect3DVertexBuffer9 * vb = NULL ;
IDirect3DIndexBuffer9 * ib = NULL ;
HRESULT hr ;
BYTE * data ;
long ref ;
static const struct vertex quad [ ] = {
{ - 1.0 , - 1.0 , 0.1 , 0xffff0000 } ,
{ - 1.0 , 1.0 , 0.1 , 0xffff0000 } ,
{ 1.0 , 1.0 , 0.1 , 0xffff0000 } ,
{ - 1.0 , - 1.0 , 0.1 , 0xff00ff00 } ,
{ - 1.0 , 1.0 , 0.1 , 0xff00ff00 } ,
{ 1.0 , 1.0 , 0.1 , 0xff00ff00 }
} ;
short indices [ ] = { 3 , 4 , 5 } ;
2007-08-29 19:43:57 +00:00
/* Index and vertex buffers should always be creatable */
2007-08-14 12:46:38 +00:00
hr = IDirect3DDevice9_CreateVertexBuffer ( device , sizeof ( quad ) , 0 , D3DFVF_XYZ | D3DFVF_DIFFUSE ,
D3DPOOL_MANAGED , & vb , NULL ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " CreateVertexBuffer failed with %08x \n " , hr ) ;
2007-08-14 12:46:38 +00:00
if ( ! vb ) {
skip ( " Failed to create a vertex buffer \n " ) ;
return ;
}
hr = IDirect3DDevice9_CreateIndexBuffer ( device , sizeof ( indices ) , 0 , D3DFMT_INDEX16 , D3DPOOL_DEFAULT , & ib , NULL ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_CreateIndexBuffer failed with %08x \n " , hr ) ;
2007-08-14 12:46:38 +00:00
if ( ! ib ) {
skip ( " Failed to create an index buffer \n " ) ;
return ;
}
hr = IDirect3DVertexBuffer9_Lock ( vb , 0 , sizeof ( quad ) , ( void * * ) & data , 0 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DVertexBuffer9_Lock failed with %08x \n " , hr ) ;
2007-08-14 12:46:38 +00:00
memcpy ( data , quad , sizeof ( quad ) ) ;
hr = IDirect3DVertexBuffer9_Unlock ( vb ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DVertexBuffer9_Unlock failed with %08x \n " , hr ) ;
2007-08-14 12:46:38 +00:00
hr = IDirect3DIndexBuffer9_Lock ( ib , 0 , sizeof ( indices ) , ( void * * ) & data , 0 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DIndexBuffer9_Lock failed with %08x \n " , hr ) ;
2007-08-14 12:46:38 +00:00
memcpy ( data , indices , sizeof ( indices ) ) ;
hr = IDirect3DIndexBuffer9_Unlock ( ib ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DIndexBuffer9_Unlock failed with %08x \n " , hr ) ;
2007-08-14 12:46:38 +00:00
hr = IDirect3DDevice9_SetIndices ( device , ib ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetIndices failed with %08x \n " , hr ) ;
2007-08-14 12:46:38 +00:00
hr = IDirect3DDevice9_SetStreamSource ( device , 0 , vb , 0 , sizeof ( quad [ 0 ] ) ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetStreamSource failed with %08x \n " , hr ) ;
2007-08-14 12:46:38 +00:00
hr = IDirect3DDevice9_SetFVF ( device , D3DFVF_XYZ | D3DFVF_DIFFUSE ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetFVF failed with %08x \n " , hr ) ;
2007-08-14 12:46:38 +00:00
/* Now destroy the bound index buffer and draw again */
ref = IDirect3DIndexBuffer9_Release ( ib ) ;
ok ( ref = = 0 , " Index Buffer reference count is %08ld \n " , ref ) ;
hr = IDirect3DDevice9_Clear ( device , 0 , NULL , D3DCLEAR_TARGET , 0xff0000ff , 0.0 , 0 ) ;
ok ( hr = = D3D_OK , " IDirect3DDevice9_Clear failed with %08x \n " , hr ) ;
hr = IDirect3DDevice9_BeginScene ( device ) ;
ok ( hr = = D3D_OK , " IDirect3DDevice9_BeginScene failed with %08x \n " , hr ) ;
if ( SUCCEEDED ( hr ) )
{
/* Deliberately using minvertexindex = 0 and numVertices = 6 to prevent d3d from
* making assumptions about the indices or vertices
*/
hr = IDirect3DDevice9_DrawIndexedPrimitive ( device , D3DPT_TRIANGLELIST , 0 , 3 , 3 , 0 , 1 ) ;
ok ( hr = = D3D_OK , " IDirect3DDevice9_DrawIndexedPrimitive failed with %08x \n " , hr ) ;
hr = IDirect3DDevice9_EndScene ( device ) ;
ok ( hr = = D3D_OK , " IDirect3DDevice9_EndScene failed with %08x \n " , hr ) ;
}
hr = IDirect3DDevice9_Present ( device , NULL , NULL , NULL , NULL ) ;
ok ( hr = = D3D_OK , " IDirect3DDevice9_Present failed with %08x \n " , hr ) ;
hr = IDirect3DDevice9_SetIndices ( device , NULL ) ;
ok ( hr = = D3D_OK , " IDirect3DIndexBuffer9_Unlock failed with %08x \n " , hr ) ;
hr = IDirect3DDevice9_SetStreamSource ( device , 0 , NULL , 0 , 0 ) ;
ok ( hr = = D3D_OK , " IDirect3DIndexBuffer9_Unlock failed with %08x \n " , hr ) ;
/* Index buffer was already destroyed as part of the test */
IDirect3DVertexBuffer9_Release ( vb ) ;
}
2007-08-12 14:24:29 +00:00
static void float_texture_test ( IDirect3DDevice9 * device )
{
IDirect3D9 * d3d = NULL ;
HRESULT hr ;
IDirect3DTexture9 * texture = NULL ;
D3DLOCKED_RECT lr ;
float * data ;
DWORD color ;
float quad [ ] = {
- 1.0 , - 1.0 , 0.1 , 0.0 , 0.0 ,
- 1.0 , 1.0 , 0.1 , 0.0 , 1.0 ,
1.0 , - 1.0 , 0.1 , 1.0 , 0.0 ,
1.0 , 1.0 , 0.1 , 1.0 , 1.0 ,
} ;
memset ( & lr , 0 , sizeof ( lr ) ) ;
IDirect3DDevice9_GetDirect3D ( device , & d3d ) ;
if ( IDirect3D9_CheckDeviceFormat ( d3d , 0 , D3DDEVTYPE_HAL , D3DFMT_X8R8G8B8 , 0 ,
D3DRTYPE_TEXTURE , D3DFMT_R32F ) ! = D3D_OK ) {
skip ( " D3DFMT_R32F textures not supported \n " ) ;
goto out ;
}
hr = IDirect3DDevice9_CreateTexture ( device , 1 , 1 , 1 , 0 , D3DFMT_R32F ,
D3DPOOL_MANAGED , & texture , NULL ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_CreateTexture failed with %08x \n " , hr ) ;
2007-08-12 14:24:29 +00:00
if ( ! texture ) {
skip ( " Failed to create R32F texture \n " ) ;
goto out ;
}
hr = IDirect3DTexture9_LockRect ( texture , 0 , & lr , NULL , 0 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DTexture9_LockRect failed with %08x \n " , hr ) ;
2007-08-12 14:24:29 +00:00
data = lr . pBits ;
* data = 0.0 ;
hr = IDirect3DTexture9_UnlockRect ( texture , 0 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DTexture9_UnlockRect failed with %08x \n " , hr ) ;
2007-08-12 14:24:29 +00:00
hr = IDirect3DDevice9_SetTexture ( device , 0 , ( IDirect3DBaseTexture9 * ) texture ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetTexture failed with %08x \n " , hr ) ;
2007-08-12 14:24:29 +00:00
hr = IDirect3DDevice9_BeginScene ( device ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_BeginScene failed with %08x \n " , hr ) ;
2007-08-12 14:24:29 +00:00
if ( SUCCEEDED ( hr ) )
{
hr = IDirect3DDevice9_SetFVF ( device , D3DFVF_XYZ | D3DFVF_TEX1 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetFVF failed with %08x \n " , hr ) ;
2007-08-12 14:24:29 +00:00
hr = IDirect3DDevice9_DrawPrimitiveUP ( device , D3DPT_TRIANGLESTRIP , 2 , quad , 5 * sizeof ( float ) ) ;
ok ( SUCCEEDED ( hr ) , " DrawPrimitiveUP failed (%08x) \n " , hr ) ;
hr = IDirect3DDevice9_EndScene ( device ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_EndScene failed with %08x \n " , hr ) ;
2007-08-12 14:24:29 +00:00
}
hr = IDirect3DDevice9_SetTexture ( device , 0 , NULL ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetTexture failed with %08x \n " , hr ) ;
2007-08-12 14:24:29 +00:00
hr = IDirect3DDevice9_Present ( device , NULL , NULL , NULL , NULL ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_Present failed with %08x \n " , hr ) ;
2007-08-12 14:24:29 +00:00
color = getPixelColor ( device , 240 , 320 ) ;
ok ( color = = 0x0000FFFF , " R32F with value 0.0 has color %08x, expected 0x0000FFFF \n " , color ) ;
out :
if ( texture ) IDirect3DTexture9_Release ( texture ) ;
IDirect3D9_Release ( d3d ) ;
}
2007-12-15 22:47:10 +00:00
static void g16r16_texture_test ( IDirect3DDevice9 * device )
{
IDirect3D9 * d3d = NULL ;
HRESULT hr ;
IDirect3DTexture9 * texture = NULL ;
D3DLOCKED_RECT lr ;
DWORD * data ;
DWORD color , red , green , blue ;
float quad [ ] = {
- 1.0 , - 1.0 , 0.1 , 0.0 , 0.0 ,
- 1.0 , 1.0 , 0.1 , 0.0 , 1.0 ,
1.0 , - 1.0 , 0.1 , 1.0 , 0.0 ,
1.0 , 1.0 , 0.1 , 1.0 , 1.0 ,
} ;
memset ( & lr , 0 , sizeof ( lr ) ) ;
IDirect3DDevice9_GetDirect3D ( device , & d3d ) ;
if ( IDirect3D9_CheckDeviceFormat ( d3d , 0 , D3DDEVTYPE_HAL , D3DFMT_X8R8G8B8 , 0 ,
D3DRTYPE_TEXTURE , D3DFMT_G16R16 ) ! = D3D_OK ) {
skip ( " D3DFMT_G16R16 textures not supported \n " ) ;
goto out ;
}
hr = IDirect3DDevice9_CreateTexture ( device , 1 , 1 , 1 , 0 , D3DFMT_G16R16 ,
D3DPOOL_MANAGED , & texture , NULL ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_CreateTexture failed with %08x \n " , hr ) ;
2007-12-15 22:47:10 +00:00
if ( ! texture ) {
skip ( " Failed to create D3DFMT_G16R16 texture \n " ) ;
goto out ;
}
hr = IDirect3DTexture9_LockRect ( texture , 0 , & lr , NULL , 0 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DTexture9_LockRect failed with %08x \n " , hr ) ;
2007-12-15 22:47:10 +00:00
data = lr . pBits ;
* data = 0x0f00f000 ;
hr = IDirect3DTexture9_UnlockRect ( texture , 0 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DTexture9_UnlockRect failed with %08x \n " , hr ) ;
2007-12-15 22:47:10 +00:00
hr = IDirect3DDevice9_SetTexture ( device , 0 , ( IDirect3DBaseTexture9 * ) texture ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetTexture failed with %08x \n " , hr ) ;
2007-12-15 22:47:10 +00:00
hr = IDirect3DDevice9_BeginScene ( device ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_BeginScene failed with %08x \n " , hr ) ;
2007-12-15 22:47:10 +00:00
if ( SUCCEEDED ( hr ) )
{
hr = IDirect3DDevice9_SetFVF ( device , D3DFVF_XYZ | D3DFVF_TEX1 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetFVF failed with %08x \n " , hr ) ;
2007-12-15 22:47:10 +00:00
hr = IDirect3DDevice9_DrawPrimitiveUP ( device , D3DPT_TRIANGLESTRIP , 2 , quad , 5 * sizeof ( float ) ) ;
ok ( SUCCEEDED ( hr ) , " DrawPrimitiveUP failed (%08x) \n " , hr ) ;
hr = IDirect3DDevice9_EndScene ( device ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_EndScene failed with %08x \n " , hr ) ;
2007-12-15 22:47:10 +00:00
}
hr = IDirect3DDevice9_SetTexture ( device , 0 , NULL ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetTexture failed with %08x \n " , hr ) ;
2007-12-15 22:47:10 +00:00
hr = IDirect3DDevice9_Present ( device , NULL , NULL , NULL , NULL ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_Present failed with %08x \n " , hr ) ;
2007-12-15 22:47:10 +00:00
color = getPixelColor ( device , 240 , 320 ) ;
red = ( color & 0x00ff0000 ) > > 16 ;
green = ( color & 0x0000ff00 ) > > 8 ;
blue = ( color & 0x000000ff ) > > 0 ;
ok ( blue = = 0xff & & red > = 0xef & & red < = 0xf1 & & green > = 0x0e & & green < = 0x10 ,
" D3DFMT_G16R16 with value 0x00ffff00 has color %08x, expected 0x00F00FFF \n " , color ) ;
out :
if ( texture ) IDirect3DTexture9_Release ( texture ) ;
IDirect3D9_Release ( d3d ) ;
}
2007-08-19 17:47:38 +00:00
static void texture_transform_flags_test ( IDirect3DDevice9 * device )
{
HRESULT hr ;
IDirect3D9 * d3d ;
D3DFORMAT fmt = D3DFMT_X8R8G8B8 ;
D3DCAPS9 caps ;
IDirect3DTexture9 * texture = NULL ;
IDirect3DVolumeTexture9 * volume = NULL ;
unsigned int x , y , z ;
D3DLOCKED_RECT lr ;
D3DLOCKED_BOX lb ;
DWORD color ;
2008-10-06 17:09:53 +00:00
UINT w , h ;
2008-03-05 22:17:01 +00:00
IDirect3DVertexDeclaration9 * decl , * decl2 , * decl3 ;
2007-08-19 17:47:38 +00:00
float identity [ 16 ] = { 1.0 , 0.0 , 0.0 , 0.0 ,
0.0 , 1.0 , 0.0 , 0.0 ,
0.0 , 0.0 , 1.0 , 0.0 ,
0.0 , 0.0 , 0.0 , 1.0 } ;
static const D3DVERTEXELEMENT9 decl_elements [ ] = {
{ 0 , 0 , D3DDECLTYPE_FLOAT3 , D3DDECLMETHOD_DEFAULT , D3DDECLUSAGE_POSITION , 0 } ,
{ 0 , 12 , D3DDECLTYPE_FLOAT3 , D3DDECLMETHOD_DEFAULT , D3DDECLUSAGE_TEXCOORD , 0 } ,
D3DDECL_END ( )
} ;
static const D3DVERTEXELEMENT9 decl_elements2 [ ] = {
{ 0 , 0 , D3DDECLTYPE_FLOAT3 , D3DDECLMETHOD_DEFAULT , D3DDECLUSAGE_POSITION , 0 } ,
{ 0 , 12 , D3DDECLTYPE_FLOAT1 , D3DDECLMETHOD_DEFAULT , D3DDECLUSAGE_TEXCOORD , 0 } ,
D3DDECL_END ( )
} ;
2008-03-05 22:17:01 +00:00
static const D3DVERTEXELEMENT9 decl_elements3 [ ] = {
{ 0 , 0 , D3DDECLTYPE_FLOAT3 , D3DDECLMETHOD_DEFAULT , D3DDECLUSAGE_POSITION , 0 } ,
{ 0 , 12 , D3DDECLTYPE_FLOAT4 , D3DDECLMETHOD_DEFAULT , D3DDECLUSAGE_TEXCOORD , 0 } ,
D3DDECL_END ( )
} ;
static const unsigned char proj_texdata [ ] = { 0x00 , 0x00 , 0x00 , 0x00 ,
0x00 , 0xff , 0x00 , 0x00 ,
0x00 , 0x00 , 0x00 , 0x00 ,
0x00 , 0x00 , 0x00 , 0x00 } ;
2007-08-19 17:47:38 +00:00
memset ( & lr , 0 , sizeof ( lr ) ) ;
memset ( & lb , 0 , sizeof ( lb ) ) ;
IDirect3DDevice9_GetDirect3D ( device , & d3d ) ;
if ( IDirect3D9_CheckDeviceFormat ( d3d , 0 , D3DDEVTYPE_HAL , D3DFMT_X8R8G8B8 , 0 ,
D3DRTYPE_TEXTURE , D3DFMT_A16B16G16R16 ) = = D3D_OK ) {
fmt = D3DFMT_A16B16G16R16 ;
}
IDirect3D9_Release ( d3d ) ;
hr = IDirect3DDevice9_CreateVertexDeclaration ( device , decl_elements , & decl ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_CreateVertexDeclaration returned %08x \n " , hr ) ;
2007-08-19 17:47:38 +00:00
hr = IDirect3DDevice9_CreateVertexDeclaration ( device , decl_elements2 , & decl2 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_CreateVertexDeclaration returned %08x \n " , hr ) ;
2008-03-05 22:17:01 +00:00
hr = IDirect3DDevice9_CreateVertexDeclaration ( device , decl_elements3 , & decl3 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_CreateVertexDeclaration returned %08x \n " , hr ) ;
2007-08-19 17:47:38 +00:00
hr = IDirect3DDevice9_SetSamplerState ( device , 0 , D3DSAMP_SRGBTEXTURE , FALSE ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetSamplerState(D3DSAMP_SRGBTEXTURE) returned %08x \n " , hr ) ;
2007-08-19 17:47:38 +00:00
hr = IDirect3DDevice9_SetSamplerState ( device , 0 , D3DSAMP_MAGFILTER , D3DTEXF_POINT ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetSamplerState(D3DSAMP_MAGFILTER) returned %08x \n " , hr ) ;
2007-08-19 17:47:38 +00:00
hr = IDirect3DDevice9_SetSamplerState ( device , 0 , D3DSAMP_MINFILTER , D3DTEXF_POINT ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetSamplerState(D3DSAMP_MINFILTER) returned %08x \n " , hr ) ;
2007-08-19 17:47:38 +00:00
hr = IDirect3DDevice9_SetSamplerState ( device , 0 , D3DSAMP_MIPFILTER , D3DTEXF_NONE ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetSamplerState(D3DSAMP_MIPFILTER) returned %08x \n " , hr ) ;
2007-08-19 17:47:38 +00:00
hr = IDirect3DDevice9_SetSamplerState ( device , 0 , D3DSAMP_ADDRESSU , D3DTADDRESS_CLAMP ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetSamplerState(D3DSAMP_ADDRESSU) returned %08x \n " , hr ) ;
2007-08-19 17:47:38 +00:00
hr = IDirect3DDevice9_SetSamplerState ( device , 0 , D3DSAMP_ADDRESSV , D3DTADDRESS_CLAMP ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetSamplerState(D3DSAMP_ADDRESSV) returned %08x \n " , hr ) ;
2007-08-19 17:47:38 +00:00
hr = IDirect3DDevice9_SetSamplerState ( device , 0 , D3DSAMP_ADDRESSW , D3DTADDRESS_CLAMP ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetSamplerState(D3DSAMP_ADDRESSW) returned %08x \n " , hr ) ;
2007-08-19 17:47:38 +00:00
hr = IDirect3DDevice9_SetRenderState ( device , D3DRS_LIGHTING , FALSE ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetRenderState(D3DRS_LIGHTING) returned %08x \n " , hr ) ;
2007-08-19 17:47:38 +00:00
hr = IDirect3DDevice9_Clear ( device , 0 , NULL , D3DCLEAR_TARGET , 0xff0000ff , 0.0 , 0 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_Clear returned %08x \n " , hr ) ;
2007-08-19 17:47:38 +00:00
hr = IDirect3DDevice9_GetDeviceCaps ( device , & caps ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_GetDeviceCaps returned %08x \n " , hr ) ;
2008-10-06 17:09:53 +00:00
w = min ( 1024 , caps . MaxTextureWidth ) ;
h = min ( 1024 , caps . MaxTextureHeight ) ;
hr = IDirect3DDevice9_CreateTexture ( device , w , h , 1 ,
2007-08-19 17:47:38 +00:00
0 , fmt , D3DPOOL_MANAGED , & texture , NULL ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_CreateTexture returned %08x \n " , hr ) ;
2007-08-19 17:47:38 +00:00
if ( ! texture ) {
skip ( " Failed to create the test texture \n " ) ;
return ;
}
/* Unfortunately there is no easy way to set up a texture coordinate passthrough
* in d3d fixed function pipeline , so create a texture that has a gradient from 0.0 to
* 1.0 in red and green for the x and y coords
*/
hr = IDirect3DTexture9_LockRect ( texture , 0 , & lr , NULL , 0 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DTexture9_LockRect returned %08x \n " , hr ) ;
2008-10-06 17:09:53 +00:00
for ( y = 0 ; y < h ; y + + ) {
for ( x = 0 ; x < w ; x + + ) {
double r_f = ( double ) y / ( double ) h ;
double g_f = ( double ) x / ( double ) w ;
2007-08-19 17:47:38 +00:00
if ( fmt = = D3DFMT_A16B16G16R16 ) {
unsigned short r , g ;
unsigned short * dst = ( unsigned short * ) ( ( ( char * ) lr . pBits ) + y * lr . Pitch + x * 8 ) ;
r = ( unsigned short ) ( r_f * 65536.0 ) ;
g = ( unsigned short ) ( g_f * 65536.0 ) ;
dst [ 0 ] = r ;
dst [ 1 ] = g ;
dst [ 2 ] = 0 ;
dst [ 3 ] = 65535 ;
} else {
unsigned char * dst = ( ( unsigned char * ) lr . pBits ) + y * lr . Pitch + x * 4 ;
unsigned char r = ( unsigned char ) ( r_f * 255.0 ) ;
unsigned char g = ( unsigned char ) ( g_f * 255.0 ) ;
dst [ 0 ] = 0 ;
dst [ 1 ] = g ;
dst [ 2 ] = r ;
dst [ 3 ] = 255 ;
}
}
}
hr = IDirect3DTexture9_UnlockRect ( texture , 0 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DTexture9_UnlockRect returned %08x \n " , hr ) ;
2007-08-19 17:47:38 +00:00
hr = IDirect3DDevice9_SetTexture ( device , 0 , ( IDirect3DBaseTexture9 * ) texture ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetTexture returned %08x \n " , hr ) ;
2007-08-19 17:47:38 +00:00
hr = IDirect3DDevice9_SetFVF ( device , D3DFVF_XYZ | D3DFVF_TEX1 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetFVF failed with %08x \n " , hr ) ;
2007-08-19 17:47:38 +00:00
hr = IDirect3DDevice9_BeginScene ( device ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_BeginScene failed with %08x \n " , hr ) ;
2007-08-19 17:47:38 +00:00
if ( SUCCEEDED ( hr ) )
{
float quad1 [ ] = {
- 1.0 , - 1.0 , 0.1 , 1.0 , 1.0 ,
- 1.0 , 0.0 , 0.1 , 1.0 , 1.0 ,
0.0 , - 1.0 , 0.1 , 1.0 , 1.0 ,
0.0 , 0.0 , 0.1 , 1.0 , 1.0 ,
} ;
float quad2 [ ] = {
- 1.0 , 0.0 , 0.1 , 1.0 , 1.0 ,
- 1.0 , 1.0 , 0.1 , 1.0 , 1.0 ,
0.0 , 0.0 , 0.1 , 1.0 , 1.0 ,
0.0 , 1.0 , 0.1 , 1.0 , 1.0 ,
} ;
float quad3 [ ] = {
0.0 , 0.0 , 0.1 , 0.5 , 0.5 ,
0.0 , 1.0 , 0.1 , 0.5 , 0.5 ,
1.0 , 0.0 , 0.1 , 0.5 , 0.5 ,
1.0 , 1.0 , 0.1 , 0.5 , 0.5 ,
} ;
float quad4 [ ] = {
320 , 480 , 0.1 , 1.0 , 0.0 , 1.0 ,
320 , 240 , 0.1 , 1.0 , 0.0 , 1.0 ,
640 , 480 , 0.1 , 1.0 , 0.0 , 1.0 ,
640 , 240 , 0.1 , 1.0 , 0.0 , 1.0 ,
} ;
float mat [ 16 ] = { 0.0 , 0.0 , 0.0 , 0.0 ,
0.0 , 0.0 , 0.0 , 0.0 ,
0.0 , 0.0 , 0.0 , 0.0 ,
0.0 , 0.0 , 0.0 , 0.0 } ;
/* What happens with the texture matrix if D3DTSS_TEXTURETRANSFORMFLAGS is disabled? */
hr = IDirect3DDevice9_SetTransform ( device , D3DTS_TEXTURE0 , ( D3DMATRIX * ) & mat ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetTransform failed with %08x \n " , hr ) ;
2007-08-19 17:47:38 +00:00
hr = IDirect3DDevice9_DrawPrimitiveUP ( device , D3DPT_TRIANGLESTRIP , 2 , quad1 , 5 * sizeof ( float ) ) ;
ok ( SUCCEEDED ( hr ) , " DrawPrimitiveUP failed (%08x) \n " , hr ) ;
/* What happens with transforms enabled? */
IDirect3DDevice9_SetTextureStageState ( device , 0 , D3DTSS_TEXTURETRANSFORMFLAGS , D3DTTFF_COUNT2 ) ;
ok ( SUCCEEDED ( hr ) , " IDirect3DDevice9_SetTextureStageState failed (%08x) \n " , hr ) ;
hr = IDirect3DDevice9_DrawPrimitiveUP ( device , D3DPT_TRIANGLESTRIP , 2 , quad2 , 5 * sizeof ( float ) ) ;
ok ( SUCCEEDED ( hr ) , " DrawPrimitiveUP failed (%08x) \n " , hr ) ;
/* What happens if 4 coords are used, but only 2 given ?*/
mat [ 8 ] = 1.0 ;
mat [ 13 ] = 1.0 ;
hr = IDirect3DDevice9_SetTransform ( device , D3DTS_TEXTURE0 , ( D3DMATRIX * ) & mat ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetTransform failed with %08x \n " , hr ) ;
2007-08-19 17:47:38 +00:00
IDirect3DDevice9_SetTextureStageState ( device , 0 , D3DTSS_TEXTURETRANSFORMFLAGS , D3DTTFF_COUNT4 ) ;
ok ( SUCCEEDED ( hr ) , " IDirect3DDevice9_SetTextureStageState failed (%08x) \n " , hr ) ;
hr = IDirect3DDevice9_DrawPrimitiveUP ( device , D3DPT_TRIANGLESTRIP , 2 , quad3 , 5 * sizeof ( float ) ) ;
ok ( SUCCEEDED ( hr ) , " DrawPrimitiveUP failed (%08x) \n " , hr ) ;
/* What happens with transformed geometry? This setup lead to 0/0 coords with untransformed
* geometry . If the same applies to transformed vertices , the quad will be black , otherwise red ,
* due to the coords in the vertices . ( turns out red , indeed )
*/
memset ( mat , 0 , sizeof ( mat ) ) ;
hr = IDirect3DDevice9_SetTransform ( device , D3DTS_TEXTURE0 , ( D3DMATRIX * ) & mat ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetTransform failed with %08x \n " , hr ) ;
2007-08-19 17:47:38 +00:00
hr = IDirect3DDevice9_SetFVF ( device , D3DFVF_XYZRHW | D3DFVF_TEX1 ) ;
IDirect3DDevice9_SetTextureStageState ( device , 0 , D3DTSS_TEXTURETRANSFORMFLAGS , D3DTTFF_COUNT2 ) ;
ok ( SUCCEEDED ( hr ) , " IDirect3DDevice9_SetTextureStageState failed (%08x) \n " , hr ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetFVF failed with %08x \n " , hr ) ;
2007-08-19 17:47:38 +00:00
hr = IDirect3DDevice9_DrawPrimitiveUP ( device , D3DPT_TRIANGLESTRIP , 2 , quad4 , 6 * sizeof ( float ) ) ;
ok ( SUCCEEDED ( hr ) , " DrawPrimitiveUP failed (%08x) \n " , hr ) ;
hr = IDirect3DDevice9_EndScene ( device ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_EndScene failed with %08x \n " , hr ) ;
2007-08-19 17:47:38 +00:00
}
hr = IDirect3DDevice9_Present ( device , NULL , NULL , NULL , NULL ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_Present failed with %08x \n " , hr ) ;
2007-08-19 17:47:38 +00:00
color = getPixelColor ( device , 160 , 360 ) ;
ok ( color = = 0x00FFFF00 | | color = = 0x00FEFE00 , " quad 1 has color %08x, expected 0x00FFFF00 \n " , color ) ;
color = getPixelColor ( device , 160 , 120 ) ;
ok ( color = = 0x00000000 , " quad 2 has color %08x, expected 0x0000000 \n " , color ) ;
color = getPixelColor ( device , 480 , 120 ) ;
ok ( color = = 0x0000FF00 | | color = = 0x0000FE00 , " quad 3 has color %08x, expected 0x0000FF00 \n " , color ) ;
color = getPixelColor ( device , 480 , 360 ) ;
ok ( color = = 0x00FF0000 | | 0x00FE0000 , " quad 4 has color %08x, expected 0x00FF0000 \n " , color ) ;
hr = IDirect3DDevice9_Clear ( device , 0 , NULL , D3DCLEAR_TARGET , 0xff0000ff , 0.0 , 0 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_Clear returned %08x \n " , hr ) ;
2007-08-19 17:47:38 +00:00
hr = IDirect3DDevice9_SetFVF ( device , D3DFVF_XYZ | D3DFVF_TEX1 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetFVF failed with %08x \n " , hr ) ;
2007-08-19 17:47:38 +00:00
hr = IDirect3DDevice9_BeginScene ( device ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_BeginScene failed with %08x \n " , hr ) ;
2007-08-19 17:47:38 +00:00
if ( SUCCEEDED ( hr ) )
{
float quad1 [ ] = {
- 1.0 , - 1.0 , 0.1 , 0.8 , 0.2 ,
- 1.0 , 0.0 , 0.1 , 0.8 , 0.2 ,
0.0 , - 1.0 , 0.1 , 0.8 , 0.2 ,
0.0 , 0.0 , 0.1 , 0.8 , 0.2 ,
} ;
float quad2 [ ] = {
- 1.0 , 0.0 , 0.1 , 0.5 , 1.0 ,
- 1.0 , 1.0 , 0.1 , 0.5 , 1.0 ,
0.0 , 0.0 , 0.1 , 0.5 , 1.0 ,
0.0 , 1.0 , 0.1 , 0.5 , 1.0 ,
} ;
float quad3 [ ] = {
0.0 , 0.0 , 0.1 , 0.5 , 1.0 ,
0.0 , 1.0 , 0.1 , 0.5 , 1.0 ,
1.0 , 0.0 , 0.1 , 0.5 , 1.0 ,
1.0 , 1.0 , 0.1 , 0.5 , 1.0 ,
} ;
float quad4 [ ] = {
0.0 , - 1.0 , 0.1 , 0.8 , 0.2 ,
0.0 , 0.0 , 0.1 , 0.8 , 0.2 ,
1.0 , - 1.0 , 0.1 , 0.8 , 0.2 ,
1.0 , 0.0 , 0.1 , 0.8 , 0.2 ,
} ;
float mat [ 16 ] = { 0.0 , 0.0 , 0.0 , 0.0 ,
0.0 , 0.0 , 0.0 , 0.0 ,
0.0 , 1.0 , 0.0 , 0.0 ,
0.0 , 0.0 , 0.0 , 0.0 } ;
/* What happens to the default 1 in the 3rd coordinate if it is disabled?
*/
hr = IDirect3DDevice9_SetTransform ( device , D3DTS_TEXTURE0 , ( D3DMATRIX * ) & mat ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetTransform failed with %08x \n " , hr ) ;
2007-08-19 17:47:38 +00:00
IDirect3DDevice9_SetTextureStageState ( device , 0 , D3DTSS_TEXTURETRANSFORMFLAGS , D3DTTFF_COUNT2 ) ;
ok ( SUCCEEDED ( hr ) , " IDirect3DDevice9_SetTextureStageState failed (%08x) \n " , hr ) ;
hr = IDirect3DDevice9_DrawPrimitiveUP ( device , D3DPT_TRIANGLESTRIP , 2 , quad1 , 5 * sizeof ( float ) ) ;
ok ( SUCCEEDED ( hr ) , " DrawPrimitiveUP failed (%08x) \n " , hr ) ;
2008-02-01 00:52:17 +00:00
/* D3DTFF_COUNT1 does not work on Nvidia drivers. It behaves like D3DTTFF_DISABLE. On ATI drivers
* it behaves like COUNT2 because normal textures require 2 coords
*/
2007-08-19 17:47:38 +00:00
IDirect3DDevice9_SetTextureStageState ( device , 0 , D3DTSS_TEXTURETRANSFORMFLAGS , D3DTTFF_COUNT1 ) ;
ok ( SUCCEEDED ( hr ) , " IDirect3DDevice9_SetTextureStageState failed (%08x) \n " , hr ) ;
hr = IDirect3DDevice9_DrawPrimitiveUP ( device , D3DPT_TRIANGLESTRIP , 2 , quad4 , 5 * sizeof ( float ) ) ;
ok ( SUCCEEDED ( hr ) , " DrawPrimitiveUP failed (%08x) \n " , hr ) ;
/* Just to be sure, the same as quad2 above */
memset ( mat , 0 , sizeof ( mat ) ) ;
hr = IDirect3DDevice9_SetTransform ( device , D3DTS_TEXTURE0 , ( D3DMATRIX * ) & mat ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetTransform failed with %08x \n " , hr ) ;
2007-08-19 17:47:38 +00:00
IDirect3DDevice9_SetTextureStageState ( device , 0 , D3DTSS_TEXTURETRANSFORMFLAGS , D3DTTFF_COUNT2 ) ;
ok ( SUCCEEDED ( hr ) , " IDirect3DDevice9_SetTextureStageState failed (%08x) \n " , hr ) ;
hr = IDirect3DDevice9_DrawPrimitiveUP ( device , D3DPT_TRIANGLESTRIP , 2 , quad2 , 5 * sizeof ( float ) ) ;
ok ( SUCCEEDED ( hr ) , " DrawPrimitiveUP failed (%08x) \n " , hr ) ;
/* Now, what happens to the 2nd coordinate(that is disabled in the matrix) if it is not
* used ? And what happens to the first ?
*/
IDirect3DDevice9_SetTextureStageState ( device , 0 , D3DTSS_TEXTURETRANSFORMFLAGS , D3DTTFF_COUNT1 ) ;
ok ( SUCCEEDED ( hr ) , " IDirect3DDevice9_SetTextureStageState failed (%08x) \n " , hr ) ;
hr = IDirect3DDevice9_DrawPrimitiveUP ( device , D3DPT_TRIANGLESTRIP , 2 , quad3 , 5 * sizeof ( float ) ) ;
ok ( SUCCEEDED ( hr ) , " DrawPrimitiveUP failed (%08x) \n " , hr ) ;
hr = IDirect3DDevice9_EndScene ( device ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_EndScene failed with %08x \n " , hr ) ;
2007-08-19 17:47:38 +00:00
}
hr = IDirect3DDevice9_Present ( device , NULL , NULL , NULL , NULL ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_Present failed with %08x \n " , hr ) ;
2007-08-19 17:47:38 +00:00
color = getPixelColor ( device , 160 , 360 ) ;
ok ( color = = 0x00FF0000 | | color = = 0x00FE0000 , " quad 1 has color %08x, expected 0x00FF0000 \n " , color ) ;
color = getPixelColor ( device , 160 , 120 ) ;
ok ( color = = 0x00000000 , " quad 2 has color %08x, expected 0x0000000 \n " , color ) ;
color = getPixelColor ( device , 480 , 120 ) ;
2008-02-01 00:52:17 +00:00
ok ( color = = 0x00ff8000 | | color = = 0x00fe7f00 | | color = = 0x00000000 ,
" quad 3 has color %08x, expected 0x00ff8000 \n " , color ) ;
2007-08-19 17:47:38 +00:00
color = getPixelColor ( device , 480 , 360 ) ;
2008-02-01 00:52:17 +00:00
ok ( color = = 0x0033cc00 | | color = = 0x0032cb00 | | color = = 0x00FF0000 | | color = = 0x00FE0000 ,
" quad 4 has color %08x, expected 0x0033cc00 \n " , color ) ;
2007-08-19 17:47:38 +00:00
IDirect3DTexture9_Release ( texture ) ;
2008-03-05 22:17:01 +00:00
/* Test projected textures, without any fancy matrices */
hr = IDirect3DDevice9_Clear ( device , 0 , NULL , D3DCLEAR_TARGET , 0xff203040 , 0.0 , 0 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_Clear returned %08x \n " , hr ) ;
2008-03-05 22:17:01 +00:00
hr = IDirect3DDevice9_CreateTexture ( device , 4 , 4 , 1 , 0 , D3DFMT_L8 , D3DPOOL_MANAGED , & texture , NULL ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_CreateTexture returned %08x \n " , hr ) ;
2008-03-05 22:17:01 +00:00
hr = IDirect3DDevice9_SetTransform ( device , D3DTS_TEXTURE0 , ( D3DMATRIX * ) & identity ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetTransform failed with %08x \n " , hr ) ;
2008-03-05 22:17:01 +00:00
hr = IDirect3DDevice9_SetVertexDeclaration ( device , decl3 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetVertexDeclaration failed with %08x \n " , hr ) ;
2008-03-05 22:17:01 +00:00
hr = IDirect3DTexture9_LockRect ( texture , 0 , & lr , NULL , 0 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DTexture9_LockRect failed with %08x \n " , hr ) ;
2008-03-05 22:17:01 +00:00
for ( x = 0 ; x < 4 ; x + + ) {
memcpy ( ( ( BYTE * ) lr . pBits ) + lr . Pitch * x , proj_texdata + 4 * x , 4 * sizeof ( proj_texdata [ 0 ] ) ) ;
}
hr = IDirect3DTexture9_UnlockRect ( texture , 0 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DTexture9_UnlockRect failed with %08x \n " , hr ) ;
2008-03-05 22:17:01 +00:00
hr = IDirect3DDevice9_SetTexture ( device , 0 , ( IDirect3DBaseTexture9 * ) texture ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetTexture failed with %08x \n " , hr ) ;
2008-03-05 22:17:01 +00:00
hr = IDirect3DDevice9_BeginScene ( device ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_BeginScene failed with %08x \n " , hr ) ;
2008-03-05 22:17:01 +00:00
if ( SUCCEEDED ( hr ) )
{
const float proj_quads [ ] = {
- 1.0 , - 1.0 , 0.1 , 0.0 , 0.0 , 4.0 , 6.0 ,
1.0 , - 1.0 , 0.1 , 4.0 , 0.0 , 4.0 , 6.0 ,
- 1.0 , 0.0 , 0.1 , 0.0 , 4.0 , 4.0 , 6.0 ,
1.0 , 0.0 , 0.1 , 4.0 , 4.0 , 4.0 , 6.0 ,
- 1.0 , 0.0 , 0.1 , 0.0 , 0.0 , 4.0 , 6.0 ,
1.0 , 0.0 , 0.1 , 4.0 , 0.0 , 4.0 , 6.0 ,
- 1.0 , 1.0 , 0.1 , 0.0 , 4.0 , 4.0 , 6.0 ,
1.0 , 1.0 , 0.1 , 4.0 , 4.0 , 4.0 , 6.0 ,
} ;
IDirect3DDevice9_SetTextureStageState ( device , 0 , D3DTSS_TEXTURETRANSFORMFLAGS , D3DTTFF_COUNT4 | D3DTTFF_PROJECTED ) ;
ok ( SUCCEEDED ( hr ) , " IDirect3DDevice9_SetTextureStageState failed (%08x) \n " , hr ) ;
hr = IDirect3DDevice9_DrawPrimitiveUP ( device , D3DPT_TRIANGLESTRIP , 2 , & proj_quads [ 0 * 7 ] , 7 * sizeof ( float ) ) ;
ok ( SUCCEEDED ( hr ) , " DrawPrimitiveUP failed (%08x) \n " , hr ) ;
IDirect3DDevice9_SetTextureStageState ( device , 0 , D3DTSS_TEXTURETRANSFORMFLAGS , D3DTTFF_COUNT3 | D3DTTFF_PROJECTED ) ;
ok ( SUCCEEDED ( hr ) , " IDirect3DDevice9_SetTextureStageState failed (%08x) \n " , hr ) ;
hr = IDirect3DDevice9_DrawPrimitiveUP ( device , D3DPT_TRIANGLESTRIP , 2 , & proj_quads [ 4 * 7 ] , 7 * sizeof ( float ) ) ;
ok ( SUCCEEDED ( hr ) , " DrawPrimitiveUP failed (%08x) \n " , hr ) ;
hr = IDirect3DDevice9_EndScene ( device ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_EndScene failed with %08x \n " , hr ) ;
2008-03-05 22:17:01 +00:00
}
hr = IDirect3DDevice9_SetTexture ( device , 0 , NULL ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetTexture failed with %08x \n " , hr ) ;
2008-03-05 22:17:01 +00:00
IDirect3DTexture9_Release ( texture ) ;
hr = IDirect3DDevice9_Present ( device , NULL , NULL , NULL , NULL ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_Present failed with %08x \n " , hr ) ;
2008-03-05 22:17:01 +00:00
color = getPixelColor ( device , 158 , 118 ) ;
ok ( color = = 0x00000000 , " proj: Pixel 158/118 has color 0x%08x, expected 0x00000000 \n " , color ) ;
color = getPixelColor ( device , 162 , 118 ) ;
ok ( color = = 0x00000000 , " proj: Pixel 162/118 has color 0x%08x, expected 0x00000000 \n " , color ) ;
color = getPixelColor ( device , 158 , 122 ) ;
ok ( color = = 0x00000000 , " proj: Pixel 158/122 has color 0x%08x, expected 0x00000000 \n " , color ) ;
color = getPixelColor ( device , 162 , 122 ) ;
ok ( color = = 0x00FFFFFF , " proj: Pixel 162/122 has color 0x%08x, expected 0x00FFFFFF \n " , color ) ;
color = getPixelColor ( device , 158 , 178 ) ;
ok ( color = = 0x00000000 , " proj: Pixel 158/178 has color 0x%08x, expected 0x00000000 \n " , color ) ;
color = getPixelColor ( device , 162 , 178 ) ;
ok ( color = = 0x00FFFFFF , " proj: Pixel 158/178 has color 0x%08x, expected 0x00FFFFFF \n " , color ) ;
color = getPixelColor ( device , 158 , 182 ) ;
ok ( color = = 0x00000000 , " proj: Pixel 158/182 has color 0x%08x, expected 0x00000000 \n " , color ) ;
color = getPixelColor ( device , 162 , 182 ) ;
ok ( color = = 0x00000000 , " proj: Pixel 158/182 has color 0x%08x, expected 0x00000000 \n " , color ) ;
color = getPixelColor ( device , 318 , 118 ) ;
ok ( color = = 0x00000000 , " proj: Pixel 318/118 has color 0x%08x, expected 0x00000000 \n " , color ) ;
color = getPixelColor ( device , 322 , 118 ) ;
ok ( color = = 0x00000000 , " proj: Pixel 322/118 has color 0x%08x, expected 0x00000000 \n " , color ) ;
color = getPixelColor ( device , 318 , 122 ) ;
ok ( color = = 0x00FFFFFF , " proj: Pixel 318/122 has color 0x%08x, expected 0x00FFFFFF \n " , color ) ;
color = getPixelColor ( device , 322 , 122 ) ;
ok ( color = = 0x00000000 , " proj: Pixel 322/122 has color 0x%08x, expected 0x00000000 \n " , color ) ;
color = getPixelColor ( device , 318 , 178 ) ;
ok ( color = = 0x00FFFFFF , " proj: Pixel 318/178 has color 0x%08x, expected 0x00FFFFFF \n " , color ) ;
color = getPixelColor ( device , 322 , 178 ) ;
ok ( color = = 0x00000000 , " proj: Pixel 322/178 has color 0x%08x, expected 0x00000000 \n " , color ) ;
color = getPixelColor ( device , 318 , 182 ) ;
ok ( color = = 0x00000000 , " proj: Pixel 318/182 has color 0x%08x, expected 0x00000000 \n " , color ) ;
color = getPixelColor ( device , 322 , 182 ) ;
ok ( color = = 0x00000000 , " proj: Pixel 322/182 has color 0x%08x, expected 0x00000000 \n " , color ) ;
color = getPixelColor ( device , 238 , 298 ) ;
ok ( color = = 0x00000000 , " proj: Pixel 238/298 has color 0x%08x, expected 0x00000000 \n " , color ) ;
color = getPixelColor ( device , 242 , 298 ) ;
ok ( color = = 0x00000000 , " proj: Pixel 242/298 has color 0x%08x, expected 0x00000000 \n " , color ) ;
color = getPixelColor ( device , 238 , 302 ) ;
ok ( color = = 0x00000000 , " proj: Pixel 238/302 has color 0x%08x, expected 0x00000000 \n " , color ) ;
color = getPixelColor ( device , 242 , 302 ) ;
ok ( color = = 0x00FFFFFF , " proj: Pixel 242/302 has color 0x%08x, expected 0x00FFFFFF \n " , color ) ;
color = getPixelColor ( device , 238 , 388 ) ;
ok ( color = = 0x00000000 , " proj: Pixel 238/388 has color 0x%08x, expected 0x00000000 \n " , color ) ;
color = getPixelColor ( device , 242 , 388 ) ;
ok ( color = = 0x00FFFFFF , " proj: Pixel 242/388 has color 0x%08x, expected 0x00FFFFFF \n " , color ) ;
color = getPixelColor ( device , 238 , 392 ) ;
ok ( color = = 0x00000000 , " proj: Pixel 238/392 has color 0x%08x, expected 0x00000000 \n " , color ) ;
color = getPixelColor ( device , 242 , 392 ) ;
ok ( color = = 0x00000000 , " proj: Pixel 242/392 has color 0x%08x, expected 0x00000000 \n " , color ) ;
color = getPixelColor ( device , 478 , 298 ) ;
ok ( color = = 0x00000000 , " proj: Pixel 478/298 has color 0x%08x, expected 0x00000000 \n " , color ) ;
color = getPixelColor ( device , 482 , 298 ) ;
ok ( color = = 0x00000000 , " proj: Pixel 482/298 has color 0x%08x, expected 0x00000000 \n " , color ) ;
color = getPixelColor ( device , 478 , 302 ) ;
ok ( color = = 0x00FFFFFF , " proj: Pixel 478/302 has color 0x%08x, expected 0x00FFFFFF \n " , color ) ;
color = getPixelColor ( device , 482 , 302 ) ;
ok ( color = = 0x00000000 , " proj: Pixel 482/302 has color 0x%08x, expected 0x00000000 \n " , color ) ;
color = getPixelColor ( device , 478 , 388 ) ;
ok ( color = = 0x00FFFFFF , " proj: Pixel 478/388 has color 0x%08x, expected 0x00FFFFFF \n " , color ) ;
color = getPixelColor ( device , 482 , 388 ) ;
ok ( color = = 0x00000000 , " proj: Pixel 482/388 has color 0x%08x, expected 0x00000000 \n " , color ) ;
color = getPixelColor ( device , 478 , 392 ) ;
ok ( color = = 0x00000000 , " proj: Pixel 478/392 has color 0x%08x, expected 0x00000000 \n " , color ) ;
color = getPixelColor ( device , 482 , 392 ) ;
ok ( color = = 0x00000000 , " proj: Pixel 482/392 has color 0x%08x, expected 0x00000000 \n " , color ) ;
2007-08-19 17:47:38 +00:00
hr = IDirect3DDevice9_Clear ( device , 0 , NULL , D3DCLEAR_TARGET , 0xff203040 , 0.0 , 0 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_Clear returned %08x \n " , hr ) ;
2007-08-19 17:47:38 +00:00
/* Use a smaller volume texture than the biggest possible size for memory and performance reasons
* Thus watch out if sampling from texels between 0 and 1.
*/
hr = IDirect3DDevice9_CreateVolumeTexture ( device , 32 , 32 , 32 , 1 , 0 , fmt , D3DPOOL_MANAGED , & volume , 0 ) ;
ok ( hr = = D3D_OK | | hr = = D3DERR_INVALIDCALL ,
2008-07-08 15:48:50 +00:00
" IDirect3DDevice9_CreateVolumeTexture failed with %08x \n " , hr ) ;
2007-08-19 17:47:38 +00:00
if ( ! volume ) {
skip ( " Failed to create a volume texture \n " ) ;
goto out ;
}
hr = IDirect3DVolumeTexture9_LockBox ( volume , 0 , & lb , NULL , 0 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DVolumeTexture9_LockBox failed with %08x \n " , hr ) ;
2007-08-19 17:47:38 +00:00
for ( z = 0 ; z < 32 ; z + + ) {
for ( y = 0 ; y < 32 ; y + + ) {
for ( x = 0 ; x < 32 ; x + + ) {
char size = ( fmt = = D3DFMT_A16B16G16R16 ? 8 : 4 ) ;
void * mem = ( ( char * ) lb . pBits ) + y * lb . RowPitch + z * lb . SlicePitch + x * size ;
float r_f = ( float ) x / 31.0 ;
float g_f = ( float ) y / 31.0 ;
float b_f = ( float ) z / 31.0 ;
if ( fmt = = D3DFMT_A16B16G16R16 ) {
unsigned short * mem_s = mem ;
mem_s [ 0 ] = r_f * 65535.0 ;
mem_s [ 1 ] = g_f * 65535.0 ;
mem_s [ 2 ] = b_f * 65535.0 ;
mem_s [ 3 ] = 65535 ;
} else {
unsigned char * mem_c = mem ;
mem_c [ 0 ] = b_f * 255.0 ;
mem_c [ 1 ] = g_f * 255.0 ;
mem_c [ 2 ] = r_f * 255.0 ;
mem_c [ 3 ] = 255 ;
}
}
}
}
hr = IDirect3DVolumeTexture9_UnlockBox ( volume , 0 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DVolumeTexture9_UnlockBox failed with %08x \n " , hr ) ;
2007-08-19 17:47:38 +00:00
hr = IDirect3DDevice9_SetTexture ( device , 0 , ( IDirect3DBaseTexture9 * ) volume ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DVolumeTexture9_UnlockBox failed with %08x \n " , hr ) ;
2007-08-19 17:47:38 +00:00
hr = IDirect3DDevice9_BeginScene ( device ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_BeginScene failed with %08x \n " , hr ) ;
2007-08-19 17:47:38 +00:00
if ( SUCCEEDED ( hr ) )
{
float quad1 [ ] = {
- 1.0 , - 1.0 , 0.1 , 1.0 , 1.0 , 1.0 ,
- 1.0 , 0.0 , 0.1 , 1.0 , 1.0 , 1.0 ,
0.0 , - 1.0 , 0.1 , 1.0 , 1.0 , 1.0 ,
0.0 , 0.0 , 0.1 , 1.0 , 1.0 , 1.0
} ;
float quad2 [ ] = {
- 1.0 , 0.0 , 0.1 , 1.0 , 1.0 , 1.0 ,
- 1.0 , 1.0 , 0.1 , 1.0 , 1.0 , 1.0 ,
0.0 , 0.0 , 0.1 , 1.0 , 1.0 , 1.0 ,
0.0 , 1.0 , 0.1 , 1.0 , 1.0 , 1.0
} ;
float quad3 [ ] = {
0.0 , 0.0 , 0.1 , 0.0 , 0.0 ,
0.0 , 1.0 , 0.1 , 0.0 , 0.0 ,
1.0 , 0.0 , 0.1 , 0.0 , 0.0 ,
1.0 , 1.0 , 0.1 , 0.0 , 0.0
} ;
float quad4 [ ] = {
0.0 , - 1.0 , 0.1 , 1.0 , 1.0 , 1.0 ,
0.0 , 0.0 , 0.1 , 1.0 , 1.0 , 1.0 ,
1.0 , - 1.0 , 0.1 , 1.0 , 1.0 , 1.0 ,
1.0 , 0.0 , 0.1 , 1.0 , 1.0 , 1.0
} ;
float mat [ 16 ] = { 1.0 , 0.0 , 0.0 , 0.0 ,
2008-02-01 00:52:17 +00:00
0.0 , 0.0 , 1.0 , 0.0 ,
0.0 , 1.0 , 0.0 , 0.0 ,
0.0 , 0.0 , 0.0 , 1.0 } ;
2007-08-19 17:47:38 +00:00
hr = IDirect3DDevice9_SetVertexDeclaration ( device , decl ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetVertexDeclaration failed with %08x \n " , hr ) ;
2007-08-19 17:47:38 +00:00
/* Draw a quad with all 3 coords enabled. Nothing fancy. v and w are swapped, but have the same
* values
*/
hr = IDirect3DDevice9_SetTransform ( device , D3DTS_TEXTURE0 , ( D3DMATRIX * ) mat ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetTransform failed with %08x \n " , hr ) ;
2007-08-19 17:47:38 +00:00
IDirect3DDevice9_SetTextureStageState ( device , 0 , D3DTSS_TEXTURETRANSFORMFLAGS , D3DTTFF_COUNT3 ) ;
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetTextureStageState failed (%08x) \n " , hr ) ;
hr = IDirect3DDevice9_DrawPrimitiveUP ( device , D3DPT_TRIANGLESTRIP , 2 , quad1 , 6 * sizeof ( float ) ) ;
ok ( hr = = D3D_OK , " DrawPrimitiveUP failed (%08x) \n " , hr ) ;
/* Now disable the w coordinate. Does that change the input, or the output. The coordinates
* are swapped by the matrix . If it changes the input , the v coord will be missing ( green ) ,
* otherwise the w will be missing ( blue ) .
2008-02-01 00:52:17 +00:00
* turns out that on nvidia cards the blue color is missing , so it is an output modification .
* On ATI cards the COUNT2 is ignored , and it behaves in the same way as COUNT3 .
2007-08-19 17:47:38 +00:00
*/
IDirect3DDevice9_SetTextureStageState ( device , 0 , D3DTSS_TEXTURETRANSFORMFLAGS , D3DTTFF_COUNT2 ) ;
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetTextureStageState failed (%08x) \n " , hr ) ;
hr = IDirect3DDevice9_DrawPrimitiveUP ( device , D3DPT_TRIANGLESTRIP , 2 , quad2 , 6 * sizeof ( float ) ) ;
ok ( hr = = D3D_OK , " DrawPrimitiveUP failed (%08x) \n " , hr ) ;
/* default values? Set up the identity matrix, pass in 2 vertex coords, and enable 4 */
hr = IDirect3DDevice9_SetTransform ( device , D3DTS_TEXTURE0 , ( D3DMATRIX * ) identity ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetTransform failed with %08x \n " , hr ) ;
2007-08-19 17:47:38 +00:00
IDirect3DDevice9_SetTextureStageState ( device , 0 , D3DTSS_TEXTURETRANSFORMFLAGS , D3DTTFF_COUNT4 ) ;
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetTextureStageState failed (%08x) \n " , hr ) ;
hr = IDirect3DDevice9_SetFVF ( device , D3DFVF_XYZ | D3DFVF_TEX1 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetFVF failed with %08x \n " , hr ) ;
2007-08-19 17:47:38 +00:00
hr = IDirect3DDevice9_DrawPrimitiveUP ( device , D3DPT_TRIANGLESTRIP , 2 , quad3 , 5 * sizeof ( float ) ) ;
ok ( hr = = D3D_OK , " DrawPrimitiveUP failed (%08x) \n " , hr ) ;
2008-02-01 00:52:17 +00:00
/* D3DTTFF_COUNT1. Set a NULL matrix, and count1, pass in all values as 1.0. Nvidia has count1 ==
* disable . ATI extends it up to the amount of values needed for the volume texture
*/
2007-08-19 17:47:38 +00:00
memset ( mat , 0 , sizeof ( mat ) ) ;
hr = IDirect3DDevice9_SetTransform ( device , D3DTS_TEXTURE0 , ( D3DMATRIX * ) mat ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetTransform failed with %08x \n " , hr ) ;
2007-08-19 17:47:38 +00:00
IDirect3DDevice9_SetTextureStageState ( device , 0 , D3DTSS_TEXTURETRANSFORMFLAGS , D3DTTFF_COUNT1 ) ;
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetTextureStageState failed (%08x) \n " , hr ) ;
hr = IDirect3DDevice9_SetVertexDeclaration ( device , decl ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetVertexDeclaration failed with %08x \n " , hr ) ;
2007-08-19 17:47:38 +00:00
hr = IDirect3DDevice9_DrawPrimitiveUP ( device , D3DPT_TRIANGLESTRIP , 2 , quad4 , 6 * sizeof ( float ) ) ;
ok ( hr = = D3D_OK , " DrawPrimitiveUP failed (%08x) \n " , hr ) ;
hr = IDirect3DDevice9_EndScene ( device ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_EndScene failed with %08x \n " , hr ) ;
2007-08-19 17:47:38 +00:00
}
hr = IDirect3DDevice9_Present ( device , NULL , NULL , NULL , NULL ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_Present failed with %08x \n " , hr ) ;
2007-08-19 17:47:38 +00:00
color = getPixelColor ( device , 160 , 360 ) ;
ok ( color = = 0x00ffffff , " quad 1 has color %08x, expected 0x00ffffff \n " , color ) ;
color = getPixelColor ( device , 160 , 120 ) ;
2008-02-01 00:52:17 +00:00
ok ( color = = 0x00ffff00 /* NV*/ | | color = = 0x00ffffff /* ATI */ ,
" quad 2 has color %08x, expected 0x00ffff00 \n " , color ) ;
2007-08-19 17:47:38 +00:00
color = getPixelColor ( device , 480 , 120 ) ;
ok ( color = = 0x000000ff , " quad 3 has color %08x, expected 0x000000ff \n " , color ) ;
color = getPixelColor ( device , 480 , 360 ) ;
2008-02-01 00:52:17 +00:00
ok ( color = = 0x00ffffff | | color = = 0x0000ff00 , " quad 4 has color %08x, expected 0x00ffffff \n " , color ) ;
2007-08-19 17:47:38 +00:00
hr = IDirect3DDevice9_Clear ( device , 0 , NULL , D3DCLEAR_TARGET , 0xff303030 , 0.0 , 0 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_Clear returned %08x \n " , hr ) ;
2007-08-19 17:47:38 +00:00
hr = IDirect3DDevice9_BeginScene ( device ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_BeginScene failed with %08x \n " , hr ) ;
2007-08-19 17:47:38 +00:00
if ( SUCCEEDED ( hr ) )
{
float quad1 [ ] = {
- 1.0 , - 1.0 , 0.1 , 1.0 , 1.0 , 1.0 ,
- 1.0 , 0.0 , 0.1 , 1.0 , 1.0 , 1.0 ,
0.0 , - 1.0 , 0.1 , 1.0 , 1.0 , 1.0 ,
0.0 , 0.0 , 0.1 , 1.0 , 1.0 , 1.0
} ;
float quad2 [ ] = {
- 1.0 , 0.0 , 0.1 ,
- 1.0 , 1.0 , 0.1 ,
0.0 , 0.0 , 0.1 ,
0.0 , 1.0 , 0.1 ,
} ;
float quad3 [ ] = {
0.0 , 0.0 , 0.1 , 1.0 ,
0.0 , 1.0 , 0.1 , 1.0 ,
1.0 , 0.0 , 0.1 , 1.0 ,
1.0 , 1.0 , 0.1 , 1.0
} ;
float mat [ 16 ] = { 0.0 , 0.0 , 0.0 , 0.0 ,
0.0 , 0.0 , 0.0 , 0.0 ,
0.0 , 0.0 , 0.0 , 0.0 ,
0.0 , 1.0 , 0.0 , 0.0 } ;
float mat2 [ 16 ] = { 0.0 , 0.0 , 0.0 , 1.0 ,
1.0 , 0.0 , 0.0 , 0.0 ,
0.0 , 1.0 , 0.0 , 0.0 ,
0.0 , 0.0 , 1.0 , 0.0 } ;
hr = IDirect3DDevice9_SetVertexDeclaration ( device , decl ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetVertexDeclaration failed with %08x \n " , hr ) ;
2007-08-19 17:47:38 +00:00
/* Default values? 4 coords used, 3 passed. What happens to the 4th?
*/
hr = IDirect3DDevice9_SetTransform ( device , D3DTS_TEXTURE0 , ( D3DMATRIX * ) mat ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetTransform failed with %08x \n " , hr ) ;
2007-08-19 17:47:38 +00:00
IDirect3DDevice9_SetTextureStageState ( device , 0 , D3DTSS_TEXTURETRANSFORMFLAGS , D3DTTFF_COUNT4 ) ;
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetTextureStageState failed (%08x) \n " , hr ) ;
hr = IDirect3DDevice9_DrawPrimitiveUP ( device , D3DPT_TRIANGLESTRIP , 2 , quad1 , 6 * sizeof ( float ) ) ;
ok ( hr = = D3D_OK , " DrawPrimitiveUP failed (%08x) \n " , hr ) ;
/* None passed */
hr = IDirect3DDevice9_SetTransform ( device , D3DTS_TEXTURE0 , ( D3DMATRIX * ) identity ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetTransform failed with %08x \n " , hr ) ;
2007-08-19 17:47:38 +00:00
hr = IDirect3DDevice9_SetFVF ( device , D3DFVF_XYZ ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetFVF failed with %08x \n " , hr ) ;
2007-08-19 17:47:38 +00:00
hr = IDirect3DDevice9_DrawPrimitiveUP ( device , D3DPT_TRIANGLESTRIP , 2 , quad2 , 3 * sizeof ( float ) ) ;
ok ( hr = = D3D_OK , " DrawPrimitiveUP failed (%08x) \n " , hr ) ;
/* 4 used, 1 passed */
hr = IDirect3DDevice9_SetVertexDeclaration ( device , decl2 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetVertexDeclaration failed with %08x \n " , hr ) ;
2007-08-19 17:47:38 +00:00
hr = IDirect3DDevice9_SetTransform ( device , D3DTS_TEXTURE0 , ( D3DMATRIX * ) mat2 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetTransform failed with %08x \n " , hr ) ;
2007-08-19 17:47:38 +00:00
hr = IDirect3DDevice9_DrawPrimitiveUP ( device , D3DPT_TRIANGLESTRIP , 2 , quad3 , 4 * sizeof ( float ) ) ;
ok ( hr = = D3D_OK , " DrawPrimitiveUP failed (%08x) \n " , hr ) ;
hr = IDirect3DDevice9_EndScene ( device ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_EndScene failed with %08x \n " , hr ) ;
2007-08-19 17:47:38 +00:00
}
hr = IDirect3DDevice9_Present ( device , NULL , NULL , NULL , NULL ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_Present failed with %08x \n " , hr ) ;
2007-08-19 17:47:38 +00:00
color = getPixelColor ( device , 160 , 360 ) ;
ok ( color = = 0x0000ff00 , " quad 1 has color %08x, expected 0x0000ff00 \n " , color ) ;
color = getPixelColor ( device , 160 , 120 ) ;
ok ( color = = 0x00000000 , " quad 2 has color %08x, expected 0x00000000 \n " , color ) ;
color = getPixelColor ( device , 480 , 120 ) ;
ok ( color = = 0x00ff0000 , " quad 3 has color %08x, expected 0x00ff0000 \n " , color ) ;
/* Quad4: unused */
IDirect3DVolumeTexture9_Release ( volume ) ;
out :
hr = IDirect3DDevice9_SetVertexDeclaration ( device , NULL ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetVertexDeclaration failed with %08x \n " , hr ) ;
2007-08-19 17:47:38 +00:00
IDirect3DDevice9_SetTextureStageState ( device , 0 , D3DTSS_TEXTURETRANSFORMFLAGS , D3DTTFF_DISABLE ) ;
ok ( SUCCEEDED ( hr ) , " IDirect3DDevice9_SetTextureStageState failed (%08x) \n " , hr ) ;
hr = IDirect3DDevice9_SetTransform ( device , D3DTS_TEXTURE0 , ( D3DMATRIX * ) & identity ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetTransform failed with %08x \n " , hr ) ;
2007-08-19 17:47:38 +00:00
hr = IDirect3DDevice9_SetTexture ( device , 0 , NULL ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetTexture returned %08x \n " , hr ) ;
2007-08-19 17:47:38 +00:00
IDirect3DVertexDeclaration9_Release ( decl ) ;
IDirect3DVertexDeclaration9_Release ( decl2 ) ;
2008-03-05 22:17:01 +00:00
IDirect3DVertexDeclaration9_Release ( decl3 ) ;
2007-08-19 17:47:38 +00:00
}
2007-08-31 15:00:16 +00:00
static void texdepth_test ( IDirect3DDevice9 * device )
{
IDirect3DPixelShader9 * shader ;
HRESULT hr ;
const float texdepth_test_data1 [ ] = { 0.25 , 2.0 , 0.0 , 0.0 } ;
const float texdepth_test_data2 [ ] = { 0.25 , 0.5 , 0.0 , 0.0 } ;
const float texdepth_test_data3 [ ] = { - 1.00 , 0.1 , 0.0 , 0.0 } ;
const float texdepth_test_data4 [ ] = { - 0.25 , - 0.5 , 0.0 , 0.0 } ;
const float texdepth_test_data5 [ ] = { 1.00 , - 0.1 , 0.0 , 0.0 } ;
const float texdepth_test_data6 [ ] = { 1.00 , 0.5 , 0.0 , 0.0 } ;
const float texdepth_test_data7 [ ] = { 0.50 , 0.0 , 0.0 , 0.0 } ;
DWORD shader_code [ ] = {
0xffff0104 , /* ps_1_4 */
0x00000051 , 0xa00f0001 , 0x00000000 , 0x00000000 , 0x3f800000 , 0x3f800000 , /* def c1, 0, 0, 1, 1 */
0x00000001 , 0x800f0005 , 0xa0e40000 , /* mov r5, c0 */
0x0000fffd , /* phase */
0x00000057 , 0x800f0005 , /* texdepth r5 */
0x00000001 , 0x800f0000 , 0xa0e40001 , /* mov r0, c1 */
0x0000ffff /* end */
} ;
DWORD color ;
float vertex [ ] = {
- 1.0 , - 1.0 , 0.0 ,
1.0 , - 1.0 , 1.0 ,
- 1.0 , 1.0 , 0.0 ,
1.0 , 1.0 , 1.0
} ;
hr = IDirect3DDevice9_CreatePixelShader ( device , shader_code , & shader ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_CreatePixelShader returned %08x \n " , hr ) ;
2007-08-31 15:00:16 +00:00
hr = IDirect3DDevice9_Clear ( device , 0 , NULL , D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER , 0xffffff00 , 0.0 , 0 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_Clear returned %08x \n " , hr ) ;
2007-08-31 15:00:16 +00:00
hr = IDirect3DDevice9_SetRenderState ( device , D3DRS_ZENABLE , D3DZB_TRUE ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetRenderState returned %08x \n " , hr ) ;
2007-08-31 15:00:16 +00:00
hr = IDirect3DDevice9_SetRenderState ( device , D3DRS_ZWRITEENABLE , TRUE ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetRenderState returned %08x \n " , hr ) ;
2007-08-31 15:00:16 +00:00
hr = IDirect3DDevice9_SetRenderState ( device , D3DRS_ZFUNC , D3DCMP_ALWAYS ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetRenderState returned %08x \n " , hr ) ;
2007-08-31 15:00:16 +00:00
hr = IDirect3DDevice9_SetFVF ( device , D3DFVF_XYZ ) ;
/* Fill the depth buffer with a gradient */
hr = IDirect3DDevice9_BeginScene ( device ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_BeginScene returned %08x \n " , hr ) ;
2007-08-31 15:00:16 +00:00
if ( SUCCEEDED ( hr ) )
{
hr = IDirect3DDevice9_DrawPrimitiveUP ( device , D3DPT_TRIANGLESTRIP , 2 , vertex , 3 * sizeof ( float ) ) ;
ok ( hr = = D3D_OK , " DrawPrimitiveUP failed (%08x) \n " , hr ) ;
hr = IDirect3DDevice9_EndScene ( device ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_EndScene returned %08x \n " , hr ) ;
2007-08-31 15:00:16 +00:00
}
/* Now perform the actual tests. Same geometry, but with the shader */
hr = IDirect3DDevice9_SetRenderState ( device , D3DRS_ZFUNC , D3DCMP_GREATER ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetRenderState returned %08x \n " , hr ) ;
2007-08-31 15:00:16 +00:00
hr = IDirect3DDevice9_SetRenderState ( device , D3DRS_ZWRITEENABLE , FALSE ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetRenderState returned %08x \n " , hr ) ;
2007-08-31 15:00:16 +00:00
hr = IDirect3DDevice9_SetPixelShader ( device , shader ) ;
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetPixelShader failed (%08x) \n " , hr ) ;
hr = IDirect3DDevice9_SetPixelShaderConstantF ( device , 0 , texdepth_test_data1 , 1 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetPixelShaderConstantF returned %08x \n " , hr ) ;
2007-08-31 15:00:16 +00:00
hr = IDirect3DDevice9_BeginScene ( device ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_BeginScene returned %08x \n " , hr ) ;
2007-08-31 15:00:16 +00:00
if ( SUCCEEDED ( hr ) )
{
hr = IDirect3DDevice9_DrawPrimitiveUP ( device , D3DPT_TRIANGLESTRIP , 2 , vertex , 3 * sizeof ( float ) ) ;
ok ( hr = = D3D_OK , " DrawPrimitiveUP failed (%08x) \n " , hr ) ;
hr = IDirect3DDevice9_EndScene ( device ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_EndScene returned %08x \n " , hr ) ;
2007-08-31 15:00:16 +00:00
}
hr = IDirect3DDevice9_Present ( device , NULL , NULL , NULL , NULL ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_Present failed with %08x \n " , hr ) ;
2007-08-31 15:00:16 +00:00
color = getPixelColor ( device , 158 , 240 ) ;
ok ( color = = 0x000000ff , " Pixel 158(25%% - 2 pixel) has color %08x, expected 0x000000ff \n " , color ) ;
color = getPixelColor ( device , 162 , 240 ) ;
ok ( color = = 0x00ffffff , " Pixel 158(25%% + 2 pixel) has color %08x, expected 0x00ffffff \n " , color ) ;
hr = IDirect3DDevice9_Clear ( device , 0 , NULL , D3DCLEAR_TARGET , 0xffffff00 , 0.0 , 0 ) ;
hr = IDirect3DDevice9_SetPixelShaderConstantF ( device , 0 , texdepth_test_data2 , 1 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetPixelShaderConstantF returned %08x \n " , hr ) ;
2007-08-31 15:00:16 +00:00
hr = IDirect3DDevice9_BeginScene ( device ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_BeginScene returned %08x \n " , hr ) ;
2007-08-31 15:00:16 +00:00
if ( SUCCEEDED ( hr ) )
{
hr = IDirect3DDevice9_DrawPrimitiveUP ( device , D3DPT_TRIANGLESTRIP , 2 , vertex , 3 * sizeof ( float ) ) ;
ok ( hr = = D3D_OK , " DrawPrimitiveUP failed (%08x) \n " , hr ) ;
hr = IDirect3DDevice9_EndScene ( device ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_EndScene returned %08x \n " , hr ) ;
2007-08-31 15:00:16 +00:00
}
hr = IDirect3DDevice9_Present ( device , NULL , NULL , NULL , NULL ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_Present failed with %08x \n " , hr ) ;
2007-08-31 15:00:16 +00:00
color = getPixelColor ( device , 318 , 240 ) ;
ok ( color = = 0x000000ff , " Pixel 318(50%% - 2 pixel) has color %08x, expected 0x000000ff \n " , color ) ;
color = getPixelColor ( device , 322 , 240 ) ;
ok ( color = = 0x00ffff00 , " Pixel 322(50%% + 2 pixel) has color %08x, expected 0x00ffff00 \n " , color ) ;
hr = IDirect3DDevice9_Clear ( device , 0 , NULL , D3DCLEAR_TARGET , 0xffff0000 , 0.0 , 0 ) ;
hr = IDirect3DDevice9_SetPixelShaderConstantF ( device , 0 , texdepth_test_data3 , 1 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetPixelShaderConstantF returned %08x \n " , hr ) ;
2007-08-31 15:00:16 +00:00
hr = IDirect3DDevice9_BeginScene ( device ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_BeginScene returned %08x \n " , hr ) ;
2007-08-31 15:00:16 +00:00
if ( SUCCEEDED ( hr ) )
{
hr = IDirect3DDevice9_DrawPrimitiveUP ( device , D3DPT_TRIANGLESTRIP , 2 , vertex , 3 * sizeof ( float ) ) ;
ok ( hr = = D3D_OK , " DrawPrimitiveUP failed (%08x) \n " , hr ) ;
hr = IDirect3DDevice9_EndScene ( device ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_EndScene returned %08x \n " , hr ) ;
2007-08-31 15:00:16 +00:00
}
hr = IDirect3DDevice9_Present ( device , NULL , NULL , NULL , NULL ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_Present failed with %08x \n " , hr ) ;
2007-08-31 15:00:16 +00:00
color = getPixelColor ( device , 1 , 240 ) ;
ok ( color = = 0x00ff0000 , " Pixel 1(0%% + 2 pixel) has color %08x, expected 0x00ff0000 \n " , color ) ;
hr = IDirect3DDevice9_Clear ( device , 0 , NULL , D3DCLEAR_TARGET , 0xff00ff00 , 0.0 , 0 ) ;
hr = IDirect3DDevice9_SetPixelShaderConstantF ( device , 0 , texdepth_test_data4 , 1 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetPixelShaderConstantF returned %08x \n " , hr ) ;
2007-08-31 15:00:16 +00:00
hr = IDirect3DDevice9_BeginScene ( device ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_BeginScene returned %08x \n " , hr ) ;
2007-08-31 15:00:16 +00:00
if ( SUCCEEDED ( hr ) )
{
hr = IDirect3DDevice9_DrawPrimitiveUP ( device , D3DPT_TRIANGLESTRIP , 2 , vertex , 3 * sizeof ( float ) ) ;
ok ( hr = = D3D_OK , " DrawPrimitiveUP failed (%08x) \n " , hr ) ;
hr = IDirect3DDevice9_EndScene ( device ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_EndScene returned %08x \n " , hr ) ;
2007-08-31 15:00:16 +00:00
}
hr = IDirect3DDevice9_Present ( device , NULL , NULL , NULL , NULL ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_Present failed with %08x \n " , hr ) ;
2007-08-31 15:00:16 +00:00
color = getPixelColor ( device , 318 , 240 ) ;
ok ( color = = 0x000000ff , " Pixel 318(50%% - 2 pixel) has color %08x, expected 0x000000ff \n " , color ) ;
color = getPixelColor ( device , 322 , 240 ) ;
ok ( color = = 0x0000ff00 , " Pixel 322(50%% + 2 pixel) has color %08x, expected 0x0000ff00 \n " , color ) ;
hr = IDirect3DDevice9_Clear ( device , 0 , NULL , D3DCLEAR_TARGET , 0xffffff00 , 0.0 , 0 ) ;
hr = IDirect3DDevice9_SetPixelShaderConstantF ( device , 0 , texdepth_test_data5 , 1 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetPixelShaderConstantF returned %08x \n " , hr ) ;
2007-08-31 15:00:16 +00:00
hr = IDirect3DDevice9_BeginScene ( device ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_BeginScene returned %08x \n " , hr ) ;
2007-08-31 15:00:16 +00:00
if ( SUCCEEDED ( hr ) )
{
hr = IDirect3DDevice9_DrawPrimitiveUP ( device , D3DPT_TRIANGLESTRIP , 2 , vertex , 3 * sizeof ( float ) ) ;
ok ( hr = = D3D_OK , " DrawPrimitiveUP failed (%08x) \n " , hr ) ;
hr = IDirect3DDevice9_EndScene ( device ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_EndScene returned %08x \n " , hr ) ;
2007-08-31 15:00:16 +00:00
}
hr = IDirect3DDevice9_Present ( device , NULL , NULL , NULL , NULL ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_Present failed with %08x \n " , hr ) ;
2007-08-31 15:00:16 +00:00
color = getPixelColor ( device , 1 , 240 ) ;
ok ( color = = 0x00ffff00 , " Pixel 1(0%% + 2 pixel) has color %08x, expected 0x00ffff00 \n " , color ) ;
hr = IDirect3DDevice9_Clear ( device , 0 , NULL , D3DCLEAR_TARGET , 0xff00ff00 , 0.0 , 0 ) ;
hr = IDirect3DDevice9_SetPixelShaderConstantF ( device , 0 , texdepth_test_data6 , 1 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetPixelShaderConstantF returned %08x \n " , hr ) ;
2007-08-31 15:00:16 +00:00
hr = IDirect3DDevice9_BeginScene ( device ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_BeginScene returned %08x \n " , hr ) ;
2007-08-31 15:00:16 +00:00
if ( SUCCEEDED ( hr ) )
{
hr = IDirect3DDevice9_DrawPrimitiveUP ( device , D3DPT_TRIANGLESTRIP , 2 , vertex , 3 * sizeof ( float ) ) ;
ok ( hr = = D3D_OK , " DrawPrimitiveUP failed (%08x) \n " , hr ) ;
hr = IDirect3DDevice9_EndScene ( device ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_EndScene returned %08x \n " , hr ) ;
2007-08-31 15:00:16 +00:00
}
hr = IDirect3DDevice9_Present ( device , NULL , NULL , NULL , NULL ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_Present failed with %08x \n " , hr ) ;
2007-08-31 15:00:16 +00:00
color = getPixelColor ( device , 638 , 240 ) ;
ok ( color = = 0x000000ff , " Pixel 638(100%% + 2 pixel) has color %08x, expected 0x000000ff \n " , color ) ;
hr = IDirect3DDevice9_Clear ( device , 0 , NULL , D3DCLEAR_TARGET , 0xffff0000 , 0.0 , 0 ) ;
hr = IDirect3DDevice9_SetPixelShaderConstantF ( device , 0 , texdepth_test_data7 , 1 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetPixelShaderConstantF returned %08x \n " , hr ) ;
2007-08-31 15:00:16 +00:00
hr = IDirect3DDevice9_BeginScene ( device ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_BeginScene returned %08x \n " , hr ) ;
2007-08-31 15:00:16 +00:00
if ( SUCCEEDED ( hr ) )
{
hr = IDirect3DDevice9_DrawPrimitiveUP ( device , D3DPT_TRIANGLESTRIP , 2 , vertex , 3 * sizeof ( float ) ) ;
ok ( hr = = D3D_OK , " DrawPrimitiveUP failed (%08x) \n " , hr ) ;
hr = IDirect3DDevice9_EndScene ( device ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_EndScene returned %08x \n " , hr ) ;
2007-08-31 15:00:16 +00:00
}
hr = IDirect3DDevice9_Present ( device , NULL , NULL , NULL , NULL ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_Present failed with %08x \n " , hr ) ;
2007-08-31 15:00:16 +00:00
color = getPixelColor ( device , 638 , 240 ) ;
ok ( color = = 0x000000ff , " Pixel 638(100%% + 2 pixel) has color %08x, expected 0x000000ff \n " , color ) ;
2007-10-10 16:35:54 +00:00
/* Cleanup */
2007-08-31 15:00:16 +00:00
hr = IDirect3DDevice9_SetPixelShader ( device , NULL ) ;
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetPixelShader failed (%08x) \n " , hr ) ;
2007-10-10 16:35:54 +00:00
IDirect3DPixelShader9_Release ( shader ) ;
2007-08-31 15:00:16 +00:00
hr = IDirect3DDevice9_SetRenderState ( device , D3DRS_ZENABLE , D3DZB_FALSE ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetRenderState returned %08x \n " , hr ) ;
2007-08-31 15:00:16 +00:00
hr = IDirect3DDevice9_SetRenderState ( device , D3DRS_ZWRITEENABLE , TRUE ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetRenderState returned %08x \n " , hr ) ;
2007-08-31 15:00:16 +00:00
}
2007-08-30 21:35:50 +00:00
static void texkill_test ( IDirect3DDevice9 * device )
{
IDirect3DPixelShader9 * shader ;
HRESULT hr ;
DWORD color ;
const float vertex [ ] = {
/* bottom top right left */
- 1.0 , - 1.0 , 1.0 , - 0.1 , 0.9 , 0.9 , - 0.1 ,
1.0 , - 1.0 , 0.0 , 0.9 , - 0.1 , 0.9 , - 0.1 ,
- 1.0 , 1.0 , 1.0 , - 0.1 , 0.9 , - 0.1 , 0.9 ,
1.0 , 1.0 , 0.0 , 0.9 , - 0.1 , - 0.1 , 0.9 ,
} ;
DWORD shader_code_11 [ ] = {
0xffff0101 , /* ps_1_1 */
0x00000051 , 0xa00f0000 , 0x3f800000 , 0x00000000 , 0x00000000 , 0x3f800000 , /* def c0, 1.0, 0.0, 0.0, 1.0 */
0x00000041 , 0xb00f0000 , /* texkill t0 */
0x00000001 , 0x800f0000 , 0xa0e40000 , /* mov r0, c0 */
0x0000ffff /* end */
} ;
DWORD shader_code_20 [ ] = {
0xffff0200 , /* ps_2_0 */
0x0200001f , 0x80000000 , 0xb00f0000 , /* dcl t0 */
0x05000051 , 0xa00f0000 , 0x00000000 , 0x00000000 , 0x3f800000 , 0x3f800000 , /* def c0, 0.0, 0.0, 1.0, 1.0 */
0x01000041 , 0xb00f0000 , /* texkill t0 */
0x02000001 , 0x800f0800 , 0xa0e40000 , /* mov oC0, c0 */
0x0000ffff /* end */
} ;
hr = IDirect3DDevice9_Clear ( device , 0 , NULL , D3DCLEAR_TARGET , 0xff00ff00 , 0.0 , 0 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_CreatePixelShader returned %08x \n " , hr ) ;
2007-08-30 21:35:50 +00:00
hr = IDirect3DDevice9_CreatePixelShader ( device , shader_code_11 , & shader ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_CreatePixelShader returned %08x \n " , hr ) ;
2007-08-30 21:35:50 +00:00
hr = IDirect3DDevice9_SetPixelShader ( device , shader ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetPixelShader returned %08x \n " , hr ) ;
2007-08-30 21:35:50 +00:00
hr = IDirect3DDevice9_BeginScene ( device ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_BeginScene returned %08x \n " , hr ) ;
2007-08-30 21:35:50 +00:00
if ( SUCCEEDED ( hr ) )
{
hr = IDirect3DDevice9_SetFVF ( device , D3DFVF_XYZ | D3DFVF_TEXCOORDSIZE4 ( 0 ) | D3DFVF_TEX1 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetFVF returned %08x \n " , hr ) ;
2007-08-30 21:35:50 +00:00
hr = IDirect3DDevice9_DrawPrimitiveUP ( device , D3DPT_TRIANGLESTRIP , 2 , vertex , 7 * sizeof ( float ) ) ;
ok ( hr = = D3D_OK , " DrawPrimitiveUP failed (%08x) \n " , hr ) ;
hr = IDirect3DDevice9_EndScene ( device ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_EndScene returned %08x \n " , hr ) ;
2007-08-30 21:35:50 +00:00
}
hr = IDirect3DDevice9_Present ( device , NULL , NULL , NULL , NULL ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_Present failed with %08x \n " , hr ) ;
2007-08-30 21:35:50 +00:00
color = getPixelColor ( device , 63 , 46 ) ;
ok ( color = = 0x0000ff00 , " Pixel 63/46 has color %08x, expected 0x0000ff00 \n " , color ) ;
color = getPixelColor ( device , 66 , 46 ) ;
ok ( color = = 0x0000ff00 , " Pixel 66/64 has color %08x, expected 0x0000ff00 \n " , color ) ;
color = getPixelColor ( device , 63 , 49 ) ;
ok ( color = = 0x0000ff00 , " Pixel 63/49 has color %08x, expected 0x0000ff00 \n " , color ) ;
color = getPixelColor ( device , 66 , 49 ) ;
ok ( color = = 0x00ff0000 , " Pixel 66/49 has color %08x, expected 0x00ff0000 \n " , color ) ;
color = getPixelColor ( device , 578 , 46 ) ;
ok ( color = = 0x0000ff00 , " Pixel 578/46 has color %08x, expected 0x0000ff00 \n " , color ) ;
color = getPixelColor ( device , 575 , 46 ) ;
ok ( color = = 0x0000ff00 , " Pixel 575/64 has color %08x, expected 0x0000ff00 \n " , color ) ;
color = getPixelColor ( device , 578 , 49 ) ;
ok ( color = = 0x0000ff00 , " Pixel 578/49 has color %08x, expected 0x0000ff00 \n " , color ) ;
color = getPixelColor ( device , 575 , 49 ) ;
ok ( color = = 0x00ff0000 , " Pixel 575/49 has color %08x, expected 0x00ff0000 \n " , color ) ;
color = getPixelColor ( device , 63 , 430 ) ;
ok ( color = = 0x0000ff00 , " Pixel 578/46 has color %08x, expected 0x0000ff00 \n " , color ) ;
color = getPixelColor ( device , 63 , 433 ) ;
ok ( color = = 0x0000ff00 , " Pixel 575/64 has color %08x, expected 0x0000ff00 \n " , color ) ;
color = getPixelColor ( device , 66 , 433 ) ;
ok ( color = = 0x00ff0000 , " Pixel 578/49 has color %08x, expected 0x00ff0000 \n " , color ) ;
color = getPixelColor ( device , 66 , 430 ) ;
ok ( color = = 0x00ff0000 , " Pixel 575/49 has color %08x, expected 0x00ff0000 \n " , color ) ;
color = getPixelColor ( device , 578 , 430 ) ;
ok ( color = = 0x0000ff00 , " Pixel 578/46 has color %08x, expected 0x0000ff00 \n " , color ) ;
color = getPixelColor ( device , 578 , 433 ) ;
ok ( color = = 0x0000ff00 , " Pixel 575/64 has color %08x, expected 0x0000ff00 \n " , color ) ;
color = getPixelColor ( device , 575 , 433 ) ;
ok ( color = = 0x00ff0000 , " Pixel 578/49 has color %08x, expected 0x00ff0000 \n " , color ) ;
color = getPixelColor ( device , 575 , 430 ) ;
ok ( color = = 0x00ff0000 , " Pixel 575/49 has color %08x, expected 0x00ff0000 \n " , color ) ;
hr = IDirect3DDevice9_SetPixelShader ( device , NULL ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetPixelShader returned %08x \n " , hr ) ;
2007-08-30 21:35:50 +00:00
IDirect3DPixelShader9_Release ( shader ) ;
hr = IDirect3DDevice9_Clear ( device , 0 , NULL , D3DCLEAR_TARGET , 0xffffff00 , 0.0 , 0 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_CreatePixelShader returned %08x \n " , hr ) ;
2007-08-30 21:35:50 +00:00
hr = IDirect3DDevice9_CreatePixelShader ( device , shader_code_20 , & shader ) ;
if ( FAILED ( hr ) ) {
skip ( " Failed to create 2.0 test shader, most likely not supported \n " ) ;
return ;
}
hr = IDirect3DDevice9_SetPixelShader ( device , shader ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetPixelShader returned %08x \n " , hr ) ;
2007-08-30 21:35:50 +00:00
hr = IDirect3DDevice9_BeginScene ( device ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_BeginScene returned %08x \n " , hr ) ;
2007-08-30 21:35:50 +00:00
if ( SUCCEEDED ( hr ) )
{
hr = IDirect3DDevice9_DrawPrimitiveUP ( device , D3DPT_TRIANGLESTRIP , 2 , vertex , 7 * sizeof ( float ) ) ;
ok ( hr = = D3D_OK , " DrawPrimitiveUP failed (%08x) \n " , hr ) ;
hr = IDirect3DDevice9_EndScene ( device ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_EndScene returned %08x \n " , hr ) ;
2007-08-30 21:35:50 +00:00
}
hr = IDirect3DDevice9_Present ( device , NULL , NULL , NULL , NULL ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_Present failed with %08x \n " , hr ) ;
2007-08-30 21:35:50 +00:00
color = getPixelColor ( device , 63 , 46 ) ;
ok ( color = = 0x00ffff00 , " Pixel 63/46 has color %08x, expected 0x00ffff00 \n " , color ) ;
color = getPixelColor ( device , 66 , 46 ) ;
ok ( color = = 0x00ffff00 , " Pixel 66/64 has color %08x, expected 0x00ffff00 \n " , color ) ;
color = getPixelColor ( device , 63 , 49 ) ;
ok ( color = = 0x00ffff00 , " Pixel 63/49 has color %08x, expected 0x00ffff00 \n " , color ) ;
color = getPixelColor ( device , 66 , 49 ) ;
ok ( color = = 0x000000ff , " Pixel 66/49 has color %08x, expected 0x000000ff \n " , color ) ;
color = getPixelColor ( device , 578 , 46 ) ;
ok ( color = = 0x00ffff00 , " Pixel 578/46 has color %08x, expected 0x00ffff00 \n " , color ) ;
color = getPixelColor ( device , 575 , 46 ) ;
ok ( color = = 0x00ffff00 , " Pixel 575/64 has color %08x, expected 0x00ffff00 \n " , color ) ;
color = getPixelColor ( device , 578 , 49 ) ;
ok ( color = = 0x00ffff00 , " Pixel 578/49 has color %08x, expected 0x00ffff00 \n " , color ) ;
color = getPixelColor ( device , 575 , 49 ) ;
ok ( color = = 0x000000ff , " Pixel 575/49 has color %08x, expected 0x000000ff \n " , color ) ;
color = getPixelColor ( device , 63 , 430 ) ;
ok ( color = = 0x00ffff00 , " Pixel 578/46 has color %08x, expected 0x00ffff00 \n " , color ) ;
color = getPixelColor ( device , 63 , 433 ) ;
ok ( color = = 0x00ffff00 , " Pixel 575/64 has color %08x, expected 0x00ffff00 \n " , color ) ;
color = getPixelColor ( device , 66 , 433 ) ;
ok ( color = = 0x00ffff00 , " Pixel 578/49 has color %08x, expected 0x00ffff00 \n " , color ) ;
color = getPixelColor ( device , 66 , 430 ) ;
ok ( color = = 0x000000ff , " Pixel 575/49 has color %08x, expected 0x000000ff \n " , color ) ;
color = getPixelColor ( device , 578 , 430 ) ;
ok ( color = = 0x00ffff00 , " Pixel 578/46 has color %08x, expected 0x00ffff00 \n " , color ) ;
color = getPixelColor ( device , 578 , 433 ) ;
ok ( color = = 0x00ffff00 , " Pixel 575/64 has color %08x, expected 0x00ffff00 \n " , color ) ;
color = getPixelColor ( device , 575 , 433 ) ;
ok ( color = = 0x00ffff00 , " Pixel 578/49 has color %08x, expected 0x00ffff00 \n " , color ) ;
color = getPixelColor ( device , 575 , 430 ) ;
ok ( color = = 0x000000ff , " Pixel 575/49 has color %08x, expected 0x000000ff \n " , color ) ;
2007-10-10 16:35:54 +00:00
/* Cleanup */
hr = IDirect3DDevice9_SetPixelShader ( device , NULL ) ;
ok ( SUCCEEDED ( hr ) , " SetPixelShader failed (%08x) \n " , hr ) ;
IDirect3DPixelShader9_Release ( shader ) ;
2007-08-30 21:35:50 +00:00
}
2007-09-01 18:00:10 +00:00
static void x8l8v8u8_test ( IDirect3DDevice9 * device )
{
IDirect3D9 * d3d9 ;
HRESULT hr ;
IDirect3DTexture9 * texture ;
IDirect3DPixelShader9 * shader ;
IDirect3DPixelShader9 * shader2 ;
D3DLOCKED_RECT lr ;
DWORD color ;
DWORD shader_code [ ] = {
0xffff0101 , /* ps_1_1 */
0x00000042 , 0xb00f0000 , /* tex t0 */
0x00000001 , 0x800f0000 , 0xb0e40000 , /* mov r0, t0 */
0x0000ffff /* end */
} ;
DWORD shader_code2 [ ] = {
0xffff0101 , /* ps_1_1 */
0x00000042 , 0xb00f0000 , /* tex t0 */
0x00000001 , 0x800f0000 , 0xb0ff0000 , /* mov r0, t0.w */
0x0000ffff /* end */
} ;
float quad [ ] = {
- 1.0 , - 1.0 , 0.1 , 0.5 , 0.5 ,
1.0 , - 1.0 , 0.1 , 0.5 , 0.5 ,
- 1.0 , 1.0 , 0.1 , 0.5 , 0.5 ,
1.0 , 1.0 , 0.1 , 0.5 , 0.5 ,
} ;
memset ( & lr , 0 , sizeof ( lr ) ) ;
IDirect3DDevice9_GetDirect3D ( device , & d3d9 ) ;
hr = IDirect3D9_CheckDeviceFormat ( d3d9 , 0 , D3DDEVTYPE_HAL , D3DFMT_X8R8G8B8 ,
0 , D3DRTYPE_TEXTURE , D3DFMT_X8L8V8U8 ) ;
IDirect3D9_Release ( d3d9 ) ;
if ( FAILED ( hr ) ) {
skip ( " No D3DFMT_X8L8V8U8 support \n " ) ;
} ;
hr = IDirect3DDevice9_Clear ( device , 0 , NULL , D3DCLEAR_TARGET , 0xffff0000 , 0.0 , 0 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_Clear returned %08x \n " , hr ) ;
2007-09-01 18:00:10 +00:00
hr = IDirect3DDevice9_CreateTexture ( device , 1 , 1 , 1 , 0 , D3DFMT_X8L8V8U8 , D3DPOOL_MANAGED , & texture , NULL ) ;
ok ( hr = = D3D_OK , " IDirect3DDevice9_CreateTexture failed (%08x) \n " , hr ) ;
hr = IDirect3DTexture9_LockRect ( texture , 0 , & lr , NULL , 0 ) ;
ok ( hr = = D3D_OK , " IDirect3DTexture9_LockRect failed (%08x) \n " , hr ) ;
* ( ( DWORD * ) lr . pBits ) = 0x11ca3141 ;
hr = IDirect3DTexture9_UnlockRect ( texture , 0 ) ;
ok ( hr = = D3D_OK , " IDirect3DTexture9_UnlockRect failed (%08x) \n " , hr ) ;
hr = IDirect3DDevice9_CreatePixelShader ( device , shader_code , & shader ) ;
ok ( hr = = D3D_OK , " IDirect3DDevice9_CreateShader failed (%08x) \n " , hr ) ;
hr = IDirect3DDevice9_CreatePixelShader ( device , shader_code2 , & shader2 ) ;
ok ( hr = = D3D_OK , " IDirect3DDevice9_CreateShader failed (%08x) \n " , hr ) ;
hr = IDirect3DDevice9_SetFVF ( device , D3DFVF_XYZ | D3DFVF_TEX1 ) ;
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetFVF failed (%08x) \n " , hr ) ;
hr = IDirect3DDevice9_SetPixelShader ( device , shader ) ;
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetPixelShader failed (%08x) \n " , hr ) ;
hr = IDirect3DDevice9_SetTexture ( device , 0 , ( IDirect3DBaseTexture9 * ) texture ) ;
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetTexture failed (%08x) \n " , hr ) ;
hr = IDirect3DDevice9_BeginScene ( device ) ;
ok ( hr = = D3D_OK , " IDirect3DDevice9_BeginScene failed (%08x) \n " , hr ) ;
if ( SUCCEEDED ( hr ) )
{
hr = IDirect3DDevice9_DrawPrimitiveUP ( device , D3DPT_TRIANGLESTRIP , 2 , quad , 5 * sizeof ( float ) ) ;
ok ( hr = = D3D_OK , " DrawPrimitiveUP failed (%08x) \n " , hr ) ;
hr = IDirect3DDevice9_EndScene ( device ) ;
ok ( hr = = D3D_OK , " IDirect3DDevice9_BeginScene failed (%08x) \n " , hr ) ;
}
hr = IDirect3DDevice9_Present ( device , NULL , NULL , NULL , NULL ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_Present failed with %08x \n " , hr ) ;
2007-09-01 18:00:10 +00:00
color = getPixelColor ( device , 578 , 430 ) ;
2008-02-01 01:29:32 +00:00
ok ( color = = 0x008262ca | | color = = 0x008363ca | | color = = 0x008362ca ,
" D3DFMT_X8L8V8U8 = 0x112131ca returns color %08x, expected 0x008262ca \n " , color ) ;
2007-09-01 18:00:10 +00:00
hr = IDirect3DDevice9_SetPixelShader ( device , shader2 ) ;
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetPixelShader failed (%08x) \n " , hr ) ;
hr = IDirect3DDevice9_BeginScene ( device ) ;
ok ( hr = = D3D_OK , " IDirect3DDevice9_BeginScene failed (%08x) \n " , hr ) ;
if ( SUCCEEDED ( hr ) )
{
hr = IDirect3DDevice9_DrawPrimitiveUP ( device , D3DPT_TRIANGLESTRIP , 2 , quad , 5 * sizeof ( float ) ) ;
ok ( hr = = D3D_OK , " DrawPrimitiveUP failed (%08x) \n " , hr ) ;
hr = IDirect3DDevice9_EndScene ( device ) ;
ok ( hr = = D3D_OK , " IDirect3DDevice9_BeginScene failed (%08x) \n " , hr ) ;
}
hr = IDirect3DDevice9_Present ( device , NULL , NULL , NULL , NULL ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_Present failed with %08x \n " , hr ) ;
2007-09-01 18:00:10 +00:00
color = getPixelColor ( device , 578 , 430 ) ;
ok ( color = = 0x00ffffff , " w component of D3DFMT_X8L8V8U8 = 0x11ca3141 returns color %08x \n " , color ) ;
hr = IDirect3DDevice9_SetPixelShader ( device , NULL ) ;
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetPixelShader failed (%08x) \n " , hr ) ;
hr = IDirect3DDevice9_SetTexture ( device , 0 , NULL ) ;
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetTexture failed (%08x) \n " , hr ) ;
IDirect3DPixelShader9_Release ( shader ) ;
IDirect3DPixelShader9_Release ( shader2 ) ;
IDirect3DTexture9_Release ( texture ) ;
}
2007-08-31 18:56:15 +00:00
static void autogen_mipmap_test ( IDirect3DDevice9 * device )
{
HRESULT hr ;
IDirect3D9 * d3d ;
IDirect3DTexture9 * texture = NULL ;
IDirect3DSurface9 * surface ;
DWORD color ;
const RECT r1 = { 256 , 256 , 512 , 512 } ;
const RECT r2 = { 512 , 256 , 768 , 512 } ;
const RECT r3 = { 256 , 512 , 512 , 768 } ;
const RECT r4 = { 512 , 512 , 768 , 768 } ;
unsigned int x , y ;
D3DLOCKED_RECT lr ;
memset ( & lr , 0 , sizeof ( lr ) ) ;
IDirect3DDevice9_GetDirect3D ( device , & d3d ) ;
if ( IDirect3D9_CheckDeviceFormat ( d3d , 0 , D3DDEVTYPE_HAL , D3DFMT_X8R8G8B8 ,
D3DUSAGE_AUTOGENMIPMAP , D3DRTYPE_TEXTURE , D3DFMT_X8R8G8B8 ) ! = D3D_OK ) {
skip ( " No autogenmipmap support \n " ) ;
IDirect3D9_Release ( d3d ) ;
return ;
}
IDirect3D9_Release ( d3d ) ;
hr = IDirect3DDevice9_Clear ( device , 0 , NULL , D3DCLEAR_TARGET , 0xffffff00 , 0.0 , 0 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_Clear returned %08x \n " , hr ) ;
2007-08-31 18:56:15 +00:00
/* Make the mipmap big, so that a smaller mipmap is used
*/
hr = IDirect3DDevice9_CreateTexture ( device , 1024 , 1024 , 0 , D3DUSAGE_AUTOGENMIPMAP ,
D3DFMT_X8R8G8B8 , D3DPOOL_MANAGED , & texture , 0 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_CreateTexture returned %08x \n " , hr ) ;
2007-08-31 18:56:15 +00:00
hr = IDirect3DTexture9_GetSurfaceLevel ( texture , 0 , & surface ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DTexture9_GetSurfaceLevel returned %08x \n " , hr ) ;
2007-08-31 18:56:15 +00:00
hr = IDirect3DSurface9_LockRect ( surface , & lr , NULL , 0 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DSurface9_LockRect returned %08x \n " , hr ) ;
2007-08-31 18:56:15 +00:00
for ( y = 0 ; y < 1024 ; y + + ) {
for ( x = 0 ; x < 1024 ; x + + ) {
DWORD * dst = ( DWORD * ) ( ( ( BYTE * ) lr . pBits ) + y * lr . Pitch + x * 4 ) ;
POINT pt ;
pt . x = x ;
pt . y = y ;
if ( PtInRect ( & r1 , pt ) ) {
* dst = 0xffff0000 ;
} else if ( PtInRect ( & r2 , pt ) ) {
* dst = 0xff00ff00 ;
} else if ( PtInRect ( & r3 , pt ) ) {
* dst = 0xff0000ff ;
} else if ( PtInRect ( & r4 , pt ) ) {
* dst = 0xff000000 ;
} else {
* dst = 0xffffffff ;
}
}
}
hr = IDirect3DSurface9_UnlockRect ( surface ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DSurface9_UnlockRect returned %08x \n " , hr ) ;
2007-08-31 18:56:15 +00:00
IDirect3DSurface9_Release ( surface ) ;
hr = IDirect3DDevice9_SetTexture ( device , 0 , ( IDirect3DBaseTexture9 * ) texture ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetTexture returned %08x \n " , hr ) ;
2007-08-31 18:56:15 +00:00
hr = IDirect3DDevice9_SetSamplerState ( device , 0 , D3DSAMP_MIPFILTER , D3DTEXF_POINT ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetSamplerState failed with %08x \n " , hr ) ;
2007-08-31 18:56:15 +00:00
hr = IDirect3DDevice9_BeginScene ( device ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_BeginScene returned %08x \n " , hr ) ;
2007-08-31 18:56:15 +00:00
if ( SUCCEEDED ( hr ) ) {
const float quad [ ] = {
- 0.5 , - 0.5 , 0.1 , 0.0 , 0.0 ,
- 0.5 , 0.5 , 0.1 , 0.0 , 1.0 ,
0.5 , - 0.5 , 0.1 , 1.0 , 0.0 ,
0.5 , 0.5 , 0.1 , 1.0 , 1.0
} ;
hr = IDirect3DDevice9_SetFVF ( device , D3DFVF_XYZ | D3DFVF_TEX1 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetFVF returned %08x \n " , hr ) ;
2007-08-31 18:56:15 +00:00
hr = IDirect3DDevice9_DrawPrimitiveUP ( device , D3DPT_TRIANGLESTRIP , 2 , quad , 5 * sizeof ( float ) ) ;
ok ( hr = = D3D_OK , " DrawPrimitiveUP failed (%08x) \n " , hr ) ;
hr = IDirect3DDevice9_EndScene ( device ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_EndScene returned %08x \n " , hr ) ;
2007-08-31 18:56:15 +00:00
}
hr = IDirect3DDevice9_SetTexture ( device , 0 , NULL ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetTexture returned %08x \n " , hr ) ;
2007-08-31 18:56:15 +00:00
hr = IDirect3DDevice9_SetSamplerState ( device , 0 , D3DSAMP_MIPFILTER , D3DTEXF_NONE ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetSamplerState failed with %08x \n " , hr ) ;
2007-08-31 18:56:15 +00:00
IDirect3DTexture9_Release ( texture ) ;
hr = IDirect3DDevice9_Present ( device , NULL , NULL , NULL , NULL ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_Present failed with %08x \n " , hr ) ;
2007-08-31 18:56:15 +00:00
color = getPixelColor ( device , 200 , 200 ) ;
ok ( color = = 0x00ffffff , " pixel 200/200 has color %08x, expected 0x00ffffff \n " , color ) ;
color = getPixelColor ( device , 280 , 200 ) ;
ok ( color = = 0x000000ff , " pixel 280/200 has color %08x, expected 0x000000ff \n " , color ) ;
color = getPixelColor ( device , 360 , 200 ) ;
ok ( color = = 0x00000000 , " pixel 360/200 has color %08x, expected 0x00000000 \n " , color ) ;
color = getPixelColor ( device , 440 , 200 ) ;
ok ( color = = 0x00ffffff , " pixel 440/200 has color %08x, expected 0x00ffffff \n " , color ) ;
color = getPixelColor ( device , 200 , 270 ) ;
ok ( color = = 0x00ffffff , " pixel 200/270 has color %08x, expected 0x00ffffff \n " , color ) ;
color = getPixelColor ( device , 280 , 270 ) ;
ok ( color = = 0x00ff0000 , " pixel 280/270 has color %08x, expected 0x00ff0000 \n " , color ) ;
color = getPixelColor ( device , 360 , 270 ) ;
ok ( color = = 0x0000ff00 , " pixel 360/270 has color %08x, expected 0x0000ff00 \n " , color ) ;
color = getPixelColor ( device , 440 , 270 ) ;
ok ( color = = 0x00ffffff , " pixel 440/200 has color %08x, expected 0x00ffffff \n " , color ) ;
}
2007-09-13 11:34:29 +00:00
static void test_constant_clamp_vs ( IDirect3DDevice9 * device )
{
IDirect3DVertexShader9 * shader_11 , * shader_11_2 , * shader_20 , * shader_20_2 ;
IDirect3DVertexDeclaration9 * decl ;
HRESULT hr ;
DWORD color ;
DWORD shader_code_11 [ ] = {
0xfffe0101 , /* vs_1_1 */
0x0000001f , 0x80000000 , 0x900f0000 , /* dcl_position v0 */
0x00000001 , 0x800f0001 , 0xa0e40001 , /* mov r1, c1 */
0x00000002 , 0xd00f0000 , 0x80e40001 , 0xa0e40002 , /* add oD0, r1, c2 */
0x00000001 , 0xc00f0000 , 0x90e40000 , /* mov oPos, v0 */
0x0000ffff /* end */
} ;
DWORD shader_code_11_2 [ ] = {
0xfffe0101 , /* vs_1_1 */
0x00000051 , 0xa00f0001 , 0x3fa00000 , 0xbf000000 , 0xbfc00000 , 0x3f800000 , /* dcl ... */
0x00000051 , 0xa00f0002 , 0xbf000000 , 0x3fa00000 , 0x40000000 , 0x3f800000 , /* dcl ... */
0x0000001f , 0x80000000 , 0x900f0000 , /* dcl_position v0 */
0x00000001 , 0x800f0001 , 0xa0e40001 , /* mov r1, c1 */
0x00000002 , 0xd00f0000 , 0x80e40001 , 0xa0e40002 , /* add oD0, r1, c2 */
0x00000001 , 0xc00f0000 , 0x90e40000 , /* mov oPos, v0 */
0x0000ffff /* end */
} ;
DWORD shader_code_20 [ ] = {
0xfffe0200 , /* vs_2_0 */
0x0200001f , 0x80000000 , 0x900f0000 , /* dcl_position v0 */
0x02000001 , 0x800f0001 , 0xa0e40001 , /* mov r1, c1 */
0x03000002 , 0xd00f0000 , 0x80e40001 , 0xa0e40002 , /* add oD0, r1, c2 */
0x02000001 , 0xc00f0000 , 0x90e40000 , /* mov oPos, v0 */
0x0000ffff /* end */
} ;
DWORD shader_code_20_2 [ ] = {
0xfffe0200 , /* vs_2_0 */
0x05000051 , 0xa00f0001 , 0x3fa00000 , 0xbf000000 , 0xbfc00000 , 0x3f800000 ,
0x05000051 , 0xa00f0002 , 0xbf000000 , 0x3fa00000 , 0x40000000 , 0x3f800000 ,
0x0200001f , 0x80000000 , 0x900f0000 , /* dcl_position v0 */
0x02000001 , 0x800f0001 , 0xa0e40001 , /* mov r1, c1 */
0x03000002 , 0xd00f0000 , 0x80e40001 , 0xa0e40002 , /* add oD0, r1, c2 */
0x02000001 , 0xc00f0000 , 0x90e40000 , /* mov oPos, v0 */
0x0000ffff /* end */
} ;
static const D3DVERTEXELEMENT9 decl_elements [ ] = {
{ 0 , 0 , D3DDECLTYPE_FLOAT3 , D3DDECLMETHOD_DEFAULT , D3DDECLUSAGE_POSITION , 0 } ,
D3DDECL_END ( )
} ;
float quad1 [ ] = {
- 1.0 , - 1.0 , 0.1 ,
0.0 , - 1.0 , 0.1 ,
- 1.0 , 0.0 , 0.1 ,
0.0 , 0.0 , 0.1
} ;
float quad2 [ ] = {
0.0 , - 1.0 , 0.1 ,
1.0 , - 1.0 , 0.1 ,
0.0 , 0.0 , 0.1 ,
1.0 , 0.0 , 0.1
} ;
float quad3 [ ] = {
0.0 , 0.0 , 0.1 ,
1.0 , 0.0 , 0.1 ,
0.0 , 1.0 , 0.1 ,
1.0 , 1.0 , 0.1
} ;
float quad4 [ ] = {
- 1.0 , 0.0 , 0.1 ,
0.0 , 0.0 , 0.1 ,
- 1.0 , 1.0 , 0.1 ,
0.0 , 1.0 , 0.1
} ;
float test_data_c1 [ 4 ] = { 1.25 , - 0.50 , - 1.50 , 1.0 } ;
float test_data_c2 [ 4 ] = { - 0.50 , 1.25 , 2.00 , 1.0 } ;
hr = IDirect3DDevice9_Clear ( device , 0 , NULL , D3DCLEAR_TARGET , 0xff00ffff , 0.0 , 0 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_Clear returned %08x \n " , hr ) ;
2007-09-13 11:34:29 +00:00
hr = IDirect3DDevice9_CreateVertexShader ( device , shader_code_11 , & shader_11 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_CreateVertexShader returned %08x \n " , hr ) ;
2007-09-13 11:34:29 +00:00
hr = IDirect3DDevice9_CreateVertexShader ( device , shader_code_11_2 , & shader_11_2 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_CreateVertexShader returned %08x \n " , hr ) ;
2007-09-13 11:34:29 +00:00
hr = IDirect3DDevice9_CreateVertexShader ( device , shader_code_20 , & shader_20 ) ;
if ( FAILED ( hr ) ) shader_20 = NULL ;
hr = IDirect3DDevice9_CreateVertexShader ( device , shader_code_20_2 , & shader_20_2 ) ;
if ( FAILED ( hr ) ) shader_20_2 = NULL ;
hr = IDirect3DDevice9_CreateVertexDeclaration ( device , decl_elements , & decl ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_CreateVertexDeclaration returned %08x \n " , hr ) ;
2007-09-13 11:34:29 +00:00
hr = IDirect3DDevice9_SetVertexShaderConstantF ( device , 1 , test_data_c1 , 1 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetVertexShaderConstantF returned %08x \n " , hr ) ;
2007-09-13 11:34:29 +00:00
hr = IDirect3DDevice9_SetVertexShaderConstantF ( device , 2 , test_data_c2 , 1 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetVertexShaderConstantF returned %08x \n " , hr ) ;
2007-09-13 11:34:29 +00:00
hr = IDirect3DDevice9_SetVertexDeclaration ( device , decl ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetVertexDeclaration returned %08x \n " , hr ) ;
2007-09-13 11:34:29 +00:00
hr = IDirect3DDevice9_BeginScene ( device ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_BeginScene returned %08x \n " , hr ) ;
2007-09-13 11:34:29 +00:00
if ( SUCCEEDED ( hr ) )
{
hr = IDirect3DDevice9_SetVertexShader ( device , shader_11 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetVertexShader returned %08x \n " , hr ) ;
2007-09-13 11:34:29 +00:00
hr = IDirect3DDevice9_DrawPrimitiveUP ( device , D3DPT_TRIANGLESTRIP , 2 , quad1 , 3 * sizeof ( float ) ) ;
ok ( hr = = D3D_OK , " DrawPrimitiveUP failed (%08x) \n " , hr ) ;
hr = IDirect3DDevice9_SetVertexShader ( device , shader_11_2 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetVertexShader returned %08x \n " , hr ) ;
2007-09-13 11:34:29 +00:00
hr = IDirect3DDevice9_DrawPrimitiveUP ( device , D3DPT_TRIANGLESTRIP , 2 , quad2 , 3 * sizeof ( float ) ) ;
ok ( hr = = D3D_OK , " DrawPrimitiveUP failed (%08x) \n " , hr ) ;
if ( shader_20 ) {
hr = IDirect3DDevice9_SetVertexShader ( device , shader_20 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetVertexShader returned %08x \n " , hr ) ;
2007-09-13 11:34:29 +00:00
hr = IDirect3DDevice9_DrawPrimitiveUP ( device , D3DPT_TRIANGLESTRIP , 2 , quad3 , 3 * sizeof ( float ) ) ;
ok ( hr = = D3D_OK , " DrawPrimitiveUP failed (%08x) \n " , hr ) ;
}
if ( shader_20_2 ) {
hr = IDirect3DDevice9_SetVertexShader ( device , shader_20_2 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetVertexShader returned %08x \n " , hr ) ;
2007-09-13 11:34:29 +00:00
hr = IDirect3DDevice9_DrawPrimitiveUP ( device , D3DPT_TRIANGLESTRIP , 2 , quad4 , 3 * sizeof ( float ) ) ;
ok ( hr = = D3D_OK , " DrawPrimitiveUP failed (%08x) \n " , hr ) ;
}
hr = IDirect3DDevice9_EndScene ( device ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_EndScene returned %08x \n " , hr ) ;
2007-09-13 11:34:29 +00:00
}
hr = IDirect3DDevice9_Present ( device , NULL , NULL , NULL , NULL ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_Present failed with %08x \n " , hr ) ;
2007-09-13 11:34:29 +00:00
hr = IDirect3DDevice9_SetVertexShader ( device , NULL ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetVertexShader returned %08x \n " , hr ) ;
2007-09-13 11:34:29 +00:00
hr = IDirect3DDevice9_SetVertexDeclaration ( device , NULL ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetVertexDeclaration returned %08x \n " , hr ) ;
2007-09-13 11:34:29 +00:00
color = getPixelColor ( device , 160 , 360 ) ;
ok ( color = = 0x00bfbf80 | | color = = 0x00bfbf7f | | color = = 0x00bfbf81 ,
" quad 1 has color %08x, expected 0x00bfbf80 \n " , color ) ;
color = getPixelColor ( device , 480 , 360 ) ;
ok ( color = = 0x00bfbf80 | | color = = 0x00bfbf7f | | color = = 0x00bfbf81 ,
" quad 2 has color %08x, expected 0x00bfbf80 \n " , color ) ;
if ( shader_20 ) {
color = getPixelColor ( device , 160 , 120 ) ;
ok ( color = = 0x00bfbf80 | | color = = 0x00bfbf7f | | color = = 0x00bfbf81 ,
" quad 3 has color %08x, expected 0x00bfbf80 \n " , color ) ;
}
if ( shader_20_2 ) {
color = getPixelColor ( device , 480 , 120 ) ;
ok ( color = = 0x00bfbf80 | | color = = 0x00bfbf7f | | color = = 0x00bfbf81 ,
" quad 4 has color %08x, expected 0x00bfbf80 \n " , color ) ;
}
IDirect3DVertexDeclaration9_Release ( decl ) ;
if ( shader_20_2 ) IDirect3DVertexShader9_Release ( shader_20_2 ) ;
if ( shader_20 ) IDirect3DVertexShader9_Release ( shader_20 ) ;
IDirect3DVertexShader9_Release ( shader_11_2 ) ;
IDirect3DVertexShader9_Release ( shader_11 ) ;
}
static void constant_clamp_ps_test ( IDirect3DDevice9 * device )
{
IDirect3DPixelShader9 * shader_11 , * shader_12 , * shader_14 , * shader_20 ;
HRESULT hr ;
DWORD color ;
DWORD shader_code_11 [ ] = {
0xffff0101 , /* ps_1_1 */
0x00000001 , 0x800f0001 , 0xa0e40001 , /* mov r1, c1 */
0x00000002 , 0x800f0000 , 0x80e40001 , 0xa0e40002 , /* add r0, r1, c2 */
0x0000ffff /* end */
} ;
DWORD shader_code_12 [ ] = {
0xffff0102 , /* ps_1_2 */
0x00000001 , 0x800f0001 , 0xa0e40001 , /* mov r1, c1 */
0x00000002 , 0x800f0000 , 0x80e40001 , 0xa0e40002 , /* add r0, r1, c2 */
0x0000ffff /* end */
} ;
/* Skip 1.3 shaders because we have only 4 quads(ok, could make them smaller if needed).
* 1.2 and 1.4 shaders behave the same , so it ' s unlikely that 1.3 shaders are different .
* During development of this test , 1.3 shaders were verified too
*/
DWORD shader_code_14 [ ] = {
0xffff0104 , /* ps_1_4 */
/* Try to make one constant local. It gets clamped too, although the binary contains
* the bigger numbers
*/
0x00000051 , 0xa00f0002 , 0xbf000000 , 0x3fa00000 , 0x40000000 , 0x3f800000 , /* def c2, -0.5, 1.25, 2, 1 */
0x00000001 , 0x800f0001 , 0xa0e40001 , /* mov r1, c1 */
0x00000002 , 0x800f0000 , 0x80e40001 , 0xa0e40002 , /* add r0, r1, c2 */
0x0000ffff /* end */
} ;
DWORD shader_code_20 [ ] = {
0xffff0200 , /* ps_2_0 */
0x02000001 , 0x800f0001 , 0xa0e40001 , /* mov r1, c1 */
0x03000002 , 0x800f0000 , 0x80e40001 , 0xa0e40002 , /* add r0, r1, c2 */
0x02000001 , 0x800f0800 , 0x80e40000 , /* mov oC0, r0 */
0x0000ffff /* end */
} ;
float quad1 [ ] = {
- 1.0 , - 1.0 , 0.1 ,
0.0 , - 1.0 , 0.1 ,
- 1.0 , 0.0 , 0.1 ,
0.0 , 0.0 , 0.1
} ;
float quad2 [ ] = {
0.0 , - 1.0 , 0.1 ,
1.0 , - 1.0 , 0.1 ,
0.0 , 0.0 , 0.1 ,
1.0 , 0.0 , 0.1
} ;
float quad3 [ ] = {
0.0 , 0.0 , 0.1 ,
1.0 , 0.0 , 0.1 ,
0.0 , 1.0 , 0.1 ,
1.0 , 1.0 , 0.1
} ;
float quad4 [ ] = {
- 1.0 , 0.0 , 0.1 ,
0.0 , 0.0 , 0.1 ,
- 1.0 , 1.0 , 0.1 ,
0.0 , 1.0 , 0.1
} ;
float test_data_c1 [ 4 ] = { 1.25 , - 0.50 , - 1.50 , 1.0 } ;
float test_data_c2 [ 4 ] = { - 0.50 , 1.25 , 2.00 , 1.0 } ;
hr = IDirect3DDevice9_Clear ( device , 0 , NULL , D3DCLEAR_TARGET , 0xff00ffff , 0.0 , 0 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_Clear returned %08x \n " , hr ) ;
2007-09-13 11:34:29 +00:00
hr = IDirect3DDevice9_CreatePixelShader ( device , shader_code_11 , & shader_11 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_CreatePixelShader returned %08x \n " , hr ) ;
2007-09-13 11:34:29 +00:00
hr = IDirect3DDevice9_CreatePixelShader ( device , shader_code_12 , & shader_12 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_CreatePixelShader returned %08x \n " , hr ) ;
2007-09-13 11:34:29 +00:00
hr = IDirect3DDevice9_CreatePixelShader ( device , shader_code_14 , & shader_14 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_CreatePixelShader returned %08x \n " , hr ) ;
2007-09-13 11:34:29 +00:00
hr = IDirect3DDevice9_CreatePixelShader ( device , shader_code_20 , & shader_20 ) ;
if ( FAILED ( hr ) ) shader_20 = NULL ;
hr = IDirect3DDevice9_SetPixelShaderConstantF ( device , 1 , test_data_c1 , 1 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetPixelShaderConstantF returned %08x \n " , hr ) ;
2007-09-13 11:34:29 +00:00
hr = IDirect3DDevice9_SetPixelShaderConstantF ( device , 2 , test_data_c2 , 1 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetPixelShaderConstantF returned %08x \n " , hr ) ;
2007-09-13 11:34:29 +00:00
hr = IDirect3DDevice9_SetFVF ( device , D3DFVF_XYZ ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetFVF returned %08x \n " , hr ) ;
2007-09-13 11:34:29 +00:00
hr = IDirect3DDevice9_BeginScene ( device ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_BeginScene returned %08x \n " , hr ) ;
2007-09-13 11:34:29 +00:00
if ( SUCCEEDED ( hr ) )
{
hr = IDirect3DDevice9_SetPixelShader ( device , shader_11 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetPixelShader returned %08x \n " , hr ) ;
2007-09-13 11:34:29 +00:00
hr = IDirect3DDevice9_DrawPrimitiveUP ( device , D3DPT_TRIANGLESTRIP , 2 , quad1 , 3 * sizeof ( float ) ) ;
ok ( hr = = D3D_OK , " DrawPrimitiveUP failed (%08x) \n " , hr ) ;
hr = IDirect3DDevice9_SetPixelShader ( device , shader_12 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetPixelShader returned %08x \n " , hr ) ;
2007-09-13 11:34:29 +00:00
hr = IDirect3DDevice9_DrawPrimitiveUP ( device , D3DPT_TRIANGLESTRIP , 2 , quad2 , 3 * sizeof ( float ) ) ;
ok ( hr = = D3D_OK , " DrawPrimitiveUP failed (%08x) \n " , hr ) ;
hr = IDirect3DDevice9_SetPixelShader ( device , shader_14 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetPixelShader returned %08x \n " , hr ) ;
2007-09-13 11:34:29 +00:00
hr = IDirect3DDevice9_DrawPrimitiveUP ( device , D3DPT_TRIANGLESTRIP , 2 , quad3 , 3 * sizeof ( float ) ) ;
ok ( hr = = D3D_OK , " DrawPrimitiveUP failed (%08x) \n " , hr ) ;
if ( shader_20 ) {
hr = IDirect3DDevice9_SetPixelShader ( device , shader_20 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetPixelShader returned %08x \n " , hr ) ;
2007-09-13 11:34:29 +00:00
hr = IDirect3DDevice9_DrawPrimitiveUP ( device , D3DPT_TRIANGLESTRIP , 2 , quad4 , 3 * sizeof ( float ) ) ;
ok ( hr = = D3D_OK , " DrawPrimitiveUP failed (%08x) \n " , hr ) ;
}
hr = IDirect3DDevice9_EndScene ( device ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_EndScene returned %08x \n " , hr ) ;
2007-09-13 11:34:29 +00:00
}
hr = IDirect3DDevice9_Present ( device , NULL , NULL , NULL , NULL ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_Present failed with %08x \n " , hr ) ;
2007-09-13 11:34:29 +00:00
hr = IDirect3DDevice9_SetPixelShader ( device , NULL ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetVertexShader returned %08x \n " , hr ) ;
2007-09-13 11:34:29 +00:00
color = getPixelColor ( device , 160 , 360 ) ;
ok ( color = = 0x00808000 | | color = = 0x007f7f00 | | color = = 0x00818100 ,
" quad 1 has color %08x, expected 0x00808000 \n " , color ) ;
color = getPixelColor ( device , 480 , 360 ) ;
ok ( color = = 0x00808000 | | color = = 0x007f7f00 | | color = = 0x00818100 ,
" quad 2 has color %08x, expected 0x00808000 \n " , color ) ;
color = getPixelColor ( device , 480 , 120 ) ;
ok ( color = = 0x00808000 | | color = = 0x007f7f00 | | color = = 0x00818100 ,
" quad 3 has color %08x, expected 0x00808000 \n " , color ) ;
if ( shader_20 ) {
color = getPixelColor ( device , 160 , 120 ) ;
ok ( color = = 0x00bfbf80 | | color = = 0x00bfbf7f | | color = = 0x00bfbf81 ,
" quad 4 has color %08x, expected 0x00bfbf80 \n " , color ) ;
}
if ( shader_20 ) IDirect3DPixelShader9_Release ( shader_20 ) ;
IDirect3DPixelShader9_Release ( shader_14 ) ;
IDirect3DPixelShader9_Release ( shader_12 ) ;
IDirect3DPixelShader9_Release ( shader_11 ) ;
}
2008-04-01 05:03:11 +00:00
static void dp2add_ps_test ( IDirect3DDevice9 * device )
{
IDirect3DPixelShader9 * shader_dp2add = NULL ;
IDirect3DPixelShader9 * shader_dp2add_sat = NULL ;
HRESULT hr ;
DWORD color ;
/* DP2ADD is defined as: (src0.r * src1.r) + (src0.g * src1.g) + src2.
* One D3D restriction of all shader instructions except SINCOS is that no more than 2
2008-04-02 20:10:47 +00:00
* source tokens can be constants . So , for this exercise , we move contents of c0 to
2008-04-01 05:03:11 +00:00
* r0 first .
2008-04-02 20:10:47 +00:00
* The result here for the r , g , b components should be roughly 0.5 :
2008-04-01 05:03:11 +00:00
* ( 0.5 * 0.5 ) + ( 0.5 * 0.5 ) + 0.0 = 0.5 */
static const DWORD shader_code_dp2add [ ] = {
0xffff0200 , /* ps_2_0 */
0x05000051 , 0xa00f0000 , 0x3f000000 , 0x3f000000 , 0x3f800000 , 0x00000000 , /* def c0, 0.5, 0.5, 1.0, 0 */
0x02000001 , 0x800f0000 , 0xa0e40000 , /* mov r0, c0 */
0x0400005a , 0x80070000 , 0x80000000 , 0x80000000 , 0x80ff0000 , /* dp2add r0.rgb, r0, r0, r0.a */
0x02000001 , 0x80080000 , 0xa0aa0000 , /* mov r0.a, c0.b */
0x02000001 , 0x800f0800 , 0x80e40000 , /* mov oC0, r0 */
0x0000ffff /* end */
} ;
/* Test the _sat modifier, too. Result here should be:
* DP2 : ( - 0.5 * - 0.5 ) + ( - 0.5 * - 0.5 ) + 2.0 = 2.5
* _SAT : = = > 1.0
* ADD : ( 1.0 + - 0.5 ) = 0.5
*/
static const DWORD shader_code_dp2add_sat [ ] = {
0xffff0200 , /* ps_2_0 */
0x05000051 , 0xa00f0000 , 0xbf000000 , 0xbf000000 , 0x3f800000 , 0x40000000 , /* def c0, -0.5, -0.5, 1.0, 2.0 */
0x02000001 , 0x800f0000 , 0xa0e40000 , /* mov r0, c0 */
0x0400005a , 0x80170000 , 0x80000000 , 0x80000000 , 0x80ff0000 , /* dp2add_sat r0.rgb, r0, r0, r0.a */
0x03000002 , 0x80070000 , 0x80e40000 , 0xa0000000 , /* add r0.rgb, r0, c0.r */
0x02000001 , 0x80080000 , 0xa0aa0000 , /* mov r0.a, c0.b */
0x02000001 , 0x800f0800 , 0x80e40000 , /* mov oC0, r0 */
0x0000ffff /* end */
} ;
const float quad [ ] = {
- 1.0 , - 1.0 , 0.1 ,
1.0 , - 1.0 , 0.1 ,
- 1.0 , 1.0 , 0.1 ,
1.0 , 1.0 , 0.1
} ;
hr = IDirect3DDevice9_Clear ( device , 0 , NULL , D3DCLEAR_TARGET , 0xff000000 , 0.0 , 0 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_Clear returned %08x \n " , hr ) ;
2008-04-01 05:03:11 +00:00
hr = IDirect3DDevice9_CreatePixelShader ( device , shader_code_dp2add , & shader_dp2add ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_CreatePixelShader returned %08x \n " , hr ) ;
2008-04-01 05:03:11 +00:00
hr = IDirect3DDevice9_CreatePixelShader ( device , shader_code_dp2add_sat , & shader_dp2add_sat ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_CreatePixelShader returned %08x \n " , hr ) ;
2008-04-01 05:03:11 +00:00
hr = IDirect3DDevice9_SetFVF ( device , D3DFVF_XYZ ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetFVF returned %08x \n " , hr ) ;
2008-04-01 05:03:11 +00:00
if ( shader_dp2add ) {
hr = IDirect3DDevice9_SetPixelShader ( device , shader_dp2add ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetPixelShader returned %08x \n " , hr ) ;
2008-04-01 05:03:11 +00:00
hr = IDirect3DDevice9_BeginScene ( device ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_BeginScene returned %08x \n " , hr ) ;
2008-04-01 05:03:11 +00:00
if ( SUCCEEDED ( hr ) )
{
hr = IDirect3DDevice9_DrawPrimitiveUP ( device , D3DPT_TRIANGLESTRIP , 2 , quad , 3 * sizeof ( float ) ) ;
ok ( hr = = D3D_OK , " DrawPrimitiveUP failed (%08x) \n " , hr ) ;
hr = IDirect3DDevice9_EndScene ( device ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_EndScene returned %08x \n " , hr ) ;
2008-04-01 05:03:11 +00:00
}
hr = IDirect3DDevice9_Present ( device , NULL , NULL , NULL , NULL ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_Present failed with %08x \n " , hr ) ;
2008-04-01 05:03:11 +00:00
color = getPixelColor ( device , 360 , 240 ) ;
ok ( color = = 0x007f7f7f | | color = = 0x00808080 , " dp2add pixel has color %08x, expected ~0x007f7f7f \n " , color ) ;
IDirect3DPixelShader9_Release ( shader_dp2add ) ;
} else {
skip ( " dp2add shader creation failed \n " ) ;
}
if ( shader_dp2add_sat ) {
hr = IDirect3DDevice9_SetPixelShader ( device , shader_dp2add_sat ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetPixelShader returned %08x \n " , hr ) ;
2008-04-01 05:03:11 +00:00
hr = IDirect3DDevice9_BeginScene ( device ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_BeginScene returned %08x \n " , hr ) ;
2008-04-01 05:03:11 +00:00
if ( SUCCEEDED ( hr ) )
{
hr = IDirect3DDevice9_DrawPrimitiveUP ( device , D3DPT_TRIANGLESTRIP , 2 , quad , 3 * sizeof ( float ) ) ;
ok ( hr = = D3D_OK , " DrawPrimitiveUP failed (%08x) \n " , hr ) ;
hr = IDirect3DDevice9_EndScene ( device ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_EndScene returned %08x \n " , hr ) ;
2008-04-01 05:03:11 +00:00
}
hr = IDirect3DDevice9_Present ( device , NULL , NULL , NULL , NULL ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_Present failed with %08x \n " , hr ) ;
2008-04-01 05:03:11 +00:00
color = getPixelColor ( device , 360 , 240 ) ;
ok ( color = = 0x007f7f7f | | color = = 0x00808080 , " dp2add pixel has color %08x, expected ~0x007f7f7f \n " , color ) ;
IDirect3DPixelShader9_Release ( shader_dp2add_sat ) ;
} else {
skip ( " dp2add shader creation failed \n " ) ;
}
hr = IDirect3DDevice9_SetPixelShader ( device , NULL ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetVertexShader returned %08x \n " , hr ) ;
2008-04-01 05:03:11 +00:00
}
2007-09-13 10:16:09 +00:00
static void cnd_test ( IDirect3DDevice9 * device )
{
IDirect3DPixelShader9 * shader_11 , * shader_12 , * shader_13 , * shader_14 ;
2007-09-13 12:48:57 +00:00
IDirect3DPixelShader9 * shader_11_coissue , * shader_12_coissue , * shader_13_coissue , * shader_14_coissue ;
2007-09-13 10:16:09 +00:00
HRESULT hr ;
DWORD color ;
/* ps 1.x shaders are rather picky with writemasks and source swizzles. The dp3 is
* used to copy r0 . r to all components of r1 , then copy r1 . a to c0 . a . Essentially it
* does a mov r0 . a , r0 . r , which isn ' t allowed as - is in 1. x pixel shaders .
*/
DWORD shader_code_11 [ ] = {
0xffff0101 , /* ps_1_1 */
0x00000051 , 0xa00f0000 , 0x3f800000 , 0x00000000 , 0x00000000 , 0x00000000 , /* def c0, 1, 0, 0, 0 */
0x00000040 , 0xb00f0000 , /* texcoord t0 */
0x00000001 , 0x800f0000 , 0xb0e40000 , /* mov r0, ???(t0) */
0x00000008 , 0x800f0001 , 0x80e40000 , 0xa0e40000 , /* dp3 r1, r0, c0 */
0x00000001 , 0x80080000 , 0x80ff0001 , /* mov r0.a, r1.a */
0x00000050 , 0x800f0000 , 0x80ff0000 , 0xa0e40001 , 0xa0e40002 , /* cnd r0, r0.a, c1, c2 */
0x0000ffff /* end */
} ;
DWORD shader_code_12 [ ] = {
0xffff0102 , /* ps_1_2 */
0x00000051 , 0xa00f0000 , 0x3f800000 , 0x00000000 , 0x00000000 , 0x00000000 , /* def c0, 1, 0, 0, 0 */
0x00000040 , 0xb00f0000 , /* texcoord t0 */
0x00000001 , 0x800f0000 , 0xb0e40000 , /* mov r0, t0 */
0x00000008 , 0x800f0001 , 0x80e40000 , 0xa0e40000 , /* dp3 r1, r0, c0 */
0x00000001 , 0x80080000 , 0x80ff0001 , /* mov r0.a, r1.a */
0x00000050 , 0x800f0000 , 0x80ff0000 , 0xa0e40001 , 0xa0e40002 , /* cnd r0, r0.a, c1, c2 */
0x0000ffff /* end */
} ;
DWORD shader_code_13 [ ] = {
0xffff0103 , /* ps_1_3 */
0x00000051 , 0xa00f0000 , 0x3f800000 , 0x00000000 , 0x00000000 , 0x00000000 , /* def c0, 1, 0, 0, 0 */
0x00000040 , 0xb00f0000 , /* texcoord t0 */
0x00000001 , 0x800f0000 , 0xb0e40000 , /* mov r0, t0 */
0x00000008 , 0x800f0001 , 0x80e40000 , 0xa0e40000 , /* dp3, r1, r0, c0 */
0x00000001 , 0x80080000 , 0x80ff0001 , /* mov r0.a, r1.a */
0x00000050 , 0x800f0000 , 0x80ff0000 , 0xa0e40001 , 0xa0e40002 , /* cnd r0, r0.a, c1, c2 */
0x0000ffff /* end */
} ;
DWORD shader_code_14 [ ] = {
0xffff0104 , /* ps_1_3 */
0x00000051 , 0xa00f0000 , 0x00000000 , 0x00000000 , 0x00000000 , 0x3f800000 , /* def c0, 0, 0, 0, 1 */
0x00000040 , 0x80070000 , 0xb0e40000 , /* texcrd r0, t0 */
0x00000001 , 0x80080000 , 0xa0ff0000 , /* mov r0.a, c0.a */
0x00000050 , 0x800f0000 , 0x80e40000 , 0xa0e40001 , 0xa0e40002 , /* cnd r0, r0, c1, c2 */
0x0000ffff /* end */
} ;
2007-09-13 12:48:57 +00:00
/* Special fun: The coissue flag on cnd: Apparently cnd always selects the 2nd source,
* as if the src0 comparison against 0.5 always evaluates to true . The coissue flag isn ' t
* set by the compiler , it was added manually after compilation . It isn ' t always allowed ,
* only if there ' s a mov r0 . a , XXXX , and the cnd instruction writes to r0 . xyz , otherwise
* native CreatePixelShader returns an error .
*
* The shader attempts to test the range [ - 1 ; 1 ] against coissued cnd , which is a bit tricky .
* The input from t0 is [ 0 ; 1 ] . 0.5 is substracted , then we have to multiply with 2. Since
* constants are clamped to [ - 1 ; 1 ] , a 2.0 is constructed by adding c0 . r ( = 1.0 ) to c0 . r into r1 . r ,
* then r1 ( 2.0 , 0.0 , 0.0 , 0.0 ) is passed to dp3 ( explained above ) .
*/
DWORD shader_code_11_coissue [ ] = {
0xffff0101 , /* ps_1_1 */
0x00000051 , 0xa00f0000 , 0x3f800000 , 0x00000000 , 0x00000000 , 0x00000000 , /* def c0, 1, 0, 0, 0 */
0x00000051 , 0xa00f0003 , 0x3f000000 , 0x3f000000 , 0x3f000000 , 0x00000000 , /* def c3, 0.5, 0.5, 0.5, 0 */
0x00000040 , 0xb00f0000 , /* texcoord t0 */
0x00000001 , 0x800f0000 , 0xb0e40000 , /* mov r0, t0 */
0x00000003 , 0x800f0000 , 0x80e40000 , 0xa0e40003 , /* sub r0, r0, c3 */
0x00000002 , 0x800f0001 , 0xa0e40000 , 0xa0e40000 , /* add r1, c0, c0 */
0x00000008 , 0x800f0001 , 0x80e40000 , 0x80e40001 , /* dp3, r1, r0, r1 */
0x00000001 , 0x80080000 , 0x80ff0001 , /* mov r0.a, r1.a */
/* 0x40000000 = D3DSI_COISSUE */
0x40000050 , 0x80070000 , 0x80ff0000 , 0xa0e40001 , 0xa0e40002 , /* cnd r0.xyz, r0.a, c1, c2 */
0x0000ffff /* end */
} ;
DWORD shader_code_12_coissue [ ] = {
0xffff0102 , /* ps_1_2 */
0x00000051 , 0xa00f0000 , 0x3f800000 , 0x00000000 , 0x00000000 , 0x00000000 , /* def c0, 1, 0, 0, 0 */
0x00000051 , 0xa00f0003 , 0x3f000000 , 0x3f000000 , 0x3f000000 , 0x00000000 , /* def c3, 0.5, 0.5, 0.5, 0 */
0x00000040 , 0xb00f0000 , /* texcoord t0 */
0x00000001 , 0x800f0000 , 0xb0e40000 , /* mov r0, t0 */
0x00000003 , 0x800f0000 , 0x80e40000 , 0xa0e40003 , /* sub r0, r0, c3 */
0x00000002 , 0x800f0001 , 0xa0e40000 , 0xa0e40000 , /* add r1, c0, c0 */
0x00000008 , 0x800f0001 , 0x80e40000 , 0x80e40001 , /* dp3, r1, r0, r1 */
0x00000001 , 0x80080000 , 0x80ff0001 , /* mov r0.a, r1.a */
/* 0x40000000 = D3DSI_COISSUE */
0x40000050 , 0x80070000 , 0x80ff0000 , 0xa0e40001 , 0xa0e40002 , /* cnd r0.xyz, r0.a, c1, c2 */
0x0000ffff /* end */
} ;
DWORD shader_code_13_coissue [ ] = {
0xffff0103 , /* ps_1_3 */
0x00000051 , 0xa00f0000 , 0x3f800000 , 0x00000000 , 0x00000000 , 0x00000000 , /* def c0, 1, 0, 0, 0 */
0x00000051 , 0xa00f0003 , 0x3f000000 , 0x3f000000 , 0x3f000000 , 0x00000000 , /* def c3, 0.5, 0.5, 0.5, 0 */
0x00000040 , 0xb00f0000 , /* texcoord t0 */
0x00000001 , 0x800f0000 , 0xb0e40000 , /* mov r0, t0 */
0x00000003 , 0x800f0000 , 0x80e40000 , 0xa0e40003 , /* sub r0, r0, c3 */
0x00000002 , 0x800f0001 , 0xa0e40000 , 0xa0e40000 , /* add r1, c0, c0 */
0x00000008 , 0x800f0001 , 0x80e40000 , 0x80e40001 , /* dp3, r1, r0, r1 */
0x00000001 , 0x80080000 , 0x80ff0001 , /* mov r0.a, r1.a */
/* 0x40000000 = D3DSI_COISSUE */
0x40000050 , 0x80070000 , 0x80ff0000 , 0xa0e40001 , 0xa0e40002 , /* cnd r0.xyz, r0.a, c1, c2 */
0x0000ffff /* end */
} ;
/* ps_1_4 does not have a different cnd behavior, just pass the [0;1] texcrd result to cnd, it will
* compare against 0.5
*/
DWORD shader_code_14_coissue [ ] = {
0xffff0104 , /* ps_1_4 */
0x00000051 , 0xa00f0000 , 0x00000000 , 0x00000000 , 0x00000000 , 0x3f800000 , /* def c0, 0, 0, 0, 1 */
0x00000040 , 0x80070000 , 0xb0e40000 , /* texcrd r0, t0 */
0x00000001 , 0x80080000 , 0xa0ff0000 , /* mov r0.a, c0.a */
/* 0x40000000 = D3DSI_COISSUE */
0x40000050 , 0x80070000 , 0x80e40000 , 0xa0e40001 , 0xa0e40002 , /* cnd r0.xyz, r0, c1, c2 */
0x0000ffff /* end */
} ;
2007-09-13 10:16:09 +00:00
float quad1 [ ] = {
- 1.0 , - 1.0 , 0.1 , 0.0 , 0.0 , 1.0 ,
0.0 , - 1.0 , 0.1 , 1.0 , 0.0 , 1.0 ,
- 1.0 , 0.0 , 0.1 , 0.0 , 1.0 , 0.0 ,
0.0 , 0.0 , 0.1 , 1.0 , 1.0 , 0.0
} ;
float quad2 [ ] = {
0.0 , - 1.0 , 0.1 , 0.0 , 0.0 , 1.0 ,
1.0 , - 1.0 , 0.1 , 1.0 , 0.0 , 1.0 ,
0.0 , 0.0 , 0.1 , 0.0 , 1.0 , 0.0 ,
1.0 , 0.0 , 0.1 , 1.0 , 1.0 , 0.0
} ;
float quad3 [ ] = {
0.0 , 0.0 , 0.1 , 0.0 , 0.0 , 1.0 ,
1.0 , 0.0 , 0.1 , 1.0 , 0.0 , 1.0 ,
0.0 , 1.0 , 0.1 , 0.0 , 1.0 , 0.0 ,
1.0 , 1.0 , 0.1 , 1.0 , 1.0 , 0.0
} ;
float quad4 [ ] = {
- 1.0 , 0.0 , 0.1 , 0.0 , 0.0 , 1.0 ,
0.0 , 0.0 , 0.1 , 1.0 , 0.0 , 1.0 ,
- 1.0 , 1.0 , 0.1 , 0.0 , 1.0 , 0.0 ,
0.0 , 1.0 , 0.1 , 1.0 , 1.0 , 0.0
} ;
float test_data_c1 [ 4 ] = { 0.0 , 0.0 , 0.0 , 0.0 } ;
float test_data_c2 [ 4 ] = { 1.0 , 1.0 , 1.0 , 1.0 } ;
2007-09-13 12:48:57 +00:00
float test_data_c1_coi [ 4 ] = { 0.0 , 1.0 , 0.0 , 0.0 } ;
float test_data_c2_coi [ 4 ] = { 1.0 , 0.0 , 1.0 , 1.0 } ;
2007-09-13 10:16:09 +00:00
hr = IDirect3DDevice9_Clear ( device , 0 , NULL , D3DCLEAR_TARGET , 0xff00ffff , 0.0 , 0 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_Clear returned %08x \n " , hr ) ;
2007-09-13 10:16:09 +00:00
hr = IDirect3DDevice9_CreatePixelShader ( device , shader_code_11 , & shader_11 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_CreatePixelShader returned %08x \n " , hr ) ;
2007-09-13 10:16:09 +00:00
hr = IDirect3DDevice9_CreatePixelShader ( device , shader_code_12 , & shader_12 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_CreatePixelShader returned %08x \n " , hr ) ;
2007-09-13 10:16:09 +00:00
hr = IDirect3DDevice9_CreatePixelShader ( device , shader_code_13 , & shader_13 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_CreatePixelShader returned %08x \n " , hr ) ;
2007-09-13 10:16:09 +00:00
hr = IDirect3DDevice9_CreatePixelShader ( device , shader_code_14 , & shader_14 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_CreatePixelShader returned %08x \n " , hr ) ;
2007-09-13 12:48:57 +00:00
hr = IDirect3DDevice9_CreatePixelShader ( device , shader_code_11_coissue , & shader_11_coissue ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_CreatePixelShader returned %08x \n " , hr ) ;
2007-09-13 12:48:57 +00:00
hr = IDirect3DDevice9_CreatePixelShader ( device , shader_code_12_coissue , & shader_12_coissue ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_CreatePixelShader returned %08x \n " , hr ) ;
2007-09-13 12:48:57 +00:00
hr = IDirect3DDevice9_CreatePixelShader ( device , shader_code_13_coissue , & shader_13_coissue ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_CreatePixelShader returned %08x \n " , hr ) ;
2007-09-13 12:48:57 +00:00
hr = IDirect3DDevice9_CreatePixelShader ( device , shader_code_14_coissue , & shader_14_coissue ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_CreatePixelShader returned %08x \n " , hr ) ;
2007-09-13 10:16:09 +00:00
hr = IDirect3DDevice9_SetPixelShaderConstantF ( device , 1 , test_data_c1 , 1 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetPixelShaderConstantF returned %08x \n " , hr ) ;
2007-09-13 10:16:09 +00:00
hr = IDirect3DDevice9_SetPixelShaderConstantF ( device , 2 , test_data_c2 , 1 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetPixelShaderConstantF returned %08x \n " , hr ) ;
2007-09-13 10:16:09 +00:00
hr = IDirect3DDevice9_SetFVF ( device , D3DFVF_XYZ | D3DFVF_TEX1 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetFVF returned %08x \n " , hr ) ;
2007-09-13 10:16:09 +00:00
hr = IDirect3DDevice9_BeginScene ( device ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_BeginScene returned %08x \n " , hr ) ;
2007-09-13 10:16:09 +00:00
if ( SUCCEEDED ( hr ) )
{
hr = IDirect3DDevice9_SetPixelShader ( device , shader_11 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetPixelShader returned %08x \n " , hr ) ;
2007-09-13 10:16:09 +00:00
hr = IDirect3DDevice9_DrawPrimitiveUP ( device , D3DPT_TRIANGLESTRIP , 2 , quad1 , 6 * sizeof ( float ) ) ;
ok ( hr = = D3D_OK , " DrawPrimitiveUP failed (%08x) \n " , hr ) ;
hr = IDirect3DDevice9_SetPixelShader ( device , shader_12 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetPixelShader returned %08x \n " , hr ) ;
2007-09-13 10:16:09 +00:00
hr = IDirect3DDevice9_DrawPrimitiveUP ( device , D3DPT_TRIANGLESTRIP , 2 , quad2 , 6 * sizeof ( float ) ) ;
ok ( hr = = D3D_OK , " DrawPrimitiveUP failed (%08x) \n " , hr ) ;
hr = IDirect3DDevice9_SetPixelShader ( device , shader_13 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetPixelShader returned %08x \n " , hr ) ;
2007-09-13 10:16:09 +00:00
hr = IDirect3DDevice9_DrawPrimitiveUP ( device , D3DPT_TRIANGLESTRIP , 2 , quad3 , 6 * sizeof ( float ) ) ;
ok ( hr = = D3D_OK , " DrawPrimitiveUP failed (%08x) \n " , hr ) ;
hr = IDirect3DDevice9_SetPixelShader ( device , shader_14 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetPixelShader returned %08x \n " , hr ) ;
2007-09-13 10:16:09 +00:00
hr = IDirect3DDevice9_DrawPrimitiveUP ( device , D3DPT_TRIANGLESTRIP , 2 , quad4 , 6 * sizeof ( float ) ) ;
ok ( hr = = D3D_OK , " DrawPrimitiveUP failed (%08x) \n " , hr ) ;
hr = IDirect3DDevice9_EndScene ( device ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_EndScene returned %08x \n " , hr ) ;
2007-09-13 10:16:09 +00:00
}
hr = IDirect3DDevice9_Present ( device , NULL , NULL , NULL , NULL ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_Present failed with %08x \n " , hr ) ;
2007-09-13 10:16:09 +00:00
hr = IDirect3DDevice9_SetPixelShader ( device , NULL ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetVertexShader returned %08x \n " , hr ) ;
2007-09-13 10:16:09 +00:00
/* This is the 1.4 test. Each component(r, g, b) is tested separately against 0.5 */
color = getPixelColor ( device , 158 , 118 ) ;
ok ( color = = 0x00ff00ff , " pixel 158, 118 has color %08x, expected 0x00ff00ff \n " , color ) ;
color = getPixelColor ( device , 162 , 118 ) ;
ok ( color = = 0x000000ff , " pixel 162, 118 has color %08x, expected 0x000000ff \n " , color ) ;
color = getPixelColor ( device , 158 , 122 ) ;
ok ( color = = 0x00ffffff , " pixel 162, 122 has color %08x, expected 0x00ffffff \n " , color ) ;
color = getPixelColor ( device , 162 , 122 ) ;
ok ( color = = 0x0000ffff , " pixel 162, 122 has color %08x, expected 0x0000ffff \n " , color ) ;
/* 1.1 shader. All 3 components get set, based on the .w comparison */
color = getPixelColor ( device , 158 , 358 ) ;
ok ( color = = 0x00ffffff , " pixel 158, 358 has color %08x, expected 0x00ffffff \n " , color ) ;
color = getPixelColor ( device , 162 , 358 ) ;
2008-04-05 22:14:00 +00:00
ok ( ( ( ( color & 0x00ff0000 ) > > 16 ) < = 0x01 ) & & ( ( ( color & 0x0000ff00 ) > > 8 ) < = 0x01 ) & & ( ( color & 0x000000ff ) < = 0x01 ) ,
" pixel 162, 358 has color %08x, expected 0x00000000 \n " , color ) ;
2007-09-13 10:16:09 +00:00
color = getPixelColor ( device , 158 , 362 ) ;
ok ( color = = 0x00ffffff , " pixel 158, 362 has color %08x, expected 0x00ffffff \n " , color ) ;
color = getPixelColor ( device , 162 , 362 ) ;
2008-04-05 22:14:00 +00:00
ok ( ( ( ( color & 0x00ff0000 ) > > 16 ) < = 0x01 ) & & ( ( ( color & 0x0000ff00 ) > > 8 ) < = 0x01 ) & & ( ( color & 0x000000ff ) < = 0x01 ) ,
" pixel 162, 362 has color %08x, expected 0x00000000 \n " , color ) ;
2007-09-13 10:16:09 +00:00
/* 1.2 shader */
color = getPixelColor ( device , 478 , 358 ) ;
ok ( color = = 0x00ffffff , " pixel 478, 358 has color %08x, expected 0x00ffffff \n " , color ) ;
color = getPixelColor ( device , 482 , 358 ) ;
2008-04-05 22:14:00 +00:00
ok ( ( ( ( color & 0x00ff0000 ) > > 16 ) < = 0x01 ) & & ( ( ( color & 0x0000ff00 ) > > 8 ) < = 0x01 ) & & ( ( color & 0x000000ff ) < = 0x01 ) ,
" pixel 482, 358 has color %08x, expected 0x00000000 \n " , color ) ;
2007-09-13 10:16:09 +00:00
color = getPixelColor ( device , 478 , 362 ) ;
ok ( color = = 0x00ffffff , " pixel 478, 362 has color %08x, expected 0x00ffffff \n " , color ) ;
color = getPixelColor ( device , 482 , 362 ) ;
2008-04-05 22:14:00 +00:00
ok ( ( ( ( color & 0x00ff0000 ) > > 16 ) < = 0x01 ) & & ( ( ( color & 0x0000ff00 ) > > 8 ) < = 0x01 ) & & ( ( color & 0x000000ff ) < = 0x01 ) ,
" pixel 482, 362 has color %08x, expected 0x00000000 \n " , color ) ;
2007-09-13 10:16:09 +00:00
/* 1.3 shader */
color = getPixelColor ( device , 478 , 118 ) ;
ok ( color = = 0x00ffffff , " pixel 478, 118 has color %08x, expected 0x00ffffff \n " , color ) ;
color = getPixelColor ( device , 482 , 118 ) ;
2008-04-05 22:14:00 +00:00
ok ( ( ( ( color & 0x00ff0000 ) > > 16 ) < = 0x01 ) & & ( ( ( color & 0x0000ff00 ) > > 8 ) < = 0x01 ) & & ( ( color & 0x000000ff ) < = 0x01 ) ,
" pixel 482, 118 has color %08x, expected 0x00000000 \n " , color ) ;
2007-09-13 10:16:09 +00:00
color = getPixelColor ( device , 478 , 122 ) ;
ok ( color = = 0x00ffffff , " pixel 478, 122 has color %08x, expected 0x00ffffff \n " , color ) ;
color = getPixelColor ( device , 482 , 122 ) ;
2008-04-05 22:14:00 +00:00
ok ( ( ( ( color & 0x00ff0000 ) > > 16 ) < = 0x01 ) & & ( ( ( color & 0x0000ff00 ) > > 8 ) < = 0x01 ) & & ( ( color & 0x000000ff ) < = 0x01 ) ,
" pixel 482, 122 has color %08x, expected 0x00000000 \n " , color ) ;
2007-09-13 10:16:09 +00:00
2007-09-13 12:48:57 +00:00
hr = IDirect3DDevice9_Clear ( device , 0 , NULL , D3DCLEAR_TARGET , 0xff00ffff , 0.0 , 0 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_Clear returned %08x \n " , hr ) ;
2007-09-13 12:48:57 +00:00
hr = IDirect3DDevice9_SetPixelShaderConstantF ( device , 1 , test_data_c1_coi , 1 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetPixelShaderConstantF returned %08x \n " , hr ) ;
2007-09-13 12:48:57 +00:00
hr = IDirect3DDevice9_SetPixelShaderConstantF ( device , 2 , test_data_c2_coi , 1 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetPixelShaderConstantF returned %08x \n " , hr ) ;
2007-09-13 12:48:57 +00:00
hr = IDirect3DDevice9_BeginScene ( device ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_BeginScene returned %08x \n " , hr ) ;
2007-09-13 12:48:57 +00:00
if ( SUCCEEDED ( hr ) )
{
hr = IDirect3DDevice9_SetPixelShader ( device , shader_11_coissue ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetPixelShader returned %08x \n " , hr ) ;
2007-09-13 12:48:57 +00:00
hr = IDirect3DDevice9_DrawPrimitiveUP ( device , D3DPT_TRIANGLESTRIP , 2 , quad1 , 6 * sizeof ( float ) ) ;
ok ( hr = = D3D_OK , " DrawPrimitiveUP failed (%08x) \n " , hr ) ;
hr = IDirect3DDevice9_SetPixelShader ( device , shader_12_coissue ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetPixelShader returned %08x \n " , hr ) ;
2007-09-13 12:48:57 +00:00
hr = IDirect3DDevice9_DrawPrimitiveUP ( device , D3DPT_TRIANGLESTRIP , 2 , quad2 , 6 * sizeof ( float ) ) ;
ok ( hr = = D3D_OK , " DrawPrimitiveUP failed (%08x) \n " , hr ) ;
hr = IDirect3DDevice9_SetPixelShader ( device , shader_13_coissue ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetPixelShader returned %08x \n " , hr ) ;
2007-09-13 12:48:57 +00:00
hr = IDirect3DDevice9_DrawPrimitiveUP ( device , D3DPT_TRIANGLESTRIP , 2 , quad3 , 6 * sizeof ( float ) ) ;
ok ( hr = = D3D_OK , " DrawPrimitiveUP failed (%08x) \n " , hr ) ;
hr = IDirect3DDevice9_SetPixelShader ( device , shader_14_coissue ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetPixelShader returned %08x \n " , hr ) ;
2007-09-13 12:48:57 +00:00
hr = IDirect3DDevice9_DrawPrimitiveUP ( device , D3DPT_TRIANGLESTRIP , 2 , quad4 , 6 * sizeof ( float ) ) ;
ok ( hr = = D3D_OK , " DrawPrimitiveUP failed (%08x) \n " , hr ) ;
hr = IDirect3DDevice9_EndScene ( device ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_EndScene returned %08x \n " , hr ) ;
2007-09-13 12:48:57 +00:00
}
hr = IDirect3DDevice9_Present ( device , NULL , NULL , NULL , NULL ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_Present failed with %08x \n " , hr ) ;
2007-09-13 12:48:57 +00:00
2008-06-25 15:09:35 +00:00
hr = IDirect3DDevice9_SetPixelShader ( device , NULL ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetPixelShader returned %08x \n " , hr ) ;
2008-06-25 15:09:35 +00:00
2007-09-13 12:48:57 +00:00
/* This is the 1.4 test. The coissue doesn't change the behavior here, but keep in mind
* that we swapped the values in c1 and c2 to make the other tests return some color
*/
color = getPixelColor ( device , 158 , 118 ) ;
ok ( color = = 0x00ffffff , " pixel 158, 118 has color %08x, expected 0x00ffffff \n " , color ) ;
color = getPixelColor ( device , 162 , 118 ) ;
ok ( color = = 0x0000ffff , " pixel 162, 118 has color %08x, expected 0x0000ffff \n " , color ) ;
color = getPixelColor ( device , 158 , 122 ) ;
ok ( color = = 0x00ff00ff , " pixel 162, 122 has color %08x, expected 0x00ff00ff \n " , color ) ;
color = getPixelColor ( device , 162 , 122 ) ;
ok ( color = = 0x000000ff , " pixel 162, 122 has color %08x, expected 0x000000ff \n " , color ) ;
/* 1.1 shader. coissue flag changed the semantic of cnd, c1 is always selected */
color = getPixelColor ( device , 158 , 358 ) ;
2008-04-05 22:14:00 +00:00
ok ( ( ( ( color & 0x00ff0000 ) > > 16 ) < = 0x01 ) & & ( ( ( color & 0x0000ff00 ) > > 8 ) = = 0xff ) & & ( ( color & 0x000000ff ) < = 0x01 ) ,
" pixel 158, 358 has color %08x, expected 0x0000ff00 \n " , color ) ;
2007-09-13 12:48:57 +00:00
color = getPixelColor ( device , 162 , 358 ) ;
2008-04-05 22:14:00 +00:00
ok ( ( ( ( color & 0x00ff0000 ) > > 16 ) < = 0x01 ) & & ( ( ( color & 0x0000ff00 ) > > 8 ) = = 0xff ) & & ( ( color & 0x000000ff ) < = 0x01 ) ,
" pixel 162, 358 has color %08x, expected 0x0000ff00 \n " , color ) ;
2007-09-13 12:48:57 +00:00
color = getPixelColor ( device , 158 , 362 ) ;
2008-04-05 22:14:00 +00:00
ok ( ( ( ( color & 0x00ff0000 ) > > 16 ) < = 0x01 ) & & ( ( ( color & 0x0000ff00 ) > > 8 ) = = 0xff ) & & ( ( color & 0x000000ff ) < = 0x01 ) ,
" pixel 158, 362 has color %08x, expected 0x0000ff00 \n " , color ) ;
2007-09-13 12:48:57 +00:00
color = getPixelColor ( device , 162 , 362 ) ;
2008-04-05 22:14:00 +00:00
ok ( ( ( ( color & 0x00ff0000 ) > > 16 ) < = 0x01 ) & & ( ( ( color & 0x0000ff00 ) > > 8 ) = = 0xff ) & & ( ( color & 0x000000ff ) < = 0x01 ) ,
" pixel 162, 362 has color %08x, expected 0x0000ff00 \n " , color ) ;
2007-09-13 12:48:57 +00:00
/* 1.2 shader */
color = getPixelColor ( device , 478 , 358 ) ;
2008-04-05 22:14:00 +00:00
ok ( ( ( ( color & 0x00ff0000 ) > > 16 ) < = 0x01 ) & & ( ( ( color & 0x0000ff00 ) > > 8 ) = = 0xff ) & & ( ( color & 0x000000ff ) < = 0x01 ) ,
" pixel 478, 358 has color %08x, expected 0x0000ff00 \n " , color ) ;
2007-09-13 12:48:57 +00:00
color = getPixelColor ( device , 482 , 358 ) ;
2008-04-05 22:14:00 +00:00
ok ( ( ( ( color & 0x00ff0000 ) > > 16 ) < = 0x01 ) & & ( ( ( color & 0x0000ff00 ) > > 8 ) = = 0xff ) & & ( ( color & 0x000000ff ) < = 0x01 ) ,
" pixel 482, 358 has color %08x, expected 0x0000ff00 \n " , color ) ;
2007-09-13 12:48:57 +00:00
color = getPixelColor ( device , 478 , 362 ) ;
2008-04-05 22:14:00 +00:00
ok ( ( ( ( color & 0x00ff0000 ) > > 16 ) < = 0x01 ) & & ( ( ( color & 0x0000ff00 ) > > 8 ) = = 0xff ) & & ( ( color & 0x000000ff ) < = 0x01 ) ,
" pixel 478, 362 has color %08x, expected 0x0000ff00 \n " , color ) ;
2007-09-13 12:48:57 +00:00
color = getPixelColor ( device , 482 , 362 ) ;
2008-04-05 22:14:00 +00:00
ok ( ( ( ( color & 0x00ff0000 ) > > 16 ) < = 0x01 ) & & ( ( ( color & 0x0000ff00 ) > > 8 ) = = 0xff ) & & ( ( color & 0x000000ff ) < = 0x01 ) ,
" pixel 482, 362 has color %08x, expected 0x0000ff00 \n " , color ) ;
2007-09-13 12:48:57 +00:00
/* 1.3 shader */
color = getPixelColor ( device , 478 , 118 ) ;
2008-04-05 22:14:00 +00:00
ok ( ( ( ( color & 0x00ff0000 ) > > 16 ) < = 0x01 ) & & ( ( ( color & 0x0000ff00 ) > > 8 ) = = 0xff ) & & ( ( color & 0x000000ff ) < = 0x01 ) ,
" pixel 478, 118 has color %08x, expected 0x0000ff00 \n " , color ) ;
2007-09-13 12:48:57 +00:00
color = getPixelColor ( device , 482 , 118 ) ;
2008-04-05 22:14:00 +00:00
ok ( ( ( ( color & 0x00ff0000 ) > > 16 ) < = 0x01 ) & & ( ( ( color & 0x0000ff00 ) > > 8 ) = = 0xff ) & & ( ( color & 0x000000ff ) < = 0x01 ) ,
" pixel 482, 118 has color %08x, expected 0x0000ff00 \n " , color ) ;
2007-09-13 12:48:57 +00:00
color = getPixelColor ( device , 478 , 122 ) ;
2008-04-05 22:14:00 +00:00
ok ( ( ( ( color & 0x00ff0000 ) > > 16 ) < = 0x01 ) & & ( ( ( color & 0x0000ff00 ) > > 8 ) = = 0xff ) & & ( ( color & 0x000000ff ) < = 0x01 ) ,
" pixel 478, 122 has color %08x, expected 0x0000ff00 \n " , color ) ;
2007-09-13 12:48:57 +00:00
color = getPixelColor ( device , 482 , 122 ) ;
2008-04-05 22:14:00 +00:00
ok ( ( ( ( color & 0x00ff0000 ) > > 16 ) < = 0x01 ) & & ( ( ( color & 0x0000ff00 ) > > 8 ) = = 0xff ) & & ( ( color & 0x000000ff ) < = 0x01 ) ,
" pixel 482, 122 has color %08x, expected 0x0000ff00 \n " , color ) ;
2007-09-13 12:48:57 +00:00
IDirect3DPixelShader9_Release ( shader_14_coissue ) ;
IDirect3DPixelShader9_Release ( shader_13_coissue ) ;
IDirect3DPixelShader9_Release ( shader_12_coissue ) ;
IDirect3DPixelShader9_Release ( shader_11_coissue ) ;
2007-09-13 10:16:09 +00:00
IDirect3DPixelShader9_Release ( shader_14 ) ;
IDirect3DPixelShader9_Release ( shader_13 ) ;
IDirect3DPixelShader9_Release ( shader_12 ) ;
IDirect3DPixelShader9_Release ( shader_11 ) ;
}
2007-10-09 20:12:59 +00:00
static void nested_loop_test ( IDirect3DDevice9 * device ) {
const DWORD shader_code [ ] = {
0xffff0300 , /* ps_3_0 */
0x05000051 , 0xa00f0000 , 0x00000000 , 0x00000000 , 0x00000000 , 0x3f800000 , /* def c0, 0, 0, 0, 1 */
0x05000051 , 0xa00f0001 , 0x3d000000 , 0x00000000 , 0x00000000 , 0x00000000 , /* def c1, 1/32, 0, 0, 0*/
0x05000030 , 0xf00f0000 , 0x00000004 , 0x00000000 , 0x00000002 , 0x00000000 , /* defi i0, 4, 0, 2, 0 */
0x02000001 , 0x800f0000 , 0xa0e40000 , /* mov r0, c0 */
0x0200001b , 0xf0e40800 , 0xf0e40000 , /* loop aL, i0 */
0x0200001b , 0xf0e40800 , 0xf0e40000 , /* loop aL, i0 */
0x03000002 , 0x800f0000 , 0x80e40000 , 0xa0e40001 , /* add r0, r0, c1 */
0x0000001d , /* endloop */
0x0000001d , /* endloop */
0x02000001 , 0x800f0800 , 0x80e40000 , /* mov oC0, r0 */
0x0000ffff /* end */
} ;
IDirect3DPixelShader9 * shader ;
HRESULT hr ;
DWORD color ;
const float quad [ ] = {
- 1.0 , - 1.0 , 0.1 ,
1.0 , - 1.0 , 0.1 ,
- 1.0 , 1.0 , 0.1 ,
1.0 , 1.0 , 0.1
} ;
hr = IDirect3DDevice9_CreatePixelShader ( device , shader_code , & shader ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_CreatePixelShader failed with %08x \n " , hr ) ;
2007-10-09 20:12:59 +00:00
hr = IDirect3DDevice9_SetPixelShader ( device , shader ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetPixelShader failed with %08x \n " , hr ) ;
2007-10-09 20:12:59 +00:00
hr = IDirect3DDevice9_SetFVF ( device , D3DFVF_XYZ ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetFVF failed with %08x \n " , hr ) ;
2007-10-09 20:12:59 +00:00
hr = IDirect3DDevice9_Clear ( device , 0 , NULL , D3DCLEAR_TARGET , 0x0000ff00 , 0.0 , 0 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_Clear returned %08x \n " , hr ) ;
2007-10-09 20:12:59 +00:00
hr = IDirect3DDevice9_BeginScene ( device ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_BeginScene returned %08x \n " , hr ) ;
2007-10-09 20:12:59 +00:00
if ( SUCCEEDED ( hr ) )
{
hr = IDirect3DDevice9_DrawPrimitiveUP ( device , D3DPT_TRIANGLESTRIP , 2 , quad , 3 * sizeof ( float ) ) ;
ok ( hr = = D3D_OK , " DrawPrimitiveUP failed (%08x) \n " , hr ) ;
hr = IDirect3DDevice9_EndScene ( device ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_EndScene returned %08x \n " , hr ) ;
2007-10-09 20:12:59 +00:00
}
hr = IDirect3DDevice9_Present ( device , NULL , NULL , NULL , NULL ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_Present failed with %08x \n " , hr ) ;
2007-10-09 20:12:59 +00:00
color = getPixelColor ( device , 360 , 240 ) ;
ok ( color = = 0x007f0000 | | color = = 0x00800000 | | color = = 0x00810000 ,
" Nested loop test returned color 0x%08x, expected 0x00800000 \n " , color ) ;
hr = IDirect3DDevice9_SetPixelShader ( device , NULL ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetPixelShader failed with %08x \n " , hr ) ;
2007-10-09 20:12:59 +00:00
IDirect3DPixelShader9_Release ( shader ) ;
}
2007-11-06 19:33:33 +00:00
struct varying_test_struct
{
const DWORD * shader_code ;
IDirect3DPixelShader9 * shader ;
DWORD color , color_rhw ;
const char * name ;
BOOL todo , todo_rhw ;
} ;
struct hugeVertex
{
float pos_x , pos_y , pos_z , rhw ;
float weight_1 , weight_2 , weight_3 , weight_4 ;
float index_1 , index_2 , index_3 , index_4 ;
float normal_1 , normal_2 , normal_3 , normal_4 ;
float fog_1 , fog_2 , fog_3 , fog_4 ;
float texcoord_1 , texcoord_2 , texcoord_3 , texcoord_4 ;
float tangent_1 , tangent_2 , tangent_3 , tangent_4 ;
float binormal_1 , binormal_2 , binormal_3 , binormal_4 ;
float depth_1 , depth_2 , depth_3 , depth_4 ;
DWORD diffuse , specular ;
} ;
static void fixed_function_varying_test ( IDirect3DDevice9 * device ) {
/* dcl_position: fails to compile */
const DWORD blendweight_code [ ] = {
0xffff0300 , /* ps_3_0 */
0x0200001f , 0x80000001 , 0x900f0000 , /* dcl_blendweight, v0 */
0x02000001 , 0x800f0800 , 0x90e40000 , /* mov oC0, v0 */
0x0000ffff /* end */
} ;
const DWORD blendindices_code [ ] = {
0xffff0300 , /* ps_3_0 */
0x0200001f , 0x80000002 , 0x900f0000 , /* dcl_blendindices, v0 */
0x02000001 , 0x800f0800 , 0x90e40000 , /* mov oC0, v0 */
0x0000ffff /* end */
} ;
const DWORD normal_code [ ] = {
0xffff0300 , /* ps_3_0 */
0x0200001f , 0x80000003 , 0x900f0000 , /* dcl_normal, v0 */
0x02000001 , 0x800f0800 , 0x90e40000 , /* mov oC0, v0 */
0x0000ffff /* end */
} ;
/* psize: fails? */
const DWORD texcoord0_code [ ] = {
0xffff0300 , /* ps_3_0 */
0x0200001f , 0x80000005 , 0x900f0000 , /* dcl_texcoord0, v0 */
0x02000001 , 0x800f0800 , 0x90e40000 , /* mov oC0, v0 */
0x0000ffff /* end */
} ;
const DWORD tangent_code [ ] = {
0xffff0300 , /* ps_3_0 */
0x0200001f , 0x80000006 , 0x900f0000 , /* dcl_tangent, v0 */
0x02000001 , 0x800f0800 , 0x90e40000 , /* mov oC0, v0 */
0x0000ffff /* end */
} ;
const DWORD binormal_code [ ] = {
0xffff0300 , /* ps_3_0 */
0x0200001f , 0x80000007 , 0x900f0000 , /* dcl_binormal, v0 */
0x02000001 , 0x800f0800 , 0x90e40000 , /* mov oC0, v0 */
0x0000ffff /* end */
} ;
/* tessfactor: fails */
/* positiont: fails */
const DWORD color_code [ ] = {
0xffff0300 , /* ps_3_0 */
0x0200001f , 0x8000000a , 0x900f0000 , /* dcl_color0, v0 */
0x02000001 , 0x800f0800 , 0x90e40000 , /* mov oC0, v0 */
0x0000ffff /* end */
} ;
const DWORD fog_code [ ] = {
0xffff0300 , /* ps_3_0 */
0x0200001f , 0x8000000b , 0x900f0000 , /* dcl_fog, v0 */
0x02000001 , 0x800f0800 , 0x90e40000 , /* mov oC0, v0 */
0x0000ffff /* end */
} ;
const DWORD depth_code [ ] = {
0xffff0300 , /* ps_3_0 */
0x0200001f , 0x8000000c , 0x900f0000 , /* dcl_depth, v0 */
0x02000001 , 0x800f0800 , 0x90e40000 , /* mov oC0, v0 */
0x0000ffff /* end */
} ;
const DWORD specular_code [ ] = {
0xffff0300 , /* ps_3_0 */
0x0200001f , 0x8001000a , 0x900f0000 , /* dcl_color1, v0 */
0x02000001 , 0x800f0800 , 0x90e40000 , /* mov oC0, v0 */
0x0000ffff /* end */
} ;
/* sample: fails */
struct varying_test_struct tests [ ] = {
{ blendweight_code , NULL , 0x00000000 , 0x00191919 , " blendweight " , FALSE , TRUE } ,
{ blendindices_code , NULL , 0x00000000 , 0x00000000 , " blendindices " , FALSE , FALSE } ,
{ normal_code , NULL , 0x00000000 , 0x004c4c4c , " normal " , FALSE , TRUE } ,
/* Why does dx not forward the texcoord? */
{ texcoord0_code , NULL , 0x00000000 , 0x00808c8c , " texcoord0 " , FALSE , FALSE } ,
{ tangent_code , NULL , 0x00000000 , 0x00999999 , " tangent " , FALSE , TRUE } ,
{ binormal_code , NULL , 0x00000000 , 0x00b2b2b2 , " binormal " , FALSE , TRUE } ,
{ color_code , NULL , 0x00e6e6e6 , 0x00e6e6e6 , " color " , FALSE , FALSE } ,
{ fog_code , NULL , 0x00000000 , 0x00666666 , " fog " , FALSE , TRUE } ,
{ depth_code , NULL , 0x00000000 , 0x00cccccc , " depth " , FALSE , TRUE } ,
{ specular_code , NULL , 0x004488ff , 0x004488ff , " specular " , FALSE , FALSE }
} ;
/* Declare a monster vertex type :-) */
static const D3DVERTEXELEMENT9 decl_elements [ ] = {
{ 0 , 0 , D3DDECLTYPE_FLOAT3 , D3DDECLMETHOD_DEFAULT , D3DDECLUSAGE_POSITION , 0 } ,
{ 0 , 16 , D3DDECLTYPE_FLOAT4 , D3DDECLMETHOD_DEFAULT , D3DDECLUSAGE_BLENDWEIGHT , 0 } ,
{ 0 , 32 , D3DDECLTYPE_FLOAT4 , D3DDECLMETHOD_DEFAULT , D3DDECLUSAGE_BLENDINDICES , 0 } ,
{ 0 , 48 , D3DDECLTYPE_FLOAT4 , D3DDECLMETHOD_DEFAULT , D3DDECLUSAGE_NORMAL , 0 } ,
{ 0 , 64 , D3DDECLTYPE_FLOAT4 , D3DDECLMETHOD_DEFAULT , D3DDECLUSAGE_FOG , 0 } ,
{ 0 , 80 , D3DDECLTYPE_FLOAT4 , D3DDECLMETHOD_DEFAULT , D3DDECLUSAGE_TEXCOORD , 0 } ,
{ 0 , 96 , D3DDECLTYPE_FLOAT4 , D3DDECLMETHOD_DEFAULT , D3DDECLUSAGE_TANGENT , 0 } ,
{ 0 , 112 , D3DDECLTYPE_FLOAT4 , D3DDECLMETHOD_DEFAULT , D3DDECLUSAGE_BINORMAL , 0 } ,
{ 0 , 128 , D3DDECLTYPE_FLOAT4 , D3DDECLMETHOD_DEFAULT , D3DDECLUSAGE_DEPTH , 0 } ,
{ 0 , 144 , D3DDECLTYPE_D3DCOLOR , D3DDECLMETHOD_DEFAULT , D3DDECLUSAGE_COLOR , 0 } ,
{ 0 , 148 , D3DDECLTYPE_D3DCOLOR , D3DDECLMETHOD_DEFAULT , D3DDECLUSAGE_COLOR , 1 } ,
D3DDECL_END ( )
} ;
static const D3DVERTEXELEMENT9 decl_elements2 [ ] = {
{ 0 , 0 , D3DDECLTYPE_FLOAT4 , D3DDECLMETHOD_DEFAULT , D3DDECLUSAGE_POSITIONT , 0 } ,
{ 0 , 16 , D3DDECLTYPE_FLOAT4 , D3DDECLMETHOD_DEFAULT , D3DDECLUSAGE_BLENDWEIGHT , 0 } ,
{ 0 , 32 , D3DDECLTYPE_FLOAT4 , D3DDECLMETHOD_DEFAULT , D3DDECLUSAGE_BLENDINDICES , 0 } ,
{ 0 , 48 , D3DDECLTYPE_FLOAT4 , D3DDECLMETHOD_DEFAULT , D3DDECLUSAGE_NORMAL , 0 } ,
{ 0 , 64 , D3DDECLTYPE_FLOAT4 , D3DDECLMETHOD_DEFAULT , D3DDECLUSAGE_FOG , 0 } ,
{ 0 , 80 , D3DDECLTYPE_FLOAT4 , D3DDECLMETHOD_DEFAULT , D3DDECLUSAGE_TEXCOORD , 0 } ,
{ 0 , 96 , D3DDECLTYPE_FLOAT4 , D3DDECLMETHOD_DEFAULT , D3DDECLUSAGE_TANGENT , 0 } ,
{ 0 , 112 , D3DDECLTYPE_FLOAT4 , D3DDECLMETHOD_DEFAULT , D3DDECLUSAGE_BINORMAL , 0 } ,
{ 0 , 128 , D3DDECLTYPE_FLOAT4 , D3DDECLMETHOD_DEFAULT , D3DDECLUSAGE_DEPTH , 0 } ,
{ 0 , 144 , D3DDECLTYPE_D3DCOLOR , D3DDECLMETHOD_DEFAULT , D3DDECLUSAGE_COLOR , 0 } ,
{ 0 , 148 , D3DDECLTYPE_D3DCOLOR , D3DDECLMETHOD_DEFAULT , D3DDECLUSAGE_COLOR , 1 } ,
D3DDECL_END ( )
} ;
struct hugeVertex data [ 4 ] = {
{
- 1.0 , - 1.0 , 0.1 , 1.0 ,
0.1 , 0.1 , 0.1 , 0.1 ,
0.2 , 0.2 , 0.2 , 0.2 ,
0.3 , 0.3 , 0.3 , 0.3 ,
0.4 , 0.4 , 0.4 , 0.4 ,
0.50 , 0.55 , 0.55 , 0.55 ,
0.6 , 0.6 , 0.6 , 0.7 ,
0.7 , 0.7 , 0.7 , 0.6 ,
0.8 , 0.8 , 0.8 , 0.8 ,
0xe6e6e6e6 , /* 0.9 * 256 */
0x224488ff /* Nothing special */
} ,
{
1.0 , - 1.0 , 0.1 , 1.0 ,
0.1 , 0.1 , 0.1 , 0.1 ,
0.2 , 0.2 , 0.2 , 0.2 ,
0.3 , 0.3 , 0.3 , 0.3 ,
0.4 , 0.4 , 0.4 , 0.4 ,
0.50 , 0.55 , 0.55 , 0.55 ,
0.6 , 0.6 , 0.6 , 0.7 ,
0.7 , 0.7 , 0.7 , 0.6 ,
0.8 , 0.8 , 0.8 , 0.8 ,
0xe6e6e6e6 , /* 0.9 * 256 */
0x224488ff /* Nothing special */
} ,
{
- 1.0 , 1.0 , 0.1 , 1.0 ,
0.1 , 0.1 , 0.1 , 0.1 ,
0.2 , 0.2 , 0.2 , 0.2 ,
0.3 , 0.3 , 0.3 , 0.3 ,
0.4 , 0.4 , 0.4 , 0.4 ,
0.50 , 0.55 , 0.55 , 0.55 ,
0.6 , 0.6 , 0.6 , 0.7 ,
0.7 , 0.7 , 0.7 , 0.6 ,
0.8 , 0.8 , 0.8 , 0.8 ,
0xe6e6e6e6 , /* 0.9 * 256 */
0x224488ff /* Nothing special */
} ,
{
1.0 , 1.0 , 0.1 , 1.0 ,
0.1 , 0.1 , 0.1 , 0.1 ,
0.2 , 0.2 , 0.2 , 0.2 ,
0.3 , 0.3 , 0.3 , 0.3 ,
0.4 , 0.4 , 0.4 , 0.4 ,
0.50 , 0.55 , 0.55 , 0.55 ,
0.6 , 0.6 , 0.6 , 0.7 ,
0.7 , 0.7 , 0.7 , 0.6 ,
0.8 , 0.8 , 0.8 , 0.8 ,
0xe6e6e6e6 , /* 0.9 * 256 */
0x224488ff /* Nothing special */
} ,
} ;
struct hugeVertex data2 [ 4 ] ;
IDirect3DVertexDeclaration9 * decl ;
IDirect3DVertexDeclaration9 * decl2 ;
HRESULT hr ;
unsigned int i ;
DWORD color , r , g , b , r_e , g_e , b_e ;
2008-04-07 12:07:22 +00:00
BOOL drawok ;
2007-11-06 19:33:33 +00:00
memcpy ( data2 , data , sizeof ( data2 ) ) ;
data2 [ 0 ] . pos_x = 0 ; data2 [ 0 ] . pos_y = 0 ;
data2 [ 1 ] . pos_x = 640 ; data2 [ 1 ] . pos_y = 0 ;
data2 [ 2 ] . pos_x = 0 ; data2 [ 2 ] . pos_y = 480 ;
data2 [ 3 ] . pos_x = 640 ; data2 [ 3 ] . pos_y = 480 ;
hr = IDirect3DDevice9_CreateVertexDeclaration ( device , decl_elements , & decl ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_CreateVertexDeclaration returned %08x \n " , hr ) ;
2007-11-06 19:33:33 +00:00
hr = IDirect3DDevice9_CreateVertexDeclaration ( device , decl_elements2 , & decl2 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_CreateVertexDeclaration returned %08x \n " , hr ) ;
2007-11-06 19:33:33 +00:00
hr = IDirect3DDevice9_SetVertexDeclaration ( device , decl ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetVertexDeclaration returned %08x \n " , hr ) ;
2007-11-06 19:33:33 +00:00
for ( i = 0 ; i < sizeof ( tests ) / sizeof ( tests [ 0 ] ) ; i + + )
{
hr = IDirect3DDevice9_CreatePixelShader ( device , tests [ i ] . shader_code , & tests [ i ] . shader ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_CreatePixelShader failed for shader %s, hr = %08x \n " ,
tests [ i ] . name , hr ) ;
2007-11-06 19:33:33 +00:00
}
for ( i = 0 ; i < sizeof ( tests ) / sizeof ( tests [ 0 ] ) ; i + + )
{
hr = IDirect3DDevice9_Clear ( device , 0 , NULL , D3DCLEAR_TARGET , 0xffffffff , 0.0 , 0 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_Clear returned %08x \n " , hr ) ;
2007-11-06 19:33:33 +00:00
IDirect3DDevice9_SetPixelShader ( device , tests [ i ] . shader ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetPixelShader returned %08x \n " , hr ) ;
2007-11-06 19:33:33 +00:00
hr = IDirect3DDevice9_BeginScene ( device ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_BeginScene returned %08x \n " , hr ) ;
2008-04-07 12:07:22 +00:00
drawok = FALSE ;
2007-11-06 19:33:33 +00:00
if ( SUCCEEDED ( hr ) )
{
hr = IDirect3DDevice9_DrawPrimitiveUP ( device , D3DPT_TRIANGLESTRIP , 2 , data , sizeof ( data [ 0 ] ) ) ;
2008-04-07 12:07:22 +00:00
ok ( hr = = D3D_OK | | hr = = D3DERR_INVALIDCALL , " DrawPrimitiveUP failed (%08x) \n " , hr ) ;
drawok = SUCCEEDED ( hr ) ;
2007-11-06 19:33:33 +00:00
hr = IDirect3DDevice9_EndScene ( device ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_EndScene returned %08x \n " , hr ) ;
2007-11-06 19:33:33 +00:00
}
hr = IDirect3DDevice9_Present ( device , NULL , NULL , NULL , NULL ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_Present failed with %08x \n " , hr ) ;
2007-11-06 19:33:33 +00:00
2008-04-07 12:07:22 +00:00
/* Some drivers reject the combination of ps_3_0 and fixed function vertex processing. Accept
* the failure and do not check the color if it failed
*/
if ( ! drawok ) {
continue ;
}
2007-11-06 19:33:33 +00:00
color = getPixelColor ( device , 360 , 240 ) ;
r = color & 0x00ff0000 > > 16 ;
g = color & 0x0000ff00 > > 8 ;
b = color & 0x000000ff ;
r_e = tests [ i ] . color & 0x00ff0000 > > 16 ;
g_e = tests [ i ] . color & 0x0000ff00 > > 8 ;
b_e = tests [ i ] . color & 0x000000ff ;
if ( tests [ i ] . todo ) {
todo_wine ok ( abs ( r - r_e ) < = 1 & & abs ( g - g_e ) < = 1 & & abs ( b - b_e ) < = 1 ,
" Test %s returned color 0x%08x, expected 0x%08x(todo) \n " ,
tests [ i ] . name , color , tests [ i ] . color ) ;
} else {
ok ( abs ( r - r_e ) < = 1 & & abs ( g - g_e ) < = 1 & & abs ( b - b_e ) < = 1 ,
" Test %s returned color 0x%08x, expected 0x%08x \n " ,
tests [ i ] . name , color , tests [ i ] . color ) ;
}
}
hr = IDirect3DDevice9_SetVertexDeclaration ( device , decl2 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetVertexDeclaration returned %08x \n " , hr ) ;
2007-11-06 19:33:33 +00:00
for ( i = 0 ; i < sizeof ( tests ) / sizeof ( tests [ 0 ] ) ; i + + )
{
hr = IDirect3DDevice9_Clear ( device , 0 , NULL , D3DCLEAR_TARGET , 0xffffffff , 0.0 , 0 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_Clear returned %08x \n " , hr ) ;
2007-11-06 19:33:33 +00:00
IDirect3DDevice9_SetPixelShader ( device , tests [ i ] . shader ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetPixelShader returned %08x \n " , hr ) ;
2007-11-06 19:33:33 +00:00
hr = IDirect3DDevice9_BeginScene ( device ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_BeginScene returned %08x \n " , hr ) ;
2007-11-06 19:33:33 +00:00
if ( SUCCEEDED ( hr ) )
{
hr = IDirect3DDevice9_DrawPrimitiveUP ( device , D3DPT_TRIANGLESTRIP , 2 , data2 , sizeof ( data2 [ 0 ] ) ) ;
ok ( hr = = D3D_OK , " DrawPrimitiveUP failed (%08x) \n " , hr ) ;
hr = IDirect3DDevice9_EndScene ( device ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_EndScene returned %08x \n " , hr ) ;
2007-11-06 19:33:33 +00:00
}
hr = IDirect3DDevice9_Present ( device , NULL , NULL , NULL , NULL ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_Present failed with %08x \n " , hr ) ;
2007-11-06 19:33:33 +00:00
color = getPixelColor ( device , 360 , 240 ) ;
r = color & 0x00ff0000 > > 16 ;
g = color & 0x0000ff00 > > 8 ;
b = color & 0x000000ff ;
r_e = tests [ i ] . color_rhw & 0x00ff0000 > > 16 ;
g_e = tests [ i ] . color_rhw & 0x0000ff00 > > 8 ;
b_e = tests [ i ] . color_rhw & 0x000000ff ;
if ( tests [ i ] . todo_rhw ) {
/* This isn't a weekend's job to fix, ignore the problem for now. Needs a replacement
* pipeline
*/
todo_wine ok ( abs ( r - r_e ) < = 1 & & abs ( g - g_e ) < = 1 & & abs ( b - b_e ) < = 1 ,
" Test %s returned color 0x%08x, expected 0x%08x(todo) \n " ,
tests [ i ] . name , color , tests [ i ] . color_rhw ) ;
} else {
ok ( abs ( r - r_e ) < = 1 & & abs ( g - g_e ) < = 1 & & abs ( b - b_e ) < = 1 ,
" Test %s returned color 0x%08x, expected 0x%08x \n " ,
tests [ i ] . name , color , tests [ i ] . color_rhw ) ;
}
}
for ( i = 0 ; i < sizeof ( tests ) / sizeof ( tests [ 0 ] ) ; i + + )
{
IDirect3DPixelShader9_Release ( tests [ i ] . shader ) ;
}
IDirect3DVertexDeclaration9_Release ( decl2 ) ;
IDirect3DVertexDeclaration9_Release ( decl ) ;
}
static void vshader_version_varying_test ( IDirect3DDevice9 * device ) {
static const DWORD ps_code [ ] = {
0xffff0300 , /* ps_3_0 */
0x05000030 , 0xf00f0000 , 0x00000003 , 0x00000003 , 0x00000001 , 0x00000000 , /* defi i0, 3, 3, 1, 0 */
0x05000051 , 0xa00f0000 , 0x00000000 , 0x00000000 , 0x00000000 , 0x00000000 , /* def c0, 0.0, 0.0, 0.0, 0.0 */
0x0200001f , 0x8001000a , 0x900f0003 , /* dcl_color1 v3 */
0x0200001f , 0x8000000b , 0x900f0004 , /* dcl_fog v4 */
0x0200001f , 0x80030005 , 0x900f0005 , /* dcl_texcoord3 v5 */
2008-07-17 20:42:00 +00:00
0x0200001f , 0x80000003 , 0x900f0006 , /* dcl_normal v6 */
0x0200001f , 0x80000006 , 0x900f0007 , /* dcl_tangent v7 */
0x0200001f , 0x80000001 , 0x900f0008 , /* dcl_blendweight v8 */
0x0200001f , 0x8000000c , 0x900f0009 , /* dcl_depth v9 */
2007-11-06 19:33:33 +00:00
0x02000001 , 0x800f0000 , 0xa0e40000 , /* mov r0, c0 */
0x0200001b , 0xf0e40800 , 0xf0e40000 , /* loop aL, i0 */
0x04000002 , 0x800f0000 , 0x80e40000 , 0x90e42000 , 0xf0e40800 , /* add r0, r0, v0[aL] */
0x0000001d , /* endloop */
0x02000001 , 0x800f0800 , 0x80e40000 , /* mov oC0, r0 */
0x0000ffff /* end */
} ;
static const DWORD vs_1_code [ ] = {
0xfffe0101 , /* vs_1_1 */
0x0000001f , 0x80000000 , 0x900f0000 , /* dcl_position v0 */
0x00000051 , 0xa00f0000 , 0x3dcccccd , 0x00000000 , 0x00000000 , 0x00000000 , /* def c0, 0.1, 0.0, 0.0, 0.0 */
0x00000051 , 0xa00f0001 , 0x00000000 , 0x3e4ccccd , 0x00000000 , 0x00000000 , /* def c1, 0.0, 0.2, 0.0, 0.0 */
0x00000051 , 0xa00f0002 , 0x00000000 , 0x00000000 , 0x3ecccccd , 0x00000000 , /* def c2, 0.0, 0.0, 0.4, 0.0 */
0x00000051 , 0xa00f0003 , 0x3f800000 , 0x3f800000 , 0x3f800000 , 0x3f800000 , /* def c3, 1.0, 1.0, 1.0, 1.0 */
0x00000001 , 0xd00f0000 , 0xa0e40002 , /* mov oD0, c2 */
0x00000001 , 0xd00f0001 , 0xa0e40000 , /* mov oD1, c0 */
0x00000001 , 0xc00f0001 , 0xa0550001 , /* mov oFog, c1.g */
0x00000001 , 0xe00f0000 , 0xa0e40003 , /* mov oT0, c3 */
0x00000001 , 0xe00f0001 , 0xa0e40003 , /* mov oT1, c3 */
0x00000001 , 0xe00f0002 , 0xa0e40003 , /* mov oT2, c3 */
0x00000001 , 0xe00f0003 , 0xa0e40002 , /* mov oT3, c2 */
0x00000001 , 0xe00f0004 , 0xa0e40003 , /* mov oT4, c3 */
0x00000001 , 0xe00f0005 , 0xa0e40003 , /* mov oT5, c3 */
0x00000001 , 0xe00f0006 , 0xa0e40003 , /* mov oT6, c3 */
0x00000001 , 0xe00f0007 , 0xa0e40003 , /* mov oT7, c3 */
0x00000001 , 0xc00f0000 , 0x90e40000 , /* mov oPos, v0 */
0x0000ffff
} ;
DWORD vs_2_code [ ] = {
0xfffe0200 , /* vs_2_0 */
0x0200001f , 0x80000000 , 0x900f0000 , /* dcl_position v0 */
2008-07-17 20:42:00 +00:00
0x05000051 , 0xa00f0000 , 0x3dcccccd , 0x00000000 , 0x00000000 , 0x00000000 , /* def c0, 0.1, 0.0, 0.0, 0.0 */
0x05000051 , 0xa00f0001 , 0x00000000 , 0x3e4ccccd , 0x00000000 , 0x00000000 , /* def c1, 0.0, 0.2, 0.0, 0.0 */
0x05000051 , 0xa00f0002 , 0x00000000 , 0x00000000 , 0x3ecccccd , 0x00000000 , /* def c2, 0.0, 0.0, 0.4, 0.0 */
2007-11-06 19:33:33 +00:00
0x05000051 , 0xa00f0003 , 0x3f800000 , 0x3f800000 , 0x3f800000 , 0x3f800000 , /* def c3, 1.0, 1.0, 1.0, 1.0 */
0x02000001 , 0xd00f0000 , 0xa0e40002 , /* mov oD0, c2 */
0x02000001 , 0xd00f0001 , 0xa0e40000 , /* mov oD1, c0 */
0x02000001 , 0xc00f0001 , 0xa0550001 , /* mov oFog, c1.g */
0x02000001 , 0xe00f0000 , 0xa0e40003 , /* mov oT0, c3 */
0x02000001 , 0xe00f0001 , 0xa0e40003 , /* mov oT1, c3 */
0x02000001 , 0xe00f0002 , 0xa0e40003 , /* mov oT2, c3 */
0x02000001 , 0xe00f0003 , 0xa0e40002 , /* mov oT3, c2 */
0x02000001 , 0xe00f0004 , 0xa0e40003 , /* mov oT4, c3 */
0x02000001 , 0xe00f0005 , 0xa0e40003 , /* mov oT5, c3 */
0x02000001 , 0xe00f0006 , 0xa0e40003 , /* mov oT6, c3 */
0x02000001 , 0xe00f0007 , 0xa0e40003 , /* mov oT7, c3 */
0x02000001 , 0xc00f0000 , 0x90e40000 , /* mov oPos, v0 */
0x0000ffff /* end */
} ;
/* TODO: Define normal, tangent, blendweight and depth here */
static const DWORD vs_3_code [ ] = {
0xfffe0300 , /* vs_3_0 */
0x0200001f , 0x80000000 , 0x900f0000 , /* dcl_position v0 */
0x0200001f , 0x8001000a , 0xe00f0009 , /* dcl_color1 o9 */
0x0200001f , 0x8000000b , 0xe00f0002 , /* dcl_fog o2 */
0x0200001f , 0x80030005 , 0xe00f0005 , /* dcl_texcoord3 o5 */
0x0200001f , 0x80000000 , 0xe00f000b , /* dcl_position o11 */
0x05000051 , 0xa00f0000 , 0x3dcccccd , 0x00000000 , 0x00000000 , 0x00000000 , /* def c0, 0.1, 0.0, 0.0, 0.0 */
0x05000051 , 0xa00f0001 , 0x00000000 , 0x3e4ccccd , 0x00000000 , 0x00000000 , /* def c1, 0.0, 0.2, 0.0, 0.0 */
0x05000051 , 0xa00f0002 , 0x00000000 , 0x00000000 , 0x3ecccccd , 0x00000000 , /* def c2, 0.0, 0.0, 0.4, 0.0 */
0x05000051 , 0xa00f0003 , 0x3f800000 , 0x3f800000 , 0x3f800000 , 0x3f800000 , /* def c3, 1.0, 1.0, 1.0, 1.0 */
0x02000001 , 0xe00f0009 , 0xa0e40000 , /* mov o9, c0 */
0x02000001 , 0xe00f0002 , 0xa0e40001 , /* mov o2, c1 */
0x02000001 , 0xe00f0005 , 0xa0e40002 , /* mov o5, c2 */
0x02000001 , 0xe00f000b , 0x90e40000 , /* mov o11, v0 */
0x0000ffff /* end */
} ;
float quad1 [ ] = {
- 1.0 , - 1.0 , 0.1 ,
0.0 , - 1.0 , 0.1 ,
- 1.0 , 0.0 , 0.1 ,
0.0 , 0.0 , 0.1
} ;
float quad2 [ ] = {
0.0 , - 1.0 , 0.1 ,
1.0 , - 1.0 , 0.1 ,
0.0 , 0.0 , 0.1 ,
1.0 , 0.0 , 0.1
} ;
float quad3 [ ] = {
- 1.0 , 0.0 , 0.1 ,
0.0 , 0.0 , 0.1 ,
- 1.0 , 1.0 , 0.1 ,
0.0 , 1.0 , 0.1
} ;
HRESULT hr ;
DWORD color ;
IDirect3DPixelShader9 * pixelshader = NULL ;
IDirect3DVertexShader9 * vs_1_shader = NULL ;
IDirect3DVertexShader9 * vs_2_shader = NULL ;
IDirect3DVertexShader9 * vs_3_shader = NULL ;
hr = IDirect3DDevice9_Clear ( device , 0 , NULL , D3DCLEAR_TARGET , 0xff110000 , 0.0 , 0 ) ;
hr = IDirect3DDevice9_CreatePixelShader ( device , ps_code , & pixelshader ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice_CreatePixelShader returned %08x \n " , hr ) ;
2007-11-06 19:33:33 +00:00
hr = IDirect3DDevice9_CreateVertexShader ( device , vs_1_code , & vs_1_shader ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_CreateVertexShader returned %08x \n " , hr ) ;
2007-11-06 19:33:33 +00:00
hr = IDirect3DDevice9_CreateVertexShader ( device , vs_2_code , & vs_2_shader ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_CreateVertexShader returned %08x \n " , hr ) ;
2007-11-06 19:33:33 +00:00
hr = IDirect3DDevice9_CreateVertexShader ( device , vs_3_code , & vs_3_shader ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_CreateVertexShader returned %08x \n " , hr ) ;
2007-11-06 19:33:33 +00:00
hr = IDirect3DDevice9_SetPixelShader ( device , pixelshader ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetPixelShader returned %08x \n " , hr ) ;
2007-11-06 19:33:33 +00:00
IDirect3DDevice9_SetFVF ( device , D3DFVF_XYZ ) ;
hr = IDirect3DDevice9_BeginScene ( device ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_BeginScene returned %08x \n " , hr ) ;
2007-11-06 19:33:33 +00:00
if ( SUCCEEDED ( hr ) )
{
hr = IDirect3DDevice9_SetVertexShader ( device , vs_1_shader ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetVertexShader returned %08x \n " , hr ) ;
2007-11-06 19:33:33 +00:00
hr = IDirect3DDevice9_DrawPrimitiveUP ( device , D3DPT_TRIANGLESTRIP , 2 , quad1 , sizeof ( float ) * 3 ) ;
ok ( hr = = D3D_OK , " DrawPrimitiveUP failed (%08x) \n " , hr ) ;
hr = IDirect3DDevice9_SetVertexShader ( device , vs_2_shader ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetVertexShader returned %08x \n " , hr ) ;
2007-11-06 19:33:33 +00:00
hr = IDirect3DDevice9_DrawPrimitiveUP ( device , D3DPT_TRIANGLESTRIP , 2 , quad2 , sizeof ( float ) * 3 ) ;
ok ( hr = = D3D_OK , " DrawPrimitiveUP failed (%08x) \n " , hr ) ;
hr = IDirect3DDevice9_SetVertexShader ( device , vs_3_shader ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetVertexShader returned %08x \n " , hr ) ;
2007-11-06 19:33:33 +00:00
hr = IDirect3DDevice9_DrawPrimitiveUP ( device , D3DPT_TRIANGLESTRIP , 2 , quad3 , sizeof ( float ) * 3 ) ;
ok ( hr = = D3D_OK , " DrawPrimitiveUP failed (%08x) \n " , hr ) ;
hr = IDirect3DDevice9_EndScene ( device ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_EndScene returned %08x \n " , hr ) ;
2007-11-06 19:33:33 +00:00
}
hr = IDirect3DDevice9_Present ( device , NULL , NULL , NULL , NULL ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_Present failed with %08x \n " , hr ) ;
2007-11-06 19:33:33 +00:00
color = getPixelColor ( device , 160 , 120 ) ;
2008-07-16 20:45:51 +00:00
ok ( color_match ( color , D3DCOLOR_ARGB ( 0x00 , 0x1a , 0x34 , 0x67 ) , 1 ) ,
" vs_3_0 returned color 0x%08x, expected 0x00193366 \n " , color ) ;
2007-11-06 19:33:33 +00:00
color = getPixelColor ( device , 160 , 360 ) ;
2008-07-16 20:45:51 +00:00
ok ( color_match ( color , D3DCOLOR_ARGB ( 0x00 , 0x4d , 0x00 , 0x67 ) , 1 ) ,
2008-04-05 14:03:56 +00:00
" vs_1_1 returned color 0x%08x, expected 0x004c0066 \n " , color ) ;
2007-11-06 19:33:33 +00:00
color = getPixelColor ( device , 480 , 360 ) ;
2008-07-16 20:45:51 +00:00
ok ( color_match ( color , D3DCOLOR_ARGB ( 0x00 , 0x4d , 0x00 , 0x67 ) , 1 ) ,
2008-04-05 14:03:56 +00:00
" vs_2_0 returned color 0x%08x, expected 0x004c0066 \n " , color ) ;
2007-11-06 19:33:33 +00:00
/* cleanup */
hr = IDirect3DDevice9_SetPixelShader ( device , NULL ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetPixelShader returned %08x \n " , hr ) ;
2007-11-06 19:33:33 +00:00
hr = IDirect3DDevice9_SetVertexShader ( device , NULL ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetVertexShader returned %08x \n " , hr ) ;
2007-11-06 19:33:33 +00:00
if ( pixelshader ) IDirect3DPixelShader9_Release ( pixelshader ) ;
if ( vs_1_shader ) IDirect3DVertexShader9_Release ( vs_1_shader ) ;
if ( vs_2_shader ) IDirect3DVertexShader9_Release ( vs_2_shader ) ;
if ( vs_3_shader ) IDirect3DVertexShader9_Release ( vs_3_shader ) ;
}
static void pshader_version_varying_test ( IDirect3DDevice9 * device ) {
static const DWORD vs_code [ ] = {
0xfffe0300 , /* vs_3_0 */
0x0200001f , 0x80000000 , 0x900f0000 , /* dcl_position v0 */
0x0200001f , 0x80000000 , 0xe00f0000 , /* dcl_position o0 */
0x0200001f , 0x8000000a , 0xe00f0001 , /* dcl_color0 o1 */
0x0200001f , 0x80000005 , 0xe00f0002 , /* dcl_texcoord0 o2 */
0x0200001f , 0x8000000b , 0xe00f0003 , /* dcl_fog o3 */
0x0200001f , 0x80000003 , 0xe00f0004 , /* dcl_normal o4 */
0x0200001f , 0x8000000c , 0xe00f0005 , /* dcl_depth o5 */
0x0200001f , 0x80000006 , 0xe00f0006 , /* dcl_tangent o6 */
0x0200001f , 0x80000001 , 0xe00f0007 , /* dcl_blendweight o7 */
0x05000051 , 0xa00f0001 , 0x3dcccccd , 0x00000000 , 0x00000000 , 0x00000000 , /* def c1, 0.1, 0.0, 0.0, 0.0 */
0x05000051 , 0xa00f0002 , 0x00000000 , 0x3e4ccccd , 0x00000000 , 0x3f800000 , /* def c2, 0.0, 0.2, 0.0, 1.0 */
0x05000051 , 0xa00f0003 , 0x3ecccccd , 0x3f59999a , 0x3f666666 , 0x00000000 , /* def c3, 0.4, 0.85,0.9, 0.0 */
0x05000051 , 0xa00f0000 , 0x3f800000 , 0x3f800000 , 0x3f800000 , 0x3f800000 , /* def c0, 1.0, 1.0, 1.0, 1.0 */
0x02000001 , 0xe00f0000 , 0x90e40000 , /* mov o0, v0 */
0x02000001 , 0xe00f0001 , 0xa0e40001 , /* mov o1, c1 */
0x02000001 , 0xe00f0002 , 0xa0e40002 , /* mov o2, c2 */
0x02000001 , 0xe00f0003 , 0xa0e40003 , /* mov o3, c3 */
0x02000001 , 0xe00f0004 , 0xa0e40000 , /* mov o4, c0 */
0x02000001 , 0xe00f0005 , 0xa0e40000 , /* mov o5, c0 */
0x02000001 , 0xe00f0006 , 0xa0e40000 , /* mov o6, c0 */
0x02000001 , 0xe00f0007 , 0xa0e40000 , /* mov o7, c0 */
0x0000ffff /* end */
} ;
static const DWORD ps_1_code [ ] = {
0xffff0104 , /* ps_1_4 */
0x00000051 , 0xa00f0000 , 0x00000000 , 0x00000000 , 0x00000000 , 0x00000000 , /* def c0, 0.0, 0.0, 0.0, 0.0 */
0x00000040 , 0x80070001 , 0xb0e40000 , /* texcrd r1.xyz, t0 */
0x00000001 , 0x80080001 , 0xa0ff0000 , /* mov r1.a, c0.a */
0x00000002 , 0x800f0000 , 0x90e40000 , 0x80e40001 , /* add r0, v0, r1 */
0x0000ffff /* end */
} ;
static const DWORD ps_2_code [ ] = {
0xffff0200 , /* ps_2_0 */
0x0200001f , 0x80000000 , 0xb00f0000 , /* dcl t0 */
0x0200001f , 0x80000000 , 0x900f0000 , /* dcl v0 */
0x0200001f , 0x80000000 , 0x900f0001 , /* dcl v1 */
0x02000001 , 0x800f0000 , 0x90e40000 , /* mov r0, v0 */
0x03000002 , 0x800f0000 , 0x80e40000 , 0xb0e40000 , /* add r0, r0, t0 */
0x02000001 , 0x800f0800 , 0x80e40000 , /* mov oC0, r0 */
0x0000ffff /* end */
} ;
static const DWORD ps_3_code [ ] = {
0xffff0300 , /* ps_3_0 */
0x0200001f , 0x80000005 , 0x900f0000 , /* dcl_texcoord0 v0 */
0x0200001f , 0x8000000a , 0x900f0001 , /* dcl_color0 v1 */
0x0200001f , 0x8000000b , 0x900f0002 , /* dcl_fog v2 */
0x02000001 , 0x800f0000 , 0x90e40000 , /* mov r0, v0 */
0x03000002 , 0x800f0000 , 0x80e40000 , 0x90e40001 , /* add r0, r0, v1 */
0x03000002 , 0x800f0000 , 0x80e40000 , 0x90e40002 , /* mov r0, r0, v2 */
0x02000001 , 0x800f0800 , 0x80e40000 , /* mov oC0, r0 */
0x0000ffff /* end */
} ;
float quad1 [ ] = {
- 1.0 , - 1.0 , 0.1 ,
0.0 , - 1.0 , 0.1 ,
- 1.0 , 0.0 , 0.1 ,
0.0 , 0.0 , 0.1
} ;
float quad2 [ ] = {
0.0 , - 1.0 , 0.1 ,
1.0 , - 1.0 , 0.1 ,
0.0 , 0.0 , 0.1 ,
1.0 , 0.0 , 0.1
} ;
float quad3 [ ] = {
- 1.0 , 0.0 , 0.1 ,
0.0 , 0.0 , 0.1 ,
- 1.0 , 1.0 , 0.1 ,
0.0 , 1.0 , 0.1
} ;
float quad4 [ ] = {
0.0 , 0.0 , 0.1 ,
1.0 , 0.0 , 0.1 ,
0.0 , 1.0 , 0.1 ,
1.0 , 1.0 , 0.1
} ;
HRESULT hr ;
DWORD color ;
IDirect3DVertexShader9 * vertexshader = NULL ;
IDirect3DPixelShader9 * ps_1_shader = NULL ;
IDirect3DPixelShader9 * ps_2_shader = NULL ;
IDirect3DPixelShader9 * ps_3_shader = NULL ;
IDirect3DTexture9 * texture = NULL ;
D3DLOCKED_RECT lr ;
unsigned int x , y ;
hr = IDirect3DDevice9_Clear ( device , 0 , NULL , D3DCLEAR_TARGET , 0xffffff00 , 0.0 , 0 ) ;
hr = IDirect3DDevice9_CreateTexture ( device , 512 , 512 , 1 , 0 , D3DFMT_A16B16G16R16 , D3DPOOL_MANAGED , & texture , NULL ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_CreateTexture returned %08x \n " , hr ) ;
2008-07-31 20:31:44 +00:00
if ( FAILED ( hr ) ) {
skip ( " D3DFMT_A16B16G16R16 textures not supported \n " ) ;
return ;
}
2007-11-06 19:33:33 +00:00
hr = IDirect3DTexture9_LockRect ( texture , 0 , & lr , NULL , 0 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DTexture9_LockRect returned %08x \n " , hr ) ;
2007-11-06 19:33:33 +00:00
for ( y = 0 ; y < 512 ; y + + ) {
for ( x = 0 ; x < 512 ; x + + ) {
double r_f = ( double ) x / ( double ) 512 ;
double g_f = ( double ) y / ( double ) 512 ;
unsigned short * dst = ( unsigned short * ) ( ( ( unsigned char * ) lr . pBits ) + y * lr . Pitch + x * 8 ) ;
unsigned short r = ( unsigned short ) ( r_f * 65535.0 ) ;
unsigned short g = ( unsigned short ) ( g_f * 65535.0 ) ;
dst [ 0 ] = r ;
dst [ 1 ] = g ;
dst [ 2 ] = 0 ;
dst [ 3 ] = 65535 ;
}
}
hr = IDirect3DTexture9_UnlockRect ( texture , 0 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DTexture9_UnlockRect returned %08x \n " , hr ) ;
2007-11-06 19:33:33 +00:00
hr = IDirect3DDevice9_CreateVertexShader ( device , vs_code , & vertexshader ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_CreateVertexShader returned %08x \n " , hr ) ;
2007-11-06 19:33:33 +00:00
hr = IDirect3DDevice9_CreatePixelShader ( device , ps_1_code , & ps_1_shader ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_CreatePixelShader returned %08x \n " , hr ) ;
2007-11-06 19:33:33 +00:00
hr = IDirect3DDevice9_CreatePixelShader ( device , ps_2_code , & ps_2_shader ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_CreatePixelShader returned %08x \n " , hr ) ;
2007-11-06 19:33:33 +00:00
hr = IDirect3DDevice9_CreatePixelShader ( device , ps_3_code , & ps_3_shader ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_CreatePixelShader returned %08x \n " , hr ) ;
2007-11-06 19:33:33 +00:00
hr = IDirect3DDevice9_SetVertexShader ( device , vertexshader ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetVertexShader returned %08x \n " , hr ) ;
2007-11-06 19:33:33 +00:00
IDirect3DDevice9_SetFVF ( device , D3DFVF_XYZ ) ;
hr = IDirect3DDevice9_BeginScene ( device ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_BeginScene returned %08x \n " , hr ) ;
2007-11-06 19:33:33 +00:00
if ( SUCCEEDED ( hr ) )
{
hr = IDirect3DDevice9_SetPixelShader ( device , ps_1_shader ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetPixelShader returned %08x \n " , hr ) ;
2007-11-06 19:33:33 +00:00
hr = IDirect3DDevice9_DrawPrimitiveUP ( device , D3DPT_TRIANGLESTRIP , 2 , quad1 , sizeof ( float ) * 3 ) ;
ok ( hr = = D3D_OK , " DrawPrimitiveUP failed (%08x) \n " , hr ) ;
hr = IDirect3DDevice9_SetPixelShader ( device , ps_2_shader ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetPixelShader returned %08x \n " , hr ) ;
2007-11-06 19:33:33 +00:00
hr = IDirect3DDevice9_DrawPrimitiveUP ( device , D3DPT_TRIANGLESTRIP , 2 , quad2 , sizeof ( float ) * 3 ) ;
ok ( hr = = D3D_OK , " DrawPrimitiveUP failed (%08x) \n " , hr ) ;
hr = IDirect3DDevice9_SetPixelShader ( device , ps_3_shader ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetPixelShader returned %08x \n " , hr ) ;
2007-11-06 19:33:33 +00:00
hr = IDirect3DDevice9_DrawPrimitiveUP ( device , D3DPT_TRIANGLESTRIP , 2 , quad3 , sizeof ( float ) * 3 ) ;
ok ( hr = = D3D_OK , " DrawPrimitiveUP failed (%08x) \n " , hr ) ;
hr = IDirect3DDevice9_SetPixelShader ( device , NULL ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetPixelShader returned %08x \n " , hr ) ;
2007-11-06 19:33:33 +00:00
hr = IDirect3DDevice9_SetTexture ( device , 0 , ( IDirect3DBaseTexture9 * ) texture ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetTexture returned %08x \n " , hr ) ;
2007-11-06 19:33:33 +00:00
hr = IDirect3DDevice9_SetTextureStageState ( device , 1 , D3DTSS_COLOROP , D3DTOP_DISABLE ) ;
hr = IDirect3DDevice9_SetTextureStageState ( device , 0 , D3DTSS_COLOROP , D3DTOP_ADD ) ;
hr = IDirect3DDevice9_SetTextureStageState ( device , 0 , D3DTSS_COLORARG1 , D3DTA_TEXTURE ) ;
hr = IDirect3DDevice9_SetTextureStageState ( device , 0 , D3DTSS_COLORARG2 , D3DTA_DIFFUSE ) ;
hr = IDirect3DDevice9_DrawPrimitiveUP ( device , D3DPT_TRIANGLESTRIP , 2 , quad4 , sizeof ( float ) * 3 ) ;
ok ( hr = = D3D_OK , " DrawPrimitiveUP failed (%08x) \n " , hr ) ;
hr = IDirect3DDevice9_EndScene ( device ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_EndScene returned %08x \n " , hr ) ;
2007-11-06 19:33:33 +00:00
}
hr = IDirect3DDevice9_Present ( device , NULL , NULL , NULL , NULL ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_Present failed with %08x \n " , hr ) ;
2007-11-06 19:33:33 +00:00
color = getPixelColor ( device , 160 , 120 ) ;
ok ( ( color & 0x00ff0000 ) > = 0x00790000 & & ( color & 0x00ff0000 ) < = 0x00810000 & &
( color & 0x0000ff00 ) = = 0x0000ff00 & &
( color & 0x000000ff ) > = 0x000000e4 & & ( color & 0x000000ff ) < = 0x000000e6 ,
" ps_3_0 returned color 0x%08x, expected 0x0080ffe5 \n " , color ) ;
color = getPixelColor ( device , 160 , 360 ) ;
ok ( ( color & 0x00ff0000 ) > = 0x00190000 & & ( color & 0x00ff0000 ) < = 0x00210000 & &
( color & 0x0000ff00 ) > = 0x00003300 & & ( color & 0x0000ff00 ) < = 0x00003400 & &
( color & 0x000000ff ) = = 0x00000000 ,
" ps_1_4 returned color 0x%08x, expected 0x00203300 \n " , color ) ;
color = getPixelColor ( device , 480 , 360 ) ;
ok ( ( color & 0x00ff0000 ) > = 0x00190000 & & ( color & 0x00ff0000 ) < = 0x00210000 & &
( color & 0x0000ff00 ) > = 0x00003200 & & ( color & 0x0000ff00 ) < = 0x00003400 & &
( color & 0x000000ff ) = = 0x00000000 ,
" ps_2_0 returned color 0x%08x, expected 0x00203300 \n " , color ) ;
color = getPixelColor ( device , 480 , 160 ) ;
2008-04-05 13:16:54 +00:00
ok ( color = = 0x00ffffff /* Nvidia driver garbage with HW vp */ | | (
( color & 0x00ff0000 ) > = 0x00190000 & & ( color & 0x00ff0000 ) < = 0x00210000 & &
2007-11-06 19:33:33 +00:00
( color & 0x0000ff00 ) > = 0x00003200 & & ( color & 0x0000ff00 ) < = 0x00003400 & &
2008-04-05 13:16:54 +00:00
( color & 0x000000ff ) = = 0x00000000 ) ,
2007-11-06 19:33:33 +00:00
" fixed function fragment processing returned color 0x%08x, expected 0x00203300 \n " , color ) ;
/* cleanup */
hr = IDirect3DDevice9_SetTexture ( device , 0 , NULL ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetTexture returned %08x \n " , hr ) ;
2007-11-06 19:33:33 +00:00
hr = IDirect3DDevice9_SetPixelShader ( device , NULL ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetPixelShader returned %08x \n " , hr ) ;
2007-11-06 19:33:33 +00:00
hr = IDirect3DDevice9_SetVertexShader ( device , NULL ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetVertexShader returned %08x \n " , hr ) ;
2007-11-06 19:33:33 +00:00
if ( vertexshader ) IDirect3DVertexShader9_Release ( vertexshader ) ;
if ( ps_1_shader ) IDirect3DPixelShader9_Release ( ps_1_shader ) ;
if ( ps_2_shader ) IDirect3DPixelShader9_Release ( ps_2_shader ) ;
if ( ps_3_shader ) IDirect3DPixelShader9_Release ( ps_3_shader ) ;
if ( texture ) IDirect3DTexture9_Release ( texture ) ;
}
2008-12-12 09:21:06 +00:00
static void test_compare_instructions ( IDirect3DDevice9 * device )
2007-11-09 18:53:20 +00:00
{
DWORD shader_sge_vec_code [ ] = {
0xfffe0101 , /* vs_1_1 */
0x0000001f , 0x80000000 , 0x900f0000 , /* dcl_position v0 */
0x00000001 , 0xc00f0000 , 0x90e40000 , /* mov oPos, v0 */
0x00000001 , 0x800f0000 , 0xa0e40000 , /* mov r0, c0 */
0x0000000d , 0xd00f0000 , 0x80e40000 , 0xa0e40001 , /* sge oD0, r0, c1 */
0x0000ffff /* end */
} ;
DWORD shader_slt_vec_code [ ] = {
0xfffe0101 , /* vs_1_1 */
0x0000001f , 0x80000000 , 0x900f0000 , /* dcl_position v0 */
0x00000001 , 0xc00f0000 , 0x90e40000 , /* mov oPos, v0 */
0x00000001 , 0x800f0000 , 0xa0e40000 , /* mov r0, c0 */
0x0000000c , 0xd00f0000 , 0x80e40000 , 0xa0e40001 , /* slt oD0, r0, c1 */
0x0000ffff /* end */
} ;
DWORD shader_sge_scalar_code [ ] = {
0xfffe0101 , /* vs_1_1 */
0x0000001f , 0x80000000 , 0x900f0000 , /* dcl_position v0 */
0x00000001 , 0xc00f0000 , 0x90e40000 , /* mov oPos, v0 */
0x00000001 , 0x800f0000 , 0xa0e40000 , /* mov r0, c0 */
0x0000000d , 0xd0010000 , 0x80000000 , 0xa0550001 , /* slt oD0.r, r0.r, c1.b */
0x0000000d , 0xd0020000 , 0x80550000 , 0xa0aa0001 , /* slt oD0.g, r0.g, c1.r */
0x0000000d , 0xd0040000 , 0x80aa0000 , 0xa0000001 , /* slt oD0.b, r0.b, c1.g */
0x0000ffff /* end */
} ;
DWORD shader_slt_scalar_code [ ] = {
0xfffe0101 , /* vs_1_1 */
0x0000001f , 0x80000000 , 0x900f0000 , /* dcl_position v0 */
0x00000001 , 0xc00f0000 , 0x90e40000 , /* mov oPos, v0 */
0x00000001 , 0x800f0000 , 0xa0e40000 , /* mov r0, c0 */
0x0000000c , 0xd0010000 , 0x80000000 , 0xa0aa0001 , /* slt oD0.r, r0.r, c1.b */
0x0000000c , 0xd0020000 , 0x80550000 , 0xa0000001 , /* slt oD0.g, r0.g, c1.r */
0x0000000c , 0xd0040000 , 0x80aa0000 , 0xa0550001 , /* slt oD0.b, r0.b, c1.g */
0x0000ffff /* end */
} ;
IDirect3DVertexShader9 * shader_sge_vec ;
IDirect3DVertexShader9 * shader_slt_vec ;
IDirect3DVertexShader9 * shader_sge_scalar ;
IDirect3DVertexShader9 * shader_slt_scalar ;
HRESULT hr , color ;
float quad1 [ ] = {
- 1.0 , - 1.0 , 0.1 ,
0.0 , - 1.0 , 0.1 ,
- 1.0 , 0.0 , 0.1 ,
0.0 , 0.0 , 0.1
} ;
float quad2 [ ] = {
0.0 , - 1.0 , 0.1 ,
1.0 , - 1.0 , 0.1 ,
0.0 , 0.0 , 0.1 ,
1.0 , 0.0 , 0.1
} ;
float quad3 [ ] = {
- 1.0 , 0.0 , 0.1 ,
0.0 , 0.0 , 0.1 ,
- 1.0 , 1.0 , 0.1 ,
0.0 , 1.0 , 0.1
} ;
float quad4 [ ] = {
0.0 , 0.0 , 0.1 ,
1.0 , 0.0 , 0.1 ,
0.0 , 1.0 , 0.1 ,
1.0 , 1.0 , 0.1
} ;
const float const0 [ 4 ] = { 0.8 , 0.2 , 0.2 , 0.2 } ;
const float const1 [ 4 ] = { 0.2 , 0.8 , 0.2 , 0.2 } ;
hr = IDirect3DDevice9_Clear ( device , 0 , NULL , D3DCLEAR_TARGET , 0xffffffff , 0.0 , 0 ) ;
hr = IDirect3DDevice9_CreateVertexShader ( device , shader_sge_vec_code , & shader_sge_vec ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_CreateVertexShader returned %08x \n " , hr ) ;
2007-11-09 18:53:20 +00:00
hr = IDirect3DDevice9_CreateVertexShader ( device , shader_slt_vec_code , & shader_slt_vec ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_CreateVertexShader returned %08x \n " , hr ) ;
2007-11-09 18:53:20 +00:00
hr = IDirect3DDevice9_CreateVertexShader ( device , shader_sge_scalar_code , & shader_sge_scalar ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_CreateVertexShader returned %08x \n " , hr ) ;
2007-11-09 18:53:20 +00:00
hr = IDirect3DDevice9_CreateVertexShader ( device , shader_slt_scalar_code , & shader_slt_scalar ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_CreateVertexShader returned %08x \n " , hr ) ;
2007-11-09 18:53:20 +00:00
hr = IDirect3DDevice9_SetVertexShaderConstantF ( device , 0 , const0 , 1 ) ;
ok ( SUCCEEDED ( hr ) , " SetVertexShaderConstantF failed (%08x) \n " , hr ) ;
hr = IDirect3DDevice9_SetVertexShaderConstantF ( device , 1 , const1 , 1 ) ;
ok ( SUCCEEDED ( hr ) , " SetVertexShaderConstantF failed (%08x) \n " , hr ) ;
hr = IDirect3DDevice9_SetFVF ( device , D3DFVF_XYZ ) ;
ok ( SUCCEEDED ( hr ) , " IDirect3DDevice9_SetFVF failed (%08x) \n " , hr ) ;
hr = IDirect3DDevice9_BeginScene ( device ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_BeginScene returned %08x \n " , hr ) ;
2007-11-09 18:53:20 +00:00
if ( SUCCEEDED ( hr ) )
{
hr = IDirect3DDevice9_SetVertexShader ( device , shader_sge_vec ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetVertexShader returned %08x \n " , hr ) ;
2007-11-09 18:53:20 +00:00
hr = IDirect3DDevice9_DrawPrimitiveUP ( device , D3DPT_TRIANGLESTRIP , 2 , quad1 , sizeof ( float ) * 3 ) ;
ok ( hr = = D3D_OK , " DrawPrimitiveUP failed (%08x) \n " , hr ) ;
hr = IDirect3DDevice9_SetVertexShader ( device , shader_slt_vec ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetVertexShader returned %08x \n " , hr ) ;
2007-11-09 18:53:20 +00:00
hr = IDirect3DDevice9_DrawPrimitiveUP ( device , D3DPT_TRIANGLESTRIP , 2 , quad2 , sizeof ( float ) * 3 ) ;
ok ( hr = = D3D_OK , " DrawPrimitiveUP failed (%08x) \n " , hr ) ;
hr = IDirect3DDevice9_SetVertexShader ( device , shader_sge_scalar ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetVertexShader returned %08x \n " , hr ) ;
2007-11-09 18:53:20 +00:00
hr = IDirect3DDevice9_DrawPrimitiveUP ( device , D3DPT_TRIANGLESTRIP , 2 , quad3 , sizeof ( float ) * 3 ) ;
ok ( hr = = D3D_OK , " DrawPrimitiveUP failed (%08x) \n " , hr ) ;
hr = IDirect3DDevice9_SetVertexShaderConstantF ( device , 0 , const0 , 1 ) ;
ok ( SUCCEEDED ( hr ) , " SetVertexShaderConstantF failed (%08x) \n " , hr ) ;
hr = IDirect3DDevice9_SetVertexShader ( device , shader_slt_scalar ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetVertexShader returned %08x \n " , hr ) ;
2007-11-09 18:53:20 +00:00
hr = IDirect3DDevice9_DrawPrimitiveUP ( device , D3DPT_TRIANGLESTRIP , 2 , quad4 , sizeof ( float ) * 3 ) ;
ok ( hr = = D3D_OK , " DrawPrimitiveUP failed (%08x) \n " , hr ) ;
hr = IDirect3DDevice9_EndScene ( device ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_EndScene returned %08x \n " , hr ) ;
2007-11-09 18:53:20 +00:00
}
hr = IDirect3DDevice9_Present ( device , NULL , NULL , NULL , NULL ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_Present failed with %08x \n " , hr ) ;
2008-07-07 22:00:49 +00:00
hr = IDirect3DDevice9_SetVertexShader ( device , NULL ) ;
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetVertexShader returned %08x \n " , hr ) ;
2007-11-09 18:53:20 +00:00
color = getPixelColor ( device , 160 , 360 ) ;
2007-11-15 18:22:34 +00:00
ok ( color = = 0x00FF00FF , " Compare test: Quad 1(sge vec) returned color 0x%08x, expected 0x00FF00FF \n " , color ) ;
2007-11-09 18:53:20 +00:00
color = getPixelColor ( device , 480 , 360 ) ;
ok ( color = = 0x0000FF00 , " Compare test: Quad 2(slt vec) returned color 0x%08x, expected 0x0000FF00 \n " , color ) ;
color = getPixelColor ( device , 160 , 120 ) ;
ok ( color = = 0x00FFFFFF , " Compare test: Quad 3(sge scalar) returned color 0x%08x, expected 0x00FFFFFF \n " , color ) ;
color = getPixelColor ( device , 480 , 160 ) ;
ok ( color = = 0x000000ff , " Compare test: Quad 4(slt scalar) returned color 0x%08x, expected 0x000000ff \n " , color ) ;
IDirect3DVertexShader9_Release ( shader_sge_vec ) ;
IDirect3DVertexShader9_Release ( shader_slt_vec ) ;
IDirect3DVertexShader9_Release ( shader_sge_scalar ) ;
IDirect3DVertexShader9_Release ( shader_slt_scalar ) ;
}
2008-12-12 09:21:06 +00:00
static void test_vshader_input ( IDirect3DDevice9 * device )
2007-11-21 21:16:12 +00:00
{
DWORD swapped_shader_code_3 [ ] = {
0xfffe0300 , /* vs_3_0 */
0x0200001f , 0x80000000 , 0xe00f0000 , /* dcl_position o0 */
0x0200001f , 0x8000000a , 0xe00f0001 , /* dcl_color o1 */
0x0200001f , 0x80000000 , 0x900f0000 , /* dcl_position v0 */
0x0200001f , 0x80000005 , 0x900f0001 , /* dcl_texcoord0 v1 */
0x0200001f , 0x80010005 , 0x900f0002 , /* dcl_texcoord1 v2 */
0x02000001 , 0xe00f0000 , 0x90e40000 , /* mov o0, v0 */
0x02000001 , 0x800f0001 , 0x90e40001 , /* mov r1, v1 */
0x03000002 , 0xe00f0001 , 0x80e40001 , 0x91e40002 , /* sub o1, r1, v2 */
0x0000ffff /* end */
} ;
DWORD swapped_shader_code_1 [ ] = {
0xfffe0101 , /* vs_1_1 */
0x0000001f , 0x80000000 , 0x900f0000 , /* dcl_position v0 */
0x0000001f , 0x80000005 , 0x900f0001 , /* dcl_texcoord0 v1 */
0x0000001f , 0x80010005 , 0x900f0002 , /* dcl_texcoord1 v2 */
0x00000001 , 0xc00f0000 , 0x90e40000 , /* mov o0, v0 */
0x00000001 , 0x800f0001 , 0x90e40001 , /* mov r1, v1 */
0x00000002 , 0xd00f0000 , 0x80e40001 , 0x91e40002 , /* sub o1, r1, v2 */
0x0000ffff /* end */
} ;
DWORD swapped_shader_code_2 [ ] = {
0xfffe0200 , /* vs_2_0 */
0x0200001f , 0x80000000 , 0x900f0000 , /* dcl_position v0 */
0x0200001f , 0x80000005 , 0x900f0001 , /* dcl_texcoord0 v1 */
0x0200001f , 0x80010005 , 0x900f0002 , /* dcl_texcoord1 v2 */
0x02000001 , 0xc00f0000 , 0x90e40000 , /* mov o0, v0 */
0x02000001 , 0x800f0001 , 0x90e40001 , /* mov r1, v1 */
0x03000002 , 0xd00f0000 , 0x80e40001 , 0x91e40002 , /* sub o1, r1, v2 */
0x0000ffff /* end */
} ;
DWORD texcoord_color_shader_code_3 [ ] = {
0xfffe0300 , /* vs_3_0 */
0x0200001f , 0x80000000 , 0xe00f0000 , /* dcl_position o0 */
0x0200001f , 0x8000000a , 0xe00f0001 , /* dcl_color o1 */
0x0200001f , 0x80000000 , 0x900f0000 , /* dcl_position v0 */
0x0200001f , 0x80000005 , 0x900f0001 , /* dcl_texcoord v1 */
0x02000001 , 0xe00f0000 , 0x90e40000 , /* mov o0, v0 */
0x02000001 , 0xe00f0001 , 0x90e40001 , /* mov o1, v1 */
0x0000ffff /* end */
} ;
DWORD texcoord_color_shader_code_2 [ ] = {
0xfffe0200 , /* vs_2_0 */
0x0200001f , 0x80000000 , 0x900f0000 , /* dcl_position v0 */
0x0200001f , 0x80000005 , 0x900f0001 , /* dcl_texcoord v1 */
0x02000001 , 0xc00f0000 , 0x90e40000 , /* mov oPos, v0 */
0x02000001 , 0xd00f0000 , 0x90e40001 , /* mov oD0, v1 */
0x0000ffff /* end */
} ;
DWORD texcoord_color_shader_code_1 [ ] = {
0xfffe0101 , /* vs_1_1 */
0x0000001f , 0x80000000 , 0x900f0000 , /* dcl_position v0 */
0x0000001f , 0x80000005 , 0x900f0001 , /* dcl_texcoord v1 */
0x00000001 , 0xc00f0000 , 0x90e40000 , /* mov oPos, v0 */
0x00000001 , 0xd00f0000 , 0x90e40001 , /* mov oD0, v1 */
0x0000ffff /* end */
} ;
DWORD color_color_shader_code_3 [ ] = {
0xfffe0300 , /* vs_3_0 */
0x0200001f , 0x80000000 , 0xe00f0000 , /* dcl_position o0 */
0x0200001f , 0x8000000a , 0xe00f0001 , /* dcl_color o1 */
0x0200001f , 0x80000000 , 0x900f0000 , /* dcl_position v0 */
0x0200001f , 0x8000000a , 0x900f0001 , /* dcl_color v1 */
0x02000001 , 0xe00f0000 , 0x90e40000 , /* mov o0, v0 */
0x03000005 , 0xe00f0001 , 0xa0e40000 , 0x90e40001 , /* mul o1, c0, v1 */
0x0000ffff /* end */
} ;
DWORD color_color_shader_code_2 [ ] = {
0xfffe0200 , /* vs_2_0 */
0x0200001f , 0x80000000 , 0x900f0000 , /* dcl_position v0 */
0x0200001f , 0x8000000a , 0x900f0001 , /* dcl_color v1 */
0x02000001 , 0xc00f0000 , 0x90e40000 , /* mov oPos, v0 */
0x03000005 , 0xd00f0000 , 0xa0e40000 , 0x90e40001 , /* mul oD0, c0, v1 */
0x0000ffff /* end */
} ;
DWORD color_color_shader_code_1 [ ] = {
0xfffe0101 , /* vs_1_1 */
0x0000001f , 0x80000000 , 0x900f0000 , /* dcl_position v0 */
0x0000001f , 0x8000000a , 0x900f0001 , /* dcl_color v1 */
0x00000001 , 0xc00f0000 , 0x90e40000 , /* mov oPos, v0 */
0x00000005 , 0xd00f0000 , 0xa0e40000 , 0x90e40001 , /* mul oD0, c0, v1 */
0x0000ffff /* end */
} ;
IDirect3DVertexShader9 * swapped_shader , * texcoord_color_shader , * color_color_shader ;
HRESULT hr ;
2008-07-23 20:49:14 +00:00
DWORD color ;
2007-11-21 21:16:12 +00:00
float quad1 [ ] = {
- 1.0 , - 1.0 , 0.1 , 1.0 , 0.0 , 1.0 , 0.0 , 0.0 , - 1.0 , 0.5 , 0.0 ,
0.0 , - 1.0 , 0.1 , 1.0 , 0.0 , 1.0 , 0.0 , 0.0 , - 1.0 , 0.5 , 0.0 ,
- 1.0 , 0.0 , 0.1 , 1.0 , 0.0 , 1.0 , 0.0 , 0.0 , - 1.0 , 0.5 , 0.0 ,
0.0 , 0.0 , 0.1 , 1.0 , 0.0 , 1.0 , 0.0 , 0.0 , - 1.0 , 0.5 , 0.0 ,
} ;
float quad2 [ ] = {
0.0 , - 1.0 , 0.1 , 1.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 ,
1.0 , - 1.0 , 0.1 , 1.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 ,
0.0 , 0.0 , 0.1 , 1.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 ,
1.0 , 0.0 , 0.1 , 1.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 ,
} ;
float quad3 [ ] = {
- 1.0 , 0.0 , 0.1 , - 1.0 , 0.0 , 0.0 , 0.0 , 1.0 , - 1.0 , 0.0 , 0.0 ,
0.0 , 0.0 , 0.1 , - 1.0 , 0.0 , 0.0 , 0.0 , 1.0 , 0.0 , 0.0 , 0.0 ,
- 1.0 , 1.0 , 0.1 , - 1.0 , 0.0 , 0.0 , 0.0 , 0.0 , - 1.0 , 1.0 , 0.0 ,
0.0 , 1.0 , 0.1 , - 1.0 , 0.0 , 0.0 , 0.0 , - 1.0 , 0.0 , 0.0 , 0.0 ,
} ;
float quad4 [ ] = {
0.0 , 0.0 , 0.1 , 1.0 , 0.0 , 1.0 , 0.0 , 0.0 , - 1.0 , 0.5 , 0.0 ,
1.0 , 0.0 , 0.1 , 1.0 , 0.0 , 1.0 , 0.0 , 0.0 , - 1.0 , 0.5 , 0.0 ,
0.0 , 1.0 , 0.1 , 1.0 , 0.0 , 1.0 , 0.0 , 0.0 , - 1.0 , 0.5 , 0.0 ,
1.0 , 1.0 , 0.1 , 1.0 , 0.0 , 1.0 , 0.0 , 0.0 , - 1.0 , 0.5 , 0.0 ,
} ;
static const D3DVERTEXELEMENT9 decl_elements_twotexcrd [ ] = {
{ 0 , 0 , D3DDECLTYPE_FLOAT3 , D3DDECLMETHOD_DEFAULT , D3DDECLUSAGE_POSITION , 0 } ,
{ 0 , 12 , D3DDECLTYPE_FLOAT4 , D3DDECLMETHOD_DEFAULT , D3DDECLUSAGE_TEXCOORD , 0 } ,
{ 0 , 28 , D3DDECLTYPE_FLOAT4 , D3DDECLMETHOD_DEFAULT , D3DDECLUSAGE_TEXCOORD , 1 } ,
D3DDECL_END ( )
} ;
static const D3DVERTEXELEMENT9 decl_elements_twotexcrd_rightorder [ ] = {
{ 0 , 0 , D3DDECLTYPE_FLOAT3 , D3DDECLMETHOD_DEFAULT , D3DDECLUSAGE_POSITION , 0 } ,
{ 0 , 12 , D3DDECLTYPE_FLOAT4 , D3DDECLMETHOD_DEFAULT , D3DDECLUSAGE_TEXCOORD , 1 } ,
{ 0 , 28 , D3DDECLTYPE_FLOAT4 , D3DDECLMETHOD_DEFAULT , D3DDECLUSAGE_TEXCOORD , 0 } ,
D3DDECL_END ( )
} ;
static const D3DVERTEXELEMENT9 decl_elements_onetexcrd [ ] = {
{ 0 , 0 , D3DDECLTYPE_FLOAT3 , D3DDECLMETHOD_DEFAULT , D3DDECLUSAGE_POSITION , 0 } ,
{ 0 , 12 , D3DDECLTYPE_FLOAT4 , D3DDECLMETHOD_DEFAULT , D3DDECLUSAGE_TEXCOORD , 0 } ,
D3DDECL_END ( )
} ;
static const D3DVERTEXELEMENT9 decl_elements_twotexcrd_wrongidx [ ] = {
{ 0 , 0 , D3DDECLTYPE_FLOAT3 , D3DDECLMETHOD_DEFAULT , D3DDECLUSAGE_POSITION , 0 } ,
{ 0 , 12 , D3DDECLTYPE_FLOAT4 , D3DDECLMETHOD_DEFAULT , D3DDECLUSAGE_TEXCOORD , 1 } ,
{ 0 , 28 , D3DDECLTYPE_FLOAT4 , D3DDECLMETHOD_DEFAULT , D3DDECLUSAGE_TEXCOORD , 2 } ,
D3DDECL_END ( )
} ;
static const D3DVERTEXELEMENT9 decl_elements_texcoord_color [ ] = {
{ 0 , 0 , D3DDECLTYPE_FLOAT3 , D3DDECLMETHOD_DEFAULT , D3DDECLUSAGE_POSITION , 0 } ,
{ 0 , 12 , D3DDECLTYPE_D3DCOLOR , D3DDECLMETHOD_DEFAULT , D3DDECLUSAGE_TEXCOORD , 0 } ,
D3DDECL_END ( )
} ;
static const D3DVERTEXELEMENT9 decl_elements_color_color [ ] = {
{ 0 , 0 , D3DDECLTYPE_FLOAT3 , D3DDECLMETHOD_DEFAULT , D3DDECLUSAGE_POSITION , 0 } ,
{ 0 , 12 , D3DDECLTYPE_D3DCOLOR , D3DDECLMETHOD_DEFAULT , D3DDECLUSAGE_COLOR , 0 } ,
D3DDECL_END ( )
} ;
static const D3DVERTEXELEMENT9 decl_elements_color_ubyte [ ] = {
{ 0 , 0 , D3DDECLTYPE_FLOAT3 , D3DDECLMETHOD_DEFAULT , D3DDECLUSAGE_POSITION , 0 } ,
{ 0 , 12 , D3DDECLTYPE_UBYTE4 , D3DDECLMETHOD_DEFAULT , D3DDECLUSAGE_COLOR , 0 } ,
D3DDECL_END ( )
} ;
static const D3DVERTEXELEMENT9 decl_elements_color_float [ ] = {
{ 0 , 0 , D3DDECLTYPE_FLOAT3 , D3DDECLMETHOD_DEFAULT , D3DDECLUSAGE_POSITION , 0 } ,
{ 0 , 12 , D3DDECLTYPE_FLOAT4 , D3DDECLMETHOD_DEFAULT , D3DDECLUSAGE_COLOR , 0 } ,
D3DDECL_END ( )
} ;
IDirect3DVertexDeclaration9 * decl_twotexcrd , * decl_onetexcrd , * decl_twotex_wrongidx , * decl_twotexcrd_rightorder ;
IDirect3DVertexDeclaration9 * decl_texcoord_color , * decl_color_color , * decl_color_ubyte , * decl_color_float ;
unsigned int i ;
float normalize [ 4 ] = { 1.0 / 256.0 , 1.0 / 256.0 , 1.0 / 256.0 , 1.0 / 256.0 } ;
float no_normalize [ 4 ] = { 1.0 , 1.0 , 1.0 , 1.0 } ;
struct vertex quad1_color [ ] = {
{ - 1.0 , - 1.0 , 0.1 , 0x00ff8040 } ,
{ 0.0 , - 1.0 , 0.1 , 0x00ff8040 } ,
{ - 1.0 , 0.0 , 0.1 , 0x00ff8040 } ,
{ 0.0 , 0.0 , 0.1 , 0x00ff8040 }
} ;
struct vertex quad2_color [ ] = {
{ 0.0 , - 1.0 , 0.1 , 0x00ff8040 } ,
{ 1.0 , - 1.0 , 0.1 , 0x00ff8040 } ,
{ 0.0 , 0.0 , 0.1 , 0x00ff8040 } ,
{ 1.0 , 0.0 , 0.1 , 0x00ff8040 }
} ;
struct vertex quad3_color [ ] = {
{ - 1.0 , 0.0 , 0.1 , 0x00ff8040 } ,
{ 0.0 , 0.0 , 0.1 , 0x00ff8040 } ,
{ - 1.0 , 1.0 , 0.1 , 0x00ff8040 } ,
{ 0.0 , 1.0 , 0.1 , 0x00ff8040 }
} ;
float quad4_color [ ] = {
0.0 , 0.0 , 0.1 , 1.0 , 1.0 , 0.0 , 0.0 ,
1.0 , 0.0 , 0.1 , 1.0 , 1.0 , 0.0 , 1.0 ,
0.0 , 1.0 , 0.1 , 1.0 , 1.0 , 0.0 , 0.0 ,
1.0 , 1.0 , 0.1 , 1.0 , 1.0 , 0.0 , 1.0 ,
} ;
hr = IDirect3DDevice9_CreateVertexDeclaration ( device , decl_elements_twotexcrd , & decl_twotexcrd ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_CreateVertexDeclaration returned %08x \n " , hr ) ;
2007-11-21 21:16:12 +00:00
hr = IDirect3DDevice9_CreateVertexDeclaration ( device , decl_elements_onetexcrd , & decl_onetexcrd ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_CreateVertexDeclaration returned %08x \n " , hr ) ;
2007-11-21 21:16:12 +00:00
hr = IDirect3DDevice9_CreateVertexDeclaration ( device , decl_elements_twotexcrd_wrongidx , & decl_twotex_wrongidx ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_CreateVertexDeclaration returned %08x \n " , hr ) ;
2007-11-21 21:16:12 +00:00
hr = IDirect3DDevice9_CreateVertexDeclaration ( device , decl_elements_twotexcrd_rightorder , & decl_twotexcrd_rightorder ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_CreateVertexDeclaration returned %08x \n " , hr ) ;
2007-11-21 21:16:12 +00:00
hr = IDirect3DDevice9_CreateVertexDeclaration ( device , decl_elements_texcoord_color , & decl_texcoord_color ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_CreateVertexDeclaration returned %08x \n " , hr ) ;
2007-11-21 21:16:12 +00:00
hr = IDirect3DDevice9_CreateVertexDeclaration ( device , decl_elements_color_color , & decl_color_color ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_CreateVertexDeclaration returned %08x \n " , hr ) ;
2007-11-21 21:16:12 +00:00
hr = IDirect3DDevice9_CreateVertexDeclaration ( device , decl_elements_color_ubyte , & decl_color_ubyte ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_CreateVertexDeclaration returned %08x \n " , hr ) ;
2007-11-21 21:16:12 +00:00
hr = IDirect3DDevice9_CreateVertexDeclaration ( device , decl_elements_color_float , & decl_color_float ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_CreateVertexDeclaration returned %08x \n " , hr ) ;
2007-11-21 21:16:12 +00:00
for ( i = 1 ; i < = 3 ; i + + ) {
hr = IDirect3DDevice9_Clear ( device , 0 , NULL , D3DCLEAR_TARGET , 0xffff0000 , 0.0 , 0 ) ;
if ( i = = 3 ) {
hr = IDirect3DDevice9_CreateVertexShader ( device , swapped_shader_code_3 , & swapped_shader ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_CreateVertexShader returned %08x \n " , hr ) ;
2007-11-21 21:16:12 +00:00
} else if ( i = = 2 ) {
hr = IDirect3DDevice9_CreateVertexShader ( device , swapped_shader_code_2 , & swapped_shader ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_CreateVertexShader returned %08x \n " , hr ) ;
2007-11-21 21:16:12 +00:00
} else if ( i = = 1 ) {
hr = IDirect3DDevice9_CreateVertexShader ( device , swapped_shader_code_1 , & swapped_shader ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_CreateVertexShader returned %08x \n " , hr ) ;
2007-11-21 21:16:12 +00:00
}
hr = IDirect3DDevice9_BeginScene ( device ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_BeginScene returned %08x \n " , hr ) ;
2007-11-21 21:16:12 +00:00
if ( SUCCEEDED ( hr ) )
{
hr = IDirect3DDevice9_SetVertexShader ( device , swapped_shader ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetVertexShader returned %08x \n " , hr ) ;
2007-11-21 21:16:12 +00:00
hr = IDirect3DDevice9_SetVertexDeclaration ( device , decl_twotexcrd ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetVertexDeclaration returned %08x \n " , hr ) ;
2007-11-21 21:16:12 +00:00
hr = IDirect3DDevice9_DrawPrimitiveUP ( device , D3DPT_TRIANGLESTRIP , 2 , quad1 , sizeof ( float ) * 11 ) ;
ok ( hr = = D3D_OK , " DrawPrimitiveUP failed (%08x) \n " , hr ) ;
hr = IDirect3DDevice9_SetVertexDeclaration ( device , decl_onetexcrd ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetVertexDeclaration returned %08x \n " , hr ) ;
2007-11-21 21:16:12 +00:00
hr = IDirect3DDevice9_DrawPrimitiveUP ( device , D3DPT_TRIANGLESTRIP , 2 , quad2 , sizeof ( float ) * 11 ) ;
if ( i = = 3 | | i = = 2 ) {
ok ( hr = = D3D_OK , " DrawPrimitiveUP returned (%08x) i = %d \n " , hr , i ) ;
} else if ( i = = 1 ) {
/* Succeeds or fails, depending on SW or HW vertex processing */
ok ( hr = = D3DERR_INVALIDCALL | | hr = = D3D_OK , " DrawPrimitiveUP returned (%08x), i = 1 \n " , hr ) ;
}
hr = IDirect3DDevice9_SetVertexDeclaration ( device , decl_twotexcrd_rightorder ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetVertexDeclaration returned %08x \n " , hr ) ;
2007-11-21 21:16:12 +00:00
hr = IDirect3DDevice9_DrawPrimitiveUP ( device , D3DPT_TRIANGLESTRIP , 2 , quad4 , sizeof ( float ) * 11 ) ;
ok ( hr = = D3D_OK , " DrawPrimitiveUP failed (%08x) \n " , hr ) ;
hr = IDirect3DDevice9_SetVertexDeclaration ( device , decl_twotex_wrongidx ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetVertexDeclaration returned %08x \n " , hr ) ;
2007-11-21 21:16:12 +00:00
hr = IDirect3DDevice9_DrawPrimitiveUP ( device , D3DPT_TRIANGLESTRIP , 2 , quad3 , sizeof ( float ) * 11 ) ;
if ( i = = 3 | | i = = 2 ) {
ok ( hr = = D3D_OK , " DrawPrimitiveUP returned (%08x) i = %d \n " , hr , i ) ;
} else if ( i = = 1 ) {
ok ( hr = = D3DERR_INVALIDCALL | | hr = = D3D_OK , " DrawPrimitiveUP returned (%08x) i = 1 \n " , hr ) ;
}
hr = IDirect3DDevice9_EndScene ( device ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_EndScene returned %08x \n " , hr ) ;
2007-11-21 21:16:12 +00:00
}
hr = IDirect3DDevice9_Present ( device , NULL , NULL , NULL , NULL ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_Present failed with %08x \n " , hr ) ;
2007-11-21 21:16:12 +00:00
if ( i = = 3 | | i = = 2 ) {
color = getPixelColor ( device , 160 , 360 ) ;
2008-07-23 20:49:14 +00:00
ok ( color_match ( color , D3DCOLOR_ARGB ( 0x00 , 0xff , 0xff , 0x80 ) , 1 ) ,
2007-11-21 21:16:12 +00:00
" Input test: Quad 1(2crd) returned color 0x%08x, expected 0x00FFFF80 \n " , color ) ;
2008-04-07 12:36:53 +00:00
/* The last value of the read but undefined stream is used, it is 0x00. The defined input is vec4(1, 0, 0, 0) */
2007-11-21 21:16:12 +00:00
color = getPixelColor ( device , 480 , 360 ) ;
2008-04-07 12:36:53 +00:00
ok ( color = = 0x00FFFF00 | | color = = 0x00FF0000 ,
" Input test: Quad 2(1crd) returned color 0x%08x, expected 0x00FFFF00 \n " , color ) ;
2007-11-21 21:16:12 +00:00
color = getPixelColor ( device , 160 , 120 ) ;
2008-04-07 12:36:53 +00:00
/* Same as above, accept both the last used value and 0.0 for the undefined streams */
2008-07-23 20:49:14 +00:00
ok ( color_match ( color , D3DCOLOR_ARGB ( 0x00 , 0xff , 0x00 , 0x80 ) , 1 ) | | color = = D3DCOLOR_ARGB ( 0x00 , 0xff , 0x00 , 0x00 ) ,
2007-11-21 21:16:12 +00:00
" Input test: Quad 3(2crd-wrongidx) returned color 0x%08x, expected 0x00FF0080 \n " , color ) ;
color = getPixelColor ( device , 480 , 160 ) ;
ok ( color = = 0x00000000 , " Input test: Quad 4(2crd-rightorder) returned color 0x%08x, expected 0x00000000 \n " , color ) ;
} else if ( i = = 1 ) {
color = getPixelColor ( device , 160 , 360 ) ;
2008-07-23 20:49:14 +00:00
ok ( color_match ( color , D3DCOLOR_ARGB ( 0x00 , 0xff , 0xff , 0x80 ) , 1 ) ,
2007-11-21 21:16:12 +00:00
" Input test: Quad 1(2crd) returned color 0x%08x, expected 0x00FFFF80 \n " , color ) ;
color = getPixelColor ( device , 480 , 360 ) ;
/* Accept the clear color as well in this case, since SW VP returns an error */
ok ( color = = 0x00FFFF00 | | color = = 0x00FF0000 , " Input test: Quad 2(1crd) returned color 0x%08x, expected 0x00FFFF00 \n " , color ) ;
color = getPixelColor ( device , 160 , 120 ) ;
2008-07-23 20:49:14 +00:00
ok ( color_match ( color , D3DCOLOR_ARGB ( 0x00 , 0xff , 0x00 , 0x80 ) , 1 ) | | color = = D3DCOLOR_ARGB ( 0x00 , 0xff , 0x00 , 0x00 ) ,
2007-11-21 21:16:12 +00:00
" Input test: Quad 3(2crd-wrongidx) returned color 0x%08x, expected 0x00FF0080 \n " , color ) ;
color = getPixelColor ( device , 480 , 160 ) ;
ok ( color = = 0x00000000 , " Input test: Quad 4(2crd-rightorder) returned color 0x%08x, expected 0x00000000 \n " , color ) ;
}
hr = IDirect3DDevice9_Clear ( device , 0 , NULL , D3DCLEAR_TARGET , 0xff808080 , 0.0 , 0 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_Clear returned %08x \n " , hr ) ;
2007-11-21 21:16:12 +00:00
/* Now find out if the whole streams are re-read, or just the last active value for the
* vertices is used .
*/
hr = IDirect3DDevice9_BeginScene ( device ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_BeginScene returned %08x \n " , hr ) ;
2007-11-21 21:16:12 +00:00
if ( SUCCEEDED ( hr ) )
{
float quad1_modified [ ] = {
- 1.0 , - 1.0 , 0.1 , 1.0 , 0.0 , 1.0 , 0.0 , - 1.0 , 0.0 , 0.0 , 0.0 ,
0.0 , - 1.0 , 0.1 , 1.0 , 0.0 , 1.0 , 0.0 , 0.0 , - 1.0 , 0.0 , 0.0 ,
- 1.0 , 0.0 , 0.1 , 1.0 , 0.0 , 1.0 , 0.0 , 0.0 , 0.0 , - 1.0 , 0.0 ,
0.0 , 0.0 , 0.1 , 1.0 , 0.0 , 1.0 , 0.0 , - 1.0 , - 1.0 , - 1.0 , 0.0 ,
} ;
float quad2_modified [ ] = {
0.0 , - 1.0 , 0.1 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 ,
1.0 , - 1.0 , 0.1 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 ,
0.0 , 0.0 , 0.1 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 ,
1.0 , 0.0 , 0.1 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 ,
} ;
hr = IDirect3DDevice9_SetVertexShader ( device , swapped_shader ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetVertexShader returned %08x \n " , hr ) ;
2007-11-21 21:16:12 +00:00
hr = IDirect3DDevice9_SetVertexDeclaration ( device , decl_twotexcrd ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetVertexDeclaration returned %08x \n " , hr ) ;
2007-11-21 21:16:12 +00:00
hr = IDirect3DDevice9_DrawPrimitiveUP ( device , D3DPT_POINTLIST , 3 , quad1_modified , sizeof ( float ) * 11 ) ;
ok ( hr = = D3D_OK , " DrawPrimitiveUP failed (%08x) \n " , hr ) ;
hr = IDirect3DDevice9_SetVertexDeclaration ( device , decl_onetexcrd ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetVertexDeclaration returned %08x \n " , hr ) ;
2007-11-21 21:16:12 +00:00
hr = IDirect3DDevice9_DrawPrimitiveUP ( device , D3DPT_TRIANGLESTRIP , 2 , quad2_modified , sizeof ( float ) * 11 ) ;
if ( i = = 3 | | i = = 2 ) {
ok ( hr = = D3D_OK , " DrawPrimitiveUP returned (%08x) i = %d \n " , hr , i ) ;
} else if ( i = = 1 ) {
/* Succeeds or fails, depending on SW or HW vertex processing */
ok ( hr = = D3DERR_INVALIDCALL | | hr = = D3D_OK , " DrawPrimitiveUP returned (%08x), i = 1 \n " , hr ) ;
}
hr = IDirect3DDevice9_EndScene ( device ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_EndScene returned %08x \n " , hr ) ;
2007-11-21 21:16:12 +00:00
}
hr = IDirect3DDevice9_Present ( device , NULL , NULL , NULL , NULL ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_Present failed with %08x \n " , hr ) ;
2007-11-21 21:16:12 +00:00
2008-04-05 12:52:34 +00:00
color = getPixelColor ( device , 480 , 350 ) ;
2008-04-07 12:36:53 +00:00
/* vs_1_1 may fail, accept the clear color. Some drivers also set the undefined streams to 0, accept that
* as well .
2007-12-08 21:34:45 +00:00
*
* NOTE : This test fails on the reference rasterizer . In the refrast , the 4 vertices have different colors ,
* i . e . , the whole old stream is read , and not just the last used attribute . Some games require that this
* does * not * happen , otherwise they can crash because of a read from a bad pointer , so do not accept the
* refrast ' s result .
*
* A test app for this behavior is Half Life 2 Episode 2 in dxlevel 95 , and related games ( Portal , TF2 ) .
*/
2008-04-07 12:36:53 +00:00
ok ( color = = 0x000000FF | | color = = 0x00808080 | | color = = 0x00000000 ,
" Input test: Quad 2(different colors) returned color 0x%08x, expected 0x000000FF, 0x00808080 or 0x00000000 \n " , color ) ;
2007-11-21 21:16:12 +00:00
color = getPixelColor ( device , 160 , 120 ) ;
IDirect3DDevice9_SetVertexShader ( device , NULL ) ;
IDirect3DDevice9_SetVertexDeclaration ( device , NULL ) ;
IDirect3DVertexShader9_Release ( swapped_shader ) ;
}
for ( i = 1 ; i < = 3 ; i + + ) {
hr = IDirect3DDevice9_Clear ( device , 0 , NULL , D3DCLEAR_TARGET , 0xff0000ff , 0.0 , 0 ) ;
if ( i = = 3 ) {
hr = IDirect3DDevice9_CreateVertexShader ( device , texcoord_color_shader_code_3 , & texcoord_color_shader ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_CreateVertexShader returned %08x \n " , hr ) ;
2007-11-21 21:16:12 +00:00
hr = IDirect3DDevice9_CreateVertexShader ( device , color_color_shader_code_3 , & color_color_shader ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_CreateVertexShader returned %08x \n " , hr ) ;
2007-11-21 21:16:12 +00:00
} else if ( i = = 2 ) {
hr = IDirect3DDevice9_CreateVertexShader ( device , texcoord_color_shader_code_2 , & texcoord_color_shader ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_CreateVertexShader returned %08x \n " , hr ) ;
2007-11-21 21:16:12 +00:00
hr = IDirect3DDevice9_CreateVertexShader ( device , color_color_shader_code_2 , & color_color_shader ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_CreateVertexShader returned %08x \n " , hr ) ;
2007-11-21 21:16:12 +00:00
} else if ( i = = 1 ) {
hr = IDirect3DDevice9_CreateVertexShader ( device , texcoord_color_shader_code_1 , & texcoord_color_shader ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_CreateVertexShader returned %08x \n " , hr ) ;
2007-11-21 21:16:12 +00:00
hr = IDirect3DDevice9_CreateVertexShader ( device , color_color_shader_code_1 , & color_color_shader ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_CreateVertexShader returned %08x \n " , hr ) ;
2007-11-21 21:16:12 +00:00
}
hr = IDirect3DDevice9_BeginScene ( device ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_BeginScene returned %08x \n " , hr ) ;
2007-11-21 21:16:12 +00:00
if ( SUCCEEDED ( hr ) )
{
hr = IDirect3DDevice9_SetVertexShader ( device , texcoord_color_shader ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetVertexShader returned %08x \n " , hr ) ;
2007-11-21 21:16:12 +00:00
hr = IDirect3DDevice9_SetVertexDeclaration ( device , decl_texcoord_color ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetVertexDeclaration returned %08x \n " , hr ) ;
2007-11-21 21:16:12 +00:00
hr = IDirect3DDevice9_DrawPrimitiveUP ( device , D3DPT_TRIANGLESTRIP , 2 , quad1_color , sizeof ( quad1_color [ 0 ] ) ) ;
ok ( hr = = D3D_OK , " DrawPrimitiveUP failed (%08x) \n " , hr ) ;
hr = IDirect3DDevice9_SetVertexShader ( device , color_color_shader ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetVertexShader returned %08x \n " , hr ) ;
2007-11-21 21:16:12 +00:00
hr = IDirect3DDevice9_SetVertexShaderConstantF ( device , 0 , normalize , 1 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetVertexShader returned %08x \n " , hr ) ;
2007-11-21 21:16:12 +00:00
hr = IDirect3DDevice9_SetVertexDeclaration ( device , decl_color_ubyte ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetVertexDeclaration returned %08x \n " , hr ) ;
2007-11-21 21:16:12 +00:00
hr = IDirect3DDevice9_DrawPrimitiveUP ( device , D3DPT_TRIANGLESTRIP , 2 , quad2_color , sizeof ( quad2_color [ 0 ] ) ) ;
ok ( hr = = D3D_OK , " DrawPrimitiveUP failed (%08x) \n " , hr ) ;
hr = IDirect3DDevice9_SetVertexShaderConstantF ( device , 0 , no_normalize , 1 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetVertexShader returned %08x \n " , hr ) ;
2007-11-21 21:16:12 +00:00
hr = IDirect3DDevice9_SetVertexDeclaration ( device , decl_color_color ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetVertexDeclaration returned %08x \n " , hr ) ;
2007-11-21 21:16:12 +00:00
hr = IDirect3DDevice9_DrawPrimitiveUP ( device , D3DPT_TRIANGLESTRIP , 2 , quad3_color , sizeof ( quad3_color [ 0 ] ) ) ;
ok ( hr = = D3D_OK , " DrawPrimitiveUP failed (%08x) \n " , hr ) ;
hr = IDirect3DDevice9_SetVertexDeclaration ( device , decl_color_float ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetVertexDeclaration returned %08x \n " , hr ) ;
2007-11-21 21:16:12 +00:00
hr = IDirect3DDevice9_DrawPrimitiveUP ( device , D3DPT_TRIANGLESTRIP , 2 , quad4_color , sizeof ( float ) * 7 ) ;
ok ( hr = = D3D_OK , " DrawPrimitiveUP failed (%08x) \n " , hr ) ;
hr = IDirect3DDevice9_EndScene ( device ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_EndScene returned %08x \n " , hr ) ;
2007-11-21 21:16:12 +00:00
}
IDirect3DDevice9_SetVertexShader ( device , NULL ) ;
IDirect3DDevice9_SetVertexDeclaration ( device , NULL ) ;
hr = IDirect3DDevice9_Present ( device , NULL , NULL , NULL , NULL ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_Present failed with %08x \n " , hr ) ;
2007-11-21 21:16:12 +00:00
color = getPixelColor ( device , 160 , 360 ) ;
2008-07-23 20:49:14 +00:00
ok ( color_match ( color , D3DCOLOR_ARGB ( 0x00 , 0xff , 0x80 , 0x40 ) , 1 ) ,
2007-11-21 21:16:12 +00:00
" Input test: Quad 1(color-texcoord) returned color 0x%08x, expected 0x00ff8040 \n " , color ) ;
color = getPixelColor ( device , 480 , 360 ) ;
2008-07-23 20:49:14 +00:00
ok ( color_match ( color , D3DCOLOR_ARGB ( 0x00 , 0x40 , 0x80 , 0xff ) , 1 ) ,
2007-11-21 21:16:12 +00:00
" Input test: Quad 2(color-ubyte) returned color 0x%08x, expected 0x004080ff \n " , color ) ;
color = getPixelColor ( device , 160 , 120 ) ;
2008-07-23 20:49:14 +00:00
ok ( color_match ( color , D3DCOLOR_ARGB ( 0x00 , 0xff , 0x80 , 0x40 ) , 1 ) ,
2007-11-21 21:16:12 +00:00
" Input test: Quad 3(color-color) returned color 0x%08x, expected 0x00ff8040 \n " , color ) ;
color = getPixelColor ( device , 480 , 160 ) ;
2008-07-23 20:49:14 +00:00
ok ( color_match ( color , D3DCOLOR_ARGB ( 0x00 , 0xff , 0xff , 0x00 ) , 1 ) ,
2007-11-21 21:16:12 +00:00
" Input test: Quad 4(color-float) returned color 0x%08x, expected 0x00FFFF00 \n " , color ) ;
IDirect3DVertexShader9_Release ( texcoord_color_shader ) ;
IDirect3DVertexShader9_Release ( color_color_shader ) ;
}
IDirect3DVertexDeclaration9_Release ( decl_twotexcrd ) ;
IDirect3DVertexDeclaration9_Release ( decl_onetexcrd ) ;
IDirect3DVertexDeclaration9_Release ( decl_twotex_wrongidx ) ;
IDirect3DVertexDeclaration9_Release ( decl_twotexcrd_rightorder ) ;
IDirect3DVertexDeclaration9_Release ( decl_texcoord_color ) ;
IDirect3DVertexDeclaration9_Release ( decl_color_color ) ;
IDirect3DVertexDeclaration9_Release ( decl_color_ubyte ) ;
IDirect3DVertexDeclaration9_Release ( decl_color_float ) ;
}
2008-03-19 17:07:31 +00:00
static void srgbtexture_test ( IDirect3DDevice9 * device )
{
/* Fill a texture with 0x7f (~ .5), and then turn on the D3DSAMP_SRGBTEXTURE
* texture stage state to render a quad using that texture . The resulting
* color components should be 0x36 ( ~ 0.21 ) , per this formula :
* linear_color = ( ( srgb_color + 0.055 ) / 1.055 ) ^ 2.4
* This is true where srgb_color > 0.04045 .
*/
IDirect3D9 * d3d = NULL ;
HRESULT hr ;
LPDIRECT3DTEXTURE9 texture = NULL ;
LPDIRECT3DSURFACE9 surface = NULL ;
D3DLOCKED_RECT lr ;
DWORD color ;
float quad [ ] = {
- 1.0 , 1.0 , 0.0 , 0.0 , 0.0 ,
1.0 , 1.0 , 0.0 , 1.0 , 0.0 ,
- 1.0 , - 1.0 , 0.0 , 0.0 , 1.0 ,
1.0 , - 1.0 , 0.0 , 1.0 , 1.0 ,
} ;
memset ( & lr , 0 , sizeof ( lr ) ) ;
IDirect3DDevice9_GetDirect3D ( device , & d3d ) ;
if ( IDirect3D9_CheckDeviceFormat ( d3d , 0 , D3DDEVTYPE_HAL , D3DFMT_X8R8G8B8 ,
D3DUSAGE_QUERY_SRGBREAD , D3DRTYPE_TEXTURE ,
D3DFMT_A8R8G8B8 ) ! = D3D_OK ) {
skip ( " D3DFMT_A8R8G8B8 textures with SRGBREAD not supported \n " ) ;
goto out ;
}
hr = IDirect3DDevice9_CreateTexture ( device , 16 , 16 , 1 , 0 ,
D3DFMT_A8R8G8B8 , D3DPOOL_MANAGED ,
& texture , NULL ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_CreateTexture failed with %08x \n " , hr ) ;
2008-03-19 17:07:31 +00:00
if ( ! texture ) {
skip ( " Failed to create A8R8G8B8 texture with SRGBREAD \n " ) ;
goto out ;
}
hr = IDirect3DTexture9_GetSurfaceLevel ( texture , 0 , & surface ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DTexture9_GetSurfaceLevel failed with %08x \n " , hr ) ;
2008-03-19 17:07:31 +00:00
fill_surface ( surface , 0xff7f7f7f ) ;
IDirect3DSurface9_Release ( surface ) ;
hr = IDirect3DDevice9_SetRenderState ( device , D3DRS_LIGHTING , FALSE ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetRenderState returned %08x \n " , hr ) ;
2008-03-19 17:07:31 +00:00
hr = IDirect3DDevice9_SetTexture ( device , 0 , ( IDirect3DBaseTexture9 * ) texture ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetTexture failed with %08x \n " , hr ) ;
2008-03-19 17:07:31 +00:00
hr = IDirect3DDevice9_BeginScene ( device ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_BeginScene failed with %08x \n " , hr ) ;
2008-03-19 17:07:31 +00:00
if ( SUCCEEDED ( hr ) )
{
hr = IDirect3DDevice9_SetSamplerState ( device , 0 , D3DSAMP_SRGBTEXTURE , TRUE ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetSamplerState failed with %08x \n " , hr ) ;
2008-03-19 17:07:31 +00:00
hr = IDirect3DDevice9_SetFVF ( device , D3DFVF_XYZ | D3DFVF_TEX1 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetFVF failed with %08x \n " , hr ) ;
2008-03-19 17:07:31 +00:00
hr = IDirect3DDevice9_DrawPrimitiveUP ( device , D3DPT_TRIANGLESTRIP , 2 , quad , 5 * sizeof ( float ) ) ;
2008-07-08 15:48:50 +00:00
ok ( SUCCEEDED ( hr ) , " DrawPrimitiveUP failed with %08x \n " , hr ) ;
2008-03-19 17:07:31 +00:00
hr = IDirect3DDevice9_EndScene ( device ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_EndScene failed with %08x \n " , hr ) ;
2008-03-19 17:07:31 +00:00
}
hr = IDirect3DDevice9_SetTexture ( device , 0 , NULL ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetTexture failed with %08x \n " , hr ) ;
2008-03-19 17:07:31 +00:00
hr = IDirect3DDevice9_SetSamplerState ( device , 0 , D3DSAMP_SRGBTEXTURE , FALSE ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetSamplerState failed with %08x \n " , hr ) ;
2008-03-19 17:07:31 +00:00
hr = IDirect3DDevice9_Present ( device , NULL , NULL , NULL , NULL ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_Present failed with %08x \n " , hr ) ;
2008-03-19 17:07:31 +00:00
color = getPixelColor ( device , 320 , 240 ) ;
2008-04-07 11:56:27 +00:00
ok ( color = = 0x00363636 | | color = = 0x00373737 , " srgb quad has color %08x, expected 0x00363636 \n " , color ) ;
2008-03-19 17:07:31 +00:00
out :
if ( texture ) IDirect3DTexture9_Release ( texture ) ;
IDirect3D9_Release ( d3d ) ;
}
2008-03-21 16:10:44 +00:00
static void shademode_test ( IDirect3DDevice9 * device )
{
/* Render a quad and try all of the different fixed function shading models. */
HRESULT hr ;
DWORD color0 , color1 ;
2008-03-26 22:23:10 +00:00
DWORD color0_gouraud = 0 , color1_gouraud = 0 ;
2008-03-21 16:10:44 +00:00
DWORD shademode = D3DSHADE_FLAT ;
DWORD primtype = D3DPT_TRIANGLESTRIP ;
LPVOID data = NULL ;
LPDIRECT3DVERTEXBUFFER9 vb_strip = NULL ;
LPDIRECT3DVERTEXBUFFER9 vb_list = NULL ;
UINT i , j ;
struct vertex quad_strip [ ] =
{
{ - 1.0f , - 1.0f , 0.0f , 0xffff0000 } ,
{ - 1.0f , 1.0f , 0.0f , 0xff00ff00 } ,
{ 1.0f , - 1.0f , 0.0f , 0xff0000ff } ,
{ 1.0f , 1.0f , 0.0f , 0xffffffff }
} ;
struct vertex quad_list [ ] =
{
{ - 1.0f , - 1.0f , 0.0f , 0xffff0000 } ,
{ - 1.0f , 1.0f , 0.0f , 0xff00ff00 } ,
{ 1.0f , - 1.0f , 0.0f , 0xff0000ff } ,
{ - 1.0f , 1.0f , 0.0f , 0xff00ff00 } ,
{ 1.0f , - 1.0f , 0.0f , 0xff0000ff } ,
{ 1.0f , 1.0f , 0.0f , 0xffffffff }
} ;
hr = IDirect3DDevice9_CreateVertexBuffer ( device , sizeof ( quad_strip ) ,
0 , 0 , D3DPOOL_MANAGED , & vb_strip , NULL ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " CreateVertexBuffer failed with %08x \n " , hr ) ;
2008-03-21 16:10:44 +00:00
if ( FAILED ( hr ) ) goto bail ;
hr = IDirect3DDevice9_CreateVertexBuffer ( device , sizeof ( quad_list ) ,
0 , 0 , D3DPOOL_MANAGED , & vb_list , NULL ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " CreateVertexBuffer failed with %08x \n " , hr ) ;
2008-03-21 16:10:44 +00:00
if ( FAILED ( hr ) ) goto bail ;
hr = IDirect3DDevice9_SetRenderState ( device , D3DRS_LIGHTING , FALSE ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetRenderState returned %08x \n " , hr ) ;
2008-03-21 16:10:44 +00:00
hr = IDirect3DDevice9_SetFVF ( device , D3DFVF_XYZ | D3DFVF_DIFFUSE ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetFVF failed with %08x \n " , hr ) ;
2008-03-21 16:10:44 +00:00
2009-01-20 09:00:20 +00:00
hr = IDirect3DVertexBuffer9_Lock ( vb_strip , 0 , sizeof ( quad_strip ) , & data , 0 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DVertexBuffer9_Lock failed with %08x \n " , hr ) ;
2008-03-21 16:10:44 +00:00
memcpy ( data , quad_strip , sizeof ( quad_strip ) ) ;
hr = IDirect3DVertexBuffer9_Unlock ( vb_strip ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DVertexBuffer9_Unlock failed with %08x \n " , hr ) ;
2008-03-21 16:10:44 +00:00
2009-01-20 09:00:20 +00:00
hr = IDirect3DVertexBuffer9_Lock ( vb_list , 0 , sizeof ( quad_list ) , & data , 0 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DVertexBuffer9_Lock failed with %08x \n " , hr ) ;
2008-03-21 16:10:44 +00:00
memcpy ( data , quad_list , sizeof ( quad_list ) ) ;
hr = IDirect3DVertexBuffer9_Unlock ( vb_list ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DVertexBuffer9_Unlock failed with %08x \n " , hr ) ;
2008-03-21 16:10:44 +00:00
/* Try it first with a TRIANGLESTRIP. Do it with different geometry because
* the color fixups we have to do for FLAT shading will be dependent on that . */
hr = IDirect3DDevice9_SetStreamSource ( device , 0 , vb_strip , 0 , sizeof ( quad_strip [ 0 ] ) ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetStreamSource failed with %08x \n " , hr ) ;
2008-03-21 16:10:44 +00:00
/* First loop uses a TRIANGLESTRIP geometry, 2nd uses a TRIANGLELIST */
for ( j = 0 ; j < 2 ; j + + ) {
/* Inner loop just changes the D3DRS_SHADEMODE */
for ( i = 0 ; i < 3 ; i + + ) {
hr = IDirect3DDevice9_Clear ( device , 0 , NULL , D3DCLEAR_TARGET , 0xffffffff , 0.0 , 0 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_Clear returned %08x \n " , hr ) ;
2008-03-21 16:10:44 +00:00
hr = IDirect3DDevice9_SetRenderState ( device , D3DRS_SHADEMODE , shademode ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetRenderState returned %08x \n " , hr ) ;
2008-03-21 16:10:44 +00:00
hr = IDirect3DDevice9_BeginScene ( device ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_BeginScene failed with %08x \n " , hr ) ;
2008-03-21 16:10:44 +00:00
if ( SUCCEEDED ( hr ) )
{
hr = IDirect3DDevice9_DrawPrimitive ( device , primtype , 0 , 2 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_DrawPrimitive failed with %08x \n " , hr ) ;
2008-03-21 16:10:44 +00:00
hr = IDirect3DDevice9_EndScene ( device ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_EndScene failed with %08x \n " , hr ) ;
2008-03-21 16:10:44 +00:00
}
hr = IDirect3DDevice9_Present ( device , NULL , NULL , NULL , NULL ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_Present failed with %08x \n " , hr ) ;
2008-03-21 16:10:44 +00:00
/* Sample two spots from the output */
color0 = getPixelColor ( device , 100 , 100 ) ; /* Inside first triangle */
color1 = getPixelColor ( device , 500 , 350 ) ; /* Inside second triangle */
switch ( shademode ) {
case D3DSHADE_FLAT :
/* Should take the color of the first vertex of each triangle */
todo_wine ok ( color0 = = 0x00ff0000 , " FLAT shading has color0 %08x, expected 0x00ff0000 (todo) \ n " , color0) ;
todo_wine ok ( color1 = = 0x0000ff00 , " FLAT shading has color1 %08x, expected 0x0000ff00 (todo) \ n " , color1) ;
shademode = D3DSHADE_GOURAUD ;
break ;
case D3DSHADE_GOURAUD :
/* Should be an interpolated blend */
2008-03-26 07:15:41 +00:00
2008-07-17 20:41:53 +00:00
ok ( color_match ( color0 , D3DCOLOR_ARGB ( 0x00 , 0x0d , 0xca , 0x28 ) , 2 ) ,
2008-05-12 20:54:18 +00:00
" GOURAUD shading has color0 %08x, expected 0x00dca28 \n " , color0 ) ;
2008-07-17 20:41:53 +00:00
ok ( color_match ( color1 , D3DCOLOR_ARGB ( 0x00 , 0x0d , 0x45 , 0xc7 ) , 2 ) ,
2008-03-26 07:15:41 +00:00
" GOURAUD shading has color1 %08x, expected 0x000d45c7 \n " , color1 ) ;
2008-03-26 22:23:10 +00:00
color0_gouraud = color0 ;
color1_gouraud = color1 ;
2008-03-21 16:10:44 +00:00
shademode = D3DSHADE_PHONG ;
break ;
case D3DSHADE_PHONG :
/* Should be the same as GOURAUD, since no hardware implements this */
2008-07-17 20:41:53 +00:00
ok ( color_match ( color0 , D3DCOLOR_ARGB ( 0x00 , 0x0d , 0xca , 0x28 ) , 2 ) ,
2008-03-26 07:15:41 +00:00
" PHONG shading has color0 %08x, expected 0x000dca28 \n " , color0 ) ;
2008-07-17 20:41:53 +00:00
ok ( color_match ( color1 , D3DCOLOR_ARGB ( 0x00 , 0x0d , 0x45 , 0xc7 ) , 2 ) ,
2008-03-26 07:15:41 +00:00
" PHONG shading has color1 %08x, expected 0x000d45c7 \n " , color1 ) ;
2008-03-26 22:23:10 +00:00
ok ( color0 = = color0_gouraud , " difference between GOURAUD and PHONG shading detected: %08x %08x \n " ,
color0_gouraud , color0 ) ;
ok ( color1 = = color1_gouraud , " difference between GOURAUD and PHONG shading detected: %08x %08x \n " ,
color1_gouraud , color1 ) ;
2008-03-21 16:10:44 +00:00
break ;
}
}
/* Now, do it all over again with a TRIANGLELIST */
hr = IDirect3DDevice9_SetStreamSource ( device , 0 , vb_list , 0 , sizeof ( quad_list [ 0 ] ) ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetStreamSource failed with %08x \n " , hr ) ;
2008-03-21 16:10:44 +00:00
primtype = D3DPT_TRIANGLELIST ;
shademode = D3DSHADE_FLAT ;
}
bail :
hr = IDirect3DDevice9_SetStreamSource ( device , 0 , NULL , 0 , 0 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetStreamSource failed with %08x \n " , hr ) ;
2008-03-21 16:10:44 +00:00
hr = IDirect3DDevice9_SetRenderState ( device , D3DRS_SHADEMODE , D3DSHADE_GOURAUD ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetRenderState returned %08x \n " , hr ) ;
2008-03-21 16:10:44 +00:00
if ( vb_strip )
IDirect3DVertexBuffer9_Release ( vb_strip ) ;
if ( vb_list )
IDirect3DVertexBuffer9_Release ( vb_list ) ;
}
2007-11-20 16:58:59 +00:00
static void fog_srgbwrite_test ( IDirect3DDevice9 * device )
{
/* Draw a black quad, half fogged with white fog -> grey color. Enable sRGB writing.
* if sRGB writing is applied before fogging , the 0.0 will be multiplied with ~ 12.92 , so still
* stay 0.0 . After that the fog gives 0.5 . If sRGB writing is applied after fogging , the
* 0.5 will run through the alternative path ( 0 ^ 5 ^ 0.41666 * 1.055 - 0.055 ) , resulting in approx .
* 0.73
*
* At the time of this writing , wined3d could not apply sRGB correction to fixed function rendering ,
* so use shaders for this task
*/
IDirect3DPixelShader9 * pshader ;
IDirect3DVertexShader9 * vshader ;
IDirect3D9 * d3d ;
DWORD vshader_code [ ] = {
0xfffe0101 , /* vs_1_1 */
0x0000001f , 0x80000000 , 0x900f0000 , /* dcl_position v0 */
0x00000051 , 0xa00f0000 , 0x3f000000 , 0x00000000 , 0x00000000 , 0x00000000 , /* def c0, 0.5, 0.0, 0.0, 0.0 */
0x00000001 , 0xc00f0000 , 0x90e40000 , /* mov oPos, v0 */
0x00000001 , 0xc00f0001 , 0xa0000000 , /* mov oFog, c0.x */
0x0000ffff /* end */
} ;
DWORD pshader_code [ ] = {
0xffff0101 , /* ps_1_1 */
0x00000051 , 0xa00f0000 , 0x00000000 , 0x00000000 , 0x00000000 , 0x00000000 , /* def c0, 0.0, 0.0, 0.0, 0.0 */
0x00000001 , 0x800f0000 , 0xa0e40000 , /* mov r0, c0 */
0x0000ffff /* end */
} ;
const float quad [ ] = {
- 1.0 , - 1.0 , 0.1 ,
1.0 , - 1.0 , 0.1 ,
- 1.0 , 1.0 , 0.1 ,
1.0 , 1.0 , 0.1
} ;
HRESULT hr ;
DWORD color ;
IDirect3DDevice9_GetDirect3D ( device , & d3d ) ;
2008-04-23 23:00:44 +00:00
/* Ask for srgb writing on D3DRTYPE_TEXTURE. Some Windows drivers do not report it on surfaces.
* For some not entirely understood reasons D3DUSAGE_RENDERTARGET | D3DUSAGE_QUERY_SRGBWRITE
* passes on surfaces , while asking for SRGBWRITE alone fails . Textures advertize srgb writing
* alone as well , so use that since it is not the point of this test to show how CheckDeviceFormat
* works
*/
2007-11-20 16:58:59 +00:00
if ( IDirect3D9_CheckDeviceFormat ( d3d , 0 , D3DDEVTYPE_HAL , D3DFMT_X8R8G8B8 ,
D3DUSAGE_RENDERTARGET | D3DUSAGE_QUERY_SRGBWRITE ,
2008-04-23 23:00:44 +00:00
D3DRTYPE_TEXTURE , D3DFMT_A8R8G8B8 ) ! = D3D_OK ) {
2007-11-20 16:58:59 +00:00
skip ( " No SRGBWRITEENABLE support on D3DFMT_X8R8G8B8 \n " ) ;
IDirect3D9_Release ( d3d ) ;
return ;
}
IDirect3D9_Release ( d3d ) ;
hr = IDirect3DDevice9_Clear ( device , 0 , NULL , D3DCLEAR_TARGET , 0xffffff00 , 0.0 , 0 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_Clear returned %08x \n " , hr ) ;
2007-11-20 16:58:59 +00:00
hr = IDirect3DDevice9_SetRenderState ( device , D3DRS_FOGENABLE , TRUE ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetRenderState returned %08x \n " , hr ) ;
2007-11-20 16:58:59 +00:00
hr = IDirect3DDevice9_SetRenderState ( device , D3DRS_FOGTABLEMODE , D3DFOG_NONE ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetRenderState returned %08x \n " , hr ) ;
2007-11-20 16:58:59 +00:00
hr = IDirect3DDevice9_SetRenderState ( device , D3DRS_FOGVERTEXMODE , D3DFOG_LINEAR ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetRenderState returned %08x \n " , hr ) ;
2007-11-20 16:58:59 +00:00
hr = IDirect3DDevice9_SetRenderState ( device , D3DRS_FOGCOLOR , 0xffffffff ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetRenderState returned %08x \n " , hr ) ;
2007-11-20 16:58:59 +00:00
hr = IDirect3DDevice9_SetRenderState ( device , D3DRS_SRGBWRITEENABLE , TRUE ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetRenderState returned %08x \n " , hr ) ;
2007-11-20 16:58:59 +00:00
hr = IDirect3DDevice9_CreateVertexShader ( device , vshader_code , & vshader ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_CreateVertexShader returned %08x \n " , hr ) ;
2007-11-20 16:58:59 +00:00
hr = IDirect3DDevice9_CreatePixelShader ( device , pshader_code , & pshader ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_CreatePixelShader returned %08x \n " , hr ) ;
2007-11-20 16:58:59 +00:00
hr = IDirect3DDevice9_SetFVF ( device , D3DFVF_XYZ ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetFVF returned %08x \n " , hr ) ;
2007-11-20 16:58:59 +00:00
hr = IDirect3DDevice9_SetVertexShader ( device , vshader ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetVertexShader returned %08x \n " , hr ) ;
2007-11-20 16:58:59 +00:00
hr = IDirect3DDevice9_SetPixelShader ( device , pshader ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetPixelShader returned %08x \n " , hr ) ;
2007-11-20 16:58:59 +00:00
hr = IDirect3DDevice9_BeginScene ( device ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_BeginScene returned %08x \n " , hr ) ;
2007-11-20 16:58:59 +00:00
if ( SUCCEEDED ( hr ) ) {
hr = IDirect3DDevice9_DrawPrimitiveUP ( device , D3DPT_TRIANGLESTRIP , 2 , quad , sizeof ( float ) * 3 ) ;
ok ( hr = = D3D_OK , " DrawPrimitiveUP failed (%08x) \n " , hr ) ;
hr = IDirect3DDevice9_EndScene ( device ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_EndScene returned %08x \n " , hr ) ;
2007-11-20 16:58:59 +00:00
}
hr = IDirect3DDevice9_SetVertexShader ( device , NULL ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetVertexShader returned %08x \n " , hr ) ;
2007-11-20 16:58:59 +00:00
hr = IDirect3DDevice9_SetPixelShader ( device , NULL ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetPixelShader returned %08x \n " , hr ) ;
2007-11-20 16:58:59 +00:00
IDirect3DPixelShader9_Release ( pshader ) ;
IDirect3DVertexShader9_Release ( vshader ) ;
hr = IDirect3DDevice9_SetRenderState ( device , D3DRS_FOGENABLE , FALSE ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetRenderState returned %08x \n " , hr ) ;
2007-11-20 16:58:59 +00:00
hr = IDirect3DDevice9_SetRenderState ( device , D3DRS_SRGBWRITEENABLE , FALSE ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetRenderState returned %08x \n " , hr ) ;
2007-11-20 16:58:59 +00:00
hr = IDirect3DDevice9_Present ( device , NULL , NULL , NULL , NULL ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_Present failed with %08x \n " , hr ) ;
2007-11-20 16:58:59 +00:00
color = getPixelColor ( device , 160 , 360 ) ;
ok ( color = = 0x00808080 | | color = = 0x007f7f7f | | color = = 0x00818181 ,
" Fog with D3DRS_SRGBWRITEENABLE returned color 0x%08x, expected 0x00808080 \n " , color ) ;
}
2007-12-06 21:33:26 +00:00
static void alpha_test ( IDirect3DDevice9 * device )
{
HRESULT hr ;
IDirect3DTexture9 * offscreenTexture ;
IDirect3DSurface9 * backbuffer = NULL , * offscreen = NULL ;
2008-06-23 21:56:09 +00:00
DWORD color ;
2007-12-06 21:33:26 +00:00
struct vertex quad1 [ ] =
{
{ - 1.0f , - 1.0f , 0.1f , 0x4000ff00 } ,
{ - 1.0f , 0.0f , 0.1f , 0x4000ff00 } ,
{ 1.0f , - 1.0f , 0.1f , 0x4000ff00 } ,
{ 1.0f , 0.0f , 0.1f , 0x4000ff00 } ,
} ;
struct vertex quad2 [ ] =
{
{ - 1.0f , 0.0f , 0.1f , 0xc00000ff } ,
{ - 1.0f , 1.0f , 0.1f , 0xc00000ff } ,
{ 1.0f , 0.0f , 0.1f , 0xc00000ff } ,
{ 1.0f , 1.0f , 0.1f , 0xc00000ff } ,
} ;
static const float composite_quad [ ] [ 5 ] = {
{ 0.0f , - 1.0f , 0.1f , 0.0f , 1.0f } ,
{ 0.0f , 1.0f , 0.1f , 0.0f , 0.0f } ,
{ 1.0f , - 1.0f , 0.1f , 1.0f , 1.0f } ,
{ 1.0f , 1.0f , 0.1f , 1.0f , 0.0f } ,
} ;
/* Clear the render target with alpha = 0.5 */
hr = IDirect3DDevice9_Clear ( device , 0 , NULL , D3DCLEAR_TARGET , 0x80ff0000 , 0.0 , 0 ) ;
ok ( hr = = D3D_OK , " Clear failed, hr = %08x \n " , hr ) ;
2008-05-24 08:33:20 +00:00
hr = IDirect3DDevice9_CreateTexture ( device , 128 , 128 , 1 , D3DUSAGE_RENDERTARGET , D3DFMT_X8R8G8B8 , D3DPOOL_DEFAULT , & offscreenTexture , NULL ) ;
2008-03-06 15:59:47 +00:00
ok ( hr = = D3D_OK | | hr = = D3DERR_INVALIDCALL , " Creating the offscreen render target failed, hr = %#08x \n " , hr ) ;
2007-12-06 21:33:26 +00:00
hr = IDirect3DDevice9_GetBackBuffer ( device , 0 , 0 , D3DBACKBUFFER_TYPE_MONO , & backbuffer ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " Can't get back buffer, hr = %08x \n " , hr ) ;
2007-12-06 21:33:26 +00:00
if ( ! backbuffer ) {
goto out ;
}
hr = IDirect3DTexture9_GetSurfaceLevel ( offscreenTexture , 0 , & offscreen ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " Can't get offscreen surface, hr = %08x \n " , hr ) ;
2007-12-06 21:33:26 +00:00
if ( ! offscreen ) {
goto out ;
}
hr = IDirect3DDevice9_SetFVF ( device , D3DFVF_XYZ | D3DFVF_DIFFUSE ) ;
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetFVF failed, hr = %#08x \n " , hr ) ;
hr = IDirect3DDevice9_SetTextureStageState ( device , 0 , D3DTSS_COLOROP , D3DTOP_SELECTARG1 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " SetTextureStageState failed, hr = %08x \n " , hr ) ;
2007-12-06 21:33:26 +00:00
hr = IDirect3DDevice9_SetTextureStageState ( device , 0 , D3DTSS_COLORARG1 , D3DTA_TEXTURE ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " SetTextureStageState failed, hr = %08x \n " , hr ) ;
2007-12-08 15:46:05 +00:00
hr = IDirect3DDevice9_SetSamplerState ( device , 0 , D3DSAMP_MINFILTER , D3DTEXF_POINT ) ;
2007-12-06 21:33:26 +00:00
ok ( SUCCEEDED ( hr ) , " SetSamplerState D3DSAMP_MINFILTER failed (0x%08x) \n " , hr ) ;
2007-12-08 15:46:05 +00:00
hr = IDirect3DDevice9_SetSamplerState ( device , 0 , D3DSAMP_MAGFILTER , D3DTEXF_POINT ) ;
2007-12-06 21:33:26 +00:00
ok ( SUCCEEDED ( hr ) , " SetSamplerState D3DSAMP_MAGFILTER failed (0x%08x) \n " , hr ) ;
hr = IDirect3DDevice9_SetRenderState ( device , D3DRS_LIGHTING , FALSE ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetRenderState returned %08x \n " , hr ) ;
2007-12-06 21:33:26 +00:00
hr = IDirect3DDevice9_SetRenderState ( device , D3DRS_ALPHABLENDENABLE , TRUE ) ;
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetRenderState failed, hr = %08x \n " , hr ) ;
if ( IDirect3DDevice9_BeginScene ( device ) = = D3D_OK ) {
2008-05-24 08:33:20 +00:00
/* Draw two quads, one with src alpha blending, one with dest alpha blending. */
2007-12-06 21:33:26 +00:00
hr = IDirect3DDevice9_SetRenderState ( device , D3DRS_SRCBLEND , D3DBLEND_SRCALPHA ) ;
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetRenderState failed, hr = %08x \n " , hr ) ;
hr = IDirect3DDevice9_SetRenderState ( device , D3DRS_DESTBLEND , D3DBLEND_INVSRCALPHA ) ;
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetRenderState failed, hr = %08x \n " , hr ) ;
hr = IDirect3DDevice9_DrawPrimitiveUP ( device , D3DPT_TRIANGLESTRIP , 2 , quad1 , sizeof ( quad1 [ 0 ] ) ) ;
ok ( hr = = D3D_OK , " DrawPrimitiveUP failed, hr = %#08x \n " , hr ) ;
hr = IDirect3DDevice9_SetRenderState ( device , D3DRS_SRCBLEND , D3DBLEND_DESTALPHA ) ;
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetRenderState failed, hr = %08x \n " , hr ) ;
hr = IDirect3DDevice9_SetRenderState ( device , D3DRS_DESTBLEND , D3DBLEND_INVDESTALPHA ) ;
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetRenderState failed, hr = %08x \n " , hr ) ;
hr = IDirect3DDevice9_DrawPrimitiveUP ( device , D3DPT_TRIANGLESTRIP , 2 , quad2 , sizeof ( quad2 [ 0 ] ) ) ;
ok ( hr = = D3D_OK , " DrawPrimitiveUP failed, hr = %#08x \n " , hr ) ;
2008-05-24 08:33:20 +00:00
/* Switch to the offscreen buffer, and redo the testing. The offscreen render target
* doesn ' t have an alpha channel . DESTALPHA and INVDESTALPHA " don't work " on render
* targets without alpha channel , they give essentially ZERO and ONE blend factors . */
2007-12-06 21:33:26 +00:00
hr = IDirect3DDevice9_SetRenderTarget ( device , 0 , offscreen ) ;
ok ( hr = = D3D_OK , " Can't get back buffer, hr = %08x \n " , hr ) ;
hr = IDirect3DDevice9_Clear ( device , 0 , NULL , D3DCLEAR_TARGET , 0x80ff0000 , 0.0 , 0 ) ;
ok ( hr = = D3D_OK , " Clear failed, hr = %08x \n " , hr ) ;
hr = IDirect3DDevice9_SetRenderState ( device , D3DRS_SRCBLEND , D3DBLEND_SRCALPHA ) ;
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetRenderState failed, hr = %08x \n " , hr ) ;
hr = IDirect3DDevice9_SetRenderState ( device , D3DRS_DESTBLEND , D3DBLEND_INVSRCALPHA ) ;
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetRenderState failed, hr = %08x \n " , hr ) ;
hr = IDirect3DDevice9_DrawPrimitiveUP ( device , D3DPT_TRIANGLESTRIP , 2 , quad1 , sizeof ( quad1 [ 0 ] ) ) ;
ok ( hr = = D3D_OK , " DrawPrimitiveUP failed, hr = %#08x \n " , hr ) ;
hr = IDirect3DDevice9_SetRenderState ( device , D3DRS_SRCBLEND , D3DBLEND_DESTALPHA ) ;
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetRenderState failed, hr = %08x \n " , hr ) ;
hr = IDirect3DDevice9_SetRenderState ( device , D3DRS_DESTBLEND , D3DBLEND_INVDESTALPHA ) ;
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetRenderState failed, hr = %08x \n " , hr ) ;
hr = IDirect3DDevice9_DrawPrimitiveUP ( device , D3DPT_TRIANGLESTRIP , 2 , quad2 , sizeof ( quad2 [ 0 ] ) ) ;
ok ( hr = = D3D_OK , " DrawPrimitiveUP failed, hr = %#08x \n " , hr ) ;
hr = IDirect3DDevice9_SetRenderTarget ( device , 0 , backbuffer ) ;
ok ( hr = = D3D_OK , " Can't get back buffer, hr = %08x \n " , hr ) ;
/* Render the offscreen texture onto the frame buffer to be able to compare it regularly.
* Disable alpha blending for the final composition
*/
hr = IDirect3DDevice9_SetRenderState ( device , D3DRS_ALPHABLENDENABLE , FALSE ) ;
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetRenderState failed, hr = %08x \n " , hr ) ;
hr = IDirect3DDevice9_SetFVF ( device , D3DFVF_XYZ | D3DFVF_TEX1 ) ;
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetFVF failed, hr = %#08x \n " , hr ) ;
hr = IDirect3DDevice9_SetTexture ( device , 0 , ( IDirect3DBaseTexture9 * ) offscreenTexture ) ;
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetTexture failed, hr = %08x \n " , hr ) ;
hr = IDirect3DDevice9_DrawPrimitiveUP ( device , D3DPT_TRIANGLESTRIP , 2 , composite_quad , sizeof ( float ) * 5 ) ;
ok ( hr = = D3D_OK , " DrawPrimitiveUP failed, hr = %#08x \n " , hr ) ;
hr = IDirect3DDevice9_SetTexture ( device , 0 , NULL ) ;
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetTexture failed, hr = %08x \n " , hr ) ;
hr = IDirect3DDevice9_EndScene ( device ) ;
ok ( hr = = D3D_OK , " IDirect3DDevice7_EndScene failed, hr = %08x \n " , hr ) ;
}
IDirect3DDevice9_Present ( device , NULL , NULL , NULL , NULL ) ;
color = getPixelColor ( device , 160 , 360 ) ;
2008-06-23 21:56:09 +00:00
ok ( color_match ( color , D3DCOLOR_ARGB ( 0x00 , 0xbf , 0x40 , 0x00 ) , 1 ) ,
2007-12-06 21:33:26 +00:00
" SRCALPHA on frame buffer returned color %08x, expected 0x00bf4000 \n " , color ) ;
color = getPixelColor ( device , 160 , 120 ) ;
2008-06-23 21:56:09 +00:00
ok ( color_match ( color , D3DCOLOR_ARGB ( 0x00 , 0x7f , 0x00 , 0x80 ) , 2 ) ,
" DSTALPHA on frame buffer returned color %08x, expected 0x007f0080 \n " , color ) ;
2007-12-06 21:33:26 +00:00
color = getPixelColor ( device , 480 , 360 ) ;
2008-06-23 21:56:09 +00:00
ok ( color_match ( color , D3DCOLOR_ARGB ( 0x00 , 0xbf , 0x40 , 0x00 ) , 1 ) ,
" SRCALPHA on texture returned color %08x, expected 0x00bf4000 \n " , color ) ;
2007-12-06 21:33:26 +00:00
color = getPixelColor ( device , 480 , 120 ) ;
2008-06-23 21:56:09 +00:00
ok ( color_match ( color , D3DCOLOR_ARGB ( 0x00 , 0x00 , 0x00 , 0xff ) , 1 ) ,
" DSTALPHA on texture returned color %08x, expected 0x000000ff \n " , color ) ;
2007-12-06 21:33:26 +00:00
out :
/* restore things */
if ( backbuffer ) {
IDirect3DSurface9_Release ( backbuffer ) ;
}
if ( offscreenTexture ) {
IDirect3DTexture9_Release ( offscreenTexture ) ;
}
if ( offscreen ) {
IDirect3DSurface9_Release ( offscreen ) ;
}
}
2007-12-19 16:10:02 +00:00
struct vertex_shortcolor {
float x , y , z ;
unsigned short r , g , b , a ;
} ;
struct vertex_floatcolor {
float x , y , z ;
float r , g , b , a ;
} ;
static void fixed_function_decl_test ( IDirect3DDevice9 * device )
{
HRESULT hr ;
2008-02-04 22:35:07 +00:00
BOOL s_ok , ub_ok , f_ok ;
2007-12-20 22:40:12 +00:00
DWORD color , size , i ;
2007-12-19 16:10:02 +00:00
void * data ;
static const D3DVERTEXELEMENT9 decl_elements_d3dcolor [ ] = {
{ 0 , 0 , D3DDECLTYPE_FLOAT3 , D3DDECLMETHOD_DEFAULT , D3DDECLUSAGE_POSITION , 0 } ,
{ 0 , 12 , D3DDECLTYPE_D3DCOLOR , D3DDECLMETHOD_DEFAULT , D3DDECLUSAGE_COLOR , 0 } ,
D3DDECL_END ( )
} ;
2007-12-19 21:56:01 +00:00
static const D3DVERTEXELEMENT9 decl_elements_d3dcolor_2streams [ ] = {
{ 0 , 0 , D3DDECLTYPE_FLOAT3 , D3DDECLMETHOD_DEFAULT , D3DDECLUSAGE_POSITION , 0 } ,
{ 1 , 0 , D3DDECLTYPE_D3DCOLOR , D3DDECLMETHOD_DEFAULT , D3DDECLUSAGE_COLOR , 0 } ,
D3DDECL_END ( )
} ;
2007-12-19 16:10:02 +00:00
static const D3DVERTEXELEMENT9 decl_elements_ubyte4n [ ] = {
{ 0 , 0 , D3DDECLTYPE_FLOAT3 , D3DDECLMETHOD_DEFAULT , D3DDECLUSAGE_POSITION , 0 } ,
{ 0 , 12 , D3DDECLTYPE_UBYTE4N , D3DDECLMETHOD_DEFAULT , D3DDECLUSAGE_COLOR , 0 } ,
D3DDECL_END ( )
} ;
2007-12-19 21:56:01 +00:00
static const D3DVERTEXELEMENT9 decl_elements_ubyte4n_2streams [ ] = {
{ 0 , 0 , D3DDECLTYPE_FLOAT3 , D3DDECLMETHOD_DEFAULT , D3DDECLUSAGE_POSITION , 0 } ,
{ 1 , 0 , D3DDECLTYPE_UBYTE4N , D3DDECLMETHOD_DEFAULT , D3DDECLUSAGE_COLOR , 0 } ,
D3DDECL_END ( )
} ;
2007-12-19 16:10:02 +00:00
static const D3DVERTEXELEMENT9 decl_elements_short4 [ ] = {
{ 0 , 0 , D3DDECLTYPE_FLOAT3 , D3DDECLMETHOD_DEFAULT , D3DDECLUSAGE_POSITION , 0 } ,
{ 0 , 12 , D3DDECLTYPE_USHORT4N , D3DDECLMETHOD_DEFAULT , D3DDECLUSAGE_COLOR , 0 } ,
D3DDECL_END ( )
} ;
static const D3DVERTEXELEMENT9 decl_elements_float [ ] = {
{ 0 , 0 , D3DDECLTYPE_FLOAT3 , D3DDECLMETHOD_DEFAULT , D3DDECLUSAGE_POSITION , 0 } ,
{ 0 , 12 , D3DDECLTYPE_FLOAT4 , D3DDECLMETHOD_DEFAULT , D3DDECLUSAGE_COLOR , 0 } ,
D3DDECL_END ( )
} ;
2007-12-20 00:22:57 +00:00
static const D3DVERTEXELEMENT9 decl_elements_positiont [ ] = {
{ 0 , 0 , D3DDECLTYPE_FLOAT4 , D3DDECLMETHOD_DEFAULT , D3DDECLUSAGE_POSITIONT , 0 } ,
{ 0 , 16 , D3DDECLTYPE_D3DCOLOR , D3DDECLMETHOD_DEFAULT , D3DDECLUSAGE_COLOR , 0 } ,
D3DDECL_END ( )
} ;
2007-12-19 16:10:02 +00:00
IDirect3DVertexDeclaration9 * dcl_float = NULL , * dcl_short = NULL , * dcl_ubyte = NULL , * dcl_color = NULL ;
2007-12-20 00:22:57 +00:00
IDirect3DVertexDeclaration9 * dcl_color_2 = NULL , * dcl_ubyte_2 = NULL , * dcl_positiont ;
2007-12-19 21:56:01 +00:00
IDirect3DVertexBuffer9 * vb , * vb2 ;
2007-12-19 16:10:02 +00:00
struct vertex quad1 [ ] = /* D3DCOLOR */
{
{ - 1.0f , - 1.0f , 0.1f , 0x00ffff00 } ,
{ - 1.0f , 0.0f , 0.1f , 0x00ffff00 } ,
{ 0.0f , - 1.0f , 0.1f , 0x00ffff00 } ,
{ 0.0f , 0.0f , 0.1f , 0x00ffff00 } ,
} ;
struct vertex quad2 [ ] = /* UBYTE4N */
{
{ - 1.0f , 0.0f , 0.1f , 0x00ffff00 } ,
{ - 1.0f , 1.0f , 0.1f , 0x00ffff00 } ,
{ 0.0f , 0.0f , 0.1f , 0x00ffff00 } ,
{ 0.0f , 1.0f , 0.1f , 0x00ffff00 } ,
} ;
struct vertex_shortcolor quad3 [ ] = /* short */
{
{ 0.0f , - 1.0f , 0.1f , 0x0000 , 0x0000 , 0xffff , 0xffff } ,
{ 0.0f , 0.0f , 0.1f , 0x0000 , 0x0000 , 0xffff , 0xffff } ,
{ 1.0f , - 1.0f , 0.1f , 0x0000 , 0x0000 , 0xffff , 0xffff } ,
{ 1.0f , 0.0f , 0.1f , 0x0000 , 0x0000 , 0xffff , 0xffff } ,
} ;
struct vertex_floatcolor quad4 [ ] =
{
{ 0.0f , 0.0f , 0.1f , 1.0 , 0.0 , 0.0 , 0.0 } ,
{ 0.0f , 1.0f , 0.1f , 1.0 , 0.0 , 0.0 , 0.0 } ,
{ 1.0f , 0.0f , 0.1f , 1.0 , 0.0 , 0.0 , 0.0 } ,
{ 1.0f , 1.0f , 0.1f , 1.0 , 0.0 , 0.0 , 0.0 } ,
} ;
2007-12-19 21:56:01 +00:00
DWORD colors [ ] = {
0x00ff0000 , 0x0000ff00 , 0x000000ff , 0x00ffffff ,
0x00ff0000 , 0x0000ff00 , 0x000000ff , 0x00ffffff ,
0x00ff0000 , 0x0000ff00 , 0x000000ff , 0x00ffffff ,
0x00ff0000 , 0x0000ff00 , 0x000000ff , 0x00ffffff ,
0x00ff0000 , 0x0000ff00 , 0x000000ff , 0x00ffffff ,
0x00ff0000 , 0x0000ff00 , 0x000000ff , 0x00ffffff ,
0x00ff0000 , 0x0000ff00 , 0x000000ff , 0x00ffffff ,
0x00ff0000 , 0x0000ff00 , 0x000000ff , 0x00ffffff ,
0x00ff0000 , 0x0000ff00 , 0x000000ff , 0x00ffffff ,
0x00ff0000 , 0x0000ff00 , 0x000000ff , 0x00ffffff ,
0x00ff0000 , 0x0000ff00 , 0x000000ff , 0x00ffffff ,
0x00ff0000 , 0x0000ff00 , 0x000000ff , 0x00ffffff ,
0x00ff0000 , 0x0000ff00 , 0x000000ff , 0x00ffffff ,
0x00ff0000 , 0x0000ff00 , 0x000000ff , 0x00ffffff ,
0x00ff0000 , 0x0000ff00 , 0x000000ff , 0x00ffffff ,
0x00ff0000 , 0x0000ff00 , 0x000000ff , 0x00ffffff ,
} ;
float quads [ ] = {
- 1.0 , - 1.0 , 0.1 ,
- 1.0 , 0.0 , 0.1 ,
0.0 , - 1.0 , 0.1 ,
0.0 , 0.0 , 0.1 ,
0.0 , - 1.0 , 0.1 ,
0.0 , 0.0 , 0.1 ,
1.0 , - 1.0 , 0.1 ,
1.0 , 0.0 , 0.1 ,
0.0 , 0.0 , 0.1 ,
0.0 , 1.0 , 0.1 ,
1.0 , 0.0 , 0.1 ,
1.0 , 1.0 , 0.1 ,
- 1.0 , 0.0 , 0.1 ,
- 1.0 , 1.0 , 0.1 ,
0.0 , 0.0 , 0.1 ,
0.0 , 1.0 , 0.1
} ;
2007-12-20 00:22:57 +00:00
struct tvertex quad_transformed [ ] = {
{ 90 , 110 , 0.1 , 2.0 , 0x00ffff00 } ,
{ 570 , 110 , 0.1 , 2.0 , 0x00ffff00 } ,
{ 90 , 300 , 0.1 , 2.0 , 0x00ffff00 } ,
{ 570 , 300 , 0.1 , 2.0 , 0x00ffff00 }
} ;
2008-02-12 01:34:27 +00:00
D3DCAPS9 caps ;
memset ( & caps , 0 , sizeof ( caps ) ) ;
hr = IDirect3DDevice9_GetDeviceCaps ( device , & caps ) ;
ok ( hr = = D3D_OK , " GetDeviceCaps failed, hr = %08x \n " , hr ) ;
2007-12-19 16:10:02 +00:00
hr = IDirect3DDevice9_Clear ( device , 0 , NULL , D3DCLEAR_TARGET , 0xffffffff , 0.0 , 0 ) ;
ok ( hr = = D3D_OK , " Clear failed, hr = %08x \n " , hr ) ;
hr = IDirect3DDevice9_CreateVertexDeclaration ( device , decl_elements_d3dcolor , & dcl_color ) ;
ok ( SUCCEEDED ( hr ) , " CreateVertexDeclaration failed (%08x) \n " , hr ) ;
hr = IDirect3DDevice9_CreateVertexDeclaration ( device , decl_elements_short4 , & dcl_short ) ;
ok ( SUCCEEDED ( hr ) | | hr = = E_FAIL , " CreateVertexDeclaration failed (%08x) \n " , hr ) ;
hr = IDirect3DDevice9_CreateVertexDeclaration ( device , decl_elements_float , & dcl_float ) ;
ok ( SUCCEEDED ( hr ) , " CreateVertexDeclaration failed (%08x) \n " , hr ) ;
2008-02-12 01:34:27 +00:00
if ( caps . DeclTypes & D3DDTCAPS_UBYTE4N ) {
hr = IDirect3DDevice9_CreateVertexDeclaration ( device , decl_elements_ubyte4n_2streams , & dcl_ubyte_2 ) ;
ok ( SUCCEEDED ( hr ) , " CreateVertexDeclaration failed (%08x) \n " , hr ) ;
hr = IDirect3DDevice9_CreateVertexDeclaration ( device , decl_elements_ubyte4n , & dcl_ubyte ) ;
ok ( SUCCEEDED ( hr ) , " CreateVertexDeclaration failed (%08x) \n " , hr ) ;
} else {
trace ( " D3DDTCAPS_UBYTE4N not supported \n " ) ;
dcl_ubyte_2 = NULL ;
dcl_ubyte = NULL ;
}
2007-12-19 21:56:01 +00:00
hr = IDirect3DDevice9_CreateVertexDeclaration ( device , decl_elements_d3dcolor_2streams , & dcl_color_2 ) ;
ok ( SUCCEEDED ( hr ) , " CreateVertexDeclaration failed (%08x) \n " , hr ) ;
2007-12-20 00:22:57 +00:00
hr = IDirect3DDevice9_CreateVertexDeclaration ( device , decl_elements_positiont , & dcl_positiont ) ;
ok ( SUCCEEDED ( hr ) , " CreateVertexDeclaration failed (%08x) \n " , hr ) ;
2007-12-19 16:10:02 +00:00
2007-12-19 21:56:01 +00:00
size = max ( sizeof ( quad1 ) , max ( sizeof ( quad2 ) , max ( sizeof ( quad3 ) , max ( sizeof ( quad4 ) , sizeof ( quads ) ) ) ) ) ;
hr = IDirect3DDevice9_CreateVertexBuffer ( device , size ,
2007-12-19 16:10:02 +00:00
0 , 0 , D3DPOOL_MANAGED , & vb , NULL ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " CreateVertexBuffer failed with %08x \n " , hr ) ;
2007-12-19 16:10:02 +00:00
hr = IDirect3DDevice9_BeginScene ( device ) ;
ok ( hr = = D3D_OK , " IDirect3DDevice9_BeginScene failed (%08x) \n " , hr ) ;
2008-02-04 22:35:07 +00:00
f_ok = FALSE ; s_ok = FALSE ; ub_ok = FALSE ;
2007-12-19 16:10:02 +00:00
if ( SUCCEEDED ( hr ) ) {
if ( dcl_color ) {
hr = IDirect3DDevice9_SetVertexDeclaration ( device , dcl_color ) ;
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetVertexDeclaration failed (%08x) \n " , hr ) ;
hr = IDirect3DDevice9_DrawPrimitiveUP ( device , D3DPT_TRIANGLESTRIP , 2 , quad1 , sizeof ( quad1 [ 0 ] ) ) ;
ok ( hr = = D3D_OK , " DrawPrimitiveUP failed, hr = %#08x \n " , hr ) ;
}
2008-02-04 22:35:07 +00:00
/* Tests with non-standard fixed function types fail on the refrast. The ATI driver partially
* accepts them , the nvidia driver accepts them all . All those differences even though we ' re
* using software vertex processing . Doh !
*/
2007-12-19 16:10:02 +00:00
if ( dcl_ubyte ) {
hr = IDirect3DDevice9_SetVertexDeclaration ( device , dcl_ubyte ) ;
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetVertexDeclaration failed (%08x) \n " , hr ) ;
hr = IDirect3DDevice9_DrawPrimitiveUP ( device , D3DPT_TRIANGLESTRIP , 2 , quad2 , sizeof ( quad2 [ 0 ] ) ) ;
2008-02-04 22:35:07 +00:00
ok ( hr = = D3D_OK | | hr = = D3DERR_INVALIDCALL , " DrawPrimitiveUP failed, hr = %#08x \n " , hr ) ;
ub_ok = SUCCEEDED ( hr ) ;
2007-12-19 16:10:02 +00:00
}
if ( dcl_short ) {
hr = IDirect3DDevice9_SetVertexDeclaration ( device , dcl_short ) ;
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetVertexDeclaration failed (%08x) \n " , hr ) ;
hr = IDirect3DDevice9_DrawPrimitiveUP ( device , D3DPT_TRIANGLESTRIP , 2 , quad3 , sizeof ( quad3 [ 0 ] ) ) ;
2008-02-04 22:35:07 +00:00
ok ( hr = = D3D_OK | | hr = = D3DERR_INVALIDCALL , " DrawPrimitiveUP failed, hr = %#08x \n " , hr ) ;
s_ok = SUCCEEDED ( hr ) ;
2007-12-19 16:10:02 +00:00
}
if ( dcl_float ) {
hr = IDirect3DDevice9_SetVertexDeclaration ( device , dcl_float ) ;
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetVertexDeclaration failed (%08x) \n " , hr ) ;
hr = IDirect3DDevice9_DrawPrimitiveUP ( device , D3DPT_TRIANGLESTRIP , 2 , quad4 , sizeof ( quad4 [ 0 ] ) ) ;
2008-02-04 22:35:07 +00:00
ok ( hr = = D3D_OK | | hr = = D3DERR_INVALIDCALL , " DrawPrimitiveUP failed, hr = %#08x \n " , hr ) ;
f_ok = SUCCEEDED ( hr ) ;
2007-12-19 16:10:02 +00:00
}
hr = IDirect3DDevice9_EndScene ( device ) ;
ok ( hr = = D3D_OK , " IDirect3DDevice9_EndScene failed, hr = %#08x \n " , hr ) ;
}
IDirect3DDevice9_Present ( device , NULL , NULL , NULL , NULL ) ;
if ( dcl_short ) {
color = getPixelColor ( device , 480 , 360 ) ;
2008-02-04 22:35:07 +00:00
ok ( color = = 0x000000ff | | ! s_ok ,
2007-12-19 16:10:02 +00:00
" D3DDECLTYPE_USHORT4N returned color %08x, expected 0x000000ff \n " , color ) ;
}
if ( dcl_ubyte ) {
color = getPixelColor ( device , 160 , 120 ) ;
2008-02-04 22:35:07 +00:00
ok ( color = = 0x0000ffff | | ! ub_ok ,
2007-12-19 16:10:02 +00:00
" D3DDECLTYPE_UBYTE4N returned color %08x, expected 0x0000ffff \n " , color ) ;
}
if ( dcl_color ) {
color = getPixelColor ( device , 160 , 360 ) ;
ok ( color = = 0x00ffff00 ,
" D3DDECLTYPE_D3DCOLOR returned color %08x, expected 0x00ffff00 \n " , color ) ;
}
if ( dcl_float ) {
color = getPixelColor ( device , 480 , 120 ) ;
2008-02-04 22:35:07 +00:00
ok ( color = = 0x00ff0000 | | ! f_ok ,
2007-12-19 16:10:02 +00:00
" D3DDECLTYPE_FLOAT4 returned color %08x, expected 0x00ff0000 \n " , color ) ;
}
/* The following test with vertex buffers doesn't serve to find out new information from windows.
* It is a plain regression test because wined3d uses different codepaths for attribute conversion
* with vertex buffers . It makes sure that the vertex buffer one works , while the above tests
2008-01-16 11:20:50 +00:00
* whether the immediate mode code works
2007-12-19 16:10:02 +00:00
*/
2008-02-04 22:35:07 +00:00
f_ok = FALSE ; s_ok = FALSE ; ub_ok = FALSE ;
2007-12-19 16:10:02 +00:00
hr = IDirect3DDevice9_BeginScene ( device ) ;
ok ( hr = = D3D_OK , " IDirect3DDevice9_BeginScene failed (%08x) \n " , hr ) ;
if ( SUCCEEDED ( hr ) ) {
if ( dcl_color ) {
2009-01-20 09:00:20 +00:00
hr = IDirect3DVertexBuffer9_Lock ( vb , 0 , sizeof ( quad1 ) , & data , 0 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DVertexBuffer9_Lock failed with %08x \n " , hr ) ;
2007-12-19 16:10:02 +00:00
memcpy ( data , quad1 , sizeof ( quad1 ) ) ;
hr = IDirect3DVertexBuffer9_Unlock ( vb ) ;
ok ( hr = = D3D_OK , " IDirect3DVertexBuffer9_Unlock failed (%08x) \n " , hr ) ;
hr = IDirect3DDevice9_SetVertexDeclaration ( device , dcl_color ) ;
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetVertexDeclaration failed (%08x) \n " , hr ) ;
hr = IDirect3DDevice9_SetStreamSource ( device , 0 , vb , 0 , sizeof ( quad1 [ 0 ] ) ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetStreamSource failed with %08x \n " , hr ) ;
2007-12-19 16:10:02 +00:00
hr = IDirect3DDevice9_DrawPrimitive ( device , D3DPT_TRIANGLESTRIP , 0 , 2 ) ;
ok ( hr = = D3D_OK , " IDirect3DDevice9_DrawPrimitive failed, hr = %#08x \n " , hr ) ;
}
if ( dcl_ubyte ) {
2009-01-20 09:00:20 +00:00
hr = IDirect3DVertexBuffer9_Lock ( vb , 0 , sizeof ( quad2 ) , & data , 0 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DVertexBuffer9_Lock failed with %08x \n " , hr ) ;
2007-12-19 16:10:02 +00:00
memcpy ( data , quad2 , sizeof ( quad2 ) ) ;
hr = IDirect3DVertexBuffer9_Unlock ( vb ) ;
ok ( hr = = D3D_OK , " IDirect3DVertexBuffer9_Unlock failed (%08x) \n " , hr ) ;
hr = IDirect3DDevice9_SetVertexDeclaration ( device , dcl_ubyte ) ;
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetVertexDeclaration failed (%08x) \n " , hr ) ;
hr = IDirect3DDevice9_SetStreamSource ( device , 0 , vb , 0 , sizeof ( quad2 [ 0 ] ) ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetStreamSource failed with %08x \n " , hr ) ;
2007-12-19 16:10:02 +00:00
hr = IDirect3DDevice9_DrawPrimitive ( device , D3DPT_TRIANGLESTRIP , 0 , 2 ) ;
2008-02-04 22:35:07 +00:00
ok ( hr = = D3D_OK | | hr = = D3DERR_INVALIDCALL ,
" IDirect3DDevice9_DrawPrimitive failed, hr = %#08x \n " , hr ) ;
ub_ok = SUCCEEDED ( hr ) ;
2007-12-19 16:10:02 +00:00
}
if ( dcl_short ) {
2009-01-20 09:00:20 +00:00
hr = IDirect3DVertexBuffer9_Lock ( vb , 0 , sizeof ( quad3 ) , & data , 0 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DVertexBuffer9_Lock failed with %08x \n " , hr ) ;
2007-12-19 16:10:02 +00:00
memcpy ( data , quad3 , sizeof ( quad3 ) ) ;
hr = IDirect3DVertexBuffer9_Unlock ( vb ) ;
ok ( hr = = D3D_OK , " IDirect3DVertexBuffer9_Unlock failed (%08x) \n " , hr ) ;
hr = IDirect3DDevice9_SetVertexDeclaration ( device , dcl_short ) ;
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetVertexDeclaration failed (%08x) \n " , hr ) ;
hr = IDirect3DDevice9_SetStreamSource ( device , 0 , vb , 0 , sizeof ( quad3 [ 0 ] ) ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetStreamSource failed with %08x \n " , hr ) ;
2007-12-19 16:10:02 +00:00
hr = IDirect3DDevice9_DrawPrimitive ( device , D3DPT_TRIANGLESTRIP , 0 , 2 ) ;
2008-02-04 22:35:07 +00:00
ok ( hr = = D3D_OK | | hr = = D3DERR_INVALIDCALL ,
" IDirect3DDevice9_DrawPrimitive failed, hr = %#08x \n " , hr ) ;
s_ok = SUCCEEDED ( hr ) ;
2007-12-19 16:10:02 +00:00
}
if ( dcl_float ) {
2009-01-20 09:00:20 +00:00
hr = IDirect3DVertexBuffer9_Lock ( vb , 0 , sizeof ( quad4 ) , & data , 0 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DVertexBuffer9_Lock failed with %08x \n " , hr ) ;
2007-12-19 16:10:02 +00:00
memcpy ( data , quad4 , sizeof ( quad4 ) ) ;
hr = IDirect3DVertexBuffer9_Unlock ( vb ) ;
ok ( hr = = D3D_OK , " IDirect3DVertexBuffer9_Unlock failed (%08x) \n " , hr ) ;
hr = IDirect3DDevice9_SetVertexDeclaration ( device , dcl_float ) ;
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetVertexDeclaration failed (%08x) \n " , hr ) ;
hr = IDirect3DDevice9_SetStreamSource ( device , 0 , vb , 0 , sizeof ( quad4 [ 0 ] ) ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetStreamSource failed with %08x \n " , hr ) ;
2007-12-19 16:10:02 +00:00
hr = IDirect3DDevice9_DrawPrimitive ( device , D3DPT_TRIANGLESTRIP , 0 , 2 ) ;
2008-02-04 22:35:07 +00:00
ok ( hr = = D3D_OK | | hr = = D3DERR_INVALIDCALL ,
" IDirect3DDevice9_DrawPrimitive failed, hr = %#08x \n " , hr ) ;
f_ok = SUCCEEDED ( hr ) ;
2007-12-19 16:10:02 +00:00
}
hr = IDirect3DDevice9_EndScene ( device ) ;
ok ( hr = = D3D_OK , " IDirect3DDevice9_EndScene failed, hr = %#08x \n " , hr ) ;
}
hr = IDirect3DDevice9_SetStreamSource ( device , 0 , NULL , 0 , 0 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetStreamSource failed with %08x \n " , hr ) ;
2007-12-19 16:10:02 +00:00
hr = IDirect3DDevice9_SetVertexDeclaration ( device , NULL ) ;
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetVertexDeclaration failed (%08x) \n " , hr ) ;
IDirect3DDevice9_Present ( device , NULL , NULL , NULL , NULL ) ;
if ( dcl_short ) {
color = getPixelColor ( device , 480 , 360 ) ;
2008-02-04 22:35:07 +00:00
ok ( color = = 0x000000ff | | ! s_ok ,
2007-12-19 16:10:02 +00:00
" D3DDECLTYPE_USHORT4N returned color %08x, expected 0x000000ff \n " , color ) ;
}
if ( dcl_ubyte ) {
color = getPixelColor ( device , 160 , 120 ) ;
2008-02-04 22:35:07 +00:00
ok ( color = = 0x0000ffff | | ! ub_ok ,
2007-12-19 16:10:02 +00:00
" D3DDECLTYPE_UBYTE4N returned color %08x, expected 0x0000ffff \n " , color ) ;
}
if ( dcl_color ) {
color = getPixelColor ( device , 160 , 360 ) ;
ok ( color = = 0x00ffff00 ,
" D3DDECLTYPE_D3DCOLOR returned color %08x, expected 0x00ffff00 \n " , color ) ;
}
if ( dcl_float ) {
color = getPixelColor ( device , 480 , 120 ) ;
2008-02-04 22:35:07 +00:00
ok ( color = = 0x00ff0000 | | ! f_ok ,
2007-12-19 16:10:02 +00:00
" D3DDECLTYPE_FLOAT4 returned color %08x, expected 0x00ff0000 \n " , color ) ;
}
2007-12-20 00:22:57 +00:00
hr = IDirect3DDevice9_Clear ( device , 0 , NULL , D3DCLEAR_TARGET , 0xff0000ff , 0.0 , 0 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_Clear failed with %08x \n " , hr ) ;
2007-12-20 00:22:57 +00:00
2009-01-20 09:00:20 +00:00
hr = IDirect3DVertexBuffer9_Lock ( vb , 0 , sizeof ( quad_transformed ) , & data , 0 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DVertexBuffer9_Lock failed with %08x \n " , hr ) ;
2007-12-20 00:22:57 +00:00
memcpy ( data , quad_transformed , sizeof ( quad_transformed ) ) ;
hr = IDirect3DVertexBuffer9_Unlock ( vb ) ;
ok ( hr = = D3D_OK , " IDirect3DVertexBuffer9_Unlock failed (%08x) \n " , hr ) ;
hr = IDirect3DDevice9_SetVertexDeclaration ( device , dcl_positiont ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetVertexDeclaration failed with %08x \n " , hr ) ;
2007-12-20 00:22:57 +00:00
hr = IDirect3DDevice9_BeginScene ( device ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetVertexDeclaration failed with %08x \n " , hr ) ;
2007-12-20 00:22:57 +00:00
if ( SUCCEEDED ( hr ) ) {
hr = IDirect3DDevice9_SetStreamSource ( device , 0 , vb , 0 , sizeof ( quad_transformed [ 0 ] ) ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetStreamSource failed with %08x \n " , hr ) ;
2007-12-20 00:22:57 +00:00
hr = IDirect3DDevice9_DrawPrimitive ( device , D3DPT_TRIANGLESTRIP , 0 , 2 ) ;
ok ( hr = = D3D_OK , " IDirect3DDevice9_DrawPrimitive failed, hr = %#08x \n " , hr ) ;
hr = IDirect3DDevice9_EndScene ( device ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetVertexDeclaration failed with %08x \n " , hr ) ;
2007-12-20 00:22:57 +00:00
}
IDirect3DDevice9_Present ( device , NULL , NULL , NULL , NULL ) ;
color = getPixelColor ( device , 88 , 108 ) ;
ok ( color = = 0x000000ff ,
" pixel 88/108 has color %08x, expected 0x000000ff \n " , color ) ;
color = getPixelColor ( device , 92 , 108 ) ;
ok ( color = = 0x000000ff ,
" pixel 92/108 has color %08x, expected 0x000000ff \n " , color ) ;
color = getPixelColor ( device , 88 , 112 ) ;
ok ( color = = 0x000000ff ,
" pixel 88/112 has color %08x, expected 0x000000ff \n " , color ) ;
color = getPixelColor ( device , 92 , 112 ) ;
ok ( color = = 0x00ffff00 ,
" pixel 92/112 has color %08x, expected 0x00ffff00 \n " , color ) ;
color = getPixelColor ( device , 568 , 108 ) ;
ok ( color = = 0x000000ff ,
" pixel 568/108 has color %08x, expected 0x000000ff \n " , color ) ;
color = getPixelColor ( device , 572 , 108 ) ;
ok ( color = = 0x000000ff ,
" pixel 572/108 has color %08x, expected 0x000000ff \n " , color ) ;
color = getPixelColor ( device , 568 , 112 ) ;
ok ( color = = 0x00ffff00 ,
" pixel 568/112 has color %08x, expected 0x00ffff00 \n " , color ) ;
color = getPixelColor ( device , 572 , 112 ) ;
ok ( color = = 0x000000ff ,
" pixel 572/112 has color %08x, expected 0x000000ff \n " , color ) ;
color = getPixelColor ( device , 88 , 298 ) ;
ok ( color = = 0x000000ff ,
" pixel 88/298 has color %08x, expected 0x000000ff \n " , color ) ;
color = getPixelColor ( device , 92 , 298 ) ;
ok ( color = = 0x00ffff00 ,
" pixel 92/298 has color %08x, expected 0x00ffff00 \n " , color ) ;
color = getPixelColor ( device , 88 , 302 ) ;
ok ( color = = 0x000000ff ,
" pixel 88/302 has color %08x, expected 0x000000ff \n " , color ) ;
color = getPixelColor ( device , 92 , 302 ) ;
ok ( color = = 0x000000ff ,
" pixel 92/302 has color %08x, expected 0x000000ff \n " , color ) ;
color = getPixelColor ( device , 568 , 298 ) ;
ok ( color = = 0x00ffff00 ,
" pixel 568/298 has color %08x, expected 0x00ffff00 \n " , color ) ;
color = getPixelColor ( device , 572 , 298 ) ;
ok ( color = = 0x000000ff ,
" pixel 572/298 has color %08x, expected 0x000000ff \n " , color ) ;
color = getPixelColor ( device , 568 , 302 ) ;
ok ( color = = 0x000000ff ,
" pixel 568/302 has color %08x, expected 0x000000ff \n " , color ) ;
color = getPixelColor ( device , 572 , 302 ) ;
ok ( color = = 0x000000ff ,
" pixel 572/302 has color %08x, expected 0x000000ff \n " , color ) ;
2007-12-19 21:56:01 +00:00
/* This test is pointless without those two declarations: */
2008-02-12 01:34:27 +00:00
if ( ( ! dcl_color_2 ) | | ( ! dcl_ubyte_2 ) ) {
skip ( " color-ubyte switching test declarations aren't supported \n " ) ;
goto out ;
}
2007-12-19 21:56:01 +00:00
2009-01-20 09:00:20 +00:00
hr = IDirect3DVertexBuffer9_Lock ( vb , 0 , sizeof ( quads ) , & data , 0 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DVertexBuffer9_Lock failed with %08x \n " , hr ) ;
2007-12-19 21:56:01 +00:00
memcpy ( data , quads , sizeof ( quads ) ) ;
hr = IDirect3DVertexBuffer9_Unlock ( vb ) ;
ok ( hr = = D3D_OK , " IDirect3DVertexBuffer9_Unlock failed (%08x) \n " , hr ) ;
hr = IDirect3DDevice9_CreateVertexBuffer ( device , sizeof ( colors ) ,
0 , 0 , D3DPOOL_MANAGED , & vb2 , NULL ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " CreateVertexBuffer failed with %08x \n " , hr ) ;
2009-01-20 09:00:20 +00:00
hr = IDirect3DVertexBuffer9_Lock ( vb2 , 0 , sizeof ( colors ) , & data , 0 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DVertexBuffer9_Lock failed with %08x \n " , hr ) ;
2007-12-19 21:56:01 +00:00
memcpy ( data , colors , sizeof ( colors ) ) ;
hr = IDirect3DVertexBuffer9_Unlock ( vb2 ) ;
ok ( hr = = D3D_OK , " IDirect3DVertexBuffer9_Unlock failed (%08x) \n " , hr ) ;
2007-12-20 22:40:12 +00:00
for ( i = 0 ; i < 2 ; i + + ) {
hr = IDirect3DDevice9_Clear ( device , 0 , NULL , D3DCLEAR_TARGET , 0xffffffff , 0.0 , 0 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_Clear failed with %08x \n " , hr ) ;
2007-12-19 21:56:01 +00:00
2007-12-20 22:40:12 +00:00
hr = IDirect3DDevice9_SetStreamSource ( device , 0 , vb , 0 , sizeof ( float ) * 3 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetStreamSource failed with %08x \n " , hr ) ;
2007-12-20 22:40:12 +00:00
if ( i = = 0 ) {
hr = IDirect3DDevice9_SetStreamSource ( device , 1 , vb2 , 0 , sizeof ( DWORD ) * 4 ) ;
} else {
hr = IDirect3DDevice9_SetStreamSource ( device , 1 , vb2 , 8 , sizeof ( DWORD ) * 4 ) ;
}
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetStreamSource failed with %08x \n " , hr ) ;
2007-12-19 21:56:01 +00:00
2007-12-20 22:40:12 +00:00
hr = IDirect3DDevice9_BeginScene ( device ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_BeginScene failed with %08x \n " , hr ) ;
2008-02-04 22:35:07 +00:00
ub_ok = FALSE ;
2007-12-20 22:40:12 +00:00
if ( SUCCEEDED ( hr ) ) {
hr = IDirect3DDevice9_SetVertexDeclaration ( device , dcl_ubyte_2 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetVertexDeclaration failed with %08x \n " , hr ) ;
2007-12-20 22:40:12 +00:00
hr = IDirect3DDevice9_DrawPrimitive ( device , D3DPT_TRIANGLESTRIP , 0 , 2 ) ;
2008-02-04 22:35:07 +00:00
ok ( hr = = D3D_OK | | hr = = D3DERR_INVALIDCALL ,
" IDirect3DDevice9_DrawPrimitive failed, hr = %#08x \n " , hr ) ;
ub_ok = SUCCEEDED ( hr ) ;
2007-12-19 21:56:01 +00:00
2007-12-20 22:40:12 +00:00
hr = IDirect3DDevice9_SetVertexDeclaration ( device , dcl_color_2 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetVertexDeclaration failed with %08x \n " , hr ) ;
2007-12-20 22:40:12 +00:00
hr = IDirect3DDevice9_DrawPrimitive ( device , D3DPT_TRIANGLESTRIP , 4 , 2 ) ;
ok ( hr = = D3D_OK , " IDirect3DDevice9_DrawPrimitive failed, hr = %#08x \n " , hr ) ;
2007-12-19 21:56:01 +00:00
2007-12-20 22:40:12 +00:00
hr = IDirect3DDevice9_SetVertexDeclaration ( device , dcl_ubyte_2 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetVertexDeclaration failed with %08x \n " , hr ) ;
2007-12-20 22:40:12 +00:00
hr = IDirect3DDevice9_DrawPrimitive ( device , D3DPT_TRIANGLESTRIP , 8 , 2 ) ;
2008-02-04 22:35:07 +00:00
ok ( hr = = D3D_OK | | hr = = D3DERR_INVALIDCALL ,
" IDirect3DDevice9_DrawPrimitive failed, hr = %#08x \n " , hr ) ;
2008-02-12 01:34:27 +00:00
ub_ok = ( SUCCEEDED ( hr ) & & ub_ok ) ;
2007-12-19 21:56:01 +00:00
2007-12-20 22:40:12 +00:00
hr = IDirect3DDevice9_EndScene ( device ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_EndScene failed with %08x \n " , hr ) ;
2007-12-20 22:40:12 +00:00
}
IDirect3DDevice9_Present ( device , NULL , NULL , NULL , NULL ) ;
if ( i = = 0 ) {
color = getPixelColor ( device , 480 , 360 ) ;
ok ( color = = 0x00ff0000 ,
2008-02-04 22:35:07 +00:00
" D3DDECLTYPE_D3DCOLOR returned color %08x, expected 0x00ff0000 \n " , color ) ;
2007-12-20 22:40:12 +00:00
color = getPixelColor ( device , 160 , 120 ) ;
ok ( color = = 0x00ffffff ,
2008-02-04 22:35:07 +00:00
" Unused quad returned color %08x, expected 0x00ffffff \n " , color ) ;
2007-12-20 22:40:12 +00:00
color = getPixelColor ( device , 160 , 360 ) ;
2008-02-04 22:35:07 +00:00
ok ( color = = 0x000000ff | | ! ub_ok ,
" D3DDECLTYPE_UBYTE4N returned color %08x, expected 0x000000ff \n " , color ) ;
2007-12-20 22:40:12 +00:00
color = getPixelColor ( device , 480 , 120 ) ;
2008-02-04 22:35:07 +00:00
ok ( color = = 0x000000ff | | ! ub_ok ,
" D3DDECLTYPE_UBYTE4N returned color %08x, expected 0x000000ff \n " , color ) ;
2007-12-20 22:40:12 +00:00
} else {
color = getPixelColor ( device , 480 , 360 ) ;
ok ( color = = 0x000000ff ,
" D3DDECLTYPE_D3DCOLOR returned color %08x, expected 0x000000ff \n " , color ) ;
color = getPixelColor ( device , 160 , 120 ) ;
ok ( color = = 0x00ffffff ,
" Unused quad returned color %08x, expected 0x00ffffff \n " , color ) ;
color = getPixelColor ( device , 160 , 360 ) ;
2008-02-04 22:35:07 +00:00
ok ( color = = 0x00ff0000 | | ! ub_ok ,
2007-12-20 22:40:12 +00:00
" D3DDECLTYPE_UBYTE4N returned color %08x, expected 0x00ff0000 \n " , color ) ;
color = getPixelColor ( device , 480 , 120 ) ;
2008-02-04 22:35:07 +00:00
ok ( color = = 0x00ff0000 | | ! ub_ok ,
2007-12-20 22:40:12 +00:00
" D3DDECLTYPE_UBYTE4N returned color %08x, expected 0x00ff0000 \n " , color ) ;
}
}
2007-12-19 21:56:01 +00:00
hr = IDirect3DDevice9_SetStreamSource ( device , 0 , NULL , 0 , 0 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetStreamSource failed with %08x \n " , hr ) ;
2007-12-19 21:56:01 +00:00
hr = IDirect3DDevice9_SetStreamSource ( device , 1 , NULL , 0 , 0 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetStreamSource failed with %08x \n " , hr ) ;
2007-12-19 21:56:01 +00:00
IDirect3DVertexBuffer9_Release ( vb2 ) ;
out :
2007-12-19 16:10:02 +00:00
IDirect3DVertexBuffer9_Release ( vb ) ;
if ( dcl_float ) IDirect3DVertexDeclaration9_Release ( dcl_float ) ;
if ( dcl_short ) IDirect3DVertexDeclaration9_Release ( dcl_short ) ;
if ( dcl_ubyte ) IDirect3DVertexDeclaration9_Release ( dcl_ubyte ) ;
if ( dcl_color ) IDirect3DVertexDeclaration9_Release ( dcl_color ) ;
2007-12-19 21:56:01 +00:00
if ( dcl_color_2 ) IDirect3DVertexDeclaration9_Release ( dcl_color_2 ) ;
if ( dcl_ubyte_2 ) IDirect3DVertexDeclaration9_Release ( dcl_ubyte_2 ) ;
2007-12-20 00:22:57 +00:00
if ( dcl_positiont ) IDirect3DVertexDeclaration9_Release ( dcl_positiont ) ;
2007-12-19 16:10:02 +00:00
}
2007-12-19 15:28:14 +00:00
struct vertex_float16color {
float x , y , z ;
DWORD c1 , c2 ;
} ;
static void test_vshader_float16 ( IDirect3DDevice9 * device )
{
HRESULT hr ;
DWORD color ;
void * data ;
static const D3DVERTEXELEMENT9 decl_elements [ ] = {
{ 0 , 0 , D3DDECLTYPE_FLOAT3 , D3DDECLMETHOD_DEFAULT , D3DDECLUSAGE_POSITION , 0 } ,
{ 0 , 12 , D3DDECLTYPE_FLOAT16_4 , D3DDECLMETHOD_DEFAULT , D3DDECLUSAGE_COLOR , 0 } ,
D3DDECL_END ( )
} ;
IDirect3DVertexDeclaration9 * vdecl = NULL ;
IDirect3DVertexBuffer9 * buffer = NULL ;
IDirect3DVertexShader9 * shader ;
DWORD shader_code [ ] = {
0xfffe0101 , 0x0000001f , 0x80000000 , 0x900f0000 , 0x0000001f , 0x8000000a ,
0x900f0001 , 0x00000001 , 0xc00f0000 , 0x90e40000 , 0x00000001 , 0xd00f0000 ,
0x90e40001 , 0x0000ffff
} ;
struct vertex_float16color quad [ ] = {
{ - 1.0 , - 1.0 , 0.1 , 0x3c000000 , 0x00000000 } , /* green */
{ - 1.0 , 0.0 , 0.1 , 0x3c000000 , 0x00000000 } ,
{ 0.0 , - 1.0 , 0.1 , 0x3c000000 , 0x00000000 } ,
{ 0.0 , 0.0 , 0.1 , 0x3c000000 , 0x00000000 } ,
{ 0.0 , - 1.0 , 0.1 , 0x00003c00 , 0x00000000 } , /* red */
{ 0.0 , 0.0 , 0.1 , 0x00003c00 , 0x00000000 } ,
{ 1.0 , - 1.0 , 0.1 , 0x00003c00 , 0x00000000 } ,
{ 1.0 , 0.0 , 0.1 , 0x00003c00 , 0x00000000 } ,
{ 0.0 , 0.0 , 0.1 , 0x00000000 , 0x00003c00 } , /* blue */
{ 0.0 , 1.0 , 0.1 , 0x00000000 , 0x00003c00 } ,
{ 1.0 , 0.0 , 0.1 , 0x00000000 , 0x00003c00 } ,
{ 1.0 , 1.0 , 0.1 , 0x00000000 , 0x00003c00 } ,
{ - 1.0 , 0.0 , 0.1 , 0x00000000 , 0x3c000000 } , /* alpha */
{ - 1.0 , 1.0 , 0.1 , 0x00000000 , 0x3c000000 } ,
{ 0.0 , 0.0 , 0.1 , 0x00000000 , 0x3c000000 } ,
{ 0.0 , 1.0 , 0.1 , 0x00000000 , 0x3c000000 } ,
} ;
hr = IDirect3DDevice9_Clear ( device , 0 , NULL , D3DCLEAR_TARGET , 0xff102030 , 0.0 , 0 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_Clear failed, hr=%08x \n " , hr ) ;
2007-12-19 15:28:14 +00:00
hr = IDirect3DDevice9_CreateVertexDeclaration ( device , decl_elements , & vdecl ) ;
2008-07-08 15:48:50 +00:00
ok ( SUCCEEDED ( hr ) , " IDirect3DDevice9_CreateVertexDeclaration failed hr=%08x \n " , hr ) ;
2007-12-19 15:28:14 +00:00
hr = IDirect3DDevice9_CreateVertexShader ( device , shader_code , & shader ) ;
2008-07-08 15:48:50 +00:00
ok ( SUCCEEDED ( hr ) , " IDirect3DDevice9_CreateVertexShader failed hr=%08x \n " , hr ) ;
2008-04-05 14:03:56 +00:00
hr = IDirect3DDevice9_SetVertexShader ( device , shader ) ;
2008-07-08 15:48:50 +00:00
ok ( SUCCEEDED ( hr ) , " IDirect3DDevice9_SetVertexShader failed hr=%08x \n " , hr ) ;
2007-12-19 15:28:14 +00:00
hr = IDirect3DDevice9_BeginScene ( device ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_BeginScene failed hr=%08x \n " , hr ) ;
2007-12-19 15:28:14 +00:00
if ( SUCCEEDED ( hr ) ) {
hr = IDirect3DDevice9_SetVertexDeclaration ( device , vdecl ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetVertexDeclaration failed, hr=%08x \n " , hr ) ;
2007-12-19 15:28:14 +00:00
hr = IDirect3DDevice9_DrawPrimitiveUP ( device , D3DPT_TRIANGLESTRIP , 2 , quad + 0 , sizeof ( quad [ 0 ] ) ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_DrawPrimitiveUP failed, hr=%08x \n " , hr ) ;
2007-12-19 15:28:14 +00:00
hr = IDirect3DDevice9_DrawPrimitiveUP ( device , D3DPT_TRIANGLESTRIP , 2 , quad + 4 , sizeof ( quad [ 0 ] ) ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_DrawPrimitiveUP failed, hr=%08x \n " , hr ) ;
2007-12-19 15:28:14 +00:00
hr = IDirect3DDevice9_DrawPrimitiveUP ( device , D3DPT_TRIANGLESTRIP , 2 , quad + 8 , sizeof ( quad [ 0 ] ) ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_DrawPrimitiveUP failed, hr=%08x \n " , hr ) ;
2007-12-19 15:28:14 +00:00
hr = IDirect3DDevice9_DrawPrimitiveUP ( device , D3DPT_TRIANGLESTRIP , 2 , quad + 12 , sizeof ( quad [ 0 ] ) ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_DrawPrimitiveUP failed, hr=%08x \n " , hr ) ;
2007-12-19 15:28:14 +00:00
hr = IDirect3DDevice9_EndScene ( device ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_EndScene failed, hr=%08x \n " , hr ) ;
2007-12-19 15:28:14 +00:00
}
IDirect3DDevice9_Present ( device , NULL , NULL , NULL , NULL ) ;
color = getPixelColor ( device , 480 , 360 ) ;
ok ( color = = 0x00ff0000 ,
" Input 0x00003c00, 0x00000000 returned color %08x, expected 0x00ff0000 \n " , color ) ;
color = getPixelColor ( device , 160 , 120 ) ;
ok ( color = = 0x00000000 ,
" Input 0x00000000, 0x3c000000 returned color %08x, expected 0x00000000 \n " , color ) ;
color = getPixelColor ( device , 160 , 360 ) ;
ok ( color = = 0x0000ff00 ,
" Input 0x3c000000, 0x00000000 returned color %08x, expected 0x0000ff00 \n " , color ) ;
color = getPixelColor ( device , 480 , 120 ) ;
ok ( color = = 0x000000ff ,
" Input 0x00000000, 0x00003c00 returned color %08x, expected 0x000000ff \n " , color ) ;
hr = IDirect3DDevice9_Clear ( device , 0 , NULL , D3DCLEAR_TARGET , 0xff102030 , 0.0 , 0 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_Clear failed, hr=%08x \n " , hr ) ;
2007-12-19 15:28:14 +00:00
hr = IDirect3DDevice9_CreateVertexBuffer ( device , sizeof ( quad ) , 0 , 0 ,
D3DPOOL_MANAGED , & buffer , NULL ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_CreateVertexBuffer failed, hr=%08x \n " , hr ) ;
2009-01-20 09:00:20 +00:00
hr = IDirect3DVertexBuffer9_Lock ( buffer , 0 , sizeof ( quad ) , & data , 0 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DVertexBuffer9_Lock failed, hr=%08x \n " , hr ) ;
2007-12-19 15:28:14 +00:00
memcpy ( data , quad , sizeof ( quad ) ) ;
hr = IDirect3DVertexBuffer9_Unlock ( buffer ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DVertexBuffer9_Unlock failed, hr=%08x \n " , hr ) ;
2007-12-19 15:28:14 +00:00
hr = IDirect3DDevice9_SetStreamSource ( device , 0 , buffer , 0 , sizeof ( quad [ 0 ] ) ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetStreamSource failed, hr=%08x \n " , hr ) ;
2007-12-19 15:28:14 +00:00
hr = IDirect3DDevice9_BeginScene ( device ) ;
ok ( hr = = D3D_OK , " IDirect3DDevice9_BeginScene failed (%08x) \n " , hr ) ;
if ( SUCCEEDED ( hr ) ) {
hr = IDirect3DDevice9_DrawPrimitive ( device , D3DPT_TRIANGLESTRIP , 0 , 2 ) ;
ok ( hr = = D3D_OK , " IDirect3DDevice9_DrawPrimitive failed, hr = %#08x \n " , hr ) ;
hr = IDirect3DDevice9_DrawPrimitive ( device , D3DPT_TRIANGLESTRIP , 4 , 2 ) ;
ok ( hr = = D3D_OK , " IDirect3DDevice9_DrawPrimitive failed, hr = %#08x \n " , hr ) ;
hr = IDirect3DDevice9_DrawPrimitive ( device , D3DPT_TRIANGLESTRIP , 8 , 2 ) ;
ok ( hr = = D3D_OK , " IDirect3DDevice9_DrawPrimitive failed, hr = %#08x \n " , hr ) ;
hr = IDirect3DDevice9_DrawPrimitive ( device , D3DPT_TRIANGLESTRIP , 12 , 2 ) ;
ok ( hr = = D3D_OK , " IDirect3DDevice9_DrawPrimitive failed, hr = %#08x \n " , hr ) ;
hr = IDirect3DDevice9_EndScene ( device ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_EndScene failed, hr=%08x \n " , hr ) ;
2007-12-19 15:28:14 +00:00
}
IDirect3DDevice9_Present ( device , NULL , NULL , NULL , NULL ) ;
color = getPixelColor ( device , 480 , 360 ) ;
ok ( color = = 0x00ff0000 ,
" Input 0x00003c00, 0x00000000 returned color %08x, expected 0x00ff0000 \n " , color ) ;
color = getPixelColor ( device , 160 , 120 ) ;
ok ( color = = 0x00000000 ,
" Input 0x00000000, 0x3c000000 returned color %08x, expected 0x00000000 \n " , color ) ;
color = getPixelColor ( device , 160 , 360 ) ;
ok ( color = = 0x0000ff00 ,
" Input 0x3c000000, 0x00000000 returned color %08x, expected 0x0000ff00 \n " , color ) ;
color = getPixelColor ( device , 480 , 120 ) ;
ok ( color = = 0x000000ff ,
" Input 0x00000000, 0x00003c00 returned color %08x, expected 0x000000ff \n " , color ) ;
hr = IDirect3DDevice9_SetStreamSource ( device , 0 , NULL , 0 , 0 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetStreamSource failed, hr=%08x \n " , hr ) ;
2007-12-19 15:28:14 +00:00
hr = IDirect3DDevice9_SetVertexDeclaration ( device , NULL ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetVertexDeclaration failed, hr=%08x \n " , hr ) ;
2007-12-19 15:28:14 +00:00
IDirect3DDevice9_SetVertexShader ( device , NULL ) ;
2008-07-08 15:48:50 +00:00
ok ( SUCCEEDED ( hr ) , " IDirect3DDevice9_SetVertexShader failed hr=%08x \n " , hr ) ;
2007-12-19 15:28:14 +00:00
IDirect3DVertexDeclaration9_Release ( vdecl ) ;
IDirect3DVertexShader9_Release ( shader ) ;
IDirect3DVertexBuffer9_Release ( buffer ) ;
}
2008-02-01 00:16:45 +00:00
static void conditional_np2_repeat_test ( IDirect3DDevice9 * device )
{
D3DCAPS9 caps ;
IDirect3DTexture9 * texture ;
HRESULT hr ;
D3DLOCKED_RECT rect ;
unsigned int x , y ;
DWORD * dst , color ;
const float quad [ ] = {
- 1.0 , - 1.0 , 0.1 , - 0.2 , - 0.2 ,
1.0 , - 1.0 , 0.1 , 1.2 , - 0.2 ,
- 1.0 , 1.0 , 0.1 , - 0.2 , 1.2 ,
1.0 , 1.0 , 0.1 , 1.2 , 1.2
} ;
memset ( & caps , 0 , sizeof ( caps ) ) ;
hr = IDirect3DDevice9_GetDeviceCaps ( device , & caps ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_GetDeviceCaps failed hr=%08x \n " , hr ) ;
2008-02-01 00:16:45 +00:00
if ( ! ( caps . TextureCaps & D3DPTEXTURECAPS_POW2 ) ) {
/* NP2 conditional requires the POW2 flag. Check that while we're at it */
ok ( ( caps . TextureCaps & D3DPTEXTURECAPS_NONPOW2CONDITIONAL ) = = 0 ,
" Card has conditional NP2 support without power of two restriction set \n " ) ;
skip ( " Card has unconditional pow2 support, skipping conditional NP2 tests \n " ) ;
return ;
} else if ( ! ( caps . TextureCaps & D3DPTEXTURECAPS_POW2 ) ) {
skip ( " No conditional NP2 support, skipping conditional NP2 tests \n " ) ;
return ;
}
hr = IDirect3DDevice9_Clear ( device , 0 , NULL , D3DCLEAR_TARGET , 0xff000000 , 0.0 , 0 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_Clear failed, hr=%08x \n " , hr ) ;
2008-02-01 00:16:45 +00:00
hr = IDirect3DDevice9_CreateTexture ( device , 10 , 10 , 1 , 0 , D3DFMT_X8R8G8B8 , D3DPOOL_MANAGED , & texture , NULL ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_CreateTexture failed hr=%08x \n " , hr ) ;
2008-02-01 00:16:45 +00:00
memset ( & rect , 0 , sizeof ( rect ) ) ;
hr = IDirect3DTexture9_LockRect ( texture , 0 , & rect , NULL , 0 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DTexture9_LockRect failed hr=%08x \n " , hr ) ;
2008-02-01 00:16:45 +00:00
for ( y = 0 ; y < 10 ; y + + ) {
for ( x = 0 ; x < 10 ; x + + ) {
dst = ( DWORD * ) ( ( BYTE * ) rect . pBits + y * rect . Pitch + x * sizeof ( DWORD ) ) ;
if ( x = = 0 | | x = = 9 | | y = = 0 | | y = = 9 ) {
* dst = 0x00ff0000 ;
} else {
* dst = 0x000000ff ;
}
}
}
hr = IDirect3DTexture9_UnlockRect ( texture , 0 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DTexture9_UnlockRect failed hr=%08x \n " , hr ) ;
2008-02-01 00:16:45 +00:00
hr = IDirect3DDevice9_SetTexture ( device , 0 , ( IDirect3DBaseTexture9 * ) texture ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetTexture failed hr=%08x \n " , hr ) ;
2008-02-01 00:16:45 +00:00
hr = IDirect3DDevice9_SetSamplerState ( device , 0 , D3DSAMP_ADDRESSU , D3DTADDRESS_WRAP ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetSamplerState failed hr=%08x \n " , hr ) ;
2008-02-01 00:16:45 +00:00
hr = IDirect3DDevice9_SetSamplerState ( device , 0 , D3DSAMP_ADDRESSV , D3DTADDRESS_WRAP ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetSamplerState failed hr=%08x \n " , hr ) ;
2008-02-01 00:16:45 +00:00
hr = IDirect3DDevice9_SetFVF ( device , D3DFVF_XYZ | D3DFVF_TEX1 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetVertexDeclaration failed, hr=%08x \n " , hr ) ;
2008-02-01 00:16:45 +00:00
hr = IDirect3DDevice9_BeginScene ( device ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_BeginScene failed hr=%08x \n " , hr ) ;
2008-02-01 00:16:45 +00:00
if ( SUCCEEDED ( hr ) ) {
hr = IDirect3DDevice9_DrawPrimitiveUP ( device , D3DPT_TRIANGLESTRIP , 2 , quad , sizeof ( float ) * 5 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_DrawPrimitiveUP failed, hr=%08x \n " , hr ) ;
2008-02-01 00:16:45 +00:00
hr = IDirect3DDevice9_EndScene ( device ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_EndScene failed hr=%08x \n " , hr ) ;
2008-02-01 00:16:45 +00:00
}
IDirect3DDevice9_Present ( device , NULL , NULL , NULL , NULL ) ;
color = getPixelColor ( device , 1 , 1 ) ;
ok ( color = = 0x00ff0000 , " NP2: Pixel 1, 1 has color %08x, expected 0x00ff0000 \n " , color ) ;
color = getPixelColor ( device , 639 , 479 ) ;
ok ( color = = 0x00ff0000 , " NP2: Pixel 639, 479 has color %08x, expected 0x00ff0000 \n " , color ) ;
color = getPixelColor ( device , 135 , 101 ) ;
ok ( color = = 0x00ff0000 , " NP2: Pixel 135, 101 has color %08x, expected 0x00ff0000 \n " , color ) ;
color = getPixelColor ( device , 140 , 101 ) ;
ok ( color = = 0x00ff0000 , " NP2: Pixel 140, 101 has color %08x, expected 0x00ff0000 \n " , color ) ;
color = getPixelColor ( device , 135 , 105 ) ;
ok ( color = = 0x00ff0000 , " NP2: Pixel 135, 105 has color %08x, expected 0x00ff0000 \n " , color ) ;
color = getPixelColor ( device , 140 , 105 ) ;
ok ( color = = 0x000000ff , " NP2: Pixel 140, 105 has color %08x, expected 0x000000ff \n " , color ) ;
color = getPixelColor ( device , 135 , 376 ) ;
ok ( color = = 0x00ff0000 , " NP2: Pixel 135, 376 has color %08x, expected 0x00ff0000 \n " , color ) ;
color = getPixelColor ( device , 140 , 376 ) ;
ok ( color = = 0x000000ff , " NP2: Pixel 140, 376 has color %08x, expected 0x000000ff \n " , color ) ;
color = getPixelColor ( device , 135 , 379 ) ;
ok ( color = = 0x00ff0000 , " NP2: Pixel 135, 379 has color %08x, expected 0x00ff0000 \n " , color ) ;
color = getPixelColor ( device , 140 , 379 ) ;
ok ( color = = 0x00ff0000 , " NP2: Pixel 140, 379 has color %08x, expected 0x00ff0000 \n " , color ) ;
color = getPixelColor ( device , 500 , 101 ) ;
ok ( color = = 0x00ff0000 , " NP2: Pixel 500, 101 has color %08x, expected 0x00ff0000 \n " , color ) ;
color = getPixelColor ( device , 504 , 101 ) ;
ok ( color = = 0x00ff0000 , " NP2: Pixel 504, 101 has color %08x, expected 0x00ff0000 \n " , color ) ;
color = getPixelColor ( device , 500 , 105 ) ;
ok ( color = = 0x000000ff , " NP2: Pixel 500, 105 has color %08x, expected 0x000000ff \n " , color ) ;
color = getPixelColor ( device , 504 , 105 ) ;
ok ( color = = 0x00ff0000 , " NP2: Pixel 504, 105 has color %08x, expected 0x00ff0000 \n " , color ) ;
color = getPixelColor ( device , 500 , 376 ) ;
ok ( color = = 0x000000ff , " NP2: Pixel 500, 376 has color %08x, expected 0x000000ff \n " , color ) ;
color = getPixelColor ( device , 504 , 376 ) ;
ok ( color = = 0x00ff0000 , " NP2: Pixel 504, 376 has color %08x, expected 0x00ff0000 \n " , color ) ;
color = getPixelColor ( device , 500 , 380 ) ;
ok ( color = = 0x00ff0000 , " NP2: Pixel 500, 380 has color %08x, expected 0x00ff0000 \n " , color ) ;
color = getPixelColor ( device , 504 , 380 ) ;
ok ( color = = 0x00ff0000 , " NP2: Pixel 504, 380 has color %08x, expected 0x00ff0000 \n " , color ) ;
hr = IDirect3DDevice9_SetTexture ( device , 0 , NULL ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetTexture failed hr=%08x \n " , hr ) ;
2008-02-01 00:16:45 +00:00
IDirect3DTexture9_Release ( texture ) ;
}
2008-02-11 11:04:57 +00:00
static void vFace_register_test ( IDirect3DDevice9 * device )
{
HRESULT hr ;
DWORD color ;
const DWORD shader_code [ ] = {
0xffff0300 , /* ps_3_0 */
0x05000051 , 0xa00f0000 , 0x00000000 , 0x3f800000 , 0x00000000 , 0x00000000 , /* def c0, 0.0, 1.0, 0.0, 0.0 */
0x05000051 , 0xa00f0001 , 0x3f800000 , 0x00000000 , 0x00000000 , 0x00000000 , /* def c1, 1.0, 0.0, 0.0, 0.0 */
0x0200001f , 0x80000000 , 0x900f1001 , /* dcl vFace */
0x02000001 , 0x800f0001 , 0xa0e40001 , /* mov r1, c1 */
0x04000058 , 0x800f0000 , 0x90e41001 , 0xa0e40000 , 0x80e40001 , /* cmp r0, vFace, c0, r1 */
0x02000001 , 0x800f0800 , 0x80e40000 , /* mov oC0, r0 */
0x0000ffff /* END */
} ;
IDirect3DPixelShader9 * shader ;
IDirect3DTexture9 * texture ;
IDirect3DSurface9 * surface , * backbuffer ;
const float quad [ ] = {
- 1.0 , - 1.0 , 0.1 ,
1.0 , - 1.0 , 0.1 ,
- 1.0 , 0.0 , 0.1 ,
1.0 , - 1.0 , 0.1 ,
1.0 , 0.0 , 0.1 ,
- 1.0 , 0.0 , 0.1 ,
- 1.0 , 0.0 , 0.1 ,
- 1.0 , 1.0 , 0.1 ,
1.0 , 0.0 , 0.1 ,
1.0 , 0.0 , 0.1 ,
- 1.0 , 1.0 , 0.1 ,
1.0 , 1.0 , 0.1 ,
} ;
const float blit [ ] = {
0.0 , - 1.0 , 0.1 , 0.0 , 0.0 ,
1.0 , - 1.0 , 0.1 , 1.0 , 0.0 ,
0.0 , 1.0 , 0.1 , 0.0 , 1.0 ,
1.0 , 1.0 , 0.1 , 1.0 , 1.0 ,
} ;
hr = IDirect3DDevice9_CreatePixelShader ( device , shader_code , & shader ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_CreatePixelShader failed hr=%08x \n " , hr ) ;
2008-02-11 11:04:57 +00:00
hr = IDirect3DDevice9_CreateTexture ( device , 128 , 128 , 1 , D3DUSAGE_RENDERTARGET , D3DFMT_X8R8G8B8 , D3DPOOL_DEFAULT , & texture , NULL ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_CreateTexture failed hr=%08x \n " , hr ) ;
2008-02-11 11:04:57 +00:00
hr = IDirect3DTexture9_GetSurfaceLevel ( texture , 0 , & surface ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DTexture9_GetSurfaceLevel failed hr=%08x \n " , hr ) ;
2008-02-11 11:04:57 +00:00
hr = IDirect3DDevice9_SetPixelShader ( device , shader ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetPixelShader failed hr=%08x \n " , hr ) ;
2008-02-11 11:04:57 +00:00
hr = IDirect3DDevice9_SetFVF ( device , D3DFVF_XYZ ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetFVF failed hr=%08x \n " , hr ) ;
2008-02-11 11:04:57 +00:00
hr = IDirect3DDevice9_GetBackBuffer ( device , 0 , 0 , D3DBACKBUFFER_TYPE_MONO , & backbuffer ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_GetBackBuffer failed hr=%08x \n " , hr ) ;
2008-02-11 11:04:57 +00:00
hr = IDirect3DDevice9_Clear ( device , 0 , NULL , D3DCLEAR_TARGET , 0xff0000ff , 0.0 , 0 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_Clear failed, hr=%08x \n " , hr ) ;
2008-02-11 11:04:57 +00:00
hr = IDirect3DDevice9_BeginScene ( device ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_BeginScene failed hr=%08x \n " , hr ) ;
2008-02-11 11:04:57 +00:00
if ( SUCCEEDED ( hr ) ) {
/* First, draw to the texture and the back buffer to test both offscreen and onscreen cases */
hr = IDirect3DDevice9_SetRenderTarget ( device , 0 , surface ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetRenderTarget failed, hr=%08x \n " , hr ) ;
2008-02-11 11:04:57 +00:00
hr = IDirect3DDevice9_Clear ( device , 0 , NULL , D3DCLEAR_TARGET , 0xff0000ff , 0.0 , 0 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_Clear failed, hr=%08x \n " , hr ) ;
2008-02-11 11:04:57 +00:00
hr = IDirect3DDevice9_DrawPrimitiveUP ( device , D3DPT_TRIANGLELIST , 4 , quad , sizeof ( float ) * 3 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_DrawPrimitiveUP failed, hr=%08x \n " , hr ) ;
2008-02-11 11:04:57 +00:00
hr = IDirect3DDevice9_SetRenderTarget ( device , 0 , backbuffer ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetRenderTarget failed, hr=%08x \n " , hr ) ;
2008-02-11 11:04:57 +00:00
hr = IDirect3DDevice9_DrawPrimitiveUP ( device , D3DPT_TRIANGLELIST , 4 , quad , sizeof ( float ) * 3 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_DrawPrimitiveUP failed, hr=%08x \n " , hr ) ;
2008-02-11 11:04:57 +00:00
2008-03-26 21:23:36 +00:00
/* Blit the texture onto the back buffer to make it visible */
2008-02-11 11:04:57 +00:00
hr = IDirect3DDevice9_SetPixelShader ( device , NULL ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetPixelShader failed, hr=%08x \n " , hr ) ;
2008-02-11 11:04:57 +00:00
hr = IDirect3DDevice9_SetTexture ( device , 0 , ( IDirect3DBaseTexture9 * ) texture ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetTexture failed, hr=%08x \n " , hr ) ;
2008-02-11 11:04:57 +00:00
hr = IDirect3DDevice9_SetTextureStageState ( device , 0 , D3DTSS_COLOROP , D3DTOP_SELECTARG1 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetTextureStageState failed, hr=%08x \n " , hr ) ;
2008-02-11 11:04:57 +00:00
hr = IDirect3DDevice9_SetTextureStageState ( device , 0 , D3DTSS_COLORARG1 , D3DTA_TEXTURE ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetTextureStageState failed, hr=%08x \n " , hr ) ;
2008-02-11 11:04:57 +00:00
hr = IDirect3DDevice9_SetFVF ( device , D3DFVF_XYZ | D3DFVF_TEX1 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetFVF failed hr=%08x \n " , hr ) ;
2008-02-11 11:04:57 +00:00
hr = IDirect3DDevice9_DrawPrimitiveUP ( device , D3DPT_TRIANGLESTRIP , 2 , blit , sizeof ( float ) * 5 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_DrawPrimitiveUP failed, hr=%08x \n " , hr ) ;
2008-02-11 11:04:57 +00:00
hr = IDirect3DDevice9_EndScene ( device ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_EndScene failed hr=%08x \n " , hr ) ;
2008-02-11 11:04:57 +00:00
}
IDirect3DDevice9_Present ( device , NULL , NULL , NULL , NULL ) ;
color = getPixelColor ( device , 160 , 360 ) ;
ok ( color = = 0x00ff0000 , " vFace: Onscreen rendered front facing quad has color 0x%08x, expected 0x00ff0000 \n " , color ) ;
color = getPixelColor ( device , 160 , 120 ) ;
ok ( color = = 0x0000ff00 , " vFace: Onscreen rendered back facing quad has color 0x%08x, expected 0x0000ff00 \n " , color ) ;
color = getPixelColor ( device , 480 , 360 ) ;
ok ( color = = 0x0000ff00 , " vFace: Offscreen rendered back facing quad has color 0x%08x, expected 0x0000ff00 \n " , color ) ;
color = getPixelColor ( device , 480 , 120 ) ;
ok ( color = = 0x00ff0000 , " vFace: Offscreen rendered front facing quad has color 0x%08x, expected 0x00ff0000 \n " , color ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetPixelShader failed hr=%08x \n " , hr ) ;
2008-02-11 11:04:57 +00:00
IDirect3DDevice9_SetTexture ( device , 0 , NULL ) ;
IDirect3DPixelShader9_Release ( shader ) ;
IDirect3DSurface9_Release ( surface ) ;
IDirect3DSurface9_Release ( backbuffer ) ;
IDirect3DTexture9_Release ( texture ) ;
}
2008-02-17 22:30:24 +00:00
static void fixed_function_bumpmap_test ( IDirect3DDevice9 * device )
{
HRESULT hr ;
DWORD color ;
int i ;
D3DCAPS9 caps ;
2008-08-19 15:51:04 +00:00
BOOL L6V5U5_supported = FALSE ;
IDirect3DTexture9 * tex1 , * tex2 ;
D3DLOCKED_RECT locked_rect ;
2008-02-17 22:30:24 +00:00
static const float quad [ ] [ 7 ] = {
{ - 128.0f / 640.0f , - 128.0f / 480.0f , 0.1f , 0.0f , 0.0f , 0.0f , 0.0f } ,
{ - 128.0f / 640.0f , 128.0f / 480.0f , 0.1f , 0.0f , 1.0f , 0.0f , 1.0f } ,
{ 128.0f / 640.0f , - 128.0f / 480.0f , 0.1f , 1.0f , 0.0f , 1.0f , 0.0f } ,
{ 128.0f / 640.0f , 128.0f / 480.0f , 0.1f , 1.0f , 1.0f , 1.0f , 1.0f } ,
} ;
static const D3DVERTEXELEMENT9 decl_elements [ ] = {
{ 0 , 0 , D3DDECLTYPE_FLOAT3 , D3DDECLMETHOD_DEFAULT , D3DDECLUSAGE_POSITION , 0 } ,
{ 0 , 12 , D3DDECLTYPE_FLOAT2 , D3DDECLMETHOD_DEFAULT , D3DDECLUSAGE_TEXCOORD , 0 } ,
{ 0 , 20 , D3DDECLTYPE_FLOAT2 , D3DDECLMETHOD_DEFAULT , D3DDECLUSAGE_TEXCOORD , 1 } ,
D3DDECL_END ( )
} ;
2008-03-26 21:23:36 +00:00
/* use asymmetric matrix to test loading */
2008-02-17 22:30:24 +00:00
float bumpenvmat [ 4 ] = { 0.0 , 0.5 , - 0.5 , 0.0 } ;
2008-08-19 15:51:04 +00:00
float scale , offset ;
2008-02-17 22:30:24 +00:00
IDirect3DVertexDeclaration9 * vertex_declaration = NULL ;
IDirect3DTexture9 * texture = NULL ;
memset ( & caps , 0 , sizeof ( caps ) ) ;
hr = IDirect3DDevice9_GetDeviceCaps ( device , & caps ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_GetDeviceCaps failed hr=%08x \n " , hr ) ;
2008-02-17 22:30:24 +00:00
if ( ! ( caps . TextureOpCaps & D3DTEXOPCAPS_BUMPENVMAP ) ) {
skip ( " D3DTEXOPCAPS_BUMPENVMAP not set, skipping bumpmap tests \n " ) ;
return ;
} else {
2008-02-12 17:27:56 +00:00
/* This check is disabled, some Windows drivers do not handle D3DUSAGE_QUERY_LEGACYBUMPMAP properly.
* They report that it is not supported , but after that bump mapping works properly . So just test
* if the format is generally supported , and check the BUMPENVMAP flag
*/
2008-02-17 22:30:24 +00:00
IDirect3D9 * d3d9 ;
IDirect3DDevice9_GetDirect3D ( device , & d3d9 ) ;
2008-08-19 15:51:04 +00:00
hr = IDirect3D9_CheckDeviceFormat ( d3d9 , 0 , D3DDEVTYPE_HAL , D3DFMT_X8R8G8B8 , 0 ,
D3DRTYPE_TEXTURE , D3DFMT_L6V5U5 ) ;
L6V5U5_supported = SUCCEEDED ( hr ) ;
2008-02-12 17:27:56 +00:00
hr = IDirect3D9_CheckDeviceFormat ( d3d9 , 0 , D3DDEVTYPE_HAL , D3DFMT_X8R8G8B8 , 0 ,
2008-02-17 22:30:24 +00:00
D3DRTYPE_TEXTURE , D3DFMT_V8U8 ) ;
IDirect3D9_Release ( d3d9 ) ;
if ( FAILED ( hr ) ) {
skip ( " D3DFMT_V8U8 not supported for legacy bump mapping \n " ) ;
return ;
}
}
/* Generate the textures */
generate_bumpmap_textures ( device ) ;
hr = IDirect3DDevice9_SetTextureStageState ( device , 0 , D3DTSS_BUMPENVMAT00 , * ( LPDWORD ) & bumpenvmat [ 0 ] ) ;
ok ( SUCCEEDED ( hr ) , " SetTextureStageState failed (%08x) \n " , hr ) ;
hr = IDirect3DDevice9_SetTextureStageState ( device , 0 , D3DTSS_BUMPENVMAT01 , * ( LPDWORD ) & bumpenvmat [ 1 ] ) ;
ok ( SUCCEEDED ( hr ) , " SetTextureStageState failed (%08x) \n " , hr ) ;
hr = IDirect3DDevice9_SetTextureStageState ( device , 0 , D3DTSS_BUMPENVMAT10 , * ( LPDWORD ) & bumpenvmat [ 2 ] ) ;
ok ( SUCCEEDED ( hr ) , " SetTextureStageState failed (%08x) \n " , hr ) ;
hr = IDirect3DDevice9_SetTextureStageState ( device , 0 , D3DTSS_BUMPENVMAT11 , * ( LPDWORD ) & bumpenvmat [ 3 ] ) ;
ok ( SUCCEEDED ( hr ) , " SetTextureStageState failed (%08x) \n " , hr ) ;
hr = IDirect3DDevice9_SetTextureStageState ( device , 0 , D3DTSS_COLOROP , D3DTOP_BUMPENVMAP ) ;
ok ( SUCCEEDED ( hr ) , " SetTextureStageState failed (%08x) \n " , hr ) ;
hr = IDirect3DDevice9_SetTextureStageState ( device , 0 , D3DTSS_COLORARG1 , D3DTA_TEXTURE ) ;
ok ( SUCCEEDED ( hr ) , " SetTextureStageState failed (%08x) \n " , hr ) ;
hr = IDirect3DDevice9_SetTextureStageState ( device , 0 , D3DTSS_COLORARG2 , D3DTA_CURRENT ) ;
ok ( SUCCEEDED ( hr ) , " SetTextureStageState failed (%08x) \n " , hr ) ;
hr = IDirect3DDevice9_SetTextureStageState ( device , 1 , D3DTSS_COLOROP , D3DTOP_SELECTARG1 ) ;
ok ( SUCCEEDED ( hr ) , " SetTextureStageState failed (%08x) \n " , hr ) ;
hr = IDirect3DDevice9_SetTextureStageState ( device , 1 , D3DTSS_COLORARG1 , D3DTA_TEXTURE ) ;
ok ( SUCCEEDED ( hr ) , " SetTextureStageState failed (%08x) \n " , hr ) ;
hr = IDirect3DDevice9_SetTextureStageState ( device , 1 , D3DTSS_COLORARG2 , D3DTA_CURRENT ) ;
ok ( SUCCEEDED ( hr ) , " SetTextureStageState failed (%08x) \n " , hr ) ;
hr = IDirect3DDevice9_SetTextureStageState ( device , 2 , D3DTSS_COLOROP , D3DTOP_DISABLE ) ;
ok ( SUCCEEDED ( hr ) , " SetTextureStageState failed (%08x) \n " , hr ) ;
hr = IDirect3DDevice9_SetVertexShader ( device , NULL ) ;
ok ( SUCCEEDED ( hr ) , " SetVertexShader failed (%08x) \n " , hr ) ;
hr = IDirect3DDevice9_Clear ( device , 0 , NULL , D3DCLEAR_TARGET , 0xffff00ff , 0.0 , 0 ) ;
ok ( hr = = D3D_OK , " IDirect3DDevice9_Clear failed (%08x) \n " , hr ) ;
hr = IDirect3DDevice9_CreateVertexDeclaration ( device , decl_elements , & vertex_declaration ) ;
ok ( SUCCEEDED ( hr ) , " CreateVertexDeclaration failed (0x%08x) \n " , hr ) ;
hr = IDirect3DDevice9_SetVertexDeclaration ( device , vertex_declaration ) ;
ok ( SUCCEEDED ( hr ) , " SetVertexDeclaration failed (0x%08x) \n " , hr ) ;
hr = IDirect3DDevice9_BeginScene ( device ) ;
ok ( SUCCEEDED ( hr ) , " BeginScene failed (0x%08x) \n " , hr ) ;
hr = IDirect3DDevice9_DrawPrimitiveUP ( device , D3DPT_TRIANGLESTRIP , 2 , & quad [ 0 ] , sizeof ( quad [ 0 ] ) ) ;
ok ( SUCCEEDED ( hr ) , " DrawPrimitiveUP failed (0x%08x) \n " , hr ) ;
hr = IDirect3DDevice9_EndScene ( device ) ;
ok ( SUCCEEDED ( hr ) , " EndScene failed (0x%08x) \n " , hr ) ;
hr = IDirect3DDevice9_Present ( device , NULL , NULL , NULL , NULL ) ;
ok ( SUCCEEDED ( hr ) , " Present failed (0x%08x) \n " , hr ) ;
2008-08-12 22:33:45 +00:00
/* on MacOS(10.5.4, radeon X1600), the white dots are have color 0x00fbfbfb rather than 0x00ffffff. This is
* kinda strange since no calculations are done on the sampled colors , only on the texture coordinates .
* But since testing the color match is not the purpose of the test don ' t be too picky
*/
2008-02-17 22:30:24 +00:00
color = getPixelColor ( device , 320 - 32 , 240 ) ;
2008-08-12 22:33:45 +00:00
ok ( color_match ( color , 0x00ffffff , 4 ) , " bumpmap failed: Got color 0x%08x, expected 0x00ffffff. \n " , color ) ;
2008-02-17 22:30:24 +00:00
color = getPixelColor ( device , 320 + 32 , 240 ) ;
2008-08-12 22:33:45 +00:00
ok ( color_match ( color , 0x00ffffff , 4 ) , " bumpmap failed: Got color 0x%08x, expected 0x00ffffff. \n " , color ) ;
2008-02-17 22:30:24 +00:00
color = getPixelColor ( device , 320 , 240 - 32 ) ;
2008-08-12 22:33:45 +00:00
ok ( color_match ( color , 0x00ffffff , 4 ) , " bumpmap failed: Got color 0x%08x, expected 0x00ffffff. \n " , color ) ;
2008-02-17 22:30:24 +00:00
color = getPixelColor ( device , 320 , 240 + 32 ) ;
2008-08-12 22:33:45 +00:00
ok ( color_match ( color , 0x00ffffff , 4 ) , " bumpmap failed: Got color 0x%08x, expected 0x00ffffff. \n " , color ) ;
2008-02-17 22:30:24 +00:00
color = getPixelColor ( device , 320 , 240 ) ;
2008-08-12 22:33:45 +00:00
ok ( color_match ( color , 0x00000000 , 4 ) , " bumpmap failed: Got color 0x%08x, expected 0x00000000. \n " , color ) ;
2008-02-17 22:30:24 +00:00
color = getPixelColor ( device , 320 + 32 , 240 + 32 ) ;
2008-08-12 22:33:45 +00:00
ok ( color_match ( color , 0x00000000 , 4 ) , " bumpmap failed: Got color 0x%08x, expected 0x00000000. \n " , color ) ;
2008-02-17 22:30:24 +00:00
color = getPixelColor ( device , 320 - 32 , 240 + 32 ) ;
2008-08-12 22:33:45 +00:00
ok ( color_match ( color , 0x00000000 , 4 ) , " bumpmap failed: Got color 0x%08x, expected 0x00000000. \n " , color ) ;
2008-02-17 22:30:24 +00:00
color = getPixelColor ( device , 320 + 32 , 240 - 32 ) ;
2008-08-12 22:33:45 +00:00
ok ( color_match ( color , 0x00000000 , 4 ) , " bumpmap failed: Got color 0x%08x, expected 0x00000000. \n " , color ) ;
2008-02-17 22:30:24 +00:00
color = getPixelColor ( device , 320 - 32 , 240 - 32 ) ;
2008-08-12 22:33:45 +00:00
ok ( color_match ( color , 0x00000000 , 4 ) , " bumpmap failed: Got color 0x%08x, expected 0x00000000. \n " , color ) ;
2008-02-17 22:30:24 +00:00
for ( i = 0 ; i < 2 ; i + + ) {
hr = IDirect3DDevice9_GetTexture ( device , i , ( IDirect3DBaseTexture9 * * ) & texture ) ;
ok ( SUCCEEDED ( hr ) , " IDirect3DDevice9_GetTexture failed (0x%08x) \n " , hr ) ;
IDirect3DTexture9_Release ( texture ) ; /* For the GetTexture */
hr = IDirect3DDevice9_SetTexture ( device , i , NULL ) ;
ok ( SUCCEEDED ( hr ) , " SetTexture failed (0x%08x) \n " , hr ) ;
IDirect3DTexture9_Release ( texture ) ; /* To destroy it */
}
2008-08-19 15:51:04 +00:00
if ( ! ( caps . TextureOpCaps & D3DTEXOPCAPS_BUMPENVMAPLUMINANCE ) ) {
skip ( " D3DTOP_BUMPENVMAPLUMINANCE not supported, skipping \n " ) ;
goto cleanup ;
}
if ( L6V5U5_supported = = FALSE ) {
skip ( " L6V5U5_supported not supported, skipping D3DTOP_BUMPENVMAPLUMINANCE test \n " ) ;
goto cleanup ;
}
hr = IDirect3DDevice9_Clear ( device , 0 , NULL , D3DCLEAR_TARGET , 0x00000000 , 0.0 , 0x8 ) ;
ok ( hr = = D3D_OK , " IDirect3DDevice9_Clear returned %08x \n " , hr ) ;
/* This test only tests the luminance part. The bumpmapping part was already tested above and
* would only make this test more complicated
*/
hr = IDirect3DDevice9_CreateTexture ( device , 1 , 1 , 1 , 0 , D3DFMT_L6V5U5 , D3DPOOL_MANAGED , & tex1 , NULL ) ;
ok ( hr = = D3D_OK , " IDirect3DDevice9_CreateTexture failed, hr=%08x \n " , hr ) ;
hr = IDirect3DDevice9_CreateTexture ( device , 1 , 1 , 1 , 0 , D3DFMT_X8R8G8B8 , D3DPOOL_MANAGED , & tex2 , NULL ) ;
ok ( hr = = D3D_OK , " IDirect3DDevice9_CreateTexture failed, hr=%08x \n " , hr ) ;
memset ( & locked_rect , 0 , sizeof ( locked_rect ) ) ;
hr = IDirect3DTexture9_LockRect ( tex1 , 0 , & locked_rect , NULL , 0 ) ;
ok ( SUCCEEDED ( hr ) , " LockRect failed with 0x%08x \n " , hr ) ;
* ( ( DWORD * ) locked_rect . pBits ) = 0x4000 ; /* L = 0.25, V = 0.0, U = 0.0 */
hr = IDirect3DTexture9_UnlockRect ( tex1 , 0 ) ;
ok ( SUCCEEDED ( hr ) , " UnlockRect failed with 0x%08x \n " , hr ) ;
memset ( & locked_rect , 0 , sizeof ( locked_rect ) ) ;
hr = IDirect3DTexture9_LockRect ( tex2 , 0 , & locked_rect , NULL , 0 ) ;
ok ( SUCCEEDED ( hr ) , " LockRect failed with 0x%08x \n " , hr ) ;
* ( ( DWORD * ) locked_rect . pBits ) = 0x00ff80c0 ;
hr = IDirect3DTexture9_UnlockRect ( tex2 , 0 ) ;
ok ( SUCCEEDED ( hr ) , " UnlockRect failed with 0x%08x \n " , hr ) ;
hr = IDirect3DDevice9_SetTexture ( device , 0 , ( IDirect3DBaseTexture9 * ) tex1 ) ;
ok ( SUCCEEDED ( hr ) , " IDirect3DDevice9_SetTexture failed (%08x) \n " , hr ) ;
hr = IDirect3DDevice9_SetTexture ( device , 1 , ( IDirect3DBaseTexture9 * ) tex2 ) ;
ok ( SUCCEEDED ( hr ) , " IDirect3DDevice9_SetTexture failed (%08x) \n " , hr ) ;
hr = IDirect3DDevice9_SetTextureStageState ( device , 0 , D3DTSS_COLOROP , D3DTOP_BUMPENVMAPLUMINANCE ) ;
ok ( SUCCEEDED ( hr ) , " SetTextureStageState failed (%08x) \n " , hr ) ;
scale = 2.0 ;
hr = IDirect3DDevice9_SetTextureStageState ( device , 0 , D3DTSS_BUMPENVLSCALE , * ( ( DWORD * ) & scale ) ) ;
ok ( SUCCEEDED ( hr ) , " SetTextureStageState failed (%08x) \n " , hr ) ;
offset = 0.1 ;
hr = IDirect3DDevice9_SetTextureStageState ( device , 0 , D3DTSS_BUMPENVLOFFSET , * ( ( DWORD * ) & offset ) ) ;
ok ( SUCCEEDED ( hr ) , " SetTextureStageState failed (%08x) \n " , hr ) ;
hr = IDirect3DDevice9_BeginScene ( device ) ;
ok ( SUCCEEDED ( hr ) , " BeginScene failed (0x%08x) \n " , hr ) ;
if ( SUCCEEDED ( hr ) ) {
hr = IDirect3DDevice9_DrawPrimitiveUP ( device , D3DPT_TRIANGLESTRIP , 2 , & quad [ 0 ] , sizeof ( quad [ 0 ] ) ) ;
ok ( SUCCEEDED ( hr ) , " DrawPrimitiveUP failed (0x%08x) \n " , hr ) ;
hr = IDirect3DDevice9_EndScene ( device ) ;
ok ( SUCCEEDED ( hr ) , " EndScene failed (0x%08x) \n " , hr ) ;
}
hr = IDirect3DDevice9_Present ( device , NULL , NULL , NULL , NULL ) ;
ok ( SUCCEEDED ( hr ) , " Present failed (0x%08x) \n " , hr ) ;
color = getPixelColor ( device , 320 , 240 ) ;
/* red: 1.0 * (0.25 * 2.0 + 0.1) = 1.0 * 0.6 = 0.6 = 0x99
* green : 0.5 * ( 0.25 * 2.0 + 0.1 ) = 0.5 * 0.6 = 0.3 = 0x4c
* green : 0.75 * ( 0.25 * 2.0 + 0.1 ) = 0.75 * 0.6 = 0.45 = 0x72
*/
2008-12-31 18:11:53 +00:00
ok ( color_match ( color , 0x00994c72 , 5 ) , " bumpmap failed: Got color 0x%08x, expected 0x00994c72. \n " , color ) ;
2008-08-20 15:23:25 +00:00
/* Check a result scale factor > 1.0 */
scale = 10 ;
hr = IDirect3DDevice9_SetTextureStageState ( device , 0 , D3DTSS_BUMPENVLSCALE , * ( ( DWORD * ) & scale ) ) ;
ok ( SUCCEEDED ( hr ) , " SetTextureStageState failed (%08x) \n " , hr ) ;
offset = 10 ;
hr = IDirect3DDevice9_SetTextureStageState ( device , 0 , D3DTSS_BUMPENVLOFFSET , * ( ( DWORD * ) & offset ) ) ;
ok ( SUCCEEDED ( hr ) , " SetTextureStageState failed (%08x) \n " , hr ) ;
hr = IDirect3DDevice9_BeginScene ( device ) ;
ok ( SUCCEEDED ( hr ) , " BeginScene failed (0x%08x) \n " , hr ) ;
if ( SUCCEEDED ( hr ) ) {
hr = IDirect3DDevice9_DrawPrimitiveUP ( device , D3DPT_TRIANGLESTRIP , 2 , & quad [ 0 ] , sizeof ( quad [ 0 ] ) ) ;
ok ( SUCCEEDED ( hr ) , " DrawPrimitiveUP failed (0x%08x) \n " , hr ) ;
hr = IDirect3DDevice9_EndScene ( device ) ;
ok ( SUCCEEDED ( hr ) , " EndScene failed (0x%08x) \n " , hr ) ;
}
hr = IDirect3DDevice9_Present ( device , NULL , NULL , NULL , NULL ) ;
ok ( SUCCEEDED ( hr ) , " Present failed (0x%08x) \n " , hr ) ;
color = getPixelColor ( device , 320 , 240 ) ;
ok ( color_match ( color , 0x00ff80c0 , 1 ) , " bumpmap failed: Got color 0x%08x, expected 0x00ff80c0. \n " , color ) ;
/* Check clamping in the scale factor calculation */
scale = 1000 ;
hr = IDirect3DDevice9_SetTextureStageState ( device , 0 , D3DTSS_BUMPENVLSCALE , * ( ( DWORD * ) & scale ) ) ;
ok ( SUCCEEDED ( hr ) , " SetTextureStageState failed (%08x) \n " , hr ) ;
offset = - 1 ;
hr = IDirect3DDevice9_SetTextureStageState ( device , 0 , D3DTSS_BUMPENVLOFFSET , * ( ( DWORD * ) & offset ) ) ;
ok ( SUCCEEDED ( hr ) , " SetTextureStageState failed (%08x) \n " , hr ) ;
hr = IDirect3DDevice9_BeginScene ( device ) ;
ok ( SUCCEEDED ( hr ) , " BeginScene failed (0x%08x) \n " , hr ) ;
if ( SUCCEEDED ( hr ) ) {
hr = IDirect3DDevice9_DrawPrimitiveUP ( device , D3DPT_TRIANGLESTRIP , 2 , & quad [ 0 ] , sizeof ( quad [ 0 ] ) ) ;
ok ( SUCCEEDED ( hr ) , " DrawPrimitiveUP failed (0x%08x) \n " , hr ) ;
hr = IDirect3DDevice9_EndScene ( device ) ;
ok ( SUCCEEDED ( hr ) , " EndScene failed (0x%08x) \n " , hr ) ;
}
hr = IDirect3DDevice9_Present ( device , NULL , NULL , NULL , NULL ) ;
ok ( SUCCEEDED ( hr ) , " Present failed (0x%08x) \n " , hr ) ;
color = getPixelColor ( device , 320 , 240 ) ;
ok ( color_match ( color , 0x00ff80c0 , 1 ) , " bumpmap failed: Got color 0x%08x, expected 0x00ff80c0. \n " , color ) ;
2008-08-19 15:51:04 +00:00
hr = IDirect3DDevice9_SetTexture ( device , 0 , NULL ) ;
ok ( SUCCEEDED ( hr ) , " IDirect3DDevice9_SetTexture failed (%08x) \n " , hr ) ;
hr = IDirect3DDevice9_SetTexture ( device , 1 , NULL ) ;
ok ( SUCCEEDED ( hr ) , " IDirect3DDevice9_SetTexture failed (%08x) \n " , hr ) ;
IDirect3DTexture9_Release ( tex1 ) ;
IDirect3DTexture9_Release ( tex2 ) ;
cleanup :
2008-02-17 22:30:24 +00:00
hr = IDirect3DDevice9_SetTextureStageState ( device , 1 , D3DTSS_COLOROP , D3DTOP_DISABLE ) ;
ok ( SUCCEEDED ( hr ) , " SetTextureStageState failed (%08x) \n " , hr ) ;
hr = IDirect3DDevice9_SetTextureStageState ( device , 0 , D3DTSS_COLOROP , D3DTOP_MODULATE ) ;
ok ( SUCCEEDED ( hr ) , " SetTextureStageState failed (%08x) \n " , hr ) ;
2008-08-19 15:51:04 +00:00
hr = IDirect3DDevice9_SetVertexDeclaration ( device , NULL ) ;
ok ( SUCCEEDED ( hr ) , " SetVertexDeclaration failed (%08x) \n " , hr ) ;
IDirect3DVertexDeclaration9_Release ( vertex_declaration ) ;
2008-02-17 22:30:24 +00:00
}
2008-02-17 22:31:55 +00:00
static void stencil_cull_test ( IDirect3DDevice9 * device ) {
HRESULT hr ;
IDirect3DSurface9 * depthstencil = NULL ;
D3DSURFACE_DESC desc ;
float quad1 [ ] = {
- 1.0 , - 1.0 , 0.1 ,
0.0 , - 1.0 , 0.1 ,
- 1.0 , 0.0 , 0.1 ,
0.0 , 0.0 , 0.1 ,
} ;
float quad2 [ ] = {
0.0 , - 1.0 , 0.1 ,
1.0 , - 1.0 , 0.1 ,
0.0 , 0.0 , 0.1 ,
1.0 , 0.0 , 0.1 ,
} ;
float quad3 [ ] = {
0.0 , 0.0 , 0.1 ,
1.0 , 0.0 , 0.1 ,
0.0 , 1.0 , 0.1 ,
1.0 , 1.0 , 0.1 ,
} ;
float quad4 [ ] = {
- 1.0 , 0.0 , 0.1 ,
0.0 , 0.0 , 0.1 ,
- 1.0 , 1.0 , 0.1 ,
0.0 , 1.0 , 0.1 ,
} ;
struct vertex painter [ ] = {
{ - 1.0 , - 1.0 , 0.0 , 0x00000000 } ,
{ 1.0 , - 1.0 , 0.0 , 0x00000000 } ,
{ - 1.0 , 1.0 , 0.0 , 0x00000000 } ,
{ 1.0 , 1.0 , 0.0 , 0x00000000 } ,
} ;
WORD indices_cw [ ] = { 0 , 1 , 3 } ;
WORD indices_ccw [ ] = { 0 , 2 , 3 } ;
unsigned int i ;
DWORD color ;
IDirect3DDevice9_GetDepthStencilSurface ( device , & depthstencil ) ;
if ( depthstencil = = NULL ) {
skip ( " No depth stencil buffer \n " ) ;
return ;
}
hr = IDirect3DSurface9_GetDesc ( depthstencil , & desc ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DSurface9_GetDesc failed with %08x \n " , hr ) ;
2008-02-17 22:31:55 +00:00
IDirect3DSurface9_Release ( depthstencil ) ;
if ( desc . Format ! = D3DFMT_D24S8 & & desc . Format ! = D3DFMT_D24X4S4 ) {
skip ( " No 4 or 8 bit stencil surface \n " ) ;
return ;
}
hr = IDirect3DDevice9_Clear ( device , 0 , NULL , D3DCLEAR_TARGET | D3DCLEAR_STENCIL , 0x00ff0000 , 0.0 , 0x8 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_Clear returned %08x \n " , hr ) ;
2008-02-17 22:31:55 +00:00
IDirect3DDevice9_SetFVF ( device , D3DFVF_XYZ ) ;
hr = IDirect3DDevice9_SetRenderState ( device , D3DRS_STENCILFAIL , D3DSTENCILOP_INCR ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetRenderState returned %08x \n " , hr ) ;
2008-02-17 22:31:55 +00:00
hr = IDirect3DDevice9_SetRenderState ( device , D3DRS_STENCILZFAIL , D3DSTENCILOP_DECR ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetRenderState returned %08x \n " , hr ) ;
2008-02-17 22:31:55 +00:00
hr = IDirect3DDevice9_SetRenderState ( device , D3DRS_STENCILPASS , D3DSTENCILOP_REPLACE ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetRenderState returned %08x \n " , hr ) ;
2008-02-17 22:31:55 +00:00
hr = IDirect3DDevice9_SetRenderState ( device , D3DRS_STENCILREF , 0x3 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetRenderState returned %08x \n " , hr ) ;
2008-02-17 22:31:55 +00:00
hr = IDirect3DDevice9_SetRenderState ( device , D3DRS_CCW_STENCILFAIL , D3DSTENCILOP_REPLACE ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetRenderState returned %08x \n " , hr ) ;
2008-02-17 22:31:55 +00:00
hr = IDirect3DDevice9_SetRenderState ( device , D3DRS_CCW_STENCILZFAIL , D3DSTENCILOP_DECR ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetRenderState returned %08x \n " , hr ) ;
2008-02-17 22:31:55 +00:00
hr = IDirect3DDevice9_SetRenderState ( device , D3DRS_CCW_STENCILPASS , D3DSTENCILOP_INCR ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetRenderState returned %08x \n " , hr ) ;
2008-02-17 22:31:55 +00:00
hr = IDirect3DDevice9_SetRenderState ( device , D3DRS_STENCILENABLE , TRUE ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetRenderState returned %08x \n " , hr ) ;
2008-02-17 22:31:55 +00:00
hr = IDirect3DDevice9_SetRenderState ( device , D3DRS_TWOSIDEDSTENCILMODE , FALSE ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetRenderState returned %08x \n " , hr ) ;
2008-02-17 22:31:55 +00:00
/* First pass: Fill the stencil buffer with some values... */
hr = IDirect3DDevice9_BeginScene ( device ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_BeginScene returned %08x \n " , hr ) ;
2008-02-17 22:31:55 +00:00
if ( SUCCEEDED ( hr ) )
{
hr = IDirect3DDevice9_SetRenderState ( device , D3DRS_CULLMODE , D3DCULL_CW ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetRenderState returned %08x \n " , hr ) ;
2008-02-17 22:31:55 +00:00
hr = IDirect3DDevice9_DrawIndexedPrimitiveUP ( device , D3DPT_TRIANGLELIST , 0 /* MinIndex */ , 4 /* NumVerts */ ,
1 /*PrimCount */ , indices_cw , D3DFMT_INDEX16 , quad1 , sizeof ( float ) * 3 ) ;
hr = IDirect3DDevice9_DrawIndexedPrimitiveUP ( device , D3DPT_TRIANGLELIST , 0 /* MinIndex */ , 4 /* NumVerts */ ,
1 /*PrimCount */ , indices_ccw , D3DFMT_INDEX16 , quad1 , sizeof ( float ) * 3 ) ;
hr = IDirect3DDevice9_SetRenderState ( device , D3DRS_TWOSIDEDSTENCILMODE , TRUE ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetRenderState returned %08x \n " , hr ) ;
2008-02-17 22:31:55 +00:00
hr = IDirect3DDevice9_SetRenderState ( device , D3DRS_CULLMODE , D3DCULL_NONE ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetRenderState returned %08x \n " , hr ) ;
2008-02-17 22:31:55 +00:00
hr = IDirect3DDevice9_DrawIndexedPrimitiveUP ( device , D3DPT_TRIANGLELIST , 0 /* MinIndex */ , 4 /* NumVerts */ ,
1 /*PrimCount */ , indices_cw , D3DFMT_INDEX16 , quad2 , sizeof ( float ) * 3 ) ;
hr = IDirect3DDevice9_DrawIndexedPrimitiveUP ( device , D3DPT_TRIANGLELIST , 0 /* MinIndex */ , 4 /* NumVerts */ ,
1 /*PrimCount */ , indices_ccw , D3DFMT_INDEX16 , quad2 , sizeof ( float ) * 3 ) ;
hr = IDirect3DDevice9_SetRenderState ( device , D3DRS_CULLMODE , D3DCULL_CW ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetRenderState returned %08x \n " , hr ) ;
2008-02-17 22:31:55 +00:00
hr = IDirect3DDevice9_DrawIndexedPrimitiveUP ( device , D3DPT_TRIANGLELIST , 0 /* MinIndex */ , 4 /* NumVerts */ ,
1 /*PrimCount */ , indices_cw , D3DFMT_INDEX16 , quad3 , sizeof ( float ) * 3 ) ;
hr = IDirect3DDevice9_DrawIndexedPrimitiveUP ( device , D3DPT_TRIANGLELIST , 0 /* MinIndex */ , 4 /* NumVerts */ ,
1 /*PrimCount */ , indices_ccw , D3DFMT_INDEX16 , quad3 , sizeof ( float ) * 3 ) ;
hr = IDirect3DDevice9_SetRenderState ( device , D3DRS_CULLMODE , D3DCULL_CCW ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetRenderState returned %08x \n " , hr ) ;
2008-02-17 22:31:55 +00:00
hr = IDirect3DDevice9_DrawIndexedPrimitiveUP ( device , D3DPT_TRIANGLELIST , 0 /* MinIndex */ , 4 /* NumVerts */ ,
1 /*PrimCount */ , indices_cw , D3DFMT_INDEX16 , quad4 , sizeof ( float ) * 3 ) ;
hr = IDirect3DDevice9_DrawIndexedPrimitiveUP ( device , D3DPT_TRIANGLELIST , 0 /* MinIndex */ , 4 /* NumVerts */ ,
1 /*PrimCount */ , indices_ccw , D3DFMT_INDEX16 , quad4 , sizeof ( float ) * 3 ) ;
hr = IDirect3DDevice9_EndScene ( device ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_EndScene returned %08x \n " , hr ) ;
2008-02-17 22:31:55 +00:00
}
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetRenderState returned %08x \n " , hr ) ;
2008-02-17 22:31:55 +00:00
hr = IDirect3DDevice9_SetRenderState ( device , D3DRS_STENCILZFAIL , D3DSTENCILOP_KEEP ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetRenderState returned %08x \n " , hr ) ;
2008-02-17 22:31:55 +00:00
hr = IDirect3DDevice9_SetRenderState ( device , D3DRS_STENCILPASS , D3DSTENCILOP_KEEP ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetRenderState returned %08x \n " , hr ) ;
2008-02-17 22:31:55 +00:00
hr = IDirect3DDevice9_SetRenderState ( device , D3DRS_STENCILFAIL , D3DSTENCILOP_KEEP ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetRenderState returned %08x \n " , hr ) ;
2008-02-17 22:31:55 +00:00
hr = IDirect3DDevice9_SetRenderState ( device , D3DRS_TWOSIDEDSTENCILMODE , FALSE ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetRenderState returned %08x \n " , hr ) ;
2008-02-17 22:31:55 +00:00
hr = IDirect3DDevice9_SetRenderState ( device , D3DRS_CULLMODE , D3DCULL_NONE ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetRenderState returned %08x \n " , hr ) ;
2008-02-17 22:31:55 +00:00
hr = IDirect3DDevice9_SetRenderState ( device , D3DRS_STENCILFUNC , D3DCMP_EQUAL ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetRenderState returned %08x \n " , hr ) ;
2008-02-17 22:31:55 +00:00
/* 2nd pass: Make the stencil values visible */
hr = IDirect3DDevice9_BeginScene ( device ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_BeginScene returned %08x \n " , hr ) ;
2008-02-17 22:31:55 +00:00
if ( SUCCEEDED ( hr ) )
{
IDirect3DDevice9_SetFVF ( device , D3DFVF_XYZ | D3DFVF_DIFFUSE ) ;
for ( i = 0 ; i < 16 ; i + + ) {
hr = IDirect3DDevice9_SetRenderState ( device , D3DRS_STENCILREF , i ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetRenderState returned %08x \n " , hr ) ;
2008-02-17 22:31:55 +00:00
painter [ 0 ] . diffuse = ( i * 16 ) ; /* Creates shades of blue */
painter [ 1 ] . diffuse = ( i * 16 ) ;
painter [ 2 ] . diffuse = ( i * 16 ) ;
painter [ 3 ] . diffuse = ( i * 16 ) ;
hr = IDirect3DDevice9_DrawPrimitiveUP ( device , D3DPT_TRIANGLESTRIP , 2 , painter , sizeof ( painter [ 0 ] ) ) ;
ok ( hr = = D3D_OK , " DrawPrimitiveUP failed (%08x) \n " , hr ) ;
}
hr = IDirect3DDevice9_EndScene ( device ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_EndScene returned %08x \n " , hr ) ;
2008-02-17 22:31:55 +00:00
}
hr = IDirect3DDevice9_Present ( device , NULL , NULL , NULL , NULL ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_Present failed with %08x \n " , hr ) ;
2008-02-17 22:31:55 +00:00
hr = IDirect3DDevice9_SetRenderState ( device , D3DRS_STENCILENABLE , FALSE ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetRenderState returned %08x \n " , hr ) ;
2008-02-17 22:31:55 +00:00
color = getPixelColor ( device , 160 , 420 ) ;
ok ( color = = 0x00000030 , " CCW triangle, twoside FALSE, cull cw, replace, has color 0x%08x, expected 0x00000030 \n " , color ) ;
color = getPixelColor ( device , 160 , 300 ) ;
ok ( color = = 0x00000080 , " CW triangle, twoside FALSE, cull cw, culled, has color 0x%08x, expected 0x00000080 \n " , color ) ;
color = getPixelColor ( device , 480 , 420 ) ;
ok ( color = = 0x00000090 , " CCW triangle, twoside TRUE, cull off, incr, has color 0x%08x, expected 0x00000090 \n " , color ) ;
color = getPixelColor ( device , 480 , 300 ) ;
ok ( color = = 0x00000030 , " CW triangle, twoside TRUE, cull off, replace, has color 0x%08x, expected 0x00000030 \n " , color ) ;
color = getPixelColor ( device , 160 , 180 ) ;
ok ( color = = 0x00000080 , " CCW triangle, twoside TRUE, cull ccw, culled, has color 0x%08x, expected 0x00000080 \n " , color ) ;
color = getPixelColor ( device , 160 , 60 ) ;
ok ( color = = 0x00000030 , " CW triangle, twoside TRUE, cull ccw, replace, has color 0x%08x, expected 0x00000030 \n " , color ) ;
color = getPixelColor ( device , 480 , 180 ) ;
ok ( color = = 0x00000090 , " CCW triangle, twoside TRUE, cull cw, incr, has color 0x%08x, expected 0x00000090 \n " , color ) ;
color = getPixelColor ( device , 480 , 60 ) ;
ok ( color = = 0x00000080 , " CW triangle, twoside TRUE, cull cw, culled, has color 0x%08x, expected 0x00000080 \n " , color ) ;
}
2008-03-07 02:09:51 +00:00
static void vpos_register_test ( IDirect3DDevice9 * device )
{
HRESULT hr ;
DWORD color ;
const DWORD shader_code [ ] = {
0xffff0300 , /* ps_3_0 */
0x0200001f , 0x80000000 , 0x90031000 , /* dcl vPos.xy */
0x03000002 , 0x80030000 , 0x90541000 , 0xa1fe0000 , /* sub r0.xy, vPos.xy, c0.zw */
0x02000001 , 0x800f0001 , 0xa0e40000 , /* mov r1, c0 */
0x02000001 , 0x80080002 , 0xa0550000 , /* mov r2.a, c0.y */
0x02000001 , 0x80010002 , 0xa0550000 , /* mov r2.r, c0.y */
0x04000058 , 0x80020002 , 0x80000000 , 0x80000001 , 0x80550001 , /* cmp r2.g, r0.x, r1.x, r1.y */
0x04000058 , 0x80040002 , 0x80550000 , 0x80000001 , 0x80550001 , /* cmp r2.b, r0.y, r1.x, r1.y */
0x02000001 , 0x800f0800 , 0x80e40002 , /* mov oC0, r2 */
0x0000ffff /* end */
} ;
2008-03-07 02:13:07 +00:00
const DWORD shader_frac_code [ ] = {
0xffff0300 , /* ps_3_0 */
0x05000051 , 0xa00f0000 , 0x00000000 , 0x00000000 , 0x00000000 , 0x00000000 , /* def c0, 0.0, 0.0, 0.0, 0.0 */
0x0200001f , 0x80000000 , 0x90031000 , /* dcl vPos.xy */
0x02000001 , 0x800f0000 , 0xa0e40000 , /* mov r0, c0 */
0x02000013 , 0x80030000 , 0x90541000 , /* frc r0.xy, vPos.xy */
0x02000001 , 0x800f0800 , 0x80e40000 , /* mov oC0, r0 */
0x0000ffff /* end */
} ;
IDirect3DPixelShader9 * shader , * shader_frac ;
2008-03-07 02:09:51 +00:00
IDirect3DSurface9 * surface = NULL , * backbuffer ;
const float quad [ ] = {
- 1.0 , - 1.0 , 0.1 , 0.0 , 0.0 ,
1.0 , - 1.0 , 0.1 , 1.0 , 0.0 ,
- 1.0 , 1.0 , 0.1 , 0.0 , 1.0 ,
1.0 , 1.0 , 0.1 , 1.0 , 1.0 ,
} ;
D3DLOCKED_RECT lr ;
float constant [ 4 ] = { 1.0 , 0.0 , 320 , 240 } ;
DWORD * pos ;
hr = IDirect3DDevice9_Clear ( device , 0 , NULL , D3DCLEAR_TARGET , 0xff0000ff , 0.0 , 0 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_Clear failed, hr=%08x \n " , hr ) ;
2008-03-07 02:09:51 +00:00
hr = IDirect3DDevice9_CreatePixelShader ( device , shader_code , & shader ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_CreatePixelShader failed hr=%08x \n " , hr ) ;
2008-03-07 02:13:07 +00:00
hr = IDirect3DDevice9_CreatePixelShader ( device , shader_frac_code , & shader_frac ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_CreatePixelShader failed hr=%08x \n " , hr ) ;
2008-03-07 02:09:51 +00:00
hr = IDirect3DDevice9_SetPixelShader ( device , shader ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetPixelShader failed hr=%08x \n " , hr ) ;
2008-03-07 02:09:51 +00:00
hr = IDirect3DDevice9_SetFVF ( device , D3DFVF_XYZ ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetFVF failed hr=%08x \n " , hr ) ;
2008-03-07 02:09:51 +00:00
hr = IDirect3DDevice9_GetBackBuffer ( device , 0 , 0 , D3DBACKBUFFER_TYPE_MONO , & backbuffer ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_GetBackBuffer failed hr=%08x \n " , hr ) ;
2008-03-07 02:09:51 +00:00
hr = IDirect3DDevice9_BeginScene ( device ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_BeginScene failed hr=%08x \n " , hr ) ;
2008-03-07 02:09:51 +00:00
if ( SUCCEEDED ( hr ) ) {
hr = IDirect3DDevice9_SetPixelShaderConstantF ( device , 0 , constant , 1 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetPixelShaderConstantF failed hr=%08x \n " , hr ) ;
2008-03-07 02:09:51 +00:00
hr = IDirect3DDevice9_DrawPrimitiveUP ( device , D3DPT_TRIANGLESTRIP , 2 , quad , sizeof ( float ) * 5 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_DrawPrimitiveUP failed, hr=%08x \n " , hr ) ;
2008-03-07 02:09:51 +00:00
hr = IDirect3DDevice9_EndScene ( device ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_EndScene failed hr=%08x \n " , hr ) ;
2008-03-07 02:09:51 +00:00
}
IDirect3DDevice9_Present ( device , NULL , NULL , NULL , NULL ) ;
/* This has to be pixel exact */
color = getPixelColor ( device , 319 , 239 ) ;
ok ( color = = 0x00000000 , " vPos: Pixel 319,239 has color 0x%08x, expected 0x00000000 \n " , color ) ;
color = getPixelColor ( device , 320 , 239 ) ;
ok ( color = = 0x0000ff00 , " vPos: Pixel 320,239 has color 0x%08x, expected 0x0000ff00 \n " , color ) ;
color = getPixelColor ( device , 319 , 240 ) ;
ok ( color = = 0x000000ff , " vPos: Pixel 319,240 has color 0x%08x, expected 0x000000ff \n " , color ) ;
color = getPixelColor ( device , 320 , 240 ) ;
ok ( color = = 0x0000ffff , " vPos: Pixel 320,240 has color 0x%08x, expected 0x0000ffff \n " , color ) ;
hr = IDirect3DDevice9_CreateRenderTarget ( device , 32 , 32 , D3DFMT_X8R8G8B8 , 0 , 0 , TRUE ,
& surface , NULL ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_CreateRenderTarget failed hr=%08x \n " , hr ) ;
2008-03-07 02:09:51 +00:00
hr = IDirect3DDevice9_BeginScene ( device ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_BeginScene failed hr=%08x \n " , hr ) ;
2008-03-07 02:09:51 +00:00
if ( SUCCEEDED ( hr ) ) {
constant [ 2 ] = 16 ; constant [ 3 ] = 16 ;
hr = IDirect3DDevice9_SetPixelShaderConstantF ( device , 0 , constant , 1 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetPixelShaderConstantF failed hr=%08x \n " , hr ) ;
2008-03-07 02:09:51 +00:00
hr = IDirect3DDevice9_SetRenderTarget ( device , 0 , surface ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetRenderTarget failed, hr=%08x \n " , hr ) ;
2008-03-07 02:09:51 +00:00
hr = IDirect3DDevice9_DrawPrimitiveUP ( device , D3DPT_TRIANGLESTRIP , 2 , quad , sizeof ( float ) * 5 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_DrawPrimitiveUP failed, hr=%08x \n " , hr ) ;
2008-03-07 02:09:51 +00:00
hr = IDirect3DDevice9_EndScene ( device ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_EndScene failed hr=%08x \n " , hr ) ;
2008-03-07 02:09:51 +00:00
}
hr = IDirect3DSurface9_LockRect ( surface , & lr , NULL , D3DLOCK_READONLY ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DSurface9_LockRect failed, hr=%08x \n " , hr ) ;
2008-03-07 02:09:51 +00:00
pos = ( DWORD * ) ( ( ( BYTE * ) lr . pBits ) + 14 * lr . Pitch + 14 * sizeof ( DWORD ) ) ;
color = * pos & 0x00ffffff ;
ok ( color = = 0x00000000 , " Pixel 14/14 has color 0x%08x, expected 0x00000000 \n " , color ) ;
pos = ( DWORD * ) ( ( ( BYTE * ) lr . pBits ) + 14 * lr . Pitch + 18 * sizeof ( DWORD ) ) ;
color = * pos & 0x00ffffff ;
ok ( color = = 0x0000ff00 , " Pixel 14/18 has color 0x%08x, expected 0x0000ff00 \n " , color ) ;
pos = ( DWORD * ) ( ( ( BYTE * ) lr . pBits ) + 18 * lr . Pitch + 14 * sizeof ( DWORD ) ) ;
color = * pos & 0x00ffffff ;
ok ( color = = 0x000000ff , " Pixel 18/14 has color 0x%08x, expected 0x000000ff \n " , color ) ;
pos = ( DWORD * ) ( ( ( BYTE * ) lr . pBits ) + 18 * lr . Pitch + 18 * sizeof ( DWORD ) ) ;
color = * pos & 0x00ffffff ;
ok ( color = = 0x0000ffff , " Pixel 18/18 has color 0x%08x, expected 0x0000ffff \n " , color ) ;
hr = IDirect3DSurface9_UnlockRect ( surface ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DSurface9_UnlockRect failed, hr=%08x \n " , hr ) ;
2008-03-07 02:09:51 +00:00
2008-03-07 02:13:07 +00:00
/* Test the fraction value of vPos. This is tested with the offscreen target and not the backbuffer to
* have full control over the multisampling setting inside this test
*/
hr = IDirect3DDevice9_SetPixelShader ( device , shader_frac ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetPixelShader failed hr=%08x \n " , hr ) ;
2008-03-07 02:13:07 +00:00
hr = IDirect3DDevice9_BeginScene ( device ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_BeginScene failed hr=%08x \n " , hr ) ;
2008-03-07 02:13:07 +00:00
if ( SUCCEEDED ( hr ) ) {
hr = IDirect3DDevice9_Clear ( device , 0 , NULL , D3DCLEAR_TARGET , 0xff0000ff , 0.0 , 0 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_Clear failed, hr=%08x \n " , hr ) ;
2008-03-07 02:13:07 +00:00
hr = IDirect3DDevice9_DrawPrimitiveUP ( device , D3DPT_TRIANGLESTRIP , 2 , quad , sizeof ( float ) * 5 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_DrawPrimitiveUP failed, hr=%08x \n " , hr ) ;
2008-03-07 02:13:07 +00:00
hr = IDirect3DDevice9_EndScene ( device ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_EndScene failed hr=%08x \n " , hr ) ;
2008-03-07 02:13:07 +00:00
}
hr = IDirect3DDevice9_SetRenderTarget ( device , 0 , backbuffer ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetRenderTarget failed, hr=%08x \n " , hr ) ;
2008-03-07 02:13:07 +00:00
hr = IDirect3DSurface9_LockRect ( surface , & lr , NULL , D3DLOCK_READONLY ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DSurface9_LockRect failed, hr=%08x \n " , hr ) ;
2008-03-07 02:13:07 +00:00
pos = ( DWORD * ) ( ( ( BYTE * ) lr . pBits ) + 14 * lr . Pitch + 14 * sizeof ( DWORD ) ) ;
color = * pos & 0x00ffffff ;
ok ( color = = 0x00000000 , " vPos fraction test has color 0x%08x, expected 0x00000000 \n " , color ) ;
hr = IDirect3DSurface9_UnlockRect ( surface ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DSurface9_UnlockRect failed, hr=%08x \n " , hr ) ;
2008-03-07 02:13:07 +00:00
hr = IDirect3DDevice9_SetPixelShader ( device , NULL ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetPixelShader failed hr=%08x \n " , hr ) ;
2008-03-07 02:09:51 +00:00
IDirect3DPixelShader9_Release ( shader ) ;
2008-03-07 02:13:07 +00:00
IDirect3DPixelShader9_Release ( shader_frac ) ;
2008-03-07 02:09:51 +00:00
if ( surface ) IDirect3DSurface9_Release ( surface ) ;
IDirect3DSurface9_Release ( backbuffer ) ;
}
2008-02-17 22:35:39 +00:00
static void pointsize_test ( IDirect3DDevice9 * device )
{
HRESULT hr ;
D3DCAPS9 caps ;
D3DMATRIX matrix ;
D3DMATRIX identity ;
2008-11-07 16:02:54 +00:00
float ptsize , ptsize_orig , ptsizemax_orig , ptsizemin_orig ;
2008-02-17 22:35:39 +00:00
DWORD color ;
const float vertices [ ] = {
64 , 64 , 0.1 ,
128 , 64 , 0.1 ,
192 , 64 , 0.1 ,
256 , 64 , 0.1 ,
320 , 64 , 0.1 ,
2008-11-07 16:02:54 +00:00
384 , 64 , 0.1 ,
448 , 64 , 0.1 ,
512 , 64 , 0.1 ,
576 , 64 , 0.1 ,
2008-02-17 22:35:39 +00:00
} ;
/* Transforms the coordinate system [-1.0;1.0]x[-1.0;1.0] to [0.0;0.0]x[640.0;480.0]. Z is untouched */
2008-03-10 13:14:53 +00:00
U ( matrix ) . m [ 0 ] [ 0 ] = 2.0 / 640.0 ; U ( matrix ) . m [ 1 ] [ 0 ] = 0.0 ; U ( matrix ) . m [ 2 ] [ 0 ] = 0.0 ; U ( matrix ) . m [ 3 ] [ 0 ] = - 1.0 ;
U ( matrix ) . m [ 0 ] [ 1 ] = 0.0 ; U ( matrix ) . m [ 1 ] [ 1 ] = - 2.0 / 480.0 ; U ( matrix ) . m [ 2 ] [ 1 ] = 0.0 ; U ( matrix ) . m [ 3 ] [ 1 ] = 1.0 ;
U ( matrix ) . m [ 0 ] [ 2 ] = 0.0 ; U ( matrix ) . m [ 1 ] [ 2 ] = 0.0 ; U ( matrix ) . m [ 2 ] [ 2 ] = 1.0 ; U ( matrix ) . m [ 3 ] [ 2 ] = 0.0 ;
U ( matrix ) . m [ 0 ] [ 3 ] = 0.0 ; U ( matrix ) . m [ 1 ] [ 3 ] = 0.0 ; U ( matrix ) . m [ 2 ] [ 3 ] = 0.0 ; U ( matrix ) . m [ 3 ] [ 3 ] = 1.0 ;
U ( identity ) . m [ 0 ] [ 0 ] = 1.0 ; U ( identity ) . m [ 1 ] [ 0 ] = 0.0 ; U ( identity ) . m [ 2 ] [ 0 ] = 0.0 ; U ( identity ) . m [ 3 ] [ 0 ] = 0.0 ;
U ( identity ) . m [ 0 ] [ 1 ] = 0.0 ; U ( identity ) . m [ 1 ] [ 1 ] = 1.0 ; U ( identity ) . m [ 2 ] [ 1 ] = 0.0 ; U ( identity ) . m [ 3 ] [ 1 ] = 0.0 ;
U ( identity ) . m [ 0 ] [ 2 ] = 0.0 ; U ( identity ) . m [ 1 ] [ 2 ] = 0.0 ; U ( identity ) . m [ 2 ] [ 2 ] = 1.0 ; U ( identity ) . m [ 3 ] [ 2 ] = 0.0 ;
U ( identity ) . m [ 0 ] [ 3 ] = 0.0 ; U ( identity ) . m [ 1 ] [ 3 ] = 0.0 ; U ( identity ) . m [ 2 ] [ 3 ] = 0.0 ; U ( identity ) . m [ 3 ] [ 3 ] = 1.0 ;
2008-02-17 22:35:39 +00:00
memset ( & caps , 0 , sizeof ( caps ) ) ;
hr = IDirect3DDevice9_GetDeviceCaps ( device , & caps ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_GetDeviceCaps failed hr=%08x \n " , hr ) ;
2008-02-17 22:35:39 +00:00
if ( caps . MaxPointSize < 32.0 ) {
skip ( " MaxPointSize < 32.0, skipping(MaxPointsize = %f) \n " , caps . MaxPointSize ) ;
return ;
}
hr = IDirect3DDevice9_Clear ( device , 0 , NULL , D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER , 0xff0000ff , 0.0 , 0 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_Clear failed, hr=%08x \n " , hr ) ;
2008-02-17 22:35:39 +00:00
hr = IDirect3DDevice9_SetTransform ( device , D3DTS_PROJECTION , & matrix ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetTransform failed, hr=%08x \n " , hr ) ;
2008-02-17 22:35:39 +00:00
hr = IDirect3DDevice9_SetFVF ( device , D3DFVF_XYZ ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetFVF failed hr=%08x \n " , hr ) ;
2008-02-17 22:35:39 +00:00
hr = IDirect3DDevice9_GetRenderState ( device , D3DRS_POINTSIZE , ( DWORD * ) & ptsize_orig ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_GetRenderState failed hr=%08x \n " , hr ) ;
2008-02-17 22:35:39 +00:00
hr = IDirect3DDevice9_BeginScene ( device ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_BeginScene failed hr=%08x \n " , hr ) ;
2008-02-17 22:35:39 +00:00
if ( SUCCEEDED ( hr ) ) {
ptsize = 16.0 ;
hr = IDirect3DDevice9_SetRenderState ( device , D3DRS_POINTSIZE , * ( ( DWORD * ) ( & ptsize ) ) ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetRenderState failed, hr=%08x \n " , hr ) ;
2008-02-17 22:35:39 +00:00
hr = IDirect3DDevice9_DrawPrimitiveUP ( device , D3DPT_POINTLIST , 1 , & vertices [ 0 ] , sizeof ( float ) * 3 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_DrawPrimitiveUP failed, hr=%08x \n " , hr ) ;
2008-02-17 22:35:39 +00:00
ptsize = 32.0 ;
hr = IDirect3DDevice9_SetRenderState ( device , D3DRS_POINTSIZE , * ( ( DWORD * ) ( & ptsize ) ) ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetRenderState failed, hr=%08x \n " , hr ) ;
2008-02-17 22:35:39 +00:00
hr = IDirect3DDevice9_DrawPrimitiveUP ( device , D3DPT_POINTLIST , 1 , & vertices [ 3 ] , sizeof ( float ) * 3 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_DrawPrimitiveUP failed, hr=%08x \n " , hr ) ;
2008-02-17 22:35:39 +00:00
ptsize = 31.5 ;
hr = IDirect3DDevice9_SetRenderState ( device , D3DRS_POINTSIZE , * ( ( DWORD * ) ( & ptsize ) ) ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetRenderState failed, hr=%08x \n " , hr ) ;
2008-02-17 22:35:39 +00:00
hr = IDirect3DDevice9_DrawPrimitiveUP ( device , D3DPT_POINTLIST , 1 , & vertices [ 6 ] , sizeof ( float ) * 3 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_DrawPrimitiveUP failed, hr=%08x \n " , hr ) ;
2008-02-17 22:35:39 +00:00
if ( caps . MaxPointSize > = 64.0 ) {
ptsize = 64.0 ;
hr = IDirect3DDevice9_SetRenderState ( device , D3DRS_POINTSIZE , * ( ( DWORD * ) ( & ptsize ) ) ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetRenderState failed, hr=%08x \n " , hr ) ;
2008-02-17 22:35:39 +00:00
hr = IDirect3DDevice9_DrawPrimitiveUP ( device , D3DPT_POINTLIST , 1 , & vertices [ 9 ] , sizeof ( float ) * 3 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_DrawPrimitiveUP failed, hr=%08x \n " , hr ) ;
2008-02-17 22:35:39 +00:00
ptsize = 63.75 ;
hr = IDirect3DDevice9_SetRenderState ( device , D3DRS_POINTSIZE , * ( ( DWORD * ) ( & ptsize ) ) ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetRenderState failed, hr=%08x \n " , hr ) ;
2008-02-17 22:35:39 +00:00
hr = IDirect3DDevice9_DrawPrimitiveUP ( device , D3DPT_POINTLIST , 1 , & vertices [ 15 ] , sizeof ( float ) * 3 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_DrawPrimitiveUP failed, hr=%08x \n " , hr ) ;
2008-02-17 22:35:39 +00:00
}
ptsize = 1.0 ;
hr = IDirect3DDevice9_SetRenderState ( device , D3DRS_POINTSIZE , * ( ( DWORD * ) ( & ptsize ) ) ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetRenderState failed, hr=%08x \n " , hr ) ;
2008-02-17 22:35:39 +00:00
hr = IDirect3DDevice9_DrawPrimitiveUP ( device , D3DPT_POINTLIST , 1 , & vertices [ 12 ] , sizeof ( float ) * 3 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_DrawPrimitiveUP failed, hr=%08x \n " , hr ) ;
2008-02-17 22:35:39 +00:00
2008-11-07 16:02:54 +00:00
hr = IDirect3DDevice9_GetRenderState ( device , D3DRS_POINTSIZE_MAX , ( DWORD * ) ( & ptsizemax_orig ) ) ;
ok ( hr = = D3D_OK , " IDirect3DDevice9_GetRenderState failed, hr=%08x \n " , hr ) ;
hr = IDirect3DDevice9_GetRenderState ( device , D3DRS_POINTSIZE_MAX , ( DWORD * ) ( & ptsizemin_orig ) ) ;
ok ( hr = = D3D_OK , " IDirect3DDevice9_GetRenderState failed, hr=%08x \n " , hr ) ;
/* What happens if point scaling is disabled, and POINTSIZE_MAX < POINTSIZE? */
ptsize = 16.0 ;
hr = IDirect3DDevice9_SetRenderState ( device , D3DRS_POINTSIZE , * ( ( DWORD * ) ( & ptsize ) ) ) ;
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetRenderState failed, hr=%08x \n " , hr ) ;
ptsize = 1.0 ;
hr = IDirect3DDevice9_SetRenderState ( device , D3DRS_POINTSIZE_MAX , * ( ( DWORD * ) ( & ptsize ) ) ) ;
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetRenderState failed, hr=%08x \n " , hr ) ;
hr = IDirect3DDevice9_DrawPrimitiveUP ( device , D3DPT_POINTLIST , 1 , & vertices [ 18 ] , sizeof ( float ) * 3 ) ;
ok ( hr = = D3D_OK , " IDirect3DDevice9_DrawPrimitiveUP failed, hr=%08x \n " , hr ) ;
/* What happens if POINTSIZE_MAX < POINTSIZE_MIN?
* ptsize = 4.0 , ptsize_max = 1.0 , ptsize_min = 16.0
*/
ptsize = 4.0 ;
hr = IDirect3DDevice9_SetRenderState ( device , D3DRS_POINTSIZE , * ( ( DWORD * ) ( & ptsize ) ) ) ;
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetRenderState failed, hr=%08x \n " , hr ) ;
ptsize = 16.0 ;
hr = IDirect3DDevice9_SetRenderState ( device , D3DRS_POINTSIZE_MIN , * ( ( DWORD * ) ( & ptsize ) ) ) ;
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetRenderState failed, hr=%08x \n " , hr ) ;
hr = IDirect3DDevice9_DrawPrimitiveUP ( device , D3DPT_POINTLIST , 1 , & vertices [ 21 ] , sizeof ( float ) * 3 ) ;
ok ( hr = = D3D_OK , " IDirect3DDevice9_DrawPrimitiveUP failed, hr=%08x \n " , hr ) ;
hr = IDirect3DDevice9_SetRenderState ( device , D3DRS_POINTSIZE_MAX , * ( ( DWORD * ) ( & ptsizemax_orig ) ) ) ;
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetRenderState failed, hr=%08x \n " , hr ) ;
/* pointsize < pointsize_min < pointsize_max?
* pointsize = 1.0 , pointsize_min = 16.0 , pointsize_max = default ( usually 64.0 )
*/
ptsize = 1.0 ;
hr = IDirect3DDevice9_SetRenderState ( device , D3DRS_POINTSIZE , * ( ( DWORD * ) ( & ptsize ) ) ) ;
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetRenderState failed, hr=%08x \n " , hr ) ;
ptsize = 16.0 ;
hr = IDirect3DDevice9_SetRenderState ( device , D3DRS_POINTSIZE_MIN , * ( ( DWORD * ) ( & ptsize ) ) ) ;
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetRenderState failed, hr=%08x \n " , hr ) ;
hr = IDirect3DDevice9_DrawPrimitiveUP ( device , D3DPT_POINTLIST , 1 , & vertices [ 24 ] , sizeof ( float ) * 3 ) ;
ok ( hr = = D3D_OK , " IDirect3DDevice9_DrawPrimitiveUP failed, hr=%08x \n " , hr ) ;
hr = IDirect3DDevice9_SetRenderState ( device , D3DRS_POINTSIZE_MIN , * ( ( DWORD * ) ( & ptsizemin_orig ) ) ) ;
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetRenderState failed, hr=%08x \n " , hr ) ;
2008-02-17 22:35:39 +00:00
hr = IDirect3DDevice9_EndScene ( device ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_EndScene failed hr=%08x \n " , hr ) ;
2008-02-17 22:35:39 +00:00
}
IDirect3DDevice9_Present ( device , NULL , NULL , NULL , NULL ) ;
color = getPixelColor ( device , 64 - 9 , 64 - 9 ) ;
ok ( color = = 0x000000ff , " pSize: Pixel (64-9),(64-9) has color 0x%08x, expected 0x000000ff \n " , color ) ;
color = getPixelColor ( device , 64 - 8 , 64 - 8 ) ;
todo_wine ok ( color = = 0x00ffffff , " pSize: Pixel (64-8) , ( 64 - 8 ) has color 0 x % 08 x , expected 0x00ffffff \ n " , color) ;
color = getPixelColor ( device , 64 - 7 , 64 - 7 ) ;
ok ( color = = 0x00ffffff , " pSize: Pixel (64-7),(64-7) has color 0x%08x, expected 0x00ffffff \n " , color ) ;
color = getPixelColor ( device , 64 + 7 , 64 + 7 ) ;
ok ( color = = 0x00ffffff , " pSize: Pixel (64+7),(64+7) has color 0x%08x, expected 0x00ffffff \n " , color ) ;
color = getPixelColor ( device , 64 + 8 , 64 + 8 ) ;
ok ( color = = 0x000000ff , " pSize: Pixel (64+8),(64+8) has color 0x%08x, expected 0x000000ff \n " , color ) ;
color = getPixelColor ( device , 64 + 9 , 64 + 9 ) ;
ok ( color = = 0x000000ff , " pSize: Pixel (64+9),(64+9) has color 0x%08x, expected 0x000000ff \n " , color ) ;
color = getPixelColor ( device , 128 - 17 , 64 - 17 ) ;
ok ( color = = 0x000000ff , " pSize: Pixel (128-17),(64-17) has color 0x%08x, expected 0x000000ff \n " , color ) ;
color = getPixelColor ( device , 128 - 16 , 64 - 16 ) ;
todo_wine ok ( color = = 0x00ffffff , " pSize: Pixel (128-16) , ( 64 - 16 ) has color 0 x % 08 x , expected 0x00ffffff \ n " , color) ;
color = getPixelColor ( device , 128 - 15 , 64 - 15 ) ;
ok ( color = = 0x00ffffff , " pSize: Pixel (128-15),(64-15) has color 0x%08x, expected 0x00ffffff \n " , color ) ;
color = getPixelColor ( device , 128 + 15 , 64 + 15 ) ;
ok ( color = = 0x00ffffff , " pSize: Pixel (128+15),(64+15) has color 0x%08x, expected 0x00ffffff \n " , color ) ;
color = getPixelColor ( device , 128 + 16 , 64 + 16 ) ;
ok ( color = = 0x000000ff , " pSize: Pixel (128+16),(64+16) has color 0x%08x, expected 0x000000ff \n " , color ) ;
color = getPixelColor ( device , 128 + 17 , 64 + 17 ) ;
ok ( color = = 0x000000ff , " pSize: Pixel (128+17),(64+17) has color 0x%08x, expected 0x000000ff \n " , color ) ;
color = getPixelColor ( device , 192 - 17 , 64 - 17 ) ;
ok ( color = = 0x000000ff , " pSize: Pixel (192-17),(64-17) has color 0x%08x, expected 0x000000ff \n " , color ) ;
color = getPixelColor ( device , 192 - 16 , 64 - 16 ) ;
ok ( color = = 0x000000ff , " pSize: Pixel (192-16),(64-16) has color 0x%08x, expected 0x000000ff \n " , color ) ;
color = getPixelColor ( device , 192 - 15 , 64 - 15 ) ;
ok ( color = = 0x00ffffff , " pSize: Pixel (192-15),(64-15) has color 0x%08x, expected 0x00ffffff \n " , color ) ;
color = getPixelColor ( device , 192 + 15 , 64 + 15 ) ;
ok ( color = = 0x00ffffff , " pSize: Pixel (192+15),(64+15) has color 0x%08x, expected 0x00ffffff \n " , color ) ;
color = getPixelColor ( device , 192 + 16 , 64 + 16 ) ;
ok ( color = = 0x000000ff , " pSize: Pixel (192+16),(64+16) has color 0x%08x, expected 0x000000ff \n " , color ) ;
color = getPixelColor ( device , 192 + 17 , 64 + 17 ) ;
ok ( color = = 0x000000ff , " pSize: Pixel (192+17),(64+17) has color 0x%08x, expected 0x000000ff \n " , color ) ;
if ( caps . MaxPointSize > = 64.0 ) {
color = getPixelColor ( device , 256 - 33 , 64 - 33 ) ;
ok ( color = = 0x000000ff , " pSize: Pixel (256-33),(64-33) has color 0x%08x, expected 0x000000ff \n " , color ) ;
color = getPixelColor ( device , 256 - 32 , 64 - 32 ) ;
todo_wine ok ( color = = 0x00ffffff , " pSize: Pixel (256-32) , ( 64 - 32 ) has color 0 x % 08 x , expected 0x00ffffff \ n " , color) ;
color = getPixelColor ( device , 256 - 31 , 64 - 31 ) ;
ok ( color = = 0x00ffffff , " pSize: Pixel (256-31),(64-31) has color 0x%08x, expected 0x00ffffff \n " , color ) ;
color = getPixelColor ( device , 256 + 31 , 64 + 31 ) ;
ok ( color = = 0x00ffffff , " pSize: Pixel (256+31),(64+31) has color 0x%08x, expected 0x00ffffff \n " , color ) ;
color = getPixelColor ( device , 256 + 32 , 64 + 32 ) ;
ok ( color = = 0x000000ff , " pSize: Pixel (256+32),(64+32) has color 0x%08x, expected 0x000000ff \n " , color ) ;
color = getPixelColor ( device , 256 + 33 , 64 + 33 ) ;
ok ( color = = 0x000000ff , " pSize: Pixel (256+33),(64+33) has color 0x%08x, expected 0x000000ff \n " , color ) ;
color = getPixelColor ( device , 384 - 33 , 64 - 33 ) ;
ok ( color = = 0x000000ff , " pSize: Pixel (384-33),(64-33) has color 0x%08x, expected 0x000000ff \n " , color ) ;
color = getPixelColor ( device , 384 - 32 , 64 - 32 ) ;
ok ( color = = 0x000000ff , " pSize: Pixel (384-32),(64-32) has color 0x%08x, expected 0x000000ff \n " , color ) ;
color = getPixelColor ( device , 384 - 31 , 64 - 31 ) ;
ok ( color = = 0x00ffffff , " pSize: Pixel (384-31),(64-31) has color 0x%08x, expected 0x00ffffff \n " , color ) ;
color = getPixelColor ( device , 384 + 31 , 64 + 31 ) ;
ok ( color = = 0x00ffffff , " pSize: Pixel (384+31),(64+31) has color 0x%08x, expected 0x00ffffff \n " , color ) ;
color = getPixelColor ( device , 384 + 32 , 64 + 32 ) ;
ok ( color = = 0x000000ff , " pSize: Pixel (384+32),(64+32) has color 0x%08x, expected 0x000000ff \n " , color ) ;
color = getPixelColor ( device , 384 + 33 , 64 + 33 ) ;
ok ( color = = 0x000000ff , " pSize: Pixel (384+33),(64+33) has color 0x%08x, expected 0x000000ff \n " , color ) ;
}
color = getPixelColor ( device , 320 - 1 , 64 - 1 ) ;
ok ( color = = 0x000000ff , " pSize: Pixel (320-1),(64-1) has color 0x%08x, expected 0x000000ff \n " , color ) ;
color = getPixelColor ( device , 320 - 0 , 64 - 0 ) ;
ok ( color = = 0x00ffffff , " pSize: Pixel (320-0),(64-0) has color 0x%08x, expected 0x00ffffff \n " , color ) ;
color = getPixelColor ( device , 320 + 1 , 64 + 1 ) ;
ok ( color = = 0x000000ff , " pSize: Pixel (320+1),(64+1) has color 0x%08x, expected 0x000000ff \n " , color ) ;
2008-11-07 16:02:54 +00:00
/* ptsize = 16, ptsize_max = 1 --> point has size 1 */
color = getPixelColor ( device , 448 - 4 , 64 - 4 ) ;
2009-03-02 08:11:59 +00:00
ok ( color = = 0x000000ff , " pSize: Pixel (448-4),(64-4) has color 0x%08x, expected 0x000000ff \n " , color ) ;
2008-11-07 16:02:54 +00:00
color = getPixelColor ( device , 448 + 4 , 64 + 4 ) ;
2009-03-02 08:11:59 +00:00
ok ( color = = 0x000000ff , " pSize: Pixel (448+4),(64+4) has color 0x%08x, expected 0x000000ff \n " , color ) ;
2008-11-07 16:02:54 +00:00
/* ptsize = 4, ptsize_max = 1, ptsize_min = 16 --> point has size 1 */
color = getPixelColor ( device , 512 - 4 , 64 - 4 ) ;
2009-03-02 08:11:59 +00:00
ok ( color = = 0x000000ff , " pSize: Pixel (512-4),(64-4) has color 0x%08x, expected 0x000000ff \n " , color ) ;
2008-11-07 16:02:54 +00:00
color = getPixelColor ( device , 512 + 4 , 64 + 4 ) ;
2009-03-02 08:11:59 +00:00
ok ( color = = 0x000000ff , " pSize: Pixel (512+4),(64+4) has color 0x%08x, expected 0x000000ff \n " , color ) ;
2008-11-07 16:02:54 +00:00
/* ptsize = 1, ptsize_max = default(64), ptsize_min = 16 --> point has size 16
* Don ' t be overly picky - just show that the point is bigger than 1 pixel
*/
color = getPixelColor ( device , 576 - 4 , 64 - 4 ) ;
2009-03-02 08:11:59 +00:00
ok ( color = = 0x00ffffff , " pSize: Pixel (576-4),(64-4) has color 0x%08x, expected 0x00ffffff \n " , color ) ;
2008-11-07 16:02:54 +00:00
color = getPixelColor ( device , 576 + 4 , 64 + 4 ) ;
2009-03-02 08:11:59 +00:00
ok ( color = = 0x00ffffff , " pSize: Pixel (576+4),(64+4) has color 0x%08x, expected 0x00ffffff \n " , color ) ;
2008-11-07 16:02:54 +00:00
2008-02-17 22:35:39 +00:00
hr = IDirect3DDevice9_SetRenderState ( device , D3DRS_POINTSIZE , * ( ( DWORD * ) ( & ptsize_orig ) ) ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetRenderState failed hr=%08x \n " , hr ) ;
2008-02-17 22:35:39 +00:00
hr = IDirect3DDevice9_SetTransform ( device , D3DTS_PROJECTION , & identity ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetTransform failed, hr=%08x \n " , hr ) ;
2008-02-17 22:35:39 +00:00
}
2008-02-26 11:21:55 +00:00
static void multiple_rendertargets_test ( IDirect3DDevice9 * device )
{
HRESULT hr ;
IDirect3DPixelShader9 * ps ;
IDirect3DTexture9 * tex1 , * tex2 ;
IDirect3DSurface9 * surf1 , * surf2 , * backbuf ;
D3DCAPS9 caps ;
DWORD color ;
DWORD shader_code [ ] = {
0xffff0300 , /* ps_3_0 */
0x05000051 , 0xa00f0000 , 0x00000000 , 0x3f800000 , 0x00000000 , 0x00000000 , /* def c0, 0, 1, 0, 0 */
0x05000051 , 0xa00f0001 , 0x00000000 , 0x00000000 , 0x3f800000 , 0x00000000 , /* def c1, 0, 0, 1, 0 */
0x02000001 , 0x800f0800 , 0xa0e40000 , /* mov oC0, c0 */
0x02000001 , 0x800f0801 , 0xa0e40001 , /* mov oC1, c1 */
0x0000ffff /* END */
} ;
float quad [ ] = {
- 1.0 , - 1.0 , 0.1 ,
1.0 , - 1.0 , 0.1 ,
- 1.0 , 1.0 , 0.1 ,
1.0 , 1.0 , 0.1 ,
} ;
float texquad [ ] = {
- 1.0 , - 1.0 , 0.1 , 0.0 , 0.0 ,
0.0 , - 1.0 , 0.1 , 1.0 , 0.0 ,
- 1.0 , 1.0 , 0.1 , 0.0 , 1.0 ,
0.0 , 1.0 , 0.1 , 1.0 , 1.0 ,
0.0 , - 1.0 , 0.1 , 0.0 , 0.0 ,
1.0 , - 1.0 , 0.1 , 1.0 , 0.0 ,
0.0 , 1.0 , 0.1 , 0.0 , 1.0 ,
1.0 , 1.0 , 0.1 , 1.0 , 1.0 ,
} ;
memset ( & caps , 0 , sizeof ( caps ) ) ;
hr = IDirect3DDevice9_GetDeviceCaps ( device , & caps ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_GetCaps failed, hr=%08x \n " , hr ) ;
2008-02-26 11:21:55 +00:00
if ( caps . NumSimultaneousRTs < 2 ) {
skip ( " Only 1 simultaneous render target supported, skipping MRT test \n " ) ;
return ;
}
hr = IDirect3DDevice9_Clear ( device , 0 , NULL , D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER , 0xffff0000 , 0.0 , 0 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_Clear failed, hr=%08x \n " , hr ) ;
2008-02-26 11:21:55 +00:00
hr = IDirect3DDevice9_CreateTexture ( device , 16 , 16 , 1 , D3DUSAGE_RENDERTARGET , D3DFMT_X8R8G8B8 , D3DPOOL_DEFAULT , & tex1 , NULL ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_CreateTexture failed, hr=%08x \n " , hr ) ;
2008-02-26 11:21:55 +00:00
hr = IDirect3DDevice9_CreateTexture ( device , 16 , 16 , 1 , D3DUSAGE_RENDERTARGET , D3DFMT_X8R8G8B8 , D3DPOOL_DEFAULT , & tex2 , NULL ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_CreateTexture failed, hr=%08x \n " , hr ) ;
2008-02-26 11:21:55 +00:00
hr = IDirect3DDevice9_CreatePixelShader ( device , shader_code , & ps ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_CreatePixelShader failed, hr=%08x \n " , hr ) ;
2008-02-26 11:21:55 +00:00
hr = IDirect3DDevice9_GetRenderTarget ( device , 0 , & backbuf ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_GetRenderTarget failed, hr=%08x \n " , hr ) ;
2008-02-26 11:21:55 +00:00
hr = IDirect3DTexture9_GetSurfaceLevel ( tex1 , 0 , & surf1 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DTexture9_GetSurfaceLevel failed, hr=%08x \n " , hr ) ;
2008-02-26 11:21:55 +00:00
hr = IDirect3DTexture9_GetSurfaceLevel ( tex2 , 0 , & surf2 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DTexture9_GetSurfaceLevel failed, hr=%08x \n " , hr ) ;
2008-02-26 11:21:55 +00:00
hr = IDirect3DDevice9_SetPixelShader ( device , ps ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetPixelShader failed, hr=%08x \n " , hr ) ;
2008-02-26 11:21:55 +00:00
hr = IDirect3DDevice9_SetRenderTarget ( device , 0 , surf1 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetRenderTarget failed, hr=%08x \n " , hr ) ;
2008-02-26 11:21:55 +00:00
hr = IDirect3DDevice9_SetRenderTarget ( device , 1 , surf2 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetRenderTarget failed, hr=%08x \n " , hr ) ;
2008-02-26 11:21:55 +00:00
hr = IDirect3DDevice9_SetFVF ( device , D3DFVF_XYZ ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetFVF failed, hr=%08x \n " , hr ) ;
2008-02-26 11:21:55 +00:00
hr = IDirect3DDevice9_BeginScene ( device ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_BeginScene failed, hr=%08x \n " , hr ) ;
2008-02-26 11:21:55 +00:00
if ( SUCCEEDED ( hr ) ) {
hr = IDirect3DDevice9_DrawPrimitiveUP ( device , D3DPT_TRIANGLESTRIP , 2 , quad , 3 * sizeof ( float ) ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_DrawPrimitiveUP failed, hr=%08x \n " , hr ) ;
2008-02-26 11:21:55 +00:00
hr = IDirect3DDevice9_SetPixelShader ( device , NULL ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetPixelShader failed, hr=%08x \n " , hr ) ;
2008-02-26 11:21:55 +00:00
hr = IDirect3DDevice9_SetRenderTarget ( device , 0 , backbuf ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetRenderTarget failed, hr=%08x \n " , hr ) ;
2008-02-26 11:21:55 +00:00
hr = IDirect3DDevice9_SetRenderTarget ( device , 1 , NULL ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetRenderTarget failed, hr=%08x \n " , hr ) ;
2008-02-26 11:21:55 +00:00
hr = IDirect3DDevice9_SetFVF ( device , D3DFVF_XYZ | D3DFVF_TEX1 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetFVF failed, hr=%08x \n " , hr ) ;
2008-02-26 11:21:55 +00:00
hr = IDirect3DDevice9_SetTexture ( device , 0 , ( IDirect3DBaseTexture9 * ) tex1 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetTexture failed, hr=%08x \n " , hr ) ;
2008-02-26 11:21:55 +00:00
hr = IDirect3DDevice9_DrawPrimitiveUP ( device , D3DPT_TRIANGLESTRIP , 2 , & texquad [ 0 ] , 5 * sizeof ( float ) ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_DrawPrimitiveUP failed, hr=%08x \n " , hr ) ;
2008-02-26 11:21:55 +00:00
hr = IDirect3DDevice9_SetTexture ( device , 0 , ( IDirect3DBaseTexture9 * ) tex2 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetTexture failed, hr=%08x \n " , hr ) ;
2008-02-26 11:21:55 +00:00
hr = IDirect3DDevice9_DrawPrimitiveUP ( device , D3DPT_TRIANGLESTRIP , 2 , & texquad [ 20 ] , 5 * sizeof ( float ) ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_DrawPrimitiveUP failed, hr=%08x \n " , hr ) ;
2008-02-26 11:21:55 +00:00
hr = IDirect3DDevice9_SetTexture ( device , 0 , NULL ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetTexture failed, hr=%08x \n " , hr ) ;
2008-02-26 11:21:55 +00:00
hr = IDirect3DDevice9_EndScene ( device ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_EndScene failed, hr=%08x \n " , hr ) ;
2008-02-26 11:21:55 +00:00
}
IDirect3DDevice9_Present ( device , NULL , NULL , NULL , NULL ) ;
color = getPixelColor ( device , 160 , 240 ) ;
ok ( color = = 0x0000ff00 , " Texture 1(output color 1) has color 0x%08x, expected 0x0000ff00 \n " , color ) ;
color = getPixelColor ( device , 480 , 240 ) ;
ok ( color = = 0x000000ff , " Texture 2(output color 2) has color 0x%08x, expected 0x000000ff \n " , color ) ;
IDirect3DPixelShader9_Release ( ps ) ;
IDirect3DTexture9_Release ( tex1 ) ;
IDirect3DTexture9_Release ( tex2 ) ;
IDirect3DSurface9_Release ( surf1 ) ;
IDirect3DSurface9_Release ( surf2 ) ;
IDirect3DSurface9_Release ( backbuf ) ;
}
2008-03-28 01:01:14 +00:00
struct formats {
const char * fmtName ;
D3DFORMAT textureFormat ;
DWORD resultColorBlending ;
DWORD resultColorNoBlending ;
} ;
const struct formats test_formats [ ] = {
2008-12-03 13:53:43 +00:00
{ " D3DFMT_G16R16 " , D3DFMT_G16R16 , 0x001818ff , 0x002010ff } ,
2008-03-28 01:01:14 +00:00
{ " D3DFMT_R16F " , D3DFMT_R16F , 0x0018ffff , 0x0020ffff } ,
{ " D3DFMT_G16R16F " , D3DFMT_G16R16F , 0x001818ff , 0x002010ff } ,
{ " D3DFMT_A16B16G16R16F " , D3DFMT_A16B16G16R16F , 0x00181800 , 0x00201000 } ,
{ " D3DFMT_R32F " , D3DFMT_R32F , 0x0018ffff , 0x0020ffff } ,
{ " D3DFMT_G32R32F " , D3DFMT_G32R32F , 0x001818ff , 0x002010ff } ,
{ " D3DFMT_A32B32G32R32F " , D3DFMT_A32B32G32R32F , 0x00181800 , 0x00201000 } ,
{ NULL , 0 }
} ;
static void pixelshader_blending_test ( IDirect3DDevice9 * device )
{
HRESULT hr ;
IDirect3DTexture9 * offscreenTexture = NULL ;
IDirect3DSurface9 * backbuffer = NULL , * offscreen = NULL ;
IDirect3D9 * d3d = NULL ;
DWORD color ;
2008-04-23 20:25:05 +00:00
DWORD r0 , g0 , b0 , r1 , g1 , b1 ;
2008-03-28 01:01:14 +00:00
int fmt_index ;
static const float quad [ ] [ 5 ] = {
{ - 0.5f , - 0.5f , 0.1f , 0.0f , 0.0f } ,
{ - 0.5f , 0.5f , 0.1f , 0.0f , 1.0f } ,
{ 0.5f , - 0.5f , 0.1f , 1.0f , 0.0f } ,
{ 0.5f , 0.5f , 0.1f , 1.0f , 1.0f } ,
} ;
/* Quad with R=0x10, G=0x20 */
static const struct vertex quad1 [ ] = {
{ - 1.0f , - 1.0f , 0.1f , 0x80102000 } ,
{ - 1.0f , 1.0f , 0.1f , 0x80102000 } ,
{ 1.0f , - 1.0f , 0.1f , 0x80102000 } ,
{ 1.0f , 1.0f , 0.1f , 0x80102000 } ,
} ;
/* Quad with R=0x20, G=0x10 */
static const struct vertex quad2 [ ] = {
{ - 1.0f , - 1.0f , 0.1f , 0x80201000 } ,
{ - 1.0f , 1.0f , 0.1f , 0x80201000 } ,
{ 1.0f , - 1.0f , 0.1f , 0x80201000 } ,
{ 1.0f , 1.0f , 0.1f , 0x80201000 } ,
} ;
IDirect3DDevice9_GetDirect3D ( device , & d3d ) ;
hr = IDirect3DDevice9_GetBackBuffer ( device , 0 , 0 , D3DBACKBUFFER_TYPE_MONO , & backbuffer ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " Can't get back buffer, hr = %08x \n " , hr ) ;
2008-03-28 01:01:14 +00:00
if ( ! backbuffer ) {
goto out ;
}
for ( fmt_index = 0 ; test_formats [ fmt_index ] . textureFormat ! = 0 ; fmt_index + + )
{
D3DFORMAT fmt = test_formats [ fmt_index ] . textureFormat ;
if ( IDirect3D9_CheckDeviceFormat ( d3d , 0 , D3DDEVTYPE_HAL , D3DFMT_X8R8G8B8 , 0 , D3DRTYPE_TEXTURE , fmt ) ! = D3D_OK ) {
skip ( " %s textures not supported \n " , test_formats [ fmt_index ] . fmtName ) ;
continue ;
}
hr = IDirect3DDevice9_Clear ( device , 0 , NULL , D3DCLEAR_TARGET , 0xffffffff , 0.0 , 0 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " Clear failed, hr = %08x \n " , hr ) ;
2008-03-28 01:01:14 +00:00
hr = IDirect3DDevice9_CreateTexture ( device , 128 , 128 , 1 , D3DUSAGE_RENDERTARGET , fmt , D3DPOOL_DEFAULT , & offscreenTexture , NULL ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK | | hr = = D3DERR_INVALIDCALL , " Creating the offscreen render target failed, hr = %08x \n " , hr ) ;
2008-03-28 01:01:14 +00:00
if ( ! offscreenTexture ) {
continue ;
}
hr = IDirect3DTexture9_GetSurfaceLevel ( offscreenTexture , 0 , & offscreen ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " Can't get offscreen surface, hr = %08x \n " , hr ) ;
2008-03-28 01:01:14 +00:00
if ( ! offscreen ) {
continue ;
}
hr = IDirect3DDevice9_SetFVF ( device , D3DFVF_XYZ | D3DFVF_DIFFUSE ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " SetFVF failed, hr = %08x \n " , hr ) ;
2008-03-28 01:01:14 +00:00
hr = IDirect3DDevice9_SetTextureStageState ( device , 0 , D3DTSS_COLOROP , D3DTOP_SELECTARG1 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " SetTextureStageState failed, hr = %08x \n " , hr ) ;
2008-03-28 01:01:14 +00:00
hr = IDirect3DDevice9_SetTextureStageState ( device , 0 , D3DTSS_COLORARG1 , D3DTA_TEXTURE ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " SetTextureStageState failed, hr = %08x \n " , hr ) ;
2008-03-28 01:01:14 +00:00
hr = IDirect3DDevice9_SetSamplerState ( device , 0 , D3DSAMP_MINFILTER , D3DTEXF_POINT ) ;
ok ( SUCCEEDED ( hr ) , " SetSamplerState D3DSAMP_MINFILTER failed (0x%08x) \n " , hr ) ;
hr = IDirect3DDevice9_SetSamplerState ( device , 0 , D3DSAMP_MAGFILTER , D3DTEXF_POINT ) ;
ok ( SUCCEEDED ( hr ) , " SetSamplerState D3DSAMP_MAGFILTER failed (0x%08x) \n " , hr ) ;
hr = IDirect3DDevice9_SetRenderState ( device , D3DRS_LIGHTING , FALSE ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetRenderState returned %08x \n " , hr ) ;
2008-03-28 01:01:14 +00:00
/* Below we will draw two quads with different colors and try to blend them together.
* The result color is compared with the expected outcome .
*/
if ( IDirect3DDevice9_BeginScene ( device ) = = D3D_OK ) {
hr = IDirect3DDevice9_SetRenderTarget ( device , 0 , offscreen ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " SetRenderTarget failed, hr = %08x \n " , hr ) ;
2008-03-28 01:01:14 +00:00
hr = IDirect3DDevice9_Clear ( device , 0 , NULL , D3DCLEAR_TARGET , 0x00ffffff , 0.0 , 0 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " Clear failed, hr = %08x \n " , hr ) ;
2008-03-28 01:01:14 +00:00
hr = IDirect3DDevice9_SetRenderState ( device , D3DRS_ALPHABLENDENABLE , TRUE ) ;
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetRenderState failed, hr = %08x \n " , hr ) ;
/* Draw a quad using color 0x0010200 */
hr = IDirect3DDevice9_SetRenderState ( device , D3DRS_SRCBLEND , D3DBLEND_ONE ) ;
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetRenderState failed, hr = %08x \n " , hr ) ;
hr = IDirect3DDevice9_SetRenderState ( device , D3DRS_DESTBLEND , D3DBLEND_ZERO ) ;
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetRenderState failed, hr = %08x \n " , hr ) ;
hr = IDirect3DDevice9_DrawPrimitiveUP ( device , D3DPT_TRIANGLESTRIP , 2 , quad1 , sizeof ( quad1 [ 0 ] ) ) ;
ok ( hr = = D3D_OK , " DrawPrimitiveUP failed, hr = %#08x \n " , hr ) ;
/* Draw a quad using color 0x0020100 */
hr = IDirect3DDevice9_SetRenderState ( device , D3DRS_SRCBLEND , D3DBLEND_SRCALPHA ) ;
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetRenderState failed, hr = %08x \n " , hr ) ;
hr = IDirect3DDevice9_SetRenderState ( device , D3DRS_DESTBLEND , D3DBLEND_INVSRCALPHA ) ;
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetRenderState failed, hr = %08x \n " , hr ) ;
hr = IDirect3DDevice9_DrawPrimitiveUP ( device , D3DPT_TRIANGLESTRIP , 2 , quad2 , sizeof ( quad2 [ 0 ] ) ) ;
ok ( hr = = D3D_OK , " DrawPrimitiveUP failed, hr = %#08x \n " , hr ) ;
/* We don't want to blend the result on the backbuffer */
hr = IDirect3DDevice9_SetRenderState ( device , D3DRS_ALPHABLENDENABLE , FALSE ) ;
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetRenderState failed, hr = %08x \n " , hr ) ;
/* Prepare rendering the 'blended' texture quad to the backbuffer */
hr = IDirect3DDevice9_SetRenderTarget ( device , 0 , backbuffer ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " SetRenderTarget failed, hr = %08x \n " , hr ) ;
2008-03-28 01:01:14 +00:00
hr = IDirect3DDevice9_SetTexture ( device , 0 , ( IDirect3DBaseTexture9 * ) offscreenTexture ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " SetTexture failed, %08x \n " , hr ) ;
2008-03-28 01:01:14 +00:00
hr = IDirect3DDevice9_SetFVF ( device , D3DFVF_XYZ | D3DFVF_TEX1 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " SetFVF failed, hr = %08x \n " , hr ) ;
2008-03-28 01:01:14 +00:00
/* This time with the texture */
hr = IDirect3DDevice9_DrawPrimitiveUP ( device , D3DPT_TRIANGLESTRIP , 2 , quad , sizeof ( quad [ 0 ] ) ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " DrawPrimitiveUP failed, hr = %08x \n " , hr ) ;
2008-03-28 01:01:14 +00:00
IDirect3DDevice9_EndScene ( device ) ;
}
IDirect3DDevice9_Present ( device , NULL , NULL , NULL , NULL ) ;
if ( IDirect3D9_CheckDeviceFormat ( d3d , 0 , D3DDEVTYPE_HAL , D3DFMT_X8R8G8B8 , D3DUSAGE_QUERY_POSTPIXELSHADER_BLENDING , D3DRTYPE_TEXTURE , fmt ) = = D3D_OK ) {
/* Compare the color of the center quad with our expectation */
color = getPixelColor ( device , 320 , 240 ) ;
2008-04-23 20:25:05 +00:00
r0 = ( color & 0x00ff0000 ) > > 16 ;
g0 = ( color & 0x0000ff00 ) > > 8 ;
b0 = ( color & 0x000000ff ) > > 0 ;
r1 = ( test_formats [ fmt_index ] . resultColorBlending & 0x00ff0000 ) > > 16 ;
g1 = ( test_formats [ fmt_index ] . resultColorBlending & 0x0000ff00 ) > > 8 ;
b1 = ( test_formats [ fmt_index ] . resultColorBlending & 0x000000ff ) > > 0 ;
ok ( r0 > = max ( r1 , 1 ) - 1 & & r0 < = r1 + 1 & &
g0 > = max ( g1 , 1 ) - 1 & & g0 < = g1 + 1 & &
b0 > = max ( b1 , 1 ) - 1 & & b0 < = b1 + 1 ,
" Offscreen failed for %s: Got color %#08x, expected %#08x. \n " , test_formats [ fmt_index ] . fmtName , color , test_formats [ fmt_index ] . resultColorBlending ) ;
2008-03-28 01:01:14 +00:00
} else {
2009-03-02 08:11:59 +00:00
/* No pixel shader blending is supported so expect garbage. The type of 'garbage' depends on the driver version and OS.
2008-03-28 01:01:14 +00:00
* E . g . on G16R16 ati reports ( on old r9600 drivers ) 0x00ffffff and on modern ones 0x002010ff which is also what Nvidia
* reports . On Vista Nvidia seems to report 0x00ffffff on Geforce7 cards . */
color = getPixelColor ( device , 320 , 240 ) ;
2008-03-29 14:48:15 +00:00
ok ( ( color = = 0x00ffffff ) | | ( color = = test_formats [ fmt_index ] . resultColorNoBlending ) , " Offscreen failed for %s: expected no color blending but received it anyway. \n " , test_formats [ fmt_index ] . fmtName ) ;
2008-03-28 01:01:14 +00:00
}
IDirect3DDevice9_SetTexture ( device , 0 , NULL ) ;
if ( offscreenTexture ) {
IDirect3DTexture9_Release ( offscreenTexture ) ;
}
if ( offscreen ) {
IDirect3DSurface9_Release ( offscreen ) ;
}
}
out :
/* restore things */
if ( backbuffer ) {
IDirect3DDevice9_SetRenderTarget ( device , 0 , backbuffer ) ;
IDirect3DSurface9_Release ( backbuffer ) ;
}
}
2008-04-01 14:00:20 +00:00
static void tssargtemp_test ( IDirect3DDevice9 * device )
{
HRESULT hr ;
DWORD color ;
static const struct vertex quad [ ] = {
{ - 1.0 , - 1.0 , 0.1 , 0x00ff0000 } ,
{ 1.0 , - 1.0 , 0.1 , 0x00ff0000 } ,
{ - 1.0 , 1.0 , 0.1 , 0x00ff0000 } ,
{ 1.0 , 1.0 , 0.1 , 0x00ff0000 }
} ;
D3DCAPS9 caps ;
memset ( & caps , 0 , sizeof ( caps ) ) ;
hr = IDirect3DDevice9_GetDeviceCaps ( device , & caps ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_GetDeviceCaps failed with %08x \n " , hr ) ;
2008-04-01 14:00:20 +00:00
if ( ! ( caps . PrimitiveMiscCaps & D3DPMISCCAPS_TSSARGTEMP ) ) {
skip ( " D3DPMISCCAPS_TSSARGTEMP not supported \n " ) ;
return ;
}
hr = IDirect3DDevice9_Clear ( device , 0 , NULL , D3DCLEAR_TARGET , 0xff000000 , 0.0 , 0 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_Clear failed with %08x \n " , hr ) ;
2008-04-01 14:00:20 +00:00
hr = IDirect3DDevice9_SetTextureStageState ( device , 0 , D3DTSS_COLOROP , D3DTOP_SELECTARG1 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " SetTextureStageState failed, hr = %08x \n " , hr ) ;
2008-04-01 14:00:20 +00:00
hr = IDirect3DDevice9_SetTextureStageState ( device , 0 , D3DTSS_COLORARG1 , D3DTA_DIFFUSE ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " SetTextureStageState failed, hr = %08x \n " , hr ) ;
2008-04-01 14:00:20 +00:00
hr = IDirect3DDevice9_SetTextureStageState ( device , 1 , D3DTSS_COLOROP , D3DTOP_SELECTARG1 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " SetTextureStageState failed, hr = %08x \n " , hr ) ;
2008-04-01 14:00:20 +00:00
hr = IDirect3DDevice9_SetTextureStageState ( device , 1 , D3DTSS_COLORARG1 , D3DTA_TFACTOR ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " SetTextureStageState failed, hr = %08x \n " , hr ) ;
2008-04-01 14:00:20 +00:00
hr = IDirect3DDevice9_SetTextureStageState ( device , 1 , D3DTSS_RESULTARG , D3DTA_TEMP ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " SetTextureStageState failed, hr = %08x \n " , hr ) ;
2008-04-01 14:00:20 +00:00
hr = IDirect3DDevice9_SetTextureStageState ( device , 2 , D3DTSS_COLOROP , D3DTOP_ADD ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " SetTextureStageState failed, hr = %08x \n " , hr ) ;
2008-04-01 14:00:20 +00:00
hr = IDirect3DDevice9_SetTextureStageState ( device , 2 , D3DTSS_COLORARG1 , D3DTA_CURRENT ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " SetTextureStageState failed, hr = %08x \n " , hr ) ;
2008-04-01 14:00:20 +00:00
hr = IDirect3DDevice9_SetTextureStageState ( device , 2 , D3DTSS_COLORARG2 , D3DTA_TEMP ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " SetTextureStageState failed, hr = %08x \n " , hr ) ;
2008-04-01 14:00:20 +00:00
hr = IDirect3DDevice9_SetTextureStageState ( device , 3 , D3DTSS_COLOROP , D3DTOP_DISABLE ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " SetTextureStageState failed, hr = %08x \n " , hr ) ;
2008-04-01 14:00:20 +00:00
hr = IDirect3DDevice9_SetRenderState ( device , D3DRS_TEXTUREFACTOR , 0x0000ff00 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetRenderState failed, hr = %08x \n " , hr ) ;
2008-04-01 14:00:20 +00:00
hr = IDirect3DDevice9_SetFVF ( device , D3DFVF_XYZ | D3DFVF_DIFFUSE ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetFVF failed, hr = %08x \n " , hr ) ;
2008-04-01 14:00:20 +00:00
hr = IDirect3DDevice9_BeginScene ( device ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_BeginScene failed, hr = %08x \n " , hr ) ;
2008-04-01 14:00:20 +00:00
if ( SUCCEEDED ( hr ) ) {
hr = IDirect3DDevice9_EndScene ( device ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_EndScene failed, hr = %08x \n " , hr ) ;
2008-04-01 14:00:20 +00:00
hr = IDirect3DDevice9_DrawPrimitiveUP ( device , D3DPT_TRIANGLESTRIP , 2 , quad , sizeof ( quad [ 0 ] ) ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_DrawPrimitiveUP failed with %08x \n " , hr ) ;
2008-04-01 14:00:20 +00:00
}
IDirect3DDevice9_Present ( device , NULL , NULL , NULL , NULL ) ;
color = getPixelColor ( device , 320 , 240 ) ;
ok ( color = = 0x00FFFF00 , " TSSARGTEMP test returned color 0x%08x, expected 0x00FFFF00 \n " , color ) ;
/* Set stage 1 back to default */
hr = IDirect3DDevice9_SetTextureStageState ( device , 1 , D3DTSS_RESULTARG , D3DTA_CURRENT ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " SetTextureStageState failed, hr = %08x \n " , hr ) ;
2008-04-01 14:00:20 +00:00
hr = IDirect3DDevice9_SetTextureStageState ( device , 0 , D3DTSS_COLOROP , D3DTOP_DISABLE ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " SetTextureStageState failed, hr = %08x \n " , hr ) ;
2008-04-01 14:00:20 +00:00
hr = IDirect3DDevice9_SetTextureStageState ( device , 1 , D3DTSS_COLOROP , D3DTOP_DISABLE ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " SetTextureStageState failed, hr = %08x \n " , hr ) ;
2008-04-01 14:00:20 +00:00
hr = IDirect3DDevice9_SetTextureStageState ( device , 2 , D3DTSS_COLOROP , D3DTOP_DISABLE ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " SetTextureStageState failed, hr = %08x \n " , hr ) ;
2008-04-01 14:00:20 +00:00
hr = IDirect3DDevice9_SetTextureStageState ( device , 3 , D3DTSS_COLOROP , D3DTOP_DISABLE ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " SetTextureStageState failed, hr = %08x \n " , hr ) ;
2008-04-01 14:00:20 +00:00
}
2008-04-06 14:43:32 +00:00
struct testdata
{
DWORD idxVertex ; /* number of instances in the first stream */
DWORD idxColor ; /* number of instances in the second stream */
DWORD idxInstance ; /* should be 1 ?? */
DWORD color1 ; /* color 1 instance */
DWORD color2 ; /* color 2 instance */
DWORD color3 ; /* color 3 instance */
DWORD color4 ; /* color 4 instance */
WORD strVertex ; /* specify which stream to use 0-2*/
WORD strColor ;
WORD strInstance ;
} ;
static const struct testdata testcases [ ] =
{
{ 4 , 4 , 1 , 0x00ff0000 , 0x00ff0000 , 0x00ff0000 , 0x00ff0000 , 0 , 1 , 2 } , /* 0 */
{ 3 , 4 , 1 , 0x00ff0000 , 0x00ff0000 , 0x00ff0000 , 0x00ffffff , 0 , 1 , 2 } , /* 1 */
{ 2 , 4 , 1 , 0x00ff0000 , 0x00ff0000 , 0x00ffffff , 0x00ffffff , 0 , 1 , 2 } , /* 2 */
{ 1 , 4 , 1 , 0x00ff0000 , 0x00ffffff , 0x00ffffff , 0x00ffffff , 0 , 1 , 2 } , /* 3 */
{ 0 , 4 , 1 , 0x00ff0000 , 0x00ffffff , 0x00ffffff , 0x00ffffff , 0 , 1 , 2 } , /* 4 */
{ 4 , 3 , 1 , 0x00ff0000 , 0x00ff0000 , 0x00ff0000 , 0x00ff0000 , 0 , 1 , 2 } , /* 5 */
{ 4 , 2 , 1 , 0x00ff0000 , 0x00ff0000 , 0x00ff0000 , 0x00ff0000 , 0 , 1 , 2 } , /* 6 */
{ 4 , 1 , 1 , 0x00ff0000 , 0x00ff0000 , 0x00ff0000 , 0x00ff0000 , 0 , 1 , 2 } , /* 7 */
{ 4 , 0 , 1 , 0x00ff0000 , 0x00ff0000 , 0x00ff0000 , 0x00ff0000 , 0 , 1 , 2 } , /* 8 */
{ 3 , 3 , 1 , 0x00ff0000 , 0x00ff0000 , 0x00ff0000 , 0x00ffffff , 0 , 1 , 2 } , /* 9 */
{ 4 , 4 , 1 , 0x00ff0000 , 0x00ff0000 , 0x00ff0000 , 0x00ff0000 , 1 , 0 , 2 } , /* 10 */
{ 4 , 4 , 1 , 0x00ff0000 , 0x00ff0000 , 0x00ff0000 , 0x00ff0000 , 0 , 2 , 1 } , /* 11 */
{ 4 , 4 , 1 , 0x00ff0000 , 0x00ffffff , 0x00ffffff , 0x00ffffff , 2 , 3 , 1 } , /* 12 */
{ 4 , 4 , 1 , 0x00ff0000 , 0x00ff0000 , 0x00ff0000 , 0x00ff0000 , 2 , 0 , 1 } , /* 13 */
{ 4 , 4 , 1 , 0x00ff0000 , 0x00ff0000 , 0x00ff0000 , 0x00ff0000 , 1 , 2 , 3 } , /* 14 */
/*
This case is handled in a stand alone test , SetStreamSourceFreq ( 0 , ( D3DSTREAMSOURCE_INSTANCEDATA | 1 ) ) has to return D3DERR_INVALIDCALL !
{ 4 , 4 , 1 , 0x00ffffff , 0x00ffffff , 0x00ffffff , 0x00ffffff , 2 , 1 , 0 , D3DERR_INVALIDCALL } ,
*/
} ;
/* Drawing Indexed Geometry with instances*/
static void stream_test ( IDirect3DDevice9 * device )
{
IDirect3DVertexBuffer9 * vb = NULL ;
IDirect3DVertexBuffer9 * vb2 = NULL ;
IDirect3DVertexBuffer9 * vb3 = NULL ;
IDirect3DIndexBuffer9 * ib = NULL ;
IDirect3DVertexDeclaration9 * pDecl = NULL ;
IDirect3DVertexShader9 * shader = NULL ;
HRESULT hr ;
BYTE * data ;
DWORD color ;
DWORD ind ;
2008-07-18 15:17:26 +00:00
unsigned i ;
2008-04-06 14:43:32 +00:00
const DWORD shader_code [ ] =
{
0xfffe0101 , /* vs_1_1 */
0x0000001f , 0x80000000 , 0x900f0000 , /* dcl_position v0 */
0x0000001f , 0x8000000a , 0x900f0001 , /* dcl_color0 v1 */
0x0000001f , 0x80000005 , 0x900f0002 , /* dcl_texcoord v2 */
0x00000001 , 0x800f0000 , 0x90e40000 , /* mov r0, v0 */
0x00000002 , 0xc00f0000 , 0x80e40000 , 0x90e40002 , /* add oPos, r0, v2 */
0x00000001 , 0xd00f0000 , 0x90e40001 , /* mov oD0, v1 */
0x0000ffff
} ;
const float quad [ ] [ 3 ] =
{
{ - 0.5f , - 0.5f , 1.1f } , /*0 */
{ - 0.5f , 0.5f , 1.1f } , /*1 */
{ 0.5f , - 0.5f , 1.1f } , /*2 */
{ 0.5f , 0.5f , 1.1f } , /*3 */
} ;
const float vertcolor [ ] [ 4 ] =
{
{ 1.0f , 0.0f , 0.0f , 1.0f } , /*0 */
{ 1.0f , 0.0f , 0.0f , 1.0f } , /*1 */
{ 1.0f , 0.0f , 0.0f , 1.0f } , /*2 */
{ 1.0f , 0.0f , 0.0f , 1.0f } , /*3 */
} ;
/* 4 position for 4 instances */
const float instancepos [ ] [ 3 ] =
{
{ - 0.6f , - 0.6f , 0.0f } ,
{ 0.6f , - 0.6f , 0.0f } ,
{ 0.6f , 0.6f , 0.0f } ,
{ - 0.6f , 0.6f , 0.0f } ,
} ;
short indices [ ] = { 0 , 1 , 2 , 1 , 2 , 3 } ;
D3DVERTEXELEMENT9 decl [ ] =
{
{ 0 , 0 , D3DDECLTYPE_FLOAT3 , D3DDECLMETHOD_DEFAULT , D3DDECLUSAGE_POSITION , 0 } ,
{ 1 , 0 , D3DDECLTYPE_FLOAT4 , D3DDECLMETHOD_DEFAULT , D3DDECLUSAGE_COLOR , 0 } ,
{ 2 , 0 , D3DDECLTYPE_FLOAT3 , D3DDECLMETHOD_DEFAULT , D3DDECLUSAGE_TEXCOORD , 0 } ,
D3DDECL_END ( )
} ;
/* set the default value because it isn't done in wine? */
hr = IDirect3DDevice9_SetStreamSourceFreq ( device , 1 , 1 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetStreamSourceFreq failed with %08x \n " , hr ) ;
2008-04-06 14:43:32 +00:00
/* check for D3DSTREAMSOURCE_INDEXEDDATA at stream0 */
hr = IDirect3DDevice9_SetStreamSourceFreq ( device , 0 , ( D3DSTREAMSOURCE_INSTANCEDATA | 1 ) ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3DERR_INVALIDCALL , " IDirect3DDevice9_SetStreamSourceFreq failed with %08x \n " , hr ) ;
2008-04-06 14:43:32 +00:00
/* check wrong cases */
hr = IDirect3DDevice9_SetStreamSourceFreq ( device , 1 , 0 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3DERR_INVALIDCALL , " IDirect3DDevice9_SetStreamSourceFreq failed with %08x \n " , hr ) ;
2008-04-06 14:43:32 +00:00
hr = IDirect3DDevice9_GetStreamSourceFreq ( device , 1 , & ind ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK & & ind = = 1 , " IDirect3DDevice9_GetStreamSourceFreq failed with %08x \n " , hr ) ;
2008-04-06 14:43:32 +00:00
hr = IDirect3DDevice9_SetStreamSourceFreq ( device , 1 , 2 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetStreamSourceFreq failed with %08x \n " , hr ) ;
2008-04-06 14:43:32 +00:00
hr = IDirect3DDevice9_GetStreamSourceFreq ( device , 1 , & ind ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK & & ind = = 2 , " IDirect3DDevice9_GetStreamSourceFreq failed with %08x \n " , hr ) ;
2008-04-06 14:43:32 +00:00
hr = IDirect3DDevice9_SetStreamSourceFreq ( device , 1 , ( D3DSTREAMSOURCE_INDEXEDDATA | 0 ) ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetStreamSourceFreq failed with %08x \n " , hr ) ;
2008-04-06 14:43:32 +00:00
hr = IDirect3DDevice9_GetStreamSourceFreq ( device , 1 , & ind ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK & & ind = = ( D3DSTREAMSOURCE_INDEXEDDATA | 0 ) , " IDirect3DDevice9_GetStreamSourceFreq failed with %08x \n " , hr ) ;
2008-04-06 14:43:32 +00:00
hr = IDirect3DDevice9_SetStreamSourceFreq ( device , 1 , ( D3DSTREAMSOURCE_INSTANCEDATA | 0 ) ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetStreamSourceFreq failed with %08x \n " , hr ) ;
2008-04-06 14:43:32 +00:00
hr = IDirect3DDevice9_GetStreamSourceFreq ( device , 1 , & ind ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK & & ind = = ( 0 | D3DSTREAMSOURCE_INSTANCEDATA ) , " IDirect3DDevice9_GetStreamSourceFreq failed with %08x \n " , hr ) ;
2008-04-06 14:43:32 +00:00
hr = IDirect3DDevice9_SetStreamSourceFreq ( device , 1 , ( D3DSTREAMSOURCE_INSTANCEDATA | D3DSTREAMSOURCE_INDEXEDDATA | 0 ) ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3DERR_INVALIDCALL , " IDirect3DDevice9_SetStreamSourceFreq failed with %08x \n " , hr ) ;
2008-04-06 14:43:32 +00:00
hr = IDirect3DDevice9_GetStreamSourceFreq ( device , 1 , & ind ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK & & ind = = ( 0 | D3DSTREAMSOURCE_INSTANCEDATA ) , " IDirect3DDevice9_GetStreamSourceFreq failed with %08x \n " , hr ) ;
2008-04-06 14:43:32 +00:00
/* set the default value back */
hr = IDirect3DDevice9_SetStreamSourceFreq ( device , 1 , 1 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetStreamSourceFreq failed with %08x \n " , hr ) ;
2008-04-06 14:43:32 +00:00
/* create all VertexBuffers*/
hr = IDirect3DDevice9_CreateVertexBuffer ( device , sizeof ( quad ) , 0 , 0 , D3DPOOL_MANAGED , & vb , NULL ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " CreateVertexBuffer failed with %08x \n " , hr ) ;
2008-04-06 14:43:32 +00:00
if ( ! vb ) {
skip ( " Failed to create a vertex buffer \n " ) ;
return ;
}
hr = IDirect3DDevice9_CreateVertexBuffer ( device , sizeof ( vertcolor ) , 0 , 0 , D3DPOOL_MANAGED , & vb2 , NULL ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " CreateVertexBuffer failed with %08x \n " , hr ) ;
2008-04-06 14:43:32 +00:00
if ( ! vb2 ) {
skip ( " Failed to create a vertex buffer \n " ) ;
goto out ;
}
hr = IDirect3DDevice9_CreateVertexBuffer ( device , sizeof ( instancepos ) , 0 , 0 , D3DPOOL_MANAGED , & vb3 , NULL ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " CreateVertexBuffer failed with %08x \n " , hr ) ;
2008-04-06 14:43:32 +00:00
if ( ! vb3 ) {
skip ( " Failed to create a vertex buffer \n " ) ;
goto out ;
}
/* create IndexBuffer*/
hr = IDirect3DDevice9_CreateIndexBuffer ( device , sizeof ( indices ) , 0 , D3DFMT_INDEX16 , D3DPOOL_DEFAULT , & ib , NULL ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_CreateIndexBuffer failed with %08x \n " , hr ) ;
2008-04-06 14:43:32 +00:00
if ( ! ib ) {
skip ( " Failed to create a index buffer \n " ) ;
goto out ;
}
/* copy all Buffers (Vertex + Index)*/
hr = IDirect3DVertexBuffer9_Lock ( vb , 0 , sizeof ( quad ) , ( void * * ) & data , 0 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DVertexBuffer9_Lock failed with %08x \n " , hr ) ;
2008-04-06 14:43:32 +00:00
memcpy ( data , quad , sizeof ( quad ) ) ;
hr = IDirect3DVertexBuffer9_Unlock ( vb ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DVertexBuffer9_Unlock failed with %08x \n " , hr ) ;
2008-04-06 14:43:32 +00:00
hr = IDirect3DVertexBuffer9_Lock ( vb2 , 0 , sizeof ( vertcolor ) , ( void * * ) & data , 0 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DVertexBuffer9_Lock failed with %08x \n " , hr ) ;
2008-04-06 14:43:32 +00:00
memcpy ( data , vertcolor , sizeof ( vertcolor ) ) ;
hr = IDirect3DVertexBuffer9_Unlock ( vb2 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DVertexBuffer9_Unlock failed with %08x \n " , hr ) ;
2008-04-06 14:43:32 +00:00
hr = IDirect3DVertexBuffer9_Lock ( vb3 , 0 , sizeof ( instancepos ) , ( void * * ) & data , 0 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DVertexBuffer9_Lock failed with %08x \n " , hr ) ;
2008-04-06 14:43:32 +00:00
memcpy ( data , instancepos , sizeof ( instancepos ) ) ;
hr = IDirect3DVertexBuffer9_Unlock ( vb3 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DVertexBuffer9_Unlock failed with %08x \n " , hr ) ;
2008-04-06 14:43:32 +00:00
hr = IDirect3DIndexBuffer9_Lock ( ib , 0 , sizeof ( indices ) , ( void * * ) & data , 0 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DIndexBuffer9_Lock failed with %08x \n " , hr ) ;
2008-04-06 14:43:32 +00:00
memcpy ( data , indices , sizeof ( indices ) ) ;
hr = IDirect3DIndexBuffer9_Unlock ( ib ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DIndexBuffer9_Unlock failed with %08x \n " , hr ) ;
2008-04-06 14:43:32 +00:00
/* create VertexShader */
hr = IDirect3DDevice9_CreateVertexShader ( device , shader_code , & shader ) ;
2008-07-08 15:48:50 +00:00
ok ( SUCCEEDED ( hr ) , " IDirect3DDevice9_CreateVertexShader failed hr=%08x \n " , hr ) ;
2008-04-06 14:43:32 +00:00
if ( ! shader ) {
skip ( " Failed to create a vetex shader \n " ) ;
goto out ;
}
hr = IDirect3DDevice9_SetVertexShader ( device , shader ) ;
2008-07-08 15:48:50 +00:00
ok ( SUCCEEDED ( hr ) , " IDirect3DDevice9_SetVertexShader failed hr=%08x \n " , hr ) ;
2008-04-06 14:43:32 +00:00
hr = IDirect3DDevice9_SetIndices ( device , ib ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DIndexBuffer9_Unlock failed with %08x \n " , hr ) ;
2008-04-06 14:43:32 +00:00
/* run all tests */
for ( i = 0 ; i < sizeof ( testcases ) / sizeof ( testcases [ 0 ] ) ; + + i )
{
struct testdata act = testcases [ i ] ;
decl [ 0 ] . Stream = act . strVertex ;
decl [ 1 ] . Stream = act . strColor ;
decl [ 2 ] . Stream = act . strInstance ;
/* create VertexDeclarations */
hr = IDirect3DDevice9_CreateVertexDeclaration ( device , decl , & pDecl ) ;
2008-07-08 15:48:50 +00:00
ok ( SUCCEEDED ( hr ) , " IDirect3DDevice9_CreateVertexDeclaration failed hr=%08x (case %i) \n " , hr , i ) ;
2008-04-06 14:43:32 +00:00
hr = IDirect3DDevice9_Clear ( device , 0 , NULL , D3DCLEAR_TARGET , 0xffffffff , 0.0 , 0 ) ;
ok ( hr = = D3D_OK , " IDirect3DDevice9_Clear failed with %08x (case %i) \n " , hr , i ) ;
hr = IDirect3DDevice9_BeginScene ( device ) ;
ok ( hr = = D3D_OK , " IDirect3DDevice9_BeginScene failed with %08x (case %i) \n " , hr , i ) ;
if ( SUCCEEDED ( hr ) )
{
hr = IDirect3DDevice9_SetVertexDeclaration ( device , pDecl ) ;
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetVertexDeclaration failed with %08x (case %i) \n " , hr , i ) ;
hr = IDirect3DDevice9_SetStreamSourceFreq ( device , act . strVertex , ( D3DSTREAMSOURCE_INDEXEDDATA | act . idxVertex ) ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetStreamSourceFreq failed with %08x (case %i) \n " , hr , i ) ;
2008-04-06 14:43:32 +00:00
hr = IDirect3DDevice9_SetStreamSource ( device , act . strVertex , vb , 0 , sizeof ( quad [ 0 ] ) ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DIndexBuffer9_Unlock failed with %08x (case %i) \n " , hr , i ) ;
2008-04-06 14:43:32 +00:00
hr = IDirect3DDevice9_SetStreamSourceFreq ( device , act . strColor , ( D3DSTREAMSOURCE_INDEXEDDATA | act . idxColor ) ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetStreamSourceFreq failed with %08x (case %i) \n " , hr , i ) ;
2008-04-06 14:43:32 +00:00
hr = IDirect3DDevice9_SetStreamSource ( device , act . strColor , vb2 , 0 , sizeof ( vertcolor [ 0 ] ) ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DIndexBuffer9_Unlock failed with %08x (case %i) \n " , hr , i ) ;
2008-04-06 14:43:32 +00:00
hr = IDirect3DDevice9_SetStreamSourceFreq ( device , act . strInstance , ( D3DSTREAMSOURCE_INSTANCEDATA | act . idxInstance ) ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetStreamSourceFreq failed with %08x (case %i) \n " , hr , i ) ;
2008-04-06 14:43:32 +00:00
hr = IDirect3DDevice9_SetStreamSource ( device , act . strInstance , vb3 , 0 , sizeof ( instancepos [ 0 ] ) ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DIndexBuffer9_Unlock failed with %08x (case %i) \n " , hr , i ) ;
2008-04-06 14:43:32 +00:00
/* don't know if this is right (1*3 and 4*1)*/
hr = IDirect3DDevice9_DrawIndexedPrimitive ( device , D3DPT_TRIANGLELIST , 0 , 0 , 1 * 3 , 0 , 4 * 1 ) ;
ok ( hr = = D3D_OK , " IDirect3DDevice9_DrawIndexedPrimitive failed with %08x (case %i) \n " , hr , i ) ;
hr = IDirect3DDevice9_EndScene ( device ) ;
ok ( hr = = D3D_OK , " IDirect3DDevice9_EndScene failed with %08x (case %i) \n " , hr , i ) ;
/* set all StreamSource && StreamSourceFreq back to default */
hr = IDirect3DDevice9_SetStreamSourceFreq ( device , act . strVertex , 1 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetStreamSourceFreq failed with %08x (case %i) \n " , hr , i ) ;
2008-04-06 14:43:32 +00:00
hr = IDirect3DDevice9_SetStreamSource ( device , act . strVertex , NULL , 0 , 0 ) ;
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetStreamSource failed with %08x (case %i) \n " , hr , i ) ;
hr = IDirect3DDevice9_SetStreamSourceFreq ( device , act . idxColor , 1 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetStreamSourceFreq failed with %08x (case %i) \n " , hr , i ) ;
2008-04-06 14:43:32 +00:00
hr = IDirect3DDevice9_SetStreamSource ( device , act . idxColor , NULL , 0 , 0 ) ;
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetStreamSource failed with %08x (case %i) \n " , hr , i ) ;
hr = IDirect3DDevice9_SetStreamSourceFreq ( device , act . idxInstance , 1 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetStreamSourceFreq failed with %08x (case %i) \n " , hr , i ) ;
2008-04-06 14:43:32 +00:00
hr = IDirect3DDevice9_SetStreamSource ( device , act . idxInstance , NULL , 0 , 0 ) ;
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetStreamSource failed with %08x (case %i) \n " , hr , i ) ;
}
hr = IDirect3DDevice9_Present ( device , NULL , NULL , NULL , NULL ) ;
ok ( hr = = D3D_OK , " IDirect3DDevice9_Present failed with %08x (case %i) \n " , hr , i ) ;
hr = IDirect3DVertexDeclaration9_Release ( pDecl ) ;
ok ( hr = = D3D_OK , " IDirect3DVertexDeclaration9_Release failed with %08x (case %i) \n " , hr , i ) ;
color = getPixelColor ( device , 160 , 360 ) ;
ok ( color = = act . color1 , " has color 0x%08x, expected 0x%08x (case %i) \n " , color , act . color1 , i ) ;
color = getPixelColor ( device , 480 , 360 ) ;
ok ( color = = act . color2 , " has color 0x%08x, expected 0x%08x (case %i) \n " , color , act . color2 , i ) ;
color = getPixelColor ( device , 480 , 120 ) ;
ok ( color = = act . color3 , " has color 0x%08x, expected 0x%08x (case %i) \n " , color , act . color3 , i ) ;
color = getPixelColor ( device , 160 , 120 ) ;
ok ( color = = act . color4 , " has color 0x%08x, expected 0x%08x (case %i) \n " , color , act . color4 , i ) ;
}
hr = IDirect3DDevice9_SetIndices ( device , NULL ) ;
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetIndices failed with %08x \n " , hr ) ;
out :
if ( vb ) IDirect3DVertexBuffer9_Release ( vb ) ;
if ( vb2 ) IDirect3DVertexBuffer9_Release ( vb2 ) ;
if ( vb3 ) IDirect3DVertexBuffer9_Release ( vb3 ) ;
if ( ib ) IDirect3DIndexBuffer9_Release ( ib ) ;
if ( shader ) IDirect3DVertexShader9_Release ( shader ) ;
}
2008-04-23 14:19:19 +00:00
static void np2_stretch_rect_test ( IDirect3DDevice9 * device ) {
IDirect3DSurface9 * src = NULL , * dst = NULL , * backbuffer = NULL ;
IDirect3DTexture9 * dsttex = NULL ;
HRESULT hr ;
DWORD color ;
D3DRECT r1 = { 0 , 0 , 50 , 50 } ;
D3DRECT r2 = { 50 , 0 , 100 , 50 } ;
D3DRECT r3 = { 50 , 50 , 100 , 100 } ;
D3DRECT r4 = { 0 , 50 , 50 , 100 } ;
const float quad [ ] = {
- 1.0 , - 1.0 , 0.1 , 0.0 , 0.0 ,
1.0 , - 1.0 , 0.1 , 1.0 , 0.0 ,
- 1.0 , 1.0 , 0.1 , 0.0 , 1.0 ,
1.0 , 1.0 , 0.1 , 1.0 , 1.0 ,
} ;
hr = IDirect3DDevice9_GetBackBuffer ( device , 0 , 0 , D3DBACKBUFFER_TYPE_MONO , & backbuffer ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_GetBackBuffer failed with %08x \n " , hr ) ;
2008-04-23 14:19:19 +00:00
hr = IDirect3DDevice9_CreateRenderTarget ( device , 100 , 100 , D3DFMT_A8R8G8B8 , D3DMULTISAMPLE_NONE , 0 , TRUE , & src , NULL ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK | | hr = = D3DERR_INVALIDCALL , " IDirect3DDevice9_CreateRenderTarget failed with %08x \n " , hr ) ;
2008-04-23 14:19:19 +00:00
hr = IDirect3DDevice9_CreateTexture ( device , 25 , 25 , 1 , D3DUSAGE_RENDERTARGET , D3DFMT_A8R8G8B8 , D3DPOOL_DEFAULT , & dsttex , NULL ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK | | hr = = D3DERR_INVALIDCALL , " IDirect3DDevice9_CreateTexture failed with %08x \n " , hr ) ;
2008-04-23 14:19:19 +00:00
if ( ! src | | ! dsttex ) {
skip ( " One or more test resources could not be created \n " ) ;
goto cleanup ;
}
hr = IDirect3DTexture9_GetSurfaceLevel ( dsttex , 0 , & dst ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DTexture9_GetSurfaceLevel failed with %08x \n " , hr ) ;
2008-04-23 14:19:19 +00:00
hr = IDirect3DDevice9_Clear ( device , 1 , NULL , D3DCLEAR_TARGET , 0xff00ffff , 0.0 , 0 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_Clear failed with %08x \n " , hr ) ;
2008-04-23 14:19:19 +00:00
/* Clear the StretchRect destination for debugging */
hr = IDirect3DDevice9_SetRenderTarget ( device , 0 , dst ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetRenderTarget failed with %08x \n " , hr ) ;
2008-04-23 14:19:19 +00:00
hr = IDirect3DDevice9_Clear ( device , 1 , NULL , D3DCLEAR_TARGET , 0xffff00ff , 0.0 , 0 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_Clear failed with %08x \n " , hr ) ;
2008-04-23 14:19:19 +00:00
hr = IDirect3DDevice9_SetRenderTarget ( device , 0 , src ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetRenderTarget failed with %08x \n " , hr ) ;
2008-04-23 14:19:19 +00:00
hr = IDirect3DDevice9_Clear ( device , 1 , & r1 , D3DCLEAR_TARGET , 0xffff0000 , 0.0 , 0 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_Clear failed with %08x \n " , hr ) ;
2008-04-23 14:19:19 +00:00
hr = IDirect3DDevice9_Clear ( device , 1 , & r2 , D3DCLEAR_TARGET , 0xff00ff00 , 0.0 , 0 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_Clear failed with %08x \n " , hr ) ;
2008-04-23 14:19:19 +00:00
hr = IDirect3DDevice9_Clear ( device , 1 , & r3 , D3DCLEAR_TARGET , 0xff0000ff , 0.0 , 0 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_Clear failed with %08x \n " , hr ) ;
2008-04-23 14:19:19 +00:00
hr = IDirect3DDevice9_Clear ( device , 1 , & r4 , D3DCLEAR_TARGET , 0xff000000 , 0.0 , 0 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_Clear failed with %08x \n " , hr ) ;
2008-04-23 14:19:19 +00:00
/* Stretchrect before setting the render target back to the backbuffer. This will make Wine use
* the target - > texture GL blit path
*/
hr = IDirect3DDevice9_StretchRect ( device , src , NULL , dst , NULL , D3DTEXF_POINT ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_StretchRect failed with %08x \n " , hr ) ;
2008-04-23 14:19:19 +00:00
IDirect3DSurface9_Release ( dst ) ;
hr = IDirect3DDevice9_SetRenderTarget ( device , 0 , backbuffer ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetRenderTarget failed with %08x \n " , hr ) ;
2008-04-23 14:19:19 +00:00
hr = IDirect3DDevice9_SetTexture ( device , 0 , ( IDirect3DBaseTexture9 * ) dsttex ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetTexture failed with %08x \n " , hr ) ;
2008-04-23 14:19:19 +00:00
hr = IDirect3DDevice9_SetFVF ( device , D3DFVF_XYZ | D3DFVF_TEX1 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetFVF failed with %08x \n " , hr ) ;
2008-04-23 14:19:19 +00:00
hr = IDirect3DDevice9_SetTextureStageState ( device , 0 , D3DTSS_COLOROP , D3DTOP_SELECTARG1 ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetTexture failed with %08x \n " , hr ) ;
2008-04-23 14:19:19 +00:00
hr = IDirect3DDevice9_SetTextureStageState ( device , 0 , D3DTSS_COLORARG1 , D3DTA_TEXTURE ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetTexture failed with %08x \n " , hr ) ;
2008-04-23 14:19:19 +00:00
hr = IDirect3DDevice9_BeginScene ( device ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_BeginScene failed with %08x \n " , hr ) ;
2008-04-23 14:19:19 +00:00
if ( SUCCEEDED ( hr ) ) {
hr = IDirect3DDevice9_DrawPrimitiveUP ( device , D3DPT_TRIANGLESTRIP , 2 , quad , sizeof ( float ) * 5 ) ;
ok ( SUCCEEDED ( hr ) , " DrawPrimitiveUP failed (%08x) \n " , hr ) ;
hr = IDirect3DDevice9_EndScene ( device ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_EndScene failed with %08x \n " , hr ) ;
2008-04-23 14:19:19 +00:00
}
hr = IDirect3DDevice9_Present ( device , NULL , NULL , NULL , NULL ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_Present failed with %08x \n " , hr ) ;
2008-04-23 14:19:19 +00:00
color = getPixelColor ( device , 160 , 360 ) ;
ok ( color = = 0x00ff0000 , " stretchrect: Pixel 160,360 has color 0x%08x, expected 0x00ff0000 \n " , color ) ;
color = getPixelColor ( device , 480 , 360 ) ;
ok ( color = = 0x0000ff00 , " stretchrect: Pixel 480,360 has color 0x%08x, expected 0x0000ff00 \n " , color ) ;
color = getPixelColor ( device , 480 , 120 ) ;
ok ( color = = 0x000000ff , " stretchrect: Pixel 480,120 has color 0x%08x, expected 0x000000ff \n " , color ) ;
color = getPixelColor ( device , 160 , 120 ) ;
ok ( color = = 0x00000000 , " stretchrect: Pixel 160,120 has color 0x%08x, expected 0x00000000 \n " , color ) ;
hr = IDirect3DDevice9_SetTexture ( device , 0 , NULL ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetTexture failed with %08x \n " , hr ) ;
2008-04-23 14:19:19 +00:00
hr = IDirect3DDevice9_SetTextureStageState ( device , 0 , D3DTSS_COLOROP , D3DTOP_DISABLE ) ;
2008-07-08 15:48:50 +00:00
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetTexture failed with %08x \n " , hr ) ;
2008-04-23 14:19:19 +00:00
cleanup :
if ( src ) IDirect3DSurface9_Release ( src ) ;
if ( backbuffer ) IDirect3DSurface9_Release ( backbuffer ) ;
if ( dsttex ) IDirect3DTexture9_Release ( dsttex ) ;
}
2008-05-24 08:33:42 +00:00
static void texop_test ( IDirect3DDevice9 * device )
{
IDirect3DVertexDeclaration9 * vertex_declaration = NULL ;
IDirect3DTexture9 * texture = NULL ;
D3DLOCKED_RECT locked_rect ;
D3DCOLOR color ;
D3DCAPS9 caps ;
HRESULT hr ;
2008-07-18 15:17:26 +00:00
unsigned i ;
2008-05-24 08:33:42 +00:00
static const struct {
float x , y , z ;
float s , t ;
D3DCOLOR diffuse ;
} quad [ ] = {
{ - 1.0f , - 1.0f , 0.1f , - 1.0f , - 1.0f , D3DCOLOR_ARGB ( 0x55 , 0xff , 0x00 , 0x00 ) } ,
{ - 1.0f , 1.0f , 0.1f , - 1.0f , 1.0f , D3DCOLOR_ARGB ( 0x55 , 0xff , 0x00 , 0x00 ) } ,
{ 1.0f , - 1.0f , 0.1f , 1.0f , - 1.0f , D3DCOLOR_ARGB ( 0x55 , 0xff , 0x00 , 0x00 ) } ,
{ 1.0f , 1.0f , 0.1f , 1.0f , 1.0f , D3DCOLOR_ARGB ( 0x55 , 0xff , 0x00 , 0x00 ) }
} ;
static const D3DVERTEXELEMENT9 decl_elements [ ] = {
{ 0 , 0 , D3DDECLTYPE_FLOAT3 , D3DDECLMETHOD_DEFAULT , D3DDECLUSAGE_POSITION , 0 } ,
{ 0 , 12 , D3DDECLTYPE_FLOAT2 , D3DDECLMETHOD_DEFAULT , D3DDECLUSAGE_TEXCOORD , 0 } ,
{ 0 , 20 , D3DDECLTYPE_D3DCOLOR , D3DDECLMETHOD_DEFAULT , D3DDECLUSAGE_COLOR , 0 } ,
D3DDECL_END ( )
} ;
static const struct {
D3DTEXTUREOP op ;
const char * name ;
DWORD caps_flag ;
D3DCOLOR result ;
} test_data [ ] = {
{ D3DTOP_SELECTARG1 , " SELECTARG1 " , D3DTEXOPCAPS_SELECTARG1 , D3DCOLOR_ARGB ( 0x00 , 0x00 , 0xff , 0x00 ) } ,
{ D3DTOP_SELECTARG2 , " SELECTARG2 " , D3DTEXOPCAPS_SELECTARG2 , D3DCOLOR_ARGB ( 0x00 , 0x33 , 0x33 , 0x33 ) } ,
{ D3DTOP_MODULATE , " MODULATE " , D3DTEXOPCAPS_MODULATE , D3DCOLOR_ARGB ( 0x00 , 0x00 , 0x33 , 0x00 ) } ,
{ D3DTOP_MODULATE2X , " MODULATE2X " , D3DTEXOPCAPS_MODULATE2X , D3DCOLOR_ARGB ( 0x00 , 0x00 , 0x66 , 0x00 ) } ,
{ D3DTOP_MODULATE4X , " MODULATE4X " , D3DTEXOPCAPS_MODULATE4X , D3DCOLOR_ARGB ( 0x00 , 0x00 , 0xcc , 0x00 ) } ,
{ D3DTOP_ADD , " ADD " , D3DTEXOPCAPS_ADD , D3DCOLOR_ARGB ( 0x00 , 0x33 , 0xff , 0x33 ) } ,
{ D3DTOP_ADDSIGNED , " ADDSIGNED " , D3DTEXOPCAPS_ADDSIGNED , D3DCOLOR_ARGB ( 0x00 , 0x00 , 0xb2 , 0x00 ) } ,
{ D3DTOP_ADDSIGNED2X , " ADDSIGNED2X " , D3DTEXOPCAPS_ADDSIGNED2X , D3DCOLOR_ARGB ( 0x00 , 0x00 , 0xff , 0x00 ) } ,
{ D3DTOP_SUBTRACT , " SUBTRACT " , D3DTEXOPCAPS_SUBTRACT , D3DCOLOR_ARGB ( 0x00 , 0x00 , 0xcc , 0x00 ) } ,
{ D3DTOP_ADDSMOOTH , " ADDSMOOTH " , D3DTEXOPCAPS_ADDSMOOTH , D3DCOLOR_ARGB ( 0x00 , 0x33 , 0xff , 0x33 ) } ,
{ D3DTOP_BLENDDIFFUSEALPHA , " BLENDDIFFUSEALPHA " , D3DTEXOPCAPS_BLENDDIFFUSEALPHA , D3DCOLOR_ARGB ( 0x00 , 0x22 , 0x77 , 0x22 ) } ,
{ D3DTOP_BLENDTEXTUREALPHA , " BLENDTEXTUREALPHA " , D3DTEXOPCAPS_BLENDTEXTUREALPHA , D3DCOLOR_ARGB ( 0x00 , 0x14 , 0xad , 0x14 ) } ,
{ D3DTOP_BLENDFACTORALPHA , " BLENDFACTORALPHA " , D3DTEXOPCAPS_BLENDFACTORALPHA , D3DCOLOR_ARGB ( 0x00 , 0x07 , 0xe4 , 0x07 ) } ,
{ D3DTOP_BLENDTEXTUREALPHAPM , " BLENDTEXTUREALPHAPM " , D3DTEXOPCAPS_BLENDTEXTUREALPHAPM , D3DCOLOR_ARGB ( 0x00 , 0x14 , 0xff , 0x14 ) } ,
{ D3DTOP_BLENDCURRENTALPHA , " BLENDCURRENTALPHA " , D3DTEXOPCAPS_BLENDCURRENTALPHA , D3DCOLOR_ARGB ( 0x00 , 0x22 , 0x77 , 0x22 ) } ,
{ D3DTOP_MODULATEALPHA_ADDCOLOR , " MODULATEALPHA_ADDCOLOR " , D3DTEXOPCAPS_MODULATEALPHA_ADDCOLOR , D3DCOLOR_ARGB ( 0x00 , 0x1f , 0xff , 0x1f ) } ,
{ D3DTOP_MODULATECOLOR_ADDALPHA , " MODULATECOLOR_ADDALPHA " , D3DTEXOPCAPS_MODULATECOLOR_ADDALPHA , D3DCOLOR_ARGB ( 0x00 , 0x99 , 0xcc , 0x99 ) } ,
{ D3DTOP_MODULATEINVALPHA_ADDCOLOR , " MODULATEINVALPHA_ADDCOLOR " , D3DTEXOPCAPS_MODULATEINVALPHA_ADDCOLOR , D3DCOLOR_ARGB ( 0x00 , 0x14 , 0xff , 0x14 ) } ,
{ D3DTOP_MODULATEINVCOLOR_ADDALPHA , " MODULATEINVCOLOR_ADDALPHA " , D3DTEXOPCAPS_MODULATEINVCOLOR_ADDALPHA , D3DCOLOR_ARGB ( 0x00 , 0xcc , 0x99 , 0xcc ) } ,
/* BUMPENVMAP & BUMPENVMAPLUMINANCE have their own tests */
{ D3DTOP_DOTPRODUCT3 , " DOTPRODUCT2 " , D3DTEXOPCAPS_DOTPRODUCT3 , D3DCOLOR_ARGB ( 0x00 , 0x99 , 0x99 , 0x99 ) } ,
{ D3DTOP_MULTIPLYADD , " MULTIPLYADD " , D3DTEXOPCAPS_MULTIPLYADD , D3DCOLOR_ARGB ( 0x00 , 0xff , 0x33 , 0x00 ) } ,
{ D3DTOP_LERP , " LERP " , D3DTEXOPCAPS_LERP , D3DCOLOR_ARGB ( 0x00 , 0x00 , 0x33 , 0x33 ) } ,
} ;
memset ( & caps , 0 , sizeof ( caps ) ) ;
hr = IDirect3DDevice9_GetDeviceCaps ( device , & caps ) ;
2008-07-08 15:48:50 +00:00
ok ( SUCCEEDED ( hr ) , " GetDeviceCaps failed with 0x%08x \n " , hr ) ;
2008-05-24 08:33:42 +00:00
hr = IDirect3DDevice9_CreateVertexDeclaration ( device , decl_elements , & vertex_declaration ) ;
2008-07-08 15:48:50 +00:00
ok ( SUCCEEDED ( hr ) , " CreateVertexDeclaration failed with 0x%08x \n " , hr ) ;
2008-05-24 08:33:42 +00:00
hr = IDirect3DDevice9_SetVertexDeclaration ( device , vertex_declaration ) ;
2008-07-08 15:48:50 +00:00
ok ( SUCCEEDED ( hr ) , " SetVertexDeclaration failed with 0x%08x \n " , hr ) ;
2008-05-24 08:33:42 +00:00
hr = IDirect3DDevice9_CreateTexture ( device , 1 , 1 , 1 , 0 , D3DFMT_A8R8G8B8 , D3DPOOL_MANAGED , & texture , NULL ) ;
2008-07-08 15:48:50 +00:00
ok ( SUCCEEDED ( hr ) , " IDirect3DDevice9_CreateTexture failed with 0x%08x \n " , hr ) ;
2008-05-24 08:33:42 +00:00
hr = IDirect3DTexture9_LockRect ( texture , 0 , & locked_rect , NULL , 0 ) ;
2008-07-08 15:48:50 +00:00
ok ( SUCCEEDED ( hr ) , " LockRect failed with 0x%08x \n " , hr ) ;
2008-05-24 08:33:42 +00:00
* ( ( DWORD * ) locked_rect . pBits ) = D3DCOLOR_ARGB ( 0x99 , 0x00 , 0xff , 0x00 ) ;
hr = IDirect3DTexture9_UnlockRect ( texture , 0 ) ;
2008-07-08 15:48:50 +00:00
ok ( SUCCEEDED ( hr ) , " LockRect failed with 0x%08x \n " , hr ) ;
2008-05-24 08:33:42 +00:00
hr = IDirect3DDevice9_SetTexture ( device , 0 , ( IDirect3DBaseTexture9 * ) texture ) ;
2008-07-08 15:48:50 +00:00
ok ( SUCCEEDED ( hr ) , " SetTexture failed with 0x%08x \n " , hr ) ;
2008-05-24 08:33:42 +00:00
hr = IDirect3DDevice9_SetTextureStageState ( device , 0 , D3DTSS_COLORARG0 , D3DTA_DIFFUSE ) ;
2008-07-08 15:48:50 +00:00
ok ( SUCCEEDED ( hr ) , " SetTextureStageState failed with 0x%08x \n " , hr ) ;
2008-05-24 08:33:42 +00:00
hr = IDirect3DDevice9_SetTextureStageState ( device , 0 , D3DTSS_COLORARG1 , D3DTA_TEXTURE ) ;
2008-07-08 15:48:50 +00:00
ok ( SUCCEEDED ( hr ) , " SetTextureStageState failed with 0x%08x \n " , hr ) ;
2008-05-24 08:33:42 +00:00
hr = IDirect3DDevice9_SetTextureStageState ( device , 0 , D3DTSS_COLORARG2 , D3DTA_TFACTOR ) ;
2008-07-08 15:48:50 +00:00
ok ( SUCCEEDED ( hr ) , " SetTextureStageState failed with 0x%08x \n " , hr ) ;
2008-05-24 08:33:42 +00:00
hr = IDirect3DDevice9_SetTextureStageState ( device , 1 , D3DTSS_COLOROP , D3DTOP_DISABLE ) ;
2008-07-08 15:48:50 +00:00
ok ( SUCCEEDED ( hr ) , " SetTextureStageState failed with 0x%08x \n " , hr ) ;
2008-05-24 08:33:42 +00:00
hr = IDirect3DDevice9_SetRenderState ( device , D3DRS_LIGHTING , FALSE ) ;
2008-07-08 15:48:50 +00:00
ok ( SUCCEEDED ( hr ) , " SetRenderState failed with 0x%08x \n " , hr ) ;
2008-05-24 08:33:42 +00:00
hr = IDirect3DDevice9_SetRenderState ( device , D3DRS_TEXTUREFACTOR , 0xdd333333 ) ;
2008-07-08 15:48:50 +00:00
ok ( SUCCEEDED ( hr ) , " SetRenderState failed with 0x%08x \n " , hr ) ;
2008-05-24 08:33:42 +00:00
hr = IDirect3DDevice9_SetRenderState ( device , D3DRS_COLORWRITEENABLE , D3DCOLORWRITEENABLE_RED | D3DCOLORWRITEENABLE_GREEN | D3DCOLORWRITEENABLE_BLUE | D3DCOLORWRITEENABLE_ALPHA ) ;
2008-07-08 15:48:50 +00:00
ok ( SUCCEEDED ( hr ) , " SetRenderState failed with 0x%08x \n " , hr ) ;
2008-05-24 08:33:42 +00:00
hr = IDirect3DDevice9_Clear ( device , 0 , NULL , D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER , 0x00000000 , 1.0f , 0 ) ;
2008-07-08 15:48:50 +00:00
ok ( SUCCEEDED ( hr ) , " IDirect3DDevice9_Clear failed with 0x%08x \n " , hr ) ;
2008-05-24 08:33:42 +00:00
for ( i = 0 ; i < sizeof ( test_data ) / sizeof ( * test_data ) ; + + i )
{
if ( ! ( caps . TextureOpCaps & test_data [ i ] . caps_flag ) )
{
skip ( " tex operation %s not supported \n " , test_data [ i ] . name ) ;
continue ;
}
hr = IDirect3DDevice9_SetTextureStageState ( device , 0 , D3DTSS_COLOROP , test_data [ i ] . op ) ;
2008-07-08 15:48:50 +00:00
ok ( SUCCEEDED ( hr ) , " SetTextureStageState (%s) failed with 0x%08x \n " , test_data [ i ] . name , hr ) ;
2008-05-24 08:33:42 +00:00
hr = IDirect3DDevice9_BeginScene ( device ) ;
2008-07-08 15:48:50 +00:00
ok ( SUCCEEDED ( hr ) , " BeginScene failed with 0x%08x \n " , hr ) ;
2008-05-24 08:33:42 +00:00
hr = IDirect3DDevice9_DrawPrimitiveUP ( device , D3DPT_TRIANGLESTRIP , 2 , quad , sizeof ( * quad ) ) ;
2008-07-08 15:48:50 +00:00
ok ( SUCCEEDED ( hr ) , " DrawPrimitiveUP failed with 0x%08x \n " , hr ) ;
2008-05-24 08:33:42 +00:00
hr = IDirect3DDevice9_EndScene ( device ) ;
2008-07-08 15:48:50 +00:00
ok ( SUCCEEDED ( hr ) , " EndScene failed with 0x%08x \n " , hr ) ;
2008-05-24 08:33:42 +00:00
hr = IDirect3DDevice9_Present ( device , NULL , NULL , NULL , NULL ) ;
2008-07-08 15:48:50 +00:00
ok ( SUCCEEDED ( hr ) , " Present failed with 0x%08x \n " , hr ) ;
2008-05-24 08:33:42 +00:00
color = getPixelColor ( device , 320 , 240 ) ;
2008-06-25 15:09:16 +00:00
ok ( color_match ( color , test_data [ i ] . result , 3 ) , " Operation %s returned color 0x%08x, expected 0x%08x \n " ,
2008-05-24 08:33:42 +00:00
test_data [ i ] . name , color , test_data [ i ] . result ) ;
}
if ( texture ) IDirect3DTexture9_Release ( texture ) ;
if ( vertex_declaration ) IDirect3DVertexDeclaration9_Release ( vertex_declaration ) ;
}
2008-08-19 15:55:42 +00:00
static void yuv_color_test ( IDirect3DDevice9 * device ) {
HRESULT hr ;
IDirect3DSurface9 * surface = NULL , * target = NULL ;
unsigned int fmt , i ;
D3DFORMAT format ;
const char * fmt_string ;
D3DLOCKED_RECT lr ;
IDirect3D9 * d3d ;
HRESULT color ;
DWORD ref_color_left , ref_color_right ;
struct {
DWORD in ; /* The input color */
DWORD uyvy_left ; /* "in" interpreted as uyvy and transformed to RGB, pixel 1/1*/
DWORD uyvy_right ; /* "in" interpreted as uyvy and transformed to RGB, pixel 2/1*/
DWORD yuy2_left ; /* "in" interpreted as yuy2 and transformed to RGB, pixel 1/1 */
DWORD yuy2_right ; /* "in" interpreted as yuy2 and transformed to RGB, pixel 2/1 */
} test_data [ ] = {
/* Originally I wanted to avoid being evil, and set Y1 = Y2 to avoid triggering troubles in shader converters,
* but the main difference between YUY2 and UYVY is the swapped ordering of the chroma and luminance
* values . However , handling the two Y ' s properly could have a big impact on image quality , so be picky about
* that
*/
{ 0x00000000 , 0x00008700 , 0x00008700 , 0x00008700 , 0x00008700 } ,
{ 0xff000000 , 0x00008700 , 0x004bff1c , 0x00b30000 , 0x00b30000 } ,
{ 0x00ff0000 , 0x00b30000 , 0x00b30000 , 0x00008700 , 0x004bff1c } ,
{ 0x0000ff00 , 0x004bff1c , 0x00008700 , 0x000030e1 , 0x000030e1 } ,
{ 0x000000ff , 0x000030e1 , 0x000030e1 , 0x004bff1c , 0x00008700 } ,
{ 0xffff0000 , 0x00b30000 , 0x00ffd01c , 0x00b30000 , 0x00ffd01c } ,
{ 0xff00ff00 , 0x004bff1c , 0x004bff1c , 0x00b300e1 , 0x00b300e1 } ,
{ 0xff0000ff , 0x000030e1 , 0x004bffff , 0x00ffd01c , 0x00b30000 } ,
{ 0x00ffff00 , 0x00ffd01c , 0x00b30000 , 0x000030e1 , 0x004bffff } ,
{ 0x00ff00ff , 0x00b300e1 , 0x00b300e1 , 0x004bff1c , 0x004bff1c } ,
{ 0x0000ffff , 0x004bffff , 0x000030e1 , 0x004bffff , 0x000030e1 } ,
{ 0xffffff00 , 0x00ffd01c , 0x00ffd01c , 0x00b300e1 , 0x00ff79ff } ,
{ 0xffff00ff , 0x00b300e1 , 0x00ff79ff , 0x00ffd01c , 0x00ffd01c } ,
{ 0xffffffff , 0x00ff79ff , 0x00ff79ff , 0x00ff79ff , 0x00ff79ff } ,
{ 0x4cff4c54 , 0x00ff0000 , 0x00ff0000 , 0x000b8b00 , 0x00b6ffa3 } ,
{ 0x00800080 , 0x00000000 , 0x00000000 , 0x0000ff00 , 0x0000ff00 } ,
{ 0xFF80FF80 , 0x00ffffff , 0x00ffffff , 0x00ff00ff , 0x00ff00ff } ,
{ 0x1c6b1cff , 0x000000fd , 0x000000fd , 0x006dff45 , 0x0000d500 } ,
} ;
hr = IDirect3DDevice9_GetDirect3D ( device , & d3d ) ;
ok ( hr = = D3D_OK , " IDirect3DDevice9_GetDirect3D failed, hr = %08x \n " , hr ) ;
hr = IDirect3DDevice9_GetRenderTarget ( device , 0 , & target ) ;
ok ( hr = = D3D_OK , " IDirect3DDevice9_GetRenderTarget failed, hr = %08x \n " , hr ) ;
IDirect3DDevice9_SetFVF ( device , D3DFVF_XYZ | D3DFVF_TEX0 ) ;
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetFVF failed, hr = %08x \n " , hr ) ;
for ( fmt = 0 ; fmt < 2 ; fmt + + ) {
if ( fmt = = 0 ) {
format = D3DFMT_UYVY ;
fmt_string = " D3DFMT_UYVY " ;
} else {
format = D3DFMT_YUY2 ;
fmt_string = " D3DFMT_YUY2 " ;
}
/* Some(all?) Windows drivers do not support YUV 3D textures, only 2D surfaces in StretchRect. Thus use
* StretchRect to draw the YUV surface onto the screen instead of drawPrimitive
*/
if ( IDirect3D9_CheckDeviceFormat ( d3d , 0 , D3DDEVTYPE_HAL , D3DFMT_X8R8G8B8 , 0 ,
D3DRTYPE_SURFACE , format ) ! = D3D_OK ) {
skip ( " %s is not supported \n " , fmt_string ) ;
continue ;
}
/* A pixel is effectively 16 bit large, but two pixels are stored together, so the minimum size is 2x1 */
hr = IDirect3DDevice9_CreateOffscreenPlainSurface ( device , 2 , 1 , format , D3DPOOL_DEFAULT , & surface , NULL ) ;
ok ( hr = = D3D_OK , " IDirect3DDevice9_CreateOffscreenPlainSurface failed, hr = %08x \n " , hr ) ;
for ( i = 0 ; i < ( sizeof ( test_data ) / sizeof ( test_data [ 0 ] ) ) ; i + + ) {
if ( fmt = = 0 ) {
ref_color_left = test_data [ i ] . uyvy_left ;
ref_color_right = test_data [ i ] . uyvy_right ;
} else {
ref_color_left = test_data [ i ] . yuy2_left ;
ref_color_right = test_data [ i ] . yuy2_right ;
}
memset ( & lr , 0 , sizeof ( lr ) ) ;
hr = IDirect3DSurface9_LockRect ( surface , & lr , NULL , 0 ) ;
ok ( hr = = D3D_OK , " IDirect3DSurface9_LockRect failed, hr = %08x \n " , hr ) ;
* ( ( DWORD * ) lr . pBits ) = test_data [ i ] . in ;
hr = IDirect3DSurface9_UnlockRect ( surface ) ;
ok ( hr = = D3D_OK , " IDirect3DSurface9_UnlockRect failed, hr = %08x \n " , hr ) ;
hr = IDirect3DDevice9_Clear ( device , 0 , NULL , D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER , 0x00000000 , 1.0f , 0 ) ;
ok ( hr = = D3D_OK , " IDirect3DDevice9_Clear failed with 0x%08x \n " , hr ) ;
hr = IDirect3DDevice9_StretchRect ( device , surface , NULL , target , NULL , D3DTEXF_POINT ) ;
ok ( hr = = D3D_OK , " IDirect3DDevice9_StretchRect failed with 0x%08x \n " , hr ) ;
hr = IDirect3DDevice9_Present ( device , NULL , NULL , NULL , NULL ) ;
ok ( SUCCEEDED ( hr ) , " Present failed with 0x%08x \n " , hr ) ;
/* Native D3D can't resist filtering the YUY surface, even though we asked it not to do so above. To
* prevent running into precision problems , read a far left and far right pixel . In the future we may
* want to add tests for the filtered pixels as well .
*
* Unfortunately different implementations ( Windows - NV and Mac - ATI tested ) interpret some colors vastly
* differently , so we need a max diff of 16
*/
color = getPixelColor ( device , 40 , 240 ) ;
ok ( color_match ( color , ref_color_left , 16 ) ,
" Input 0x%08x: Got color 0x%08x for pixel 1/1, expected 0x%08x, format %s \n " ,
test_data [ i ] . in , color , ref_color_left , fmt_string ) ;
color = getPixelColor ( device , 600 , 240 ) ;
ok ( color_match ( color , ref_color_right , 16 ) ,
" Input 0x%08x: Got color 0x%08x for pixel 2/1, expected 0x%08x, format %s \n " ,
test_data [ i ] . in , color , ref_color_left , fmt_string ) ;
}
IDirect3DSurface9_Release ( surface ) ;
}
IDirect3DSurface9_Release ( target ) ;
IDirect3D9_Release ( d3d ) ;
}
2008-08-14 21:29:47 +00:00
static void texop_range_test ( IDirect3DDevice9 * device )
{
static const struct {
float x , y , z ;
D3DCOLOR diffuse ;
} quad [ ] = {
{ - 1.0f , - 1.0f , 0.1f , D3DCOLOR_ARGB ( 0xff , 0xff , 0xff , 0xff ) } ,
{ - 1.0f , 1.0f , 0.1f , D3DCOLOR_ARGB ( 0xff , 0xff , 0xff , 0xff ) } ,
{ 1.0f , - 1.0f , 0.1f , D3DCOLOR_ARGB ( 0xff , 0xff , 0xff , 0xff ) } ,
{ 1.0f , 1.0f , 0.1f , D3DCOLOR_ARGB ( 0xff , 0xff , 0xff , 0xff ) }
} ;
HRESULT hr ;
IDirect3DTexture9 * texture ;
D3DLOCKED_RECT locked_rect ;
D3DCAPS9 caps ;
DWORD color ;
/* We need ADD and SUBTRACT operations */
hr = IDirect3DDevice9_GetDeviceCaps ( device , & caps ) ;
ok ( SUCCEEDED ( hr ) , " GetDeviceCaps failed with 0x%08x \n " , hr ) ;
if ( ! ( caps . TextureOpCaps & D3DTEXOPCAPS_ADD ) ) {
skip ( " D3DTOP_ADD is not supported, skipping value range test \n " ) ;
}
if ( ! ( caps . TextureOpCaps & D3DTEXOPCAPS_SUBTRACT ) ) {
skip ( " D3DTEXOPCAPS_SUBTRACT is not supported, skipping value range test \n " ) ;
}
hr = IDirect3DDevice9_SetFVF ( device , D3DFVF_XYZ | D3DFVF_DIFFUSE ) ;
ok ( SUCCEEDED ( hr ) , " SetFVF failed with 0x%08x \n " , hr ) ;
/* Stage 1: result = diffuse(=1.0) + diffuse
* stage 2 : result = result - tfactor ( = 0.5 )
*/
hr = IDirect3DDevice9_SetRenderState ( device , D3DRS_TEXTUREFACTOR , 0x80808080 ) ;
ok ( SUCCEEDED ( hr ) , " SetRenderState failed with 0x%08x \n " , hr ) ;
hr = IDirect3DDevice9_SetTextureStageState ( device , 0 , D3DTSS_COLORARG1 , D3DTA_DIFFUSE ) ;
ok ( SUCCEEDED ( hr ) , " SetTextureStageState failed with 0x%08x \n " , hr ) ;
hr = IDirect3DDevice9_SetTextureStageState ( device , 0 , D3DTSS_COLORARG2 , D3DTA_DIFFUSE ) ;
ok ( SUCCEEDED ( hr ) , " SetTextureStageState failed with 0x%08x \n " , hr ) ;
hr = IDirect3DDevice9_SetTextureStageState ( device , 0 , D3DTSS_COLOROP , D3DTOP_ADD ) ;
ok ( SUCCEEDED ( hr ) , " SetTextureStageState failed with 0x%08x \n " , hr ) ;
hr = IDirect3DDevice9_SetTextureStageState ( device , 1 , D3DTSS_COLORARG1 , D3DTA_CURRENT ) ;
ok ( SUCCEEDED ( hr ) , " SetTextureStageState failed with 0x%08x \n " , hr ) ;
hr = IDirect3DDevice9_SetTextureStageState ( device , 1 , D3DTSS_COLORARG2 , D3DTA_TFACTOR ) ;
ok ( SUCCEEDED ( hr ) , " SetTextureStageState failed with 0x%08x \n " , hr ) ;
hr = IDirect3DDevice9_SetTextureStageState ( device , 1 , D3DTSS_COLOROP , D3DTOP_SUBTRACT ) ;
ok ( SUCCEEDED ( hr ) , " SetTextureStageState failed with 0x%08x \n " , hr ) ;
hr = IDirect3DDevice9_BeginScene ( device ) ;
ok ( SUCCEEDED ( hr ) , " BeginScene failed with 0x%08x \n " , hr ) ;
hr = IDirect3DDevice9_DrawPrimitiveUP ( device , D3DPT_TRIANGLESTRIP , 2 , quad , sizeof ( * quad ) ) ;
ok ( SUCCEEDED ( hr ) , " DrawPrimitiveUP failed with 0x%08x \n " , hr ) ;
hr = IDirect3DDevice9_EndScene ( device ) ;
ok ( SUCCEEDED ( hr ) , " EndScene failed with 0x%08x \n " , hr ) ;
hr = IDirect3DDevice9_Present ( device , NULL , NULL , NULL , NULL ) ;
ok ( SUCCEEDED ( hr ) , " Present failed with 0x%08x \n " , hr ) ;
color = getPixelColor ( device , 320 , 240 ) ;
ok ( color_match ( color , 0x00808080 , 1 ) , " texop Range > 1.0 returned 0x%08x, expected 0x00808080 \n " ,
color ) ;
hr = IDirect3DDevice9_CreateTexture ( device , 1 , 1 , 1 , 0 , D3DFMT_A8R8G8B8 , D3DPOOL_MANAGED , & texture , NULL ) ;
ok ( SUCCEEDED ( hr ) , " IDirect3DDevice9_CreateTexture failed with 0x%08x \n " , hr ) ;
hr = IDirect3DTexture9_LockRect ( texture , 0 , & locked_rect , NULL , 0 ) ;
ok ( SUCCEEDED ( hr ) , " LockRect failed with 0x%08x \n " , hr ) ;
* ( ( DWORD * ) locked_rect . pBits ) = D3DCOLOR_ARGB ( 0x00 , 0x00 , 0x00 , 0x00 ) ;
hr = IDirect3DTexture9_UnlockRect ( texture , 0 ) ;
ok ( SUCCEEDED ( hr ) , " LockRect failed with 0x%08x \n " , hr ) ;
hr = IDirect3DDevice9_SetTexture ( device , 0 , ( IDirect3DBaseTexture9 * ) texture ) ;
ok ( SUCCEEDED ( hr ) , " SetTexture failed with 0x%08x \n " , hr ) ;
/* Stage 1: result = texture(=0.0) - tfactor(= 0.5)
* stage 2 : result = result + diffuse ( 1.0 )
*/
hr = IDirect3DDevice9_SetRenderState ( device , D3DRS_TEXTUREFACTOR , 0x80808080 ) ;
ok ( SUCCEEDED ( hr ) , " SetRenderState failed with 0x%08x \n " , hr ) ;
hr = IDirect3DDevice9_SetTextureStageState ( device , 0 , D3DTSS_COLORARG1 , D3DTA_TEXTURE ) ;
ok ( SUCCEEDED ( hr ) , " SetTextureStageState failed with 0x%08x \n " , hr ) ;
hr = IDirect3DDevice9_SetTextureStageState ( device , 0 , D3DTSS_COLORARG2 , D3DTA_TFACTOR ) ;
ok ( SUCCEEDED ( hr ) , " SetTextureStageState failed with 0x%08x \n " , hr ) ;
hr = IDirect3DDevice9_SetTextureStageState ( device , 0 , D3DTSS_COLOROP , D3DTOP_SUBTRACT ) ;
ok ( SUCCEEDED ( hr ) , " SetTextureStageState failed with 0x%08x \n " , hr ) ;
hr = IDirect3DDevice9_SetTextureStageState ( device , 1 , D3DTSS_COLORARG1 , D3DTA_CURRENT ) ;
ok ( SUCCEEDED ( hr ) , " SetTextureStageState failed with 0x%08x \n " , hr ) ;
hr = IDirect3DDevice9_SetTextureStageState ( device , 1 , D3DTSS_COLORARG2 , D3DTA_DIFFUSE ) ;
ok ( SUCCEEDED ( hr ) , " SetTextureStageState failed with 0x%08x \n " , hr ) ;
hr = IDirect3DDevice9_SetTextureStageState ( device , 1 , D3DTSS_COLOROP , D3DTOP_ADD ) ;
ok ( SUCCEEDED ( hr ) , " SetTextureStageState failed with 0x%08x \n " , hr ) ;
hr = IDirect3DDevice9_BeginScene ( device ) ;
ok ( SUCCEEDED ( hr ) , " BeginScene failed with 0x%08x \n " , hr ) ;
hr = IDirect3DDevice9_DrawPrimitiveUP ( device , D3DPT_TRIANGLESTRIP , 2 , quad , sizeof ( * quad ) ) ;
ok ( SUCCEEDED ( hr ) , " DrawPrimitiveUP failed with 0x%08x \n " , hr ) ;
hr = IDirect3DDevice9_EndScene ( device ) ;
ok ( SUCCEEDED ( hr ) , " EndScene failed with 0x%08x \n " , hr ) ;
hr = IDirect3DDevice9_Present ( device , NULL , NULL , NULL , NULL ) ;
ok ( SUCCEEDED ( hr ) , " Present failed with 0x%08x \n " , hr ) ;
color = getPixelColor ( device , 320 , 240 ) ;
ok ( color_match ( color , 0x00ffffff , 1 ) , " texop Range < 0.0 returned 0x%08x, expected 0x00ffffff \n " ,
color ) ;
hr = IDirect3DDevice9_SetTextureStageState ( device , 0 , D3DTSS_COLOROP , D3DTOP_DISABLE ) ;
ok ( SUCCEEDED ( hr ) , " SetTextureStageState failed with 0x%08x \n " , hr ) ;
hr = IDirect3DDevice9_SetTextureStageState ( device , 1 , D3DTSS_COLOROP , D3DTOP_DISABLE ) ;
ok ( SUCCEEDED ( hr ) , " SetTextureStageState failed with 0x%08x \n " , hr ) ;
2008-11-01 23:27:00 +00:00
hr = IDirect3DDevice9_SetTexture ( device , 1 , NULL ) ;
2008-08-14 21:29:47 +00:00
ok ( SUCCEEDED ( hr ) , " SetTexture failed with 0x%08x \n " , hr ) ;
IDirect3DTexture9_Release ( texture ) ;
}
2008-08-19 15:43:03 +00:00
static void alphareplicate_test ( IDirect3DDevice9 * device ) {
struct vertex quad [ ] = {
{ - 1.0 , - 1.0 , 0.1 , 0x80ff00ff } ,
{ 1.0 , - 1.0 , 0.1 , 0x80ff00ff } ,
{ - 1.0 , 1.0 , 0.1 , 0x80ff00ff } ,
{ 1.0 , 1.0 , 0.1 , 0x80ff00ff } ,
} ;
HRESULT hr ;
DWORD color ;
hr = IDirect3DDevice9_Clear ( device , 0 , NULL , D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER , 0x00000000 , 1.0f , 0 ) ;
ok ( hr = = D3D_OK , " IDirect3DDevice9_Clear failed with 0x%08x \n " , hr ) ;
hr = IDirect3DDevice9_SetFVF ( device , D3DFVF_XYZ | D3DFVF_DIFFUSE ) ;
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetFVF failed with 0x%08x \n " , hr ) ;
hr = IDirect3DDevice9_SetTextureStageState ( device , 0 , D3DTSS_COLOROP , D3DTOP_SELECTARG1 ) ;
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetTextureStageState failed with 0x%08x \n " , hr ) ;
hr = IDirect3DDevice9_SetTextureStageState ( device , 0 , D3DTSS_COLORARG1 , D3DTA_DIFFUSE | D3DTA_ALPHAREPLICATE ) ;
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetTextureStageState failed with 0x%08x \n " , hr ) ;
hr = IDirect3DDevice9_BeginScene ( device ) ;
ok ( hr = = D3D_OK , " IDirect3DDevice9_BeginScene failed with 0x%08x \n " , hr ) ;
if ( SUCCEEDED ( hr ) ) {
hr = IDirect3DDevice9_DrawPrimitiveUP ( device , D3DPT_TRIANGLESTRIP , 2 , quad , sizeof ( * quad ) ) ;
ok ( SUCCEEDED ( hr ) , " DrawPrimitiveUP failed with 0x%08x \n " , hr ) ;
hr = IDirect3DDevice9_EndScene ( device ) ;
ok ( hr = = D3D_OK , " IDirect3DDevice9_BeginScene failed with 0x%08x \n " , hr ) ;
}
hr = IDirect3DDevice9_Present ( device , NULL , NULL , NULL , NULL ) ;
ok ( SUCCEEDED ( hr ) , " Present failed with 0x%08x \n " , hr ) ;
color = getPixelColor ( device , 320 , 240 ) ;
ok ( color_match ( color , 0x00808080 , 1 ) , " alphareplicate test 0x%08x, expected 0x00808080 \n " ,
color ) ;
hr = IDirect3DDevice9_SetTextureStageState ( device , 0 , D3DTSS_COLOROP , D3DTOP_DISABLE ) ;
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetTextureStageState failed with 0x%08x \n " , hr ) ;
}
2008-08-26 19:11:47 +00:00
static void dp3_alpha_test ( IDirect3DDevice9 * device ) {
HRESULT hr ;
D3DCAPS9 caps ;
DWORD color ;
struct vertex quad [ ] = {
{ - 1.0 , - 1.0 , 0.1 , 0x408080c0 } ,
{ 1.0 , - 1.0 , 0.1 , 0x408080c0 } ,
{ - 1.0 , 1.0 , 0.1 , 0x408080c0 } ,
{ 1.0 , 1.0 , 0.1 , 0x408080c0 } ,
} ;
memset ( & caps , 0 , sizeof ( caps ) ) ;
hr = IDirect3DDevice9_GetDeviceCaps ( device , & caps ) ;
ok ( SUCCEEDED ( hr ) , " GetDeviceCaps failed with 0x%08x \n " , hr ) ;
if ( ! ( caps . TextureOpCaps & D3DTEXOPCAPS_DOTPRODUCT3 ) ) {
skip ( " D3DTOP_DOTPRODUCT3 not supported \n " ) ;
return ;
}
hr = IDirect3DDevice9_Clear ( device , 0 , NULL , D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER , 0x00000000 , 1.0f , 0 ) ;
ok ( hr = = D3D_OK , " IDirect3DDevice9_Clear failed with 0x%08x \n " , hr ) ;
hr = IDirect3DDevice9_SetFVF ( device , D3DFVF_XYZ | D3DFVF_DIFFUSE ) ;
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetFVF failed with 0x%08x \n " , hr ) ;
/* dp3_x4 r0, diffuse_bias, tfactor_bias
* mov r0 . a , diffuse . a
* mov r0 , r0 . a
*
* It turns out that the 2 nd line is ignored , and the dp3 result written into r0 . a instead
* thus with input vec4 ( 0.5 , 0.5 , 0.75 , 0.25 ) and vec4 ( 1.0 , 1.0 , 1.0 , 1.0 ) the result is
* ( 0.0 * 0.5 + 0.0 * 0.5 + 0.25 * 0.5 ) * 4 = 0.125 * 4 = 0.5 , with a bunch of inprecision .
*/
hr = IDirect3DDevice9_SetTextureStageState ( device , 0 , D3DTSS_COLOROP , D3DTOP_DOTPRODUCT3 ) ;
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetTextureStageState failed with 0x%08x \n " , hr ) ;
hr = IDirect3DDevice9_SetTextureStageState ( device , 0 , D3DTSS_COLORARG1 , D3DTA_DIFFUSE ) ;
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetTextureStageState failed with 0x%08x \n " , hr ) ;
hr = IDirect3DDevice9_SetTextureStageState ( device , 0 , D3DTSS_COLORARG2 , D3DTA_TFACTOR ) ;
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetTextureStageState failed with 0x%08x \n " , hr ) ;
hr = IDirect3DDevice9_SetTextureStageState ( device , 0 , D3DTSS_ALPHAOP , D3DTOP_SELECTARG1 ) ;
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetTextureStageState failed with 0x%08x \n " , hr ) ;
hr = IDirect3DDevice9_SetTextureStageState ( device , 0 , D3DTSS_ALPHAARG1 , D3DTA_DIFFUSE ) ;
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetTextureStageState failed with 0x%08x \n " , hr ) ;
hr = IDirect3DDevice9_SetTextureStageState ( device , 1 , D3DTSS_COLOROP , D3DTOP_SELECTARG1 ) ;
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetTextureStageState failed with 0x%08x \n " , hr ) ;
hr = IDirect3DDevice9_SetTextureStageState ( device , 1 , D3DTSS_COLORARG1 , D3DTA_CURRENT | D3DTA_ALPHAREPLICATE ) ;
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetTextureStageState failed with 0x%08x \n " , hr ) ;
hr = IDirect3DDevice9_SetTextureStageState ( device , 1 , D3DTSS_ALPHAOP , D3DTOP_DISABLE ) ;
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetTextureStageState failed with 0x%08x \n " , hr ) ;
hr = IDirect3DDevice9_SetRenderState ( device , D3DRS_TEXTUREFACTOR , 0xffffffff ) ;
ok ( SUCCEEDED ( hr ) , " IDirect3DDevice9_SetRenderState failed with 0x%08x \n " , hr ) ;
hr = IDirect3DDevice9_BeginScene ( device ) ;
ok ( hr = = D3D_OK , " IDirect3DDevice9_BeginScene failed with 0x%08x \n " , hr ) ;
if ( SUCCEEDED ( hr ) ) {
hr = IDirect3DDevice9_DrawPrimitiveUP ( device , D3DPT_TRIANGLESTRIP , 2 , quad , sizeof ( * quad ) ) ;
ok ( SUCCEEDED ( hr ) , " DrawPrimitiveUP failed with 0x%08x \n " , hr ) ;
hr = IDirect3DDevice9_EndScene ( device ) ;
ok ( hr = = D3D_OK , " IDirect3DDevice9_BeginScene failed with 0x%08x \n " , hr ) ;
}
hr = IDirect3DDevice9_Present ( device , NULL , NULL , NULL , NULL ) ;
ok ( SUCCEEDED ( hr ) , " IDirect3DDevice9_Present failed with 0x%08x \n " , hr ) ;
color = getPixelColor ( device , 320 , 240 ) ;
ok ( color_match ( color , 0x00808080 , 4 ) , " dp3 alpha test 0x%08x, expected 0x00808080 \n " ,
color ) ;
hr = IDirect3DDevice9_SetTextureStageState ( device , 0 , D3DTSS_COLOROP , D3DTOP_DISABLE ) ;
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetTextureStageState failed with 0x%08x \n " , hr ) ;
hr = IDirect3DDevice9_SetTextureStageState ( device , 0 , D3DTSS_ALPHAOP , D3DTOP_DISABLE ) ;
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetTextureStageState failed with 0x%08x \n " , hr ) ;
hr = IDirect3DDevice9_SetTextureStageState ( device , 1 , D3DTSS_COLOROP , D3DTOP_DISABLE ) ;
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetTextureStageState failed with 0x%08x \n " , hr ) ;
}
2008-09-08 01:04:34 +00:00
static void zwriteenable_test ( IDirect3DDevice9 * device ) {
HRESULT hr ;
DWORD color ;
struct vertex quad1 [ ] = {
{ - 1.0 , - 1.0 , 0.1 , 0x00ff0000 } ,
{ - 1.0 , 1.0 , 0.1 , 0x00ff0000 } ,
{ 1.0 , - 1.0 , 0.1 , 0x00ff0000 } ,
{ 1.0 , 1.0 , 0.1 , 0x00ff0000 } ,
} ;
struct vertex quad2 [ ] = {
{ - 1.0 , - 1.0 , 0.9 , 0x0000ff00 } ,
{ - 1.0 , 1.0 , 0.9 , 0x0000ff00 } ,
{ 1.0 , - 1.0 , 0.9 , 0x0000ff00 } ,
{ 1.0 , 1.0 , 0.9 , 0x0000ff00 } ,
} ;
hr = IDirect3DDevice9_Clear ( device , 0 , NULL , D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER , 0x000000ff , 1.0f , 0 ) ;
ok ( hr = = D3D_OK , " IDirect3DDevice9_Clear failed with 0x%08x \n " , hr ) ;
hr = IDirect3DDevice9_SetFVF ( device , D3DFVF_XYZ | D3DFVF_DIFFUSE ) ;
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetFVF failed with 0x%08x \n " , hr ) ;
hr = IDirect3DDevice9_SetRenderState ( device , D3DRS_ZENABLE , D3DZB_FALSE ) ;
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetRenderState failed with 0x%08x \n " , hr ) ;
hr = IDirect3DDevice9_SetRenderState ( device , D3DRS_ZWRITEENABLE , TRUE ) ;
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetRenderState failed with 0x%08x \n " , hr ) ;
hr = IDirect3DDevice9_SetRenderState ( device , D3DRS_ZFUNC , D3DCMP_LESSEQUAL ) ;
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetRenderState failed with 0x%08x \n " , hr ) ;
hr = IDirect3DDevice9_BeginScene ( device ) ;
ok ( hr = = D3D_OK , " IDirect3DDevice9_BeginScene failed with 0x%08x \n " , hr ) ;
if ( SUCCEEDED ( hr ) ) {
/* The Z buffer is filled with 1.0. Draw a red quad with z = 0.1, zenable = D3DZB_FALSE, zwriteenable = TRUE.
2008-10-10 11:44:43 +00:00
* The red color is written because the z test is disabled . The question is whether the z = 0.1 values
2008-09-08 01:04:34 +00:00
* are written into the Z buffer . After the draw , set zenable = TRUE and draw a green quad at z = 0.9 .
* If the values are written , the z test will fail ( 0.9 > 0.1 ) and the red color remains . If the values
* are not written , the z test succeeds ( 0.9 < 1.0 ) and the green color is written . It turns out that
* the screen is green , so zenable = D3DZB_FALSE and zwriteenable = TRUE does NOT write to the z buffer .
*/
hr = IDirect3DDevice9_DrawPrimitiveUP ( device , D3DPT_TRIANGLESTRIP , 2 , quad1 , sizeof ( * quad1 ) ) ;
ok ( SUCCEEDED ( hr ) , " DrawPrimitiveUP failed with 0x%08x \n " , hr ) ;
hr = IDirect3DDevice9_SetRenderState ( device , D3DRS_ZENABLE , D3DZB_TRUE ) ;
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetRenderState failed with 0x%08x \n " , hr ) ;
hr = IDirect3DDevice9_DrawPrimitiveUP ( device , D3DPT_TRIANGLESTRIP , 2 , quad2 , sizeof ( * quad2 ) ) ;
ok ( SUCCEEDED ( hr ) , " DrawPrimitiveUP failed with 0x%08x \n " , hr ) ;
hr = IDirect3DDevice9_EndScene ( device ) ;
ok ( hr = = D3D_OK , " IDirect3DDevice9_BeginScene failed with 0x%08x \n " , hr ) ;
}
hr = IDirect3DDevice9_Present ( device , NULL , NULL , NULL , NULL ) ;
ok ( SUCCEEDED ( hr ) , " IDirect3DDevice9_Present failed with 0x%08x \n " , hr ) ;
color = getPixelColor ( device , 320 , 240 ) ;
ok ( color_match ( color , 0x0000ff00 , 1 ) , " zwriteenable test returned 0x%08x, expected 0x0000ff00 \n " ,
color ) ;
hr = IDirect3DDevice9_SetRenderState ( device , D3DRS_ZENABLE , D3DZB_FALSE ) ;
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetRenderState failed with 0x%08x \n " , hr ) ;
}
2009-02-10 16:38:15 +00:00
static void alphatest_test ( IDirect3DDevice9 * device ) {
# define ALPHATEST_PASSED 0x0000ff00
# define ALPHATEST_FAILED 0x00ff0000
struct {
D3DCMPFUNC func ;
DWORD color_less ;
DWORD color_equal ;
DWORD color_greater ;
} testdata [ ] = {
{ D3DCMP_NEVER , ALPHATEST_FAILED , ALPHATEST_FAILED , ALPHATEST_FAILED } ,
{ D3DCMP_LESS , ALPHATEST_PASSED , ALPHATEST_FAILED , ALPHATEST_FAILED } ,
{ D3DCMP_EQUAL , ALPHATEST_FAILED , ALPHATEST_PASSED , ALPHATEST_FAILED } ,
{ D3DCMP_LESSEQUAL , ALPHATEST_PASSED , ALPHATEST_PASSED , ALPHATEST_FAILED } ,
{ D3DCMP_GREATER , ALPHATEST_FAILED , ALPHATEST_FAILED , ALPHATEST_PASSED } ,
{ D3DCMP_NOTEQUAL , ALPHATEST_PASSED , ALPHATEST_FAILED , ALPHATEST_PASSED } ,
{ D3DCMP_GREATEREQUAL , ALPHATEST_FAILED , ALPHATEST_PASSED , ALPHATEST_PASSED } ,
{ D3DCMP_ALWAYS , ALPHATEST_PASSED , ALPHATEST_PASSED , ALPHATEST_PASSED } ,
} ;
unsigned int i , j ;
HRESULT hr ;
DWORD color ;
struct vertex quad [ ] = {
{ - 1.0 , - 1.0 , 0.1 , ALPHATEST_PASSED | 0x80000000 } ,
{ 1.0 , - 1.0 , 0.1 , ALPHATEST_PASSED | 0x80000000 } ,
{ - 1.0 , 1.0 , 0.1 , ALPHATEST_PASSED | 0x80000000 } ,
{ 1.0 , 1.0 , 0.1 , ALPHATEST_PASSED | 0x80000000 } ,
} ;
D3DCAPS9 caps ;
hr = IDirect3DDevice9_SetRenderState ( device , D3DRS_ALPHATESTENABLE , TRUE ) ;
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetRenderState failed with 0x%08x \n " , hr ) ;
hr = IDirect3DDevice9_SetFVF ( device , D3DFVF_XYZ | D3DFVF_DIFFUSE ) ;
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetFVF failed with 0x%08x \n " , hr ) ;
for ( j = 0 ; j < 2 ; j + + ) {
if ( j = = 1 ) {
/* Try a pixel shader instead of fixed function. The wined3d code may emulate
* the alpha test either for performance reasons ( floating point RTs ) or to work
* around driver bugs ( Geforce 7 x00 cards on MacOS ) . There may be a different
* codepath for ffp and shader in this case , and the test should cover both
*/
IDirect3DPixelShader9 * ps ;
DWORD shader_code [ ] = {
0xffff0101 , /* ps_1_1 */
0x00000001 , 0x800f0000 , 0x90e40000 , /* mov r0, v0 */
0x0000ffff /* end */
} ;
memset ( & caps , 0 , sizeof ( caps ) ) ;
IDirect3DDevice9_GetDeviceCaps ( device , & caps ) ;
ok ( hr = = D3D_OK , " IDirect3DDevice9_GetDeviceCaps failed with 0x%08x \n " , hr ) ;
if ( caps . PixelShaderVersion < D3DPS_VERSION ( 1 , 1 ) ) {
break ;
}
hr = IDirect3DDevice9_CreatePixelShader ( device , shader_code , & ps ) ;
ok ( hr = = D3D_OK , " IDirect3DDevice9_CreatePixelShader failed with 0x%08x \n " , hr ) ;
IDirect3DDevice9_SetPixelShader ( device , ps ) ;
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetPixelShader failed with 0x%08x \n " , hr ) ;
IDirect3DPixelShader9_Release ( ps ) ;
}
for ( i = 0 ; i < ( sizeof ( testdata ) / sizeof ( testdata [ 0 ] ) ) ; i + + ) {
hr = IDirect3DDevice9_SetRenderState ( device , D3DRS_ALPHAFUNC , testdata [ i ] . func ) ;
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetRenderState failed with 0x%08x \n " , hr ) ;
hr = IDirect3DDevice9_Clear ( device , 0 , NULL , D3DCLEAR_TARGET , ALPHATEST_FAILED , 0.0 , 0 ) ;
ok ( hr = = D3D_OK , " IDirect3DDevice9_Clear failed with 0x%08x \n " , hr ) ;
hr = IDirect3DDevice9_SetRenderState ( device , D3DRS_ALPHAREF , 0x90 ) ;
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetRenderState failed with 0x%08x \n " , hr ) ;
hr = IDirect3DDevice9_BeginScene ( device ) ;
ok ( hr = = D3D_OK , " IDirect3DDevice9_BeginScene failed with 0x%08x \n " , hr ) ;
if ( SUCCEEDED ( hr ) ) {
hr = IDirect3DDevice9_DrawPrimitiveUP ( device , D3DPT_TRIANGLESTRIP , 2 , quad , sizeof ( * quad ) ) ;
ok ( SUCCEEDED ( hr ) , " DrawPrimitiveUP failed with 0x%08x \n " , hr ) ;
hr = IDirect3DDevice9_EndScene ( device ) ;
ok ( hr = = D3D_OK , " IDirect3DDevice9_EndScene failed with 0x%08x \n " , hr ) ;
}
hr = IDirect3DDevice9_Present ( device , NULL , NULL , NULL , NULL ) ;
ok ( SUCCEEDED ( hr ) , " IDirect3DDevice9_Present failed with 0x%08x \n " , hr ) ;
color = getPixelColor ( device , 320 , 240 ) ;
ok ( color_match ( color , testdata [ i ] . color_less , 1 ) , " Alphatest failed. Got color 0x%08x, expected 0x%08x. alpha < ref, func %u \n " ,
color , testdata [ i ] . color_less , testdata [ i ] . func ) ;
hr = IDirect3DDevice9_Clear ( device , 0 , NULL , D3DCLEAR_TARGET , ALPHATEST_FAILED , 0.0 , 0 ) ;
ok ( hr = = D3D_OK , " IDirect3DDevice9_Clear failed with 0x%08x \n " , hr ) ;
hr = IDirect3DDevice9_SetRenderState ( device , D3DRS_ALPHAREF , 0x80 ) ;
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetRenderState failed with 0x%08x \n " , hr ) ;
hr = IDirect3DDevice9_BeginScene ( device ) ;
ok ( hr = = D3D_OK , " IDirect3DDevice9_BeginScene failed with 0x%08x \n " , hr ) ;
if ( SUCCEEDED ( hr ) ) {
hr = IDirect3DDevice9_DrawPrimitiveUP ( device , D3DPT_TRIANGLESTRIP , 2 , quad , sizeof ( * quad ) ) ;
ok ( SUCCEEDED ( hr ) , " DrawPrimitiveUP failed with 0x%08x \n " , hr ) ;
hr = IDirect3DDevice9_EndScene ( device ) ;
ok ( hr = = D3D_OK , " IDirect3DDevice9_EndScene failed with 0x%08x \n " , hr ) ;
}
hr = IDirect3DDevice9_Present ( device , NULL , NULL , NULL , NULL ) ;
ok ( SUCCEEDED ( hr ) , " IDirect3DDevice9_Present failed with 0x%08x \n " , hr ) ;
color = getPixelColor ( device , 320 , 240 ) ;
ok ( color_match ( color , testdata [ i ] . color_equal , 1 ) , " Alphatest failed. Got color 0x%08x, expected 0x%08x. alpha == ref, func %u \n " ,
color , testdata [ i ] . color_equal , testdata [ i ] . func ) ;
hr = IDirect3DDevice9_Clear ( device , 0 , NULL , D3DCLEAR_TARGET , ALPHATEST_FAILED , 0.0 , 0 ) ;
ok ( hr = = D3D_OK , " IDirect3DDevice9_Clear failed with 0x%08x \n " , hr ) ;
hr = IDirect3DDevice9_SetRenderState ( device , D3DRS_ALPHAREF , 0x70 ) ;
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetRenderState failed with 0x%08x \n " , hr ) ;
hr = IDirect3DDevice9_BeginScene ( device ) ;
ok ( hr = = D3D_OK , " IDirect3DDevice9_BeginScene failed with 0x%08x \n " , hr ) ;
if ( SUCCEEDED ( hr ) ) {
hr = IDirect3DDevice9_DrawPrimitiveUP ( device , D3DPT_TRIANGLESTRIP , 2 , quad , sizeof ( * quad ) ) ;
ok ( SUCCEEDED ( hr ) , " DrawPrimitiveUP failed with 0x%08x \n " , hr ) ;
hr = IDirect3DDevice9_EndScene ( device ) ;
ok ( hr = = D3D_OK , " IDirect3DDevice9_EndScene failed with 0x%08x \n " , hr ) ;
}
hr = IDirect3DDevice9_Present ( device , NULL , NULL , NULL , NULL ) ;
ok ( SUCCEEDED ( hr ) , " IDirect3DDevice9_Present failed with 0x%08x \n " , hr ) ;
color = getPixelColor ( device , 320 , 240 ) ;
ok ( color_match ( color , testdata [ i ] . color_greater , 1 ) , " Alphatest failed. Got color 0x%08x, expected 0x%08x. alpha > ref, func %u \n " ,
color , testdata [ i ] . color_greater , testdata [ i ] . func ) ;
}
}
hr = IDirect3DDevice9_SetRenderState ( device , D3DRS_ALPHATESTENABLE , FALSE ) ;
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetRenderState failed with 0x%08x \n " , hr ) ;
IDirect3DDevice9_SetPixelShader ( device , NULL ) ;
ok ( hr = = D3D_OK , " IDirect3DDevice9_SetPixelShader failed with 0x%08x \n " , hr ) ;
}
2007-02-16 18:08:28 +00:00
START_TEST ( visual )
{
IDirect3DDevice9 * device_ptr ;
2007-03-06 21:35:45 +00:00
D3DCAPS9 caps ;
2007-02-16 18:08:28 +00:00
HRESULT hr ;
DWORD color ;
d3d9_handle = LoadLibraryA ( " d3d9.dll " ) ;
if ( ! d3d9_handle )
{
2007-03-12 10:41:16 +00:00
skip ( " Could not load d3d9.dll \n " ) ;
2007-02-16 18:08:28 +00:00
return ;
}
device_ptr = init_d3d9 ( ) ;
2007-07-24 19:29:19 +00:00
if ( ! device_ptr )
{
skip ( " Creating the device failed \n " ) ;
return ;
}
2007-02-16 18:08:28 +00:00
2007-03-06 21:35:45 +00:00
IDirect3DDevice9_GetDeviceCaps ( device_ptr , & caps ) ;
2007-02-16 18:08:28 +00:00
/* Check for the reliability of the returned data */
hr = IDirect3DDevice9_Clear ( device_ptr , 0 , NULL , D3DCLEAR_TARGET , 0xffff0000 , 0.0 , 0 ) ;
if ( FAILED ( hr ) )
{
2008-05-16 14:54:55 +00:00
skip ( " Clear failed, can't assure correctness of the test results, skipping \n " ) ;
2007-02-16 18:08:28 +00:00
goto cleanup ;
}
IDirect3DDevice9_Present ( device_ptr , NULL , NULL , NULL , NULL ) ;
color = getPixelColor ( device_ptr , 1 , 1 ) ;
if ( color ! = 0x00ff0000 )
{
2008-05-16 14:54:55 +00:00
skip ( " Sanity check returned an incorrect color(%08x), can't assure the correctness of the tests, skipping \n " , color ) ;
2007-02-16 18:08:28 +00:00
goto cleanup ;
}
hr = IDirect3DDevice9_Clear ( device_ptr , 0 , NULL , D3DCLEAR_TARGET , 0xff00ddee , 0.0 , 0 ) ;
if ( FAILED ( hr ) )
{
2008-05-16 14:54:55 +00:00
skip ( " Clear failed, can't assure correctness of the test results, skipping \n " ) ;
2007-02-16 18:08:28 +00:00
goto cleanup ;
}
IDirect3DDevice9_Present ( device_ptr , NULL , NULL , NULL , NULL ) ;
color = getPixelColor ( device_ptr , 639 , 479 ) ;
if ( color ! = 0x0000ddee )
{
2008-05-16 14:54:55 +00:00
skip ( " Sanity check returned an incorrect color(%08x), can't assure the correctness of the tests, skipping \n " , color ) ;
2007-02-16 18:08:28 +00:00
goto cleanup ;
}
2007-02-16 18:08:34 +00:00
/* Now execute the real tests */
2008-04-01 05:20:44 +00:00
stretchrect_test ( device_ptr ) ;
2007-02-16 18:08:34 +00:00
lighting_test ( device_ptr ) ;
2007-02-26 12:42:25 +00:00
clear_test ( device_ptr ) ;
2007-03-14 17:04:56 +00:00
fog_test ( device_ptr ) ;
2007-07-24 19:07:59 +00:00
if ( caps . TextureCaps & D3DPTEXTURECAPS_CUBEMAP )
{
test_cube_wrap ( device_ptr ) ;
} else {
skip ( " No cube texture support \n " ) ;
}
2007-08-31 18:32:52 +00:00
z_range_test ( device_ptr ) ;
2007-07-25 16:49:03 +00:00
if ( caps . TextureCaps & D3DPTEXTURECAPS_MIPMAP )
{
maxmip_test ( device_ptr ) ;
}
else
{
skip ( " No mipmap support \n " ) ;
}
2007-07-27 14:47:08 +00:00
offscreen_test ( device_ptr ) ;
2007-12-06 21:33:26 +00:00
alpha_test ( device_ptr ) ;
2008-03-21 16:10:44 +00:00
shademode_test ( device_ptr ) ;
2008-03-19 17:07:31 +00:00
srgbtexture_test ( device_ptr ) ;
2007-08-14 12:46:38 +00:00
release_buffer_test ( device_ptr ) ;
2007-08-12 14:24:29 +00:00
float_texture_test ( device_ptr ) ;
2007-12-15 22:47:10 +00:00
g16r16_texture_test ( device_ptr ) ;
2008-03-28 01:01:14 +00:00
pixelshader_blending_test ( device_ptr ) ;
2007-08-19 17:47:38 +00:00
texture_transform_flags_test ( device_ptr ) ;
2007-08-31 18:56:15 +00:00
autogen_mipmap_test ( device_ptr ) ;
2007-12-19 16:10:02 +00:00
fixed_function_decl_test ( device_ptr ) ;
2008-02-01 00:16:45 +00:00
conditional_np2_repeat_test ( device_ptr ) ;
2008-02-17 22:30:24 +00:00
fixed_function_bumpmap_test ( device_ptr ) ;
2008-02-17 22:31:55 +00:00
if ( caps . StencilCaps & D3DSTENCILCAPS_TWOSIDED ) {
stencil_cull_test ( device_ptr ) ;
} else {
skip ( " No two sided stencil support \n " ) ;
}
2008-02-17 22:35:39 +00:00
pointsize_test ( device_ptr ) ;
2008-04-01 14:00:20 +00:00
tssargtemp_test ( device_ptr ) ;
2008-04-23 14:19:19 +00:00
np2_stretch_rect_test ( device_ptr ) ;
2008-08-19 15:55:42 +00:00
yuv_color_test ( device_ptr ) ;
2008-09-08 01:04:34 +00:00
zwriteenable_test ( device_ptr ) ;
2009-02-10 16:38:15 +00:00
alphatest_test ( device_ptr ) ;
2007-08-19 17:47:38 +00:00
2007-09-13 11:34:29 +00:00
if ( caps . VertexShaderVersion > = D3DVS_VERSION ( 1 , 1 ) )
{
test_constant_clamp_vs ( device_ptr ) ;
2007-11-09 18:53:20 +00:00
test_compare_instructions ( device_ptr ) ;
2007-09-13 11:34:29 +00:00
}
else skip ( " No vs_1_1 support \n " ) ;
2007-03-06 21:35:45 +00:00
if ( caps . VertexShaderVersion > = D3DVS_VERSION ( 2 , 0 ) )
{
test_mova ( device_ptr ) ;
2007-11-21 21:16:12 +00:00
if ( caps . VertexShaderVersion > = D3DVS_VERSION ( 3 , 0 ) ) {
test_vshader_input ( device_ptr ) ;
2007-12-19 15:28:14 +00:00
test_vshader_float16 ( device_ptr ) ;
2008-04-06 14:43:32 +00:00
stream_test ( device_ptr ) ;
2007-11-21 21:16:12 +00:00
} else {
skip ( " No vs_3_0 support \n " ) ;
}
2007-03-06 21:35:45 +00:00
}
else skip ( " No vs_2_0 support \n " ) ;
2007-07-24 19:07:59 +00:00
if ( caps . VertexShaderVersion > = D3DVS_VERSION ( 1 , 1 ) & & caps . PixelShaderVersion > = D3DPS_VERSION ( 1 , 1 ) )
2007-03-22 16:41:22 +00:00
{
fog_with_shader_test ( device_ptr ) ;
2007-11-20 16:58:59 +00:00
fog_srgbwrite_test ( device_ptr ) ;
2007-03-22 16:41:22 +00:00
}
else skip ( " No vs_1_1 and ps_1_1 support \n " ) ;
2007-07-24 19:07:59 +00:00
if ( caps . PixelShaderVersion > = D3DPS_VERSION ( 1 , 1 ) )
2007-03-22 16:44:17 +00:00
{
texbem_test ( device_ptr ) ;
2007-08-31 15:00:16 +00:00
texdepth_test ( device_ptr ) ;
2007-08-30 21:35:50 +00:00
texkill_test ( device_ptr ) ;
2007-09-01 18:00:10 +00:00
x8l8v8u8_test ( device_ptr ) ;
2007-09-13 11:34:29 +00:00
if ( caps . PixelShaderVersion > = D3DPS_VERSION ( 1 , 4 ) ) {
constant_clamp_ps_test ( device_ptr ) ;
2007-09-13 10:16:09 +00:00
cnd_test ( device_ptr ) ;
2008-04-01 05:03:11 +00:00
if ( caps . PixelShaderVersion > = D3DPS_VERSION ( 2 , 0 ) ) {
dp2add_ps_test ( device_ptr ) ;
if ( caps . PixelShaderVersion > = D3DPS_VERSION ( 3 , 0 ) ) {
nested_loop_test ( device_ptr ) ;
fixed_function_varying_test ( device_ptr ) ;
vFace_register_test ( device_ptr ) ;
vpos_register_test ( device_ptr ) ;
multiple_rendertargets_test ( device_ptr ) ;
if ( caps . VertexShaderVersion > = D3DVS_VERSION ( 3 , 0 ) ) {
vshader_version_varying_test ( device_ptr ) ;
pshader_version_varying_test ( device_ptr ) ;
} else {
skip ( " No vs_3_0 support \n " ) ;
}
2007-11-06 19:33:33 +00:00
} else {
2008-04-01 05:03:11 +00:00
skip ( " No ps_3_0 support \n " ) ;
2007-11-06 19:33:33 +00:00
}
2007-10-09 20:12:59 +00:00
} else {
2008-04-01 05:03:11 +00:00
skip ( " No ps_2_0 support \n " ) ;
2007-10-09 20:12:59 +00:00
}
2007-09-13 11:34:29 +00:00
}
2007-03-22 16:44:17 +00:00
}
else skip ( " No ps_1_1 support \n " ) ;
2008-08-26 19:11:47 +00:00
2008-05-24 08:33:42 +00:00
texop_test ( device_ptr ) ;
2008-08-14 21:29:47 +00:00
texop_range_test ( device_ptr ) ;
2008-08-19 15:43:03 +00:00
alphareplicate_test ( device_ptr ) ;
2008-08-26 19:11:47 +00:00
dp3_alpha_test ( device_ptr ) ;
2007-03-22 16:44:17 +00:00
2007-02-16 18:08:28 +00:00
cleanup :
2007-11-06 19:05:49 +00:00
if ( device_ptr ) {
2007-11-21 21:16:12 +00:00
ULONG ref ;
2007-11-06 19:05:49 +00:00
D3DPRESENT_PARAMETERS present_parameters ;
IDirect3DSwapChain9 * swapchain ;
IDirect3DDevice9_GetSwapChain ( device_ptr , 0 , & swapchain ) ;
IDirect3DSwapChain9_GetPresentParameters ( swapchain , & present_parameters ) ;
IDirect3DSwapChain9_Release ( swapchain ) ;
2007-11-21 21:16:12 +00:00
ref = IDirect3DDevice9_Release ( device_ptr ) ;
2007-11-06 19:05:49 +00:00
DestroyWindow ( present_parameters . hDeviceWindow ) ;
2007-11-21 21:16:12 +00:00
ok ( ref = = 0 , " The device was not properly freed: refcount %u \n " , ref ) ;
2007-11-06 19:05:49 +00:00
}
2007-02-16 18:08:28 +00:00
}