diff options
author | asuonpaa <34128694+asuonpaa@users.noreply.github.com> | 2019-12-04 20:12:17 +0200 |
---|---|---|
committer | dan sinclair <dsinclair@google.com> | 2019-12-04 13:12:17 -0500 |
commit | 3a57f61b12eb87a92f278d5fb9224ccf302c64d0 (patch) | |
tree | cff523a6e8b8eadf96d56c62bd477f5ddd5a4a45 /src/amberscript/parser.cc | |
parent | 12a78a80080cb744a7b64e293ef007522e1e5eac (diff) | |
download | amber-3a57f61b12eb87a92f278d5fb9224ccf302c64d0.tar.gz |
Mipmap support (#731)
Fixes #714
Diffstat (limited to 'src/amberscript/parser.cc')
-rw-r--r-- | src/amberscript/parser.cc | 80 |
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)); } |