aboutsummaryrefslogtreecommitdiff
path: root/src/amberscript/parser.cc
diff options
context:
space:
mode:
authorasuonpaa <34128694+asuonpaa@users.noreply.github.com>2019-12-04 20:12:17 +0200
committerdan sinclair <dsinclair@google.com>2019-12-04 13:12:17 -0500
commit3a57f61b12eb87a92f278d5fb9224ccf302c64d0 (patch)
treecff523a6e8b8eadf96d56c62bd477f5ddd5a4a45 /src/amberscript/parser.cc
parent12a78a80080cb744a7b64e293ef007522e1e5eac (diff)
downloadamber-3a57f61b12eb87a92f278d5fb9224ccf302c64d0.tar.gz
Mipmap support (#731)
Fixes #714
Diffstat (limited to 'src/amberscript/parser.cc')
-rw-r--r--src/amberscript/parser.cc80
1 files changed, 76 insertions, 4 deletions
diff --git a/src/amberscript/parser.cc b/src/amberscript/parser.cc
index bc3bdd8..e0fca81 100644
--- a/src/amberscript/parser.cc
+++ b/src/amberscript/parser.cc
@@ -207,7 +207,7 @@ Result Parser::Parse(const std::string& data) {
if (!r.IsSuccess())
return r;
}
- Result r = pipeline->AddColorAttachment(buf, 0);
+ Result r = pipeline->AddColorAttachment(buf, 0, 0);
if (!r.IsSuccess())
return r;
}
@@ -732,8 +732,27 @@ Result Parser::ParsePipelineBind(Pipeline* pipeline) {
token = tokenizer_->NextToken();
if (!token->IsInteger())
return Result("invalid value for BIND LOCATION");
+ auto location = token->AsUint32();
- r = pipeline->AddColorAttachment(buffer, token->AsUint32());
+ uint32_t base_mip_level = 0;
+ token = tokenizer_->PeekNextToken();
+ if (token->IsString() && token->AsString() == "BASE_MIP_LEVEL") {
+ tokenizer_->NextToken();
+ token = tokenizer_->NextToken();
+
+ if (!token->IsInteger())
+ return Result("invalid value for BASE_MIP_LEVEL");
+
+ base_mip_level = token->AsUint32();
+
+ if (base_mip_level >= buffer->GetMipLevels())
+ return Result(
+ "base mip level (now " + token->AsString() +
+ ") needs to be larger than the number of buffer mip maps (" +
+ std::to_string(buffer->GetMipLevels()) + ")");
+ }
+
+ r = pipeline->AddColorAttachment(buffer, location, base_mip_level);
if (!r.IsSuccess())
return r;
@@ -793,8 +812,32 @@ Result Parser::ParsePipelineBind(Pipeline* pipeline) {
if (!token->IsInteger())
return Result("invalid value for BINDING in BIND command");
- pipeline->AddBuffer(buffer, buffer_type, descriptor_set,
- token->AsUint32());
+ auto binding = token->AsUint32();
+ uint32_t base_mip_level = 0;
+
+ if (buffer_type == BufferType::kStorageImage ||
+ buffer_type == BufferType::kSampledImage ||
+ buffer_type == BufferType::kCombinedImageSampler) {
+ token = tokenizer_->PeekNextToken();
+ if (token->IsString() && token->AsString() == "BASE_MIP_LEVEL") {
+ tokenizer_->NextToken();
+ token = tokenizer_->NextToken();
+
+ if (!token->IsInteger())
+ return Result("invalid value for BASE_MIP_LEVEL");
+
+ base_mip_level = token->AsUint32();
+
+ if (base_mip_level >= buffer->GetMipLevels())
+ return Result(
+ "base mip level (now " + token->AsString() +
+ ") needs to be larger than the number of buffer mip maps (" +
+ std::to_string(buffer->GetMipLevels()) + ")");
+ }
+ }
+
+ pipeline->AddBuffer(buffer, buffer_type, descriptor_set, binding,
+ base_mip_level);
} else if (token->IsString() && token->AsString() == "KERNEL") {
token = tokenizer_->NextToken();
if (!token->IsString())
@@ -1137,6 +1180,17 @@ Result Parser::ParseBuffer() {
auto fmt = MakeUnique<Format>(type);
buffer->SetFormat(fmt.get());
script_->RegisterFormat(std::move(fmt));
+
+ token = tokenizer_->PeekNextToken();
+ if (token->IsString() && token->AsString() == "MIP_LEVELS") {
+ tokenizer_->NextToken();
+ token = tokenizer_->NextToken();
+
+ if (!token->IsInteger())
+ return Result("invalid value for MIP_LEVELS");
+
+ buffer->SetMipLevels(token->AsUint32());
+ }
} else {
return Result("unknown BUFFER command provided: " + cmd);
}
@@ -2287,6 +2341,20 @@ Result Parser::ParseSampler() {
sampler->SetBorderColor(BorderColor::kIntOpaqueWhite);
else
return Result("invalid BORDER_COLOR value " + color_str);
+ } else if (param == "MIN_LOD") {
+ token = tokenizer_->NextToken();
+
+ if (!token->IsDouble())
+ return Result("invalid token when looking for MIN_LOD value");
+
+ sampler->SetMinLOD(token->AsFloat());
+ } else if (param == "MAX_LOD") {
+ token = tokenizer_->NextToken();
+
+ if (!token->IsDouble())
+ return Result("invalid token when looking for MAX_LOD value");
+
+ sampler->SetMaxLOD(token->AsFloat());
} else {
return Result("unexpected sampler parameter " + param);
}
@@ -2294,6 +2362,10 @@ Result Parser::ParseSampler() {
token = tokenizer_->NextToken();
}
+ if (sampler->GetMaxLOD() < sampler->GetMinLOD()) {
+ return Result("max LOD needs to be greater than or equal to min LOD");
+ }
+
return script_->AddSampler(std::move(sampler));
}