d3d10core/tests: Add test for texturing with custom shader resource views.
Signed-off-by: Józef Kucia <jkucia@codeweavers.com> Signed-off-by: Henri Verbeet <hverbeet@codeweavers.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
932964d9ce
commit
d048d5c201
|
@ -23,8 +23,6 @@
|
||||||
#include "wine/test.h"
|
#include "wine/test.h"
|
||||||
#include <limits.h>
|
#include <limits.h>
|
||||||
|
|
||||||
static BOOL d3d11_available;
|
|
||||||
|
|
||||||
struct vec2
|
struct vec2
|
||||||
{
|
{
|
||||||
float x, y;
|
float x, y;
|
||||||
|
@ -558,6 +556,17 @@ static BOOL is_warp_device(ID3D10Device *device)
|
||||||
|| (adapter_desc.VendorId == 0x1414 && adapter_desc.DeviceId == 0x008c));
|
|| (adapter_desc.VendorId == 0x1414 && adapter_desc.DeviceId == 0x008c));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static BOOL is_d3d11_interface_available(ID3D10Device *device)
|
||||||
|
{
|
||||||
|
ID3D11Device *d3d11_device;
|
||||||
|
HRESULT hr;
|
||||||
|
|
||||||
|
if (SUCCEEDED(hr = ID3D10Device_QueryInterface(device, &IID_ID3D11Device, (void **)&d3d11_device)))
|
||||||
|
ID3D11Device_Release(d3d11_device);
|
||||||
|
|
||||||
|
return SUCCEEDED(hr);
|
||||||
|
}
|
||||||
|
|
||||||
#define SWAPCHAIN_FLAG_SHADER_INPUT 0x1
|
#define SWAPCHAIN_FLAG_SHADER_INPUT 0x1
|
||||||
|
|
||||||
struct swapchain_desc
|
struct swapchain_desc
|
||||||
|
@ -822,8 +831,6 @@ static void test_feature_level(void)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
d3d11_available = TRUE;
|
|
||||||
|
|
||||||
/* Device was created by D3D10CreateDevice. */
|
/* Device was created by D3D10CreateDevice. */
|
||||||
feature_level = ID3D11Device_GetFeatureLevel(device11);
|
feature_level = ID3D11Device_GetFeatureLevel(device11);
|
||||||
ok(feature_level == D3D_FEATURE_LEVEL_10_0, "Got unexpected feature level %#x.\n", feature_level);
|
ok(feature_level == D3D_FEATURE_LEVEL_10_0, "Got unexpected feature level %#x.\n", feature_level);
|
||||||
|
@ -4240,6 +4247,7 @@ static void test_texture(void)
|
||||||
};
|
};
|
||||||
|
|
||||||
struct d3d10core_test_context test_context;
|
struct d3d10core_test_context test_context;
|
||||||
|
D3D10_SHADER_RESOURCE_VIEW_DESC srv_desc;
|
||||||
const struct texture *current_texture;
|
const struct texture *current_texture;
|
||||||
D3D10_TEXTURE2D_DESC texture_desc;
|
D3D10_TEXTURE2D_DESC texture_desc;
|
||||||
D3D10_SAMPLER_DESC sampler_desc;
|
D3D10_SAMPLER_DESC sampler_desc;
|
||||||
|
@ -4575,6 +4583,8 @@ static void test_texture(void)
|
||||||
};
|
};
|
||||||
static const struct texture srgb_texture = {4, 4, 1, 1, DXGI_FORMAT_R8G8B8A8_UNORM_SRGB,
|
static const struct texture srgb_texture = {4, 4, 1, 1, DXGI_FORMAT_R8G8B8A8_UNORM_SRGB,
|
||||||
{{srgb_data, 4 * sizeof(*srgb_data)}}};
|
{{srgb_data, 4 * sizeof(*srgb_data)}}};
|
||||||
|
static const struct texture srgb_typeless = {4, 4, 1, 1, DXGI_FORMAT_R8G8B8A8_TYPELESS,
|
||||||
|
{{srgb_data, 4 * sizeof(*srgb_data)}}};
|
||||||
static const struct texture a8_texture = {4, 4, 1, 1, DXGI_FORMAT_A8_UNORM,
|
static const struct texture a8_texture = {4, 4, 1, 1, DXGI_FORMAT_A8_UNORM,
|
||||||
{{a8_data, 4 * sizeof(*a8_data)}}};
|
{{a8_data, 4 * sizeof(*a8_data)}}};
|
||||||
static const struct texture bc1_texture = {8, 8, 1, 1, DXGI_FORMAT_BC1_UNORM, {{bc1_data, 2 * 8}}};
|
static const struct texture bc1_texture = {8, 8, 1, 1, DXGI_FORMAT_BC1_UNORM, {{bc1_data, 2 * 8}}};
|
||||||
|
@ -4585,6 +4595,9 @@ static void test_texture(void)
|
||||||
static const struct texture bc1_texture_srgb = {8, 8, 1, 1, DXGI_FORMAT_BC1_UNORM_SRGB, {{bc1_data, 2 * 8}}};
|
static const struct texture bc1_texture_srgb = {8, 8, 1, 1, DXGI_FORMAT_BC1_UNORM_SRGB, {{bc1_data, 2 * 8}}};
|
||||||
static const struct texture bc2_texture_srgb = {8, 8, 1, 1, DXGI_FORMAT_BC2_UNORM_SRGB, {{bc2_data, 2 * 16}}};
|
static const struct texture bc2_texture_srgb = {8, 8, 1, 1, DXGI_FORMAT_BC2_UNORM_SRGB, {{bc2_data, 2 * 16}}};
|
||||||
static const struct texture bc3_texture_srgb = {8, 8, 1, 1, DXGI_FORMAT_BC3_UNORM_SRGB, {{bc3_data, 2 * 16}}};
|
static const struct texture bc3_texture_srgb = {8, 8, 1, 1, DXGI_FORMAT_BC3_UNORM_SRGB, {{bc3_data, 2 * 16}}};
|
||||||
|
static const struct texture bc1_typeless = {8, 8, 1, 1, DXGI_FORMAT_BC1_TYPELESS, {{bc1_data, 2 * 8}}};
|
||||||
|
static const struct texture bc2_typeless = {8, 8, 1, 1, DXGI_FORMAT_BC2_TYPELESS, {{bc2_data, 2 * 16}}};
|
||||||
|
static const struct texture bc3_typeless = {8, 8, 1, 1, DXGI_FORMAT_BC3_TYPELESS, {{bc3_data, 2 * 16}}};
|
||||||
static const struct texture sint8_texture = {4, 4, 1, 1, DXGI_FORMAT_R8G8B8A8_SINT,
|
static const struct texture sint8_texture = {4, 4, 1, 1, DXGI_FORMAT_R8G8B8A8_SINT,
|
||||||
{{rgba_level_0, 4 * sizeof(*rgba_level_0)}}};
|
{{rgba_level_0, 4 * sizeof(*rgba_level_0)}}};
|
||||||
static const struct texture uint8_texture = {4, 4, 1, 1, DXGI_FORMAT_R8G8B8A8_UINT,
|
static const struct texture uint8_texture = {4, 4, 1, 1, DXGI_FORMAT_R8G8B8A8_UINT,
|
||||||
|
@ -4678,7 +4691,7 @@ static void test_texture(void)
|
||||||
static const DWORD zero_colors[4 * 4] = {0};
|
static const DWORD zero_colors[4 * 4] = {0};
|
||||||
static const float red[] = {1.0f, 0.0f, 0.0f, 0.5f};
|
static const float red[] = {1.0f, 0.0f, 0.0f, 0.5f};
|
||||||
|
|
||||||
static const struct test
|
static const struct texture_test
|
||||||
{
|
{
|
||||||
const struct shader *ps;
|
const struct shader *ps;
|
||||||
const struct texture *texture;
|
const struct texture *texture;
|
||||||
|
@ -4689,7 +4702,7 @@ static void test_texture(void)
|
||||||
float ps_constant;
|
float ps_constant;
|
||||||
const DWORD *expected_colors;
|
const DWORD *expected_colors;
|
||||||
}
|
}
|
||||||
tests[] =
|
texture_tests[] =
|
||||||
{
|
{
|
||||||
#define POINT D3D10_FILTER_MIN_MAG_MIP_POINT
|
#define POINT D3D10_FILTER_MIN_MAG_MIP_POINT
|
||||||
#define POINT_LINEAR D3D10_FILTER_MIN_MAG_POINT_MIP_LINEAR
|
#define POINT_LINEAR D3D10_FILTER_MIN_MAG_POINT_MIP_LINEAR
|
||||||
|
@ -4793,6 +4806,51 @@ static void test_texture(void)
|
||||||
#undef POINT_LINEAR
|
#undef POINT_LINEAR
|
||||||
#undef MIP_MAX
|
#undef MIP_MAX
|
||||||
};
|
};
|
||||||
|
static const struct srv_test
|
||||||
|
{
|
||||||
|
const struct shader *ps;
|
||||||
|
const struct texture *texture;
|
||||||
|
struct srv_desc srv_desc;
|
||||||
|
float ps_constant;
|
||||||
|
const DWORD *expected_colors;
|
||||||
|
}
|
||||||
|
srv_tests[] =
|
||||||
|
{
|
||||||
|
#define TEX_2D D3D10_SRV_DIMENSION_TEXTURE2D
|
||||||
|
#define TEX_2D_ARRAY D3D10_SRV_DIMENSION_TEXTURE2DARRAY
|
||||||
|
#define BC1_UNORM DXGI_FORMAT_BC1_UNORM
|
||||||
|
#define BC1_UNORM_SRGB DXGI_FORMAT_BC1_UNORM_SRGB
|
||||||
|
#define BC2_UNORM DXGI_FORMAT_BC2_UNORM
|
||||||
|
#define BC2_UNORM_SRGB DXGI_FORMAT_BC2_UNORM_SRGB
|
||||||
|
#define BC3_UNORM DXGI_FORMAT_BC3_UNORM
|
||||||
|
#define BC3_UNORM_SRGB DXGI_FORMAT_BC3_UNORM_SRGB
|
||||||
|
#define R8G8B8A8_UNORM_SRGB DXGI_FORMAT_R8G8B8A8_UNORM_SRGB
|
||||||
|
#define R8G8B8A8_UNORM DXGI_FORMAT_R8G8B8A8_UNORM
|
||||||
|
#define FMT_UNKNOWN DXGI_FORMAT_UNKNOWN
|
||||||
|
{&ps_sample, &bc1_typeless, {BC1_UNORM, TEX_2D, 0, 1}, 0.0f, bc_colors},
|
||||||
|
{&ps_sample, &bc1_typeless, {BC1_UNORM_SRGB, TEX_2D, 0, 1}, 0.0f, bc_colors},
|
||||||
|
{&ps_sample, &bc2_typeless, {BC2_UNORM, TEX_2D, 0, 1}, 0.0f, bc_colors},
|
||||||
|
{&ps_sample, &bc2_typeless, {BC2_UNORM_SRGB, TEX_2D, 0, 1}, 0.0f, bc_colors},
|
||||||
|
{&ps_sample, &bc3_typeless, {BC3_UNORM, TEX_2D, 0, 1}, 0.0f, bc_colors},
|
||||||
|
{&ps_sample, &bc3_typeless, {BC3_UNORM_SRGB, TEX_2D, 0, 1}, 0.0f, bc_colors},
|
||||||
|
{&ps_sample, &srgb_typeless, {R8G8B8A8_UNORM_SRGB, TEX_2D, 0, 1}, 0.0f, srgb_colors},
|
||||||
|
{&ps_sample, &srgb_typeless, {R8G8B8A8_UNORM, TEX_2D, 0, 1}, 0.0f, srgb_data},
|
||||||
|
{&ps_sample, &array_2d_texture, {FMT_UNKNOWN, TEX_2D, 0, 1}, 0.0f, red_colors},
|
||||||
|
{&ps_sample_2d_array, &array_2d_texture, {FMT_UNKNOWN, TEX_2D_ARRAY, 0, 1, 0, 1}, 0.0f, red_colors},
|
||||||
|
{&ps_sample_2d_array, &array_2d_texture, {FMT_UNKNOWN, TEX_2D_ARRAY, 0, 1, 1, 1}, 0.0f, green_data},
|
||||||
|
{&ps_sample_2d_array, &array_2d_texture, {FMT_UNKNOWN, TEX_2D_ARRAY, 0, 1, 2, 1}, 0.0f, blue_colors},
|
||||||
|
#undef TEX_2D
|
||||||
|
#undef TEX_2D_ARRAY
|
||||||
|
#undef BC1_UNORM
|
||||||
|
#undef BC1_UNORM_SRGB
|
||||||
|
#undef BC2_UNORM
|
||||||
|
#undef BC2_UNORM_SRGB
|
||||||
|
#undef BC3_UNORM
|
||||||
|
#undef BC3_UNORM_SRGB
|
||||||
|
#undef R8G8B8A8_UNORM_SRGB
|
||||||
|
#undef R8G8B8A8_UNORM
|
||||||
|
#undef FMT_UNKNOWN
|
||||||
|
};
|
||||||
|
|
||||||
if (!init_test_context(&test_context))
|
if (!init_test_context(&test_context))
|
||||||
return;
|
return;
|
||||||
|
@ -4830,9 +4888,9 @@ static void test_texture(void)
|
||||||
texture = NULL;
|
texture = NULL;
|
||||||
current_ps = NULL;
|
current_ps = NULL;
|
||||||
current_texture = NULL;
|
current_texture = NULL;
|
||||||
for (i = 0; i < sizeof(tests) / sizeof(*tests); ++i)
|
for (i = 0; i < sizeof(texture_tests) / sizeof(*texture_tests); ++i)
|
||||||
{
|
{
|
||||||
const struct test *test = &tests[i];
|
const struct texture_test *test = &texture_tests[i];
|
||||||
|
|
||||||
if (current_ps != test->ps)
|
if (current_ps != test->ps)
|
||||||
{
|
{
|
||||||
|
@ -4924,6 +4982,96 @@ static void test_texture(void)
|
||||||
ID3D10Texture2D_Release(texture);
|
ID3D10Texture2D_Release(texture);
|
||||||
ID3D10PixelShader_Release(ps);
|
ID3D10PixelShader_Release(ps);
|
||||||
|
|
||||||
|
if (is_warp_device(device) && !is_d3d11_interface_available(device))
|
||||||
|
{
|
||||||
|
win_skip("SRV tests are broken on WARP.\n");
|
||||||
|
ID3D10Buffer_Release(cb);
|
||||||
|
release_test_context(&test_context);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
sampler_desc.Filter = D3D10_FILTER_MIN_MAG_MIP_POINT;
|
||||||
|
sampler_desc.MipLODBias = 0.0f;
|
||||||
|
sampler_desc.MinLOD = 0.0f;
|
||||||
|
sampler_desc.MaxLOD = D3D10_FLOAT32_MAX;
|
||||||
|
|
||||||
|
hr = ID3D10Device_CreateSamplerState(device, &sampler_desc, &sampler);
|
||||||
|
ok(SUCCEEDED(hr), "Failed to create sampler state, hr %#x.\n", hr);
|
||||||
|
|
||||||
|
ID3D10Device_PSSetSamplers(device, 0, 1, &sampler);
|
||||||
|
|
||||||
|
ps = NULL;
|
||||||
|
srv = NULL;
|
||||||
|
texture = NULL;
|
||||||
|
current_ps = NULL;
|
||||||
|
current_texture = NULL;
|
||||||
|
for (i = 0; i < sizeof(srv_tests) / sizeof(*srv_tests); ++i)
|
||||||
|
{
|
||||||
|
const struct srv_test *test = &srv_tests[i];
|
||||||
|
|
||||||
|
if (current_ps != test->ps)
|
||||||
|
{
|
||||||
|
if (ps)
|
||||||
|
ID3D10PixelShader_Release(ps);
|
||||||
|
|
||||||
|
current_ps = test->ps;
|
||||||
|
|
||||||
|
hr = ID3D10Device_CreatePixelShader(device, current_ps->code, current_ps->size, &ps);
|
||||||
|
ok(SUCCEEDED(hr), "Test %u: Failed to create pixel shader, hr %#x.\n", i, hr);
|
||||||
|
|
||||||
|
ID3D10Device_PSSetShader(device, ps);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (current_texture != test->texture)
|
||||||
|
{
|
||||||
|
if (texture)
|
||||||
|
ID3D10Texture2D_Release(texture);
|
||||||
|
|
||||||
|
current_texture = test->texture;
|
||||||
|
|
||||||
|
texture_desc.Width = current_texture->width;
|
||||||
|
texture_desc.Height = current_texture->height;
|
||||||
|
texture_desc.MipLevels = current_texture->miplevel_count;
|
||||||
|
texture_desc.ArraySize = current_texture->array_size;
|
||||||
|
texture_desc.Format = current_texture->format;
|
||||||
|
|
||||||
|
hr = ID3D10Device_CreateTexture2D(device, &texture_desc, current_texture->data, &texture);
|
||||||
|
ok(SUCCEEDED(hr), "Test %u: Failed to create 2d texture, hr %#x.\n", i, hr);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (srv)
|
||||||
|
ID3D10ShaderResourceView_Release(srv);
|
||||||
|
|
||||||
|
get_srv_desc(&srv_desc, &test->srv_desc);
|
||||||
|
hr = ID3D10Device_CreateShaderResourceView(device, (ID3D10Resource *)texture, &srv_desc, &srv);
|
||||||
|
ok(SUCCEEDED(hr), "Test %u: Failed to create shader resource view, hr %#x.\n", i, hr);
|
||||||
|
|
||||||
|
ID3D10Device_PSSetShaderResources(device, 0, 1, &srv);
|
||||||
|
|
||||||
|
ps_constant.x = test->ps_constant;
|
||||||
|
ID3D10Device_UpdateSubresource(device, (ID3D10Resource *)cb, 0, NULL, &ps_constant, 0, 0);
|
||||||
|
|
||||||
|
ID3D10Device_ClearRenderTargetView(device, test_context.backbuffer_rtv, red);
|
||||||
|
|
||||||
|
draw_quad(&test_context);
|
||||||
|
|
||||||
|
get_texture_readback(test_context.backbuffer, 0, &rb);
|
||||||
|
for (y = 0; y < 4; ++y)
|
||||||
|
{
|
||||||
|
for (x = 0; x < 4; ++x)
|
||||||
|
{
|
||||||
|
color = get_readback_color(&rb, 80 + x * 160, 60 + y * 120);
|
||||||
|
ok(compare_color(color, test->expected_colors[y * 4 + x], 1),
|
||||||
|
"Test %u: Got unexpected color 0x%08x at (%u, %u).\n", i, color, x, y);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
release_texture_readback(&rb);
|
||||||
|
}
|
||||||
|
ID3D10PixelShader_Release(ps);
|
||||||
|
ID3D10Texture2D_Release(texture);
|
||||||
|
ID3D10ShaderResourceView_Release(srv);
|
||||||
|
ID3D10SamplerState_Release(sampler);
|
||||||
|
|
||||||
ID3D10Buffer_Release(cb);
|
ID3D10Buffer_Release(cb);
|
||||||
release_test_context(&test_context);
|
release_test_context(&test_context);
|
||||||
}
|
}
|
||||||
|
@ -6680,7 +6828,7 @@ static void test_clear_render_target_view(void)
|
||||||
ID3D10Device_ClearRenderTargetView(device, rtv, color);
|
ID3D10Device_ClearRenderTargetView(device, rtv, color);
|
||||||
check_texture_color(texture, expected_color, 1);
|
check_texture_color(texture, expected_color, 1);
|
||||||
|
|
||||||
if (d3d11_available)
|
if (is_d3d11_interface_available(device))
|
||||||
{
|
{
|
||||||
ID3D10Device_ClearRenderTargetView(device, NULL, green);
|
ID3D10Device_ClearRenderTargetView(device, NULL, green);
|
||||||
check_texture_color(texture, expected_color, 1);
|
check_texture_color(texture, expected_color, 1);
|
||||||
|
@ -6791,7 +6939,7 @@ static void test_clear_depth_stencil_view(void)
|
||||||
ID3D10Device_ClearDepthStencilView(device, dsv, D3D10_CLEAR_DEPTH | D3D10_CLEAR_STENCIL, 0.0f, 0);
|
ID3D10Device_ClearDepthStencilView(device, dsv, D3D10_CLEAR_DEPTH | D3D10_CLEAR_STENCIL, 0.0f, 0);
|
||||||
check_texture_color(depth_texture, 0x00000000, 0);
|
check_texture_color(depth_texture, 0x00000000, 0);
|
||||||
|
|
||||||
if (d3d11_available)
|
if (is_d3d11_interface_available(device))
|
||||||
{
|
{
|
||||||
ID3D10Device_ClearDepthStencilView(device, NULL, D3D10_CLEAR_DEPTH | D3D10_CLEAR_STENCIL, 1.0f, 0xff);
|
ID3D10Device_ClearDepthStencilView(device, NULL, D3D10_CLEAR_DEPTH | D3D10_CLEAR_STENCIL, 1.0f, 0xff);
|
||||||
check_texture_color(depth_texture, 0x00000000, 0);
|
check_texture_color(depth_texture, 0x00000000, 0);
|
||||||
|
|
Loading…
Reference in New Issue