From: Conor McCarthy cmccarthy@codeweavers.com
--- tests/shader_runner_d3d11.c | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+)
diff --git a/tests/shader_runner_d3d11.c b/tests/shader_runner_d3d11.c index abe455203..195ec38dd 100644 --- a/tests/shader_runner_d3d11.c +++ b/tests/shader_runner_d3d11.c @@ -65,6 +65,8 @@ struct d3d11_shader_runner IDXGISwapChain *swapchain; ID3D11DeviceContext *immediate_context; ID3D11RasterizerState *rasterizer_state; + + bool supports_float64; };
static struct d3d11_shader_runner *d3d11_shader_runner(struct shader_runner *r) @@ -252,6 +254,7 @@ static IDXGISwapChain *create_swapchain(ID3D11Device *device, HWND window)
static BOOL init_test_context(struct d3d11_shader_runner *runner) { + D3D11_FEATURE_DATA_DOUBLES doubles = {0}; unsigned int rt_width, rt_height; D3D11_RASTERIZER_DESC rs_desc; D3D11_VIEWPORT vp; @@ -266,6 +269,12 @@ static BOOL init_test_context(struct d3d11_shader_runner *runner) return FALSE; }
+ hr = ID3D11Device_CheckFeatureSupport(runner->device, D3D11_FEATURE_DOUBLES, + &doubles, sizeof(doubles)); + ok(hr == S_OK, "Failed to check double precision feature support, hr %#x.\n", hr); + trace("DoublePrecisionFloatShaderOps: %u.\n", doubles.DoublePrecisionFloatShaderOps); + runner->supports_float64 = doubles.DoublePrecisionFloatShaderOps; + rt_width = RENDER_TARGET_WIDTH; rt_height = RENDER_TARGET_HEIGHT; SetRect(&rect, 0, 0, rt_width, rt_height); @@ -313,6 +322,16 @@ static void destroy_test_context(struct d3d11_shader_runner *runner) ok(!ref, "Device has %lu references left.\n", ref); }
+static bool d3d11_runner_check_requirements(struct shader_runner *r) +{ + struct d3d11_shader_runner *runner = d3d11_shader_runner(r); + + if (runner->r.require_float64 && !runner->supports_float64) + return false; + + return true; +} + static ID3D11Buffer *create_buffer(ID3D11Device *device, unsigned int bind_flags, unsigned int size, const void *data) { D3D11_SUBRESOURCE_DATA resource_data; @@ -724,6 +743,7 @@ static void d3d11_runner_release_readback(struct shader_runner *r, struct resour
static const struct shader_runner_ops d3d11_runner_ops = { + .check_requirements = d3d11_runner_check_requirements, .create_resource = d3d11_runner_create_resource, .destroy_resource = d3d11_runner_destroy_resource, .dispatch = d3d11_runner_dispatch,
From: Conor McCarthy cmccarthy@codeweavers.com
--- tests/shader_runner_vulkan.c | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+)
diff --git a/tests/shader_runner_vulkan.c b/tests/shader_runner_vulkan.c index f89b4d624..358fd74cb 100644 --- a/tests/shader_runner_vulkan.c +++ b/tests/shader_runner_vulkan.c @@ -70,6 +70,8 @@ struct vulkan_shader_runner uint32_t binding; } samplers[MAX_SAMPLERS];
+ bool supports_float64; + DECLARE_VK_PFN(vkCreateInstance); #define VK_INSTANCE_PFN DECLARE_VK_PFN #define VK_DEVICE_PFN DECLARE_VK_PFN @@ -81,6 +83,16 @@ static struct vulkan_shader_runner *vulkan_shader_runner(struct shader_runner *r return CONTAINING_RECORD(r, struct vulkan_shader_runner, r); }
+static bool vulkan_runner_check_requirements(struct shader_runner *r) +{ + struct vulkan_shader_runner *runner = vulkan_shader_runner(r); + + if (runner->r.require_float64 && !runner->supports_float64) + return false; + + return true; +} + #define VK_CALL(f) (runner->f)
static void begin_command_buffer(struct vulkan_shader_runner *runner) @@ -1157,6 +1169,7 @@ static void vulkan_runner_release_readback(struct shader_runner *r, struct resou
static const struct shader_runner_ops vulkan_runner_ops = { + .check_requirements = vulkan_runner_check_requirements, .create_resource = vulkan_runner_create_resource, .destroy_resource = vulkan_runner_destroy_resource, .dispatch = vulkan_runner_dispatch, @@ -1321,6 +1334,13 @@ static bool init_vulkan_runner(struct vulkan_shader_runner *runner) ENABLE_FEATURE(shaderImageGatherExtended); ENABLE_FEATURE(shaderStorageImageWriteWithoutFormat);
+ trace("shaderFloat64: %u.\n", ret_features.shaderFloat64); + if (ret_features.shaderFloat64) + { + features.shaderFloat64 = VK_TRUE; + runner->supports_float64 = true; + } + if ((vr = VK_CALL(vkCreateDevice(runner->phys_device, &device_desc, NULL, &device)))) { skip("Failed to create device, vr %d.\n", vr);
From: Conor McCarthy cmccarthy@codeweavers.com
--- tests/shader_runner_vulkan.c | 9 +++++++++ 1 file changed, 9 insertions(+)
diff --git a/tests/shader_runner_vulkan.c b/tests/shader_runner_vulkan.c index 358fd74cb..6da2e86b0 100644 --- a/tests/shader_runner_vulkan.c +++ b/tests/shader_runner_vulkan.c @@ -71,6 +71,7 @@ struct vulkan_shader_runner } samplers[MAX_SAMPLERS];
bool supports_float64; + bool supports_int64;
DECLARE_VK_PFN(vkCreateInstance); #define VK_INSTANCE_PFN DECLARE_VK_PFN @@ -89,6 +90,8 @@ static bool vulkan_runner_check_requirements(struct shader_runner *r)
if (runner->r.require_float64 && !runner->supports_float64) return false; + if (runner->r.require_int64 && !runner->supports_int64) + return false;
return true; } @@ -1340,6 +1343,12 @@ static bool init_vulkan_runner(struct vulkan_shader_runner *runner) features.shaderFloat64 = VK_TRUE; runner->supports_float64 = true; } + trace("shaderInt64: %u.\n", ret_features.shaderInt64); + if (ret_features.shaderInt64) + { + features.shaderInt64 = VK_TRUE; + runner->supports_int64 = true; + }
if ((vr = VK_CALL(vkCreateDevice(runner->phys_device, &device_desc, NULL, &device)))) {