From 9e18111027c1ebff4c2c871c538ced38b693268a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B3zef=20Kucia?= Date: Wed, 12 Jul 2017 13:10:44 +0200 Subject: [PATCH] tests: Add test for creating samplers. --- tests/d3d12.c | 92 +++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 89 insertions(+), 3 deletions(-) diff --git a/tests/d3d12.c b/tests/d3d12.c index 7bbf252c..5eb1e30b 100644 --- a/tests/d3d12.c +++ b/tests/d3d12.c @@ -593,14 +593,29 @@ static void check_sub_resource_vec4_(unsigned int line, ID3D12Resource *texture, static ID3D12Device *create_device(void) { ID3D12Device *device; - HRESULT hr; - if (FAILED(hr = D3D12CreateDevice(NULL, D3D_FEATURE_LEVEL_11_0, &IID_ID3D12Device, (void **)&device))) + if (FAILED(D3D12CreateDevice(NULL, D3D_FEATURE_LEVEL_11_0, &IID_ID3D12Device, (void **)&device))) return NULL; return device; } +static bool is_min_max_filtering_supported(ID3D12Device *device) +{ + D3D12_FEATURE_DATA_D3D12_OPTIONS options; + HRESULT hr; + + if (FAILED(hr = ID3D12Device_CheckFeatureSupport(device, + D3D12_FEATURE_D3D12_OPTIONS, &options, sizeof(options)))) + { + trace("CheckFeatureSupport failed, hr %#x.\n", hr); + return false; + } + + /* D3D12 validation layer says tiled resource tier 2+ support implies min/max filtering support. */ + return options.TiledResourcesTier >= D3D12_TILED_RESOURCES_TIER_2; +} + #define create_empty_root_signature(device, flags) create_empty_root_signature_(__LINE__, device, flags) static ID3D12RootSignature *create_empty_root_signature_(unsigned int line, ID3D12Device *device, D3D12_ROOT_SIGNATURE_FLAGS flags) @@ -1516,6 +1531,76 @@ static void test_create_descriptor_heap(void) ok(!refcount, "ID3D12Device has %u references left.\n", (unsigned int)refcount); } +static void test_create_sampler(void) +{ + D3D12_CPU_DESCRIPTOR_HANDLE cpu_handle; + D3D12_DESCRIPTOR_HEAP_DESC heap_desc; + unsigned int sampler_increment_size; + D3D12_SAMPLER_DESC sampler_desc; + ID3D12DescriptorHeap *heap; + ID3D12Device *device; + unsigned int i; + ULONG refcount; + HRESULT hr; + + if (!(device = create_device())) + { + skip("Failed to create device.\n"); + return; + } + + sampler_increment_size = ID3D12Device_GetDescriptorHandleIncrementSize(device, + D3D12_DESCRIPTOR_HEAP_TYPE_SAMPLER); + trace("Sampler descriptor handle increment size: %u.\n", sampler_increment_size); + ok(sampler_increment_size, "Got unexpected increment size %#x.\n", sampler_increment_size); + + heap_desc.Type = D3D12_DESCRIPTOR_HEAP_TYPE_SAMPLER; + heap_desc.NumDescriptors = 16; + heap_desc.Flags = D3D12_DESCRIPTOR_HEAP_FLAG_SHADER_VISIBLE; + heap_desc.NodeMask = 0; + hr = ID3D12Device_CreateDescriptorHeap(device, &heap_desc, &IID_ID3D12DescriptorHeap, (void **)&heap); + ok(SUCCEEDED(hr), "CreateDescriptorHeap failed, hr %#x.\n", hr); + + cpu_handle = ID3D12DescriptorHeap_GetCPUDescriptorHandleForHeapStart(heap); + memset(&sampler_desc, 0, sizeof(sampler_desc)); + sampler_desc.Filter = D3D12_FILTER_MIN_MAG_MIP_POINT; + sampler_desc.AddressU = D3D12_TEXTURE_ADDRESS_MODE_WRAP; + sampler_desc.AddressV = D3D12_TEXTURE_ADDRESS_MODE_WRAP; + sampler_desc.AddressW = D3D12_TEXTURE_ADDRESS_MODE_WRAP; + sampler_desc.MaxLOD = D3D12_FLOAT32_MAX; + ID3D12Device_CreateSampler(device, &sampler_desc, cpu_handle); + + cpu_handle.ptr += sampler_increment_size; + sampler_desc.Filter = D3D12_FILTER_MIN_MAG_POINT_MIP_LINEAR; + for (i = 1; i < heap_desc.NumDescriptors; ++i) + { + ID3D12Device_CreateSampler(device, &sampler_desc, cpu_handle); + cpu_handle.ptr += sampler_increment_size; + } + + trace("MinMaxFiltering: %#x.\n", is_min_max_filtering_supported(device)); + if (is_min_max_filtering_supported(device)) + { + cpu_handle = ID3D12DescriptorHeap_GetCPUDescriptorHandleForHeapStart(heap); + sampler_desc.Filter = D3D12_FILTER_MINIMUM_MIN_MAG_MIP_POINT; + ID3D12Device_CreateSampler(device, &sampler_desc, cpu_handle); + + cpu_handle.ptr += sampler_increment_size; + sampler_desc.Filter = D3D12_FILTER_MAXIMUM_MIN_MAG_MIP_POINT; + ID3D12Device_CreateSampler(device, &sampler_desc, cpu_handle); + } + + cpu_handle = ID3D12DescriptorHeap_GetCPUDescriptorHandleForHeapStart(heap); + sampler_desc.Filter = D3D12_FILTER_COMPARISON_MIN_MAG_MIP_POINT; + sampler_desc.ComparisonFunc = D3D12_COMPARISON_FUNC_LESS; + ID3D12Device_CreateSampler(device, &sampler_desc, cpu_handle); + + refcount = ID3D12DescriptorHeap_Release(heap); + ok(!refcount, "ID3D12DescriptorHeap has %u references left.\n", (unsigned int)refcount); + refcount = ID3D12Device_Release(device); + ok(!refcount, "ID3D12Device has %u references left.\n", (unsigned int)refcount); +} + static void test_create_root_signature(void) { D3D12_ROOT_SIGNATURE_DESC root_signature_desc; @@ -2522,7 +2607,7 @@ static void test_clear_depth_stencil_view(void) dsv_increment_size = ID3D12Device_GetDescriptorHandleIncrementSize(device, D3D12_DESCRIPTOR_HEAP_TYPE_DSV); trace("DSV descriptor handle increment size: %u.\n", dsv_increment_size); - ok(dsv_increment_size, "Got unexpectd increment size %#x.\n", dsv_increment_size); + ok(dsv_increment_size, "Got unexpected increment size %#x.\n", dsv_increment_size); memset(&heap_properties, 0, sizeof(heap_properties)); heap_properties.Type = D3D12_HEAP_TYPE_DEFAULT; @@ -5311,6 +5396,7 @@ START_TEST(d3d12) run_test(test_create_command_queue); run_test(test_create_committed_resource); run_test(test_create_descriptor_heap); + run_test(test_create_sampler); run_test(test_create_root_signature); run_test(test_create_pipeline_state); run_test(test_create_fence);