/** * It creates the picture and scene resources. */ static int Direct3DCreateResources(vout_display_t *vd, video_format_t *fmt) { vout_display_sys_t *sys = vd->sys; if (Direct3DCreatePool(vd, fmt)) { msg_Err(vd, "Direct3D picture pool initialization failed"); return VLC_EGENERIC; } if (Direct3DCreateScene(vd, fmt)) { msg_Err(vd, "Direct3D scene initialization failed !"); return VLC_EGENERIC; } sys->d3dregion_format = D3DFMT_UNKNOWN; for (int i = 0; i < 2; i++) { D3DFORMAT fmt = i == 0 ? D3DFMT_A8B8G8R8 : D3DFMT_A8R8G8B8; if (SUCCEEDED(IDirect3D9_CheckDeviceFormat(sys->d3dobj, D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, sys->d3dpp.BackBufferFormat, D3DUSAGE_DYNAMIC, D3DRTYPE_TEXTURE, fmt))) { sys->d3dregion_format = fmt; break; } } return VLC_SUCCESS; }
/** * It tests if the conversion from src to dst is supported. */ static int Direct3DCheckConversion(vout_display_t *vd, D3DFORMAT src, D3DFORMAT dst) { vout_display_sys_t *sys = vd->sys; LPDIRECT3D9 d3dobj = sys->d3dobj; HRESULT hr; /* test whether device can create a surface of that format */ hr = IDirect3D9_CheckDeviceFormat(d3dobj, D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, dst, 0, D3DRTYPE_SURFACE, src); if (SUCCEEDED(hr)) { /* test whether device can perform color-conversion ** from that format to target format */ hr = IDirect3D9_CheckDeviceFormatConversion(d3dobj, D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, src, dst); } if (!SUCCEEDED(hr)) { if (D3DERR_NOTAVAILABLE != hr) msg_Err(vd, "Could not query adapter supported formats. (hr=0x%lX)", hr); return VLC_EGENERIC; } return VLC_SUCCESS; }
static void test_cube_texture_mipmap_gen(IDirect3DDevice9 *device_ptr) { IDirect3DCubeTexture9 *texture_ptr = NULL; IDirect3D9 *d3d9; HRESULT hr; hr = IDirect3DDevice9_GetDirect3D(device_ptr, &d3d9); ok(hr == D3D_OK, "IDirect3DDevice9_GetDirect3D returned 0x%08x\n", hr); hr = IDirect3D9_CheckDeviceFormat(d3d9, 0, D3DDEVTYPE_HAL, D3DFMT_X8R8G8B8, D3DUSAGE_AUTOGENMIPMAP, D3DRTYPE_CUBETEXTURE, D3DFMT_X8R8G8B8); if(FAILED(hr)) { skip("No cube mipmap generation support\n"); return; } /* testing shows that autogenmipmap and rendertarget are mutually exclusive options */ hr = IDirect3DDevice9_CreateCubeTexture(device_ptr, 64, 0, (D3DUSAGE_RENDERTARGET | D3DUSAGE_AUTOGENMIPMAP), D3DFMT_X8R8G8B8, D3DPOOL_DEFAULT, &texture_ptr, 0); ok(hr == D3D_OK, "IDirect3DDevice9_CreateTexture returned 0x%08x, expected 0x%08x\n", hr, D3D_OK); if (texture_ptr) IDirect3DCubeTexture9_Release(texture_ptr); texture_ptr = NULL; hr = IDirect3DDevice9_CreateCubeTexture(device_ptr, 64, 0, D3DUSAGE_AUTOGENMIPMAP, D3DFMT_X8R8G8B8, D3DPOOL_MANAGED, &texture_ptr, 0); ok(hr == D3D_OK, "IDirect3DDevice9_CreateTexture failed (0x%08x)\n", hr); if (texture_ptr) IDirect3DCubeTexture9_Release(texture_ptr); texture_ptr = NULL; }
static SDL_bool D3D_IsTextureFormatAvailable(IDirect3D9 * d3d, Uint32 display_format, Uint32 texture_format) { HRESULT result; result = IDirect3D9_CheckDeviceFormat(d3d, D3DADAPTER_DEFAULT, /* FIXME */ D3DDEVTYPE_HAL, PixelFormatToD3DFMT(display_format), 0, D3DRTYPE_TEXTURE, PixelFormatToD3DFMT (texture_format)); return FAILED(result) ? SDL_FALSE : SDL_TRUE; }
ILvoid CheckFormatsDX9(IDirect3DDevice9 *Device) { D3DDISPLAYMODE DispMode; HRESULT hr; IDirect3D9 *TestD3D9; ILuint i; IDirect3DDevice9_GetDirect3D(Device, (IDirect3D9**)&TestD3D9); IDirect3DDevice9_GetDisplayMode(Device, 0, &DispMode); for (i = 0; i < 6; i++) { hr = IDirect3D9_CheckDeviceFormat(TestD3D9, D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, DispMode.Format, 0, D3DRTYPE_TEXTURE, FormatsDX9[i]); FormatsDX9supported[i] = SUCCEEDED(hr); } IDirect3D9_Release(TestD3D9); FormatsDX9Checked = IL_TRUE; return; }
static HRESULT check_device_format(base *d3dptr, UINT adapter, D3DDEVTYPE devtype, D3DFORMAT adapterformat, DWORD usage, D3DRESOURCETYPE restype, D3DFORMAT format) { IDirect3D9 *d3d9 = (IDirect3D9 *)d3dptr->d3dobj; return IDirect3D9_CheckDeviceFormat(d3d9, adapter, devtype, adapterformat, usage, restype, format); }
static void test_D3DXCheckTextureRequirements(IDirect3DDevice9 *device) { UINT width, height, mipmaps; D3DFORMAT format, expected; D3DCAPS9 caps; HRESULT hr; IDirect3D9 *d3d; D3DDEVICE_CREATION_PARAMETERS params; D3DDISPLAYMODE mode; IDirect3DDevice9_GetDeviceCaps(device, &caps); /* general tests */ hr = D3DXCheckTextureRequirements(device, NULL, NULL, NULL, 0, NULL, D3DPOOL_DEFAULT); ok(hr == D3D_OK, "D3DXCheckTextureRequirements returned %#x, expected %#x\n", hr, D3D_OK); hr = D3DXCheckTextureRequirements(device, NULL, NULL, NULL, D3DX_DEFAULT, NULL, D3DPOOL_DEFAULT); ok(hr == D3D_OK, "D3DXCheckTextureRequirements returned %#x, expected %#x\n", hr, D3D_OK); hr = D3DXCheckTextureRequirements(NULL, NULL, NULL, NULL, D3DX_DEFAULT, NULL, D3DPOOL_DEFAULT); ok(hr == D3DERR_INVALIDCALL, "D3DXCheckTextureRequirements returned %#x, expected %#x\n", hr, D3DERR_INVALIDCALL); /* width & height */ width = height = D3DX_DEFAULT; hr = D3DXCheckTextureRequirements(device, &width, &height, NULL, 0, NULL, D3DPOOL_DEFAULT); ok(hr == D3D_OK, "D3DXCheckTextureRequirements returned %#x, expected %#x\n", hr, D3D_OK); ok(width == 256, "Returned width %d, expected %d\n", width, 256); ok(height == 256, "Returned height %d, expected %d\n", height, 256); width = D3DX_DEFAULT; hr = D3DXCheckTextureRequirements(device, &width, NULL, NULL, 0, NULL, D3DPOOL_DEFAULT); ok(hr == D3D_OK, "D3DXCheckTextureRequirements returned %#x, expected %#x\n", hr, D3D_OK); ok(width == 256, "Returned width %d, expected %d\n", width, 256); if (caps.TextureCaps & D3DPTEXTURECAPS_POW2) skip("Hardware only supports pow2 textures\n"); else { width = 62; hr = D3DXCheckTextureRequirements(device, &width, NULL, NULL, 0, NULL, D3DPOOL_DEFAULT); ok(hr == D3D_OK, "D3DXCheckTextureRequirements returned %#x, expected %#x\n", hr, D3D_OK); ok(width == 62, "Returned width %d, expected %d\n", width, 62); width = D3DX_DEFAULT; height = 63; hr = D3DXCheckTextureRequirements(device, &width, &height, NULL, 0, NULL, D3DPOOL_DEFAULT); ok(hr == D3D_OK, "D3DXCheckTextureRequirements returned %#x, expected %#x\n", hr, D3D_OK); ok(width == height, "Returned width %d, expected %d\n", width, height); ok(height == 63, "Returned height %d, expected %d\n", height, 63); } width = D3DX_DEFAULT; height = 0; hr = D3DXCheckTextureRequirements(device, &width, &height, NULL, 0, NULL, D3DPOOL_DEFAULT); ok(hr == D3D_OK, "D3DXCheckTextureRequirements returned %#x, expected %#x\n", hr, D3D_OK); ok(width == 1, "Returned width %d, expected %d\n", width, 1); ok(height == 1, "Returned height %d, expected %d\n", height, 1); width = 0; height = 0; hr = D3DXCheckTextureRequirements(device, &width, &height, NULL, 0, NULL, D3DPOOL_DEFAULT); ok(hr == D3D_OK, "D3DXCheckTextureRequirements returned %#x, expected %#x\n", hr, D3D_OK); ok(width == 1, "Returned width %d, expected %d\n", width, 1); ok(height == 1, "Returned height %d, expected %d\n", height, 1); width = 0; hr = D3DXCheckTextureRequirements(device, &width, NULL, NULL, 0, NULL, D3DPOOL_DEFAULT); ok(hr == D3D_OK, "D3DXCheckTextureRequirements returned %#x, expected %#x\n", hr, D3D_OK); ok(width == 1, "Returned width %d, expected %d\n", width, 1); width = D3DX_DEFAULT; hr = D3DXCheckTextureRequirements(device, &width, NULL, NULL, 0, NULL, D3DPOOL_DEFAULT); ok(hr == D3D_OK, "D3DXCheckTextureRequirements returned %#x, expected %#x\n", hr, D3D_OK); ok(width == 256, "Returned width %d, expected %d\n", width, 256); width = 0xFFFFFFFE; hr = D3DXCheckTextureRequirements(device, &width, NULL, NULL, 0, NULL, D3DPOOL_DEFAULT); ok(hr == D3D_OK, "D3DXCheckTextureRequirements returned %#x, expected %#x\n", hr, D3D_OK); ok(width == caps.MaxTextureWidth, "Returned width %d, expected %d\n", width, caps.MaxTextureWidth); width = caps.MaxTextureWidth-1; hr = D3DXCheckTextureRequirements(device, &width, NULL, NULL, 0, NULL, D3DPOOL_DEFAULT); ok(hr == D3D_OK, "D3DXCheckTextureRequirements returned %#x, expected %#x\n", hr, D3D_OK); ok(width == caps.MaxTextureWidth-1, "Returned width %d, expected %d\n", width, caps.MaxTextureWidth-1); /* mipmaps */ width = 64; height = 63; mipmaps = 9; hr = D3DXCheckTextureRequirements(device, &width, &height, &mipmaps, 0, NULL, D3DPOOL_DEFAULT); ok(hr == D3D_OK, "D3DXCheckTextureRequirements returned %#x, expected %#x\n", hr, D3D_OK); ok(mipmaps == 7, "Returned mipmaps %d, expected %d\n", mipmaps, 7); width = 284; height = 137; mipmaps = 20; hr = D3DXCheckTextureRequirements(device, &width, &height, &mipmaps, 0, NULL, D3DPOOL_DEFAULT); ok(hr == D3D_OK, "D3DXCheckTextureRequirements returned %#x, expected %#x\n", hr, D3D_OK); ok(mipmaps == 9, "Returned mipmaps %d, expected %d\n", mipmaps, 9); width = height = 63; mipmaps = 9; hr = D3DXCheckTextureRequirements(device, &width, &height, &mipmaps, 0, NULL, D3DPOOL_DEFAULT); ok(hr == D3D_OK, "D3DXCheckTextureRequirements returned %#x, expected %#x\n", hr, D3D_OK); ok(mipmaps == 6, "Returned mipmaps %d, expected %d\n", mipmaps, 6); mipmaps = 20; hr = D3DXCheckTextureRequirements(device, NULL, NULL, &mipmaps, 0, NULL, D3DPOOL_DEFAULT); ok(hr == D3D_OK, "D3DXCheckTextureRequirements returned %#x, expected %#x\n", hr, D3D_OK); ok(mipmaps == 9, "Returned mipmaps %d, expected %d\n", mipmaps, 9); mipmaps = 0; hr = D3DXCheckTextureRequirements(device, NULL, NULL, &mipmaps, 0, NULL, D3DPOOL_DEFAULT); ok(hr == D3D_OK, "D3DXCheckTextureRequirements returned %#x, expected %#x\n", hr, D3D_OK); ok(mipmaps == 9, "Returned mipmaps %d, expected %d\n", mipmaps, 9); /* usage */ hr = D3DXCheckTextureRequirements(device, NULL, NULL, NULL, D3DUSAGE_WRITEONLY, NULL, D3DPOOL_DEFAULT); ok(hr == D3DERR_INVALIDCALL, "D3DXCheckTextureRequirements succeeded, but should've failed.\n"); hr = D3DXCheckTextureRequirements(device, NULL, NULL, NULL, D3DUSAGE_DONOTCLIP, NULL, D3DPOOL_DEFAULT); ok(hr == D3DERR_INVALIDCALL, "D3DXCheckTextureRequirements succeeded, but should've failed.\n"); hr = D3DXCheckTextureRequirements(device, NULL, NULL, NULL, D3DUSAGE_POINTS, NULL, D3DPOOL_DEFAULT); ok(hr == D3DERR_INVALIDCALL, "D3DXCheckTextureRequirements succeeded, but should've failed.\n"); hr = D3DXCheckTextureRequirements(device, NULL, NULL, NULL, D3DUSAGE_RTPATCHES, NULL, D3DPOOL_DEFAULT); ok(hr == D3DERR_INVALIDCALL, "D3DXCheckTextureRequirements succeeded, but should've failed.\n"); hr = D3DXCheckTextureRequirements(device, NULL, NULL, NULL, D3DUSAGE_NPATCHES, NULL, D3DPOOL_DEFAULT); ok(hr == D3DERR_INVALIDCALL, "D3DXCheckTextureRequirements succeeded, but should've failed.\n"); /* format */ hr = D3DXCheckTextureRequirements(device, NULL, NULL, NULL, 0, NULL, D3DPOOL_DEFAULT); ok(hr == D3D_OK, "D3DXCheckTextureRequirements returned %#x, expected %#x\n", hr, D3D_OK); format = D3DFMT_UNKNOWN; hr = D3DXCheckTextureRequirements(device, NULL, NULL, NULL, 0, &format, D3DPOOL_DEFAULT); ok(hr == D3D_OK, "D3DXCheckTextureRequirements returned %#x, expected %#x\n", hr, D3D_OK); ok(format == D3DFMT_A8R8G8B8, "Returned format %u, expected %u\n", format, D3DFMT_A8R8G8B8); format = D3DX_DEFAULT; hr = D3DXCheckTextureRequirements(device, NULL, NULL, NULL, 0, &format, D3DPOOL_DEFAULT); ok(hr == D3D_OK, "D3DXCheckTextureRequirements returned %#x, expected %#x\n", hr, D3D_OK); ok(format == D3DFMT_A8R8G8B8, "Returned format %u, expected %u\n", format, D3DFMT_A8R8G8B8); format = D3DFMT_R8G8B8; hr = D3DXCheckTextureRequirements(device, NULL, NULL, NULL, 0, &format, D3DPOOL_DEFAULT); ok(hr == D3D_OK, "D3DXCheckTextureRequirements returned %#x, expected %#x\n", hr, D3D_OK); ok(format == D3DFMT_X8R8G8B8, "Returned format %u, expected %u\n", format, D3DFMT_X8R8G8B8); IDirect3DDevice9_GetDirect3D(device, &d3d); IDirect3DDevice9_GetCreationParameters(device, ¶ms); IDirect3DDevice9_GetDisplayMode(device, 0, &mode); if(SUCCEEDED(IDirect3D9_CheckDeviceFormat(d3d, params.AdapterOrdinal, params.DeviceType, mode.Format, 0, D3DRTYPE_TEXTURE, D3DFMT_R3G3B2))) expected = D3DFMT_R3G3B2; else expected = D3DFMT_X4R4G4B4; format = D3DFMT_R3G3B2; hr = D3DXCheckTextureRequirements(device, NULL, NULL, NULL, 0, &format, D3DPOOL_DEFAULT); ok(hr == D3D_OK, "D3DXCheckTextureRequirements returned %#x, expected %#x\n", hr, D3D_OK); ok(format == expected, "Returned format %u, expected %u\n", format, expected); if(SUCCEEDED(IDirect3D9_CheckDeviceFormat(d3d, params.AdapterOrdinal, params.DeviceType, mode.Format, 0, D3DRTYPE_TEXTURE, D3DFMT_A8R3G3B2))) expected = D3DFMT_A8R3G3B2; else expected = D3DFMT_A8R8G8B8; format = D3DFMT_A8R3G3B2; hr = D3DXCheckTextureRequirements(device, NULL, NULL, NULL, 0, &format, D3DPOOL_DEFAULT); ok(hr == D3D_OK, "D3DXCheckTextureRequirements returned %#x, expected %#x\n", hr, D3D_OK); ok(format == expected, "Returned format %u, expected %u\n", format, expected); IDirect3D9_Release(d3d); }
static void test_ID3DXSprite(IDirect3DDevice9 *device) { ID3DXSprite *sprite; IDirect3D9 *d3d; IDirect3DDevice9 *cmpdev; IDirect3DTexture9 *tex1, *tex2; D3DXMATRIX mat, cmpmat; D3DVIEWPORT9 vp; RECT rect; D3DXVECTOR3 pos, center; HRESULT hr; IDirect3DDevice9_GetDirect3D(device, &d3d); hr = IDirect3D9_CheckDeviceFormat(d3d, D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, D3DFMT_X8R8G8B8, D3DUSAGE_DYNAMIC, D3DRTYPE_TEXTURE, D3DFMT_A8R8G8B8); IDirect3D9_Release(d3d); ok (hr == D3D_OK, "D3DFMT_A8R8G8B8 not supported\n"); if (FAILED(hr)) return; hr = IDirect3DDevice9_CreateTexture(device, 64, 64, 1, 0, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &tex1, NULL); ok (hr == D3D_OK, "Failed to create first texture (error code: %#x)\n", hr); if (FAILED(hr)) return; hr = IDirect3DDevice9_CreateTexture(device, 32, 32, 1, 0, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &tex2, NULL); ok (hr == D3D_OK, "Failed to create second texture (error code: %#x)\n", hr); if (FAILED(hr)) { IDirect3DTexture9_Release(tex1); return; } /* Test D3DXCreateSprite */ hr = D3DXCreateSprite(device, NULL); ok (hr == D3DERR_INVALIDCALL, "D3DXCreateSprite returned %#x, expected %#x\n", hr, D3DERR_INVALIDCALL); hr = D3DXCreateSprite(NULL, &sprite); ok (hr == D3DERR_INVALIDCALL, "D3DXCreateSprite returned %#x, expected %#x\n", hr, D3DERR_INVALIDCALL); hr = D3DXCreateSprite(device, &sprite); ok (hr == D3D_OK, "D3DXCreateSprite returned %#x, expected %#x\n", hr, D3D_OK); /* Test ID3DXSprite_GetDevice */ hr = ID3DXSprite_GetDevice(sprite, NULL); ok (hr == D3DERR_INVALIDCALL, "GetDevice returned %#x, expected %#x\n", hr, D3DERR_INVALIDCALL); hr = ID3DXSprite_GetDevice(sprite, &cmpdev); /* cmpdev == NULL */ ok (hr == D3D_OK, "GetDevice returned %#x, expected %#x\n", hr, D3D_OK); hr = ID3DXSprite_GetDevice(sprite, &cmpdev); /* cmpdev != NULL */ ok (hr == D3D_OK, "GetDevice returned %#x, expected %#x\n", hr, D3D_OK); IDirect3DDevice9_Release(device); IDirect3DDevice9_Release(device); /* Test ID3DXSprite_GetTransform */ hr = ID3DXSprite_GetTransform(sprite, NULL); ok (hr == D3DERR_INVALIDCALL, "GetTransform returned %#x, expected %#x\n", hr, D3DERR_INVALIDCALL); hr = ID3DXSprite_GetTransform(sprite, &mat); ok (hr == D3D_OK, "GetTransform returned %#x, expected %#x\n", hr, D3D_OK); if(SUCCEEDED(hr)) { D3DXMATRIX identity; D3DXMatrixIdentity(&identity); check_mat(mat, identity); } /* Test ID3DXSprite_SetTransform */ /* Set a transform and test if it gets returned correctly */ U(mat).m[0][0]=2.1f; U(mat).m[0][1]=6.5f; U(mat).m[0][2]=-9.6f; U(mat).m[0][3]=1.7f; U(mat).m[1][0]=4.2f; U(mat).m[1][1]=-2.5f; U(mat).m[1][2]=2.1f; U(mat).m[1][3]=5.5f; U(mat).m[2][0]=-2.6f; U(mat).m[2][1]=0.3f; U(mat).m[2][2]=8.6f; U(mat).m[2][3]=8.4f; U(mat).m[3][0]=6.7f; U(mat).m[3][1]=-5.1f; U(mat).m[3][2]=6.1f; U(mat).m[3][3]=2.2f; hr = ID3DXSprite_SetTransform(sprite, NULL); ok (hr == D3DERR_INVALIDCALL, "SetTransform returned %#x, expected %#x\n", hr, D3DERR_INVALIDCALL); hr = ID3DXSprite_SetTransform(sprite, &mat); ok (hr == D3D_OK, "SetTransform returned %#x, expected %#x\n", hr, D3D_OK); if(SUCCEEDED(hr)) { hr=ID3DXSprite_GetTransform(sprite, &cmpmat); if(SUCCEEDED(hr)) check_mat(cmpmat, mat); else skip("GetTransform returned %#x\n", hr); } /* Test ID3DXSprite_SetWorldViewLH/RH */ todo_wine { hr = ID3DXSprite_SetWorldViewLH(sprite, &mat, &mat); ok (hr == D3D_OK, "SetWorldViewLH returned %#x, expected %#x\n", hr, D3D_OK); hr = ID3DXSprite_SetWorldViewLH(sprite, NULL, &mat); ok (hr == D3D_OK, "SetWorldViewLH returned %#x, expected %#x\n", hr, D3D_OK); hr = ID3DXSprite_SetWorldViewLH(sprite, &mat, NULL); ok (hr == D3D_OK, "SetWorldViewLH returned %#x, expected %#x\n", hr, D3D_OK); hr = ID3DXSprite_SetWorldViewLH(sprite, NULL, NULL); ok (hr == D3D_OK, "SetWorldViewLH returned %#x, expected %#x\n", hr, D3D_OK); hr = ID3DXSprite_SetWorldViewRH(sprite, &mat, &mat); ok (hr == D3D_OK, "SetWorldViewRH returned %#x, expected %#x\n", hr, D3D_OK); hr = ID3DXSprite_SetWorldViewRH(sprite, NULL, &mat); ok (hr == D3D_OK, "SetWorldViewRH returned %#x, expected %#x\n", hr, D3D_OK); hr = ID3DXSprite_SetWorldViewRH(sprite, &mat, NULL); ok (hr == D3D_OK, "SetWorldViewRH returned %#x, expected %#x\n", hr, D3D_OK); hr = ID3DXSprite_SetWorldViewRH(sprite, NULL, NULL); ok (hr == D3D_OK, "SetWorldViewRH returned %#x, expected %#x\n", hr, D3D_OK); } IDirect3DDevice9_BeginScene(device); /* Test ID3DXSprite_Begin*/ hr = ID3DXSprite_Begin(sprite, 0); ok (hr == D3D_OK, "Begin returned %#x, expected %#x\n", hr, D3D_OK); IDirect3DDevice9_GetTransform(device, D3DTS_WORLD, &mat); D3DXMatrixIdentity(&cmpmat); check_mat(mat, cmpmat); IDirect3DDevice9_GetTransform(device, D3DTS_VIEW, &mat); check_mat(mat, cmpmat); IDirect3DDevice9_GetTransform(device, D3DTS_PROJECTION, &mat); IDirect3DDevice9_GetViewport(device, &vp); D3DXMatrixOrthoOffCenterLH(&cmpmat, vp.X+0.5f, (float)vp.Width+vp.X+0.5f, (float)vp.Height+vp.Y+0.5f, vp.Y+0.5f, vp.MinZ, vp.MaxZ); check_mat(mat, cmpmat); /* Test ID3DXSprite_Flush and ID3DXSprite_End */ hr = ID3DXSprite_Flush(sprite); ok (hr == D3D_OK, "Flush returned %#x, expected %#x\n", hr, D3D_OK); hr = ID3DXSprite_End(sprite); ok (hr == D3D_OK, "End returned %#x, expected %#x\n", hr, D3D_OK); hr = ID3DXSprite_Flush(sprite); /* May not be called before next Begin */ ok (hr == D3DERR_INVALIDCALL, "Flush returned %#x, expected %#x\n", hr, D3DERR_INVALIDCALL); hr = ID3DXSprite_End(sprite); ok (hr == D3DERR_INVALIDCALL, "End returned %#x, expected %#x\n", hr, D3DERR_INVALIDCALL); /* Test ID3DXSprite_Draw */ hr = ID3DXSprite_Begin(sprite, 0); ok (hr == D3D_OK, "Begin returned %#x, expected %#x\n", hr, D3D_OK); if(FAILED(hr)) skip("Couldn't ID3DXSprite_Begin, can't test ID3DXSprite_Draw\n"); else { /* Feed the sprite batch */ int texref1, texref2; SetRect(&rect, 53, 12, 142, 165); pos.x = 2.2f; pos.y = 4.5f; pos.z = 5.1f; center.x = 11.3f; center.y = 3.4f; center.z = 1.2f; texref1 = get_ref((IUnknown*)tex1); texref2 = get_ref((IUnknown*)tex2); hr = ID3DXSprite_Draw(sprite, NULL, &rect, ¢er, &pos, D3DCOLOR_XRGB(255, 255, 255)); ok (hr == D3DERR_INVALIDCALL, "Draw returned %#x, expected %#x\n", hr, D3DERR_INVALIDCALL); hr = ID3DXSprite_Draw(sprite, tex1, &rect, ¢er, &pos, D3DCOLOR_XRGB(255, 255, 255)); ok (hr == D3D_OK, "Draw returned %#x, expected %#x\n", hr, D3D_OK); hr = ID3DXSprite_Draw(sprite, tex2, &rect, ¢er, &pos, D3DCOLOR_XRGB( 3, 45, 66)); ok (hr == D3D_OK, "Draw returned %#x, expected %#x\n", hr, D3D_OK); hr = ID3DXSprite_Draw(sprite, tex1, NULL, ¢er, &pos, D3DCOLOR_XRGB(255, 255, 255)); ok (hr == D3D_OK, "Draw returned %#x, expected %#x\n", hr, D3D_OK); hr = ID3DXSprite_Draw(sprite, tex1, &rect, NULL, &pos, D3DCOLOR_XRGB(255, 255, 255)); ok (hr == D3D_OK, "Draw returned %#x, expected %#x\n", hr, D3D_OK); hr = ID3DXSprite_Draw(sprite, tex1, &rect, ¢er, NULL, D3DCOLOR_XRGB(255, 255, 255)); ok (hr == D3D_OK, "Draw returned %#x, expected %#x\n", hr, D3D_OK); hr = ID3DXSprite_Draw(sprite, tex1, NULL, NULL, NULL, 0); ok (hr == D3D_OK, "Draw returned %#x, expected %#x\n", hr, D3D_OK); check_ref((IUnknown*)tex1, texref1+5); check_ref((IUnknown*)tex2, texref2+1); hr = ID3DXSprite_Flush(sprite); ok (hr == D3D_OK, "Flush returned %#x, expected %#x\n", hr, D3D_OK); hr = ID3DXSprite_Flush(sprite); /* Flushing twice should work */ ok (hr == D3D_OK, "Flush returned %#x, expected %#x\n", hr, D3D_OK); check_ref((IUnknown*)tex1, texref1); check_ref((IUnknown*)tex2, texref2); hr = ID3DXSprite_End(sprite); ok (hr == D3D_OK, "End returned %#x, expected %#x\n", hr, D3D_OK); } /* Test ID3DXSprite_OnLostDevice and ID3DXSprite_OnResetDevice */ /* Both can be called twice */ hr = ID3DXSprite_OnLostDevice(sprite); ok (hr == D3D_OK, "OnLostDevice returned %#x, expected %#x\n", hr, D3D_OK); hr = ID3DXSprite_OnLostDevice(sprite); ok (hr == D3D_OK, "OnLostDevice returned %#x, expected %#x\n", hr, D3D_OK); hr = ID3DXSprite_OnResetDevice(sprite); ok (hr == D3D_OK, "OnResetDevice returned %#x, expected %#x\n", hr, D3D_OK); hr = ID3DXSprite_OnResetDevice(sprite); ok (hr == D3D_OK, "OnResetDevice returned %#x, expected %#x\n", hr, D3D_OK); /* Make sure everything works like before */ hr = ID3DXSprite_Begin(sprite, 0); ok (hr == D3D_OK, "Begin returned %#x, expected %#x\n", hr, D3D_OK); hr = ID3DXSprite_Draw(sprite, tex2, &rect, ¢er, &pos, D3DCOLOR_XRGB(255, 255, 255)); ok (hr == D3D_OK, "Draw returned %#x, expected %#x\n", hr, D3D_OK); hr = ID3DXSprite_Flush(sprite); ok (hr == D3D_OK, "Flush returned %#x, expected %#x\n", hr, D3D_OK); hr = ID3DXSprite_End(sprite); ok (hr == D3D_OK, "End returned %#x, expected %#x\n", hr, D3D_OK); /* OnResetDevice makes the interface "forget" the Begin call */ hr = ID3DXSprite_Begin(sprite, 0); ok (hr == D3D_OK, "Begin returned %#x, expected %#x\n", hr, D3D_OK); hr = ID3DXSprite_OnResetDevice(sprite); ok (hr == D3D_OK, "OnResetDevice returned %#x, expected %#x\n", hr, D3D_OK); hr = ID3DXSprite_End(sprite); ok (hr == D3DERR_INVALIDCALL, "End returned %#x, expected %#x\n", hr, D3DERR_INVALIDCALL); IDirect3DDevice9_EndScene(device); check_release((IUnknown*)sprite, 0); check_release((IUnknown*)tex2, 0); check_release((IUnknown*)tex1, 0); }
static void test_filter(IDirect3DDevice9 *device) { HRESULT hr; IDirect3DTexture9 *texture; IDirect3D9 *d3d9; DWORD passes = 0; unsigned int i; struct filter_tests { DWORD magfilter, minfilter, mipfilter; BOOL has_texture; HRESULT result; } tests[] = { { D3DTEXF_NONE, D3DTEXF_NONE, D3DTEXF_NONE, FALSE, D3DERR_UNSUPPORTEDTEXTUREFILTER }, { D3DTEXF_POINT, D3DTEXF_NONE, D3DTEXF_NONE, FALSE, D3DERR_UNSUPPORTEDTEXTUREFILTER }, { D3DTEXF_NONE, D3DTEXF_POINT, D3DTEXF_NONE, FALSE, D3DERR_UNSUPPORTEDTEXTUREFILTER }, { D3DTEXF_POINT, D3DTEXF_POINT, D3DTEXF_NONE, FALSE, D3D_OK }, { D3DTEXF_POINT, D3DTEXF_POINT, D3DTEXF_POINT, FALSE, D3D_OK }, { D3DTEXF_NONE, D3DTEXF_NONE, D3DTEXF_NONE, TRUE, D3DERR_UNSUPPORTEDTEXTUREFILTER }, { D3DTEXF_POINT, D3DTEXF_NONE, D3DTEXF_NONE, TRUE, D3DERR_UNSUPPORTEDTEXTUREFILTER }, { D3DTEXF_POINT, D3DTEXF_POINT, D3DTEXF_NONE, TRUE, D3D_OK }, { D3DTEXF_POINT, D3DTEXF_POINT, D3DTEXF_POINT, TRUE, D3D_OK }, { D3DTEXF_NONE, D3DTEXF_NONE, D3DTEXF_NONE, TRUE, D3DERR_UNSUPPORTEDTEXTUREFILTER }, { D3DTEXF_LINEAR, D3DTEXF_NONE, D3DTEXF_NONE, TRUE, D3DERR_UNSUPPORTEDTEXTUREFILTER }, { D3DTEXF_LINEAR, D3DTEXF_POINT, D3DTEXF_NONE, TRUE, E_FAIL }, { D3DTEXF_POINT, D3DTEXF_LINEAR, D3DTEXF_NONE, TRUE, E_FAIL }, { D3DTEXF_POINT, D3DTEXF_POINT, D3DTEXF_LINEAR, TRUE, E_FAIL }, }; hr = IDirect3DDevice9_GetDirect3D(device, &d3d9); ok(hr == D3D_OK, "IDirect3DDevice9_GetDirect3D(levels = 1) returned %08x\n", hr); hr = IDirect3D9_CheckDeviceFormat(d3d9, 0, D3DDEVTYPE_HAL, D3DFMT_X8R8G8B8, 0, D3DRTYPE_TEXTURE, D3DFMT_A32B32G32R32F); if(FAILED(hr)) { skip("D3DFMT_A32B32G32R32F not supported\n"); goto out; } hr = IDirect3D9_CheckDeviceFormat(d3d9, 0, D3DDEVTYPE_HAL, D3DFMT_X8R8G8B8, D3DUSAGE_QUERY_FILTER, D3DRTYPE_TEXTURE, D3DFMT_A32B32G32R32F); if(SUCCEEDED(hr)) { skip("D3DFMT_A32B32G32R32F supports filtering\n"); goto out; } hr = IDirect3DDevice9_CreateTexture(device, 128, 128, 0, 0, D3DFMT_A32B32G32R32F, D3DPOOL_MANAGED, &texture, 0); ok(hr == D3D_OK, "IDirect3DDevice9_CreateTexture returned %08x\n", hr); /* Needed for ValidateDevice */ hr = IDirect3DDevice9_SetFVF(device, D3DFVF_XYZ | D3DFVF_TEX1); ok(hr == D3D_OK, "IDirect3DDevice9_SetFVF returned %08x\n", hr); for(i = 0; i < (sizeof(tests) / sizeof(tests[0])); i++) { if(tests[i].has_texture) { hr = IDirect3DDevice9_SetTexture(device, 0, (IDirect3DBaseTexture9 *) texture); ok(hr == D3D_OK, "IDirect3DDevice9_SetTexture returned %08x\n", hr); } else { hr = IDirect3DDevice9_SetTexture(device, 0, NULL); ok(hr == D3D_OK, "IDirect3DDevice9_SetTexture returned %08x\n", hr); } hr = IDirect3DDevice9_SetSamplerState(device, 0, D3DSAMP_MAGFILTER, tests[i].magfilter); ok(hr == D3D_OK, "IDirect3DDevice9_SetSamplerState returned %08x\n", hr); hr = IDirect3DDevice9_SetSamplerState(device, 0, D3DSAMP_MINFILTER, tests[i].minfilter); ok(hr == D3D_OK, "IDirect3DDevice9_SetSamplerState returned %08x\n", hr); hr = IDirect3DDevice9_SetSamplerState(device, 0, D3DSAMP_MIPFILTER, tests[i].mipfilter); ok(hr == D3D_OK, "IDirect3DDevice9_SetSamplerState returned %08x\n", hr); passes = 0xdeadbeef; hr = IDirect3DDevice9_ValidateDevice(device, &passes); ok(hr == tests[i].result, "ValidateDevice failed: Texture %s, min %u, mag %u, mip %u. Got %08x, expected %08x\n", tests[i].has_texture ? "TRUE" : "FALSE", tests[i].magfilter, tests[i].minfilter, tests[i].mipfilter, hr, tests[i].result); if(SUCCEEDED(hr)) { ok(passes != 0, "ValidateDevice succeeded, passes is %u\n", passes); } else { ok(passes == 0xdeadbeef, "ValidateDevice failed, passes is %u\n", passes); } } hr = IDirect3DDevice9_SetTexture(device, 0, NULL); ok(SUCCEEDED(hr), "IDirect3DDevice9_SetTexture returned %#x.\n", hr); IDirect3DTexture9_Release(texture); out: IDirect3D9_Release(d3d9); }
static void test_mipmap_gen(IDirect3DDevice9 *device) { HRESULT hr; IDirect3D9 *d3d9; IDirect3DTexture9 *texture = NULL; IDirect3DSurface9 *surface; DWORD levels; D3DSURFACE_DESC desc; int i; D3DLOCKED_RECT lr; hr = IDirect3DDevice9_GetDirect3D(device, &d3d9); ok(hr == D3D_OK, "IDirect3DDevice9_GetDirect3D returned %#x\n", hr); hr = IDirect3D9_CheckDeviceFormat(d3d9, 0, D3DDEVTYPE_HAL, D3DFMT_X8R8G8B8, D3DUSAGE_AUTOGENMIPMAP, D3DRTYPE_TEXTURE, D3DFMT_X8R8G8B8); if(FAILED(hr)) { skip("No mipmap generation support\n"); return; } /* testing shows that autogenmipmap and rendertarget are mutually exclusive options */ hr = IDirect3DDevice9_CreateTexture(device, 64, 64, 0, (D3DUSAGE_RENDERTARGET | D3DUSAGE_AUTOGENMIPMAP), D3DFMT_X8R8G8B8, D3DPOOL_DEFAULT, &texture, 0); ok(hr == D3D_OK, "IDirect3DDevice9_CreateTexture returned 0x%08x, expected 0x%08x\n", hr, D3D_OK); if (texture) IDirect3DTexture9_Release(texture); texture = NULL; hr = IDirect3DDevice9_CreateTexture(device, 64, 64, 0, D3DUSAGE_AUTOGENMIPMAP, D3DFMT_X8R8G8B8, D3DPOOL_MANAGED, &texture, 0); ok(hr == D3D_OK, "IDirect3DDevice9_CreateTexture failed(%08x)\n", hr); if (SUCCEEDED(hr)) { D3DTEXTUREFILTERTYPE fltt; fltt = IDirect3DTexture9_GetAutoGenFilterType(texture); ok(D3DTEXF_LINEAR == fltt /* || broken(D3DTEXF_POINT == fltt)*/, "GetAutoGenFilterType returned default %d\n", fltt); hr = IDirect3DTexture9_SetAutoGenFilterType(texture, D3DTEXF_NONE); todo_wine ok(hr == D3DERR_INVALIDCALL, "SetAutoGenFilterType D3DTEXF_NONE returned %08x\n", hr); hr = IDirect3DTexture9_SetAutoGenFilterType(texture, D3DTEXF_ANISOTROPIC); ok(hr == D3D_OK, "SetAutoGenFilterType D3DTEXF_ANISOTROPIC returned %08x\n", hr); fltt = IDirect3DTexture9_GetAutoGenFilterType(texture); ok(D3DTEXF_ANISOTROPIC == fltt, "GetAutoGenFilterType returned %d\n", fltt); hr = IDirect3DTexture9_SetAutoGenFilterType(texture, D3DTEXF_LINEAR); ok(hr == D3D_OK, "SetAutoGenFilterType D3DTEXF_LINEAR returned %08x\n", hr); } levels = IDirect3DTexture9_GetLevelCount(texture); ok(levels == 1, "Got %d levels, expected 1\n", levels); for(i = 0; i < 6 /* 64 = 2 ^ 6 */; i++) { surface = NULL; hr = IDirect3DTexture9_GetSurfaceLevel(texture, i, &surface); ok(hr == (i == 0 ? D3D_OK : D3DERR_INVALIDCALL), "GetSurfaceLevel on level %d returned %#x\n", i, hr); if(surface) IDirect3DSurface9_Release(surface); hr = IDirect3DTexture9_GetLevelDesc(texture, i, &desc); ok(hr == (i == 0 ? D3D_OK : D3DERR_INVALIDCALL), "GetLevelDesc on level %d returned %#x\n", i, hr); hr = IDirect3DTexture9_LockRect(texture, i, &lr, NULL, 0); ok(hr == (i == 0 ? D3D_OK : D3DERR_INVALIDCALL), "LockRect on level %d returned %#x\n", i, hr); if(SUCCEEDED(hr)) { hr = IDirect3DTexture9_UnlockRect(texture, i); ok(hr == D3D_OK, "Unlock returned %08x\n", hr); } } IDirect3DTexture9_Release(texture); hr = IDirect3DDevice9_CreateTexture(device, 64, 64, 2 /* levels */, D3DUSAGE_AUTOGENMIPMAP, D3DFMT_X8R8G8B8, D3DPOOL_MANAGED, &texture, 0); ok(hr == D3DERR_INVALIDCALL, "IDirect3DDevice9_CreateTexture(levels = 2) returned %08x\n", hr); hr = IDirect3DDevice9_CreateTexture(device, 64, 64, 6 /* levels */, D3DUSAGE_AUTOGENMIPMAP, D3DFMT_X8R8G8B8, D3DPOOL_MANAGED, &texture, 0); ok(hr == D3DERR_INVALIDCALL, "IDirect3DDevice9_CreateTexture(levels = 6) returned %08x\n", hr); hr = IDirect3DDevice9_CreateTexture(device, 64, 64, 1 /* levels */, D3DUSAGE_AUTOGENMIPMAP, D3DFMT_X8R8G8B8, D3DPOOL_MANAGED, &texture, 0); ok(hr == D3D_OK, "IDirect3DDevice9_CreateTexture(levels = 1) returned %08x\n", hr); levels = IDirect3DTexture9_GetLevelCount(texture); ok(levels == 1, "Got %d levels, expected 1\n", levels); IDirect3DTexture9_Release(texture); }
/*********************************************************************** * D3DXCreateFontIndirectW (D3DX9_36.@) */ HRESULT WINAPI D3DXCreateFontIndirectW(IDirect3DDevice9 *device, const D3DXFONT_DESCW *desc, ID3DXFont **font) { D3DDEVICE_CREATION_PARAMETERS cpars; D3DDISPLAYMODE mode; struct d3dx_font *object; IDirect3D9 *d3d; HRESULT hr; TRACE("(%p, %p, %p)\n", device, desc, font); if (!device || !desc || !font) return D3DERR_INVALIDCALL; TRACE("desc: %d %d %d %d %d %d %d %d %d %s\n", desc->Height, desc->Width, desc->Weight, desc->MipLevels, desc->Italic, desc->CharSet, desc->OutputPrecision, desc->Quality, desc->PitchAndFamily, debugstr_w(desc->FaceName)); /* The device MUST support D3DFMT_A8R8G8B8 */ IDirect3DDevice9_GetDirect3D(device, &d3d); IDirect3DDevice9_GetCreationParameters(device, &cpars); IDirect3DDevice9_GetDisplayMode(device, 0, &mode); hr = IDirect3D9_CheckDeviceFormat(d3d, cpars.AdapterOrdinal, cpars.DeviceType, mode.Format, 0, D3DRTYPE_TEXTURE, D3DFMT_A8R8G8B8); if (FAILED(hr)) { IDirect3D9_Release(d3d); return D3DXERR_INVALIDDATA; } IDirect3D9_Release(d3d); object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(struct d3dx_font)); if (!object) { *font = NULL; return E_OUTOFMEMORY; } object->ID3DXFont_iface.lpVtbl = &D3DXFont_Vtbl; object->ref = 1; object->device = device; object->desc = *desc; object->hdc = CreateCompatibleDC(NULL); if (!object->hdc) { HeapFree(GetProcessHeap(), 0, object); return D3DXERR_INVALIDDATA; } object->hfont = CreateFontW(desc->Height, desc->Width, 0, 0, desc->Weight, desc->Italic, FALSE, FALSE, desc->CharSet, desc->OutputPrecision, CLIP_DEFAULT_PRECIS, desc->Quality, desc->PitchAndFamily, desc->FaceName); if (!object->hfont) { DeleteDC(object->hdc); HeapFree(GetProcessHeap(), 0, object); return D3DXERR_INVALIDDATA; } SelectObject(object->hdc, object->hfont); SetTextColor(object->hdc, 0x00ffffff); SetBkColor(object->hdc, 0x00000000); IDirect3DDevice9_AddRef(device); *font = &object->ID3DXFont_iface; return D3D_OK; }