aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authordan sinclair <dj2@everburning.com>2019-03-29 00:10:09 -0400
committerDavid Neto <dneto@google.com>2019-03-29 00:10:09 -0400
commitf23a84c68a7fa5a86429d1261f02f427402ce4db (patch)
tree529fe9e3c9c3d3c0a5ae3850831fb2b8238f3c7a /src
parentd70c0e42f5723834ab03977c4e3c92185ecaf900 (diff)
downloadamber-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.txt1
-rw-r--r--src/amberscript/parser.cc16
-rw-r--r--src/amberscript/parser.h1
-rw-r--r--src/amberscript/parser_device_feature_test.cc77
-rw-r--r--src/script.cc43
-rw-r--r--src/script.h2
-rw-r--r--src/vkscript/parser.cc47
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();