From: Connor McAdams <cmcadams@codeweavers.com> Signed-off-by: Connor McAdams <cmcadams@codeweavers.com> --- dlls/d3dx10_43/tests/d3dx10.c | 4 ++-- dlls/d3dx10_43/texture.c | 30 +++++++++++++++++++++++------- 2 files changed, 25 insertions(+), 9 deletions(-) diff --git a/dlls/d3dx10_43/tests/d3dx10.c b/dlls/d3dx10_43/tests/d3dx10.c index 2715f67fa8e..4380da7ab83 100644 --- a/dlls/d3dx10_43/tests/d3dx10.c +++ b/dlls/d3dx10_43/tests/d3dx10.c @@ -6432,7 +6432,7 @@ static void test_load_texture_from_texture(void) 4, 4, 3, 2, DXGI_FORMAT_R8G8B8A8_UNORM, { 1, 0 }, D3D10_USAGE_DEFAULT, D3D10_BIND_SHADER_RESOURCE, 0, 0, } - }, { 0 }, FALSE, D3DERR_INVALIDCALL, .todo_hr = TRUE + }, { 0 }, FALSE, D3DERR_INVALIDCALL }, /* * Invalid mip filter flags. If no mips are generated, no validation is @@ -6548,7 +6548,7 @@ static void test_load_texture_from_texture(void) { { NULL, NULL, 3, 0, 4, 0, 0, D3DX10_DEFAULT, D3DX10_FILTER_POINT, D3DX10_FILTER_POINT }, dds_dxt10_8_8, sizeof(dds_dxt10_8_8), { 0 }, FALSE, - { D3D10_RESOURCE_DIMENSION_UNKNOWN }, { 0 }, FALSE, S_OK, test_16_expected, .todo_hr = TRUE + { D3D10_RESOURCE_DIMENSION_UNKNOWN }, { 0 }, FALSE, S_OK, test_16_expected }, /* * Argument of 0 for NumElements/NumMips matches behavior of diff --git a/dlls/d3dx10_43/texture.c b/dlls/d3dx10_43/texture.c index 71140e9d60b..4b741823722 100644 --- a/dlls/d3dx10_43/texture.c +++ b/dlls/d3dx10_43/texture.c @@ -925,6 +925,12 @@ static void init_d3d10_box(D3D10_BOX *box, uint32_t left, uint32_t top, uint32_t box->back = max(back, front + 1); } +static void d3d10_box_get_level(D3D10_BOX *box, unsigned int level) +{ + init_d3d10_box(box, box->left >> level, box->top >> level, box->right >> level, box->bottom >> level, + box->front >> level, box->back >> level); +} + static void d3d10_box_get_next_level(D3D10_BOX *box) { init_d3d10_box(box, box->left >> 1, box->top >> 1, box->right >> 1, box->bottom >> 1, @@ -1230,12 +1236,6 @@ HRESULT WINAPI D3DX10LoadTextureFromTexture(ID3D10Resource *src_texture, D3DX10_ info.NumMips = min(dst_info.levels - info.DstFirstMip, info.NumMips); loaded_level_count = min(src_info.levels - info.SrcFirstMip, info.NumMips); - if (loaded_level_count < info.NumMips) - { - FIXME("Mipmap generation is currently unimplemented.\n"); - return E_NOTIMPL; - } - if (info.pSrcBox) init_d3d10_box(&src_box, info.pSrcBox->left, info.pSrcBox->top, info.pSrcBox->right, info.pSrcBox->bottom, info.pSrcBox->front, info.pSrcBox->back); @@ -1257,7 +1257,23 @@ HRESULT WINAPI D3DX10LoadTextureFromTexture(ID3D10Resource *src_texture, D3DX10_ if (!info.Filter || info.Filter == D3DX10_DEFAULT) info.Filter = D3DX10_FILTER_LINEAR; - return d3d10_load_texture_from_texture(&src_info, src_texture, &src_box, info.SrcFirstElement, info.SrcFirstMip, + hr = d3d10_load_texture_from_texture(&src_info, src_texture, &src_box, info.SrcFirstElement, info.SrcFirstMip, &dst_info, dst_texture, &dst_box, info.DstFirstElement, info.DstFirstMip, info.NumElements, loaded_level_count, info.Filter); + if (SUCCEEDED(hr) && loaded_level_count < info.NumMips) + { + const uint32_t base_level = loaded_level_count - 1; + D3D10_BOX src_level_box, dst_level_box; + + src_level_box = dst_level_box = dst_box; + d3d10_box_get_level(&src_level_box, base_level); + d3d10_box_get_level(&dst_level_box, base_level + 1); + if (!info.MipFilter || info.MipFilter == D3DX10_DEFAULT) + info.MipFilter = D3DX10_FILTER_LINEAR; + hr = d3d10_load_texture_from_texture(&dst_info, dst_texture, &src_level_box, info.DstFirstElement, base_level, + &dst_info, dst_texture, &dst_level_box, info.DstFirstElement, base_level + 1, info.NumElements, + (info.NumMips - loaded_level_count), info.MipFilter); + } + + return hr; } -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10887