[PATCH v2 4/5] d3d10core/tests: Add 3D texture readback.
Jan Sikorski
jsikorski at codeweavers.com
Wed Mar 17 07:50:58 CDT 2021
Signed-off-by: Jan Sikorski <jsikorski at codeweavers.com>
---
dlls/d3d10core/tests/d3d10core.c | 81 ++++++++++++++++++++++++++------
1 file changed, 67 insertions(+), 14 deletions(-)
diff --git a/dlls/d3d10core/tests/d3d10core.c b/dlls/d3d10core/tests/d3d10core.c
index b2a2e2028f2..09279f5fc62 100644
--- a/dlls/d3d10core/tests/d3d10core.c
+++ b/dlls/d3d10core/tests/d3d10core.c
@@ -594,8 +594,8 @@ struct resource_readback
{
D3D10_RESOURCE_DIMENSION dimension;
ID3D10Resource *resource;
- D3D10_MAPPED_TEXTURE2D map_desc;
- unsigned int width, height, sub_resource_idx;
+ D3D10_MAPPED_TEXTURE3D map_desc;
+ unsigned int width, height, depth, sub_resource_idx;
};
static void get_buffer_readback(ID3D10Buffer *buffer, struct resource_readback *rb)
@@ -623,6 +623,7 @@ static void get_buffer_readback(ID3D10Buffer *buffer, struct resource_readback *
rb->width = buffer_desc.ByteWidth;
rb->height = 1;
+ rb->depth = 1;
rb->sub_resource_idx = 0;
ID3D10Device_CopyResource(device, rb->resource, (ID3D10Resource *)buffer);
@@ -633,6 +634,7 @@ static void get_buffer_readback(ID3D10Buffer *buffer, struct resource_readback *
rb->resource = NULL;
}
rb->map_desc.RowPitch = 0;
+ rb->map_desc.DepthPitch = 0;
ID3D10Device_Release(device);
}
@@ -665,6 +667,7 @@ static void get_texture1d_readback(ID3D10Texture1D *texture, unsigned int sub_re
miplevel = sub_resource_idx % texture_desc.MipLevels;
rb->width = max(1, texture_desc.Width >> miplevel);
rb->height = 1;
+ rb->depth = 1;
rb->sub_resource_idx = sub_resource_idx;
ID3D10Device_CopyResource(device, rb->resource, (ID3D10Resource *)texture);
@@ -676,6 +679,7 @@ static void get_texture1d_readback(ID3D10Texture1D *texture, unsigned int sub_re
rb->resource = NULL;
}
rb->map_desc.RowPitch = 0;
+ rb->map_desc.DepthPitch = 0;
ID3D10Device_Release(device);
}
@@ -708,10 +712,55 @@ static void get_texture_readback(ID3D10Texture2D *texture, unsigned int sub_reso
miplevel = sub_resource_idx % texture_desc.MipLevels;
rb->width = max(1, texture_desc.Width >> miplevel);
rb->height = max(1, texture_desc.Height >> miplevel);
+ rb->depth = 1;
rb->sub_resource_idx = sub_resource_idx;
ID3D10Device_CopyResource(device, rb->resource, (ID3D10Resource *)texture);
if (FAILED(hr = ID3D10Texture2D_Map((ID3D10Texture2D *)rb->resource, sub_resource_idx,
+ D3D10_MAP_READ, 0, (D3D10_MAPPED_TEXTURE2D *)&rb->map_desc)))
+ {
+ trace("Failed to map sub-resource %u, hr %#x.\n", sub_resource_idx, hr);
+ ID3D10Resource_Release(rb->resource);
+ rb->resource = NULL;
+ }
+ rb->map_desc.DepthPitch = 0;
+
+ ID3D10Device_Release(device);
+}
+
+static void get_texture3d_readback(ID3D10Texture3D *texture, unsigned int sub_resource_idx,
+ struct resource_readback *rb)
+{
+ D3D10_TEXTURE3D_DESC texture_desc;
+ unsigned int miplevel;
+ ID3D10Device *device;
+ HRESULT hr;
+
+ memset(rb, 0, sizeof(*rb));
+ rb->dimension = D3D10_RESOURCE_DIMENSION_TEXTURE3D;
+
+ ID3D10Texture3D_GetDevice(texture, &device);
+
+ ID3D10Texture3D_GetDesc(texture, &texture_desc);
+ texture_desc.Usage = D3D10_USAGE_STAGING;
+ texture_desc.BindFlags = 0;
+ texture_desc.CPUAccessFlags = D3D10_CPU_ACCESS_READ;
+ texture_desc.MiscFlags = 0;
+ if (FAILED(hr = ID3D10Device_CreateTexture3D(device, &texture_desc, NULL, (ID3D10Texture3D **)&rb->resource)))
+ {
+ trace("Failed to create texture, hr %#x.\n", hr);
+ ID3D10Device_Release(device);
+ return;
+ }
+
+ miplevel = sub_resource_idx % texture_desc.MipLevels;
+ rb->width = max(1, texture_desc.Width >> miplevel);
+ rb->height = max(1, texture_desc.Height >> miplevel);
+ rb->depth = max(1, texture_desc.Depth >> miplevel);
+ rb->sub_resource_idx = sub_resource_idx;
+
+ ID3D10Device_CopyResource(device, rb->resource, (ID3D10Resource *)texture);
+ if (FAILED(hr = ID3D10Texture3D_Map((ID3D10Texture3D *)rb->resource, sub_resource_idx,
D3D10_MAP_READ, 0, &rb->map_desc)))
{
trace("Failed to map sub-resource %u, hr %#x.\n", sub_resource_idx, hr);
@@ -722,24 +771,25 @@ static void get_texture_readback(ID3D10Texture2D *texture, unsigned int sub_reso
ID3D10Device_Release(device);
}
-static void *get_readback_data(struct resource_readback *rb, unsigned int x, unsigned int y, unsigned byte_width)
+static void *get_readback_data(struct resource_readback *rb,
+ unsigned int x, unsigned int y, unsigned int z, unsigned byte_width)
{
- return (BYTE *)rb->map_desc.pData + y * rb->map_desc.RowPitch + x * byte_width;
+ return (BYTE *)rb->map_desc.pData + z * rb->map_desc.DepthPitch + y * rb->map_desc.RowPitch + x * byte_width;
}
static BYTE get_readback_u8(struct resource_readback *rb, unsigned int x, unsigned int y)
{
- return *(BYTE *)get_readback_data(rb, x, y, sizeof(BYTE));
+ return *(BYTE *)get_readback_data(rb, x, y, 0, sizeof(BYTE));
}
static WORD get_readback_u16(struct resource_readback *rb, unsigned int x, unsigned int y)
{
- return *(WORD *)get_readback_data(rb, x, y, sizeof(WORD));
+ return *(WORD *)get_readback_data(rb, x, y, 0, sizeof(WORD));
}
static DWORD get_readback_u32(struct resource_readback *rb, unsigned int x, unsigned int y)
{
- return *(DWORD *)get_readback_data(rb, x, y, sizeof(DWORD));
+ return *(DWORD *)get_readback_data(rb, x, y, 0, sizeof(DWORD));
}
static DWORD get_readback_color(struct resource_readback *rb, unsigned int x, unsigned int y)
@@ -749,17 +799,17 @@ static DWORD get_readback_color(struct resource_readback *rb, unsigned int x, un
static float get_readback_float(struct resource_readback *rb, unsigned int x, unsigned int y)
{
- return *(float *)get_readback_data(rb, x, y, sizeof(float));
+ return *(float *)get_readback_data(rb, x, y, 0, sizeof(float));
}
static const struct vec4 *get_readback_vec4(struct resource_readback *rb, unsigned int x, unsigned int y)
{
- return get_readback_data(rb, x, y, sizeof(struct vec4));
+ return get_readback_data(rb, x, y, 0, sizeof(struct vec4));
}
static const struct uvec4 *get_readback_uvec4(struct resource_readback *rb, unsigned int x, unsigned int y)
{
- return get_readback_data(rb, x, y, sizeof(struct uvec4));
+ return get_readback_data(rb, x, y, 0, sizeof(struct uvec4));
}
static void release_resource_readback(struct resource_readback *rb)
@@ -775,6 +825,9 @@ static void release_resource_readback(struct resource_readback *rb)
case D3D10_RESOURCE_DIMENSION_TEXTURE2D:
ID3D10Texture2D_Unmap((ID3D10Texture2D *)rb->resource, rb->sub_resource_idx);
break;
+ case D3D10_RESOURCE_DIMENSION_TEXTURE3D:
+ ID3D10Texture3D_Unmap((ID3D10Texture3D *)rb->resource, rb->sub_resource_idx);
+ break;
default:
trace("Unhandled resource dimension %#x.\n", rb->dimension);
break;
@@ -15970,12 +16023,12 @@ static void test_depth_bias(void)
depth_values[y] = get_readback_float(&rb, 0, y);
break;
case DXGI_FORMAT_D24_UNORM_S8_UINT:
- u32 = get_readback_data(&rb, 0, y, sizeof(*u32));
+ u32 = get_readback_data(&rb, 0, y, 0, sizeof(*u32));
u32_value = *u32 >> shift;
depth_values[y] = u32_value / 16777215.0f;
break;
case DXGI_FORMAT_D16_UNORM:
- u16 = get_readback_data(&rb, 0, y, sizeof(*u16));
+ u16 = get_readback_data(&rb, 0, y, 0, sizeof(*u16));
depth_values[y] = *u16 / 65535.0f;
break;
default:
@@ -16013,7 +16066,7 @@ static void test_depth_bias(void)
"Got depth %.8e, expected %.8e.\n", data, depth);
break;
case DXGI_FORMAT_D24_UNORM_S8_UINT:
- u32 = get_readback_data(&rb, 0, y, sizeof(*u32));
+ u32 = get_readback_data(&rb, 0, y, 0, sizeof(*u32));
u32_value = *u32 >> shift;
expected_value = depth * 16777215.0f + 0.5f;
all_match = compare_uint(u32_value, expected_value, 3);
@@ -16023,7 +16076,7 @@ static void test_depth_bias(void)
expected_value, expected_value / 16777215.0f);
break;
case DXGI_FORMAT_D16_UNORM:
- u16 = get_readback_data(&rb, 0, y, sizeof(*u16));
+ u16 = get_readback_data(&rb, 0, y, 0, sizeof(*u16));
expected_value = depth * 65535.0f + 0.5f;
all_match = compare_uint(*u16, expected_value, 1);
ok(all_match,
--
2.30.1
More information about the wine-devel
mailing list