[PATCH 0/5] MR9901: d3dx11: Implement file/resource based versions of a few d3dx11 functions.
This MR adds some helpers for loading data from files/resources in shared code, and uses these helpers to implement a few functions in d3dx11. -- https://gitlab.winehq.org/wine/wine/-/merge_requests/9901
From: Connor McAdams <cmcadams@codeweavers.com> Signed-off-by: Connor McAdams <cmcadams@codeweavers.com> --- dlls/d3dx10_43/async.c | 94 ++++-------------------------------- dlls/d3dx10_43/compiler.c | 8 +-- dlls/d3dx10_43/dxhelpers.h | 4 -- dlls/d3dx10_43/texture.c | 16 +++--- dlls/d3dx9_36/d3dx_helpers.c | 91 ++++++++++++++++++++++++++++++++++ dlls/d3dx9_36/d3dx_helpers.h | 10 ++++ 6 files changed, 122 insertions(+), 101 deletions(-) diff --git a/dlls/d3dx10_43/async.c b/dlls/d3dx10_43/async.c index e2cd14a7736..0c72bfd7226 100644 --- a/dlls/d3dx10_43/async.c +++ b/dlls/d3dx10_43/async.c @@ -45,7 +45,7 @@ struct asyncdataloader } resource; } u; void *data; - DWORD size; + uint32_t size; }; static inline struct asyncdataloader *impl_from_ID3DX10DataLoader(ID3DX10DataLoader *iface) @@ -90,32 +90,13 @@ static const ID3DX10DataLoaderVtbl memorydataloadervtbl = HRESULT load_file(const WCHAR *path, void **data, DWORD *size) { - DWORD read_len; - HANDLE file; - BOOL ret; + uint32_t file_size; + HRESULT hr; - file = CreateFileW(path, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, - NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); - if (file == INVALID_HANDLE_VALUE) + if ((hr = d3dx_load_file(path, data, &file_size)) == ERROR_FILE_NOT_FOUND) return D3D10_ERROR_FILE_NOT_FOUND; - - *size = GetFileSize(file, NULL); - *data = malloc(*size); - if (!*data) - { - CloseHandle(file); - return E_OUTOFMEMORY; - } - - ret = ReadFile(file, *data, *size, &read_len, NULL); - CloseHandle(file); - if (!ret || read_len != *size) - { - WARN("Failed to read file contents.\n"); - free(*data); - return E_FAIL; - } - return S_OK; + *size = file_size; + return hr; } static HRESULT WINAPI filedataloader_Load(ID3DX10DataLoader *iface) @@ -173,63 +154,6 @@ static const ID3DX10DataLoaderVtbl filedataloadervtbl = filedataloader_Destroy }; -static HRESULT load_resource_initA(HMODULE module, const char *resource, HRSRC *rsrc) -{ - if (!(*rsrc = FindResourceA(module, resource, (const char *)RT_RCDATA))) - *rsrc = FindResourceA(module, resource, (const char *)RT_BITMAP); - if (!*rsrc) - { - WARN("Failed to find resource.\n"); - return D3DX10_ERR_INVALID_DATA; - } - return S_OK; -} - -static HRESULT load_resource_initW(HMODULE module, const WCHAR *resource, HRSRC *rsrc) -{ - if (!(*rsrc = FindResourceW(module, resource, (const WCHAR *)RT_RCDATA))) - *rsrc = FindResourceW(module, resource, (const WCHAR *)RT_BITMAP); - if (!*rsrc) - { - WARN("Failed to find resource.\n"); - return D3DX10_ERR_INVALID_DATA; - } - return S_OK; -} - -static HRESULT load_resource(HMODULE module, HRSRC rsrc, void **data, DWORD *size) -{ - HGLOBAL hglobal; - - if (!(*size = SizeofResource(module, rsrc))) - return D3DX10_ERR_INVALID_DATA; - if (!(hglobal = LoadResource(module, rsrc))) - return D3DX10_ERR_INVALID_DATA; - if (!(*data = LockResource(hglobal))) - return D3DX10_ERR_INVALID_DATA; - return S_OK; -} - -HRESULT load_resourceA(HMODULE module, const char *resource, void **data, DWORD *size) -{ - HRESULT hr; - HRSRC rsrc; - - if (FAILED((hr = load_resource_initA(module, resource, &rsrc)))) - return hr; - return load_resource(module, rsrc, data, size); -} - -HRESULT load_resourceW(HMODULE module, const WCHAR *resource, void **data, DWORD *size) -{ - HRESULT hr; - HRSRC rsrc; - - if ((FAILED(hr = load_resource_initW(module, resource, &rsrc)))) - return hr; - return load_resource(module, rsrc, data, size); -} - static HRESULT WINAPI resourcedataloader_Load(ID3DX10DataLoader *iface) { struct asyncdataloader *loader = impl_from_ID3DX10DataLoader(iface); @@ -239,7 +163,7 @@ static HRESULT WINAPI resourcedataloader_Load(ID3DX10DataLoader *iface) if (loader->data) return S_OK; - return load_resource(loader->u.resource.module, loader->u.resource.rsrc, + return d3dx_load_resource(loader->u.resource.module, loader->u.resource.rsrc, &loader->data, &loader->size); } @@ -514,7 +438,7 @@ HRESULT WINAPI D3DX10CreateAsyncResourceLoaderA(HMODULE module, const char *reso if (!object) return E_OUTOFMEMORY; - if (FAILED((hr = load_resource_initA(module, resource, &rsrc)))) + if (FAILED((hr = d3dx_load_resource_init_a(module, resource, &rsrc)))) { free(object); return hr; @@ -546,7 +470,7 @@ HRESULT WINAPI D3DX10CreateAsyncResourceLoaderW(HMODULE module, const WCHAR *res if (!object) return E_OUTOFMEMORY; - if (FAILED((hr = load_resource_initW(module, resource, &rsrc)))) + if (FAILED((hr = d3dx_load_resource_init_w(module, resource, &rsrc)))) { free(object); return hr; diff --git a/dlls/d3dx10_43/compiler.c b/dlls/d3dx10_43/compiler.c index 281dae329e5..1c056916903 100644 --- a/dlls/d3dx10_43/compiler.c +++ b/dlls/d3dx10_43/compiler.c @@ -162,8 +162,8 @@ HRESULT WINAPI D3DX10CreateEffectFromResourceA(HMODULE module, const char *resou ID3D10EffectPool *effect_pool, ID3DX10ThreadPump *pump, ID3D10Effect **effect, ID3D10Blob **errors, HRESULT *hresult) { + uint32_t size; void *data; - DWORD size; HRESULT hr; TRACE("module %p, resource_name %s, filename %s, defines %p, include %p, profile %s, " @@ -172,7 +172,7 @@ HRESULT WINAPI D3DX10CreateEffectFromResourceA(HMODULE module, const char *resou defines, include, debugstr_a(profile), shader_flags, effect_flags, device, effect_pool, pump, effect, errors, hresult); - hr = load_resourceA(module, resource_name, &data, &size); + hr = d3dx_load_resource_a(module, resource_name, &data, &size); if (FAILED(hr)) return hr; @@ -187,8 +187,8 @@ HRESULT WINAPI D3DX10CreateEffectFromResourceW(HMODULE module, const WCHAR *reso ID3D10Blob **errors, HRESULT *hresult) { char *filename = NULL; + uint32_t size; void *data; - DWORD size; HRESULT hr; int len; @@ -198,7 +198,7 @@ HRESULT WINAPI D3DX10CreateEffectFromResourceW(HMODULE module, const WCHAR *reso defines, include, debugstr_a(profile), shader_flags, effect_flags, device, effect_pool, pump, effect, errors, hresult); - hr = load_resourceW(module, resource_name, &data, &size); + hr = d3dx_load_resource_w(module, resource_name, &data, &size); if (FAILED(hr)) return hr; diff --git a/dlls/d3dx10_43/dxhelpers.h b/dlls/d3dx10_43/dxhelpers.h index 8047d354749..2311bb31242 100644 --- a/dlls/d3dx10_43/dxhelpers.h +++ b/dlls/d3dx10_43/dxhelpers.h @@ -19,10 +19,6 @@ #include "d3dx_helpers.h" extern HRESULT load_file(const WCHAR *path, void **data, DWORD *size); -extern HRESULT load_resourceA(HMODULE module, const char *resource, - void **data, DWORD *size); -extern HRESULT load_resourceW(HMODULE module, const WCHAR *resource, - void **data, DWORD *size); extern HRESULT get_image_info(const void *data, SIZE_T size, D3DX10_IMAGE_INFO *img_info); diff --git a/dlls/d3dx10_43/texture.c b/dlls/d3dx10_43/texture.c index fb6bd5ae489..aa173e3f004 100644 --- a/dlls/d3dx10_43/texture.c +++ b/dlls/d3dx10_43/texture.c @@ -245,9 +245,9 @@ HRESULT WINAPI D3DX10GetImageInfoFromFileW(const WCHAR *src_file, ID3DX10ThreadP HRESULT WINAPI D3DX10GetImageInfoFromResourceA(HMODULE module, const char *resource, ID3DX10ThreadPump *pump, D3DX10_IMAGE_INFO *info, HRESULT *result) { + uint32_t size; void *buffer; HRESULT hr; - DWORD size; TRACE("module %p, resource %s, pump %p, info %p, result %p.\n", module, debugstr_a(resource), pump, info, result); @@ -272,7 +272,7 @@ HRESULT WINAPI D3DX10GetImageInfoFromResourceA(HMODULE module, const char *resou return hr; } - if (FAILED((hr = load_resourceA(module, resource, &buffer, &size)))) + if (FAILED((hr = d3dx_load_resource_a(module, resource, &buffer, &size)))) return hr; hr = get_image_info(buffer, size, info); if (result) @@ -283,9 +283,9 @@ HRESULT WINAPI D3DX10GetImageInfoFromResourceA(HMODULE module, const char *resou HRESULT WINAPI D3DX10GetImageInfoFromResourceW(HMODULE module, const WCHAR *resource, ID3DX10ThreadPump *pump, D3DX10_IMAGE_INFO *info, HRESULT *result) { + uint32_t size; void *buffer; HRESULT hr; - DWORD size; TRACE("module %p, resource %s, pump %p, info %p, result %p.\n", module, debugstr_w(resource), pump, info, result); @@ -310,7 +310,7 @@ HRESULT WINAPI D3DX10GetImageInfoFromResourceW(HMODULE module, const WCHAR *reso return hr; } - if (FAILED((hr = load_resourceW(module, resource, &buffer, &size)))) + if (FAILED((hr = d3dx_load_resource_w(module, resource, &buffer, &size)))) return hr; hr = get_image_info(buffer, size, info); if (result) @@ -532,8 +532,8 @@ HRESULT WINAPI D3DX10CreateTextureFromFileW(ID3D10Device *device, const WCHAR *s HRESULT WINAPI D3DX10CreateTextureFromResourceA(ID3D10Device *device, HMODULE module, const char *resource, D3DX10_IMAGE_LOAD_INFO *load_info, ID3DX10ThreadPump *pump, ID3D10Resource **texture, HRESULT *hresult) { + uint32_t size; void *buffer; - DWORD size; HRESULT hr; TRACE("device %p, module %p, resource %s, load_info %p, pump %p, texture %p, hresult %p.\n", @@ -562,7 +562,7 @@ HRESULT WINAPI D3DX10CreateTextureFromResourceA(ID3D10Device *device, HMODULE mo return hr; } - if (FAILED((hr = load_resourceA(module, resource, &buffer, &size)))) + if (FAILED((hr = d3dx_load_resource_a(module, resource, &buffer, &size)))) return hr; hr = create_texture(device, buffer, size, load_info, texture); if (hresult) @@ -573,8 +573,8 @@ HRESULT WINAPI D3DX10CreateTextureFromResourceA(ID3D10Device *device, HMODULE mo HRESULT WINAPI D3DX10CreateTextureFromResourceW(ID3D10Device *device, HMODULE module, const WCHAR *resource, D3DX10_IMAGE_LOAD_INFO *load_info, ID3DX10ThreadPump *pump, ID3D10Resource **texture, HRESULT *hresult) { + uint32_t size; void *buffer; - DWORD size; HRESULT hr; TRACE("device %p, module %p, resource %s, load_info %p, pump %p, texture %p, hresult %p.\n", @@ -603,7 +603,7 @@ HRESULT WINAPI D3DX10CreateTextureFromResourceW(ID3D10Device *device, HMODULE mo return hr; } - if (FAILED((hr = load_resourceW(module, resource, &buffer, &size)))) + if (FAILED((hr = d3dx_load_resource_w(module, resource, &buffer, &size)))) return hr; hr = create_texture(device, buffer, size, load_info, texture); if (hresult) diff --git a/dlls/d3dx9_36/d3dx_helpers.c b/dlls/d3dx9_36/d3dx_helpers.c index 684bc50e5eb..4c0f49be1d4 100644 --- a/dlls/d3dx9_36/d3dx_helpers.c +++ b/dlls/d3dx9_36/d3dx_helpers.c @@ -3368,3 +3368,94 @@ exit: free(sub_rsrc_data); return hr; } + +/* + * File/resource loading helper functions. + */ +HRESULT d3dx_load_file(const WCHAR *path, void **data, uint32_t *size) +{ + DWORD read_len; + HANDLE file; + BOOL ret; + + file = CreateFileW(path, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, + FILE_ATTRIBUTE_NORMAL, NULL); + if (file == INVALID_HANDLE_VALUE) + return ERROR_FILE_NOT_FOUND; + + *size = GetFileSize(file, NULL); + *data = malloc(*size); + if (!*data) + { + CloseHandle(file); + return E_OUTOFMEMORY; + } + + ret = ReadFile(file, *data, *size, &read_len, NULL); + CloseHandle(file); + if (!ret || read_len != *size) + { + WARN("Failed to read file contents.\n"); + free(*data); + return E_FAIL; + } + + return S_OK; +} + +HRESULT d3dx_load_resource_init_a(HMODULE module, const char *resource, HRSRC *rsrc) +{ + if (!(*rsrc = FindResourceA(module, resource, (const char *)RT_RCDATA))) + *rsrc = FindResourceA(module, resource, (const char *)RT_BITMAP); + if (!*rsrc) + { + WARN("Failed to find resource.\n"); + return D3DXERR_INVALIDDATA; + } + return S_OK; +} + +HRESULT d3dx_load_resource_init_w(HMODULE module, const WCHAR *resource, HRSRC *rsrc) +{ + if (!(*rsrc = FindResourceW(module, resource, (const WCHAR *)RT_RCDATA))) + *rsrc = FindResourceW(module, resource, (const WCHAR *)RT_BITMAP); + if (!*rsrc) + { + WARN("Failed to find resource.\n"); + return D3DXERR_INVALIDDATA; + } + return S_OK; +} + +HRESULT d3dx_load_resource(HMODULE module, HRSRC rsrc, void **data, uint32_t *size) +{ + HGLOBAL hglobal; + + if (!(*size = SizeofResource(module, rsrc))) + return D3DXERR_INVALIDDATA; + if (!(hglobal = LoadResource(module, rsrc))) + return D3DXERR_INVALIDDATA; + if (!(*data = LockResource(hglobal))) + return D3DXERR_INVALIDDATA; + return S_OK; +} + +HRESULT d3dx_load_resource_a(HMODULE module, const char *resource, void **data, uint32_t *size) +{ + HRESULT hr; + HRSRC rsrc; + + if (FAILED((hr = d3dx_load_resource_init_a(module, resource, &rsrc)))) + return hr; + return d3dx_load_resource(module, rsrc, data, size); +} + +HRESULT d3dx_load_resource_w(HMODULE module, const WCHAR *resource, void **data, uint32_t *size) +{ + HRESULT hr; + HRSRC rsrc; + + if ((FAILED(hr = d3dx_load_resource_init_w(module, resource, &rsrc)))) + return hr; + return d3dx_load_resource(module, rsrc, data, size); +} diff --git a/dlls/d3dx9_36/d3dx_helpers.h b/dlls/d3dx9_36/d3dx_helpers.h index d5523cab1ed..9b85149cbaa 100644 --- a/dlls/d3dx9_36/d3dx_helpers.h +++ b/dlls/d3dx9_36/d3dx_helpers.h @@ -458,6 +458,16 @@ HRESULT d3dx_create_subresource_data_for_texture(uint32_t width, uint32_t height uint32_t mip_levels, uint32_t layer_count, const struct pixel_format_desc *fmt_desc, struct d3dx_subresource_data **out_sub_rsrc_data); +/* + * File/resource loading helper functions. + */ +HRESULT d3dx_load_file(const WCHAR *path, void **data, uint32_t *size); +HRESULT d3dx_load_resource_init_a(HMODULE module, const char *resource, HRSRC *rsrc); +HRESULT d3dx_load_resource_init_w(HMODULE module, const WCHAR *resource, HRSRC *rsrc); +HRESULT d3dx_load_resource(HMODULE module, HRSRC rsrc, void **data, uint32_t *size); +HRESULT d3dx_load_resource_a(HMODULE module, const char *resource, void **data, uint32_t *size); +HRESULT d3dx_load_resource_w(HMODULE module, const WCHAR *resource, void **data, uint32_t *size); + /* debug helpers */ const char *debug_d3dx_image_file_format(enum d3dx_image_file_format format); #endif /* __WINE_D3DX_HELPERS_H */ -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/9901
From: Connor McAdams <cmcadams@codeweavers.com> Signed-off-by: Connor McAdams <cmcadams@codeweavers.com> --- dlls/d3dx11_43/async.c | 40 ++++++++++--------------- dlls/d3dx11_43/d3dx11_43_main.c | 22 -------------- dlls/d3dx11_43/dxhelpers.h | 2 ++ dlls/d3dx11_43/tests/d3dx11.c | 10 +++---- dlls/d3dx11_43/texture.c | 53 +++++++++++++++++++++++++++++++++ 5 files changed, 75 insertions(+), 52 deletions(-) diff --git a/dlls/d3dx11_43/async.c b/dlls/d3dx11_43/async.c index 074a8529e4e..897f33d6851 100644 --- a/dlls/d3dx11_43/async.c +++ b/dlls/d3dx11_43/async.c @@ -18,6 +18,7 @@ #include "d3dx11.h" #include "d3dcompiler.h" +#include "dxhelpers.h" #include "wine/debug.h" @@ -83,38 +84,29 @@ static const ID3DX11DataLoaderVtbl memorydataloadervtbl = memorydataloader_Destroy }; +HRESULT load_file(const WCHAR *path, void **data, DWORD *size) +{ + uint32_t file_size; + HRESULT hr; + + if ((hr = d3dx_load_file(path, data, &file_size)) == ERROR_FILE_NOT_FOUND) + return D3D11_ERROR_FILE_NOT_FOUND; + *size = file_size; + return hr; +} + static HRESULT WINAPI filedataloader_Load(ID3DX11DataLoader *iface) { struct asyncdataloader *loader = impl_from_ID3DX11DataLoader(iface); - DWORD size, read_len; - HANDLE file; void *data; - BOOL ret; + DWORD size; + HRESULT hr; TRACE("iface %p.\n", iface); /* Always buffer file contents, even if Load() was already called. */ - file = CreateFileW(loader->u.file.path, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, - NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); - if (file == INVALID_HANDLE_VALUE) - return D3D11_ERROR_FILE_NOT_FOUND; - - size = GetFileSize(file, NULL); - data = malloc(size); - if (!data) - { - CloseHandle(file); - return E_OUTOFMEMORY; - } - - ret = ReadFile(file, data, size, &read_len, NULL); - CloseHandle(file); - if (!ret) - { - ERR("Failed to read file contents.\n"); - free(data); - return E_FAIL; - } + if (FAILED((hr = load_file(loader->u.file.path, &data, &size)))) + return hr; free(loader->data); loader->data = data; diff --git a/dlls/d3dx11_43/d3dx11_43_main.c b/dlls/d3dx11_43/d3dx11_43_main.c index 00c1db35e42..6e90891e7ce 100644 --- a/dlls/d3dx11_43/d3dx11_43_main.c +++ b/dlls/d3dx11_43/d3dx11_43_main.c @@ -44,25 +44,3 @@ HRESULT WINAPI D3DX11FilterTexture(ID3D11DeviceContext *context, ID3D11Resource return E_NOTIMPL; } - -HRESULT WINAPI D3DX11GetImageInfoFromFileA(const char *filename, ID3DX11ThreadPump *pump, D3DX11_IMAGE_INFO *img_info, - HRESULT *hresult) -{ - FIXME("filename %s, pump %p, img_info %p, hresult %p stub!\n", debugstr_a(filename), pump, img_info, hresult); - - if (!filename) - return E_FAIL; - - return E_NOTIMPL; -} - -HRESULT WINAPI D3DX11GetImageInfoFromFileW(const WCHAR *filename, ID3DX11ThreadPump *pump, D3DX11_IMAGE_INFO *img_info, - HRESULT *hresult) -{ - FIXME("filename %s, pump %p, img_info %p, hresult %p stub!\n", debugstr_w(filename), pump, img_info, hresult); - - if (!filename) - return E_FAIL; - - return E_NOTIMPL; -} diff --git a/dlls/d3dx11_43/dxhelpers.h b/dlls/d3dx11_43/dxhelpers.h index 5be2ac93944..1b31c2cf6d2 100644 --- a/dlls/d3dx11_43/dxhelpers.h +++ b/dlls/d3dx11_43/dxhelpers.h @@ -18,4 +18,6 @@ #include "d3dx_helpers.h" +HRESULT load_file(const WCHAR *path, void **data, DWORD *size); + HRESULT get_image_info(const void *data, SIZE_T size, D3DX11_IMAGE_INFO *img_info); diff --git a/dlls/d3dx11_43/tests/d3dx11.c b/dlls/d3dx11_43/tests/d3dx11.c index 8210329e6d5..b759c932053 100644 --- a/dlls/d3dx11_43/tests/d3dx11.c +++ b/dlls/d3dx11_43/tests/d3dx11.c @@ -3564,18 +3564,17 @@ static void test_get_image_info(void) ok(hr2 == 0xdeadbeef, "Got unexpected hr2 %#lx.\n", hr2); hr2 = 0xdeadbeef; hr = D3DX11GetImageInfoFromFileW(L"deadbeaf", NULL, &image_info, &hr2); - todo_wine ok(hr == D3D11_ERROR_FILE_NOT_FOUND, "Got unexpected hr %#lx.\n", hr); - todo_wine ok(hr == hr2, "Got unexpected hr2 %#lx.\n", hr2); + ok(hr == D3D11_ERROR_FILE_NOT_FOUND, "Got unexpected hr %#lx.\n", hr); + ok(hr == hr2, "Got unexpected hr2 %#lx.\n", hr2); hr2 = 0xdeadbeef; hr = D3DX11GetImageInfoFromFileA(NULL, NULL, &image_info, &hr2); ok(hr == E_FAIL, "Got unexpected hr %#lx.\n", hr); ok(hr2 == 0xdeadbeef, "Got unexpected hr2 %#lx.\n", hr2); hr2 = 0xdeadbeef; hr = D3DX11GetImageInfoFromFileA("deadbeaf", NULL, &image_info, &hr2); - todo_wine ok(hr == D3D11_ERROR_FILE_NOT_FOUND, "Got unexpected hr %#lx.\n", hr); - todo_wine ok(hr == hr2, "Got unexpected hr2 %#lx.\n", hr2); + ok(hr == D3D11_ERROR_FILE_NOT_FOUND, "Got unexpected hr %#lx.\n", hr); + ok(hr == hr2, "Got unexpected hr2 %#lx.\n", hr2); -todo_wine { for (i = 0; i < ARRAY_SIZE(test_image); ++i) { winetest_push_context("Test %u", i); @@ -3600,7 +3599,6 @@ todo_wine { delete_file(test_filename); winetest_pop_context(); } -} check_dds_pixel_format(DDS_PF_FOURCC, MAKEFOURCC('D','X','T','1'), 0, 0, 0, 0, 0, DXGI_FORMAT_BC1_UNORM); check_dds_pixel_format(DDS_PF_FOURCC, MAKEFOURCC('D','X','T','2'), 0, 0, 0, 0, 0, DXGI_FORMAT_BC2_UNORM); diff --git a/dlls/d3dx11_43/texture.c b/dlls/d3dx11_43/texture.c index 03e930389ff..3be99465f8a 100644 --- a/dlls/d3dx11_43/texture.c +++ b/dlls/d3dx11_43/texture.c @@ -170,6 +170,59 @@ static D3DX11_IMAGE_FILE_FORMAT d3dx11_image_file_format_from_d3dx_image_file_fo } } +HRESULT WINAPI D3DX11GetImageInfoFromFileA(const char *src_file, ID3DX11ThreadPump *pump, D3DX11_IMAGE_INFO *info, + HRESULT *result) +{ + WCHAR *buffer; + int str_len; + HRESULT hr; + + TRACE("src_file %s, pump %p, info %p, result %p.\n", debugstr_a(src_file), pump, info, result); + + if (!src_file) + return E_FAIL; + + str_len = MultiByteToWideChar(CP_ACP, 0, src_file, -1, NULL, 0); + if (!str_len) + return HRESULT_FROM_WIN32(GetLastError()); + + buffer = malloc(str_len * sizeof(*buffer)); + if (!buffer) + return E_OUTOFMEMORY; + + MultiByteToWideChar(CP_ACP, 0, src_file, -1, buffer, str_len); + hr = D3DX11GetImageInfoFromFileW(buffer, pump, info, result); + + free(buffer); + + return hr; +} + +HRESULT WINAPI D3DX11GetImageInfoFromFileW(const WCHAR *src_file, ID3DX11ThreadPump *pump, D3DX11_IMAGE_INFO *info, + HRESULT *result) +{ + void *buffer = NULL; + DWORD size = 0; + HRESULT hr; + + TRACE("src_file %s, pump %p, info %p, result %p.\n", debugstr_w(src_file), pump, info, result); + + if (!src_file) + return E_FAIL; + + if (pump) + FIXME("D3DX11 thread pump is currently unimplemented.\n"); + + if (SUCCEEDED((hr = load_file(src_file, &buffer, &size)))) + { + hr = get_image_info(buffer, size, info); + free(buffer); + } + if (result) + *result = hr; + return hr; +} + static HRESULT d3dx11_image_info_from_d3dx_image(D3DX11_IMAGE_INFO *info, struct d3dx_image *image) { D3DX11_IMAGE_FILE_FORMAT iff = d3dx11_image_file_format_from_d3dx_image_file_format(image->image_file_format); -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/9901
From: Connor McAdams <cmcadams@codeweavers.com> Signed-off-by: Connor McAdams <cmcadams@codeweavers.com> --- dlls/d3dx11_43/tests/d3dx11.c | 7 ---- dlls/d3dx11_43/texture.c | 60 ++++++++++++++++++++++++----------- 2 files changed, 42 insertions(+), 25 deletions(-) diff --git a/dlls/d3dx11_43/tests/d3dx11.c b/dlls/d3dx11_43/tests/d3dx11.c index b759c932053..fcffbd095d5 100644 --- a/dlls/d3dx11_43/tests/d3dx11.c +++ b/dlls/d3dx11_43/tests/d3dx11.c @@ -3674,13 +3674,6 @@ static void test_get_image_info(void) check_dds_dxt10_format(DXGI_FORMAT_B8G8R8X8_UNORM, DXGI_FORMAT_B8G8R8X8_UNORM, FALSE); check_dds_dxt10_format(DXGI_FORMAT_B8G8R8A8_UNORM, DXGI_FORMAT_B8G8R8A8_UNORM, FALSE); - if (!strcmp(winetest_platform, "wine")) - { - skip("Skipping D3DX11GetImageInfoFromResource() tests.\n"); - CoUninitialize(); - return; - } - /* D3DX11GetImageInfoFromResource tests */ hr2 = 0xdeadbeef; diff --git a/dlls/d3dx11_43/texture.c b/dlls/d3dx11_43/texture.c index 3be99465f8a..400fd828501 100644 --- a/dlls/d3dx11_43/texture.c +++ b/dlls/d3dx11_43/texture.c @@ -223,6 +223,48 @@ HRESULT WINAPI D3DX11GetImageInfoFromFileW(const WCHAR *src_file, ID3DX11ThreadP return hr; } +HRESULT WINAPI D3DX11GetImageInfoFromResourceA(HMODULE module, const char *resource, ID3DX11ThreadPump *pump, + D3DX11_IMAGE_INFO *info, HRESULT *result) +{ + uint32_t size; + void *buffer; + HRESULT hr; + + TRACE("module %p, resource %s, pump %p, info %p, result %p.\n", + module, debugstr_a(resource), pump, info, result); + + if (pump) + FIXME("D3DX11 thread pump is currently unimplemented.\n"); + + if (FAILED((hr = d3dx_load_resource_a(module, resource, &buffer, &size)))) + return hr; + hr = get_image_info(buffer, size, info); + if (result) + *result = hr; + return hr; +} + +HRESULT WINAPI D3DX11GetImageInfoFromResourceW(HMODULE module, const WCHAR *resource, ID3DX11ThreadPump *pump, + D3DX11_IMAGE_INFO *info, HRESULT *result) +{ + uint32_t size; + void *buffer; + HRESULT hr; + + TRACE("module %p, resource %s, pump %p, info %p, result %p.\n", + module, debugstr_w(resource), pump, info, result); + + if (pump) + FIXME("D3DX11 thread pump is currently unimplemented.\n"); + + if (FAILED((hr = d3dx_load_resource_w(module, resource, &buffer, &size)))) + return hr; + hr = get_image_info(buffer, size, info); + if (result) + *result = hr; + return hr; +} + static HRESULT d3dx11_image_info_from_d3dx_image(D3DX11_IMAGE_INFO *info, struct d3dx_image *image) { D3DX11_IMAGE_FILE_FORMAT iff = d3dx11_image_file_format_from_d3dx_image_file_format(image->image_file_format); @@ -702,21 +744,3 @@ HRESULT WINAPI D3DX11GetImageInfoFromMemory(const void *src_data, SIZE_T src_dat *hresult = hr; return hr; } - -HRESULT WINAPI D3DX11GetImageInfoFromResourceA(HMODULE module, const char *resource, ID3DX11ThreadPump *pump, - D3DX11_IMAGE_INFO *info, HRESULT *result) -{ - FIXME("module %p, resource %s, pump %p, info %p, result %p stub!.\n", module, debugstr_a(resource), pump, info, - result); - - return E_NOTIMPL; -} - -HRESULT WINAPI D3DX11GetImageInfoFromResourceW(HMODULE module, const WCHAR *resource, ID3DX11ThreadPump *pump, - D3DX11_IMAGE_INFO *info, HRESULT *result) -{ - FIXME("module %p, resource %s, pump %p, info %p, result %p stub!.\n", module, debugstr_w(resource), pump, info, - result); - - return E_NOTIMPL; -} -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/9901
From: Connor McAdams <cmcadams@codeweavers.com> Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=56317 Signed-off-by: Connor McAdams <cmcadams@codeweavers.com> --- dlls/d3dx11_43/tests/d3dx11.c | 16 ++++---- dlls/d3dx11_43/texture.c | 71 ++++++++++++++++++++++++++--------- 2 files changed, 62 insertions(+), 25 deletions(-) diff --git a/dlls/d3dx11_43/tests/d3dx11.c b/dlls/d3dx11_43/tests/d3dx11.c index fcffbd095d5..0d39e6c079d 100644 --- a/dlls/d3dx11_43/tests/d3dx11.c +++ b/dlls/d3dx11_43/tests/d3dx11.c @@ -3974,14 +3974,6 @@ static void test_create_texture(void) check_resource_data(resource, test_image, __LINE__); ID3D11Resource_Release(resource); - if (!strcmp(winetest_platform, "wine")) - { - skip("Skipping D3DX11CreateTextureFrom{File,Resource} tests.\n"); - CoUninitialize(); - ok(!ID3D11Device_Release(device), "Unexpected refcount.\n"); - return; - } - /* D3DX11CreateTextureFromFile tests */ hr2 = 0xdeadbeef; @@ -4092,6 +4084,14 @@ static void test_create_texture(void) winetest_pop_context(); } + if (!strcmp(winetest_platform, "wine")) + { + skip("Skipping D3DX11CreateTextureFromResource tests.\n"); + CoUninitialize(); + ok(!ID3D11Device_Release(device), "Unexpected refcount.\n"); + return; + } + /* D3DX11CreateTextureFromResource tests */ hr2 = 0xdeadbeef; diff --git a/dlls/d3dx11_43/texture.c b/dlls/d3dx11_43/texture.c index 400fd828501..40e15993134 100644 --- a/dlls/d3dx11_43/texture.c +++ b/dlls/d3dx11_43/texture.c @@ -619,32 +619,69 @@ static HRESULT create_texture(ID3D11Device *device, const void *data, SIZE_T siz return hr; } -HRESULT WINAPI D3DX11CreateShaderResourceViewFromMemory(ID3D11Device *device, const void *data, - SIZE_T data_size, D3DX11_IMAGE_LOAD_INFO *load_info, ID3DX11ThreadPump *pump, - ID3D11ShaderResourceView **view, HRESULT *hresult) +HRESULT WINAPI D3DX11CreateTextureFromFileA(ID3D11Device *device, const char *src_file, + D3DX11_IMAGE_LOAD_INFO *load_info, ID3DX11ThreadPump *pump, ID3D11Resource **texture, HRESULT *hresult) { - FIXME("device %p, data %p, data_size %Iu, load_info %p, pump %p, view %p, hresult %p stub!\n", - device, data, data_size, load_info, pump, view, hresult); + WCHAR *buffer; + int str_len; + HRESULT hr; - return E_NOTIMPL; + TRACE("device %p, src_file %s, load_info %p, pump %p, texture %p, hresult %p.\n", + device, debugstr_a(src_file), load_info, pump, texture, hresult); + + if (!device) + return E_INVALIDARG; + if (!src_file) + return E_FAIL; + + if (!(str_len = MultiByteToWideChar(CP_ACP, 0, src_file, -1, NULL, 0))) + return HRESULT_FROM_WIN32(GetLastError()); + + if (!(buffer = malloc(str_len * sizeof(*buffer)))) + return E_OUTOFMEMORY; + + MultiByteToWideChar(CP_ACP, 0, src_file, -1, buffer, str_len); + hr = D3DX11CreateTextureFromFileW(device, buffer, load_info, pump, texture, hresult); + + free(buffer); + + return hr; } -HRESULT WINAPI D3DX11CreateTextureFromFileA(ID3D11Device *device, const char *filename, - D3DX11_IMAGE_LOAD_INFO *load_info, ID3DX11ThreadPump *pump, ID3D11Resource **texture, - HRESULT *hresult) +HRESULT WINAPI D3DX11CreateTextureFromFileW(ID3D11Device *device, const WCHAR *src_file, + D3DX11_IMAGE_LOAD_INFO *load_info, ID3DX11ThreadPump *pump, ID3D11Resource **texture, HRESULT *hresult) { - FIXME("device %p, filename %s, load_info %p, pump %p, texture %p, hresult %p stub.\n", - device, debugstr_a(filename), load_info, pump, texture, hresult); + void *buffer = NULL; + DWORD size = 0; + HRESULT hr; - return E_NOTIMPL; + TRACE("device %p, src_file %s, load_info %p, pump %p, texture %p, hresult %p.\n", + device, debugstr_w(src_file), load_info, pump, texture, hresult); + + if (!device) + return E_INVALIDARG; + if (!src_file) + return E_FAIL; + + if (pump) + FIXME("D3DX11 thread pump is currently unimplemented.\n"); + + if (SUCCEEDED((hr = load_file(src_file, &buffer, &size)))) + { + hr = create_texture(device, buffer, size, load_info, texture); + free(buffer); + } + if (hresult) + *hresult = hr; + return hr; } -HRESULT WINAPI D3DX11CreateTextureFromFileW(ID3D11Device *device, const WCHAR *filename, - D3DX11_IMAGE_LOAD_INFO *load_info, ID3DX11ThreadPump *pump, ID3D11Resource **texture, - HRESULT *hresult) +HRESULT WINAPI D3DX11CreateShaderResourceViewFromMemory(ID3D11Device *device, const void *data, + SIZE_T data_size, D3DX11_IMAGE_LOAD_INFO *load_info, ID3DX11ThreadPump *pump, + ID3D11ShaderResourceView **view, HRESULT *hresult) { - FIXME("device %p, filename %s, load_info %p, pump %p, texture %p, hresult %p stub.\n", - device, debugstr_w(filename), load_info, pump, texture, hresult); + FIXME("device %p, data %p, data_size %Iu, load_info %p, pump %p, view %p, hresult %p stub!\n", + device, data, data_size, load_info, pump, view, hresult); return E_NOTIMPL; } -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/9901
From: Connor McAdams <cmcadams@codeweavers.com> Signed-off-by: Connor McAdams <cmcadams@codeweavers.com> --- dlls/d3dx11_43/tests/d3dx11.c | 8 ----- dlls/d3dx11_43/texture.c | 56 +++++++++++++++++++++++++++-------- 2 files changed, 43 insertions(+), 21 deletions(-) diff --git a/dlls/d3dx11_43/tests/d3dx11.c b/dlls/d3dx11_43/tests/d3dx11.c index 0d39e6c079d..4801506b039 100644 --- a/dlls/d3dx11_43/tests/d3dx11.c +++ b/dlls/d3dx11_43/tests/d3dx11.c @@ -4084,14 +4084,6 @@ static void test_create_texture(void) winetest_pop_context(); } - if (!strcmp(winetest_platform, "wine")) - { - skip("Skipping D3DX11CreateTextureFromResource tests.\n"); - CoUninitialize(); - ok(!ID3D11Device_Release(device), "Unexpected refcount.\n"); - return; - } - /* D3DX11CreateTextureFromResource tests */ hr2 = 0xdeadbeef; diff --git a/dlls/d3dx11_43/texture.c b/dlls/d3dx11_43/texture.c index 40e15993134..e3218e3ec04 100644 --- a/dlls/d3dx11_43/texture.c +++ b/dlls/d3dx11_43/texture.c @@ -676,31 +676,61 @@ HRESULT WINAPI D3DX11CreateTextureFromFileW(ID3D11Device *device, const WCHAR *s return hr; } -HRESULT WINAPI D3DX11CreateShaderResourceViewFromMemory(ID3D11Device *device, const void *data, - SIZE_T data_size, D3DX11_IMAGE_LOAD_INFO *load_info, ID3DX11ThreadPump *pump, - ID3D11ShaderResourceView **view, HRESULT *hresult) -{ - FIXME("device %p, data %p, data_size %Iu, load_info %p, pump %p, view %p, hresult %p stub!\n", - device, data, data_size, load_info, pump, view, hresult); - - return E_NOTIMPL; -} - HRESULT WINAPI D3DX11CreateTextureFromResourceA(ID3D11Device *device, HMODULE module, const char *resource, D3DX11_IMAGE_LOAD_INFO *load_info, ID3DX11ThreadPump *pump, ID3D11Resource **texture, HRESULT *hresult) { - FIXME("device %p, module %p, resource %s, load_info %p, pump %p, texture %p, hresult %p stub!\n", + uint32_t size; + void *buffer; + HRESULT hr; + + TRACE("device %p, module %p, resource %s, load_info %p, pump %p, texture %p, hresult %p.\n", device, module, debugstr_a(resource), load_info, pump, texture, hresult); - return E_NOTIMPL; + if (!device) + return E_INVALIDARG; + + if (pump) + FIXME("D3DX11 thread pump is currently unimplemented.\n"); + + if (FAILED((hr = d3dx_load_resource_a(module, resource, &buffer, &size)))) + return hr; + hr = create_texture(device, buffer, size, load_info, texture); + if (hresult) + *hresult = hr; + return hr; } HRESULT WINAPI D3DX11CreateTextureFromResourceW(ID3D11Device *device, HMODULE module, const WCHAR *resource, D3DX11_IMAGE_LOAD_INFO *load_info, ID3DX11ThreadPump *pump, ID3D11Resource **texture, HRESULT *hresult) { - FIXME("device %p, module %p, resource %s, load_info %p, pump %p, texture %p, hresult %p stub!\n", + uint32_t size; + void *buffer; + HRESULT hr; + + TRACE("device %p, module %p, resource %s, load_info %p, pump %p, texture %p, hresult %p.\n", device, module, debugstr_w(resource), load_info, pump, texture, hresult); + if (!device) + return E_INVALIDARG; + + if (pump) + FIXME("D3DX11 thread pump is currently unimplemented.\n"); + + if (FAILED((hr = d3dx_load_resource_w(module, resource, &buffer, &size)))) + return hr; + hr = create_texture(device, buffer, size, load_info, texture); + if (hresult) + *hresult = hr; + return hr; +} + +HRESULT WINAPI D3DX11CreateShaderResourceViewFromMemory(ID3D11Device *device, const void *data, + SIZE_T data_size, D3DX11_IMAGE_LOAD_INFO *load_info, ID3DX11ThreadPump *pump, + ID3D11ShaderResourceView **view, HRESULT *hresult) +{ + FIXME("device %p, data %p, data_size %Iu, load_info %p, pump %p, view %p, hresult %p stub!\n", + device, data, data_size, load_info, pump, view, hresult); + return E_NOTIMPL; } -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/9901
This merge request was approved by Matteo Bruni. -- https://gitlab.winehq.org/wine/wine/-/merge_requests/9901
participants (3)
-
Connor McAdams -
Connor McAdams (@cmcadams) -
Matteo Bruni (@Mystral)