From 51ff422b0a85587545dc306b77c5b9b5c891b5b0 Mon Sep 17 00:00:00 2001 From: Boris Zanin Date: Thu, 28 Mar 2024 14:57:06 +0100 Subject: [PATCH 1/8] Add DEVICE_PROPERTY support --- include/amber/amber_vulkan.h | 11 +++++++ include/amber/recipe.h | 3 ++ src/amber.cc | 1 + src/amberscript/parser.cc | 16 +++++++++ src/amberscript/parser.h | 1 + src/engine.h | 1 + src/script.cc | 18 +++++++++++ src/script.h | 19 +++++++++++ src/vulkan/device.cc | 63 ++++++++++++++++++++++++++++++++++++ src/vulkan/device.h | 3 ++ src/vulkan/engine_vulkan.cc | 8 +++-- src/vulkan/engine_vulkan.h | 1 + 12 files changed, 142 insertions(+), 3 deletions(-) diff --git a/include/amber/amber_vulkan.h b/include/amber/amber_vulkan.h index d03157903..e2c101df2 100644 --- a/include/amber/amber_vulkan.h +++ b/include/amber/amber_vulkan.h @@ -49,6 +49,17 @@ struct VulkanEngineConfig : public EngineConfig { /// the extension is not enabled, |available_features| will be used. VkPhysicalDeviceFeatures2KHR available_features2; + /// Physical device properties available for |physical_device|. The + /// |available_properties| will be ignored if + /// VK_KHR_get_physical_device_properties2 is enabled, |available_properties2| + /// will be used in that case. + VkPhysicalDeviceProperties available_properties; + + /// Physical device properties for |physical_device|.The |available_properties2| + /// will only be used if VK_KHR_get_physical_device_properties2 is enabled. If + /// the extension is not enabled, |available_properties| will be used. + VkPhysicalDeviceProperties2KHR available_properties2; + /// Instance extensions available. std::vector available_instance_extensions; diff --git a/include/amber/recipe.h b/include/amber/recipe.h index 0fd2445e8..7b0381d44 100644 --- a/include/amber/recipe.h +++ b/include/amber/recipe.h @@ -35,6 +35,9 @@ class RecipeImpl { /// Returns required features in the given recipe. virtual std::vector GetRequiredFeatures() const = 0; + /// Returns required features in the given recipe. + virtual std::vector GetRequiredProperties() const = 0; + /// Returns required device extensions in the given recipe. virtual std::vector GetRequiredDeviceExtensions() const = 0; diff --git a/src/amber.cc b/src/amber.cc index 9bf806e9d..013617090 100644 --- a/src/amber.cc +++ b/src/amber.cc @@ -133,6 +133,7 @@ Result CreateEngineAndCheckRequirements(const Recipe* recipe, // much else. Refactor this if they end up doing to much here. Result r = engine->Initialize(opts->config, delegate, script->GetRequiredFeatures(), + script->GetRequiredProperties(), script->GetRequiredInstanceExtensions(), script->GetRequiredDeviceExtensions()); if (!r.IsSuccess()) diff --git a/src/amberscript/parser.cc b/src/amberscript/parser.cc index a2e837fd7..41bf90667 100644 --- a/src/amberscript/parser.cc +++ b/src/amberscript/parser.cc @@ -304,6 +304,8 @@ Result Parser::Parse(const std::string& data) { r = ParseDeviceFeature(); } else if (tok == "DEVICE_EXTENSION") { r = ParseDeviceExtension(); + } else if (tok == "DEVICE_PROPERTY") { + r = ParseDeviceProperty(); } else if (tok == "IMAGE") { r = ParseImage(); } else if (tok == "INSTANCE_EXTENSION") { @@ -3421,6 +3423,20 @@ Result Parser::ParseDeviceFeature() { return ValidateEndOfStatement("DEVICE_FEATURE command"); } +Result Parser::ParseDeviceProperty() { + auto token = tokenizer_->NextToken(); + if (token->IsEOS() || token->IsEOL()) + return Result("missing feature name for DEVICE_PROPERTY command"); + if (!token->IsIdentifier()) + return Result("invalid feature name for DEVICE_PROPERTY command"); + if (!script_->IsKnownProperty(token->AsString())) + return Result("unknown feature name for DEVICE_PROPERTY command"); + + script_->AddRequiredProperty(token->AsString()); + + return ValidateEndOfStatement("DEVICE_PROPERTY command"); +} + Result Parser::ParseRepeat() { auto token = tokenizer_->NextToken(); if (token->IsEOL() || token->IsEOL()) diff --git a/src/amberscript/parser.h b/src/amberscript/parser.h index fb81c8276..0f5559504 100644 --- a/src/amberscript/parser.h +++ b/src/amberscript/parser.h @@ -84,6 +84,7 @@ class Parser : public amber::Parser { Result ParseCopy(); Result ParseDeviceFeature(); Result ParseDeviceExtension(); + Result ParseDeviceProperty(); Result ParseInstanceExtension(); Result ParseRepeat(); Result ParseSet(); diff --git a/src/engine.h b/src/engine.h index d4442589b..2d1ba61ed 100644 --- a/src/engine.h +++ b/src/engine.h @@ -71,6 +71,7 @@ class Engine { EngineConfig* config, Delegate* delegate, const std::vector& features, + const std::vector& properties, const std::vector& instance_extensions, const std::vector& device_extensions) = 0; diff --git a/src/script.cc b/src/script.cc index 091949e2b..2f3b1cbb2 100644 --- a/src/script.cc +++ b/src/script.cc @@ -134,6 +134,24 @@ bool Script::IsKnownFeature(const std::string& name) const { "ShaderSubgroupExtendedTypesFeatures.shaderSubgroupExtendedTypes"; } +bool Script::IsKnownProperty(const std::string& name) const { + return name == "FloatControls.shaderSignedZeroInfNanPreserveFloat16" || + name == "FloatControls.shaderSignedZeroInfNanPreserveFloat32" || + name == "FloatControls.shaderSignedZeroInfNanPreserveFloat64" || + name == "FloatControls.shaderDenormPreserveFloat16" || + name == "FloatControls.shaderDenormPreserveFloat32" || + name == "FloatControls.shaderDenormPreserveFloat64" || + name == "FloatControls.shaderDenormFlushToZeroFloat16" || + name == "FloatControls.shaderDenormFlushToZeroFloat32" || + name == "FloatControls.shaderDenormFlushToZeroFloat64" || + name == "FloatControls.shaderRoundingModeRTEFloat16" || + name == "FloatControls.shaderRoundingModeRTEFloat32" || + name == "FloatControls.shaderRoundingModeRTEFloat64" || + name == "FloatControls.shaderRoundingModeRTZFloat16" || + name == "FloatControls.shaderRoundingModeRTZFloat32" || + name == "FloatControls.shaderRoundingModeRTZFloat64"; +} + type::Type* Script::ParseType(const std::string& str) { auto type = GetType(str); if (type) diff --git a/src/script.h b/src/script.h index b4c6e1a23..3a8a17a9e 100644 --- a/src/script.h +++ b/src/script.h @@ -43,6 +43,7 @@ class Script : public RecipeImpl { ~Script() override; bool IsKnownFeature(const std::string& name) const; + bool IsKnownProperty(const std::string& name) const; /// Retrieves information on the shaders in the given script. std::vector GetShaderInfo() const override; @@ -52,6 +53,10 @@ class Script : public RecipeImpl { return engine_info_.required_features; } + std::vector GetRequiredProperties() const override { + return engine_info_.required_properties; + } + /// Returns required device extensions in the given recipe. std::vector GetRequiredDeviceExtensions() const override { return engine_info_.required_device_extensions; @@ -166,6 +171,12 @@ class Script : public RecipeImpl { engine_info_.required_features.push_back(feature); } + /// Adds |prop| to the list of properties that must be supported by the + /// engine. + void AddRequiredProperty(const std::string& prop) { + engine_info_.required_properties.push_back(prop); + } + /// Checks if |feature| is in required features bool IsRequiredFeature(const std::string& feature) const { return std::find(engine_info_.required_features.begin(), @@ -173,6 +184,13 @@ class Script : public RecipeImpl { feature) != engine_info_.required_features.end(); } + /// Checks if |prop| is in required features + bool IsRequiredProperty(const std::string& prop) const { + return std::find(engine_info_.required_properties.begin(), + engine_info_.required_properties.end(), + prop) != engine_info_.required_properties.end(); + } + /// Adds |ext| to the list of device extensions that must be supported. void AddRequiredDeviceExtension(const std::string& ext) { engine_info_.required_device_extensions.push_back(ext); @@ -257,6 +275,7 @@ class Script : public RecipeImpl { private: struct { std::vector required_features; + std::vector required_properties; std::vector required_device_extensions; std::vector required_instance_extensions; } engine_info_; diff --git a/src/vulkan/device.cc b/src/vulkan/device.cc index 43a1d8b1b..a1472fbe8 100644 --- a/src/vulkan/device.cc +++ b/src/vulkan/device.cc @@ -447,9 +447,12 @@ Result Device::Initialize( PFN_vkGetInstanceProcAddr getInstanceProcAddr, Delegate* delegate, const std::vector& required_features, + const std::vector& required_properties, const std::vector& required_device_extensions, const VkPhysicalDeviceFeatures& available_features, const VkPhysicalDeviceFeatures2KHR& available_features2, + const VkPhysicalDeviceProperties& available_properties, + const VkPhysicalDeviceProperties2KHR& available_properties2, const std::vector& available_extensions) { Result r = LoadVulkanPointers(getInstanceProcAddr, delegate); if (!r.IsSuccess()) @@ -726,6 +729,66 @@ Result Device::Initialize( "required extensions"); } + VkPhysicalDeviceVulkan12Properties* vulkan12_props_ptrs = nullptr; + VkPhysicalDeviceFloatControlsProperties* fc_props_ptrs = nullptr; + + ptr = available_properties2.pNext; + while (ptr != nullptr) { + BaseOutStructure* s = static_cast(ptr); + switch (s->sType) { + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_PROPERTIES: + vulkan12_props_ptrs = + static_cast(ptr); + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FLOAT_CONTROLS_PROPERTIES_KHR: + fc_props_ptrs = + static_cast(ptr); + break; + default: + break; + } + ptr = s->pNext; + } + +#define CHECK_FLOAT_CONTROL_PROPERTY(R, P, NAME, S1, S2) \ + if (R == -1 && P == #NAME) \ + R = ((S1 && S1->NAME) || (S2 && S2->NAME)) ? 1 : 0; + + for (const std::string& prop : required_properties) { + const size_t dot_pos = prop.find('.'); + const size_t dot_found = dot_pos != std::string::npos; + const std::string prefix = dot_found ? prop.substr(0, dot_pos) : ""; + const std::string name = dot_found ? prop.substr(dot_pos + 1) : prop; + int supported = -1; + + if (supported == -1 && prefix == "FloatControls") { + if (fc_props_ptrs == nullptr && vulkan12_props_ptrs == nullptr) + return Result( + "Vulkan: Device::Initialize given physical device does not support " + "required float control properties"); + + CHECK_FLOAT_CONTROL_PROPERTY(supported, name, shaderSignedZeroInfNanPreserveFloat16, fc_props_ptrs, vulkan12_props_ptrs); + CHECK_FLOAT_CONTROL_PROPERTY(supported, name, shaderSignedZeroInfNanPreserveFloat32, fc_props_ptrs, vulkan12_props_ptrs); + CHECK_FLOAT_CONTROL_PROPERTY(supported, name, shaderSignedZeroInfNanPreserveFloat64, fc_props_ptrs, vulkan12_props_ptrs); + CHECK_FLOAT_CONTROL_PROPERTY(supported, name, shaderDenormPreserveFloat16, fc_props_ptrs, vulkan12_props_ptrs); + CHECK_FLOAT_CONTROL_PROPERTY(supported, name, shaderDenormPreserveFloat32, fc_props_ptrs, vulkan12_props_ptrs); + CHECK_FLOAT_CONTROL_PROPERTY(supported, name, shaderDenormPreserveFloat64, fc_props_ptrs, vulkan12_props_ptrs); + CHECK_FLOAT_CONTROL_PROPERTY(supported, name, shaderDenormFlushToZeroFloat16, fc_props_ptrs, vulkan12_props_ptrs); + CHECK_FLOAT_CONTROL_PROPERTY(supported, name, shaderDenormFlushToZeroFloat32, fc_props_ptrs, vulkan12_props_ptrs); + CHECK_FLOAT_CONTROL_PROPERTY(supported, name, shaderDenormFlushToZeroFloat64, fc_props_ptrs, vulkan12_props_ptrs); + CHECK_FLOAT_CONTROL_PROPERTY(supported, name, shaderRoundingModeRTEFloat16, fc_props_ptrs, vulkan12_props_ptrs); + CHECK_FLOAT_CONTROL_PROPERTY(supported, name, shaderRoundingModeRTEFloat32, fc_props_ptrs, vulkan12_props_ptrs); + CHECK_FLOAT_CONTROL_PROPERTY(supported, name, shaderRoundingModeRTEFloat64, fc_props_ptrs, vulkan12_props_ptrs); + CHECK_FLOAT_CONTROL_PROPERTY(supported, name, shaderRoundingModeRTZFloat16, fc_props_ptrs, vulkan12_props_ptrs); + CHECK_FLOAT_CONTROL_PROPERTY(supported, name, shaderRoundingModeRTZFloat32, fc_props_ptrs, vulkan12_props_ptrs); + CHECK_FLOAT_CONTROL_PROPERTY(supported, name, shaderRoundingModeRTZFloat64, fc_props_ptrs, vulkan12_props_ptrs); + } + + if (supported == -1) + return Result( + "Vulkan: Device::Initialize property not handled " + prop); + } + ptrs_.vkGetPhysicalDeviceMemoryProperties(physical_device_, &physical_memory_properties_); diff --git a/src/vulkan/device.h b/src/vulkan/device.h index ff76c0fae..1f7f99bba 100644 --- a/src/vulkan/device.h +++ b/src/vulkan/device.h @@ -47,9 +47,12 @@ class Device { Result Initialize(PFN_vkGetInstanceProcAddr getInstanceProcAddr, Delegate* delegate, const std::vector& required_features, + const std::vector& required_properties, const std::vector& required_device_extensions, const VkPhysicalDeviceFeatures& available_features, const VkPhysicalDeviceFeatures2KHR& available_features2, + const VkPhysicalDeviceProperties& available_properties, + const VkPhysicalDeviceProperties2KHR& available_properties2, const std::vector& available_extensions); /// Returns true if |format| and the |buffer|s buffer type combination is diff --git a/src/vulkan/engine_vulkan.cc b/src/vulkan/engine_vulkan.cc index b0842eca8..0cfc37c58 100644 --- a/src/vulkan/engine_vulkan.cc +++ b/src/vulkan/engine_vulkan.cc @@ -92,6 +92,7 @@ Result EngineVulkan::Initialize( EngineConfig* config, Delegate* delegate, const std::vector& features, + const std::vector& properties, const std::vector& instance_extensions, const std::vector& device_extensions) { if (device_) @@ -118,9 +119,10 @@ Result EngineVulkan::Initialize( vk_config->queue); Result r = device_->Initialize( - vk_config->vkGetInstanceProcAddr, delegate, features, device_extensions, - vk_config->available_features, vk_config->available_features2, - vk_config->available_device_extensions); + vk_config->vkGetInstanceProcAddr, delegate, features, properties, + device_extensions, vk_config->available_features, + vk_config->available_features2, vk_config->available_properties, + vk_config->available_properties2, vk_config->available_device_extensions); if (!r.IsSuccess()) return r; diff --git a/src/vulkan/engine_vulkan.h b/src/vulkan/engine_vulkan.h index 76668fb8e..427e84f0c 100644 --- a/src/vulkan/engine_vulkan.h +++ b/src/vulkan/engine_vulkan.h @@ -45,6 +45,7 @@ class EngineVulkan : public Engine { Result Initialize(EngineConfig* config, Delegate* delegate, const std::vector& features, + const std::vector& properties, const std::vector& instance_extensions, const std::vector& device_extensions) override; Result CreatePipeline(amber::Pipeline* type) override; From fbdf6008a9c0b28ed9f3b515e92c344a48ee9683 Mon Sep 17 00:00:00 2001 From: Boris Zanin Date: Fri, 5 Apr 2024 13:01:37 +0200 Subject: [PATCH 2/8] Add gtests, bugfixes --- src/CMakeLists.txt | 1 + src/amberscript/parser.cc | 6 +- .../parser_device_property_test.cc | 107 ++++++++++++++++++ src/executor_test.cc | 11 +- src/vulkan/device.cc | 3 + 5 files changed, 123 insertions(+), 5 deletions(-) create mode 100644 src/amberscript/parser_device_property_test.cc diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 3b7a4a5a3..1d0b5764a 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -141,6 +141,7 @@ if (${AMBER_ENABLE_TESTS}) amberscript/parser_copy_test.cc amberscript/parser_depth_test.cc amberscript/parser_device_feature_test.cc + amberscript/parser_device_property_test.cc amberscript/parser_expect_test.cc amberscript/parser_extension_test.cc amberscript/parser_framebuffer_test.cc diff --git a/src/amberscript/parser.cc b/src/amberscript/parser.cc index 41bf90667..6eb343191 100644 --- a/src/amberscript/parser.cc +++ b/src/amberscript/parser.cc @@ -3426,11 +3426,11 @@ Result Parser::ParseDeviceFeature() { Result Parser::ParseDeviceProperty() { auto token = tokenizer_->NextToken(); if (token->IsEOS() || token->IsEOL()) - return Result("missing feature name for DEVICE_PROPERTY command"); + return Result("missing property name for DEVICE_PROPERTY command"); if (!token->IsIdentifier()) - return Result("invalid feature name for DEVICE_PROPERTY command"); + return Result("invalid property name for DEVICE_PROPERTY command"); if (!script_->IsKnownProperty(token->AsString())) - return Result("unknown feature name for DEVICE_PROPERTY command"); + return Result("unknown property name for DEVICE_PROPERTY command"); script_->AddRequiredProperty(token->AsString()); diff --git a/src/amberscript/parser_device_property_test.cc b/src/amberscript/parser_device_property_test.cc new file mode 100644 index 000000000..a2204c585 --- /dev/null +++ b/src/amberscript/parser_device_property_test.cc @@ -0,0 +1,107 @@ +// Copyright 2024 The Amber Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or parseried. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "gtest/gtest.h" +#include "src/amberscript/parser.h" + +namespace amber { +namespace amberscript { + +using AmberScriptParserTest = testing::Test; + +TEST_F(AmberScriptParserTest, DeviceProperty) { + std::string in = R"( +DEVICE_PROPERTY FloatControls.shaderSignedZeroInfNanPreserveFloat16 +DEVICE_PROPERTY FloatControls.shaderSignedZeroInfNanPreserveFloat32 +DEVICE_PROPERTY FloatControls.shaderSignedZeroInfNanPreserveFloat64 +DEVICE_PROPERTY FloatControls.shaderDenormPreserveFloat16 +DEVICE_PROPERTY FloatControls.shaderDenormPreserveFloat32 +DEVICE_PROPERTY FloatControls.shaderDenormPreserveFloat64 +DEVICE_PROPERTY FloatControls.shaderDenormFlushToZeroFloat16 +DEVICE_PROPERTY FloatControls.shaderDenormFlushToZeroFloat32 +DEVICE_PROPERTY FloatControls.shaderDenormFlushToZeroFloat64 +DEVICE_PROPERTY FloatControls.shaderRoundingModeRTEFloat16 +DEVICE_PROPERTY FloatControls.shaderRoundingModeRTEFloat32 +DEVICE_PROPERTY FloatControls.shaderRoundingModeRTEFloat64 +DEVICE_PROPERTY FloatControls.shaderRoundingModeRTZFloat16 +DEVICE_PROPERTY FloatControls.shaderRoundingModeRTZFloat32 +DEVICE_PROPERTY FloatControls.shaderRoundingModeRTZFloat64)"; + + Parser parser; + Result r = parser.Parse(in); + ASSERT_TRUE(r.IsSuccess()) << r.Error(); + + auto script = parser.GetScript(); + const auto& properties = script->GetRequiredProperties(); + ASSERT_EQ(15U, properties.size()); + EXPECT_EQ("FloatControls.shaderSignedZeroInfNanPreserveFloat16", + properties[0]); + EXPECT_EQ("FloatControls.shaderSignedZeroInfNanPreserveFloat32", + properties[1]); + EXPECT_EQ("FloatControls.shaderSignedZeroInfNanPreserveFloat64", + properties[2]); + EXPECT_EQ("FloatControls.shaderDenormPreserveFloat16", properties[3]); + EXPECT_EQ("FloatControls.shaderDenormPreserveFloat32", properties[4]); + EXPECT_EQ("FloatControls.shaderDenormPreserveFloat64", properties[5]); + EXPECT_EQ("FloatControls.shaderDenormFlushToZeroFloat16", properties[6]); + EXPECT_EQ("FloatControls.shaderDenormFlushToZeroFloat32", properties[7]); + EXPECT_EQ("FloatControls.shaderDenormFlushToZeroFloat64", properties[8]); + EXPECT_EQ("FloatControls.shaderRoundingModeRTEFloat16", properties[9]); + EXPECT_EQ("FloatControls.shaderRoundingModeRTEFloat32", properties[10]); + EXPECT_EQ("FloatControls.shaderRoundingModeRTEFloat64", properties[11]); + EXPECT_EQ("FloatControls.shaderRoundingModeRTZFloat16", properties[12]); + EXPECT_EQ("FloatControls.shaderRoundingModeRTZFloat32", properties[13]); + EXPECT_EQ("FloatControls.shaderRoundingModeRTZFloat64", properties[14]); +} + +TEST_F(AmberScriptParserTest, DevicePropertyMissingProperty) { + std::string in = "DEVICE_PROPERTY"; + + Parser parser; + Result r = parser.Parse(in); + ASSERT_FALSE(r.IsSuccess()); + EXPECT_EQ("1: missing property name for DEVICE_PROPERTY command", r.Error()); +} + +TEST_F(AmberScriptParserTest, DevicePropertyUnknown) { + std::string in = "DEVICE_PROPERTY unknown"; + + Parser parser; + Result r = parser.Parse(in); + ASSERT_FALSE(r.IsSuccess()); + EXPECT_EQ("1: unknown property name for DEVICE_PROPERTY command", r.Error()); +} + +TEST_F(AmberScriptParserTest, DevicePropertyInvalid) { + std::string in = "DEVICE_PROPERTY 12345"; + + Parser parser; + Result r = parser.Parse(in); + ASSERT_FALSE(r.IsSuccess()); + EXPECT_EQ("1: invalid property name for DEVICE_PROPERTY command", r.Error()); +} + +TEST_F(AmberScriptParserTest, DevicePropertyExtraParams) { + std::string in = + "DEVICE_PROPERTY FloatControls.shaderDenormPreserveFloat16 EXTRA"; + + Parser parser; + Result r = parser.Parse(in); + ASSERT_FALSE(r.IsSuccess()); + EXPECT_EQ("1: extra parameters after DEVICE_PROPERTY command: EXTRA", + r.Error()); +} + +} // namespace amberscript +} // namespace amber diff --git a/src/executor_test.cc b/src/executor_test.cc index fa57c743a..e5e39514b 100644 --- a/src/executor_test.cc +++ b/src/executor_test.cc @@ -37,6 +37,7 @@ class EngineStub : public Engine { Result Initialize(EngineConfig*, Delegate*, const std::vector& features, + const std::vector& properties, const std::vector& instance_exts, const std::vector& device_exts) override { features_ = features; @@ -207,11 +208,12 @@ class VkScriptExecutorTest : public testing::Test { std::unique_ptr MakeEngine() { return MakeUnique(); } std::unique_ptr MakeAndInitializeEngine( const std::vector& features, + const std::vector& properties, const std::vector& instance_extensions, const std::vector& device_extensions) { std::unique_ptr engine = MakeUnique(); - engine->Initialize(nullptr, nullptr, features, instance_extensions, - device_extensions); + engine->Initialize(nullptr, nullptr, features, properties, + instance_extensions, device_extensions); return engine; } EngineStub* ToStub(Engine* engine) { @@ -233,6 +235,7 @@ logicOp)"; auto script = parser.GetScript(); auto engine = MakeAndInitializeEngine(script->GetRequiredFeatures(), + script->GetRequiredProperties(), script->GetRequiredInstanceExtensions(), script->GetRequiredDeviceExtensions()); @@ -263,6 +266,7 @@ VK_KHR_variable_pointers)"; auto script = parser.GetScript(); auto engine = MakeAndInitializeEngine(script->GetRequiredFeatures(), + script->GetRequiredProperties(), script->GetRequiredInstanceExtensions(), script->GetRequiredDeviceExtensions()); @@ -293,6 +297,7 @@ depthstencil D24_UNORM_S8_UINT)"; auto script = parser.GetScript(); auto engine = MakeAndInitializeEngine(script->GetRequiredFeatures(), + script->GetRequiredProperties(), script->GetRequiredInstanceExtensions(), script->GetRequiredDeviceExtensions()); @@ -320,6 +325,7 @@ fence_timeout 12345)"; auto script = parser.GetScript(); auto engine = MakeAndInitializeEngine(script->GetRequiredFeatures(), + script->GetRequiredProperties(), script->GetRequiredInstanceExtensions(), script->GetRequiredDeviceExtensions()); @@ -355,6 +361,7 @@ fence_timeout 12345)"; auto script = parser.GetScript(); auto engine = MakeAndInitializeEngine(script->GetRequiredFeatures(), + script->GetRequiredProperties(), script->GetRequiredInstanceExtensions(), script->GetRequiredDeviceExtensions()); diff --git a/src/vulkan/device.cc b/src/vulkan/device.cc index a1472fbe8..4a24c9679 100644 --- a/src/vulkan/device.cc +++ b/src/vulkan/device.cc @@ -784,6 +784,9 @@ Result Device::Initialize( CHECK_FLOAT_CONTROL_PROPERTY(supported, name, shaderRoundingModeRTZFloat64, fc_props_ptrs, vulkan12_props_ptrs); } + if (supported == 0) + return Result("Vulkan: Device::Initialize missing " + prop + " property"); + if (supported == -1) return Result( "Vulkan: Device::Initialize property not handled " + prop); From ef4b7a72f8fe7408cb7a3ea476ef01b102f4cd6e Mon Sep 17 00:00:00 2001 From: Boris Zanin Date: Fri, 5 Apr 2024 15:19:21 +0200 Subject: [PATCH 3/8] Append Properties to FloatControls to follow standard name --- include/amber/recipe.h | 3 + .../parser_device_property_test.cc | 75 +++++++++++-------- src/recipe.cc | 4 + src/script.cc | 30 ++++---- src/vulkan/device.cc | 2 +- 5 files changed, 67 insertions(+), 47 deletions(-) diff --git a/include/amber/recipe.h b/include/amber/recipe.h index 7b0381d44..4b8d877f9 100644 --- a/include/amber/recipe.h +++ b/include/amber/recipe.h @@ -70,6 +70,9 @@ class Recipe { /// Returns required features in the given recipe. std::vector GetRequiredFeatures() const; + /// Returns required properties in the given recipe. + std::vector GetRequiredProperties() const; + /// Returns required device extensions in the given recipe. std::vector GetRequiredDeviceExtensions() const; diff --git a/src/amberscript/parser_device_property_test.cc b/src/amberscript/parser_device_property_test.cc index a2204c585..f42fafebb 100644 --- a/src/amberscript/parser_device_property_test.cc +++ b/src/amberscript/parser_device_property_test.cc @@ -22,21 +22,21 @@ using AmberScriptParserTest = testing::Test; TEST_F(AmberScriptParserTest, DeviceProperty) { std::string in = R"( -DEVICE_PROPERTY FloatControls.shaderSignedZeroInfNanPreserveFloat16 -DEVICE_PROPERTY FloatControls.shaderSignedZeroInfNanPreserveFloat32 -DEVICE_PROPERTY FloatControls.shaderSignedZeroInfNanPreserveFloat64 -DEVICE_PROPERTY FloatControls.shaderDenormPreserveFloat16 -DEVICE_PROPERTY FloatControls.shaderDenormPreserveFloat32 -DEVICE_PROPERTY FloatControls.shaderDenormPreserveFloat64 -DEVICE_PROPERTY FloatControls.shaderDenormFlushToZeroFloat16 -DEVICE_PROPERTY FloatControls.shaderDenormFlushToZeroFloat32 -DEVICE_PROPERTY FloatControls.shaderDenormFlushToZeroFloat64 -DEVICE_PROPERTY FloatControls.shaderRoundingModeRTEFloat16 -DEVICE_PROPERTY FloatControls.shaderRoundingModeRTEFloat32 -DEVICE_PROPERTY FloatControls.shaderRoundingModeRTEFloat64 -DEVICE_PROPERTY FloatControls.shaderRoundingModeRTZFloat16 -DEVICE_PROPERTY FloatControls.shaderRoundingModeRTZFloat32 -DEVICE_PROPERTY FloatControls.shaderRoundingModeRTZFloat64)"; +DEVICE_PROPERTY FloatControlsProperties.shaderSignedZeroInfNanPreserveFloat16 +DEVICE_PROPERTY FloatControlsProperties.shaderSignedZeroInfNanPreserveFloat32 +DEVICE_PROPERTY FloatControlsProperties.shaderSignedZeroInfNanPreserveFloat64 +DEVICE_PROPERTY FloatControlsProperties.shaderDenormPreserveFloat16 +DEVICE_PROPERTY FloatControlsProperties.shaderDenormPreserveFloat32 +DEVICE_PROPERTY FloatControlsProperties.shaderDenormPreserveFloat64 +DEVICE_PROPERTY FloatControlsProperties.shaderDenormFlushToZeroFloat16 +DEVICE_PROPERTY FloatControlsProperties.shaderDenormFlushToZeroFloat32 +DEVICE_PROPERTY FloatControlsProperties.shaderDenormFlushToZeroFloat64 +DEVICE_PROPERTY FloatControlsProperties.shaderRoundingModeRTEFloat16 +DEVICE_PROPERTY FloatControlsProperties.shaderRoundingModeRTEFloat32 +DEVICE_PROPERTY FloatControlsProperties.shaderRoundingModeRTEFloat64 +DEVICE_PROPERTY FloatControlsProperties.shaderRoundingModeRTZFloat16 +DEVICE_PROPERTY FloatControlsProperties.shaderRoundingModeRTZFloat32 +DEVICE_PROPERTY FloatControlsProperties.shaderRoundingModeRTZFloat64)"; Parser parser; Result r = parser.Parse(in); @@ -45,24 +45,36 @@ DEVICE_PROPERTY FloatControls.shaderRoundingModeRTZFloat64)"; auto script = parser.GetScript(); const auto& properties = script->GetRequiredProperties(); ASSERT_EQ(15U, properties.size()); - EXPECT_EQ("FloatControls.shaderSignedZeroInfNanPreserveFloat16", + EXPECT_EQ("FloatControlsProperties.shaderSignedZeroInfNanPreserveFloat16", properties[0]); - EXPECT_EQ("FloatControls.shaderSignedZeroInfNanPreserveFloat32", + EXPECT_EQ("FloatControlsProperties.shaderSignedZeroInfNanPreserveFloat32", properties[1]); - EXPECT_EQ("FloatControls.shaderSignedZeroInfNanPreserveFloat64", + EXPECT_EQ("FloatControlsProperties.shaderSignedZeroInfNanPreserveFloat64", properties[2]); - EXPECT_EQ("FloatControls.shaderDenormPreserveFloat16", properties[3]); - EXPECT_EQ("FloatControls.shaderDenormPreserveFloat32", properties[4]); - EXPECT_EQ("FloatControls.shaderDenormPreserveFloat64", properties[5]); - EXPECT_EQ("FloatControls.shaderDenormFlushToZeroFloat16", properties[6]); - EXPECT_EQ("FloatControls.shaderDenormFlushToZeroFloat32", properties[7]); - EXPECT_EQ("FloatControls.shaderDenormFlushToZeroFloat64", properties[8]); - EXPECT_EQ("FloatControls.shaderRoundingModeRTEFloat16", properties[9]); - EXPECT_EQ("FloatControls.shaderRoundingModeRTEFloat32", properties[10]); - EXPECT_EQ("FloatControls.shaderRoundingModeRTEFloat64", properties[11]); - EXPECT_EQ("FloatControls.shaderRoundingModeRTZFloat16", properties[12]); - EXPECT_EQ("FloatControls.shaderRoundingModeRTZFloat32", properties[13]); - EXPECT_EQ("FloatControls.shaderRoundingModeRTZFloat64", properties[14]); + EXPECT_EQ("FloatControlsProperties.shaderDenormPreserveFloat16", + properties[3]); + EXPECT_EQ("FloatControlsProperties.shaderDenormPreserveFloat32", + properties[4]); + EXPECT_EQ("FloatControlsProperties.shaderDenormPreserveFloat64", + properties[5]); + EXPECT_EQ("FloatControlsProperties.shaderDenormFlushToZeroFloat16", + properties[6]); + EXPECT_EQ("FloatControlsProperties.shaderDenormFlushToZeroFloat32", + properties[7]); + EXPECT_EQ("FloatControlsProperties.shaderDenormFlushToZeroFloat64", + properties[8]); + EXPECT_EQ("FloatControlsProperties.shaderRoundingModeRTEFloat16", + properties[9]); + EXPECT_EQ("FloatControlsProperties.shaderRoundingModeRTEFloat32", + properties[10]); + EXPECT_EQ("FloatControlsProperties.shaderRoundingModeRTEFloat64", + properties[11]); + EXPECT_EQ("FloatControlsProperties.shaderRoundingModeRTZFloat16", + properties[12]); + EXPECT_EQ("FloatControlsProperties.shaderRoundingModeRTZFloat32", + properties[13]); + EXPECT_EQ("FloatControlsProperties.shaderRoundingModeRTZFloat64", + properties[14]); } TEST_F(AmberScriptParserTest, DevicePropertyMissingProperty) { @@ -94,7 +106,8 @@ TEST_F(AmberScriptParserTest, DevicePropertyInvalid) { TEST_F(AmberScriptParserTest, DevicePropertyExtraParams) { std::string in = - "DEVICE_PROPERTY FloatControls.shaderDenormPreserveFloat16 EXTRA"; + "DEVICE_PROPERTY FloatControlsProperties.shaderDenormPreserveFloat16 " + "EXTRA"; Parser parser; Result r = parser.Parse(in); diff --git a/src/recipe.cc b/src/recipe.cc index 7e22bd478..7d46f05eb 100644 --- a/src/recipe.cc +++ b/src/recipe.cc @@ -35,6 +35,10 @@ std::vector Recipe::GetRequiredFeatures() const { return impl_ ? impl_->GetRequiredFeatures() : std::vector(); } +std::vector Recipe::GetRequiredProperties() const { + return impl_ ? impl_->GetRequiredProperties() : std::vector(); +} + std::vector Recipe::GetRequiredDeviceExtensions() const { return impl_ ? impl_->GetRequiredDeviceExtensions() : std::vector(); diff --git a/src/script.cc b/src/script.cc index 2f3b1cbb2..63ca2467d 100644 --- a/src/script.cc +++ b/src/script.cc @@ -135,21 +135,21 @@ bool Script::IsKnownFeature(const std::string& name) const { } bool Script::IsKnownProperty(const std::string& name) const { - return name == "FloatControls.shaderSignedZeroInfNanPreserveFloat16" || - name == "FloatControls.shaderSignedZeroInfNanPreserveFloat32" || - name == "FloatControls.shaderSignedZeroInfNanPreserveFloat64" || - name == "FloatControls.shaderDenormPreserveFloat16" || - name == "FloatControls.shaderDenormPreserveFloat32" || - name == "FloatControls.shaderDenormPreserveFloat64" || - name == "FloatControls.shaderDenormFlushToZeroFloat16" || - name == "FloatControls.shaderDenormFlushToZeroFloat32" || - name == "FloatControls.shaderDenormFlushToZeroFloat64" || - name == "FloatControls.shaderRoundingModeRTEFloat16" || - name == "FloatControls.shaderRoundingModeRTEFloat32" || - name == "FloatControls.shaderRoundingModeRTEFloat64" || - name == "FloatControls.shaderRoundingModeRTZFloat16" || - name == "FloatControls.shaderRoundingModeRTZFloat32" || - name == "FloatControls.shaderRoundingModeRTZFloat64"; + return name == "FloatControlsProperties.shaderSignedZeroInfNanPreserveFloat16" || + name == "FloatControlsProperties.shaderSignedZeroInfNanPreserveFloat32" || + name == "FloatControlsProperties.shaderSignedZeroInfNanPreserveFloat64" || + name == "FloatControlsProperties.shaderDenormPreserveFloat16" || + name == "FloatControlsProperties.shaderDenormPreserveFloat32" || + name == "FloatControlsProperties.shaderDenormPreserveFloat64" || + name == "FloatControlsProperties.shaderDenormFlushToZeroFloat16" || + name == "FloatControlsProperties.shaderDenormFlushToZeroFloat32" || + name == "FloatControlsProperties.shaderDenormFlushToZeroFloat64" || + name == "FloatControlsProperties.shaderRoundingModeRTEFloat16" || + name == "FloatControlsProperties.shaderRoundingModeRTEFloat32" || + name == "FloatControlsProperties.shaderRoundingModeRTEFloat64" || + name == "FloatControlsProperties.shaderRoundingModeRTZFloat16" || + name == "FloatControlsProperties.shaderRoundingModeRTZFloat32" || + name == "FloatControlsProperties.shaderRoundingModeRTZFloat64"; } type::Type* Script::ParseType(const std::string& str) { diff --git a/src/vulkan/device.cc b/src/vulkan/device.cc index 4a24c9679..0208eb885 100644 --- a/src/vulkan/device.cc +++ b/src/vulkan/device.cc @@ -761,7 +761,7 @@ Result Device::Initialize( const std::string name = dot_found ? prop.substr(dot_pos + 1) : prop; int supported = -1; - if (supported == -1 && prefix == "FloatControls") { + if (supported == -1 && prefix == "FloatControlsProperties") { if (fc_props_ptrs == nullptr && vulkan12_props_ptrs == nullptr) return Result( "Vulkan: Device::Initialize given physical device does not support " From d8f18fb56042693c4775234ff34ee251f9e79e3e Mon Sep 17 00:00:00 2001 From: Boris Zanin Date: Tue, 7 May 2024 14:24:44 +0200 Subject: [PATCH 4/8] Fix compilation --- src/script.cc | 33 ++++++++++++++++++--------------- src/vulkan/device.cc | 44 +++++++++++++++++++++----------------------- 2 files changed, 39 insertions(+), 38 deletions(-) diff --git a/src/script.cc b/src/script.cc index 63ca2467d..d5732d55d 100644 --- a/src/script.cc +++ b/src/script.cc @@ -135,21 +135,24 @@ bool Script::IsKnownFeature(const std::string& name) const { } bool Script::IsKnownProperty(const std::string& name) const { - return name == "FloatControlsProperties.shaderSignedZeroInfNanPreserveFloat16" || - name == "FloatControlsProperties.shaderSignedZeroInfNanPreserveFloat32" || - name == "FloatControlsProperties.shaderSignedZeroInfNanPreserveFloat64" || - name == "FloatControlsProperties.shaderDenormPreserveFloat16" || - name == "FloatControlsProperties.shaderDenormPreserveFloat32" || - name == "FloatControlsProperties.shaderDenormPreserveFloat64" || - name == "FloatControlsProperties.shaderDenormFlushToZeroFloat16" || - name == "FloatControlsProperties.shaderDenormFlushToZeroFloat32" || - name == "FloatControlsProperties.shaderDenormFlushToZeroFloat64" || - name == "FloatControlsProperties.shaderRoundingModeRTEFloat16" || - name == "FloatControlsProperties.shaderRoundingModeRTEFloat32" || - name == "FloatControlsProperties.shaderRoundingModeRTEFloat64" || - name == "FloatControlsProperties.shaderRoundingModeRTZFloat16" || - name == "FloatControlsProperties.shaderRoundingModeRTZFloat32" || - name == "FloatControlsProperties.shaderRoundingModeRTZFloat64"; + return name == + "FloatControlsProperties.shaderSignedZeroInfNanPreserveFloat16" || + name == + "FloatControlsProperties.shaderSignedZeroInfNanPreserveFloat32" || + name == + "FloatControlsProperties.shaderSignedZeroInfNanPreserveFloat64" || + name == "FloatControlsProperties.shaderDenormPreserveFloat16" || + name == "FloatControlsProperties.shaderDenormPreserveFloat32" || + name == "FloatControlsProperties.shaderDenormPreserveFloat64" || + name == "FloatControlsProperties.shaderDenormFlushToZeroFloat16" || + name == "FloatControlsProperties.shaderDenormFlushToZeroFloat32" || + name == "FloatControlsProperties.shaderDenormFlushToZeroFloat64" || + name == "FloatControlsProperties.shaderRoundingModeRTEFloat16" || + name == "FloatControlsProperties.shaderRoundingModeRTEFloat32" || + name == "FloatControlsProperties.shaderRoundingModeRTEFloat64" || + name == "FloatControlsProperties.shaderRoundingModeRTZFloat16" || + name == "FloatControlsProperties.shaderRoundingModeRTZFloat32" || + name == "FloatControlsProperties.shaderRoundingModeRTZFloat64"; } type::Type* Script::ParseType(const std::string& str) { diff --git a/src/vulkan/device.cc b/src/vulkan/device.cc index 0208eb885..fe768dcc7 100644 --- a/src/vulkan/device.cc +++ b/src/vulkan/device.cc @@ -729,20 +729,18 @@ Result Device::Initialize( "required extensions"); } - VkPhysicalDeviceVulkan12Properties* vulkan12_props_ptrs = nullptr; - VkPhysicalDeviceFloatControlsProperties* fc_props_ptrs = nullptr; + VkPhysicalDeviceVulkan12Properties* pv12 = nullptr; + VkPhysicalDeviceFloatControlsProperties* pfc = nullptr; ptr = available_properties2.pNext; while (ptr != nullptr) { BaseOutStructure* s = static_cast(ptr); switch (s->sType) { case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_PROPERTIES: - vulkan12_props_ptrs = - static_cast(ptr); + pv12 = static_cast(ptr); break; case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FLOAT_CONTROLS_PROPERTIES_KHR: - fc_props_ptrs = - static_cast(ptr); + pfc = static_cast(ptr); break; default: break; @@ -750,7 +748,7 @@ Result Device::Initialize( ptr = s->pNext; } -#define CHECK_FLOAT_CONTROL_PROPERTY(R, P, NAME, S1, S2) \ +#define CHK_P(R, P, NAME, S1, S2) \ if (R == -1 && P == #NAME) \ R = ((S1 && S1->NAME) || (S2 && S2->NAME)) ? 1 : 0; @@ -762,26 +760,26 @@ Result Device::Initialize( int supported = -1; if (supported == -1 && prefix == "FloatControlsProperties") { - if (fc_props_ptrs == nullptr && vulkan12_props_ptrs == nullptr) + if (pfc == nullptr && pv12 == nullptr) return Result( "Vulkan: Device::Initialize given physical device does not support " "required float control properties"); - CHECK_FLOAT_CONTROL_PROPERTY(supported, name, shaderSignedZeroInfNanPreserveFloat16, fc_props_ptrs, vulkan12_props_ptrs); - CHECK_FLOAT_CONTROL_PROPERTY(supported, name, shaderSignedZeroInfNanPreserveFloat32, fc_props_ptrs, vulkan12_props_ptrs); - CHECK_FLOAT_CONTROL_PROPERTY(supported, name, shaderSignedZeroInfNanPreserveFloat64, fc_props_ptrs, vulkan12_props_ptrs); - CHECK_FLOAT_CONTROL_PROPERTY(supported, name, shaderDenormPreserveFloat16, fc_props_ptrs, vulkan12_props_ptrs); - CHECK_FLOAT_CONTROL_PROPERTY(supported, name, shaderDenormPreserveFloat32, fc_props_ptrs, vulkan12_props_ptrs); - CHECK_FLOAT_CONTROL_PROPERTY(supported, name, shaderDenormPreserveFloat64, fc_props_ptrs, vulkan12_props_ptrs); - CHECK_FLOAT_CONTROL_PROPERTY(supported, name, shaderDenormFlushToZeroFloat16, fc_props_ptrs, vulkan12_props_ptrs); - CHECK_FLOAT_CONTROL_PROPERTY(supported, name, shaderDenormFlushToZeroFloat32, fc_props_ptrs, vulkan12_props_ptrs); - CHECK_FLOAT_CONTROL_PROPERTY(supported, name, shaderDenormFlushToZeroFloat64, fc_props_ptrs, vulkan12_props_ptrs); - CHECK_FLOAT_CONTROL_PROPERTY(supported, name, shaderRoundingModeRTEFloat16, fc_props_ptrs, vulkan12_props_ptrs); - CHECK_FLOAT_CONTROL_PROPERTY(supported, name, shaderRoundingModeRTEFloat32, fc_props_ptrs, vulkan12_props_ptrs); - CHECK_FLOAT_CONTROL_PROPERTY(supported, name, shaderRoundingModeRTEFloat64, fc_props_ptrs, vulkan12_props_ptrs); - CHECK_FLOAT_CONTROL_PROPERTY(supported, name, shaderRoundingModeRTZFloat16, fc_props_ptrs, vulkan12_props_ptrs); - CHECK_FLOAT_CONTROL_PROPERTY(supported, name, shaderRoundingModeRTZFloat32, fc_props_ptrs, vulkan12_props_ptrs); - CHECK_FLOAT_CONTROL_PROPERTY(supported, name, shaderRoundingModeRTZFloat64, fc_props_ptrs, vulkan12_props_ptrs); + CHK_P(supported, name, shaderSignedZeroInfNanPreserveFloat16, pfc, pv12); + CHK_P(supported, name, shaderSignedZeroInfNanPreserveFloat32, pfc, pv12); + CHK_P(supported, name, shaderSignedZeroInfNanPreserveFloat64, pfc, pv12); + CHK_P(supported, name, shaderDenormPreserveFloat16, pfc, pv12); + CHK_P(supported, name, shaderDenormPreserveFloat32, pfc, pv12); + CHK_P(supported, name, shaderDenormPreserveFloat64, pfc, pv12); + CHK_P(supported, name, shaderDenormFlushToZeroFloat16, pfc, pv12); + CHK_P(supported, name, shaderDenormFlushToZeroFloat32, pfc, pv12); + CHK_P(supported, name, shaderDenormFlushToZeroFloat64, pfc, pv12); + CHK_P(supported, name, shaderRoundingModeRTEFloat16, pfc, pv12); + CHK_P(supported, name, shaderRoundingModeRTEFloat32, pfc, pv12); + CHK_P(supported, name, shaderRoundingModeRTEFloat64, pfc, pv12); + CHK_P(supported, name, shaderRoundingModeRTZFloat16, pfc, pv12); + CHK_P(supported, name, shaderRoundingModeRTZFloat32, pfc, pv12); + CHK_P(supported, name, shaderRoundingModeRTZFloat64, pfc, pv12); } if (supported == 0) From 2daba6c38f5ebbfe750fd22aff32acd45c6ba69a Mon Sep 17 00:00:00 2001 From: Boris Zanin Date: Tue, 7 May 2024 15:37:23 +0200 Subject: [PATCH 5/8] Fix formatting --- include/amber/amber_vulkan.h | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/include/amber/amber_vulkan.h b/include/amber/amber_vulkan.h index e2c101df2..307a58abe 100644 --- a/include/amber/amber_vulkan.h +++ b/include/amber/amber_vulkan.h @@ -55,9 +55,10 @@ struct VulkanEngineConfig : public EngineConfig { /// will be used in that case. VkPhysicalDeviceProperties available_properties; - /// Physical device properties for |physical_device|.The |available_properties2| - /// will only be used if VK_KHR_get_physical_device_properties2 is enabled. If - /// the extension is not enabled, |available_properties| will be used. + /// Physical device properties for |physical_device|.The + /// |available_properties2| will only be used if + /// VK_KHR_get_physical_device_properties2 is enabled. If the extension is not + /// enabled, |available_properties| will be used. VkPhysicalDeviceProperties2KHR available_properties2; /// Instance extensions available. From 7f7cab0eb2fc88ad84bcf1d150aa13a8963f169c Mon Sep 17 00:00:00 2001 From: Boris Zanin Date: Wed, 8 May 2024 10:55:35 +0200 Subject: [PATCH 6/8] Fix compiler complains --- src/executor_test.cc | 1 + src/vulkan/device.cc | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/src/executor_test.cc b/src/executor_test.cc index e5e39514b..a54426048 100644 --- a/src/executor_test.cc +++ b/src/executor_test.cc @@ -41,6 +41,7 @@ class EngineStub : public Engine { const std::vector& instance_exts, const std::vector& device_exts) override { features_ = features; + properties_ = properties; instance_extensions_ = instance_exts; device_extensions_ = device_exts; return {}; diff --git a/src/vulkan/device.cc b/src/vulkan/device.cc index fe768dcc7..795ef1aa9 100644 --- a/src/vulkan/device.cc +++ b/src/vulkan/device.cc @@ -451,7 +451,6 @@ Result Device::Initialize( const std::vector& required_device_extensions, const VkPhysicalDeviceFeatures& available_features, const VkPhysicalDeviceFeatures2KHR& available_features2, - const VkPhysicalDeviceProperties& available_properties, const VkPhysicalDeviceProperties2KHR& available_properties2, const std::vector& available_extensions) { Result r = LoadVulkanPointers(getInstanceProcAddr, delegate); From 7df685136a3b74a122cc2a585dc6b073d70a4368 Mon Sep 17 00:00:00 2001 From: Boris Zanin Date: Mon, 13 May 2024 12:44:04 +0200 Subject: [PATCH 7/8] Fix compiler errors 2 --- src/executor_test.cc | 1 + src/vulkan/device.h | 1 - src/vulkan/engine_vulkan.cc | 4 ++-- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/executor_test.cc b/src/executor_test.cc index a54426048..2625be289 100644 --- a/src/executor_test.cc +++ b/src/executor_test.cc @@ -195,6 +195,7 @@ class EngineStub : public Engine { bool did_buffer_command_ = false; std::vector features_; + std::vector properties_; std::vector instance_extensions_; std::vector device_extensions_; diff --git a/src/vulkan/device.h b/src/vulkan/device.h index 1f7f99bba..7298151b9 100644 --- a/src/vulkan/device.h +++ b/src/vulkan/device.h @@ -51,7 +51,6 @@ class Device { const std::vector& required_device_extensions, const VkPhysicalDeviceFeatures& available_features, const VkPhysicalDeviceFeatures2KHR& available_features2, - const VkPhysicalDeviceProperties& available_properties, const VkPhysicalDeviceProperties2KHR& available_properties2, const std::vector& available_extensions); diff --git a/src/vulkan/engine_vulkan.cc b/src/vulkan/engine_vulkan.cc index 0cfc37c58..8f481d564 100644 --- a/src/vulkan/engine_vulkan.cc +++ b/src/vulkan/engine_vulkan.cc @@ -121,8 +121,8 @@ Result EngineVulkan::Initialize( Result r = device_->Initialize( vk_config->vkGetInstanceProcAddr, delegate, features, properties, device_extensions, vk_config->available_features, - vk_config->available_features2, vk_config->available_properties, - vk_config->available_properties2, vk_config->available_device_extensions); + vk_config->available_features2, vk_config->available_properties2, + vk_config->available_device_extensions); if (!r.IsSuccess()) return r; From e5d4c56084194e28d6af58d848313b2a08d9d477 Mon Sep 17 00:00:00 2001 From: Boris Zanin Date: Mon, 13 May 2024 14:11:25 +0200 Subject: [PATCH 8/8] Fix compiler error 3 --- src/vulkan/device.cc | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/vulkan/device.cc b/src/vulkan/device.cc index 795ef1aa9..a45be690f 100644 --- a/src/vulkan/device.cc +++ b/src/vulkan/device.cc @@ -748,8 +748,10 @@ Result Device::Initialize( } #define CHK_P(R, P, NAME, S1, S2) \ - if (R == -1 && P == #NAME) \ - R = ((S1 && S1->NAME) || (S2 && S2->NAME)) ? 1 : 0; + do { \ + if (R == -1 && P == #NAME) \ + R = ((S1 && S1->NAME) || (S2 && S2->NAME)) ? 1 : 0; \ + } while (false) for (const std::string& prop : required_properties) { const size_t dot_pos = prop.find('.');