From: Andrew Eikum Subject: [PATCH 1/3] d3dx10_43: Add D3DX10CreateEffectFrom* tests Message-Id: Date: Tue, 28 Jun 2022 14:22:49 +0000 In-Reply-To: References: From: Andrew Eikum --- dlls/d3dx10_43/tests/Makefile.in | 2 + dlls/d3dx10_43/tests/d3dx10.c | 171 ++++++++++++++++++++++++- dlls/d3dx10_43/tests/fx_test_ecbt.fx | Bin 0 -> 325 bytes dlls/d3dx10_43/tests/fx_test_ecbt.hlsl | 10 ++ dlls/d3dx10_43/tests/resource.rc | 23 ++++ 5 files changed, 204 insertions(+), 2 deletions(-) create mode 100644 dlls/d3dx10_43/tests/fx_test_ecbt.fx create mode 100644 dlls/d3dx10_43/tests/fx_test_ecbt.hlsl create mode 100644 dlls/d3dx10_43/tests/resource.rc diff --git a/dlls/d3dx10_43/tests/Makefile.in b/dlls/d3dx10_43/tests/Makefile.in index 95078d0e12b..0759443ef3d 100644 --- a/dlls/d3dx10_43/tests/Makefile.in +++ b/dlls/d3dx10_43/tests/Makefile.in @@ -4,3 +4,5 @@ IMPORTS = d3dx10 ole32 gdi32 C_SRCS = \ d3dx10.c + +RC_SRCS = resource.rc diff --git a/dlls/d3dx10_43/tests/d3dx10.c b/dlls/d3dx10_43/tests/d3dx10.c index 1c28a62b700..252e2a40ee8 100644 --- a/dlls/d3dx10_43/tests/d3dx10.c +++ b/dlls/d3dx10_43/tests/d3dx10.c @@ -942,6 +942,23 @@ static char *get_str_a(const WCHAR *wstr) return buffer; } +BOOL load_resource(HMODULE module, const WCHAR *resource, void **data, DWORD *size) +{ + HGLOBAL hglobal; + HRSRC rsrc; + + if (!(rsrc = FindResourceW(module, resource, (const WCHAR *)RT_RCDATA)) || + !(*size = SizeofResource(module, rsrc)) || + !(hglobal = LoadResource(module, rsrc)) || + !(*data = LockResource(hglobal))) + { + ok(0, "Failed to find resource.\n"); + return FALSE; + } + + return TRUE; +} + static BOOL create_file(const WCHAR *filename, const void *data, unsigned int size, WCHAR *out_path) { WCHAR path[MAX_PATH]; @@ -3543,10 +3560,11 @@ todo_wine { ok(!refcount, "Unexpected refcount.\n"); } -static void test_create_effect_from_resource(void) +static void test_D3DX10CreateEffectFromResource(void) { ID3D10Device *device; ID3D10Effect *effect; + ID3D10Blob *errors; ULONG refcount; HRESULT hr; @@ -3556,10 +3574,157 @@ static void test_create_effect_from_resource(void) return; } + /* test resource that doesn't exist */ hr = D3DX10CreateEffectFromResourceA(GetModuleHandleA(NULL), "resource", NULL, NULL, NULL, "fx_4_0", 0, 0, device, NULL, NULL, &effect, NULL, NULL); ok(hr == D3DX10_ERR_INVALID_DATA, "Unexpected hr %#x.\n", hr); + + /* test creating effect from pre-built DXBC shader */ + errors = NULL; + effect = NULL; + hr = D3DX10CreateEffectFromResourceA(GetModuleHandleA(NULL), "fx_test_ecbt.fx", NULL, + NULL, NULL, "fx_4_0", 0x0, 0x0, device, NULL, NULL, &effect, + &errors, NULL); + todo_wine ok(hr == S_OK, "D3DX10CreateEffectFromResource failed: %#x\n", hr); + todo_wine ok(errors == NULL, "Got unexpected effect errors\n"); + todo_wine ok(effect != NULL, "No effect created\n"); + if (errors) + ID3D10Blob_Release(errors); + if (effect) + effect->lpVtbl->Release(effect); + + + /* test creating effect from source */ + errors = NULL; + effect = NULL; + hr = D3DX10CreateEffectFromResourceA(GetModuleHandleA(NULL), "fx_test_ecbt.hlsl", NULL, + NULL, NULL, "fx_4_0", 0x0, 0x0, device, NULL, NULL, &effect, + &errors, NULL); + todo_wine ok(hr == S_OK, "D3DX10CreateEffectFromResource failed: %#x\n", hr); + todo_wine ok(errors == NULL, "Got unexpected effect errors\n"); + todo_wine ok(effect != NULL, "No effect created\n"); + if (errors) + ID3D10Blob_Release(errors); + if (effect) + effect->lpVtbl->Release(effect); + + + refcount = ID3D10Device_Release(device); + ok(!refcount, "Unexpected refcount.\n"); +} + +static void test_D3DX10CreateEffectFromMemory(void) +{ + DWORD fx_test_ecbt_size, fx_test_ecbt_src_size; + void *fx_test_ecbt, *fx_test_ecbt_src; + ID3D10Device *device; + ID3D10Effect *effect; + ID3D10Blob *errors; + ULONG refcount; + HRESULT hr; + + if (!(device = create_device())) + { + skip("Failed to create device, skipping tests.\n"); + return; + } + + /* test creating effect from pre-built DXBC shader */ + load_resource(GetModuleHandleA(NULL), L"fx_test_ecbt.fx", &fx_test_ecbt, &fx_test_ecbt_size); + + errors = NULL; + effect = NULL; + hr = D3DX10CreateEffectFromMemory(fx_test_ecbt, fx_test_ecbt_size, NULL, + NULL, NULL, "fx_4_0", 0x0, 0x0, device, NULL, NULL, &effect, + &errors, NULL); + todo_wine ok(hr == S_OK, "D3DX10CreateEffectFromMemory failed: %#x\n", hr); + todo_wine ok(errors == NULL, "Got unexpected effect errors\n"); + todo_wine ok(effect != NULL, "No effect created\n"); + if (errors) + ID3D10Blob_Release(errors); + if (effect) + effect->lpVtbl->Release(effect); + + + /* test creating effect from source */ + load_resource(GetModuleHandleA(NULL), L"fx_test_ecbt.hlsl", &fx_test_ecbt_src, &fx_test_ecbt_src_size); + + errors = NULL; + effect = NULL; + hr = D3DX10CreateEffectFromMemory(fx_test_ecbt_src, fx_test_ecbt_src_size, NULL, + NULL, NULL, "fx_4_0", 0x0, 0x0, device, NULL, NULL, &effect, + &errors, NULL); + todo_wine ok(hr == S_OK, "D3DX10CreateEffectFromMemory failed: %#x\n", hr); + todo_wine ok(errors == NULL, "Got unexpected effect errors\n"); + todo_wine ok(effect != NULL, "No effect created\n"); + if (errors) + ID3D10Blob_Release(errors); + if (effect) + effect->lpVtbl->Release(effect); + + + refcount = ID3D10Device_Release(device); + ok(!refcount, "Unexpected refcount.\n"); +} + +static void test_D3DX10CreateEffectFromFile(void) +{ + DWORD fx_test_ecbt_size, fx_test_ecbt_src_size; + void *fx_test_ecbt, *fx_test_ecbt_src; + ID3D10Device *device; + ID3D10Effect *effect; + WCHAR path[MAX_PATH]; + ID3D10Blob *errors; + ULONG refcount; + HRESULT hr; + + if (!(device = create_device())) + { + skip("Failed to create device, skipping tests.\n"); + return; + } + + /* test creating effect from pre-built DXBC shader */ + load_resource(GetModuleHandleA(NULL), L"fx_test_ecbt.fx", &fx_test_ecbt, &fx_test_ecbt_size); + + create_file(L"fx_test_ecbt.fx", fx_test_ecbt, fx_test_ecbt_size, path); + + errors = NULL; + effect = NULL; + hr = D3DX10CreateEffectFromFileW(path, + NULL, NULL, "fx_4_0", 0x0, 0x0, device, NULL, NULL, &effect, + &errors, NULL); + todo_wine ok(hr == S_OK, "D3DX10CreateEffectFromFile failed: %#x\n", hr); + todo_wine ok(errors == NULL, "Got unexpected effect errors\n"); + todo_wine ok(effect != NULL, "No effect created\n"); + if (errors) + ID3D10Blob_Release(errors); + if (effect) + effect->lpVtbl->Release(effect); + delete_file(L"fx_test_ecbt.fx"); + + + /* test creating effect from source */ + load_resource(GetModuleHandleA(NULL), L"fx_test_ecbt.hlsl", &fx_test_ecbt_src, &fx_test_ecbt_src_size); + + create_file(L"fx_test_ecbt.hlsl", fx_test_ecbt_src, fx_test_ecbt_src_size, path); + + errors = NULL; + effect = NULL; + hr = D3DX10CreateEffectFromFileW(path, + NULL, NULL, "fx_4_0", 0x0, 0x0, device, NULL, NULL, &effect, + &errors, NULL); + todo_wine ok(hr == S_OK, "D3DX10CreateEffectFromFile failed: %#x\n", hr); + todo_wine ok(errors == NULL, "Got unexpected effect errors\n"); + todo_wine ok(effect != NULL, "No effect created\n"); + if (errors) + ID3D10Blob_Release(errors); + if (effect) + effect->lpVtbl->Release(effect); + delete_file(L"fx_test_ecbt.hlsl"); + + refcount = ID3D10Device_Release(device); ok(!refcount, "Unexpected refcount.\n"); } @@ -3576,5 +3741,7 @@ START_TEST(d3dx10) test_create_texture(); test_font(); test_sprite(); - test_create_effect_from_resource(); + test_D3DX10CreateEffectFromResource(); + test_D3DX10CreateEffectFromMemory(); + test_D3DX10CreateEffectFromFile(); } diff --git a/dlls/d3dx10_43/tests/fx_test_ecbt.fx b/dlls/d3dx10_43/tests/fx_test_ecbt.fx new file mode 100644 index 0000000000000000000000000000000000000000..5996abb2d3d194f97aec71862e4e18af9e192749 GIT binary patch literal 325 zcmZ>XaB{xa^SfrM?i)iVh5(Cn9^;ja3=9meKmtUo0I^$yp@AfbFYx~#6Ohjg#Mpo* zHbFdM$w>@pIr)ht4D3KfAj?321&9TpG$$tmLz*E&a9DhRf3RnWr@tRVnh}GuzmI>A z0Yh?<5ks0WTs=rH$Z;@pG=XehAl3n5bYKA#0LfVcF~~k--~{9tKm}lCfw*o!4AKJv J3SbhU7XXq|7`p%f literal 0 HcmV?d00001 diff --git a/dlls/d3dx10_43/tests/fx_test_ecbt.hlsl b/dlls/d3dx10_43/tests/fx_test_ecbt.hlsl new file mode 100644 index 00000000000..24581832dc3 --- /dev/null +++ b/dlls/d3dx10_43/tests/fx_test_ecbt.hlsl @@ -0,0 +1,10 @@ +cbuffer cb : register(b1) +{ + float f1 : SV_POSITION; + float f2 : COLOR0; +}; + +cbuffer cb2 : register(b0) +{ + float f3 : packoffset(c2); +}; diff --git a/dlls/d3dx10_43/tests/resource.rc b/dlls/d3dx10_43/tests/resource.rc new file mode 100644 index 00000000000..e8c04cc15e6 --- /dev/null +++ b/dlls/d3dx10_43/tests/resource.rc @@ -0,0 +1,23 @@ +/* + * Copyright 2022 Andrew Eikum for CodeWeavers + * + * 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 + */ + +/* @makedep: fx_test_ecbt.fx */ +fx_test_ecbt.fx RCDATA fx_test_ecbt.fx + +/* @makedep: fx_test_ecbt.hlsl */ +fx_test_ecbt.hlsl RCDATA fx_test_ecbt.hlsl -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/332