[Vulkan] Shader memory export (#145)
This commit is contained in:
@@ -10,7 +10,10 @@
|
||||
#ifndef XENIA_GPU_SPIRV_BUILDER_H_
|
||||
#define XENIA_GPU_SPIRV_BUILDER_H_
|
||||
|
||||
#include <memory>
|
||||
#include <optional>
|
||||
#include <utility>
|
||||
#include <vector>
|
||||
|
||||
#include "third_party/glslang/SPIRV/SpvBuilder.h"
|
||||
#include "xenia/base/assert.h"
|
||||
@@ -99,6 +102,50 @@ class SpirvBuilder : public spv::Builder {
|
||||
Branch currentBranch = Branch::kThen;
|
||||
#endif
|
||||
};
|
||||
|
||||
// Simpler and more flexible (such as multiple cases pointing to the same
|
||||
// block) compared to makeSwitch.
|
||||
class SwitchBuilder {
|
||||
public:
|
||||
SwitchBuilder(spv::Id selector, unsigned int selection_control,
|
||||
SpirvBuilder& builder);
|
||||
~SwitchBuilder() { assert_true(current_branch_ == Branch::kMerge); }
|
||||
|
||||
void makeBeginDefault();
|
||||
void makeBeginCase(unsigned int literal);
|
||||
void addCurrentCaseLiteral(unsigned int literal);
|
||||
void makeEndSwitch();
|
||||
|
||||
// If there's no default block that branches to the merge block, the phi
|
||||
// parent is the header block - this simplifies case-only usage.
|
||||
spv::Id getDefaultPhiParent() const { return default_phi_parent_; }
|
||||
|
||||
private:
|
||||
enum class Branch {
|
||||
kSelection,
|
||||
kDefault,
|
||||
kCase,
|
||||
kMerge,
|
||||
};
|
||||
|
||||
void endSegment();
|
||||
|
||||
SpirvBuilder& builder_;
|
||||
spv::Id selector_;
|
||||
unsigned int selection_control_;
|
||||
|
||||
spv::Function& function_;
|
||||
|
||||
spv::Block* header_block_;
|
||||
spv::Block* merge_block_;
|
||||
spv::Block* default_block_ = nullptr;
|
||||
|
||||
std::vector<std::pair<unsigned int, spv::Id>> cases_;
|
||||
|
||||
spv::Id default_phi_parent_;
|
||||
|
||||
Branch current_branch_ = Branch::kSelection;
|
||||
};
|
||||
};
|
||||
|
||||
} // namespace gpu
|
||||
|
||||
Reference in New Issue
Block a user