From: Connor McAdams <cmcadams@codeweavers.com> Signed-off-by: Connor McAdams <cmcadams@codeweavers.com> --- dlls/d3dx10_43/tests/d3dx10.c | 13 +++++---- dlls/d3dx10_43/texture.c | 50 +++++++++++++++++++++++++++++++++++ 2 files changed, 56 insertions(+), 7 deletions(-) diff --git a/dlls/d3dx10_43/tests/d3dx10.c b/dlls/d3dx10_43/tests/d3dx10.c index 4380da7ab83..0008a995ff8 100644 --- a/dlls/d3dx10_43/tests/d3dx10.c +++ b/dlls/d3dx10_43/tests/d3dx10.c @@ -6486,7 +6486,7 @@ static void test_load_texture_from_texture(void) 4, 4, 1, 1, DXGI_FORMAT_R8G8B8A8_UNORM, { 1, 0 }, D3D10_USAGE_DEFAULT, D3D10_BIND_SHADER_RESOURCE, 0, 0, } - }, { 0 }, FALSE, S_OK, &dds_dxt10_3d_texture_4_4[0x94], .todo_hr = TRUE + }, { 0 }, FALSE, S_OK, &dds_dxt10_3d_texture_4_4[0x94] }, /* Load a 3D texture into a 2D texture with a source box offset. */ { @@ -6499,7 +6499,7 @@ static void test_load_texture_from_texture(void) 4, 4, 1, 1, DXGI_FORMAT_R8G8B8A8_UNORM, { 1, 0 }, D3D10_USAGE_DEFAULT, D3D10_BIND_SHADER_RESOURCE, 0, 0, } - }, { 0 }, FALSE, S_OK, &dds_dxt10_3d_texture_4_4[0xd4], .todo_hr = TRUE + }, { 0 }, FALSE, S_OK, &dds_dxt10_3d_texture_4_4[0xd4] }, /* Load a 3D texture into a 3D texture with identical dimensions. */ { @@ -6512,7 +6512,7 @@ static void test_load_texture_from_texture(void) 4, 4, 4, 2, DXGI_FORMAT_R8G8B8A8_UNORM, D3D10_USAGE_DEFAULT, D3D10_BIND_SHADER_RESOURCE, 0, 0, } - }, { 0 }, FALSE, S_OK, &dds_dxt10_3d_texture_4_4[0x94], .todo_hr = TRUE + }, { 0 }, FALSE, S_OK, &dds_dxt10_3d_texture_4_4[0x94] }, /* Load a 3D texture into a 3D texture with a first mip offset. */ { @@ -6525,7 +6525,7 @@ static void test_load_texture_from_texture(void) 2, 2, 2, 1, DXGI_FORMAT_R8G8B8A8_UNORM, D3D10_USAGE_DEFAULT, D3D10_BIND_SHADER_RESOURCE, 0, 0, } - }, { 0 }, FALSE, S_OK, &dds_dxt10_3d_texture_4_4[0x194], .todo_hr = TRUE + }, { 0 }, FALSE, S_OK, &dds_dxt10_3d_texture_4_4[0x194] }, /* * 15. @@ -6690,9 +6690,8 @@ static void test_load_texture_from_texture(void) ok(!!dst_rsrc, "Got unexpected dst_rsrc %p.\n", dst_rsrc); hr = D3DX10LoadTextureFromTexture(src_rsrc, NULL, dst_rsrc); - todo_wine ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - if (SUCCEEDED(hr)) - check_test_resource_data(dst_rsrc, &dds_dxt10_3d_texture_4_4[0x94]); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + check_test_resource_data(dst_rsrc, &dds_dxt10_3d_texture_4_4[0x94]); ID3D10Resource_Release(src_rsrc); ID3D10Resource_Release(dst_rsrc); diff --git a/dlls/d3dx10_43/texture.c b/dlls/d3dx10_43/texture.c index e8e05f46c76..f8bd71f4057 100644 --- a/dlls/d3dx10_43/texture.c +++ b/dlls/d3dx10_43/texture.c @@ -1014,6 +1014,28 @@ static HRESULT d3dx_texture_info_from_d3d10_resource(ID3D10Resource *rsrc, struc break; } + case D3D10_RESOURCE_DIMENSION_TEXTURE3D: + { + D3D10_TEXTURE3D_DESC desc_3d; + ID3D10Texture3D *tex_3d; + + hr = ID3D10Resource_QueryInterface(rsrc, &IID_ID3D10Texture3D, (void **)&tex_3d); + if (FAILED(hr)) + return hr; + ID3D10Texture3D_GetDesc(tex_3d, &desc_3d); + ID3D10Texture3D_Release(tex_3d); + + info->resource_type = D3DX_RESOURCE_TYPE_TEXTURE_3D; + info->fmt = get_d3dx_pixel_format_info(d3dx_pixel_format_id_from_dxgi_format(desc_3d.Format)); + if (is_unknown_format(info->fmt)) + return E_NOTIMPL; + set_volume_struct(&info->size, desc_3d.Width, desc_3d.Height, desc_3d.Depth); + info->levels = desc_3d.MipLevels; + info->layers = 1; + info->usage = desc_3d.Usage; + break; + } + default: FIXME("Unhandled resource type %d.\n", rsrc_dim); return E_NOTIMPL; @@ -1039,6 +1061,15 @@ static HRESULT d3d10_staging_resource_from_d3dx_texture_info(ID3D10Device *devic return ID3D10Device_CreateTexture2D(device, &desc, NULL, (ID3D10Texture2D **)rsrc); } + case D3DX_RESOURCE_TYPE_TEXTURE_3D: + { + D3D10_TEXTURE3D_DESC desc = { info->size.width, info->size.height, info->size.depth, 1, 0, + D3D10_USAGE_STAGING, 0, cpu_flags }; + + desc.Format = dxgi_format_from_d3dx_pixel_format_id(info->fmt->format); + return ID3D10Device_CreateTexture3D(device, &desc, NULL, (ID3D10Texture3D **)rsrc); + } + default: return E_NOTIMPL; } @@ -1067,6 +1098,21 @@ static HRESULT d3dx_subresource_data_from_d3d10_staging_resource_map(ID3D10Resou break; } + case D3DX_RESOURCE_TYPE_TEXTURE_3D: + { + ID3D10Texture3D *tex = (ID3D10Texture3D *)rsrc; + D3D10_MAPPED_TEXTURE3D map; + + hr = ID3D10Texture3D_Map(tex, 0, map_type, 0, &map); + if (SUCCEEDED(hr)) + { + out_data->data = map.pData; + out_data->row_pitch = map.RowPitch; + out_data->slice_pitch = map.DepthPitch; + } + break; + } + default: hr = E_NOTIMPL; break; @@ -1083,6 +1129,10 @@ static void d3d10_staging_resource_unmap(ID3D10Resource *rsrc, enum d3dx_resourc ID3D10Texture2D_Unmap((ID3D10Texture2D *)rsrc, 0); break; + case D3DX_RESOURCE_TYPE_TEXTURE_3D: + ID3D10Texture3D_Unmap((ID3D10Texture3D *)rsrc, 0); + break; + default: break; } -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10887