Skip to content

Commit

Permalink
Parse type qualifiers without type as interface block.
Browse files Browse the repository at this point in the history
  • Loading branch information
wpmed92 committed Sep 17, 2024
1 parent 1833c07 commit f574ecf
Show file tree
Hide file tree
Showing 3 changed files with 39 additions and 26 deletions.
54 changes: 29 additions & 25 deletions lib/CodeGen/MLIRCodeGen.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -577,36 +577,13 @@ void MLIRCodeGen::createVariable(shaderpulse::TypeQualifierList* qualifiers, sha
}

void MLIRCodeGen::visit(VariableDeclaration *varDecl) {
if (varDecl->getIdentifierName().empty()) {
if (auto layout = dynamic_cast<LayoutQualifier *>(varDecl->getType()->getQualifiers()->find(shaderpulse::TypeQualifierKind::Layout))) {
int localSizeX = 1, localSizeY = 1, localSizeZ = 1;

if (auto layoutLocalX = layout->getQualifierId("local_size_x")) {
localSizeX = dynamic_cast<IntegerConstantExpression*>(layoutLocalX->getExpression())->getVal();
}

if (auto layoutLocalY = layout->getQualifierId("local_size_y")) {
localSizeY = dynamic_cast<IntegerConstantExpression*>(layoutLocalY->getExpression())->getVal();
}

if (auto layoutLocalZ = layout->getQualifierId("local_size_z")) {
localSizeZ = dynamic_cast<IntegerConstantExpression*>(layoutLocalZ->getExpression())->getVal();
}

mlir::OperationState state(builder.getUnknownLoc(), spirv::ExecutionModeOp::getOperationName());
state.addAttribute("fn", SymbolRefAttr::get(&context, "main"));
auto execModeAttr = spirv::ExecutionModeAttr::get(&context, spirv::ExecutionMode::LocalSize);
state.addAttribute("execution_mode", execModeAttr);
state.addAttribute("values", builder.getI32ArrayAttr({localSizeX, localSizeY, localSizeZ}));
execModeOp = mlir::Operation::create(state);
}
} else {
if (!varDecl->getIdentifierName().empty()) {
createVariable(varDecl->getType()->getQualifiers(), varDecl->getType(), varDecl);
}
}

void MLIRCodeGen::visit(SwitchStatement *switchStmt) {

// TODO: implement me
}

void MLIRCodeGen::visit(WhileStatement *whileStmt) {
Expand Down Expand Up @@ -947,6 +924,33 @@ void MLIRCodeGen::visit(InterfaceBlock *interfaceBlock) {
auto qualifiers = interfaceBlock->getQualifiers();
auto &members = interfaceBlock->getMembers();

if (members.empty()) {
if (auto layout = dynamic_cast<LayoutQualifier *>(qualifiers->find(shaderpulse::TypeQualifierKind::Layout))) {
int localSizeX = 1, localSizeY = 1, localSizeZ = 1;

if (auto layoutLocalX = layout->getQualifierId("local_size_x")) {
localSizeX = dynamic_cast<IntegerConstantExpression*>(layoutLocalX->getExpression())->getVal();
}

if (auto layoutLocalY = layout->getQualifierId("local_size_y")) {
localSizeY = dynamic_cast<IntegerConstantExpression*>(layoutLocalY->getExpression())->getVal();
}

if (auto layoutLocalZ = layout->getQualifierId("local_size_z")) {
localSizeZ = dynamic_cast<IntegerConstantExpression*>(layoutLocalZ->getExpression())->getVal();
}

mlir::OperationState state(builder.getUnknownLoc(), spirv::ExecutionModeOp::getOperationName());
state.addAttribute("fn", SymbolRefAttr::get(&context, "main"));
auto execModeAttr = spirv::ExecutionModeAttr::get(&context, spirv::ExecutionMode::LocalSize);
state.addAttribute("execution_mode", execModeAttr);
state.addAttribute("values", builder.getI32ArrayAttr({localSizeX, localSizeY, localSizeZ}));
execModeOp = mlir::Operation::create(state);
}

return;
}

for (auto &member : members) {
if (auto memberVar = dynamic_cast<VariableDeclaration*>(member.get())) {
createVariable(qualifiers, memberVar->getType(), memberVar);
Expand Down
9 changes: 9 additions & 0 deletions lib/Parser/Parser.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1463,6 +1463,15 @@ std::unique_ptr<InterfaceBlock> Parser::parseInterfaceBlock() {

std::string interfaceName;

if (curToken->is(TokenKind::semiColon)) {
advanceToken();
return std::make_unique<InterfaceBlock>(
std::move(typeQualifiers),
interfaceName,
std::move(std::vector<std::unique_ptr<Declaration>>())
);
}

if (!curToken->is(TokenKind::Identifier)) {
rollbackPosition();
return nullptr;
Expand Down
2 changes: 1 addition & 1 deletion test/CodeGen/interface_blocks.glsl
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
layout(local_size_x = 16, local_size_y = 8, local_size_z = 4) in int;
layout(local_size_x = 16, local_size_y = 8, local_size_z = 4) in;

// Test built-ins

Expand Down

0 comments on commit f574ecf

Please sign in to comment.