diff options
author | dan sinclair <dj2@everburning.com> | 2019-03-29 00:10:09 -0400 |
---|---|---|
committer | David Neto <dneto@google.com> | 2019-03-29 00:10:09 -0400 |
commit | f23a84c68a7fa5a86429d1261f02f427402ce4db (patch) | |
tree | 529fe9e3c9c3d3c0a5ae3850831fb2b8238f3c7a /src | |
parent | d70c0e42f5723834ab03977c4e3c92185ecaf900 (diff) | |
download | amber-f23a84c68a7fa5a86429d1261f02f427402ce4db.tar.gz |
[amberscript] add DEVICE_FEATURE. (#434)
[amberscript] add DEVICE_FEATURE.
This CL adds the DEVICE_FEATURE command which allows requesting specific
features be enabled.
Fixes #347.
Diffstat (limited to 'src')
-rw-r--r-- | src/CMakeLists.txt | 1 | ||||
-rw-r--r-- | src/amberscript/parser.cc | 16 | ||||
-rw-r--r-- | src/amberscript/parser.h | 1 | ||||
-rw-r--r-- | src/amberscript/parser_device_feature_test.cc | 77 | ||||
-rw-r--r-- | src/script.cc | 43 | ||||
-rw-r--r-- | src/script.h | 2 | ||||
-rw-r--r-- | src/vkscript/parser.cc | 47 |
7 files changed, 141 insertions, 46 deletions
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index cb60284..5940605 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -83,6 +83,7 @@ if (${AMBER_ENABLE_TESTS}) amberscript/parser_clear_color_test.cc amberscript/parser_clear_test.cc amberscript/parser_copy_test.cc + amberscript/parser_device_feature_test.cc amberscript/parser_expect_test.cc amberscript/parser_framebuffer_test.cc amberscript/parser_pipeline_test.cc diff --git a/src/amberscript/parser.cc b/src/amberscript/parser.cc index 34662a1..f3acb79 100644 --- a/src/amberscript/parser.cc +++ b/src/amberscript/parser.cc @@ -80,6 +80,8 @@ Result Parser::Parse(const std::string& data) { r = ParseClearColor(); } else if (tok == "COPY") { r = ParseCopy(); + } else if (tok == "DEVICE_FEATURE") { + r = ParseDeviceFeature(); } else if (tok == "EXPECT") { r = ParseExpect(); } else if (tok == "PIPELINE") { @@ -1297,5 +1299,19 @@ Result Parser::ParseClearColor() { return ValidateEndOfStatement("CLEAR_COLOR command"); } +Result Parser::ParseDeviceFeature() { + auto token = tokenizer_->NextToken(); + if (token->IsEOS() || token->IsEOL()) + return Result("missing feature name for DEVICE_FEATURE command"); + if (!token->IsString()) + return Result("invalid feature name for DEVICE_FEATURE command"); + if (!script_->IsKnownFeature(token->AsString())) + return Result("unknown feature name for DEVICE_FEATURE command"); + + script_->AddRequiredFeature(token->AsString()); + + return ValidateEndOfStatement("DEVICE_FEATURE command"); +} + } // namespace amberscript } // namespace amber diff --git a/src/amberscript/parser.h b/src/amberscript/parser.h index e4e4371..205e18b 100644 --- a/src/amberscript/parser.h +++ b/src/amberscript/parser.h @@ -66,6 +66,7 @@ class Parser : public amber::Parser { Result ParseClearColor(); Result ParseExpect(); Result ParseCopy(); + Result ParseDeviceFeature(); // Parses a set of values out of the token stream. |name| is the name of the // current command we're parsing for error purposes. The |type| is the type diff --git a/src/amberscript/parser_device_feature_test.cc b/src/amberscript/parser_device_feature_test.cc new file mode 100644 index 0000000..e7a567a --- /dev/null +++ b/src/amberscript/parser_device_feature_test.cc @@ -0,0 +1,77 @@ +// Copyright 2019 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, DeviceFeature) { + std::string in = R"( +DEVICE_FEATURE vertexPipelineStoresAndAtomics +DEVICE_FEATURE VariablePointerFeatures.variablePointersStorageBuffer)"; + + Parser parser; + Result r = parser.Parse(in); + ASSERT_TRUE(r.IsSuccess()) << r.Error(); + + auto script = parser.GetScript(); + const auto& features = script->GetRequiredFeatures(); + ASSERT_EQ(2U, features.size()); + EXPECT_EQ("vertexPipelineStoresAndAtomics", features[0]); + EXPECT_EQ("VariablePointerFeatures.variablePointersStorageBuffer", + features[1]); +} + +TEST_F(AmberScriptParserTest, DeviceFeatureMissingFeature) { + std::string in = "DEVICE_FEATURE"; + + Parser parser; + Result r = parser.Parse(in); + ASSERT_FALSE(r.IsSuccess()); + EXPECT_EQ("1: missing feature name for DEVICE_FEATURE command", r.Error()); +} + +TEST_F(AmberScriptParserTest, DeviceFeatureUnknown) { + std::string in = "DEVICE_FEATURE unknown"; + + Parser parser; + Result r = parser.Parse(in); + ASSERT_FALSE(r.IsSuccess()); + EXPECT_EQ("1: unknown feature name for DEVICE_FEATURE command", r.Error()); +} + +TEST_F(AmberScriptParserTest, DeviceFeatureInvalid) { + std::string in = "DEVICE_FEATURE 12345"; + + Parser parser; + Result r = parser.Parse(in); + ASSERT_FALSE(r.IsSuccess()); + EXPECT_EQ("1: invalid feature name for DEVICE_FEATURE command", r.Error()); +} + +TEST_F(AmberScriptParserTest, DeviceFeatureExtraParams) { + std::string in = "DEVICE_FEATURE vertexPipelineStoresAndAtomics EXTRA"; + + Parser parser; + Result r = parser.Parse(in); + ASSERT_FALSE(r.IsSuccess()); + EXPECT_EQ("1: extra parameters after DEVICE_FEATURE command", r.Error()); +} + +} // namespace amberscript +} // namespace amber diff --git a/src/script.cc b/src/script.cc index 2270475..0eaf321 100644 --- a/src/script.cc +++ b/src/script.cc @@ -46,4 +46,47 @@ void Script::AddRequiredExtension(const std::string& ext) { engine_info_.required_device_extensions.push_back(ext); } +bool Script::IsKnownFeature(const std::string& name) const { + return name == "robustBufferAccess" || name == "fullDrawIndexUint32" || + name == "imageCubeArray" || name == "independentBlend" || + name == "geometryShader" || name == "tessellationShader" || + name == "sampleRateShading" || name == "dualSrcBlend" || + name == "logicOp" || name == "multiDrawIndirect" || + name == "drawIndirectFirstInstance" || name == "depthClamp" || + name == "depthBiasClamp" || name == "fillModeNonSolid" || + name == "depthBounds" || name == "wideLines" || + name == "largePoints" || name == "alphaToOne" || + name == "multiViewport" || name == "samplerAnisotropy" || + name == "textureCompressionETC2" || + name == "textureCompressionASTC_LDR" || + name == "textureCompressionBC" || name == "occlusionQueryPrecise" || + name == "pipelineStatisticsQuery" || + name == "vertexPipelineStoresAndAtomics" || + name == "fragmentStoresAndAtomics" || + name == "shaderTessellationAndGeometryPointSize" || + name == "shaderImageGatherExtended" || + name == "shaderStorageImageExtendedFormats" || + name == "shaderStorageImageMultisample" || + name == "shaderStorageImageReadWithoutFormat" || + name == "shaderStorageImageWriteWithoutFormat" || + name == "shaderUniformBufferArrayDynamicIndexing" || + name == "shaderSampledImageArrayDynamicIndexing" || + name == "shaderStorageBufferArrayDynamicIndexing" || + name == "shaderStorageImageArrayDynamicIndexing" || + name == "shaderClipDistance" || name == "shaderCullDistance" || + name == "shaderFloat64" || name == "shaderInt64" || + name == "shaderInt16" || name == "shaderResourceResidency" || + name == "shaderResourceMinLod" || name == "sparseBinding" || + name == "sparseResidencyBuffer" || name == "sparseResidencyImage2D" || + name == "sparseResidencyImage3D" || + name == "sparseResidency2Samples" || + name == "sparseResidency4Samples" || + name == "sparseResidency8Samples" || + name == "sparseResidency16Samples" || + name == "sparseResidencyAliased" || + name == "variableMultisampleRate" || name == "inheritedQueries" || + name == "VariablePointerFeatures.variablePointers" || + name == "VariablePointerFeatures.variablePointersStorageBuffer"; +} + } // namespace amber diff --git a/src/script.h b/src/script.h index 371ede8..5aad06a 100644 --- a/src/script.h +++ b/src/script.h @@ -38,6 +38,8 @@ class Script : public RecipeImpl { Script(); ~Script() override; + bool IsKnownFeature(const std::string& name) const; + /// Retrieves information on the shaders in the given script. std::vector<ShaderInfo> GetShaderInfo() const override; diff --git a/src/vkscript/parser.cc b/src/vkscript/parser.cc index b2f0af2..deab09b 100644 --- a/src/vkscript/parser.cc +++ b/src/vkscript/parser.cc @@ -33,51 +33,6 @@ namespace { uint32_t kDefaultFrameBufferSize = 250; const char kDefaultPipelineName[] = "vk_pipeline"; -bool IsKnownFeature(const std::string& name) { - // Note framebuffer, depthstencil, fbsize and fence_timeout are not matched - // here. - return name == "robustBufferAccess" || name == "fullDrawIndexUint32" || - name == "imageCubeArray" || name == "independentBlend" || - name == "geometryShader" || name == "tessellationShader" || - name == "sampleRateShading" || name == "dualSrcBlend" || - name == "logicOp" || name == "multiDrawIndirect" || - name == "drawIndirectFirstInstance" || name == "depthClamp" || - name == "depthBiasClamp" || name == "fillModeNonSolid" || - name == "depthBounds" || name == "wideLines" || - name == "largePoints" || name == "alphaToOne" || - name == "multiViewport" || name == "samplerAnisotropy" || - name == "textureCompressionETC2" || - name == "textureCompressionASTC_LDR" || - name == "textureCompressionBC" || name == "occlusionQueryPrecise" || - name == "pipelineStatisticsQuery" || - name == "vertexPipelineStoresAndAtomics" || - name == "fragmentStoresAndAtomics" || - name == "shaderTessellationAndGeometryPointSize" || - name == "shaderImageGatherExtended" || - name == "shaderStorageImageExtendedFormats" || - name == "shaderStorageImageMultisample" || - name == "shaderStorageImageReadWithoutFormat" || - name == "shaderStorageImageWriteWithoutFormat" || - name == "shaderUniformBufferArrayDynamicIndexing" || - name == "shaderSampledImageArrayDynamicIndexing" || - name == "shaderStorageBufferArrayDynamicIndexing" || - name == "shaderStorageImageArrayDynamicIndexing" || - name == "shaderClipDistance" || name == "shaderCullDistance" || - name == "shaderFloat64" || name == "shaderInt64" || - name == "shaderInt16" || name == "shaderResourceResidency" || - name == "shaderResourceMinLod" || name == "sparseBinding" || - name == "sparseResidencyBuffer" || name == "sparseResidencyImage2D" || - name == "sparseResidencyImage3D" || - name == "sparseResidency2Samples" || - name == "sparseResidency4Samples" || - name == "sparseResidency8Samples" || - name == "sparseResidency16Samples" || - name == "sparseResidencyAliased" || - name == "variableMultisampleRate" || name == "inheritedQueries" || - name == "VariablePointerFeatures.variablePointers" || - name == "VariablePointerFeatures.variablePointersStorageBuffer"; -} - } // namespace Parser::Parser() : amber::Parser() {} @@ -199,7 +154,7 @@ Result Parser::ProcessRequireBlock(const SectionParser::Section& section) { } std::string str = token->AsString(); - if (IsKnownFeature(str)) { + if (script_->IsKnownFeature(str)) { script_->AddRequiredFeature(str); } else if (str == Pipeline::kGeneratedColorBuffer) { token = tokenizer.NextToken(); |