Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions src/acceleration_structure.h
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,9 @@ class Geometry {
void SetData(std::vector<float>& data) { data_.swap(data); }
std::vector<float>& GetData() { return data_; }

void SetFlags(uint32_t flags) { flags_ = flags; }
uint32_t GetFlags() { return flags_; }

size_t getVertexCount() const {
return data_.size() / 3; // Three floats to define vertex
}
Expand All @@ -65,6 +68,7 @@ class Geometry {
private:
GeometryType type_ = GeometryType::kUnknown;
std::vector<float> data_;
uint32_t flags_ = 0u;
};

class BLAS {
Expand Down
53 changes: 53 additions & 0 deletions src/amberscript/parser.cc
Original file line number Diff line number Diff line change
Expand Up @@ -4027,6 +4027,7 @@ Result Parser::ParseBLAS() {
Result Parser::ParseBLASTriangle(BLAS* blas) {
std::unique_ptr<Geometry> geometry = MakeUnique<Geometry>();
std::vector<float> g;
uint32_t flags = 0;
geometry->SetType(GeometryType::kTriangle);

while (true) {
Expand All @@ -4041,6 +4042,10 @@ Result Parser::ParseBLASTriangle(BLAS* blas) {
std::string tok = token->AsString();
if (tok == "END") {
break;
} else if (tok == "FLAGS") {
Result r = ParseGeometryFlags(&flags);
if (!r.IsSuccess())
return r;
} else {
return Result("END or float value is expected");
}
Expand All @@ -4061,6 +4066,7 @@ Result Parser::ParseBLASTriangle(BLAS* blas) {
return Result("Each triangle should include three vertices.");

geometry->SetData(g);
geometry->SetFlags(flags);

blas->AddGeometry(&geometry);

Expand All @@ -4070,6 +4076,7 @@ Result Parser::ParseBLASTriangle(BLAS* blas) {
Result Parser::ParseBLASAABB(BLAS* blas) {
std::unique_ptr<Geometry> geometry = MakeUnique<Geometry>();
std::vector<float> g;
uint32_t flags = 0;
geometry->SetType(GeometryType::kAABB);

while (true) {
Expand All @@ -4084,6 +4091,10 @@ Result Parser::ParseBLASAABB(BLAS* blas) {
std::string tok = token->AsString();
if (tok == "END") {
break;
} else if (tok == "FLAGS") {
Result r = ParseGeometryFlags(&flags);
if (!r.IsSuccess())
return r;
} else {
return Result("END or float value is expected");
}
Expand All @@ -4105,12 +4116,54 @@ Result Parser::ParseBLASAABB(BLAS* blas) {
"include two vertices.");

geometry->SetData(g);
geometry->SetFlags(flags);

blas->AddGeometry(&geometry);

return {};
}

Result Parser::ParseGeometryFlags(uint32_t* flags) {
std::unique_ptr<Token> token;
bool first_eol = true;
bool singleline = true;
Result r;

while (true) {
token = tokenizer_->NextToken();
if (token->IsEOL()) {
if (first_eol) {
first_eol = false;
singleline = (*flags != 0);
}
if (singleline)
break;
else
continue;
}
if (token->IsEOS())
return Result("END command missing");

if (token->IsIdentifier()) {
if (token->AsString() == "END")
break;
else if (token->AsString() == "OPAQUE")
*flags |= VK_GEOMETRY_OPAQUE_BIT_KHR;
else if (token->AsString() == "NO_DUPLICATE_ANY_HIT")
*flags |= VK_GEOMETRY_NO_DUPLICATE_ANY_HIT_INVOCATION_BIT_KHR;
else
return Result("Unknown flag: " + token->AsString());
} else {
r = Result("Identifier expected");
}

if (!r.IsSuccess())
return r;
}

return {};
}

Result Parser::ParseTLAS() {
auto token = tokenizer_->NextToken();
if (!token->IsIdentifier())
Expand Down
1 change: 1 addition & 0 deletions src/amberscript/parser.h
Original file line number Diff line number Diff line change
Expand Up @@ -102,6 +102,7 @@ class Parser : public amber::Parser {
Result ParseBLAS();
Result ParseBLASTriangle(BLAS* blas);
Result ParseBLASAABB(BLAS* blas);
Result ParseGeometryFlags(uint32_t* flags);
Result ParseTLAS();
Result ParseBLASInstance(TLAS* tlas);
Result ParseBLASInstanceTransform(BLASInstance* instance);
Expand Down
54 changes: 54 additions & 0 deletions src/amberscript/parser_raytracing_test.cc
Original file line number Diff line number Diff line change
Expand Up @@ -195,6 +195,33 @@ ACCELERATION_STRUCTURE BOTTOM_LEVEL blas_name
EXPECT_EQ("3: Unexpected data type", r.Error());
}

TEST_F(AmberScriptParserTest, RayTracingBlasTriangleGeometryFlags) {
{
std::string in = R"(
ACCELERATION_STRUCTURE BOTTOM_LEVEL blas_name
GEOMETRY TRIANGLES
FLAGS OPAQUE NO_DUPLICATE_ANY_HIT NO_SUCH_FLAG
)";

Parser parser;
Result r = parser.Parse(in);
ASSERT_FALSE(r.IsSuccess());
EXPECT_EQ("4: Unknown flag: NO_SUCH_FLAG", r.Error());
}
{
std::string in = R"(
ACCELERATION_STRUCTURE BOTTOM_LEVEL blas_name
GEOMETRY TRIANGLES
FLAGS 1
)";

Parser parser;
Result r = parser.Parse(in);
ASSERT_FALSE(r.IsSuccess());
EXPECT_EQ("4: Identifier expected", r.Error());
}
}

TEST_F(AmberScriptParserTest, RayTracingBlasAABBEmpty) {
std::string in = R"(
ACCELERATION_STRUCTURE BOTTOM_LEVEL blas_name
Expand Down Expand Up @@ -249,6 +276,33 @@ ACCELERATION_STRUCTURE BOTTOM_LEVEL blas_name
EXPECT_EQ("3: Unexpected data type", r.Error());
}

TEST_F(AmberScriptParserTest, RayTracingBlasAABBGeometryFlags) {
{
std::string in = R"(
ACCELERATION_STRUCTURE BOTTOM_LEVEL blas_name
GEOMETRY AABBS
FLAGS OPAQUE NO_DUPLICATE_ANY_HIT NO_SUCH_FLAG
)";

Parser parser;
Result r = parser.Parse(in);
ASSERT_FALSE(r.IsSuccess());
EXPECT_EQ("4: Unknown flag: NO_SUCH_FLAG", r.Error());
}
{
std::string in = R"(
ACCELERATION_STRUCTURE BOTTOM_LEVEL blas_name
GEOMETRY AABBS
FLAGS 1
)";

Parser parser;
Result r = parser.Parse(in);
ASSERT_FALSE(r.IsSuccess());
EXPECT_EQ("4: Identifier expected", r.Error());
}
}

TEST_F(AmberScriptParserTest, RayTracingTlasName) {
std::string in = R"(
ACCELERATION_STRUCTURE TOP_LEVEL
Expand Down
4 changes: 3 additions & 1 deletion src/vulkan/blas.cc
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,7 @@ Result BLAS::CreateBLAS(amber::BLAS* blas) {
nullptr,
geometryType,
geometry,
0u,
VkGeometryFlagsKHR(geometryData->GetFlags())
};
const VkAccelerationStructureBuildRangeInfoKHR
accelerationStructureBuildRangeInfosKHR = {
Expand Down Expand Up @@ -209,6 +209,8 @@ Result BLAS::CreateBLAS(amber::BLAS* blas) {
} else {
assert(false && "unknown geometry type");
}
accelerationStructureGeometriesKHR_[geometryNdx].flags =
VkGeometryFlagsKHR(geometries[geometryNdx]->GetFlags());
}
}

Expand Down